Если мы используем последовательную машину (параллельные сравнения невозможны), где сравнения выполняются последовательно, и мы стремимся минимизировать количество тактов процессора при сортировке 32 случайных элементов, должны ли мы использовать сеть сортировки или адаптивный алгоритм сортировки. ?
Оптимальных сетей (пока) для n=32 элементов не существует. С практической точки зрения, если мы хотим минимизировать количество тактовых циклов процессора, лучше всего разделить 32 элемента на четыре подсписка n = 8 и применить оптимальную сеть сортировки к каждому подсписку, а затем объединить списки вместе?
Очевидно, что здесь мы работаем со «средней производительностью», потому что адаптивным алгоритмам может повезти, если нам дан уже отсортированный список.
Подсчитав цифры имеем следующее:
Сортировка списка размера n:
Минимальное количество сравнений для n=2 равно 1.
Минимальное количество сравнений для n=4 равно 5.
Минимальное количество сравнений для n=8 равно 19.
Объединение двух списков размера n:
Объединить два списка n = 2 - это 2 * n - 1 = 3 сравнения
Слияние двух списков n = 4 равно 2 * n - 1 = 7 сравнений
Слияние двух списков n=8 равно 2*n - 1 = 15 сравнений.
Слияние двух списков n=16 равно 2*n - 1 = 31 сравнению.
Общее количество сравнений, если мы разделим n=32 на шестнадцать n=2 подсписков:
- Сортировка: 1*16 = 16
- Слияние: 3*8 + 7*4 + 15*2 + 31*1 = 113
- Всего: 129
Общее количество сравнений, если мы разделим n=32 на восемь подсписков n=4:
- Сортировка: 5*8 = 40
- Слияние: 7*4 + 15*2 + 31*1 = 89
- Всего: 129
Общее количество сравнений, если мы разделим n=32 на четыре подсписка n=8:
- Сортировка: 19*4 = 76
- Слияние: 15*2 + 31*1 = 61
- Всего: 137
Теперь можно подумать, что было бы лучше разделить n=32 элемента на n=2 или n=4 подсписка, так как общее количество сравнений меньше. Но слияние требует хранения частей массива «не на своем месте», что может свести на нет преимущество меньшего количества сравнений?
Моя интуиция подсказывает мне, что в среднем неадаптивная сеть сортировки похожа на алгоритм с точки зрения общего количества сравнений, но сеть сортировки выигрывает из-за меньших накладных расходов, я прав?
Я пытаюсь отсортировать n=32 элемента в среднем менее чем за 1200 тактов. Я работаю на простой последовательной машине с простой 256 слов * 16-битной памятью и всего четырьмя регистрами, поэтому сеть/алгоритм должен быть простым, быстрым и не требовать много места. ALU имеет только функции сложения, вычитания, сдвига на один бит, поворота на один бит, И и ИЛИ. Операции с памятью и ALU занимают один такт каждая.
/dev/random
— это максимально случайный поток байтов, так что для вас это означает равномерно распределенные 16-битные целые числа без смещения в сторону уже частично отсортированных. (В отличие от многих реальных входных данных сортировки, но хорош тем, что не склоняется к какому-либо конкретному алгоритму сортировки). - person Peter Cordes   schedule 26.04.2018sub reg,[mem]
? - person Peter Cordes   schedule 26.04.2018[min #]comparisons for n=8 is 19
если это из википедии о #сравнениях, необходимых для сортировки списка, есть что-то не так - должно быть 16, а всего 125. - person greybeard   schedule 26.04.2018