java 索引优先队列_索引优先队列

#include

#include

#include

#include

#include "Common.hpp"

#include

using namespace std;

/**

* 索引最小优先队列

**/

template

class IndexMinPQ {

public:

IndexMinPQ(int max);

void show() const;

int size() const {return N;}

int capacity() const {return _capacity;}

void insert(int k, T item);

void change(int k, T item);

bool contain(int k) const {return qp[k] != -1;};

int delMin();

private:

void sink(int i);

void swim(int i);

T* element; //元素

int* pq; //二叉堆

int *qp; //index

int N;

int _capacity;

};

template

IndexMinPQ::IndexMinPQ(int max) :

element(new T[max + 1]), pq(new int[max + 1])

, qp(new int[max + 1]), N(0), _capacity(max)

{

for(int i = 0; i < max + 1; ++i)

qp[i] = -1;

}

template

void IndexMinPQ::sink(int n){

while(n < N) {

int m = n * 2;

if(element[pq[m]] > element[pq[m + 1]]) ++m;

if(element[pq[m]] < element[pq[n]]) break;

swap(pq[m], pq[n]);

swap(qp[pq[m]], qp[pq[n]]);

n = m;

}

}

template

void IndexMinPQ::swim(int n) {

while(n > 1) {

int m = n / 2;

if(element[pq[m]] <= element[pq[n]]) break;

swap(pq[m], pq[n]);

swap(qp[pq[m]], qp[pq[n]]);

n = m;

}

}

template

void IndexMinPQ::insert(int k, T item) {

// cout << "insert " << k << " " << item << endl;

if(capacity() == size()){

cout << "out of size" << endl;

return ;

}

pq[++N] = k;

element[k] = item;

qp[k] = N;

swim(N);

// show();

}

template

void IndexMinPQ::show() const

{

cout << "pq: ";

for(int i = 1; i <= capacity(); ++i)

cout << pq[i] << " ";

cout << endl;

cout << "qp: ";

for(int i = 1; i <= capacity(); ++i)

cout << qp[i] << " ";

cout << endl;

cout << "element: ";

for(int i = 1; i <= capacity(); ++i)

cout << element[i] << " ";

cout << endl;

}

template

void IndexMinPQ::change(int k, T item) {

if(!contain(k)) {

cout << "change not contain" << endl;

return ;

}

T old_one = element[k];

element[k] = item;

if(item > old_one)

sink(qp[k]);

else if(item < old_one)

swim(qp[k]);

}

template

int IndexMinPQ::delMin() {

int max = pq[1];

swap(pq[1], pq[N]);

swap(qp[pq[1]], qp[pq[N]]);

--N;

show();

sink(1);

show();

qp[max] = -1;

element[max] = -1;

pq[N + 1] = -1;

return max;

}

int main(int argc, char** argv) {

IndexMinPQ pq(6);

vector v = Common::getInstance()->getRandomVector(6);

for(size_t i = 0; i < v.size(); ++i) {

pq.insert(i + 1, v[i]);

}

pq.show();

pq.delMin();

pq.show();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
没有积分的私聊我 看到消息百分百发给你 1、算法核心: 1、读取图片A,获得其RGB三个通道数据并转换成三个矩阵a1,a2,a3。 2、读取文件B,将其转换成比特流b。 3、遍历b,得到比特b1,b2,b3,b4,b5,b6等等,将b1代替a1第一个元素的最低位,将b2代替a2第一个元素的最低位,将b3代替a3第一个元素的最低位,将b4代替a1第二个元素的最低位,以此类推。 2、具体实现: 1、隐写: 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用java NIO读取被嵌入的文件,将其转换为byte数组,需要特别指出的是原生方法得到是byte类型的数组,但是算法实现需要更加精细的操作,所以还需要对得到的byte数组进行进一步的转换封装,将其转换成形如10101的数组。例如,读取文件得到byte数组的第一个元素为63,需将63转换为00111111数组。并且保存好文件的长度。 3、按照算法,遍历形如10101的数组 1、如果遍历到的值为0,将矩阵对应的矩阵元素与0xfe进行与运算,将最低位置为0 2、如果遍历到的值为1,将矩阵对应的矩阵元素与0x01进行或运算,将最低位置为1 4、将步骤3得到的经过经过隐写的矩阵写为一张新的图片。 3、读取 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用隐写步骤3得到的文件长度,遍历图片的像素矩阵,需要特别指出的是因为后续步骤还需要进行进一步的转化,所以这一步是将得到的“100100......”序列每八位封装为一个数组,最终得到一些数组集合,每个数组包含八位二进制序列。 3、将步骤2得到的数组进行转换,例如00111111应该转换为byte类型数值为63的数字,10111111转换为-63。这一步会得到一个byte类型的数组。 4、将步骤3得到的byte类型数组写入文件,需要指出的是写入的文件形式应该和隐写模块步骤二中读入的文件形式一致。 3、程序使用方法 1、安装Java8 2、使用命令行进入jar文件所在目录下,使用命令 java -jar 2016115130.jar 3、安装提示输入嵌入和被嵌入的文件名字,注意路径问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值