Предполагая, что умножение и деление равно O (1):
Думая о числах, вы можете записать их как:
Число (i) = A0 * n ^ 765 +A1 * n ^ 764 + .... + A764 * n + A765.
для кодирования числа в этот формат, вы должны просто сделать Number / n ^ i, Number% n ^ i, еслиВы предварительно вычислите, n ^ 1, n ^ 2, n ^ 3, ... это можно сделать в O (n * 765) => O (n) для всех чисел.предварительное вычисление n ^ i, может быть выполнено в O (i), поскольку i
не более 765, это O (1) для всех элементов.
Теперь вы можете записать Numbers (i) в виде массива: Nembers (i) = (A0, A1, ..., A765) и знать, что вы можете изменить элементы сортировки:
сначала сравните всеA765, затем ...., Все значения Ai находятся в диапазоне 0..n, поэтому для сравнения значений Ai можно использовать Отсчет для сортировки (Отсчет для подсчета равен O (n)), поэтому сортировка по основанию равна O(n * 765), то есть O (n).
После радикальной сортировки у вас есть два отсортированных массива, и вы можете просто найти один подобный элемент в O (n) или использовать алгоритм слияния (как сортировка слиянием), чтобы найти максимально возможное сходство (а не только одно).
для обобщения, если размер входных элементов равен O (n ^ C), он может быть отсортирован по O (n) (C - фиксированный номер).но поскольку затраты на этот способ сортировки велики, предпочтительнее использовать быструю сортировку и аналогичные алгоритмы.Простой пример этого вопроса можно найти в книге Введение в алгоритм , которая спрашивает, находятся ли числа в диапазоне (0..n ^ 2), как отсортировать их в O (n).
Редактировать: для уточнения того, как вы можете найти похожие элементы в 2-отсортированных списках:
У вас есть 2 отсортированных списка, например, в сортировке слиянием, как вы можете объединить два отсортированных списка водин список?вы переместитесь из начала списка 1 и списка 2 и переместите указатель вашей головы в list1, в то время как head (list (1))> head (list (2)), и после этого сделайте это для list2 и ..., такесли есть подобный элемент, ваш алгоритм остановится (до достижения конца списков), или в конце двух списков ваш алгоритм остановится.
это так же просто, как показано ниже:
public int FindSimilarityInSortedLists(List<int> list1, List<int> list2)
{
int i = 0;
int j = 0;
while (i < list1.Count && j < list2.Count)
{
if (list1[i] == list2[j])
return list1[i];
if (list1[i] < list2[j])
i++;
else
j++;
}
return -1; // not found
}