Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
Java 搜索和比较二叉搜索树内容的大O_Java_Big O_Binary Search Tree - Fatal编程技术网

Java 搜索和比较二叉搜索树内容的大O

Java 搜索和比较二叉搜索树内容的大O,java,big-o,binary-search-tree,Java,Big O,Binary Search Tree,我有一个程序,它采用两个二进制搜索树,tree1和tree2,这两个树都用字符串填充。程序按顺序遍历tree1,对于tree1中的每个字符串,它在tree2中搜索该字符串。我认为在tree2中从tree1中搜索每个值的复杂性为O(logn),遍历tree1中的每个值的复杂性为O(n)。这是否意味着整个过程是O(nlogn),n用于遍历tree1以获取每个值,而logn用于在tree2中查找该值?我不太擅长理解大O符号,所以任何帮助或解释都非常感谢。谢谢大家! 另一种思考方法是: 您有一个排序数组

我有一个程序,它采用两个二进制搜索树,tree1和tree2,这两个树都用字符串填充。程序按顺序遍历tree1,对于tree1中的每个字符串,它在tree2中搜索该字符串。我认为在tree2中从tree1中搜索每个值的复杂性为O(logn),遍历tree1中的每个值的复杂性为O(n)。这是否意味着整个过程是O(nlogn),n用于遍历tree1以获取每个值,而logn用于在tree2中查找该值?我不太擅长理解大O符号,所以任何帮助或解释都非常感谢。谢谢大家!

另一种思考方法是:

您有一个排序数组t1:

var t1 = ['1','2','3','4']
如果每个节点的最大值为2个子节点(二叉搜索树),那么就有一个既排序又尽可能平坦的树


现在,对于t1中的每个元素,您将在t2中搜索该元素。正如您所想的-这意味着要进行n次logN操作,这将为您提供nlog total计算

另一种思考方法是:

您有一个排序数组t1:

var t1 = ['1','2','3','4']
如果每个节点的最大值为2个子节点(二叉搜索树),那么就有一个既排序又尽可能平坦的树

现在,对于t1中的每个元素,您将在t2中搜索该元素。正如您所想,这意味着要执行一个logN操作n次,这将为您提供nlog total计算

是的,如果两个树都有n个元素,而第二个元素是,则它是
O(n.logN)
。如果元素的数量不同,树1有n个元素,树2m,那么它当然是
O(n.logm)

要理解它:您应该以n为单位计算算法中的操作数。在树2中查找元素最多需要
logn
比较。遍历树1将需要n个元素来查看。由于您对树1中的每个元素进行了查找,因此将运算的数量相乘,得到最大值
n.logn
operations

您可能会注意到一个比较由两个元素组成,或者比较更耗时,因此实际上我们应该说
log(2n)
(或其他一些因子),但这只是一个常数因子,与n无关,因此在
O()
符号中被过滤掉

说一个算法是
O(n.logn)
意味着我们可以找到一个常数C,这样对于所有的n,算法将在最多
C.n.longn
时间内完成(最坏的情况),并且没有一个更具限制性的边界,例如
O(n.log(logn))

所以,是的,它是
O(n.logn)

是的,如果两个树都有n个元素,而第二个元素是,则为
O(n.logn)
。如果元素的数量不同,树1有n个元素,树2m,那么它当然是
O(n.logm)

要理解它:您应该以n为单位计算算法中的操作数。在树2中查找元素最多需要
logn
比较。遍历树1将需要n个元素来查看。由于您对树1中的每个元素进行了查找,因此将运算的数量相乘,得到最大值
n.logn
operations

您可能会注意到一个比较由两个元素组成,或者比较更耗时,因此实际上我们应该说
log(2n)
(或其他一些因子),但这只是一个常数因子,与n无关,因此在
O()
符号中被过滤掉

说一个算法是
O(n.logn)
意味着我们可以找到一个常数C,这样对于所有的n,算法将在最多
C.n.longn
时间内完成(最坏的情况),并且没有一个更具限制性的边界,例如
O(n.log(logn))


所以,是的,它是
O(n.logn)

我相信树e1上的横向顺序是O(n),其中n是树e1中的节点总数。另一方面,tree2上的(二进制)搜索是O(logm),其中m是tree2中的节点数。所以你的算法的总复杂度是O(n logm)


如果tree1的大小等于tree2的大小,那么复杂度是O(n logn)。

我相信tree1上的横向顺序是O(n),其中n是tree1中的节点总数。另一方面,tree2上的(二进制)搜索是O(logm),其中m是tree2中的节点数。所以你的算法的总复杂度是O(n logm)


如果tree1的大小等于tree2的大小,那么复杂度是O(n logn)。

f这是一个传统的二叉树,只有当且仅当树是随机构造的,并且没有进行删除时,您的结论才是正确的。结论是概率的,我不确定你在这里所说的概率是什么意思,因为算法上下文中的大O表示法提供了一个上界(最坏情况)。概率是指O(logn)是搜索过程中访问的节点数的期望值。但这只有在树是随机构造的情况下才有效。如果不满足此条件,则O(n logn)不是上界,而是O(n^2)。例如,考虑N-1节点只有一个子节点;在这种情况下,界是O(n)。如果在二叉树上应用了一个平衡条件,例如AVL,那么可能是O(n logn)的界,因为高度有界于O(logn)。但是这篇文章的作者并没有说他处理的是哪种二叉树。当然,我认为第二棵树是为优化搜索而优化的(我昨天在回答中补充了这句话)。我现在明白了概率论是关于节点分布的。我完全同意。如果这是一个传统的二叉树,你的结论是正确的,当且仅当树是随机构造的,并且没有