使用Swift在iOS中保持27000个节点的trie数据树的方法是什么?
我正在构建一个Trie树,它将具有大约27000个节点。我不想每次在应用程序启动时重新创建它,我都想坚持下去。由于子属性是另一个节点的字典,因此我无法使用NSCoding
将其归档并存储在核心数据实体中。有没有办法将这个节点存储在Core Data中?或者我应该使用不同类型的持久性?使用Swift在iOS中保持27000个节点的trie数据树的方法是什么?
class TrieNode {
var letter:Character
var fullWord:Bool
var leadingLetters:String
var child = [Character:TrieNode]()
init (letter:Character, leadingLetters:String, fullWord:Bool) {
self.letter = letter
self.fullWord = fullWord
self.leadingLetters = leadingLetters
}
}
主要的问题我在尝试使用核心数据是如何var child = [Character:TrieNode]()
转换为NSData的或CD可以在实体存储其他可用的类型。如何做到这一点的例子,将不胜感激。
核心数据有点尴尬。我想我会做的是:
- 创建一个名为类似于
TrieNodeLink
的新实体。它有一个属性,一个名为childString
的字符串和一个关系,名称为node
,类型为TrieNode
。此实体的每个实例都表示一个trie节点的单个子节点。 - 从您现有的
TrieNode
到新的TrieNodeLink
实体添加新的一对多关系。 - 保留您现有的
child
字典。在方便的时候,通过扫描步骤2中的新一对多关系来初始化该字典。方便的时间可能在awakeFromFetch
,否则您可以使其成为Swiftlazy
属性。或者,如果您想以更高的内存使用为代价来预加载数据以获得更快的性能,那么您可能会编写一些代码,以便在需要之前递归地将子节点加载几个级别。
这样做的效果是,您可以在需要时按需加载部分特里结构。一旦加载,您就可以使用child
字典快速查找子节点。
谢谢汤姆。我的主要问题是试图将儿童字典变成核心数据喜欢的东西 - 你有什么建议如何做到这一点? – Edan
我想我只是描述了一种方法。你不能保存字典,所以你需要转换为/可以保存在核心数据中的东西。这是一个计划;有可能是其他人。 –
你不想将它存储为'NSData'。只需为'TrieNode'创建数据模型并为其创建一个'NSManagedObject'。 –
然后我如何存储儿童财产?它不会让我编译'[Character:TrieNode]()'作为'NSManagedObject'。 – Edan
请仅查看Core Data。如果你自己付出一些努力,我们会很感激。本网站不是为了教育您使用它,而是为了帮助您解决特定问题。 –