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)+];
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代码的更多相关文章
- TOPK 问题
TOPK 问题 描述 如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题,通常使用堆来解决: 求前 k 大,用最小堆 求前 k 小,用最大堆 例子 现有列表 [1, 2, 0, 3, ...
- qsort代码(pascal/c/c++)与思想及扩展(随机化,TopK)
1.快速排序思想:从一堆数A中找到一个数x,然后把这堆数x分成两堆B,C,B堆的数小于(或小于等于)该数,放在左边,C堆的数大于(或大于等于)该数,放在右边,有可能把该数x单独分开,放在中间.然后对小 ...
- 从海量数据中寻找出topK的最优算法代码
package findMinNumIncludedTopN;/** * 小顶堆 * @author TongXueQiang * @date 2016/03/09 * @since JDK 1.8 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- MapReduce实现TopK的示例
由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文 ...
- Topk引发的一些简单的思考
软件工程课程的一个题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来.文本文件大约是30KB~300KB大小. 首先说一下这边的具体的实现都是在linux上实现的. ...
- Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)
Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...
- Mapreduce TopK
思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...
- scala写算法-用小根堆解决topK
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
随机推荐
- Java中面向对象三大特性之——多态
多态的概述: 多态是继封装.继承之后,面向对象的第三大特性. 生活中,比如跑的动作,小猫.小狗和大象,跑起来是不一样的.再比如飞的动作,昆虫.鸟类和飞机,飞起来也是不一样的.可见,同一行为,通过不同 ...
- __declspec(dllexport)
__declspec(dllexport) (2010-06-17 10:04:28) 转载▼ 标签: __declspec dllexport 导出 it 分类: C 先看代码:以下是在dev-c+ ...
- 微信小程序——weui的使用
使用在根目录中复制weui.wxss,app.wxss中引入 在weui.io中查看到自己想要的样式表后,到第二个网站复制代码,复制到自己的项目中即可 <!--pages/register/re ...
- sql的四种连接方式
1.内联接.(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students ...
- git对vue项目进行版本管理
生成本地仓库 步骤一:git init 步骤二:git add * 步骤三:git commit -m 'init team' 创建远程仓库 new responstory 复制关联代码的命令 将本地 ...
- HDU3336Count the string
HDU3336Count the string Problem Description It is well known that AekdyCoin is good at string proble ...
- redis环境部署
运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 一.Redis服务介绍: redis简单来讲就是一个数据库,一个用来存储缓存的数据库容器,主要是让项目数据能写进缓存,为用户提搞更舒 ...
- 1.scrapy爬取的数据保存到es中
先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index. from datetime import datetime fr ...
- java常见知识
在JSP页面获取当前项目名称的方法: 方法1: <%= this.getServletContext().getContextPath() %> 方法2: 使用EL表达式 ${pageCo ...
- 【Codeforces 1114C】Trailing Loves (or L'oeufs?)
[链接] 我是链接,点我呀:) [题意] 问你n!的b进制下末尾的0的个数 [题解] 证明:https://blog.csdn.net/qq_40679299/article/details/8116 ...