【发布时间】:2012-09-26 03:46:18
【问题描述】:
我需要从整数列表中查找一个整数。我对它们进行排序并使用 lower_bound 来查找给定整数的范围。这需要 O(lgn)。有没有比这更好的方法?
以下是改进的提示。
- 给定的列表总是正整数
- 列表已修复。没有插入或删除。
一种方法是创建一个数组并索引到数组中。这可能不节省空间。 我可以使用 unordered_map 吗?我应该定义什么哈希函数?
// Sort in reverse order to aid the lookup process
vector<unsigned int> sortedByRange;
//... sortedByRange.push_back(..)
sort(sortedByRange.begin(), sortedByRange.end(), greater);
Range = (sortedByAddress_.begin() - sortedByRange.end();
std::cout<<"Range :"<<Range<<std::endl; //prints 3330203948
std::pair<unsigned int, unsigned int> lookup(unsigned int addr){
pair<unsigned int, unsigned int> result;
vector<unsigned int>::iterator it = lower_bound(sortedByRange.begin(),
sortedByRange.end(), addr);
result.first = *it;
result.second = *(it++);
return result;
}
【问题讨论】:
-
没有代码 - 没有答案 - 先尝试一下
-
@AdrianCornish:这更多是算法问题。我认为 OP 已经提到了 lower_bound。
-
我不在乎 - 显示代码或没有答案,这看起来很像我看到的 100,000 个作业问题,您希望其他人为您做作业。试过什么代码,计时结果如何……
-
我可以使用 unordered_map 吗?当然。我应该定义什么哈希函数?什么工作最快取决于输入和 # 桶 - 例如,如果它们是有效的随机数或递增数字,您可以直接使用它们。如果# buckets 是素数,并且这些数字并非全部从素数的倍数病理上偏移,那么您也可以使用这些数字。如果你想要一些通用的东西,然后谷歌搜索一个强大的哈希函数。如果您需要通常足够好,请使用 boost::hash 或让 unordered_map 使用其默认值。
-
@nhahtdh 然后显示你尝试过的代码,作业与否,你的实际结果是什么 - 先尝试一下 - 不要要求为你完成工作