liyanbo的个人博客分享 http://blog.sciencenet.cn/u/liyanbo

博文

算法课总结 binary heaps to binomial heaps to fibonacci heap1

已有 2427 次阅读 2014-11-20 16:14 |个人分类:C++|系统分类:生活其它

binary heaps:
小根堆:父节点比儿子节点的值小

(1)小根堆的创建:
   1.复制堆数组
   2.找到最初的调整位置,即最后一个分支结点
   3.从该分支节点处自上向下逐步调整形成堆
   4.不断向前找一个分支结点,执行操作3
   时间复杂度:O(n)

(2)小根堆找最小:
  直接就是根节点

  时间复杂度:O(1)


 (3)小根堆的插入:
  1. 将待插入元素插入已建成堆的最后面
  2. 沿着插入位置所在的分支逐步向上调整
  时间复杂度:O(logn)

 (4)小根堆最小元素的删除:
   1. 将顶元素删除
   2. 将数组中最后一个元素放到堆顶
   3. 自顶向下调整
   时间复杂度:O(logn)


(5)修改已知下标的小根堆中的元素

直接改

时间复杂度:O(1)

代码实现:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <iomanip>

using namespace std;

struct heap_node{
   int var;
   int pos;  
};

int swap(heap_node & a,heap_node & b);
int shifit(vector<heap_node> & a, int i, int n);

class binary_heap{
   public:
       int num;
       vector<heap_node> element;
       binary_heap(int n)
       {
           num = n;
           element.resize(n);
       }

       binary_heap(vector<int> a)
       {
           num = a.size();
           element.resize(a.size());
           for(int i=0;i<element.size();i++)
           {
               element[i].var = a[i];
               element[i].pos = i;
           }    

       }  

       ~binary_heap()
       {
           element.clear();
       }
       int create()//将一个乱序的一维数值改为>小根堆
       {
           for(int i=(num-1)/2;i>=0;i--)
           {
               shifit(element,i,num);
           }
           return 0;
       }

       int print_heap()
       {
                        for(int i=0;i<num;i++)
                       {
                               cout<<setw(5)<<element[i].pos<<" ";
                       }
                       cout<<endl;
           for(int i=0;i<num;i++)
           {
               cout<<setw(5)<<element[i].var<<" ";
           }
           cout<<endl;
       }
       int print_min()
       {
           cout<<"the min element in heap "<<element[0].var<<" "<<element[0].pos<<endl;
           return 0;
       }
       int delete_min()
       {
           swap(element[0],element[num-1]);
           num --;
           shifit(element,0,num);
           return 0;    
       }          

       int insert_element(int a)
       {
           if(element.size()>num)
           {
               element[num].var = a;
               element[num].pos = num;
           }
           else
           {
               heap_node temp;
               temp.var = a;
               temp.pos = num;
               element.push_back(temp);
           }
           num++;
           int chi = num-1;
           int par;
           while((par = chi/2)>=0)
           {
               if(element[chi].var<element[par].var)
               {
                   swap(element[chi],element[par]);
                   chi = par;      
               }
               else
                   break;
           }

           return 0;  
       }
           int change_element(int index, int var)
           {
                             element[index].var = var;
                           
                           return 0;
           }  

};

int swap(heap_node & a,heap_node & b)
{
   heap_node temp;
   temp.var = a.var;
   temp.pos = a.pos;
   a.var = b.var;
   a.pos = b.pos;  
   b.var = temp.var;
   b.pos = temp.pos;
   return 0;
}
int shifit(vector<heap_node> & a, int i, int n)
{
   int j;
   while((j=2*i+1)<n)
   {
       if(j<n-1 && a[j+1].var<a[j].var)
           j++;
       if(a[i].var>a[j].var)
       {
           swap(a[i],a[j]);
       }    
       i=j;  
   }
   return 0;
}






https://blog.sciencenet.cn/blog-1515646-844911.html

上一篇:C++文件的读入读出与重定向
下一篇:举例说明单纯形的二阶段法
收藏 IP: 124.16.102.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-18 01:40

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部