【发布时间】:2018-07-17 09:26:27
【问题描述】:
我在面试时被问到这样一个问题:
给定股票的价格:
MS | 500
Apl | 1000
Nefx| 500
MS | 500
每次有新库存出现时,我们都必须添加到现有库存中,或者如果它是新库存,则只会让其感到不适。所以这个结果应该是MS - 1000, Apl - 1000, Nefs - 500.
我们应该有两个功能:
void add(string, int); // adds new stock
void display(unsigned n); // displays top n stocks
所以我是这样实现的:
unordered_map<string, int> UM;
void add(string s, int n)
{
auto iter = M.find(s);
if(s==M.end())
{
M[str] = n;
}
else
{
M[str] += n;
}
}
void display(unsigned n)
{
std::map<int,string> M;
for(auto iter = UM.begin(); iter!=UM.end(); ++iter)
{
M.insert(make_pair(iter->second, iter->first));
}
for(auto iter = M.rbegin(); iter!=M.rend(); ++iter)
{
if(n==0){break;}
cout<<iter->second<<" "<<iter->first<<endl;
n--;
}
}
虽然add函数非常有效,如果散列完美的话O(1),但是dislpay太慢了,O(NlogN) + n。无论我们必须显示多少项目,我们都会操作所有项目。有没有更有效的方法来解决这个问题,即使它需要改变 add 函数??
【问题讨论】:
-
@Someprogrammerdude 为什么哈希完美时找不到 O(1)?
-
使用最大堆怎么样?
-
我需要前N个价值股@Someprogrammerdude,如何在UM中找到未排序的?
-
您不需要在
add函数中调用find。并且请清楚需求,不清楚的需求是程序员和开发者痛苦的一大原因。 -
这可以通过一个结构
using PriceAndTickers = std::set<std::pair<int, std::string>>;和另一个查找结构std::unordered_map<std::string, PriceAndTickers::iterator>来完成。使用此解决方案,添加为 O(log N),显示为 O(n)。