热点问题算法思考(一)

来源:互联网 发布:matlab解最优化问题 编辑:程序博客网 时间:2024/05/08 00:33


最近看了一些技术书籍,觉得大数据分析/存储以及云平台必然会成为未来互联网发展的方向。

 

对于大数据思考如下问题:

         缓存中缓存了一天的搜索词条,假设词条大小为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;}


运行结果:



0 0