如果列表中有1024个项目(lg1024 = 10),那么在什么时候(搜索次数)首先对列表进行排序并使用二进制搜索付清?如果列表中有2048个项目,您的答案如何变化?而不是使用顺序搜索
答案 0 :(得分:1)
如果您的列表未排序,则需要O(n)才能找到它。按快速排序成本O(n * log n)排序,然后二进制搜索为O(log n)。让我们假设x是搜索次数。 x * n = x * logn + n * logn
。通过设置不同的值,您可以估计动态。我的粗略估计告诉我,如果n = 1024且数字搜索大于~10,则首先排序更有效。把1024改为n而不是试试。
答案 1 :(得分:1)
“线性访问”曲线与“二分搜索”曲线相交的位置取决于访问/插入单个项目所需的时间长度与有多少项目。这对于编译器,内存和cpu体系结构的每种组合,列表中的数据/节点类型,数据值的分布,您使用的排序和插入算法等都是不同的......但是具有“足够大”的集合项目的运行时间可以通过提及其上限如何随着项目数量的增加而增加来描述,即使“Big-O”界限可能无法准确描述任何特定的运行。
您可以准确地弄清楚您是否可以知道要插入或搜索的特定算法,并确定构成列表访问的实际指令,并找出它们执行的时钟周期等等。
然后你可以确定哪一个更快,哪个更快。如果您了解数据值,则可以对其进行建模。但是如果你不知道,你必须假设(例如,如果你的插入数据值已经被排序了怎么办?这对你的排序或插入函数有什么影响?)
例如,单项检索可能需要1us。比较两个项目可能需要0.5us。在列表中执行包含100个项目的排序列表插入可能需要X个检索次数,Y个比较次数和Z个更新/写入次数....而无序列表可能需要更多或更少,具体取决于已存在的内容和内容你正在插入。