【问题标题】:Sorting two linked lists according to memory location根据内存位置对两个链表进行排序
【发布时间】:2009-06-16 14:56:04
【问题描述】:

我需要合并两个双向链表,但不是按它们的值(列表未排序)。 我想获得一个列表,其中包含两者中的所有节点,但按照它们在内存中出现的顺序。

也许这张图片有更多帮助: http://img140.imageshack.us/i/drawing2.png/

是否有任何算法(最好是快速算法)可以进行这种合并? 也许这有点帮助:

  • 列表的起始节点总是在其他节点之前。
  • 一个列表最多可以有 8192 个节点。
  • 我知道节点在内存中的位置,因为列表会跟踪一大块内存中的空闲位置(用于内存分配器)。
  • 我使用 C++ 工作。

提前致谢!

【问题讨论】:

  • 您的要求使这听起来不像一个链表。为什么节点的上限?为什么要分配大块?
  • 这是内存分配器的一部分。一块内存有 32KB,这个“列表”跟踪该块中哪些位置已被释放(一个用于由拥有该块的线程释放的对象,一个用于其他线程)。你是对的,这实际上不是链表。一个“节点”是一个32位的单个数字,下半部分表示Next,上半部分表示Previous,用距离block start的距离表示。因为block的地址是已知的,所以我不需要存储真正的指针并保存so空间很大。最大节点数为 32KB / 4 字节 = 8192 个节点。

标签: c++ data-structures linked-list


【解决方案1】:

听起来您没有使用std::list,所以我将使用通用解决方案。由于您的要求是合并列表,但让节点按内存中物理位置的顺序排列。您可能只需附加两个列表,然后按节点的地址对节点进行排序。

有关链表的排序算法,请参阅:http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html。

在排序时,不要比较 node1->value < node2->value,只需执行 (size_t)node1 < (size_t)node2 或类似的事情。

【讨论】:

  • std::less 是比较指针的“官方”方式。它被标准定义为能够比较任何两个指针,即使 operator
【解决方案2】:

“合并”在这里有点误导,因为您只能合并已排序的列表,而您的未排序。

你需要排序,而不是合并。

将指向节点的指针放入向量中。在向量上使用 std::sort ,并传递一个比较函子,该函子将每个指针转换为 size_t (我认为)并比较结果数字。

然后您可以根据向量中的结果顺序重新排列您的链表。

【讨论】:

  • 埃文的回答更好——使用列表排序算法而不是创建一个备用向量。
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2019-03-04
  • 2021-07-20
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多