有效地对多个字符串进行排序以进行演示

时间:2012-01-29 23:07:24

标签: algorithm sorting data-structures parallel-processing multicore

我遇到一个问题,我有一个大量信息列表(287,843项),必须对其进行排序才能显示。哪个更有效,使用自组织的红黑二叉树来保持它们排序或构建一个数组然后排序?我的钥匙是字符串,如果这有帮助的话。该算法应该使用多个处理器内核。

谢谢!

2 个答案:

答案 0 :(得分:6)

这实际上取决于您的设置细节。如果你有一台多核机器,你可以使用parallel version of quicksort非常快速地对字符串进行排序,其中每个递归调用与另一个调用并行执行。对于许多内核,这可以采用已经很快的快速排序并使其速度更快。其他排序算法(如合并排序)也可以并行化,但并行快速排序具有需要更少额外内存的优势。既然您知道自己正在排序字符串,那么您可能还需要查看parallel radix sort,这可能会非常快。

大多数二叉搜索树不容易被多线程化,因为重新平衡操作通常需要一次更改树的多个部分,因此平衡的红/黑树可能不是最好的方法。但是,您可能希望查看concurrent skiplist,这是一种可以并行有效工作的数据结构。有一些较新的二元搜索树设计用于并行性,有时甚至优于跳过列表(here is one such data structure),但我预计现有的实现和讨论将会更少。

如果元素没有经常更改,或者您只需要排序一次,那么只需使用并行快速排序进行一次排序可能是最好的选择。如果元素频繁变化,那么像并行跳转列表这样的并发数据结构可能是更好的选择。

希望这有帮助!

答案 1 :(得分:1)

假设您正在从文件或其他数据源中读取该列表,将所有内容读入数组,然后对其进行排序似乎是正确的。如果你有某种类型的GUI,那么在一个线程中进行读取和排序似乎更可行,同时让GUI处于“等待完成”状态。只有当你要进行大量的删除/插入时才能保持值的树是可行的,这会使得数组在这种情况下的可用性降低。

当谈到多核排序时,我认为合并排序是最容易并行化的。但就此而言,我不是专家,所以不要认真回答。