Рассмотрим два к-битовые числа (в двоичном представлении):Выполняет ли сравнение действительно время O (1)? и если нет ... почему мы используем сортировки?
$$A = A_1 A_2 A_3 A_4 ... A_k $$
$$B = B_1 B_2 B_3 B_4 ... B_k $$
для сравнения мы просматриваем слева направо ищет вхождения 0
и проверить визави, если это цифра также 0
(для обоих номера), заметив, что, если такой случай обнаружен, источник 0
меньше, чем источник 1
. Но что, если эти цифры:
111111111111
111111111110
ясно, что это потребует сканирования целого числа, и если мы не сказали ничего о цифрах впереди времени и просто дал им тогда:
Сравнение принять $O(k)$
время.
Поэтому, когда мы смотрим на коде для метода сортировки, таких как высокопроизводительные быстрой сортировка:
HPQuicksort(list): T(n)
check if list is sorted: if so return list
compute median: O(n) time (or technically: O(nk))
Create empty list $L_1$, $L_2$, and $L_3$ O(1) time
Scan through list O(n)
if element is less place into $L_1$ O(k)
if element is more place into $L_2$ O(k)
if element is equal place into $L_3$ O(k)
return concatenation of HP sorted $L_1$, $L_3$, $L_2$ 2 T(n/2)
Таким образом: T(n) = O(n) + O(nk) + 2*T(n/2) ---> T(n) = O(nklog(n))
Это означает быструю сортировку медленнее, чем поразрядная сортировка.
Почему мы все еще используем его?
Я вижу, что mathjax здесь не работает. Как вы рекомендуете формат? – frogeyedpeas
Форматирование кода. Это не так многофункционально, как MathJax, так как в основном это всего лишь моноширирование всего, но это то, что у нас есть. – user2357112
Извините, что? Сравнение осуществляется в кремнии. Это займет один цикл или что-то в этом роде. Можете ли вы уточнить, что именно вы говорите? Если вы сортируете экземпляры структуры данных BigInt с произвольными битами длины, конечно - я думаю, что это очень редкая вещь для сортировки. Если вы сортируете целые числа (32/64 бит): 1) это O (1), независимо от того, что k ограничено. 2) Это даже не O (n) до крышки, потому что это делается мгновенно. – GVH