123
返回列表 发新帖
楼主: westcoastboy
跳转到指定楼层
上一主题 下一主题
收起左侧

Bloomberg经典面经题讨论

🔗
huzhouwjj 2018-1-30 06:48:36 | 只看该作者
全局:
可能是我菜,欢迎纠正!
我不理解,为什么double-linkedlist里的删除/更新是O(1)? 不应该是先去search你要删除/更新的node(which takes O(n) time) 再去删除/更新吗?
如果是这样的话,第一和第二种解法唯一的区别就是,第一种是用treemap把不同sensor给sort连接起来,第二种是用一个linkedlist。个人觉得第一种比较好,毕竟treemap的搜索只需要O(logn),先定位checkpoint,再更新对应的runner。我不太理解第二种怎么把linkedlist和linkedlist连接起来的……纯连的话,岂不是太长太慢了
回复

使用道具 举报

🔗
lavender41 2018-2-19 09:03:02 | 只看该作者
全局:
huzhouwjj 发表于 2018-1-30 06:48
可能是我菜,欢迎纠正!
我不理解,为什么double-linkedlist里的删除/更新是O(1)? 不应该是先去search你要 ...

其实就是LFU的变种,每个checkpoint维护一个linkedhashset,插入删除就可以O(1)了。
回复

使用道具 举报

🔗
helloworld00 2018-3-9 20:19:16 | 只看该作者
全局:
写个我自己的思考,还请大神指点一下

1. sensor/check_pointer那用一个list记录当前sensor有多少个runners;并且有个hashmap记录每个runner_id 和 runner_list的iterator
2. sensor 写一个deleteRunner() ;根据提供的runnerid把当前list和hashmap上的runner_id删除 //  这个runner已经从这个sensor到了另外一个
3. MarathonBoard 的 update( runner_id, sensor_id ) 主要有2步
  3.1) 先根据runner_id 从他之前sensor list里删除
  3.2)再把这个runner_id 放到现在这个sensor_id 里的runner_list 后面去  // 假设每个新的runner都是在这个sensor的runner_list的最后

4. 最后打印top K, 假设sensor都是按先后顺序排好的(如果不是,可以把list改成multiset然后写个compartor),直接把每个sensor上的runner都打印出来就是的了







class Sensor
{
    int s_id;
    int s_distance;
    list<int> runner_list;   // a list of runner_id at this sensor/check_pointer
    unordered_map<int, list<int>::iterator> runner_m_sensor;    // {runner_id : list<runner_id>::iterator}
public:
    Sensor(int id, int dist):s_id(id), s_distance(dist){ }

    void deleteRunner(int runner_id){
        auto it = runner_m_sensor.find(runner_id);
        if (it == runner_m_sensor.end()) return;

        runner_list.erase( runner_m_sensor[runner_id] );
        runner_m_sensor.erase(runner_id);
    }
};

class MarathonBoard{
    list<Sensor> sensor_list;

    unordered_map<int, list<Sensor>::iterator> sensor_m; // {sensor_id: sensor_list::iterator}
    unordered_map<int, int> runner_m;   // {runner_id: sensor_id}

public:
    MarathonBoard(){}
    void update(int runner_id, int sensor_id){
        // 1. delete the runner from his/her previous sensor's runner list      
        int old_sensor_id = runner_m[runner_id];
        auto old_sensor_it = sensor_m[old_sensor_id];
        // delete it from previous runner list
        old_sensor_it->deleteRunner(runner_id);

        // 2. push_back(runner_id) at current sensor's runner list
        // update it to current sensor
        sensor_m[sensor_id]->runner_list.push_back(runner_id);
    }

    void printTopK(int k){
        for (auto &s : sensor_list)
        {
            for (auto &r : s.runner_list)
            {
                if (k >= 0)
                    cout << "Runner id: " << r << endl;
                k--;
            }
        }
    }
};
回复

使用道具 举报

🔗
candicedjy 2018-5-11 13:35:11 | 只看该作者
全局:
感谢楼主的分享谢谢
回复

使用道具 举报

🔗
martinliu2218 2018-6-16 02:32:08 | 只看该作者
全局:
这个题目不就是LFU吗....每次过checkpoint就是过相当于增加了一个频率,没看出来哪儿不一样,求大神指点
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
🔗
 楼主| westcoastboy 2019-2-12 11:07:03 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 110 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 110 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表