Chiranthaka Sampath Ответов: 1

Проблема, связанная с двоичным поиском в скрипте Python


Всем Привет,

У меня есть вопрос относительно скрипта Python, который связан с двоичным поиском. Пожалуйста, обратитесь к приведенному ниже резюме. Скрипт был построен с помощью Python 3

Имеет 3 функции
1. linear_search()
2. binary_search()
3. best_search() - функция best_search сравнивает функции linear_search и binary_search, чтобы найти ключ в списке, и возвращает, сколько шагов сделал каждый метод и какой из них лучше всего подходит для данной ситуации.

Список не нуждается в сортировке, так как функция binary_search сортирует его перед продолжением (и использует для этого один шаг). Здесь функции linear_search и binary_search возвращают количество шагов, которые потребовались, чтобы либо найти ключ, либо определить, что его нет в списке.

Если количество шагов одинаково для обоих методов (включая дополнительный шаг для сортировки в binary_search), то результат будет равен нулю.

Я хочу знать, что я должен заполнить пробелы, чтобы получить правильные ответы.

Что я уже пробовал:

<pre>def linear_search(list, key):
    #Returns the number of steps to determine if key is in the list 

    #Initialize the counter of steps
    steps=0
    for i, item in enumerate(list):
        steps += 1
        if item == key:
            break
    return ___ 

def binary_search(list, key):
    #Returns the number of steps to determine if key is in the list 

    #List must be sorted:
    list.sort()

    #The Sort was 1 step, so initialize the counter of steps to 1
    steps=1

    left = 0
    right = len(list) - 1
    while left <= right:
        steps += 1
        middle = (left + right) // 2
        
        if list[middle] == key:
            break
        if list[middle] > key:
            right = middle - 1
        if list[middle] < key:
            left = middle + 1
    return ___ 

def best_search(list, key):
    steps_linear = ___ 
    steps_binary = ___ 
    results = "Linear: " + str(steps_linear) + " steps, "
    results += "Binary: " + str(steps_binary) + " steps. "
    if (___):
        results += "Best Search is Linear."
    elif (___):
        results += "Best Search is Binary."
    else:
        results += "Result is a Tie."

    return results

print(best_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1))
#Should be: Linear: 1 steps, Binary: 4 steps. Best Search is Linear.

print(best_search([10, 2, 9, 1, 7, 5, 3, 4, 6, 8], 1))
#Should be: Linear: 4 steps, Binary: 4 steps. Result is a Tie.

print(best_search([10, 9, 8, 7, 6, 5, 4, 3, 2, 1], 7))
#Should be: Linear: 4 steps, Binary: 5 steps. Best Search is Linear.

print(best_search([1, 3, 5, 7, 9, 10, 2, 4, 6, 8], 10))
#Should be: Linear: 6 steps, Binary: 5 steps. Best Search is Binary.

print(best_search([5, 1, 8, 2, 4, 10, 7, 6, 3, 9], 11))
#Should be: Linear: 10 steps, Binary: 5 steps. Best Search is Binary.

Afzaal Ahmad Zeeshan

Просто краткое примечание: если ваш двоичный поиск выполняет сортировку (O(N logN)), а затем выполняет двоичный поиск (O(logN)), то я могу сказать вам примерно, что линейный поиск будет выполнять меньше операций (O(N)).

Независимо от входных данных, ваш двоичный поиск будет выполнять сортировку.

Chiranthaka Sampath

С вашей точки зрения, чего мне здесь не хватает?

Afzaal Ahmad Zeeshan

Я расширил свой комментарий в ответе, см. Решение 1.

1 Ответов

Рейтинг:
1

Afzaal Ahmad Zeeshan

Продолжая с комментариями.

Если мы говорим о "шаге", то вы не пропускаете, а добавляете несколько шагов. :смеяться:

Если говорить о "точке", то вы упустили момент подсчета "общих" шагов, необходимых для каждого метода. Цель бинарного поиска состоит в том, чтобы найти элементы в О(Фремонт, Калифорния) но это требует, чтобы данные были отсортированы для работы; в противном случае, это не гарантирует правильный вывод.

Если вы в конечном итоге сортируете массив для каждой операции поиска, то вы в конечном итоге добавляете дополнительный O(N logN) для сортировки, для каждого поиска. Это приводит к дополнительным шагам в двоичном поиске и приводит к неправильному представлению о том, что двоичный поиск требует дополнительных шагов.

Надеюсь, это поможет вам понять, что я пытаюсь сказать.

Есть две вещи, которые вы можете сделать здесь:

1. Отсортировать данные
1. не сортируйте данные (и не добавляйте list.sort любой)

Но если вы сортируете данные, то бинарный поиск имеет огромное преимущество перед линейным поиском.

Если вы не сортируете данные, то они оба являются случайными шансами, причем линейный поиск является более точным, а двоичный поиск иногда приводит к неверным результатам.

Я сказал это:
Да, и еще один момент: не называйте свои переменные/параметры списком, набором или картой, которые являются именами методов Python. Это приведет к проблемам, когда вы захотите создать новый список или карту, потому что Python будет продолжать использовать вашу переменную и скрывать лежащие в ее основе ключевые слова Python.