热点问题算法思考(一)
来源:互联网 发布: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
- 热点问题算法思考(一)
- C++ 热点问题一席谈(一)
- 排序算法 总结&思考(一)
- 算法类思考累积(一)
- 算法总结与思考(一)
- C++ 热点问题一席谈(二)
- C++ 热点问题一席谈(三)
- 思考(一)
- 思考未来(一)
- 运营思考(一)
- 编程思考(一)
- 算法思考--------老鼠走迷宫(一)
- .NET几大热点问题(转)
- 排序算法的思考和总结(一)-冒泡和选择排序
- 对数据结构和算法的总结和思考(一)--概览
- 职业发展思考(一)
- 关于C++思考(一)
- 关于工作思考(一)
- Reorder List
- 变量键盘读取、数组与宣告: read, array, declare
- poj 2762 Tarjan+拓扑排序 入度为1的集合的个数
- c++智能指针auto_ptr的实现
- Nginx网络连接timewait问题
- 热点问题算法思考(一)
- CRecordSet类的常用操作 右键菜单 ON_CONTROL_RANGE
- ASP.NET MVC 4 (二)控制器
- sdut oj 1480 数据结构实验:哈希表
- Windows下面小工具pslist(终于部分原创了,呵呵)
- typedef语句和数据类型转换
- HDU4930-Fighting the Landlords
- C++-类与对象
- POJ 1160 Post Office