这是面试问题之一,我想知道我是否做得对,并想知道我的解决方案是否是最有效的解决方案。 O(n log n)
给了一袋坚果和一袋螺栓,每个都有一个不同大小的袋子,但在另一个袋子中只有一个匹配,给出一个快速的算法来找到所有的匹配。
由于2个袋子之间总是匹配,我说会有相同数量的螺母和相同数量的螺栓。设数为n
。
我会首先在每个包中对每个组件的重量进行分类,并且可以这样做,因为它们在包内都有不同的尺寸。使用合并排序,它将具有O(n log n)时间复杂度。
接下来,将每个组件从最轻到最重的两个组件中进行匹配将非常简单。
我想知道这是否是正确的解决方案,以及是否还有其他有趣的方法可以解决这个问题。
答案 0 :(得分:10)
在O(nlgn)中有一个解决这个问题的方法,即使你不能直接比较两个螺母或两个螺栓也能正常工作。这是不使用刻度,或者如果重量差异太小而无法观察。
它的工作原理是应用一小部分随机快速排序如下:
答案 1 :(得分:4)
标准解决方案是将坚果袋放入哈希(或HashMap,或字典,或任何您选择的语言中调用它),然后使用哈希查找走另一个包来查找匹配。
此算法的平均性能为O(n)
,其常量优于排序/二进制搜索变体。
答案 2 :(得分:3)
假设您没有确切的尺寸测量,并且您只能通过尝试来查看某些东西是否太大,太小或完全正确,这需要额外的步骤来排序 - 这可能是通过采取随机螺母,与每个螺栓比较并分类成更小,更大的桩,然后用螺栓和螺母分类(改进的快速排序......请记住,你将不得不处理如何选择一个问题的问题用螺母或螺栓来比较当桩变小以确保你使用合理的枢轴时。
由于问题没有告诉您螺母和螺栓标有尺寸,或者您有某种方法来测量螺母和螺栓的尺寸,因此很难使用哈希表来解决这个问题,或者甚至是常规的比较排序。
答案 3 :(得分:0)
对于我来说,这似乎是复杂的最佳解决方案。
另一种方法是只对其中一个袋子进行排序,然后使用二进制搜索来尝试将螺栓与螺母匹配(从排序列表中删除该对)。仍为O(n log n)
,但第二部分略有优化,因为我们在匹配后删除了每一对,最糟糕的情况是:log n + log n-1 + log n-2 ... 1 = (n log n)/2
答案 4 :(得分:0)
额外拿两个包。说左右包。现在拿出每个螺母并与每个螺栓进行比较。如果螺栓很小,请将其放入左袋中,然后放入右袋中,然后将其放置。现在拿下一个螺母,将它与先前采用的螺母进行比较,如果它更小,那么我们只需要检查左袋中的那些坚果,否则检查右袋中的坚果。以这种方式继续。