我有一个程序需要两个二进制搜索树,tree1和tree2,它们都填充了字符串。该程序对tree1进行了顺序遍历,对于tree1中的每个字符串,它在tree2中搜索该字符串。我认为从tree2中的tree1中搜索每个值的复杂度为O(logn),并且遍历tree1中每个值的遍历具有O(n)的复杂度。这是否意味着整个过程是O(nlogn),n遍历tree1以获取每个值并登录以在tree2中找到该值?我不太擅长理解大O符号,所以任何帮助或解释都会受到赞赏。谢谢!
答案 0 :(得分:0)
另一种思考方式是:
你有一个排序数组t1:
var t1 = ['1','2','3','4']
并且你有一棵树,它被排序并且尽可能平坦,每个节点的最大值为2个子节点(二叉搜索树)
var t2 = '1' -> '2' -> '4'
-> '3'
现在,对于t1中的每个元素,您将在t2中搜索该元素。就像你在想的那样 - 这意味着进行n次logN操作,这样就可以得到nlogn的总计算量
答案 1 :(得分:0)
是的,如果你的树都有n个元素而第二个是optimised for searches,则为O(n.logn)
。如果元素的数量不同,树1有n个元素,树2米,那么它当然是O(n.logm)
。
要理解它:您应该根据n计算算法中的操作数。在树2中查找元素将最多进行logn
次比较。通过树1将需要n个元素来查看。由于您对树1中的每个元素进行了查找,因此您将乘以运算数并最多得到n.logn
个运算。
你可能会注意到比较包括解决2个元素,或者比较更耗时,所以实际上我们应该说log(2n)
(或其他一些因素),但这只是一个常数因素,独立于n,因此以O()
表示法过滤掉。
说算法是O(n.logn)
意味着可以找到一个常数C,这样对于所有n,算法最多会在C.n.longn
时间内完成(最坏的情况),并且没有更多限制边界,例如O(n.log(logn))
。
所以,是的,它是O(n.logn)
。
答案 2 :(得分:0)
我相信tree1上的顺序横向是O(n),其中n是tree1中节点的总数。另一方面,tree2上的(二进制)搜索是O(log m),其中m是tree2中的节点数。因此,算法的总复杂度为O(n logm)。
如果tree1的大小等于tree2的大小,那么复杂度为O(n logn)。