Language agnostic 是否也可以实现具有索引访问的链表?

Language agnostic 是否也可以实现具有索引访问的链表?,language-agnostic,data-structures,indexing,linked-list,Language Agnostic,Data Structures,Indexing,Linked List,我需要一种链表结构,但是如果它也有索引访问,那就太好了 有没有办法做到这一点 编辑:我是用C写的,但它可能适用于任何语言。你可能可以用一棵树来表达你的目标。制作一棵二叉树,该树保持树中每个节点的权重(其中权重等于附加到该节点的节点数,包括节点本身)。如果您有一个可用于树的平衡方案,那么插入仍然是O(logn),因为您只需要将一个添加到祖先节点的权重中。通过索引获取节点是O(log n),因为只需要查看所需节点的祖先和每个祖先的两个孩子的索引。 < P>在C++、java、python等语言中实现

我需要一种链表结构,但是如果它也有索引访问,那就太好了

有没有办法做到这一点


编辑:我是用C写的,但它可能适用于任何语言。

你可能可以用一棵树来表达你的目标。制作一棵二叉树,该树保持树中每个节点的权重(其中权重等于附加到该节点的节点数,包括节点本身)。如果您有一个可用于树的平衡方案,那么插入仍然是O(logn),因为您只需要将一个添加到祖先节点的权重中。通过索引获取节点是O(log n),因为只需要查看所需节点的祖先和每个祖先的两个孩子的索引。

< P>在C++、java、python等语言中实现数组索引,就必须过载数组索引运算符[]。对于实现链表数据结构的类。实现将是O(n)。在C语言中,由于运算符重载是不可能的,因此必须编写一个函数,该函数接受链表数据结构和位置,并返回相应的对象


如果需要更快的订单访问,则必须使用不同的数据结构,如jprete建议的BTree或动态数组(当向其中添加新元素时,该数组会自动增长)。在C++标准库中,一个快速的例子是:代码> STD::向量< /代码>。p> 中的SQL server行项目:

链接列表位于叶子
(*-*-*)
中。链表按顺序排列,可进行快速定向扫描,该树可作为进入链表的“路线图”。因此,您需要为项目创建一个键值对,然后是一个封装树和链表的数据结构

因此,您的数据结构可能如下所示:

struct ll_node
{
     kv_pair current;
     ll_node * next;
};

struct tree_node
{
   value_type value;
   short isLeaf;        

   union
   {
      tree_node * left_child;
      kv_pair * left_leaf;
   }
   union
   {
      tree_node * right_child;
      kv_pair * right_leaf
   }
};

struct indexed_ll
{
    tree_node * tree_root;
    ll_node * linked_list_tail;
};

实现目标的一种方法是实现一个随机的或确定性的方法。在最底层-你有你的项目链接列表

为了使用索引访问元素,您需要向内部节点添加信息——从这个节点到这个级别上的下一个节点,有多少节点处于最低级。可以在O(logn)中添加和维护此信息

此解决方案的复杂性是: 添加、删除、转到索引,所有工作都在O(logn)中


这种解决方案的缺点是,它比常规链表更难实现。因此,使用常规的链表,您可以在O(1)中获得Add、Remove,并在O(n)中获得index。

各种平台都有这样的功能,例如java的
java.util.Linkedlist
。去查一下,我猜他的意思是索引需要相当快
java.util.LinkedList
有O(n)个索引。你的意思是索引会随着每次添加/删除而改变,对吗?很多人都为这个家伙发帖,他没有礼貌地接受答案。实现起来比普通的链接列表更难,但比平衡的链接节点树更容易。得到我的选票。我不知道如何让SkipList正确索引。但是现在我想到SkipList只是自动平衡树的一种形式,所以可以使用相同的基本节点计数结构。+1这是一个很好的答案。我看到的一个问题是,数据结构是根据不清楚的内容排序的(也称为“在此节点后插入”)。如何平衡一棵树,使此属性保持不变,还有待解决。它应该不会太难(例如2-3棵树),但它与常规的平衡树不同,在平衡树中,键决定了什么位于何处。是的,这肯定是一个问题。我可以想象,您将实际数据保存在它们自己的链表的底部,而树的所有内部节点将只包含权重。我在研究生院学到的一种算法就是让树(和任何子树)保持独立,直到一边的重量是另一边的N倍。如果此属性在插入或删除后对任何子树都适用,请为最高的子树重建树。这将平均维持O(对数n)时间。
struct ll_node
{
     kv_pair current;
     ll_node * next;
};

struct tree_node
{
   value_type value;
   short isLeaf;        

   union
   {
      tree_node * left_child;
      kv_pair * left_leaf;
   }
   union
   {
      tree_node * right_child;
      kv_pair * right_leaf
   }
};

struct indexed_ll
{
    tree_node * tree_root;
    ll_node * linked_list_tail;
};