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)+];
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 -;
}
TableHead = new Node*[TableSize];
for(unsigned int i=;i<TableSize;i++)
{
TableHead[i]=NULL;
}
return ;
} int HashTable::Destroy()
{
for(unsigned int i=;i<TableSize;i++)
{
if(ClearChain(TableHead[i]) < )
{
printf("ClearChain error\n");
return -;
}
}
delete[] TableHead;
TableHead = NULL;
return ;
} int HashTable::get(const char *key,unsigned int *value)
{
unsigned int hashcode=;
if(Hash(key,&hashcode) < )
{
printf("generate hashcode error");
return -;
}
unsigned int index = hashcode%TableSize;
Node *p = TableHead[index];
while(p!=NULL && (strcmp(key,p->key)!=))
{
p=p->next;
}
if(p!=NULL)
{
*value = p->value;
}
else
{
*value = ;
}
return ;
} int HashTable::set(const char *key,unsigned int value)
{
unsigned int hashcode=;
if(Hash(key,&hashcode) < )
{
printf("generate hashcode error");
return -;
}
unsigned int index = hashcode%TableSize;
Node *p = TableHead[index];
while(p!=NULL && (strcmp(key,p->key)!=))
{
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 ;
} int HashTable::push(const char *key)
{
unsigned int hashcode=;
if(Hash(key,&hashcode) < )
{
printf("generate hashcode error");
return -;
}
unsigned int index = hashcode%TableSize;
Node *p = TableHead[index];
while(p!=NULL && (strcmp(key,p->key)!=))
{
p=p->next;
}
if(p!=NULL)
{
p->value = p->value+;
}
else
{
Node *q = TableHead[index];
TableHead[index] = new Node(key,);
TableHead[index]->next = q;
}
return ;
} int HashTable::Hash(const char *str,unsigned int *hashcode)
{
*hashcode = ;
unsigned int hashseed = ;
while(*str != '\0')
{
*hashcode += *hashcode*hashseed + *str;
str++;
}
(*hashcode) & 0x7FFFFFFF;
return ;
} int HashTable::ClearChain(Node *Head)
{
Node *p=Head;
Node *q;
while(p != NULL)
{
q=p->next;
delete p;
p=q;
}
Head = NULL;
return ;
} int HashTable::MAXTopK(unsigned int k)
{
Pair *heap = new Pair[k];
for(unsigned int i=;i<TableSize;i++)
{
Node *p=TableHead[i];
while(p!=NULL)
{
if(p->value > heap[].cnt)
{
heap[]=Pair(p->key,p->value);
minHeapIFY(,heap,k);
}
p=p->next;
}
}
printf("MAX TopK:\n");
for(unsigned int j=;j<k;j++)
{
printf("%s:%d\n",heap[j].word,heap[j].cnt);
}
delete[] heap;
return ;
} int HashTable::MINTopK(unsigned int k)
{
Pair *heap = new Pair[k];
int s=k;
for(unsigned int i=;i<TableSize;i++)
{
Node *p=TableHead[i];
while(p!=NULL)
{
if(s>)
{
s--;
heap[s]=Pair(p->key,p->value);
}
if(s == )
{
s--;
buildMaxHeap(heap,k);
}
else
{
if(p->value < heap[].cnt)
{
heap[]=Pair(p->key,p->value);
maxHeapIFY(,heap,k);
}
}
p=p->next;
}
}
printf("MIN TopK:\n");
for(unsigned int j=;j<k;j++)
{
printf("%s:%d\n",heap[j].word,heap[j].cnt);
}
delete[] heap;
return ;
}

#ifndef _HEAP_H
#define _HEAP_H
#include<string.h>
struct Pair
{
char *word;
unsigned int cnt;
Pair()
{
word = NULL;
cnt = ;
}
Pair(const char *str,unsigned int num)
{
word = new char[strlen(str)+];
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)+];
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-)>>;
} unsigned int Left(unsigned int i)
{
return (i<<)+;
} unsigned int Right(unsigned int i)
{
return (i<<)+;
} 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/-;i>=;i--)
{
maxHeapIFY(i,p,len);
}
} void buildMinHeap(Pair *p,unsigned int len)
{
for(int i=len/-;i>=;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=;i<len;i++)
{
if(oTable.push(A[i])<)
{
printf("push error\n");
return -;
}
} for(unsigned int i=;i<len;i++)
{
unsigned int cnt;
if(oTable.get(A[i],&cnt)<)
{
printf("get error\n");
return -;
}
printf("%s:%d\n",A[i],cnt);
} oTable.MAXTopK();
oTable.MINTopK(); return ;
}

TopK代码的更多相关文章

  1. TOPK 问题

    TOPK 问题 描述 如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题,通常使用堆来解决: 求前 k 大,用最小堆 求前 k 小,用最大堆 例子 现有列表 [1, 2, 0, 3, ...

  2. qsort代码(pascal/c/c++)与思想及扩展(随机化,TopK)

    1.快速排序思想:从一堆数A中找到一个数x,然后把这堆数x分成两堆B,C,B堆的数小于(或小于等于)该数,放在左边,C堆的数大于(或大于等于)该数,放在右边,有可能把该数x单独分开,放在中间.然后对小 ...

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

    package findMinNumIncludedTopN;/** * 小顶堆 * @author TongXueQiang * @date 2016/03/09 * @since JDK 1.8  ...

  4. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  5. MapReduce实现TopK的示例

    由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文 ...

  6. Topk引发的一些简单的思考

    软件工程课程的一个题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来.文本文件大约是30KB~300KB大小. 首先说一下这边的具体的实现都是在linux上实现的. ...

  7. Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)

    Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...

  8. Mapreduce TopK

      思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...

  9. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

随机推荐

  1. 安卓手机安装charles安全证书

    本次安装使用小米mix2为例. 手机浏览器上安装: 第一种: 1.首先 设置好手机的charles代理   172.16.xxx.xxx   8888 2.要使用 打开非自带浏览器(夸克/QQ/UC手 ...

  2. DOM节点的获取

      document.getElementById();//id名,在实际开发中较少使用,选择器中多用class  id一般只用在顶级层存在 不能太过依赖id document.getElements ...

  3. SWING界面

    import java.awt.FlowLayout;import javax.swing.*;import java.awt.Container; public class kk extends J ...

  4. 【VIP视频网站项目三】项目框架搭建、项目路由配置、数据库表结构设计

    一.项目路由的设计 目前项目代码已经全部开源:项目地址:https://github.com/xiugangzhang/vip.github.io 视频网站前台页面路由设计 路由 请求方法 模板 作用 ...

  5. hdu 5175 Misaki's Kiss again

    Misaki's Kiss again  Accepts: 75  Submissions: 593  Time Limit: 2000/1000 MS (Java/Others)  Memory L ...

  6. vue 组件通信传值

    父子组件通信: 子组件 <template> <div> <h3 @click="alerrt"> 我是子组件一</h3> < ...

  7. 【Codeforces Global Round 1 E】Magic Stones

    [链接] 我是链接,点我呀:) [题意] 你可以把c[i]改成c[i+1]+c[i-1]-c[i] (2<=i<=n-1) 问你能不能把每一个c[i]都换成对应的t[i]; [题解] d[ ...

  8. dinic算法求最大流的学习

    http://trp.jlu.edu.cn/software/net/lssx/4/4.38.htm http://www.cnblogs.com/zen_chou/archive/0001/01/0 ...

  9. js for循环中的var与let

    var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); 上面代码 ...

  10. 【学QT】1 - QT的安装

    1.解压文件在/usr/local/下 #tar zxvf qt-x11-free-3.3.8b.tar.gz -C /usr/local 更改文件夹名称为qt #mv /usr/local/qt-x ...