四部分二分搜索算法

时间:2014-10-18 16:25:38

标签: algorithm search binary-search-tree

二进制搜索将数组拆分为两部分并在其中搜索。 但是我的老师要求我们找到一个解决方案,将拆分阵列分成四部分然后搜索部分。

二元搜索:

   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部分然后搜索。 是这样的吗?

1 个答案:

答案 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 |  
+-----+---------------------+  

页面节点是一个节点数组。大多数算法在节点数组中使用二进制搜索。找到密钥范围后,算法会遍历到相应子树的链接。重复此过程,直到在页面节点或叶节点上找到密钥。

您的数据结构是什么?您的困惑在哪里?