Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在排序的std::list中搜索的复杂性是什么?_C++_Search_Std - Fatal编程技术网

C++ 在排序的std::list中搜索的复杂性是什么?

C++ 在排序的std::list中搜索的复杂性是什么?,c++,search,std,C++,Search,Std,在排序的std::list中搜索的复杂性是什么?我知道,如果数据结构具有随机访问权限,则在排序数据中搜索的复杂性为O(logn)。但既然列表并没有随机访问,那个么当它被排序时,它的复杂性是什么呢?好吧,它是O(N)。搜索在std::list中始终为O(N),排序与否 分类收集很有帮助,因为您可以知道自己是否做得太远或不够。但是,因为你只能从列表的一端开始,所以它不会有任何帮助。好吧,它是O(N)。搜索在std::list中始终为O(N),排序与否 分类收集很有帮助,因为您可以知道自己是否做得太远

在排序的std::list中搜索的复杂性是什么?我知道,如果数据结构具有随机访问权限,则在排序数据中搜索的复杂性为O(logn)。但既然列表并没有随机访问,那个么当它被排序时,它的复杂性是什么呢?

好吧,它是O(N)。搜索在
std::list
中始终为O(N),排序与否

分类收集很有帮助,因为您可以知道自己是否做得太远或不够。但是,因为你只能从列表的一端开始,所以它不会有任何帮助。

好吧,它是O(N)。搜索在
std::list
中始终为O(N),排序与否


分类收集很有帮助,因为您可以知道自己是否做得太远或不够。但是,因为你只能从列表的一端开始,所以它不会有任何帮助。

这取决于你如何搜索。给定
std::list x
和一个不在列表中的值
v

  • std::find(x.begin(),x.end(),value)
    是一种线性搜索,因此需要
    x.size()
    比较和迭代步骤,以及

  • std::binary_search(x.begin(),x.end())
    使用O(log(
    x.size()
    ))比较执行二进制搜索,但它仍然必须线性递增迭代器以处理每个比较的目标(对于
    std::lower_bound
    等也是如此)。如果列表未按排序顺序排列,则此调用的行为未定义


通常,迭代器递增对于基于节点的容器来说有着不可忽略的代价,因为它涉及指针跟踪,并且在内存中是非本地的。但是,您需要考虑值类型的比较操作的成本(这可能是高的,例如,对于非常长的、几乎相等的字符串)。此外,您还可以通过从专用竞技场分配节点来确定内存位置。

这取决于您的搜索方式。给定
std::list x
和一个不在列表中的值
v

  • std::find(x.begin(),x.end(),value)
    是一种线性搜索,因此需要
    x.size()
    比较和迭代步骤,以及

  • std::binary_search(x.begin(),x.end())
    使用O(log(
    x.size()
    ))比较执行二进制搜索,但它仍然必须线性递增迭代器以处理每个比较的目标(对于
    std::lower_bound
    等也是如此)。如果列表未按排序顺序排列,则此调用的行为未定义



通常,迭代器递增对于基于节点的容器来说有着不可忽略的代价,因为它涉及指针跟踪,并且在内存中是非本地的。但是,您需要考虑值类型的比较操作的成本(这可能是高的,例如,对于非常长的、几乎相等的字符串)。此外,您还可以通过从专用竞技场分配节点来解决内存位置问题。

@dyp按值搜索的复杂性注意,与搜索复杂性无关,应避免使用(链接)列表,除非您知道它们在特定情况下的性能优于向量/数组(这些情况非常罕见)。有趣的是C++发明者Bjarne Stroustrup关于这个话题的讨论:“Dyp复杂性的搜索,ValueNoT,独立于搜索复杂性,(链接)列表应该避免,除非你知道它们比你的特定情况下的向量/数组更好(这些情况非常罕见)。关于C++发明者Bjarne Stroustrup关于这个话题的有趣的讨论:“它取决于你如何搜索”——不,你甚至在答案中解释为什么在每种情况下都是线性时间…@莱梅斯:正如我在我的答案中解释的,“IT”有点复杂。他要求复杂性,而这是一个简单的答案:O(n)。你解释的是成本,而不是复杂性。当然,这个解释仍然很有帮助。@leems:复杂性不是魔法。它在测量一些东西。什么是有趣的衡量可以不同。OP可以说没有明确说明这一点。好吧,我想既然他没有要求特定的东西,我们可以安全地假设他只想要一个依赖于大小
n
的复杂度,并假设每个子操作都有一个恒定的复杂度。一个过于精确的表达式是:
T\u search=T\u advance*n+T\u compare*log(n)
,如果您了解Ts,您可以更好地计算复杂性。(可能比较扫描了整个列表本身,所以你有O(n logn))“这取决于你如何搜索”--不。你甚至在回答中解释了为什么在每种情况下都是线性时间…@leems:正如我在回答中试图解释的,“它”有点复杂。他问的是复杂度,答案很简单:O(n)。你解释的是成本,而不是复杂性。当然,这个解释仍然很有帮助。@leems:复杂性不是魔法。它在测量一些东西。什么是有趣的衡量可以不同。OP可以说没有明确说明这一点。好吧,我想既然他没有要求特定的东西,我们可以安全地假设他只想要一个依赖于大小
n
的复杂度,并假设每个子操作都有一个恒定的复杂度。一个过于精确的表达式是:
T\u search=T\u advance*n+T\u compare*log(n)
,如果您了解Ts,您可以更好地计算复杂性。(可能比较会扫描整个列表本身,所以您有O(n log n))谢谢您的回复。这意味着即使std::list已排序,二进制搜索也没有帮助?是的。一旦你在列表的中间,你就知道你应该向左还是向右走…但是您已经花了O(N)个时间来完成链接。列表是双链接列表,每个节点中有两个指针指向pre/next。即使你知道这个节点在中间,你仍然需要经过下一个指针才能到达MID。但是,如果你使用矢量,它有随机内存访问,你可以跳到中间节点。@ USSR552441好,它仍然有帮助,正如KerrekSB在他的回答中解释的。但这无助于降低复杂性。搜索