为什么此代码对线性搜索和二叉搜索返回相同的平均比较次数?

Why is this code returning the same average number of comparisons for both linear and binary search?

提问人:Dreadmoth07 提问时间:11/16/2023 最后编辑:Dreadmoth07 更新时间:11/17/2023 访问量:46

问:

这是在A-Level计算机科学课上的一系列问题中提出的。

任务是修改现有的、写得不好的程序来完成几项任务。

这个任务的任务是修改程序,通过更改两者来比较每次搜索的时间效率,并返回一个计数变量,该变量每次进行比较时都会递增 1。然后创建一个函数,对不同长度的列表进行一系列测试,并输出每个列表的平均比较次数。linearSearchbinarySearch

以下代码的问题是逻辑错误,导致每组的平均值完全相同。我尝试对变量标识符进行修改,但没有帮助。

def linearSearch(searchList, searchVal):
    count = 0
    for i in range(0,len(searchList)):
        count += 1
        if searchList[i] == searchVal:
            return i
    return count

def binarySearch(searchList, searchVal):
    start = 0
    count = 0
    end = len(searchList) - 1
    while start <= end:
        mid = (start + end) // 2
        count += 1
        if searchList[mid] == searchVal:
            return mid
        elif searchList[mid] < searchVal:
            start = mid + 1
        elif searchList[mid] > searchVal:
            end = mid - 1
    return count

def generateList(limit):
    list = []
    for i in range(limit):
        list.append(i)
    return list

import random

def test():
    testType = 1
    while testType <= 5:
        linearTestNo = 0
        binaryTestNo = 0
        length = 10**testType
        searchList = generateList(length)
        linearCountTotal = 0
        binaryCountTotal = 0
        while linearTestNo <= 100 and binaryTestNo <= 100:
            x = random.randint(0,length-1)
            linearCountTotal += linearSearch(searchList, x)
            linearTestNo += 1
            binaryCountTotal += binarySearch(searchList, x)
            binaryTestNo += 1
        print(f"Linear Search took {linearCountTotal/100} comparisons on average for a list of {length} items")
        print(f"Binary Search took {binaryCountTotal/100} comparisons on average for a list of {length} items")
        testType += 1


test()

在老师的建议下,我把每个变量分成了一个变量,尽管这不会改变任何事情。我这样做了,错误继续发生。TestNo

Python 搜索

评论

0赞 roganjosh 11/16/2023
我很困惑。使用单个计时器在单个循环中运行这两种方法。他们怎么能给出相同的结果?while
0赞 Scott Hunter 11/16/2023
检查每个搜索函数实际返回的内容。
0赞 John Coleman 11/16/2023
替换为,您的测试输出将有意义。为了保持一致性,请在线性搜索函数中进行类似的更改。在函数的一部分中返回项目,在另一部分中返回计数确实没有意义。return midbreak

答:

1赞 Sachin Mirajkar 11/17/2023 #1

逐行检查代码后,以下是一些建议

  1. 如果未找到搜索值,则这两个函数 和 将返回列表的长度。我知道搜索值将成为列表的一部分,但不建议这样做以查找时间效率。因为您会发现最坏情况的时间效率。linearSearchbinarySearch
  2. 为了提高时间效率,理论上您需要在处理器级别计算每条指令的执行周期数。但要实际检查,您需要包括计时功能。在 Python 中检查时间

由于这是您分配的工作,我没有分享正确的代码,请根据建议:)

评论

2赞 Barmar 11/17/2023
作业说要计算比较的次数,而不是得到实际的时间。在进行复杂性分析时,通常会抽象出低级差异。
0赞 Sachin Mirajkar 11/17/2023
好吧,它仍然应该是最坏的情况,即搜索元素不在列表中。对于线性搜索,它是列表的直线长度,对于二叉搜索,它是列表长度的 2 的除法数。右?
1赞 Barmar 11/17/2023
右。它们需要在成功时返回,而不是找到的值。count