最近看了一些技术书籍,觉得大数据分析/存储以及云平台必然会成为未来互联网发展的方向。
对于大数据思考如下问题:
缓存中缓存了一天的搜索词条,假设词条大小为1~255字节不等,那么如果最快找出其中最热门的N个搜索词条;
这应该是搜索公司每天都要做的事情,而且数据量也一定非常巨大。
那么怎么以最节省的方式来统计便是一个可以思考的东西了。
先假设一个简化的模型:
假如我有一个超级大的数组,那么我要取出其中最小的k个数,该怎么做到?
我的实现思路就是先创建一个大小为K的树,然后一个一个输入数组中的数,用一个函数来维护树。这样树中就记录着大数组中最小的k个数。
假设大数组总长度为N,这样整个计算的复杂度就是n+n*k;复杂度与想象中的有点差别。对于算法与数据结构,接下来再更新。
优化算法的文章地址:热点排序算法思考(二)
我目前的实现代码如下:
#include <iostream>
#include <string>
#define MAX 9999
//单个树节点的定义
typedef struct S_NODE
{
int value;
S_NODE *m_leftNode;
S_NODE *m_rightNode;
} *PNODE;
//创建一个大小为k的二叉树
S_NODE* create(int start, int k)
{
if (k==0) {
return NULL;
}
S_NODE *node = new S_NODE;
node->value = start;
k--;
int i=k/2;
node->m_leftNode = create(start-i, k-i);
node->m_rightNode = create(start+i, i);
return node;
}
//打印树的信息
void printnode(S_NODE *node)
{
if (node==NULL)
return;
if (node->m_leftNode) {
printnode(node->m_leftNode);
}
std::cout<<node->value<<" ";
if (node->m_rightNode) {
printnode(node->m_rightNode);
}
}
//不停得读取新的数,吸取小数,扔掉大数
int input(S_NODE *node, int value)
{
if (node==NULL) {
return MAX;
}
int temp = value;
if (value>node->value) {
if (node->m_rightNode)
return input(node->m_rightNode, value);
else
return value;
}
else
{
if (node->m_leftNode)
{
temp = input(node->m_leftNode, value);
value = node->value;
node->value = temp;
if (node->m_rightNode)
{
temp = input(node->m_rightNode, value);
value = temp;
}
}
else if(node->m_rightNode)
{
temp = input(node->m_rightNode, value);
}
else
{
temp = node->value;
node->value = value;
value = temp;
}
}
return temp;
}
//测试函数
int main(int argc, const char * argv[])
{
int temp;
S_NODE *root = create(100, 7);
while (1) {
printnode(root);
std::cout<<"\n";
sleep(1);
temp = rand()%100;
std::cout<<temp<<" -- ";
if (temp<0) {
break;
}
input(root, temp);
}
std::cout << "Hello, World!\n";
return 0;
}
运行结果: