关于Huffman 算法中一次提取2个最小权重值的操作实现

/*
 * =====================================================================================
 *
 *       Filename:  min_two_selector.cpp
 *
 *    Description:
 *           找出整形数组中的两个最小值,并将其和重新放入该数组
 *
 *        Version:  1.0
 *        Created:  09/14/2014 10:44:19 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  RollStone (rs), [email protected]
 *   Organization:  RollStone. Ltd. Co
 *      Last Change:  09/14/2014 10:44:19 PM
 *
 * =====================================================================================
 */
#include <stdio.h>

struct SA {
    int nSize;
    int retm, retm2;
    int select_min_two_values(int arr[]);
};

//为了方便查找而实现的插入排序
void InsertSort(int arr[], unsigned int n) {
    int i, j;
    int tmp;
    for (i = 1; i < n; i++) {
        tmp = arr[i];
        for (j = i; j > 0 && arr[j - 1] > tmp; j--) {
            arr[j] = arr[j - 1];
        }
        arr[j] = tmp;
    }
}

int SA::select_min_two_values(int *sa) {
    int i = 0;
    //sort
    InsertSort(sa, nSize);
    //find none-zero value index
    for (i = 0; i < nSize; i++) {
        if (0 != sa[i]) {
            break;
        }
    }
    //get two values
    retm = sa[i];
    retm2 = sa[i + 1];
    //replace the addition to array,and set the minimum one‘s value be zero
    if(i<nSize-2){//将置零操作控制到倒数第三个数字的位置上
        sa[i + 1] += sa[i];
    }else{
        sa[i+1]=0;
    }
    sa[i] = 0;

    return 0;
}

int main(int argc, char* argv[]) {
    SA asd;
    int arr[] = {5, 1, 1, 4, 4, 4, 3, 7, 5, 1};
    asd.nSize = sizeof (arr) / sizeof (arr[0]);

    for (int i = 0; arr[asd.nSize-2]!=0; i++) {
        asd.select_min_two_values(arr);
        printf("%d %d\n", asd.retm, asd.retm2);
    }

    return 0;
}
时间: 2024-09-30 20:55:16

关于Huffman 算法中一次提取2个最小权重值的操作实现的相关文章

避免图像去雾算法中让天空部分出现过增强的一种简易方法。

在经典的几种去雾算法中,包括何凯明的暗通道去雾.Tarel的基于中值滤波的去雾以及一些基于其他边缘保留的方法中,都有一个普遍存在的问题:即对天空部分处理的不好,天空往往会出现较大的面积的纹理及分块现象.究其主要原因,还是因为天空部位基本上是不符合暗通道去雾先验这个前决条件的.目前,针对这一问题,我搜索到的主要有以下几篇文章进行了处理: 1. 改进的基于暗原色先验的图像去雾算法 作者: 蒋建国\侯天峰\齐美彬   合肥工业大学 2011. 2.Single image dehazing Algor

3 中文文本中的关键字提取

前言 关键词提取就是从文本里面把跟这篇文章意义最相关的一些词语抽取出来.这个可以追溯到文献检索初期,关键词是为了文献标引工作,从报告.论文中选取出来用以表示全文主题内容信息的单词或术语,在现在的报告和论文中,我们依然可以看到关键词这一项.因此,关键词在文献检索.自动文摘.文本聚类/分类等方面有着重要的应用,它不仅是进行这些工作不可或缺的基础和前提,也是互联网上信息建库的一项重要工作. 关键词抽取从方法来说主要有两种: 第一种是关键词分配:就是给定一个已有的关键词库,对于新来的文档从该词库里面匹配

一致性算法中的节点下限(转)

在众多的分布式一致性算法中,经常需要通过节点的数量满足某种规则来保证算法的正确性,比如Paxos算法,依赖一个”多数派“ 节点的工作的正确性.这类算法的共同目标是容许尽量多的节点失败但又不影响算法的正确性”. 这类问题本质上都抽象为数学上集合之间的逻辑关系,下面我们便从集合的性质入手讨论,为此先引入两个问题: 假设N为一非空结合,n为集合的元素数,M1,M2,...,Mm为N的m个子集,其元素数分别为n1,n2,...,nm,则: 求得M1∩M2∩...∩Mn≠Φ的条件 求得M1∩M2∩...∩

SQL自连接(源于推荐算法中的反查表问题)

"基于用户的协同过滤算法"是推荐算法的一种,这类算法强调的是:把和你有相似爱好的其他的用户的物品推荐给你. 要实现该推荐算法,就需要计算和你有交集的用户,这就要用到物品到用户的反查表. 先举个例子说明下反查表:甲喜欢的物品有:A.B.C:乙喜欢的物品有:B.E.F:丙喜欢的物品有:A.J.K:而你喜欢的物品是:A.J.M.反查表就是喜欢A物品的有你.甲.丙,喜欢J物品的有你.丙,喜欢M物品的只有你,这就是和你喜欢的物品有联系的用户.有了这个反查表,我们就可以看出和你有关系的用户只有甲和

Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当然最后只是输出cost,就没必要建树什么的了.只要理解了huffman算法构造最优二叉树的思路,就按那么想就知道每个a[i]要加多少次了. 当然这道题没想到这些也可以找出规律的,就是一种贪心思想. #include<iostream> #include<cstdio> #include

堆管理算法中的Buddy System(伙伴系统)算法

在一个Buddy System算法中,堆管理者只分配特定大小的内存块,成为permitted size.针对每个permitted size,都有一个空闲链表来维护. 一般这些大小会选择2的幂次方,或者斐波那契数列.因为这样会方便地将除最小的那个数之外的其它数都分为两个permitted size之和. 当负责分配内存的堆管理者接受到请求s大小的内存请求时,会讲s对齐到一个permitted size.然后从那个permitted size的空闲链表中分配一块内存给他.如果没有在那个空闲链表中找

机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size

机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,如何选取初始的超参数的值.(本文会不断补充) 学习速率(learning rate,η) 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η.下面讨论在训练时选取η的策略. 固定的学习速率.如果学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致代价

分类算法中的ROC与PR指标

做过图像识别.机器学习或者信息检索相关研究的人都知道,论文的实验部分都要和别人的算法比一比.可怎么比,人多嘴杂,我说我的方法好,你说你的方法好,各做各的总是不行--没规矩不成方圆.于是慢慢的大家就形成了一种约定,用ROC曲线和PR曲线来衡量算法的优劣.关于ROC曲线和PR曲线的详细介绍可参考资料: ROC Analysis and the ROC Convex Hull Tom Fawcett,An introduction to ROC analysis Jesse Davis,Mark Go

js中从blob提取二进制

文章结构: 一.所遇到的问题 二.解决方法 一. 服务器端通过websocket向浏览器端传输图片(二进制),需要根据不同的图片把图片显示在不同的位置,可行的一个方法是先把图片转化成二进制数组,再把二进制数组和一个字节的图片标识拼接在一块传输给浏览器端,最后在浏览器端拆分.找了好久才找到一些js处理二进制的相关方法,就在此记录一下. 二. 1.服务器端二进制拼接: public byte[] mergeByte(byte[] b1,byte[] b2) { byte[] b3=new byte[