如何用Objective-C构建一个trie数据结构?

Way*_*hop 4 algorithm objective-c data-structures

尽管Objective-C是C的超集,但我希望得到关于如何使用Objective-C创建trie数据结构的反馈.我已经开始编写接口编码,但需要一些帮助来理解如何添加Trie节点(例如集合项)来存储单词.

@interface Trie : NSMutableArray {
   Trie *child;
   BOOL final;
}

@property(nonatomic, retain)Trie *child;
@property(nonatomic, assign)BOOL final;

-(void)addWord:(NSString *)_word;

@end
Run Code Online (Sandbox Code Playgroud)

Dim*_*ima 11

我为你写了一个快速的实现,它应该或多或少地起作用,至少它可以作为一个起点.请注意,我摆脱了数组子类.您通常不希望子类化NSArrays,在这里您可以避免一般的子类化.请参阅继承与组合.

@interface Trie : NSObject

@property (nonatomic, strong) NSMutableArray *children;
@property (nonatomic, strong) NSString *key;
@property (nonatomic, readonly) BOOL isFinal;

- (void) addWord:(NSString *)word;
- (id) initWithKey:(NSString *)key;

@end

@implementation Trie

// designated initializer, initializes our array of children and sets the key
- (id) initWithKey:(NSString *)key
{
    if(self = [super init])
    {
        _key = key;
        _children = [NSMutableArray new];
    }
    return self;
}

- (void) addWord:(NSString *)word
{
    // no more characters left, this is our base case
    if(! word.length)
    {
       return;
    }

    Trie *childToUse;
    NSString *firstCharacter = [word substringToIndex:1];

    // look for an existing node to dive into
    for(Trie *child in _children)
    {
        if([child.key isEqualToString:firstCharacter])
        {
            childToUse = child;
            break;
        }
    }

    // create a new node if there isn't one
    if(! childToUse)
    {
        childToUse = [[Trie alloc] initWithKey:firstCharacter];
        [_children addObject:childToUse];
    }

    // we now have a node, add the rest of the word into our trie recursively
    [childToUse addWord:[word substringFromIndex:1]];
}

// no actual ivar is stored for this property, its value is returned dynamically by looking at the array count, which can change when more elements are added
- (BOOL) isFinal
{
    if(! _children.count)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

只需通过执行类似操作来初始化根节点[[Trie alloc] initWithKey:@""].