热点问题算法思考(一)


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

 

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

         缓存中缓存了一天的搜索词条,假设词条大小为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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值