Algorithm 假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么?

Algorithm 假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么?,algorithm,time-complexity,Algorithm,Time Complexity,问题是: 假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么 解决方案如下所示: 我在上述解决方案中发现的独特之处是:“您还应该考虑到需要比较字符串。每个字符串比较都需要O(s)个时间。有O(a log a)个比较,因此这将需要O(a*s log a)个时间。” 我们需要这些比较做什么 对字符串进行排序需要slogs时间。假设有a字符串,因此所花费的总时间为a*s log s 现在问题已经缩小到只需对给定数组进行排序,您可以在a log a时间

问题是:

假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么

解决方案如下所示:

我在上述解决方案中发现的独特之处是:
“您还应该考虑到需要比较字符串。每个字符串比较都需要O(s)个时间。有O(a log a)个比较,因此这将需要O(a*s log a)个时间。”

我们需要这些比较做什么

对字符串进行排序需要
slogs
时间。假设有
a
字符串,因此所花费的总时间为
a*s log s

现在问题已经缩小到只需对给定数组进行排序,您可以在
a log a
时间内进行排序,因此所花费的总时间是
a*s log s+a log a=a(s log s+log a)

我在思考过程中哪里出错了


该问题摘自《破解编码访谈》

对数字列表进行排序时假设比较发生在O(1)恒定时间内,给出了nlogn复杂性(以比较次数为单位)。但是,当我们对其成员需要时间x进行比较的枚举进行排序时,运行时变为xnlogn。这是因为我们正在执行一个需要x时间、nlogn时间的操作

但是,我还必须指出,字符串是对基26的直接双射。因为我们认为在基10中的比较是在恒定的时间内发生的,所以没有理由不将它扩展到基26中基本上是数字的字符串。这实际上取决于字符串比较机制的实现。因此,根据字符串比较的方式,我们最终得到两个可能的运行时

你的是正确的,当且仅当我们假设字符串作为基数26中的数字进行比较,并且假设这可以在恒定时间内完成


否则,排序通常需要(比较时间)x nlogn

相关:相同的参数实际上不适用于字符串。排序复杂性通常根据比较次数给出(至少对于基于比较的排序)。在这种情况下,不需要对单个比较的复杂性进行任何假设。虽然最终的结论是一样的。他们要求的是时间,而不是数量的比较。虽然时间是任意的,但他们似乎想要一些关于单个字符串长度的东西。此外,我没有真正理解相关链接,但我不认为这个假设不适用于字符串的任何理由,因为字符串的实现是字符数组,本质上是整数数组,如问题中所述,数字通常是64位或更少,而且许多操作都可以并行完成,并检查或处理所有位,因此它们的运行时间通常不取决于该数字所占用的确切位数。另一方面,字符串没有固定的长度上限,比较需要一次检查一个位置,它的运行时间在很大程度上取决于字符串的确切长度。但是可能会有一些手工操作,因为严格来说,你不能说一个恒定的空间数可以代表一个可变空间的长度。我明白了。假设一个字符串是一个没有上界的数字,那么我们可以将它的比较时间取为(长度/并行进程)
每个字符串比较都需要O(s)个时间
。这就是你在推理时遗漏的部分。比较两个
char
需要
O(1)
,比较两个字符串需要
O(长度(最短字符串))
。声称“没有办法进一步减少”似乎是在拉长它。很明显,一个简单的字符串比较将是O(s)-但这并不意味着在这种情况下必须以这种方式实现字符串排序。