有序列表的优点和缺点是什么

  • 本文关键字:缺点 是什么 列表 c++
  • 更新时间 :
  • 英文 :


我目前正试图弄清楚有序列表的优点和缺点,但我在这里努力寻找重要性。我知道有序列表可以允许二进制搜索,这比顺序搜索效率高得多。否则我就不知所措了。

对数据进行排序有很多成本和好处。

你是对的,它确实启用了二进制搜索。但是有很多方法可以构造数据,以便快速搜索元素;在C++标准库中,std::set按顺序维护元素,而std::unordered_set不按顺序维护,第二个通常比第一个快。(它使用散列来查找元素,而不是在半平衡二进制树上进行二进制搜索(。

通常,我会对数据进行排序,以计算它们之间的差异,或者使用规范表示。如果我有两个数据集合,并且它们是无序的,那么检查相等性是令人讨厌的(有O(n^2(对需要检查(。如果数据是按规范顺序排列的,我可以做O(n(功;如果我相信哈希函数足够健壮,我甚至可以对每个元素和元素的每个子集合进行预哈希,并在O(1(时间内检查相等性。

我甚至可以通过仔细排序的数据和值得信赖的哈希来发现O(差异大小(时间的差异。

有序的数据往往是人类想要的;随机订购的收件箱不是很有用,而在邮件到达时订购的收件箱,甚至是某种重要的收件箱,则是更好的UI。

有序的数据可以使分支预测更容易,而硬件、编译器或算法级别的其他优化也更容易。这里有一个关于这个问题的经典SO问题;处理已排序的数组比未排序的数组快,询问者会感到惊讶。

编程最困难的部分是理解到底发生了什么。数据有结构使推理更容易;思考的事情更少。列表总是有序的意味着使用它的代码可以假设它总是有序的,这可以使该代码更容易思考和更简单,然后使用的代码也更容易思考。

当然,代价是,就计算机时间和程序员思考后果的时间而言,排序列表上几乎所有的编辑操作最终都会更加昂贵。对于std::vector,添加K个元素需要O(K(时间;同时,在每次操作后天真地排序的std::vector将需要O(K*N lg N(时间,这可能非常慢。

不做某事是非常有价值的。不做任何事情的代码很容易理解它的作用。通过消除";有序的";要求,您可以使数据写入该存储更容易思考,也更容易让计算机执行。