V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
wezzard
V2EX  ›  iDev

使用 indirect enum 或者 class 在 Swift 2 构造基本数据结构

  •  
  •   wezzard · 2015-08-24 10:37:01 +08:00 · 1818 次点击
    这是一个创建于 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 实现的链表太多了。
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2439 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:06 · PVG 20:06 · LAX 04:06 · JFK 07:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.