问题是:
假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时间是什么?
我在上述解决方案中发现的特殊之处是:"You should also take into account that you need to compare the strings. Each string comparison takes O (s) time.There are O (a log a) comparisons, therefore this will take O (a*s log a) time."
我们需要进行比较吗?
对字符串进行排序需要s log s
时间。假设有a
个字符串,因此总花费为a*s log s
现在,问题已简化为仅对给定数组进行排序,您可以在a log a
时间内完成,因此总花费为a*s log s + a log a = a (s log s + log a)
在思考过程中我哪里出错了?
该问题摘自破解编码面试
答案 0 :(得分:1)
对数字列表进行排序的假设是,比较在O(1)恒定时间内进行,因此从比较数的角度考虑,nlogn的复杂性。但是,当我们对一个其成员需要时间x进行比较的枚举对象进行排序时,运行时将变为xnlogn。这是因为我们执行的操作需要x时间,nlogn次。
但是,我还必须指出,字符串是对以26为底的直接双射。由于我们认为以10为底的比较是在恒定时间内进行的,因此没有理由不将其扩展到本质上是以底为底的数字的字符串。 26.这实际上取决于字符串比较机制的实现。因此,根据完成字符串比较的方式,我们最终得到两个可能的运行时。
您是正确的,当且仅当我们假设字符串要以26为底进行比较,并且假定可以在固定时间内完成。
否则,排序通常需要(比较时间)x nlogn