【发布时间】:2012-06-01 08:16:22
【问题描述】:
我已经获得了算法的基本代码,该算法选择未排序数组中的第 k 个最小元素(或排序,我不确定)。通常,我们会为此使用 quickselect,但我们得到了另一个选择,它被标记为“countingselect”作为函数名称。
“计数选择使用类似的方法来计数排序。列表中的项目用作计数数组的索引。然后,从数组的低值端开始,项目计数累加,直到总数超过所需价值。”
// return the kth smallest item
int countingSelect(int items[], int first, int last, int k) {
int counts[cap];
for (int c = 0; c < cap; c++) {
counts[c] = 0;
}
for (int i = first; i < last; i++) {
counts[items[i]] += 1;
}
int c = 0;
while (k >= 0) {
k -= counts[c++];
}
return c-1;
}
我在将其分解为伪代码时遇到了巨大的麻烦,以便我可以准确地理解该函数的工作原理。对于我们得到的代码,我的第一个困惑是“cap”的值是什么,它的功能是什么。上限通常是什么值?我没有得到这些信息。
将算法分解为伪代码是理解它的好方法,我请求一些帮助来分解它并逐步执行代码。
提前谢谢你。
【问题讨论】:
-
cap是您在items[]+ 1 中可以拥有的最大数字。 -
显然 cap 的值是序列中找到的最高数字的值。对吗?
-
@Andrew,差不多。
cap是最大的数字 +1,因为数组counts的索引是从0到highest_number,包括最大数字本身。 -
"cap" 这里使用的意思是"upper limit", "ceiling"。有了这些知识,自己在纸上运行算法应该会向您解释它是如何工作的。
-
好的,我会拆开 A4 纸和铅笔。谢谢大家,我可能会回来报告。