我需要在c中实现一个数据结构,按顺序重复存储单词(结构中的单词和重复次数),其中单词的重复可以递增或递减。
我需要找到改变重复的单词,并将其移动到正确的位置(可以有更多的单词具有相同的重复次数)。
我无法弄清楚什么是最好的数据结构。我在树上思考,但我需要能够通过重复来改变单词的位置。这样的问题有没有树?我找不到任何东西。
如何有效地解决这个问题?
我会非常感谢任何帮助。感谢。
答案 0 :(得分:2)
我的建议是不要使用树。而是使用您保持排序的排序数组。保持事物排序很简单:无论何时递增/递减重复计数,您只需要将该元素重新插入正确的位置,这只需要移动字符串所需的操作数量(操作与在插入排序)。为了递增计数,这就是
//pos is the index of the string within the array
struct node temp = array[pos];
for(; pos + 1 < stringCount && temp.repCount > array[pos + 1].repCount; pos++) {
array[pos] = array[pos + 1];
}
array[pos] = temp;
只要预期的位置调整平均较小,这可能比任何基于树的方法都要快:它避免构建/维护需要大量代码且不缓存的树结构。上面的循环只触及连续的内存,因此可以像缓存一样友好。
答案 1 :(得分:2)
如果你只增加或减少计数,那么数组最好是@cmaster答案建议。
要有效地构建数组,让数组增长到0,因为新单词的重复次数为0,添加一个新单词只是附加到最后并且分配慷慨,这很便宜。
要决定移动增量单词的位置,可以使用相同的重复次数和交换搜索序列中的最后一个单词。如果重复次数相同的单词数量很少,那么使用单词当前位置的线性搜索可能是最好的。
void increment(int i, Word *word, int n) {
int j = i + 1;
Word old = word[i];
while (j < n && word[j].count == old.count) {
++j;
}
word[i] = word[j - 1]; // swap
old.count += 1;
word[j - 1] = old;
}
如果不是这种情况,那么你可以对数组进行上限搜索并直接与之前的位置交换,这是对数的。
请注意,代码是在假设数组不会向零增长的情况下编写的。
你需要一种在数组中找到单词的方法,哈希映射可能是最好的,这样你仍然可以进行交换,只更新哈希映射中的两个值。