Расстояние Левенштейна — это мера различия между двумя строками, определяемая как минимальное количество односимвольных изменений (вставок, удалений или замен), необходимых для преобразования одной строки в другую. Для поиска всех строк из массива, удовлетворяющих критерию, что расстояние Левенштейна к новой строке менее 3 операции, можно использовать следующий алгоритм:

Шаг 1: Определение функции расстояния Левенштейна

Сначала необходимо определить функцию, которая вычисляет расстояние Левенштейна между двумя строками. В Python это можно сделать следующим образом:

def levenshtein_distance(s1, s2):
    if len(s1) < len(s2):
        return levenshtein_distance(s2, s1)

    if len(s2) ==  0:
        return len(s1)

    previous_row = range(len(s2) +  1)
    for i, c1 in enumerate(s1):
        current_row = [i +  1]
        for j, c2 in enumerate(s2):
            insertions = previous_row[j +  1] +  1
            deletions = current_row[j] +  1
            substitutions = previous_row[j] + (c1 != c2)
            current_row.append(min(insertions, deletions, substitutions))
        previous_row = current_row
    
    return previous_row[-1]

Шаг 2: Поиск строк с расстоянием Левенштейна меньше 3

Теперь, когда у нас есть функция для вычисления расстояния Левенштейна, мы можем использовать её для поиска всех строк в массиве, удовлетворяющих критерию. Для этого можно использовать следующий алгоритм:

def find_similar_strings(new_string, array, max_distance=3):
    similar_strings = []
    for string in array:
        distance = levenshtein_distance(new_string, string)
        if distance <= max_distance:
            similar_strings.append(string)
    return similar_strings

Шаг 3: Пример использования

# Пример массива строк
array = ["hello", "world", "python", "java", "javascript", "ruby", "c++", "c#", "php", "go"]

# Новая строка
new_string = "hellow"

# Поиск строк с расстоянием Левенштейна меньше  3
similar_strings = find_similar_strings(new_string, array)

print(similar_strings)

Оптимизация

Для массива из 10 млн уникальных строк, прямое применение функции расстояния Левенштейна к каждой строке будет очень медленным из-за высокой вычислительной сложности алгоритма. В таком случае, рассмотрите возможность использования индексированных структур данных или алгоритмов, оптимизированных для поиска строк с определенным расстоянием Левенштейна, например, с использованием trie или других структур данных, специально разработанных для быстрого поиска похожих строк.