心情不爽
写个程序发泄一下
前几天看到师弟们在找工作,
想起自己找工作的时候常被问道一个问题:
给定10个有序文件,每个100M,假设只包含数据,要取出这10*100M数据里面的前100个
这个是典型的top K问题,虽然我知道有很多种方法可以解,
但惭愧的是从来没有自己实现过这个代码,面试笔试也就这么糊弄过去了
今天用多路归并+堆排序实现了下
代码如下:(凑合着看吧,在vc测试通过)
// heapSort.cpp : Defines the entry point for the console application.
//
#include<iostream>
#include<vector>
#include<list>
using namespace std;
//#define PARENT(i) (i/2)
#define LEFT(i) (2*i+1)
//#define RIGHT(i) (2*i+1)
struct Node {
int value;
Node *next;
};
void min_heapity(Node* Array,int i,int n)
{
int l = LEFT(i);
int r = l+1;//RIGHT(i)
int minest = i;
if (l<=n-1 && Array[l].value < Array[i].value)//n-1是heap-size
minest = l;
else
minest = i;
if (r<=n-1 && Array[r].value < Array[minest].value)
{
minest = r;
}
if (minest != i)
{
Node temp = Array[minest];
Array[minest] = Array[i];
Array[i] = temp;
min_heapity(Array,minest,n);//递归
}
}//建堆
void bulid_heap(Node heap[],int n)
{
for(int i = n/2-1;i>=0;i--)//注意从n/2开始,到0结束,逆向的
{
min_heapity(heap,i,n);
}
}
//堆排序算法
void heap_sort(Node* Array,int n)
{
bulid_heap(Array,n);
int tmp_n = n;
for (int i = n-1;i>=1;i-- )
{
Node temp = Array[i];
Array[i] = Array[0];
Array[0] = temp;
min_heapity(Array,0,--tmp_n);
}
}
void kMerge(vector<vector<Node> > &kLists) {
int heapSize = kLists.size();
//Node heap[] = new Node[heapSize + 1];
Node *heap = (Node *)malloc(sizeof(Node)*heapSize);
// 取出K路中每个vector的第一个元素建堆。
for (int i = 0; i < heapSize; i++)
{ heap[i].value = kLists.at(i).at(0).value;
heap[i].next = kLists.at(i).at(0).next;
}
bulid_heap(heap, heapSize);
for (i = 0;i<heapSize;i++)
{
cout<<"build heap "<<heap[i].value<<endl;
}
vector<Node> resultList;
while (heapSize > 0) {
Node minNode = heap[0];
resultList.push_back(minNode);
if (minNode.next == NULL) {
heap[0] = heap[heapSize-1];
heapSize -= 1;
} else {
heap[0].value = minNode.next->value;
heap[0].next = minNode.next->next;
}
min_heapity(heap, 0, heapSize);
for (i = 0;i<heapSize;i++)
{
cout<<"min heap "<<heap[i].value<<endl;
}
cout<<endl;
}
for (vector<Node>::iterator t = resultList.begin(); t != resultList.end();++t)
{
cout<<"test "<<(*t).value<<endl;
}
//return resultList;
}
void creatList(int *a,vector<Node> &v,int length)
{
Node *preNode = NULL;
for (int i=0;i<length; i++)
{
v.at(i).value = a[i];
v.at(i).next = NULL;
if (preNode != NULL)
preNode->next = &(v.at(i));
preNode = &(v.at(i));
}
//return v;
}
int main()
{
int a1[] = {2, 5, 8, 10};
vector<Node> vector1;
vector1.resize(4);
creatList(a1, vector1, 4);
int a2[] = {3, 4, 14};
vector<Node> vector2;
vector2.resize(3);
creatList(a2, vector2, 3);
int a3[] = {9, 11, 13, 15, 18};
vector<Node> vector3;
vector3.resize(5);
creatList(a3, vector3, 5);
int a4[] = {7, 12, 17, 22, 25};
vector<Node> vector4;
vector4.resize(5);
creatList(a4, vector4, 5);
int a5[] = {6, 16, 19, 21};
vector<Node> vector5;
vector5.resize(4);
creatList(a5, vector5, 4);
vector<vector<Node> > Kvec;
Kvec.push_back(vector1);
Kvec.push_back(vector2);
Kvec.push_back(vector3);
Kvec.push_back(vector4);
Kvec.push_back(vector5);
kMerge(Kvec);
for(vector<vector<Node> >::iterator t = Kvec.begin() ;t != Kvec.end(); t++ )
{
for(vector<Node>::iterator pp = t->begin(); pp!= t->end() ; pp++ )
cout<<(*pp).value<<endl;
}
return 0;
}
算是自己在csdn的第一篇blog,mark下吧
不知道自己能不能够坚持写blog
毕竟现在自己的工作和编程关系是在不大
让我放弃C++,真的挺不甘心的