TopK代码

Hash表

#ifndef _HASH_H
#define _HASH_H

#include<string.h>
#include<stdio.h>
class HashTable
{
public:
    HashTable(unsigned int size);
    ~HashTable();
    int get(const char *key,unsigned int *value);
    int set(const char *key,unsigned int value);
    int push(const char *key);
    int MAXTopK(unsigned int k);
    int MINTopK(unsigned int k);
private:
    struct Node
    {
        char *key;
        unsigned int value;
        Node *next;

        Node(const char *str,unsigned int v)
        {
            key = new char[strlen(str)+1];
            strcpy(key,str);
            value = v;
            next = NULL;
        }
        ~Node()
        {
            delete[] key;
        }
    };
    int Init();
    int Destroy();
    int Hash(const char *key,unsigned int *hashcode);
    int ClearChain(Node *Head);

    Node **TableHead;
    unsigned int TableSize;
    char **kWords;
};
#endif
#include"Hash.h"
#include"Heap.h"

HashTable::HashTable(unsigned int size)
{
    TableHead = NULL;
    TableSize = size;
    Init();
}
HashTable::~HashTable()
{
    Destroy();
}

int HashTable::Init()
{
    if(TableHead != NULL)
    {
        printf("HashTable has been initialized\n");
        return -1;
    }
    TableHead = new Node*[TableSize];
    for(unsigned int i=0;i<TableSize;i++)
    {
        TableHead[i]=NULL;
    }
    return 0;
}

int HashTable::Destroy()
{
    for(unsigned int i=0;i<TableSize;i++)
    {
        if(ClearChain(TableHead[i]) < 0)
        {
            printf("ClearChain error\n");
            return -1;
        }
    }
    delete[] TableHead;
    TableHead = NULL;
    return 0;
}

int HashTable::get(const char *key,unsigned int *value)
{
    unsigned int hashcode=0;
    if(Hash(key,&hashcode) < 0)
    {
        printf("generate hashcode error");
        return -1;
    }
    unsigned int index = hashcode%TableSize;
    Node *p = TableHead[index];
    while(p!=NULL && (strcmp(key,p->key)!=0))
    {
        p=p->next;
    }
    if(p!=NULL)
    {
        *value = p->value;
    }
    else
    {
        *value = 0;
    }
    return 0;
}

int HashTable::set(const char *key,unsigned int value)
{
    unsigned int hashcode=0;
    if(Hash(key,&hashcode) < 0)
    {
        printf("generate hashcode error");
        return -1;
    }
    unsigned int index = hashcode%TableSize;
    Node *p = TableHead[index];
    while(p!=NULL && (strcmp(key,p->key)!=0))
    {
        p=p->next;
    }
    if(p!=NULL)
    {
        p->value = value;
    }
    else
    {
        Node *q = TableHead[index];
        TableHead[index] = new Node(key,value);
        TableHead[index]->next = q;
    }
    return 0;
}

int HashTable::push(const char *key)
{
    unsigned int hashcode=0;
    if(Hash(key,&hashcode) < 0)
    {
        printf("generate hashcode error");
        return -1;
    }
    unsigned int index = hashcode%TableSize;
    Node *p = TableHead[index];
    while(p!=NULL && (strcmp(key,p->key)!=0))
    {
        p=p->next;
    }
    if(p!=NULL)
    {
        p->value = p->value+1;
    }
    else
    {
        Node *q = TableHead[index];
        TableHead[index] = new Node(key,1);
        TableHead[index]->next = q;
    }
    return 0;
}

int HashTable::Hash(const char *str,unsigned int *hashcode)
{
    *hashcode = 0;
    unsigned int hashseed = 131;
    while(*str != ‘\0‘)
    {
        *hashcode += *hashcode*hashseed + *str;
        str++;
    }
    (*hashcode) & 0x7FFFFFFF;
    return 0;
}

int HashTable::ClearChain(Node *Head)
{
    Node *p=Head;
    Node *q;
    while(p != NULL)
    {
        q=p->next;
        delete p;
        p=q;
    }
    Head = NULL;
    return 0;
}

int HashTable::MAXTopK(unsigned int k)
{
    Pair *heap = new Pair[k];
    for(unsigned int i=0;i<TableSize;i++)
    {
        Node *p=TableHead[i];
        while(p!=NULL)
        {
            if(p->value > heap[0].cnt)
            {
                heap[0]=Pair(p->key,p->value);
                minHeapIFY(0,heap,k);
            }
            p=p->next;
        }
    }
    printf("MAX TopK:\n");
    for(unsigned int j=0;j<k;j++)
    {
        printf("%s:%d\n",heap[j].word,heap[j].cnt);
    }
    delete[] heap;
    return 0;
}

int HashTable::MINTopK(unsigned int k)
{
    Pair *heap = new Pair[k];
    int s=k;
    for(unsigned int i=0;i<TableSize;i++)
    {
        Node *p=TableHead[i];
        while(p!=NULL)
        {
            if(s>0)
            {
                s--;
                heap[s]=Pair(p->key,p->value);
            }
            if(s == 0)
            {
                s--;
                buildMaxHeap(heap,k);
            }
            else
            {
                if(p->value < heap[0].cnt)
                {
                    heap[0]=Pair(p->key,p->value);
                    maxHeapIFY(0,heap,k);
                }
            }
            p=p->next;
        }
    }
    printf("MIN TopK:\n");
    for(unsigned int j=0;j<k;j++)
    {
        printf("%s:%d\n",heap[j].word,heap[j].cnt);
    }
    delete[] heap;
    return 0;
}

#ifndef _HEAP_H
#define _HEAP_H
#include<string.h>
struct Pair
{
    char *word;
    unsigned int cnt;
    Pair()
    {
        word = NULL;
        cnt = 0;
    }
    Pair(const char *str,unsigned int num)
    {
        word = new char[strlen(str)+1];
        strcpy(word,str);
        cnt = num;
    }
    ~Pair()
    {
        delete[] word;
        word=NULL;
    }
    const Pair& operator=(const Pair& p)
    {
        delete[] word;
        if(p.word != NULL)
        {
            word = new char[strlen(p.word)+1];
            strcpy(word,p.word);
        }
        else
        {
            word = NULL;
        }
        cnt = p.cnt;
        return *this;
    }
};

unsigned int Parent(unsigned int i);
unsigned int Left(unsigned int i);
unsigned int Right(unsigned int i);

void maxHeapIFY(unsigned int i,Pair *p,unsigned int len);
void minHeapIFY(unsigned int i,Pair *p,unsigned int len);

void buildMaxHeap(Pair *p,unsigned int len);
void bulidMinHeap(Pair *p,unsigned int len);

#endif
#include"Heap.h"

unsigned int Parent(unsigned int i)
{
    return (i-1)>>1;
}

unsigned int Left(unsigned int i)
{
    return (i<<1)+1;
}

unsigned int Right(unsigned int i)
{
    return (i<<1)+2;
}

void maxHeapIFY(unsigned int i,Pair *p,unsigned int len)
{
    if(i>=len)
    {
        return;
    }
    unsigned int largest = i;
    unsigned int leftidx = Left(i);
    if(leftidx<len && p[i].cnt<p[leftidx].cnt)
    {
        largest = leftidx;
    }
    unsigned int rightidx = Right(i);
    if(rightidx<len && p[largest].cnt<p[rightidx].cnt)
    {
        largest = rightidx;
    }
    if(largest != i)
    {
        Pair temp(p[i].word,p[i].cnt);
        p[i] = p[largest];
        p[largest]=temp;
        maxHeapIFY(largest,p,len);
    }
}

void minHeapIFY(unsigned int i,Pair *p,unsigned int len)
{
    if(i>=len)
    {
        return;
    }
    unsigned int smallest = i;
    unsigned int leftidx = Left(i);
    if(leftidx<len && p[i].cnt>p[leftidx].cnt)
    {
        smallest = leftidx;
    }
    unsigned int rightidx = Right(i);
    if(rightidx<len && p[smallest].cnt>p[rightidx].cnt)
    {
        smallest = rightidx;
    }
    if(smallest != i)
    {
        Pair temp(p[i].word,p[i].cnt);
        p[i] = p[smallest];
        p[smallest]=temp;
        maxHeapIFY(smallest,p,len);
    }
}

void buildMaxHeap(Pair *p,unsigned int len)
{
    for(int i=len/2-1;i>=0;i--)
    {
        maxHeapIFY(i,p,len);
    }
}

void buildMinHeap(Pair *p,unsigned int len)
{
    for(int i=len/2-1;i>=0;i--)
    {
        minHeapIFY(i,p,len);
    }
}

主函数

#include<stdio.h>
#include"Hash.h"

int main()
{
    char *A[]={"hello","world","spicy","hot","delete","great","spicy","great","great","hello","hot","hello"};
    unsigned int len=sizeof(A)/sizeof(char*);
    HashTable oTable(len);

    for(unsigned int i=0;i<len;i++)
    {
        if(oTable.push(A[i])<0)
        {
            printf("push error\n");
            return -1;
        }
    }

    for(unsigned int i=0;i<len;i++)
    {
        unsigned int cnt;
        if(oTable.get(A[i],&cnt)<0)
        {
            printf("get error\n");
            return -1;
        }
        printf("%s:%d\n",A[i],cnt);
    }

    oTable.MAXTopK(3);
    oTable.MINTopK(3);

    return 0;
}
时间: 2024-10-11 19:17:56

TopK代码的相关文章

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

从海量数据中寻找出topK的最优算法代码

package findMinNumIncludedTopN;/** * 小顶堆 * @author TongXueQiang * @date 2016/03/09 * @since JDK 1.8 */public class MinHeap { int[] heap; int heapsize; public MinHeap(int[] array) {  this.heap = array;  this.heapsize = heap.length; }  /**  * 构建小顶堆  */

MapReduce TopK问题实际应用

一:背景 TopK问题应该是海量数据处理中应用最广泛的了,比如在海量日志数据处理中,对数据清洗完成之后统计某日访问网站次数最多的前K个IP.这个问题的实现方式并不难,我们完全可以利用MapReduce的Shuffle过程实现排序,然后在Reduce端进行简单的个数判断输出即可.这里还涉及到二次排序,不懂的同学可以参考我之前的文章. 二:技术实现 #我们先来看看一条Ngnix服务器的日志: [java] view plain copy 181.133.250.74 - - [06/Jan/2015

Topk引发的一些简单的思考

软件工程课程的一个题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来.文本文件大约是30KB~300KB大小. 首先说一下这边的具体的实现都是在linux上实现的.没有大型IDE的性能检测.其实30KB还不是瞬间的事情,基于语言和一些简单的策略.所以在后面可能会尝试考虑增加文件大小到G级,然后发生的东西.我只能是从简单的原理研究.至于调试我只能写个简单的shell来自己检测一下.嗯,就这样吧.能力还是有点小白,特别是看了v_JULY_v 的海量数据处理http

MapReduce实现TopK的示例

由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文件中找出词频排名前K的所有单词.首先分析该问题,从中我们可以得到启发:要想知道词频排名前K的所有单词,那么是不是要对所有的单词进行词频的统计啊?于是我们就联想到了一个比较经典的例子:WordCount的例子.是的,没错.就是它,统计原文件中每个单词的个数就靠它. 但是,我们词频统计出来了,接下来需要

minheap+hashmap组合解决动态topK问题(附堆排序完整实现)

TopK的解决方法一般有两种:堆排序和partition.前者用优先队列实现,时间复杂度为O(NlogK)(N为元素总数量),后者可以直接调用C++ STL中的nth_element函数,时间复杂度O(N).如果想获取动态更新数据的topK就不那么容易了,比如实时更新最常访问的top10的网址,显然除了维护一个size为10的最小堆以外还需要一个哈希表实时记录每一个网址的访问次数,并决定是否动态加入到最大堆中,同时可能删除堆中的元素.那么如何获得该网址在堆中的位置呢?需要另一个hashmap记录

Spark on YARN--WordCount、TopK

原文地址:http://blog.csdn.net/cklsoft/article/details/25568621 1.首先利用http://dongxicheng.org/framework-on-yarn/spark-eclipse-ide/搭建好的Eclipse(Scala)开发平台编写scala文件,内容如下: import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ object HdfsW

排序中topK那点事(转)

问题描述:有 N (N>1000000)个数,求出其中的前K个最小的数(又被称作topK问题). 这类问题似乎是备受面试官的青睐,相信面试过互联网公司的同学都会遇到这来问题.下面由浅入深,分析一下这类问题. 思路1:最基本的思路,将N个数进行完全排序,从中选出排在前K的元素即为所求.有了这个思路,我们可以选择相应的排序算法进行处理,目前来看快速排序,堆排序和归并排序都能达到O(NlogN)的时间复杂度.当然,这样的答案也是无缘offer的. 思路2:可以采用数据池的思想,选择其中前K个数作为数据

经典topK问题

hadoop的入门问题是wordcount,而经典问题是TopK计算,比如热词,搜索链接热度等都是topK问题的变种 TopK问题使用MapReduce解决需要2步,而使用Tez解决可以缩减为一步,使用Tez其实也就是将2步MapReduce转化成DAG,一步完成,Tez大量复用了MapReduce代码. 这里我们讨论使用MapReduce解决问题 第一步wordcount,终于理解"道格",把wordcount作为MapReduce编程的实例的用心了,哈哈,wordcount这里不再