实时输出topk最频繁变动的股价
网上看到了一道关于bloomburg的面试题,follow 评论的思路 自己试着写了一个HashHeap的实现。
基本思路是维护一个大小为K的最小堆,里面是topK股价变动的公司ID(假设ID是Integer)
HashHeap中维护一个companyIdHeap 之外还有一个HashMap 它的key 是CompanyId, value是Company信息 此处我假设company信息包含这个company在companyIdHeap中的index (这个index可以使delete function的复杂度降到O(logK))和它的股价变化了多少次
每当有新的估价更新,假设应用会调用HashHeap的add函数 输入是当前股价变化的公司ID 然后更新 hashmap 和 根据当前heap size更新companyIdHeap
在更新companyIdHeap的时候 如果这个变化的公司的股价变化次数大于最小堆的root 那么替换掉这个root 然后从0向下调整heap heap调整的比较条件是看谁的股价变化次数少
delete函数直接delete掉一个company O(logK)
poll函数是给heap root的company的股价变化次数减一(其实还没想好这个函数具体应该做什么 暂时把它放在注释里面)
不足之处请指出! 多谢!
package Heap; import java.util.*; public class HashHeap {
//a list of companyId
private List<Integer> companyIdHeap;
private int size_t;
//map from companyId to Node {index in heap and frequent}
private Map<Integer, Node> companyToFrequent;
private String mode; //min or max
private int K;
class Node{
public int index;
public int frequent;
public Node (int index, int fre){
this.index= index;
this.frequent = fre;
}
public Node(Node node){
this.index = node.index;
this.frequent = node.frequent;
}
} public HashHeap(int K){
this.companyIdHeap = new ArrayList<Integer>();
this.size_t =0;
this.companyToFrequent = new HashMap<Integer, Node>();
mode = "min";
this.K = K;
} public int peek(){
if(!companyIdHeap.isEmpty())
return companyIdHeap.get(0);
return -1;
} public int size(){
return size_t;
} public boolean empty(){
return companyIdHeap.size()==0;
} public int parent(int id){
if(id==0){
return -1;
}
return (id-1)/2;
} public int lson(int id){
return 2*id +1;
} public int rson(int id){
return 2*id+2;
} public boolean compare(int companyA, int companyB){
if(companyToFrequent.get(companyA).frequent<companyToFrequent.get(companyB).frequent){
if(mode.equals("min")){
return true;
}else{
return false;
}
}else{
if(mode.equals("min")){
return false;
}else{
return true;
}
}
} public void swap(int indexA, int indexB){
int companyA = companyIdHeap.get(indexA);
int companyB = companyIdHeap.get(indexB);
Node compNodeA = companyToFrequent.get(companyA);
Node compNodeB = companyToFrequent.get(companyB);
companyIdHeap.set(indexA, companyB);
companyIdHeap.set(indexB, companyA);
companyToFrequent.put(companyA, new Node(indexB, compNodeA.frequent));
companyToFrequent.put(companyB, new Node(indexA, compNodeB.frequent));
} public void siftup(int index){
while(parent(index)>-1){
int parent = parent(index);
if(compare(companyIdHeap.get(parent), companyIdHeap.get(index))){
break;
}else{
swap(parent, index);
}
index = parent;
}
} public void siftdown(int index){
while(lson(index)< companyIdHeap.size()){
int leftSon = lson(index);
int rightSon = rson(index);
int son = rightSon;
if(rightSon>=companyIdHeap.size()||compare(companyIdHeap.get(leftSon),companyIdHeap.get(rightSon))){
son = leftSon;
}
if(compare(companyIdHeap.get(index), companyIdHeap.get(son))){
break;
}else{
swap(index, son);
}
index=son;
} } public void add(int company){
//update hashmap
if(companyToFrequent.containsKey(company)){
Node node = companyToFrequent.get(company);
companyToFrequent.put(company, new Node(node.index, node.frequent+1));
}else{
companyToFrequent.put(company, new Node(-1, 1));
}
//update heap
Node node = companyToFrequent.get(company);
if(this.size_t==K){
//if heap need to be updated
if(compare(peek(), company)){
companyIdHeap.set(0, company);
companyToFrequent.put(company, new Node(0, node.frequent));
siftdown(0);
}
return;
}
companyIdHeap.add(company);
size_t++;
companyToFrequent.put(company, new Node(companyIdHeap.size()-1, node.frequent));
siftup(companyIdHeap.size()-1);
} public void delete(int company){
if(companyToFrequent.containsKey(company)){
Node node = companyToFrequent.get(company);
int index = node.index;
swap(index, companyIdHeap.size()-1);
companyIdHeap.remove(companyIdHeap.size()-1);
companyToFrequent.remove(company);
size_t--;
//the condition will be false if index == companyIdHeap.size()-1 before
if(index<companyIdHeap.size()){
siftup(index);
siftdown(index);
}
}
} /*public int poll(){
int res = companyIdHeap.get(0);
Node node = companyToFrequent.get(res);
if(node.frequent==1){
size_t--;
swap(0, companyIdHeap.size()-1);
companyIdHeap.remove(companyIdHeap.size()-1);
companyToFrequent.remove(res);
// the condition will be true is companyIdHeap.size() == 1 before
if(companyIdHeap.size()>0){
siftdown(0);
}
}else{
companyToFrequent.put(res, new Node(0, node.frequent-1));
} return res;
}*/
}
实时输出topk最频繁变动的股价的更多相关文章
- WeQuant交易策略—MACD
MACD(指数平滑异同平均线)策略简介MACD指标应该是大家最常见的技术指标,在很多股票.比特币的软件中都是默认显示的.MACD是从双指数移动平均线发展而来的.意义和双移动平均线基本相同,即由快.慢均 ...
- Redis 与 数据库处理数据的两种模式
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- nuget国内镜像的解决办法
不求人,在阿里云上安一个nuget镜像站,这样就能愉快编程了. 主要是利用nginx 的反向代理+缓存功能+响应文本的替换 proxy_cache_path /data/nuget-cache lev ...
- TDD学习笔记【二】---单元测试简介
大纲 Testing 的第一个切入点:单元测试. 本篇文章将针对单元测试进行简介,主要内容包含了5W: Why What Where Who When 而How 的部分,属于实现部分,将于下一篇文章介 ...
- 常见linux命令释义(第八天)—— Bash Shell 的操作环境
换了新公司,公司的领导很不错.自己感受比较多的地方是,自己的工作效率明显比以前高了.以前会对频繁变动的需求十分不耐烦,现在接到需求后会仔细的思考,进行整体构建.即使以后需求有变动,也能够比较轻易的在原 ...
- DataTable数据检索的性能分析(转寒江独钓)
我们知道在.NET平台上有很多种数据存储,检索解决方案-ADO.NET Entity Framework,ASP.NET Dynamic Data,XML, NHibernate,LINQ to SQ ...
- C# 依赖注入
http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 这篇文章真的非常非常好···绝对值得收藏学习. 目录 目录 1 ...
- 使用IronPython给.Net程序加点料
开发的时候,经常被策划频繁变动的方案而苦恼.这时候就想要加入点动态语言来辅助一下. 在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调用.在卸载的时候遇到了问题,虽可以通过应用程序 ...
- ReactMix框架,让你实现一套js代码,基于ReactNative在H5,App都能完美跑起来,Write Once,Run Anywhere
ReactNative框架推出已经有一段时间了,相信很多小伙伴都在尝试实现Write Once, Run Anywhere的梦想,比如淘宝的ReactWeb等等,但是这些框架都局限于因为ReactNa ...
随机推荐
- 场景:如果一个select下拉框的值被选中,其他两个字段值的校验也生效
$("#operationType").change(function(){ if(this.value==1){ $('[name="assigneeCardType& ...
- jQuery Gantt Edit:(一)参数以及方法说明
jQuery Gantt editor jQuery Gantt Edit(以下简称GE)是一款开源的基于jQuery的甘特图插件,作者:robicch. GitHub地址:https://githu ...
- Java对象、引用、实例
https://blog.csdn.net/zmx729618/article/details/54093075
- bootstrap table 前后端分页(超级简单)
前端分页:数据库查询所有的数据,在前端进行分页 后端分页:每次只查询当前页面加载所需要的那几条数据 下载bootstrap 下载bootstrap table jquery谁都有,不说了 项目结构:T ...
- 论文阅读: Siam FC
一.研究动机 一方面传统算法设计的跟踪模型过于简单,另一方面深度学习方法很难达到实时效果然而现实场景中的应用对速度要求较高. "shallow method"(HCFT)没有很好地 ...
- CentOS 使用firewalld打开防火墙与端口
CentOS 使用firewalld打开防火墙与端口 LinuxCentOS 基本使用 启动 : systemctl start firewalld 关闭 : systemctl stop firew ...
- yii 邮箱封装
<?php class Mailer { private static $obj; private static $config; public static function getMaile ...
- 数据类型 varchar 和 uniqueidentifier 在 add 运算符中不兼容
select '<a href="/'+a.id +'" title="'+ a.title +'">'+a.Title+'</a>' ...
- 从Scratch到Python之角色与造型
从Scratch到Python之角色与造型 继续讲解通过python turtle从积木编程过渡到代码编程的技巧.角色是scratch中很重要的主角,每个角色可以更换不同的造型或者音效,堆叠不同的积木 ...
- contenOs7编码问题