Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 当我们知道大多数插入都正常时创建BBST的策略?_Algorithm_Sorting_Data Structures_Binary Search Tree - Fatal编程技术网

Algorithm 当我们知道大多数插入都正常时创建BBST的策略?

Algorithm 当我们知道大多数插入都正常时创建BBST的策略?,algorithm,sorting,data-structures,binary-search-tree,Algorithm,Sorting,Data Structures,Binary Search Tree,我需要一个平衡的二叉搜索树。我使用了AVL树,但它需要大量旋转来创建插入时的平衡高度。我观察到,大多数输入都已就绪。例如:891011213214151617174181920等。。。当我们知道大多数输入已经就绪时,是否有更好的创建BBST的策略?使用插入排序对输入进行排序;这通常是一个O(n^2)算法,但如果输入几乎已排序,则为O(n)。然后将输入的中间元素放在树的根上,递归地将输入的左半部分的中间元素放在根的左子树的根上,将输入的右半部分的中间元素放在根的右子树的根上,依此类推,直到整个输入

我需要一个平衡的二叉搜索树。我使用了AVL树,但它需要大量旋转来创建插入时的平衡高度。我观察到,大多数输入都已就绪。例如:891011213214151617174181920等。。。当我们知道大多数输入已经就绪时,是否有更好的创建BBST的策略?

使用插入排序对输入进行排序;这通常是一个O(n^2)算法,但如果输入几乎已排序,则为O(n)。然后将输入的中间元素放在树的根上,递归地将输入的左半部分的中间元素放在根的左子树的根上,将输入的右半部分的中间元素放在根的右子树的根上,依此类推,直到整个输入都在树中。

运行,在已排序或接近排序的数组上具有良好的性能(它具有性能
O(n+d)
,其中
d
是反转数)。当然,如果数组根本没有排序,您就不希望这样做,在这种情况下,它将需要
O(n2)
,而其他排序算法则需要
O(n log n)

运行此操作后,您可以:

如果您必须选择一个数组元素作为平衡BST的根,您会选择哪个元素?平衡BST的根应该是排序数组中的中间元素

您可以在每次迭代中从排序的数组中选取中间元素。然后,在用该元素初始化的树中创建一个节点。选择元素后,剩下什么?您能确定问题中的子问题吗

左边有两个数组,一个在左边,一个在右边。这两个数组是原始问题的子问题,因为它们都已排序。此外,它们是当前节点左右子节点的子树


假设arr是近似排序的数组,则可以执行以下操作以从中获得良好的平衡树:-

make_tree(BST,arr,high,low) {

  if(high>=low) {

      mid = (high+low)/2;
      BST.insert(arr[mid]);
      make_tree(BST,arr,mid-1,low);
      make_tree(BST,arr,high,mid+1);
  }

}

make_tree(BST,arr,N-1,0);

解释:-由于数组几乎被排序,我们将其等分为两部分,插入的平均时间复杂度为
O(logN)
,因此时间复杂度为
O(nlogn)

Timsort也很好地利用了输入数组中的升序或降序运行,并且具有最坏情况下的
O(logN)
复杂度