Ios Swift 3和自定义链接列表集合类型的索引
在Swift 3Ios Swift 3和自定义链接列表集合类型的索引,ios,swift,Ios,Swift,在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)中的前驱节点。有限精度应该是可以接受的,容器类型上有一个免责声明,即由于触发列表的重新索引,对项目进行大量重新排序可能会产生成本。