【问题标题】:Follow the minimum value in a collection of values which can only increase遵循只能增加的值集合中的最小值
【发布时间】:2015-04-16 20:14:06
【问题描述】:

我有大量整数,其值只能增长(我在数东西)。

出于效率原因,我单独保留一个最大值,随时更新:

// when increasing the i'th count
coll[i] += 1;
// check whether also to update the max:
if(coll[i] > max){
  max = coll[i];
}

什么是“遵循”集合的最小值值的有效算法?

高效我的意思是,尽可能少地迭代整个集合并保持较小的内存占用。 (后者确实不如前者重要)

我正在使用 Java:所以如果上述算法已经在 J​​RE 中,我欢迎提供参考。

【问题讨论】:

  • 如果你的收藏只会增长——就像你记住max一样,你可以记住min——还是我误解了你的问题?
  • 只检查最后一个元素是否最大,第一个元素是否最小?还是我理解错了?
  • 你不知道哪些元素是最小的,所以当这些最小值中的一个被增加时,你不知道是否还有其他元素(不要触及最小值)或没有(增加最小值)
  • 收集桶或多或少随机增加。想象一下放入直方图箱中的数据。
  • @Philipp 每个元素都可以随时增加?现在明白了。

标签: java algorithm collections min


【解决方案1】:

为每个值保留一个计数哈希表,然后更新它,如果哈希表中没有更多等于 min 的值,则更新它。

// when increasing the i'th count
coll[i] += 1;
--hashTable[coll[i] - 1];
++hashTable[coll[i]];
// check whether also to update the max:
if(coll[i] > max){
  max = coll[i];
}
// check whether to update the min:
if(min == coll[i] - 1 && hashTable[coll[i] - 1] == 0){
  min = coll[i];
}

如果你能负担得起内存(如果你的值足够小),哈希表可以是一个简单的数组,也可以是一个实际的Hashtable

这只需要对您的集合进行初始迭代来构建哈希表。然后将不再执行迭代。

【讨论】:

  • 谢谢,很清楚!我可能会使用 HashTable,因为我的值没有严格的界限。所以我不能预先分配“足够大”的数组来保存所有可能的值。
  • 当然,当所有计数完成后才需要最小值时,之后只迭代一次仍然是更好的选择。
猜你喜欢
  • 2018-12-01
  • 2017-01-12
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2014-02-24
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多