Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios Swift 3和自定义链接列表集合类型的索引_Ios_Swift - Fatal编程技术网

Ios Swift 3和自定义链接列表集合类型的索引

Ios Swift 3和自定义链接列表集合类型的索引,ios,swift,Ios,Swift,在Swift 3集合中索引必须符合可比,而不是相等 完整的故事可以在这里阅读 以下是相关的引文: 通常一个索引可以用一个或两个整数表示 有效地编码从数据根到元素的路径 结构。因为一个人可以自由选择“路径”的编码,所以我们 我认为有可能选择这样一种方式,即指数 便宜可比。所有指数都是如此 需要实现标准库,还有一些我们需要的 在研究这一变化时进行了调查 在自定义链表集合的实现中,节点(指向后续节点)是不透明索引类型。然而,考虑到两种情况,如果不冒穿越链条重要部分的风险,就不可能判断一个在另一个之前

在Swift 3
集合中
索引必须符合
可比
,而不是
相等

完整的故事可以在这里阅读

以下是相关的引文:

通常一个索引可以用一个或两个整数表示 有效地编码从数据根到元素的路径 结构。因为一个人可以自由选择“路径”的编码,所以我们 我认为有可能选择这样一种方式,即指数 便宜可比。所有指数都是如此 需要实现标准库,还有一些我们需要的 在研究这一变化时进行了调查

在自定义链表集合的实现中,节点(指向后续节点)是不透明索引类型。然而,考虑到两种情况,如果不冒穿越链条重要部分的风险,就不可能判断一个在另一个之前

我很好奇,对于复杂度为O(1)的链表索引,您将如何实现
compariable

我目前唯一的想法是在推进索引时以某种方式计算步骤,将其作为属性存储在索引类型中,然后比较这些值

此解决方案的严重缺点是,在对集合进行变异时,索引必须无效。虽然这对于数组来说似乎是合理的,我不想破坏链表的巨大优势——它们不会使未更改节点的索引无效。

编辑: 假设单个链表实现了前插入、前移除和后追加,则可以使用两个额外的整数作为集合属性来完成此操作。任何在中间的干预都会打破O(1)复杂性要求。

< P>这是我的理解。

a) 我在自定义的
索引
类型中引入了一个私有整数类型属性:
深度

b) 我在集合中引入了两个私有整数类型属性:
startDepth
endDepth
,对于空列表,这两个属性都默认为零

  • 每个前插接件都会减少
    起始深度
  • 每次前拆卸都会增加
    开始深度
  • 每次向后追加都会增加
    endDepth

  • 因此,所有索引
    startIndex..I可能有另一种解决方案。如果使用浮点而不是整数,则如果将插入节点的
    sortIndex
    设置为前置节点和后续节点的
    sortIndex
    之间的值,则可以在中间性能中获得某种O(1)插入。这需要在您的节点上存储(并更新)前置的
    sortIndex
    (我想这应该不会太难,因为它只在插入或删除时更改,并且总是可以“向上”传播)

    索引(after:)
    方法中,您需要查询后续节点,但由于您将节点用作索引,这很简单

    需要注意的一点是浮点的有限精度,因此,如果插入时两个排序索引之间的距离很小,则至少需要重新索引列表的一部分。既然你说你只期望小规模,我就通过孔列表,利用这个位置


    这种方法有你自己所有的好处,在中间插入有很好的性能。

    这是一个有趣的问题(我在这一点上没有答案)。请注意:有两个相关的协议:Collection和RandomAccessCollection。后者要求所有下标和索引操作的复杂性为O(1),但前者不要求-在代码审阅时,出现了一些相关内容:。链接到完整的源不再工作,但如果我记得正确,提姆确实做了你在你的附录中描述的。这个解决方案绝对适用于插入(后:)类型的插入在中间,因为在单链表中插入(at:)不能确定O(1)中的前驱节点。有限精度应该是可以接受的,容器类型上有一个免责声明,即由于触发列表的重新索引,对项目进行大量重新排序可能会产生成本。