字符串解决方案排名

时间:2018-04-28 14:18:30

标签: algorithm string-algorithm

我正在经历一个问题,在这个问题中,它会要求您按字典顺序排列字符串的排名。

O(N ^ 2)非常清楚。

有些网站也有O(n) solution。优化的部分基本上预先填充count array,以便

  

count [i]包含str中存在且小于i的字符数。

我知道这会降低复杂性,但不能适应我们计算这个阵列的方式。这是执行此操作的功能(取自链接):

// Construct a count array where value at every index
// contains count of smaller characters in whole string
void populateAndIncreaseCount (int* count, char* str)
{
    int i;

    for( i = 0; str[i]; ++i )
        ++count[ str[i] ];

    for( i = 1; i < 256; ++i )
        count[i] += count[i-1];
}

有人可以提供这个功能的直观解释吗?

2 个答案:

答案 0 :(得分:0)

该解决方案正在执行Bucket Sort,然后对输出进行排序。

存储桶排序为O(items + number_of_possible_distinct_inputs),对于固定字母,可以将其标记为O(n)

然而在实践中,UTF制作了一个非常大的字母表。因此,我会建议快速排序。因为分为<>=三个存储分区的快速排序对于大字符集有效,但仍然可以利用较小的字符集。

答案 1 :(得分:0)

再次经过它后才明白。由于c ++中的语法错误而感到困惑。它实际上做了一件非常简单的事情(这里是java版本:

void populateAndIncreaseCount(int[] count, String str) {
    // count is initialized to zero for all indices
    for (int i = 0; i < str.length(); ++i) {
      count[str.charAt(i)]++;
    }

    for (int i = 1; i < 256; ++i)
      count[i] += count[i - 1];
  } 

在第一步之后,字符串中存在字符的索引不为零。然后,对于count数组中的每个索引,它是所有计数的总和,直到index-1,因为数组表示按字典顺序排序的字符。并且,在每次搜索之后,我们也会使用count数组:

//从count []数组中删除一个字符ch //由populateAndIncreaseCount()

构造
void updatecount (int* count, char ch)
{
    int i;
    for( i = ch; i < MAX_CHAR; ++i )
        --count[i];
}