请问优先队列使用什么结构来实现的?

TooSchoolForCool 2015-05-06 12:23:10
请问各位前辈们,优先队列用什么数据结构来实现比较好?

是离散链表形式的二叉树?
还是用数组来实现?

我有一个想法,按理说可以用数组来实现一棵完全二叉树,进而实现堆结构,从而可以实现优先队列。
但我现在不这么做,我就用数组直接顺序排放,然后每次有元素入队后就对队列重新进行排序,这样是不是也算是实现了优先队列?

希望各位前辈高手们能够指点一下,非常感谢!
Thanks for your time and any info.

...全文
475 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jensenjiang 2015-05-12
  • 打赏
  • 举报
回复
可以直接用数组写一个大根/小根堆。
你说的插入一个元素排一次序的方法效率太低了,是搜索插入位置和移动元素的时间为O(n)的,而堆插入元素的效率应该是O(logN)的。
TooSchoolForCool 2015-05-08
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
可以参考一下STL中的priority_queue,它就是用堆实现的,插入或删除不需要排序,只是一个调整堆的过程
我就是这么想的,每次push或者pop后,对堆经行一个调整,确保是个最大堆或者是最小堆 另外一个想法就是,每次push或者pop后数组进行一个排序,排序后的数组仍然是个堆。
dooX8086 2015-05-08
  • 打赏
  • 举报
回复
如果优先级别比较有限,可以用 数组 + 链表 来实现 如我以前因业务需求实现一个 task_queue 要求有优先级,高底水位控制等.

// 大概结构也就这样

#define PRI_NUM 3

// 优先级
#define PRI_LOW 0
#define PRI_NORMAL 1
#define PRI_HIGH 2


struct task_queue {
	int cur_max_pri;                       // 当前队列中存在的最大优先 (其实是为了让整个 push 与 pop 过程尽量达到 O1)
       int count;                                    // 队中的task 数量, (只要应用于实现水位控制)
	task_list_t *tls[PRI_NUM];    // 链表数组
       // ...
      // ...
} task_queue_t;

// ...
// task_queue * task_queue_create();
// void task_queue_release(task_queue_t *tq);

// @pri    优先权,即 PRI_LOW, PRI_NORMAL, PRI_HIGH
void task_queue_push(task_queue_t *tq, task_t *t, int pri)
{
   // 维护 cur_max_pri;
   if (pri > tq->cur_max_pri) tq->int cur_max_pri = pri;

    task_list_push_tail(tq->tsl[pri], t);
   // ...
}

task_t * task_queue_pop(task_queue_t *tq)
{
  // 获取当前优先级最大的 list 
  // 从list 中 pop 一个 task 
  task_list_t * tl = tq->tls[tq->cur_max_pri];
  // ...
  task_t *res = task_list_pop(tl);

  // 维护 cur_max_pri;
  // 如果  tq->tls[tq->cur_max_pri] == NULL, 则降级.
  //    while (tq->cur_max_pri == NULL && 0 < tq->cur_max_pri)  --tq->cur_max_pri;
  // ..
    return res;
}

总体就是 用优先级来做数组的下标
li4c 2015-05-08
  • 打赏
  • 举报
回复
是不是用堆呢
mxway 2015-05-06
  • 打赏
  • 举报
回复
c++ stl的优先队列使用vector作为支撑,再用pop_heap及push_heap两个全局算法对vector的元素“顺序”进行管理。
fly_dragon_fly 2015-05-06
  • 打赏
  • 举报
回复
可以参考一下STL中的priority_queue,它就是用堆实现的,插入或删除不需要排序,只是一个调整堆的过程
e3internet 2015-05-06
  • 打赏
  • 举报
回复
用数组只是每次插入不是重新排序而是仿照链表形式给数组每个节点添加前后驱

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧