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. Java中面向对象三大特性之——多态

    多态的概述:  多态是继封装.继承之后,面向对象的第三大特性. 生活中,比如跑的动作,小猫.小狗和大象,跑起来是不一样的.再比如飞的动作,昆虫.鸟类和飞机,飞起来也是不一样的.可见,同一行为,通过不同 ...

  2. __declspec(dllexport)

    __declspec(dllexport) (2010-06-17 10:04:28) 转载▼ 标签: __declspec dllexport 导出 it 分类: C 先看代码:以下是在dev-c+ ...

  3. 微信小程序——weui的使用

    使用在根目录中复制weui.wxss,app.wxss中引入 在weui.io中查看到自己想要的样式表后,到第二个网站复制代码,复制到自己的项目中即可 <!--pages/register/re ...

  4. sql的四种连接方式

    1.内联接.(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students ...

  5. git对vue项目进行版本管理

    生成本地仓库 步骤一:git init 步骤二:git add * 步骤三:git commit -m 'init team' 创建远程仓库 new responstory 复制关联代码的命令 将本地 ...

  6. HDU3336Count the string

    HDU3336Count the string Problem Description It is well known that AekdyCoin is good at string proble ...

  7. redis环境部署

    运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 一.Redis服务介绍: redis简单来讲就是一个数据库,一个用来存储缓存的数据库容器,主要是让项目数据能写进缓存,为用户提搞更舒 ...

  8. 1.scrapy爬取的数据保存到es中

    先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index.     from datetime import datetime fr ...

  9. java常见知识

    在JSP页面获取当前项目名称的方法: 方法1: <%= this.getServletContext().getContextPath() %> 方法2: 使用EL表达式 ${pageCo ...

  10. 【Codeforces 1114C】Trailing Loves (or L'oeufs?)

    [链接] 我是链接,点我呀:) [题意] 问你n!的b进制下末尾的0的个数 [题解] 证明:https://blog.csdn.net/qq_40679299/article/details/8116 ...