Поиск ближайшего заданного значения в некотором списке
Код в вопросе использует O(n) линейный алгоритм, что уже оптимально в общем случае.
Можно модифицировать алгоритм, чтобы сделать его однопроходным — чтобы поддерживать произвольные iterable, а не только последовательности:
Если нужен индекс, то можно enumerate(iterable) использовать и поправить lambda .
Если необходимо искать несколько точек, то можно подготовить список заранее (отсортировать его). Сортировка, основанная на сравнениях, в общем случае является O(n * log n) операцией (хуже чем O(n) ). Если ввести некоторые предположения (например, целые числа в определённом диапазоне), то существуют O(n) алгоритмы сортировки (без сравнений), например: Поразрядная сортировка.
Python поиск ближайшего значения?
Вам даны список значений в виде множества (Set) и значение, относительно которого, надо найти ближайшее.
Несколько уточнений:
Если 2 числа находятся на одинаковом расстоянии — необходимо выбрать наименьшее из них;
Ряд чисел всегда не пустой, т.е. размер >= 1;
Переданное значение может быть в этом ряде, а значит оно и является ответом;
В ряде могут быть как положительные, так и отрицательные числа, но они всегда целые;
Ряд не отсортирован и состоит из уникальных чисел.
Решение предлагают такое:
Как работает часть (abs(one — n), n)?
- Вопрос задан более двух лет назад
- 6443 просмотра
- Вконтакте
- Вконтакте
Сперва кажется что достаточно выражения abs(one — n),
но тогда не выполняется условие «Если 2 числа находятся на одинаковом расстоянии — необходимо выбрать наименьшее из них»,
например set <0, -2>и one = -1
Здесь одинаковая разница в 1, но выбрать нужно минимальное, т.е. -2
Именно для этой цели нужно сравнивать не только разницу, но и номинал из множества. В вашем коде это сделано через кортеж, а можно и списком
min(values, key=lambda n: [abs(one — n), n])
Или же можно отсортировать множество, тогда будет достаточно abs(one — n), т.к. при одинаковых разностях он выберет первое значение коллекции, а это будет меньшее значение
min(sorted(values), key=lambda n: abs(one — n))
Name already in use
coursera-python / week5 / Ближайшее число.py /
- Go to file T
- Go to line L
- Go to definition R
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Как найти ближайшее число в массиве python
fibM = fibM_minus_1 + fibM_minus_2
- Сравниваем val со значением блока в диапазоне до fibM_minus_2 и возвращаем индекс элемента, если он совпадает.
- Если значение больше, чем элемент, который мы в данный момент просматриваем, мы перемещаем значения fibM , fibM_minus_1 и fibM_minus_2 на два шага вниз в последовательности Фибоначчи и меняем индекс на индекс элемента.
- Если значение меньше, чем элемент, который мы в данный момент просматриваем, мы перемещаем значения fibM, fibM_minus_1 и fibM_minus_2 на один шаг вниз в последовательности Фибоначчи.
- Присваиваем переменной fibM наименьшее число Фибоначчи, которое больше или равно длине списка. В данном случае наименьшее число Фибоначчи, отвечающее нашим требованиям, равно 13.
- Значения присваиваются следующим образом:
- Далее мы проверяем элемент lys[4] , где 4 — это минимум из двух значений — index + fibM_minus_2 (-1+5) и длина массива минус 1 (11-1). Поскольку значение lys[4] равно 5, что меньше искомого значения, мы перемещаем числа Фибоначчи на один шаг вниз в последовательности, получая следующие значения:
- Далее мы проверяем элемент lys[7] , где 7 — это минимум из двух значений: index + fibM_minus_2 (4 + 3) и длина массива минус 1 (11-1). Поскольку значение lys[7] равно 8, что больше искомого значения, мы перемещаем числа Фибоначчи на два шага вниз в последовательности, получая следующие значения:
- Затем мы проверяем элемент lys[5] , где 5 — это минимум из двух значений: index + fibM_minus_2 (4+1) и длина массива минус 1 (11-1) . Значение lys[5] равно 6, и это наше искомое значение!
- Определяется диапазон, в котором, скорее всего, будет находиться искомый элемент.
- В этом диапазоне используется двоичный поиск для нахождения индекса элемента.
- Проверяем, соответствует ли первый элемент списка искомому значению: поскольку lys[0] равен 1, а мы ищем 3, мы устанавливаем индекс равным 1 и двигаемся дальше.
- Перебираем все элементы в списке, и пока элемент с текущим индексом меньше или равен нашему значению, умножаем значение индекса на 2:
- index = 1, lys[1] равно 2, что меньше 3, поэтому значение index умножается на 2 и переменной index присваивается значение 2.
- index = 2, lys[2] равно 3, что равно 3, поэтому значение index умножается на 2 и переменной index присваивается значение 4.
- index = 4, lys[4] равно 5, что больше 3. Условие выполнения цикла больше не соблюдается и цикл завершает свою работу.
- Затем выполняется двоичный поиск в полученном диапазоне (срезе) lys[:4] . В Python это означает, что подсписок будет содержать все элементы до 4-го элемента, поэтому мы фактически вызываем функцию следующим образом:
- lys — наш входной массив.
- val — искомый элемент.
- index — вероятный индекс искомого элемента. Он вычисляется как более высокое значение, когда значение val ближе по значению к элементу в конце массива ( lys[high] ), и более низкое, когда значение val ближе по значению к элементу в начале массива ( lys[low] ).
- low — начальный индекс массива.
- high — последний индекс массива.
- Если значение найдено (когда lys[index] == val ), возвращается индекс.
- Если значение val меньше lys[index] , то значение индекса пересчитывается по формуле для левого подмассива.
- Если значение val больше lys[index] , то значение индекса пересчитывается по формуле для правого подмассива.
index = 0 + [(6-1)*(7-0)/(8-1)] = 5
Зачем использовать Python для поиска?
- Если вы хотите выполнить поиск в несортированном массиве или найти первое вхождение искомой переменной, то лучшим вариантом будет линейный поиск.
- Если вы хотите выполнить поиск в отсортированном массиве, есть много вариантов, из которых самый простой и быстрый — это бинарный поиск.
- Если у вас есть отсортированный массив, в котором вы хотите выполнить поиск без использования оператора деления, вы можете использовать либо jump search, либо поиск Фибоначчи.
- Если вы знаете, что искомый элемент, скорее всего, находится ближе к началу массива, вы можете использовать экспоненциальный поиск.
- Если ваш отсортированный массив равномерно распределен, то самым быстрым и эффективным будет интерполяционный поиск.

Вычислить ближайшие числа в массиве python
x = [166.3, 188.9, 195.2, 209.1, 219.2, 225, 236.1, 242.8, 247.6, 252.9, 260.6, 265.9, 271.6, 275.5]
y = [0.11, 0.22, 0.33, 0.44, 0.55, 0.65, 0.76, 0.87, 0.98, 1.09, 1.2, 1.31, 1.42, 1.53]