Эффективная сортировка множества строк параллельно для представления - PullRequest
1 голос
/ 30 января 2012

Я столкнулся с проблемой, когда у меня есть массивный список информации (287 843 элемента), который должен быть отсортирован для отображения. Что эффективнее: использовать самоорганизующееся красно-черное двоичное дерево для сортировки или создания массива, а затем сортировать? Мои ключи - это строки, если это поможет. Этот алгоритм должен использовать несколько процессорных ядер.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 30 января 2012

Это действительно зависит от особенностей вашей настройки.Если у вас многоядерный компьютер, вы, вероятно, сможете очень быстро отсортировать строки, используя параллельную версию быстрой сортировки , в которой каждый рекурсивный вызов выполняется параллельно с другим вызовом.Со многими ядрами это может занять уже быструю быструю сортировку и существенно ускорить ее.Другие алгоритмы сортировки, такие как сортировка слиянием, также могут быть распараллелены, хотя параллельная быстрая сортировка имеет то преимущество, что требует меньше дополнительной памяти.Поскольку вы знаете, что вы сортируете строки, вы также можете захотеть изучить параллельную сортировку по основанию , которая потенциально может быть очень быстрой.

Большинство двоичных деревьев поиска не могут быть легко многопоточными, потому чтоОперации восстановления баланса часто требуют одновременной смены нескольких частей дерева, поэтому сбалансированное красное / черное дерево может оказаться не лучшим подходом.Тем не менее, вы можете захотеть взглянуть на параллельный список пропусков , который представляет собой структуру данных, которую можно заставить работать эффективно параллельно.Существуют некоторые новые бинарные деревья поиска, разработанные для параллелизма, которые иногда превосходят список пропусков ( вот одна из таких структур данных ), хотя я ожидаю, что будет меньше существующих реализаций и обсуждение этих новых структур.

Если элементы не меняются часто, или вам нужно отсортировать заказ только один раз, тогда, вероятно, лучшим выбором будет только одна сортировка с параллельной быстрой сортировкой.Если элементы часто меняются, то лучше использовать параллельную структуру данных, такую ​​как параллельный список пропусков.

Надеюсь, это поможет!

1 голос
/ 30 января 2012

Предполагая, что вы читаете этот список из файла или какого-либо другого источника данных, кажется совершенно правильным прочитать все это в массив, а затем отсортировать его.Если у вас есть какой-то графический интерфейс, кажется, что еще более возможно выполнять чтение и сортировку в потоке, в то время как графический интерфейс пользователя находится в состоянии «ожидания завершения».Сохранение дерева значений звучит выполнимо, только если вы собираетесь делать много удалений / вставок, что в этом случае сделает массив менее пригодным для использования.Поверьте, сортировка слиянием легче всего распараллелить.Но я не эксперт, когда дело доходит до этого, поэтому не верьте моему слову за определенный ответ.

...