这是一个创建于 3399 天前的主题,其中的信息可能已经有所发展或是发生改变。
想在 Swift 2 中自己练习写一下基本的数据结构,诸如单向/双向/循环/双向循环链表、 AVL 树、红黑树、 Treap 、 B 树之类的。
本来想利用 Swift 2 的 indirect enum 这个新特性,但是发现由于 enum 都是 value type ,「链表中插入一个元素后返回被插入节点以加速下次插入」的这个 convenience 在非循环链表中变得没有一点卵用了(因为返回的是 value type ,并不是指向被插入节点的 reference ,除非袮返回被插入节点的前一个节点,但是这对于第一个节点而言会返回空值,会引入 optional value handling,而且也不符合直觉)。
而在 self-balancing binary search tree 的几种主流实现中,由于插入和删除后都会自动平衡整个树,所以本身返回被插入节点其实也没甚么卵用;但是也因为 enum 的 associative value 的实质是一个 tuple ,而 tuple 的实质是内存上一段连续储存的数据,与 struct 的本质相同,却又没有 struct 的 per property accessor ,所以每当进行插入、删除操作时,由于改写节点 balance factor ( AVL 树)和涂黑涂红节点(红黑树)会写入整个 tuple ,势必会造成性能下降。
我很怀疑 Apple 引入这个新特性的原因,并且认为这个新特性肯定不是针对用来构造对性能很敏感的基本数据结构的。
第 1 条附言 · 2015-08-24 11:23:31 +08:00
第 2 条附言 · 2015-08-24 13:50:58 +08:00
自己写了一个性能测试,发现果然和我想象的一样, class 实现的链表快 indirect enum 实现的链表太多了。