C++ 在这种情况下,我的时间复杂性妄想症是合理的吗?

C++ 在这种情况下,我的时间复杂性妄想症是合理的吗?,c++,time-complexity,C++,Time Complexity,对于一个无序的_集来说,“搜索、插入和删除具有平均恒定的时间复杂度”。在最坏的情况下,它们在时间上都退化为线性。与此相反,如果是集合,则表示所有操作都是容器大小的对数(IMHO也提到了更糟糕的情况) 因此,给定一个问题,我如何确定是使用集合还是使用无序集合(我只需要有效的插入、查找和删除-它们的顺序没有任何区别)。我认为,除非我想对元素进行排序,否则总是在无序集上使用集是有意义的,因为我不知道问题何时变成了最坏的情况(不再是平均情况)。类似地,对于无序的_图和图我也有同样的问题 编辑:我问这个问

对于一个
无序的_集
来说,“搜索、插入和删除具有平均恒定的时间复杂度”。在最坏的情况下,它们在时间上都退化为线性。与此相反,如果是
集合
,则表示所有操作都是容器大小的对数(IMHO也提到了更糟糕的情况)

因此,给定一个问题,我如何确定是使用
集合
还是使用
无序集合
(我只需要有效的插入、查找和删除-它们的顺序没有任何区别)。我认为,除非我想对元素进行排序,否则总是在
无序集
上使用
是有意义的,因为我不知道问题何时变成了最坏的情况(不再是平均情况)。类似地,对于
无序的_图
我也有同样的问题

编辑:我问这个问题主要是从采访的角度(在某种程度上,是从竞争性编程的角度)

我认为,除非我想对元素进行排序,否则总是使用集合而不是无序的集合是有意义的

如果要对元素进行排序,则不能选择无序集。如果订单不重要,则任何一个都可以选择

这主要归结为您是否关心最坏情况或平均情况下的性能。在许多情况下,你甚至不需要知道你关心的是哪一个,因为你可以简单地衡量哪一个对你的程序来说更快,并据此做出选择

一个例外是实时约束的情况,特别是当它们很硬时。在这种情况下,必须考虑最坏情况的复杂性,以确保不超过约束。

我认为,除非我想对元素进行排序,否则总是使用集合而不是无序的集合是有意义的

如果要对元素进行排序,则不能选择无序集。如果订单不重要,则任何一个都可以选择

这主要归结为您是否关心最坏情况或平均情况下的性能。在许多情况下,你甚至不需要知道你关心的是哪一个,因为你可以简单地衡量哪一个对你的程序来说更快,并据此做出选择


一个例外是实时约束的情况,特别是当它们很硬时。在这种情况下,你必须考虑最坏情况的复杂性,以确保不超过约束。

我建议不要过于关注算法的复杂性界限,如果你关心程序在实践中运行的速度有多快。相反,要好好学习分析和测量(可能还有硬件)。最糟糕的情况是,性能是线性的,因为当每个元素都得到相同的哈希值时,结构就会退化为一个简单的列表。除非您指定将散列设计得如此糟糕,否则这几乎不会发生。
std::set
std::unordered_set
实现完全不同的数据结构。很多因素决定了哪一个更好,例如比较速度、哈希速度,以及是否有人设计恶意输入试图利用您的程序进行攻击。了解数据结构是如何工作的,并对其进行基准测试,以确定在您的特定情况下哪一个更快。@Sebastianhofmann输入也可能是为了引起一系列哈希冲突而设计的,这可能是一个例子。只是一个小轶事:当你只处理30个元素左右时,线性搜索可能比
std::map
std::unordered_map
快得多。如果你关心程序在实践中运行的速度,我建议你不要对算法的复杂度界限太在意。相反,要好好学习分析和测量(可能还有硬件)。最糟糕的情况是,性能是线性的,因为当每个元素都得到相同的哈希值时,结构就会退化为一个简单的列表。除非您指定将散列设计得如此糟糕,否则这几乎不会发生。
std::set
std::unordered_set
实现完全不同的数据结构。很多因素决定了哪一个更好,例如比较速度、哈希速度,以及是否有人设计恶意输入试图利用您的程序进行攻击。了解数据结构是如何工作的,并对其进行基准测试,以确定在您的特定情况下哪一个更快。@Sebastianhofmann输入也可能是为了引起一系列哈希冲突而设计的,这可能是一个例子。只是一点轶事:当你只处理30个元素左右时,线性搜索可能比
std::map
std::unordered_map
快得多。