zoukankan      html  css  js  c++  java
  • 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
    ");
            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
    ");
                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 != '')
        {
            *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:
    ");
        for(unsigned int j=0;j<k;j++)
        {
            printf("%s:%d
    ",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:
    ");
        for(unsigned int j=0;j<k;j++)
        {
            printf("%s:%d
    ",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
    ");
                return -1;
            }
        }
    
        for(unsigned int i=0;i<len;i++)
        {
            unsigned int cnt;
            if(oTable.get(A[i],&cnt)<0)
            {
                printf("get error
    ");
                return -1;
            }
            printf("%s:%d
    ",A[i],cnt);
        }
    
        oTable.MAXTopK(3);
        oTable.MINTopK(3);
    
        return 0;
    }
  • 相关阅读:
    sphinx测试数据生成
    sphinx是支持结果聚类的——WHERE、ORDER BY和GROUP BY
    sphinx是支持结果聚类的
    sphinx 针对tedfield搜索
    启明星辰泰合发布新一代日志分析系统
    php下载远程图片方法总结(curl手动解析header)curl跳转问题解决
    php抓取ajax页面返回图片。
    PHP用CURL或fsockopen伪造IP和来路(referer)
    windows无效字符名导致的错误及解决办法
    php 原生或curl获取 http headers
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3947813.html
Copyright © 2011-2022 走看看