【问题标题】:algorithm on sorting array of pointers to strings in O(n)在 O(n) 中对指向字符串的指针数组进行排序的算法
【发布时间】:2015-10-14 07:07:45
【问题描述】:

这是我的算法作业,我不知道如何进行。

给定一个包含 m 个字符串的数组 A,其中不同的字符串可能有不同数量的 个字符,但数组中所有字符串的字符总数为 n。显示 如何在 O(n) 时间内对字符串进行排序。请注意,此处所需的顺序是标准的 按字母顺序;例如,a

【问题讨论】:

  • 对大小为N 的字符串数组进行排序的最快速度大约是O(N*lgN),这是通过合并排序或快速排序获得的。
  • this 的可能重复项。
  • 由 npinti 链接,从最低有效到最高有效字符计数/基数排序将需要(字符串的最大长度)遍,每次通过移动 m 个字符串。如果字符串的最大长度被认为是一个常数,例如 n 或其他一些常数,那么时间复杂度可以被认为是 O(m)(而不是 O(n))。如果m被认为是常数,n是可变的,那么时间复杂度可以认为是O(n)。
  • 致 OP:你或许应该比写下“这是我的作业复制粘贴,帮帮我!”付出更多的努力。比如,解释一下你不明白的地方,或者用你自己的话讲述(这相当于解决橡皮鸭问题,所以它本身实际上很有用!)。

标签: c arrays string algorithm sorting


【解决方案1】:

由于这是一项作业,我不会提供完整的答案,仅提供一些关于如何进行的想法。

由于字符串可以是任意长度,因此您需要使用 O(n) 排序算法。

一种这样的算法是桶排序。

那么我们如何安排可变长度字符串的桶呢?

为第一个字符创建 256 个桶。 让每个桶有一个计数器 + 一组 256 个桶用于第二个字符,依此类推。

重要提示:在需要之前不要创建任何存储桶集,否则内存消耗将是无限的。设一个空桶集为NULL

当我们设置了存储桶系统时。我们如何将一个单词排序到桶系统中?

假设我们有Yes这个词。

第一个字符是Y,所以我们转到顶层存储桶集。集合是NULL,所以我们创建顶层并选择存储桶'Y'

下一个字符是eY 下的桶集是NULL,所以我们创建集合并选择桶'e'

下一个字符是sYe 下的桶集是NULL,所以我们创建集合并选择桶's'

字符串结束。增加当前桶Y->e->s的计数。

请注意,如果您使用unsigned char,任务会更简单,因为您可以直接将该值用作长度为256 的数组的索引。

bucket 结构可能如下所示:

typedef struct bucket {
    int count;
    struct bucket *next;  // points to NULL or array of 256 buckets.
} bucket;

时间复杂度:

每个角色的最大工作量为:

字符串结束检查 + NULL 检查 + ((分配和初始化 256 个桶的数组(我会为此使用calloc)或(增加一个桶数))+ 增加循环变量。

内存使用情况

这就是桶排序的缺点。如果您需要许多存储桶,它会使用大量内存,并且此解决方案将使用大量内存。

【讨论】:

    【解决方案2】:

    您可以将 String 视为 255 基中的数字。因此,如果分布是均匀的,则桶排序将给出线性时间;基数排序也是线性的,但排序前需要做一些准备(将字符串转换为数字)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多