【问题标题】:using linked list vs large array for searching使用链表与大数组进行搜索
【发布时间】:2016-03-02 14:10:38
【问题描述】:

我正在为一项任务对传统的生活游戏进行一些算法更改。

基本上,我目前有两种选择来实现多线程搜索算法,该算法提高了以前算法的效率。

  • 要么使用两个线程搜索链表,然后将数据中继到另外两个线程进行处理(应用程序在四核上运行)
  • 拥有一个庞大的预分配数组,该数组大部分为空,仅包含指向预定义结构的指针,在这种情况下,搜索可以更快地完成,并且在同步线程时不会出现问题。

更快的搜索是否会超过内存需求并减少计算时间?

需要说明的是,数组将大部分保持为空,但分配给它的总内存会远远大于链表,更不用说最远的非空数组元素的索引也可以存储,以便防止程序搜索整个数组。

我还应该提到,该数组存储指向活动单元格坐标的指针,因此仅在最坏情况下保持如此之大。我还计划忽略任何 NULL 值以跳过已删除的数组元素。

【问题讨论】:

  • 很难确定,但是数组会受到非局部性的影响,即不能有效地使用缓存。但是如何从链表中找到邻居呢?
  • 该程序使用一个 nxmx2 数组,第二层存储每个元素的邻居。由于每个活细胞都被引用,您可以检查活细胞的第二层及其邻居坐标以确定谁生死。该算法目前比传统算法快 2 倍
  • 快速算法使用位图(一个 64 位整数表示 64 个单元格)并使用硬编码的二进制逻辑实现邻居计数。 (不记得是谁说的:如有疑问,请使用蛮力)。

标签: c arrays multithreading algorithm


【解决方案1】:

生命游戏和搜索?????

如果您想要一个多线程的生命游戏,请自行计算第 n/2 行,但不要将其存储在数组中,只需在缓冲区中,运行两个线程来计算并存储第 0 到 n/2 - 1 行分别第 n/2 + 1 到 n-1 行,然后将第 n/2 行复制到结果中。

对于四个线程,首先计算 n/4、n/2、3n/4 处的行,给每个线程四分之一的作业,然后将三行复制到数组中。

【讨论】:

    【解决方案2】:

    如果您的阵列与大多数 GOL 板一样稀疏,那么列表可能会快得多。拥有指向下一条数据的指针比扫描它要好得多。

    也就是说,整体性能可能并不像其他人提到的那样好。

    【讨论】:

    • 存储指向包含活动单元格坐标的结构的指针的数组将大部分保持为空,搜索将限制在最远的非空元素处,并且在该最远元素和最远元素之间的元素设置为空第零个元素将使用堆栈重用,使数组搜索空间更小。这会改变计算时间吗?分配给该数组的空间量比任何东西都更多用于冗余,这就是为什么我假设这将是一个更快的实现,尤其是多线程,但正如你提到的那样,它可能是有风险的。
    猜你喜欢
    • 2014-08-24
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多