二进制搜索将数组拆分为两部分并在其中搜索。 但是我的老师要求我们找到一个解决方案,将拆分阵列分成四部分然后搜索部分。
二元搜索:
binary_search(A, target):
lo = 1, hi = size(A)
while lo <= hi:
mid = lo + (hi-lo)/2
if A[mid] == target:
return mid
else if A[mid] < target:
lo = mid+1
else:
hi = mid-1
但我希望拆分数组到4部分然后搜索。 是这样的吗?
答案 0 :(得分:3)
正常的二进制搜索将数组(容器)分成两部分,通常位于中点:
+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+---+---+---+---+---+---+---+---+
|
V
+---+---+---+---+ +---+---+---+---+
| 1 | 2 | 3 | 4 | | 5 | 6 | 7 | 8 |
+---+---+---+---+ +---+---+---+---+
根据中点值,搜索键位于下部(左侧)或上侧(右侧)。
如果我们采用相同的概念并分成4个部分,则密钥将位于四个quandrants中的一个:
+---+---+ +---+---+ +---+---+ +---+---+
| 1 | 2 | | 3 | 4 | | 5 | 6 | | 7 | 8 |
+---+---+ +---+---+ +---+---+ +---+---+
通过将密钥与最高象限时隙进行比较,可以确定密钥所在的象限。
在二分搜索中,通过将搜索范围除以2来找到中点。
在4部分搜索中,通过除以4找到象限。
在编码之前使用笔和纸尝试此算法。当您开发有效的步骤时,请编写代码。这称为设计,然后是编码。一个流行的开发过程。
没有人应该用勺子喂你的代码。 自己解决。
编辑1:搜索树
数组和数组与数组非常不同,您知道所有项目的位置,您可以使用索引来访问元素。使用二进制或搜索树,您需要按照链接;因为你不知道每个元素在哪里。
除以4搜索树,通常遵循B树的原则。您有一个页节点而不是单个节点:
+---------------------------+
| Page Details |
+-----+---------------------+
| key | pointer to sub-tree |
+-----+---------------------+
| key | pointer to sub-tree |
+-----+---------------------+
| key | pointer to sub-tree |
+-----+---------------------+
| key | pointer to sub-tree |
+-----+---------------------+
页面节点是一个节点数组。大多数算法在节点数组中使用二进制搜索。找到密钥范围后,算法会遍历到相应子树的链接。重复此过程,直到在页面节点或叶节点上找到密钥。