【发布时间】:2016-03-24 17:58:44
【问题描述】:
我完成了leetcode algorithm 的两个版本,我想知道我的复杂性分析是否正确,尽管以毫秒为单位的在线提交时间并不能准确显示。目标是将数字向量作为参考,如果包含重复值则返回 true,否则返回 false。
两种最直观的方法是:
1.) 对向量进行排序并扫描到倒数第二个,查看是否有任何相邻元素相同,如果相同则返回 true。
2.) 使用哈希表并插入值,如果表中已存在键,则返回 true。
我首先完成了第一个版本,它很快,但是看看排序例程将如何使用O(nlog(n)) 和哈希表插入 & map.count()s would 制作第二个版本O(log(n) + N) = O(N) 我想对于非常大的数据集,哈希版本会更快。
在在线评审中,我被证明是错误的,但我认为他们没有使用足够大的数据集来抵消std::map 开销。所以我运行了很多测试,重复填充向量到 0 到 10000 之间的大小,以 2 递增,添加 0 到 20000 之间的随机值。我将输出通过管道传输到 csv 文件并在 linux 上绘制,这是我得到的图像.
the provided image 是否真正向我展示了 O(N) 和 O(nlog(n)) 算法之间的区别?我只是想确保我对这些的复杂性分析是正确的?
以下是运行的算法:
bool containsDuplicate(vector<int>& nums) {
if(nums.size() < 2) return false;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size()-1; ++i) {
if(nums[i] == nums[i+1]) return true;
}
return false;
}
// Slightly slower in small cases because of data structure overhead I presume
bool containsDuplicateWithHashing(vector<int>& nums) {
map<int, int> map;
for (int i = 0; i < nums.size(); ++i) {
if(map.count(nums[i])) return true;
map.insert({nums[i], i});
}
return false;
}
【问题讨论】:
-
您可以使用
set代替map,并检查来自insert的返回而不是调用count。map是红/黑树,而不是散列容器。 (使用unordered_map/unordered_set。)
标签: c++ algorithm sorting hashmap time-complexity