楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

数据砖头电面

🔗
metacpp1982 2021-4-14 04:49:46 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-KFBXW  2021-4-14 05:08:04
metacpp1982 发表于 2021-4-14 04:49
有道理. 这里的K, 也就是block的大小, 是在什么时间点去更新呢? 比如15个元素的情况, k是等于3. 那么再插 ...

是的 我是每次都算一下
回复

使用道具 举报

🔗
metacpp1982 2021-4-14 07:04:44 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-KFBXW  2021-4-15 04:14:22
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

全局:
可以用类似力扣 LRU Cache的数据结构吗?map+list数据结构,可以让每个操作在O(1)或者(logn)复杂度。这个方法对比楼主提出的方法,在申请空间的时候单位是1而不是block,所以会差一些,但是代码写起来比较有底一些。好奇楼主的block和b+ tree的实现怎么做到的,因为我想想觉得很复杂啊。
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-LMH2U  2021-4-18 01:22:01
斗胆发一个自己写过的
两周前店面pass

  1. class BlockList {
  2.     struct Block {
  3.       vector<char> data;  
  4.      };

  5.     typedef list<Block>::iterator blockIter;
  6.     typedef vector<int>::iterator dataIter;
  7.     list<Block> blockList;
  8.     int totalSize = 0;
  9.     int blockSize = 0;
  10.     public :
  11.     void insert(char c, int pos){
  12.         totalSize ++;
  13.         blockSize = sqrt(totalSize);
  14.         if (blockList.empty()) {
  15.             auto iter = blockList.insert(blockList.begin(), Block());
  16.             iter->data.emplace_back(c);
  17.          } else {
  18.             auto iter = find(pos);
  19.             if (iter == blockList.end()) {
  20.                 blockList.back().data.emplace_back(c);
  21.             } else {
  22.                 iter->data.insert(iter->data.begin()+pos, c);
  23.             }
  24.         }
  25.         maintain();
  26.     }
  27.    
  28.     void maintain(){
  29.         // split bigger
  30.         // merge smaller
  31.         for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
  32.             if (iter->data.size() > 2 * blockSize) {
  33.                 Block b;
  34.                 b.data.assign(iter->data.begin(), iter->data.begin() + blockSize);
  35.                 blockList.insert(iter, b);
  36.                 iter->data.erase(iter->data.begin(), iter->data.begin() + blockSize );
  37.             }
  38.         }
  39.         for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
  40.             auto nextIter = next(iter);
  41.             if (nextIter != blockList.end() && iter->data.size() + nextIter->data.size() <blockSize) {
  42.                 iter->data.insert(iter->data.end(), nextIter->data.begin(), nextIter->data.end());
  43.                 iter = blockList.erase(nextIter);
  44.             }
  45.         }
  46.     }
  47.    
  48.     blockIter find(int& pos) {
  49.         int sum = 0;
  50.         for(auto iter = blockList.begin(); iter != blockList.end(); iter ++) {
  51.             sum += iter->data.size();
  52.             if (sum>pos) {
  53.                 pos -= sum - iter->data.size();
  54.                 return iter;
  55.             }
  56.         }
  57.         return blockList.end();
  58.     }
  59.    
  60.     void erase(int pos){
  61.         auto iter = find(pos);
  62.         if (iter != blockList.end()) {
  63.              totalSize --;
  64.              blockSize = sqrt(totalSize);
  65.             iter->data.erase(iter->data.begin() + pos);
  66.         }
  67.         maintain();t
  68.     }
  69.     char get(int pos) {
  70.         auto iter = find(pos);
  71.         if (iter == blockList.end()) return '.';
  72.         else return iter->data[pos];
  73.     }
  74.    
  75.     void print() {
  76.         for(Block b : blockList) {
  77.             cout << "| " ;
  78.             for (char c : b.data) {
  79.                 cout << c << " ";
  80.             }
  81.         }
  82.      cout <<endl;
  83.     }
  84.    

  85.    

  86. };



  87. int main() {
  88.     BlockList bl;
  89.     bl.insert('a', 10);
  90.     bl.insert('b', 10);

  91.     bl.insert('c', 10);

  92.     bl.insert('d', 10);

  93.     bl.insert('e', 1);
  94.         bl.insert('e', 1);

  95.         bl.insert('e', 1);

  96.         bl.insert('e', 1);

  97.     bl.insert('e', 1);
  98.     bl.print();
  99.     cout << bl.get(7) << endl;
  100.     bl.erase(7);
  101.     bl.print();
  102.     bl.erase(7);
  103.     bl.erase(4);
  104.     bl.erase(4);
  105.     bl.print();
  106.     bl.erase(3);

  107.     bl.print();
  108. }
复制代码

评分

参与人数 10大米 +15 收起 理由
gwynsmile + 1 很有用的信息!
hbsophia + 1 点赞
ilstxfe + 3 很有用的信息!
allenyao0702 + 1 给你点个赞!
咸鸭蛋 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

地里匿名用户
🔗
匿名用户-KFBXW  2021-4-21 01:39:04
ShowMeTheOffer 发表于 2021-4-17 00:52
可以用类似力扣 LRU Cache的数据结构吗?map+list数据结构,可以让每个操作在O(1)或者(logn)复杂度。这个方 ...

我也觉得有点复杂,现在想想我觉得我的方法可能也不是特别的好,但是过了,可能我解释的比较好吧。。。
回复

使用道具 举报

全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
jifengyzh 2021-10-29 03:48:38 | 只看该作者
全局:
楼主你这个解法挺有意思,但是不是b+ tree 啊
回复

使用道具 举报

🔗
dpjiuzhu 2021-10-29 04:38:37 | 只看该作者
全局:
也面到了这道题,写了简化版b+树解决的,但是似乎不是面试官期望的答案,因为说我这个solution比较hard code而且沟通过程中感觉他有些地方没get到,后来思考了一下,面试官想要的应该是块状链表的那种,写起来的确会比b+树轻松很多,并且也满足要求
回复

使用道具 举报

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

本版积分规则

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