二分搜索和二叉搜索树之间的区别?

时间:2014-02-05 18:57:42

标签: algorithm data-structures binary-search-tree binary-search

二分查找和二叉搜索树有什么区别?

它们是一样的吗?阅读互联网似乎第二个仅适用于树(最多2个子节点),二分搜索不遵循此规则。我没理得。

4 个答案:

答案 0 :(得分:28)

二进制搜索树

二叉树中的节点是具有元素的数据结构,以及对其他两个二叉树的引用,通常称为左右子树。即,节点呈现如下界面:

Node:
  element  (an element of some type)
  left     (a binary tree, or NULL)
  right    (a binary tree, or NULL)

二进制搜索树是一个二叉树(即一个节点,通常称为根),其属性是左右子树也是二叉搜索树,并且所有元素都是左子树中的所有节点都小于根元素,右子树中所有节点的所有元素都大于根元素。例如,

     5
    / \
   /   \
  2     8
 / \   / \
1   3 6   9

二进制搜索

二进制搜索是一种在二叉搜索树中查找元素的算法。 (它通常表示为搜索有序集合的一种方式,这是一个等价的描述。我将在后面描述等价。)就是这样:

search( element, tree ) {
  if ( tree == NULL ) {
    return NOT_FOUND
  }
  else if ( element == tree.element ) {
    return FOUND_IT
  }
  else if ( element < tree.element ) {
    return search( element, tree.left )
  }
  else {
    return search( element, tree.right )
  }
}

这通常是一种有效的搜索方法,因为在每一步中,您都可以删除一半的搜索空间。当然,如果你的二进制搜索树很不平衡,那么它可能效率低下(它可能会降级为线性搜索)。例如,它在树中表现不佳,如:

3
 \
  4
   \
    5
     \
      6

数组上的二进制搜索

二进制搜索通常表示为已排序数组的搜索方法。这与上面的描述不矛盾。事实上,它突出了我们实际上并不关心如何实现二叉搜索树的事实;我们只关心我们可以拿一个对象并用它做三件事:获取一个元素,获得一个左子对象,并获得一个正确的子对象(当然,主题是关于左边元素的约束小于元素,右边元素大于等。)。

我们可以使用排序数组完成所有这三件事。对于排序数组,“element”是数组的中间元素,左侧子对象是其左侧的子数组,右侧子对象是其右侧的子数组。例如,阵列

[1 3 4 5 7 8 11]

对应树:

     5
    / \
   /   \
  3     8
 / \   / \
1  4  7   11

因此,我们可以为这样的数组编写二进制搜索方法:

search( element, array, begin, end ) {
  if ( end <= begin ) {
    return NOT_FOUND
  }
  else { 
    midpoint = begin+(end-begin)/2
    a_element = array[midpoint]
    if ( element == midpoint ) {
      return FOUND_IT
    }
    else if ( element < midpoint ) {
      return search( element, array, begin, midpoint )
    }
    else {
      return search( element, array, midpoint, end )
    }
  }
}

结论

如经常提出的,二进制搜索是指这里给出的基于阵列的算法,二叉搜索树是指具有某些属性的基于树的数据结构。但是,二进制搜索所需的属性和二进制搜索树所具有的属性使这两个方面成为同一个硬币。作为二叉搜索树通常意味着特定的实现,但实际上它是提供某些操作并满足某些约束的问题。二进制搜索是一种算法,它在具有这些操作并满足这些约束的数据结构上起作用。

答案 1 :(得分:10)

不,他们不一样。

Binary search tree

  • 数据结构
  • 每个节点最多包含2个孩子
  • 节点的左子树仅包含键小于节点键的节点
  • 节点的右子树仅包含键大于节点键的节点

Binary search

  • 算法,适用于已排序的数据结构(通常但不一定是数组),并且在每一步中,查看中间的值并递归到左侧或者是的,取决于目标值是小于还是大于中间值(或者如果它相等则停止)。

当然,data structure是:

  

在计算机中存储和组织数据的特定方式,以便可以有效地使用它。

虽然algorithm是:

  

计算的分步过程。

二叉搜索树中的搜索进程(我们在树中查找特定值)可以被认为类似于(或者是一个实例,取决于您的定义以及是否'使用平衡的BST)二分搜索,因为这也会查看'middle'元素并向左或向右递归,具体取决于该值与目标值之间的比较结果。

答案 2 :(得分:3)

对于那些来这里快速检查使用哪一个的人。除了上面发布的答案之外,我还想为这两种技术的操作增加复杂性。

二进制搜索树:

搜索θ(log(n))不平衡最坏情况(O(n)) > BST,

节点的

插入θ(log(n)),最差情况(O(n)) unbalanced < / em> BST

节点的

删除θ(log(n)),对于不平衡BST,最差情况(O(n))

平衡二进制搜索树:

搜索 log(n)

插入节点: O(log(n))

节点的

删除 O(log(n))

对已排序数组进行二进制搜索:

搜索 O(log(n))但是,

节点的

插入:如果数组已静态分配且已满,则无法执行此操作。否则 O(n) O(n)用于将更大的数组项移动到相邻的右侧)

节点的

删除 O(log(n))+ O(n)。 (因此,找到删除位置 + O(n)用于将更大的数组移动到相邻的左侧)将是O(log(n))

因此,根据您的要求,您可以选择是否需要快速插入和删除。如果您不需要这些,那么将事物保存在排序数组中将对您有用,因为与树相比,数组将占用更少的内存

答案 3 :(得分:-1)

  1. 要使用二进制搜索来搜索元素,应在顺序存储位置中表示元素,例如使用数组,您需要知道数组的大小才能找到中间元素 要使用二叉搜索树进行搜索,我们不需要将数据放置在顺序位置..我们需要将元素添加到BST节点中...每个BST节点都包含其右子元素和左子元素,因此知道根足以在BST节点上进行搜索树

  2. 因为您使用数组进行二进制搜索,所以插入和删除将很容易,但是在BST中,即使在最坏的情况下,我们也需要遍历树的高度

  3. 要进行二进制搜索,我们需要元素按排序顺序排列,但BST不遵循此规则

  4. 现在到了搜索时间复杂度..

    a)使用二进制搜索,最差情况的复杂度是O(logn)

    b)使用BST,最坏情况下的复杂度是O(n),即,如果树倾斜,则它就像链表一样工作,我们最终搜索了所有元素(这就是为什么我们需要实现平衡的BST)< / p>

  5. 二进制搜索需要O(1)空间复杂度,因为位置是连续的。.BST每个节点都需要O(n)空间,我们需要额外的空间来存储其子节点的指针