Objective-c优先级队列

Lun*_*ues 6 collections objective-c priority-queue

我已经开始使用Objective-c进行iOS编程.我从Java切换,我想知道是否有任何现有的库,如Obj-c的Java Collections Framework,更具体地说是优先级队列实现.我做了一些搜索,但一直无法想出任何东西.

更新:我发现了这个,但不知道如何自己使用它:http://www.ohloh.net/p/pqlib

Lun*_*ues 2

我无法找到优先级队列的实现,所以我继续制作自己的。我不确定它有多强大,但我希望它能为其他人指明正确的方向。

优先队列.h

//
//  PriorityQueue.h
//

#import <Foundation/Foundation.h>
#import "comparable.h"

//Implements a priority queue. All objects in queue must implement the comparable protocol and must be all of the same type. The queue can be explicity typed at initialization, otherwise the type of the first object entered will be the type of the queue
@interface PriorityQueue : NSObject{
    NSMutableArray *queue;
    Class type;
}

- (id)init;
- (id)initWithObjects:(NSSet *)objects;
- (id)initWithCapacity:(int)capacity;
- (id)initWithCapacity:(int)capacity andType:(Class)oType; //Queue will reject objects not of that type

#pragma mark - Useful information
- (BOOL)isEmpty;
- (BOOL)contains:(id<comparable, NSObject>)object;
- (Class)typeOfAllowedObjects; //Returns the type of objects allowed to be stored in the queue
- (int) size;

#pragma mark - Mutation
- (void)clear;
- (BOOL)add:(id<comparable, NSObject>)object;
- (void)remove:(id<comparable, NSObject>)object;

#pragma mark - Getting things out
- (id)peek;
- (id)poll;
- (id)objectMatchingObject:(id<comparable, NSObject>)object;
- (NSArray *)toArray;

#pragma mark -
- (void)print;

@end
Run Code Online (Sandbox Code Playgroud)

优先队列.m

//
//  PriorityQueue.m
//

#import "PriorityQueue.h"

#define INITIAL_CAPACITY 50
@implementation PriorityQueue

#pragma mark - Initialization
- (id)init{
    return [self initWithCapacity:INITIAL_CAPACITY andType:nil];
}

- (id)initWithObjects:(NSSet *)objects{
    self = [self initWithCapacity:INITIAL_CAPACITY andType:nil];
    for (id<comparable, NSObject>object in objects){
        [self add:object];
    }
    return self;
}

- (id)initWithCapacity:(int)capacity{
    return [self initWithCapacity:capacity andType:nil];
}

- (id)initWithCapacity:(int)capacity andType:(Class)oType{
    self = [super init];
    if(self){
        queue = [[NSMutableArray alloc] init];
        type = oType;
    }
    return self;
}

#pragma mark - Useful information
- (BOOL)isEmpty{
    if(queue.count == 0){
        return YES;
    }
    else{ return NO;}
}

- (BOOL)contains:(id<comparable, NSObject>)object{
    //Search the array to see if the object is already there
    for(id<comparable> o in queue){
        if([o isEqual:object]){
            return YES;
        }
    }
    return NO;
}

- (Class)typeOfAllowedObjects{
    NSLog(@"Allowed Types: %@", type);
    return type;
}

- (int) size{
    return [queue count];
}

#pragma mark - Mutation
//Mutation
- (void)clear{
    [queue removeAllObjects];
}

//A "greater" object (compareTo returns 1) is at the end of the queue.
- (BOOL)add:(id<comparable, NSObject>)object{
    //Make sure the object's type is the same as the type of the queue
    if(type == nil){
//        NSLog(@"Type is nil");
        type = [object class];
    }
    if([object class] != type){
        NSLog(@"ERROR: Trying to add incorrect object");
        return NO;
    }

    if([queue count] == 0){
        [queue addObject:object];
        return YES;
    }
    for(int i = 0; i < [queue count]; i++){
        if([object compareTo:queue[i]] < 0){
            [queue insertObject:object atIndex:i];
            return YES;
        }
    }
    [queue addObject:object];
    return YES;
}

- (void)remove:(id<comparable, NSObject>)object{
    [queue removeObject:object];
}

#pragma mark - Getting things out
- (id)peek{
    return queue[0];
}

- (id)poll{
    //Get the object at the front
    id head = queue[0];

    //Remove and return that object
    [queue removeObject:head];
    return head;
}

- (id)objectMatchingObject:(id<comparable, NSObject>)object{
    //Search the array to see if the object is already there
    for(id<comparable> o in queue){
        if([o isEqual:object]){
            return o;
        }
    }
    return nil;
}

- (NSArray *)toArray{
    return [[NSArray alloc] initWithArray:queue];
}

#pragma mark -
- (NSString *)description{
    return [NSString stringWithFormat:@"PriorityQueue: %@ allows objects of type %@", queue, type];
}

- (void)print{
    NSLog(@"%@", [self description]);
}

@end
Run Code Online (Sandbox Code Playgroud)

比较.h

//
//  comparable.h
//

#import <Foundation/Foundation.h>


//NOTE: Class must check to make sure it is the same class as whatever is passed in
@protocol comparable

- (int)compareTo:(id<comparable, NSObject>)object;
- (BOOL)isEqual:(id<comparable, NSObject>)object;

@end
Run Code Online (Sandbox Code Playgroud)

  • 这实现了优先级队列的接口,但是典型的优先级队列将具有 O(log N) 插入和删除操作,而不是像这样的 O(N) 。这对于大小合适的 N 来说可以产生很大的影响。 (10认同)