项堆

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

ざい计算つくえ科学かがくなか项堆英語えいごBinomial heap一种类似于またうずたかてきうずたか结构あずかまたうずたかしょう,其优势是以快そくごう并两个堆,いん此它ぞく于可あい并堆(mergeable heap抽象ちゅうしょうすうすえ类型てきいち种。

项树[编辑]

二项树递归定义如下:

  • 度数どすう为0てき二项树只包含一个節点
  • 度数どすう为kてき二项树有一个根節点,節点せってんゆう个子おんなまい个子おんなぶん别是度数どすうぶん别为てき项树てき
项树(从左いたりみぎ度数どすうぶん别为0いたり3

度数どすう为kてき项树共有きょうゆう个節てん高度こうどざい深度しんどd处有项式けいすう)个節てん

度数どすう为kてき二项树可以很容易从两颗度数为k-1てき二项树合并得到:いち颗度すう为k-1てき二项树作为另一颗原度数为k-1てき二项树的最左子树。这一性质是二项堆用于堆合并的基础。

项堆[编辑]

二项堆是指满足以下性质的二项树的集合:

  • まい棵二项树都满足最小さいしょううずたかせいそく節点せってん关键だい于等于其ちち節点せってんてき
  • 不能ふのうゆう两棵ある以上いじょうてき二项树有相同度数(包括ほうかつ度数どすう为0)。换句话说,具有ぐゆう度数どすうkてき项树ゆう0个或1个。

以上いじょうだい一个性质保证了二项树的根節点包含了最小的关键字。だい二个性质则说明節点数为てき二项堆最多只有 项树。实际じょう包含ほうがんn个节てんてき二项堆的构成情况,よしnてき二进制表示唯一确定,其中ごと一位对应于一颗二项树。れい如,13てき二进制表示为1101, , いん具有ぐゆう13个节てんてき二项堆由度数为3, 2, 0てき三棵二项树组成:

Example of a binomial heap
しめせれいいち个含13个節てんてき项堆

项堆てき操作そうさ[编辑]

よし于并需要じゅよう对二项树的根節点进行ずいつくえそんいん而这些節てん以存なり链表结构。

ごう[编辑]

ごう并分支度したくしょうどうてき项树
ごう并两个项堆しめせれい,实际じょう两棵ぶん支度じたく为1てき二项树合并为一棵分支度为2てき项树。

さい基本きほんてき为二个分支度相同的二项树的合并。よし于二项树根節點包含最小的关键字,いん此在二棵树合并时,ただ需比较二个根節點关键字的大小,其中含小关键てき節點せってんなり为结はて树的節點せってん,另一棵树则变成结果树的子树。

function mergeTree(p, q)
    if p.root <= q.root
        return p.addSubTree(q)
    else
        return q.addSubTree(p)


两个二项堆的合并则可按如下步骤进行:ぶん支度したく从小いただいざい两个二项堆中如果其中只有一棵树的分支度为そくはた此树うつり动到结果うずたか,而如はてただ两棵树的ぶん支度したく,则根すえ以上いじょう方法ほうほうあい并为いち个分支度じたくてき项树。此后这个ぶん支度じたくてき树将可能かのうかい其他ぶん支度じたくてき二项树进行合并。よし此,对于にんなんふん支度じたくj,可能かのう最多さいた需要じゅようあい并3棵项树。

操作そうさてき时间复杂

function merge(p, q)
    while not (p.end() and q.end())
        tree = mergeTree(p.currentTree(), q.currentTree())
        
        if not heap.currentTree().empty()
            tree = mergeTree(tree, heap.currentTree())
        
        heap.addTree(tree)
        heap.next(); p.next(); q.next()

插入そうにゅう[编辑]

创建一个只包含要插入元素的二项堆,さいしょう此堆与原よはらさきてき二项堆进行合并,そくいた插入そうにゅうきさきてきうずたかよし于需ようごう并,插入そうにゅう操作そうさ需要じゅようてき时间。ひら分析ぶんせきてき时间复杂

查找最小さいしょう关键所在しょざい節点せってん[编辑]

よし于满あし最小さいしょううずたかせい质,ただ需查找二项树的的根節点即可,いん为一共有きょうゆう棵子树,所以ゆえんようしょ时间为

保存ほぞん一个指向最小元素的指针,使つかいとく查找最小さいしょう关键所在しょざい節点せってん需要じゅようてき时间。ざい执行其他操作そうさ时,需要じゅようおさむあらため该指针。

删除最小さいしょう关键所在しょざい節点せってん[编辑]

さき找到最小さいしょう关键所在しょざい節点せってんしかきさきはた它从其所在しょざいてき项树ちゅう删除,并获とく其子树。はた这些树看さくごう并为)いち独立どくりつてき项堆,さいしょう此堆あい并到ばらさきてきうずたかなかそくよし于每棵树最多さいたゆう棵子树,创建しんうずたかてき时间为どう时合并堆てき时间也为せい操作そうさしょ需时间为

function deleteMin(heap)
    min = heap.trees().first()
    for each current in heap.trees()
        if current.root < min then min = current
    for each tree in min.subTrees()
        tmp.addTree(tree)
    heap.removeTree(min)
    merge(heap, tmp)

减小特定とくてい節點せってん(せきかぎ)てき值(Decreasing a key)[编辑]

ざい减小特定とくてい節點せってんせきかぎてき值后,可能かのうかい满足最小さいしょう堆積たいせきせい质。此时,はた其所ざい節点せってんあずかちち節点せってん交换,如还满足最小さいしょううずたかせい质则さいあずか祖父そふ節点せってん交换……ちょくいた最小さいしょううずたかせい质得いた满足。操作そうさしょ需时间为

删除[编辑]

はた需要じゅよう删除てき節点せってんてき关键てき值减しょういた负无穷大(二项堆中的其他所有关键字的值都小即可),执行“减小关键てき值”算法さんぽう使つかい其调せいいたとうまえ二项树的根节点位置,さい删除最小さいしょう关键てき節点せってんそく

运行时间[编辑]

以下いか对于二项堆操作的运行时间都为節點せってんすう):

  • ざい二项堆中插入新節点
  • 查找最小さいしょう关键所在しょざい節点せってん
  • 从二项堆中删除最小关键字所在節点
  • 减小给定節点せってん关键てき
  • 删除给定節点せってん
  • ごう并两个项堆

まいり[编辑]

参考さんこう资料[编辑]

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein(はんきん贵等译). 《算法さんぽう导论》. つくえ械工业出版しゅっぱんしゃ. 
  • Vuillemin, J. (1978). A data structure for manipulating priority queues. Communications of the ACM 21, 309–314.

外部がいぶ链接[编辑]