什么是四链表?

时间:2009-04-28 12:39:31

标签: data-structures

我目前正致力于在工作中实现列表类型结构,我需要它有效地发挥作用。在我寻找有效的数据结构时,我偶然发现了四个喜欢列表的专利,这引起了我的兴趣,让我忘记了当前的任务并开始调查四元组列表。不幸的是,互联网对整个事情非常隐秘,并且谷歌在可用结果方面没有产生太多。我得到的唯一解释是专利说明:

四链接数据结构,为单个记录中的多个相关字段提供双向搜索功能。通过以N个数据条目的间隔提供指针集来搜索数据库,以适应指针的二进制搜索,然后线性搜索结果范围以定位感兴趣的项目及其相关字段。

不幸的是,这让我更加困惑,因为我不能围绕非外行人的解释。因此,我向大家求助,希望你能向我解释这个四联画历史到底是什么,因为我知道不知道会不会很快地把我推到墙上。

你知道四链接列表是什么吗?

6 个答案:

答案 0 :(得分:10)

我无法确定,但听起来有点像skip list

即使它不是它,你也可以找到方便的跳过列表。 (据我所知,它们是单向的。)

答案 1 :(得分:9)

我以前没有正式提到过这个术语,但是从专利说明中我可以做出有根据的猜测。

链接列表是指每个节点都有指向下一个节点的链接...

a -->-- b -->-- c -->-- d -->-- null

双向链表意味着每个节点都拥有与其前任链接的链接。

  --<--   --<--   --<--  
|       |       |       |
a -->-- b -->-- c -->-- d -->-- null

我们假设列表已排序。如果我想执行二进制搜索,我通常会在列表的一半找到中间节点,然后进入适当的间隔并重复。但是,链表遍历总是O(n) - 我必须遵循所有链接。从描述中,我认为他们只是从节点添加额外的链接以“跳过”列表中前面的固定数量的节点。有点像...

  --<--   --<--   --<--  
|       |       |       |
a -->-- b -->-- c -->-- d -->-- null
|                       |
|----------->-----------|
 -----------<-----------

现在我可以更快地遍历列表,特别是如果我仔细选择了额外的链接目标(即确保它们总是返回/转发它们在列表长度中指向的项目的偏移量的一半)。然后我用这些链接找到我想要的粗略间隔,并使用普通链接找到该项目。

这是我讨厌软件专利的一个很好的例子。这是非常明显的东西,用华丽的散文包裹着,让人迷惑。

答案 2 :(得分:4)

我不知道这是不是一个“四链表”,但听起来像这样:

struct Person {
    // Normal doubly-linked list.
    Customer *nextCustomer;
    Customer *prevCustomer;

    std::string firstName;

    Customer *nextByFirstName;
    Customer *prevByFirstName;

    std::string lastName;

    Customer *nextByLastName;
    Customer *prevByLastName;
};

即:您通过收藏品保留多个订单。您可以轻松地按firstName顺序或lastName顺序导航。保持链接最新是很昂贵的,但它使导航非常快。

当然,这可能是完全不同的。

答案 3 :(得分:3)

我对它的解读是四链表是可以用两种不同的方式在O(n)中遍历(向后或向前)的列表,即根据FieldX或FieldY排序:

  

(a)产生第一和第二组   链接指针,其中第一个   链接指针集指向   该组的后继元素   记录时的相关记录   针对固定ID订购   字段,以及第二组链接   指针指向前身   相关记录集的元素   订购记录时   关于固定ID字段;

     

(b)产生第三和第四组   链接指针,其中第三个   链接指针集指向   该组的后继元素   记录时的相关记录   对变量进行了排序   ID字段,以及第四组链接   指针指向前身   相关记录集的元素   订购记录时   尊重变量ID字段;

因此,如果您有一个四链接员工列表,您可以按名称对其进行存储并按年龄排序,并在O(n)中进行枚举。

答案 4 :(得分:3)

该专利的一个来源是this。似乎有两个主张,第二个主张更为相关:

  

一种用于组织和搜索一组相关记录的计算机实现的方法,其中每个记录包括:

     

i)固定的ID字段;和

     

ii)变量ID字段;该方法包括以下步骤:

     

(a)生成第一和第二组链接指针,其中当相对于固定ID字段排序记录时,第一组链接指针指向该组相关记录的后继元素,并且第二组链接指针指向第二组链接指针。链接指针指向相对于固定ID字段排序记录时相关记录集的前任元素;

     

(b)生成第三和第四组链接指针,其中当关于变量ID字段排序记录时,第三组链接指针指向该组相关记录的后继元素,并且第四组链接指针链接指针指向相对于变量ID字段排序记录时相关记录集的前趋元素;

     

(c)生成第一和第二组字段指针,其中第一组字段指针包括有序指针集,当关于固定ID字段对记录进行排序时,指针集指向每个第N个固定ID字段,以及第二组指针包括一组有序指针,当记录按变量ID字段排序时,指针指向每个第N个变量ID字段;

     

(d)当通过参考其固定ID字段搜索特定记录时,对第一组字段指针进行二进制搜索以确定初始指针和定义特定记录所在范围的最终指针;

     

(e)通过线性scarch检查在步骤(d)中确定的范围内的固定ID字段,以找到特定记录;

     

(f)当通过参考其变量ID字段搜索特定记录时,对第二组字段指针进行二进制搜索以确定初始指针和定义特定记录所在范围的最终指针;

     

(g)通过线性搜索检查步骤(f)中确定的范围内的变量ID字段,以找到特定记录。

当你通过gobbledegook专利时,我认为这意味着在两个键的每一个上都有两个跳过列表(一个用于前向搜索,一个用于向后搜索)(因此总共有4个列表,名称')四表“)。我不认为这是一个非常好的专利 - 它看起来是一个明显的跳过列表应用到一个数据集,你有两个键可以搜索。

答案 5 :(得分:2)

描述并不是特别好,但我最好收集,听起来效率低skip list