Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似STL的Java红黑树/树集/映射和带有非故障快速/安全迭代器的链表_Java_Iterator_Linked List_Red Black Tree - Fatal编程技术网

类似STL的Java红黑树/树集/映射和带有非故障快速/安全迭代器的链表

类似STL的Java红黑树/树集/映射和带有非故障快速/安全迭代器的链表,java,iterator,linked-list,red-black-tree,Java,Iterator,Linked List,Red Black Tree,我正在寻找一个具有红黑树和链表实现的库,它提供不会快速失败的迭代器。我想拥有和STL一样的C++功能,也就是: 在树/列表中插入不会使任何迭代器无效 移除仅使指向被移除元素的迭代器无效 可以以某种方式存储迭代器的“位置”,并引用它所指向的值 这个实现会很好,因为它提供了在使用列表/树的一部分时修改列表/树的能力。以下是一些例子: 获取链表/红黑树中与O(1)中某个存储值相邻的元素 批量插入/移除(无约束,例如每个位置增量移除一次) 通过迭代器的位置拆分O(1)中的链表 当存储了迭代器的位置

我正在寻找一个具有红黑树和链表实现的库,它提供不会快速失败的迭代器。我想拥有和STL一样的C++功能,也就是:

  • 在树/列表中插入不会使任何迭代器无效
  • 移除仅使指向被移除元素的迭代器无效
  • 可以以某种方式存储迭代器的“位置”,并引用它所指向的值
这个实现会很好,因为它提供了在使用列表/树的一部分时修改列表/树的能力。以下是一些例子:

  • 获取链表/红黑树中与O(1)中某个存储值相邻的元素
  • 批量插入/移除(无约束,例如每个位置增量移除一次)
  • 通过迭代器的位置拆分O(1)中的链表
  • 当存储了迭代器的位置时,更有效的删除(例如,通过将迭代器保持在链表中的某个位置,删除是O(1),而不是O(N))
我还希望该库/源代码/实现具有一些Apache/GPL友好的许可证,并且具有相当的可扩展性(因此我可以进行自己的修改,以实现一些操作,例如上面示例中的操作)


如果没有这样的库,是否有其他库可以帮助我自己实现这两个数据结构?

这两个库都很容易实现。迭代器必须做三件事:

  • 只存储两个引用,一个指向“current”元素,另一个指向外部容器对象(存储根引用(树)或头/尾引用(列表)的blob)

  • 能够确定引用的元素是否有效(很简单,如果父指针为null(tree)或prev/next指针为null(list),那么最好是树根或列表的头/尾)。当在无效迭代器上尝试任何操作时抛出某些内容

  • 能够找到上一个/下一个元素

  • 这里有两个问题:对于列表,高效地支持java.util.ListIterator的nextIndex()和prevIndex()将是一件痛苦的事情,当然,现在您遇到了处理并发修改的问题!下面是一个关于事情如何变坏的例子:

    while (it.hasNext()) {
        potentially_delete_the_last_element()
        it.next() // oops, may throw NoSuchElementException.
    }
    

    避免这种情况的方法是永远不要在检查是否有next/prev和实际检索next/prev之间修改列表。

    这两种方法都很容易自己实现。迭代器必须做三件事:

  • 只存储两个引用,一个指向“current”元素,另一个指向外部容器对象(存储根引用(树)或头/尾引用(列表)的blob)

  • 能够确定引用的元素是否有效(很简单,如果父指针为null(tree)或prev/next指针为null(list),那么最好是树根或列表的头/尾)。当在无效迭代器上尝试任何操作时抛出某些内容

  • 能够找到上一个/下一个元素

  • 这里有两个问题:对于列表,高效地支持java.util.ListIterator的nextIndex()和prevIndex()将是一件痛苦的事情,当然,现在您遇到了处理并发修改的问题!下面是一个关于事情如何变坏的例子:

    while (it.hasNext()) {
        potentially_delete_the_last_element()
        it.next() // oops, may throw NoSuchElementException.
    }
    

    避免这种情况的方法是永远不要在检查是否有next/prev和实际检索next/prev之间修改列表。

    听起来像是一个不可变的树,而链表将完美地满足您的需要(这里是一个AVL树)。您能够为您的项目使用不可变的数据结构吗?如果是这样,您可能可以使用一个不可变的排序集(googleit,很多Java实现),或者我可以为您将一个好的ML实现改编成Java。我认为这样的树是不可变的,以防止对键的修改导致树的重新平衡,但另一方面,链表不必是不可变的,对吗?听起来像是不可变的树和链表可以完美地满足您的需要(这里是一个AVL树)。您能够为您的项目使用不可变的数据结构吗?如果是这样,您可能可以使用一个不可变的排序集(googleit,很多Java实现),或者我可以为您将一个好的ML实现改编成Java。我认为这样的树是不可变的,以防止对键的修改导致树的重新平衡,但另一方面,链表不必是不可变的,对吗?