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个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
随机推荐
- .net core发布程序
这里说的是,和.net core运行库一起发布,所以,目标运行系统,可以不安装.net core也能运行 1.project.json 把dependencies里面的type删除掉,后面加入&quo ...
- 文件上传原理--FileReader
单个文件:<div> <input value="上传" type="file" id="photos_upload"&g ...
- 多目标跟踪笔记三:Global Data Association for Multi-Object Tracking Using Network Flows
Abstract 针对用于多目标跟踪的数据关联(data association),本文提出了一种基于网络流(network flow)的优化方法.将最大后验概率(maximum-a-posterio ...
- Django - ORM创建基本类
DBFirst CodeFirst 创建类 1.根据类自动创建数据库表 在app下的models.py中创建表 创建数据库之前,需要在django下的setting.py模块中的INSTALLED_A ...
- 使用python的几个小经验(查看文档)
好久没有水博客了,未来再过20天不到的时间又得参加软考,今天终于得好好水一发帖子 关于Python,很多人包括我之前都不知道怎么找文档,现在有一个好办法,就是在命令行模式下调用pydoc –p xxx ...
- SSH技术介绍和Xshell公钥远程登陆
SSH简介 传统的网络服务程序,比如FTP,POP,Telnet,本质上都是不安全的,因为它们在网络上用明文传送数据.用户账号和用户口令,很容易受到中间人攻击方式的攻击,攻击者会冒充真正的服务器接收用 ...
- 使用PHP操作MongoDB数据库
1.连接MongoDB数据库(在已安装php-mongodb扩展的前提下) $config = "mongodb://{$user}:{$pass}@{$host}:{$port}" ...
- 2019-02-13 Python爬虫问题 NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type.
soup=BeautifulSoup(html.text,'lxml') #data=soup.select('body > div.main > div.ctr > div > ...
- 3 Java的基本程序设计结构
本章主要内容: 一个简单的Java应用程序 注释 数据类型 变量 运算符 字符串 输入输出 控制流 大数值 数组 本章主要介绍程序设计的基本概念(如数据类型.分支以及循环)在Jav ...
- 并发通信Manage,队列, 互斥锁
目录 Manage 队列 先入先出 互斥锁 Manage 进程间的通信是被限制的 from multiprocessing import Process a = 1 def func(): glob ...