JHHK

欢迎来到我的个人网站
行者常至 为者常成

【基础】17、优先级队列

目录

优先级队列

优先级队列也是个队列,因此也是提供以下接口

@interface LCPriorityQueue : NSObject


/// 创建一个优先级队列
+(instancetype)priorityQueue;


/// 创建一个优先级队列
/// @param comparator 自定义比较器
+(instancetype)priorityQueueWithComparator:(nullable LCCompareBlock)comparator;

/// 元素的数量
-(int)size;

/// 是否为空
-(BOOL)isEmpty;

/// 入队
-(void)enQueue:(nonnull id)element;

/// 出队
-(id)deQueue;

/// 获取队列的头元素
-(id)front;

/// 清空
-(void)clear;

@end

img

普通的队列是 FIFO 原则,也就是先进先出
优先级队列则是按照优先级高低进行出队,比如将优先级最高的元素作为队头优先出队
队尾(rear) 44 33 22 11 队头(front)

优先级队列场景举例

医院的夜间门诊
队列元素是病人
优先级是病情的严重情况、挂号时间

操作系统的多任务调度
队列元素是任务
优先级是任务类型

优先队列的底层实现

根据优先队列的特点,很容易想到:可以直接利用二叉堆作为优先队列的底层实现
可以通过 Comparator 或 Comparable 去自定义优先级高低

@interface LCPriorityQueue()
@property(nonatomic,strong)LCBinaryHeap * heap;
@property(nonatomic,copy)LCCompareBlock comparator;
@end

@implementation LCPriorityQueue

/// 创建一个优先级队列
+(instancetype)priorityQueue{
    return [self priorityQueueWithComparator:nil];
}


/// 创建一个优先级队列
/// @param comparator 自定义比较器
+(instancetype)priorityQueueWithComparator:(nullable LCCompareBlock)comparator{
    LCPriorityQueue * pQueue = [[LCPriorityQueue alloc] init];
    pQueue.comparator = comparator;
    return pQueue;
}


-(LCBinaryHeap *)heap{
    if(_heap == nil){
        _heap = [LCBinaryHeap binaryHeapWithComparator:self.comparator];
    }
    return _heap;
}


/// 元素的数量
-(int)size{
    return self.heap.size;
}

/// 是否为空
-(BOOL)isEmpty{
    return self.heap.isEmpty;
}

/// 入队
-(void)enQueue:(nonnull id)element{
    [self.heap add:element];
}

/// 出队
-(id)deQueue{
    return [self.heap remove];
}

/// 获取队列的头元素
-(id)front{
    return self.heap.get;
}

/// 清空
-(void)clear{
    [self.heap clear];
}


#pragma mark - 内部方法

/// 获取两个元素的比较结果
/// @param element1 元素1
/// @param element2 元素2
-(LCCompareType)_compareElement1:(nonnull id)element1 element2:(nonnull id)element2{
    assert(element1);
    assert(element2);
    return self.comparator?self.comparator(element1,element2):(LCCompareType)([element1 compare:element2]);
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.