【问题标题】:Sorting variable-length items / Algorithms对可变长度项目/算法进行排序
【发布时间】:2017-02-02 15:08:51
【问题描述】:

我一直在为我的算法期中学习,我在书中遇到了一个关于对可变长度项目进行排序的问题:

  • 给定一个字符串数组,其中不同的字符串可能有不同的字符数,但所有字符串的字符总数为 n。展示如何在 O(n) 时间内对字符串进行排序。

我在网上找到了很多答案,但他们的解释不是很清楚,所以如果你能花时间更深入地向我解释这个答案建议应该做什么来对 O 中的字符串进行排序,我将不胜感激(n) 时间:

  1. 按长度对字符串进行分组并对组进行排序
  2. 从最大长度开始 i 并下降到 1,执行计数 按第 i 个字符排序。确保仅包含具有 第 i 个字符。 如果这些组是原始数组中的后续子数组,我们执行

【问题讨论】:

  • (你应该明确这是关于具有可变长度键的项目还是关于具有可变长度的项目,这可能使“交换”成为挑战。)

标签: arrays string algorithm sorting


【解决方案1】:

这就是您要搜索的内容:https://en.wikipedia.org/wiki/Radix_sort

简单来说:

您开始按字符串的第一个数字排序。 这可以一次性完成 O(N),因为您不需要将每个元素与其他元素进行比较。您只需要记住数组中每组值的开始和结束位置。例如,所有以 'g' 开头的字符串都位于数组位置 35 到 500 中。当您找到一个以 'g' 表示的字符串时,将其添加到该组的末尾。

在下一阶段,您对这些组中的每一个都执行相同的操作。

如您所见,它需要 O(M*N),其中 M 是字符串长度,N 是字符串数。 在你的情况下,你的 N 是所有字符串的总长度,所以它是 O(N)。

虽然你有不同长度的字符串,你仍然可以保持 O(N),因为在某些时候太短的项目不需要重新排序。

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多