Algorithm 算法复杂性:为什么排序会将复杂性降低到O(logn)

Algorithm 算法复杂性:为什么排序会将复杂性降低到O(logn),algorithm,list,sorting,complexity-theory,logarithm,Algorithm,List,Sorting,Complexity Theory,Logarithm,我正在阅读一些关于算法复杂性的文章(我计划稍后再学习算法课程),但我不理解以下内容 假设我要在一个无序的列表中搜索一个项目,找到它所需的步骤数量将与该列表中的项目数量成正比。在一个包含10个项目的列表中查找它需要10个步骤,对一个包含100000个项目的列表执行同样的操作需要100000个步骤。所以算法复杂度是线性的,用O(n)表示 现在,这段文字[1]告诉我,如果我按照某种属性对列表进行排序,比如说社会保险号,那么查找项目的算法复杂性将降低到O(logn),当然这要快得多。 现在我可以在b-树

我正在阅读一些关于算法复杂性的文章(我计划稍后再学习算法课程),但我不理解以下内容

假设我要在一个无序的列表中搜索一个项目,找到它所需的步骤数量将与该列表中的项目数量成正比。在一个包含10个项目的列表中查找它需要10个步骤,对一个包含100000个项目的列表执行同样的操作需要100000个步骤。所以算法复杂度是线性的,用O(n)表示

现在,这段文字[1]告诉我,如果我按照某种属性对列表进行排序,比如说社会保险号,那么查找项目的算法复杂性将降低到O(logn),当然这要快得多。 现在我可以在b-树的情况下看到这种情况,但这如何应用于列表?既然英语不是我的母语,我会误解课文吗


[1]http://msdn.microsoft.com/en-us/library/ms379571.aspx

这适用于任何可随机访问的容器。对于列表,您将首先转到中间元素。假设这不是目标,则排序会告诉您目标是在上面的子列表中还是在下面的子列表中。这本质上变成了二元搜索,与通过b-树进行搜索没有什么不同。

二元搜索,检查中间目标是否较高,它必须位于右侧,如果较低,则检查中间数字,依此类推。每次你把列表一分为二,剩下O(logn)

好吧,那我就明白了,我有点困惑。课文中还没有提到b-树,所以我想知道我是否理解正确。干杯