📣 独立日限时特惠: VIP通行证立减$68
楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

滚烫的数据砖头电面

🔗
fatalme 2021-1-19 01:05:20 | 只看该作者
全局:
本帖最后由 fatalme 于 2021-1-19 01:19 编辑

想到一个数据结构:

vector<list<int>>  v;

一个长度为N的数组A分成sqrt(N)段,存在v中
插入删除保持以上性质: 分成sqrt(N)段,每段有sqrt(N)个元素

时间复杂度分析:

query(i) : v[i / sqrt(N)][i - i/sqrt(N) * sqrt(N)],时间复杂度O(sqrt(N)),因为是list
insert(i): 假如插入位置0,需要移动元素:1 +
                                                     (sqrt(N+1) - sqrt(N)) +
                                               2 * (sqrt(N+1) - sqrt(N)) +
                                               3 * (sqrt(N+1) - sqrt(N)) +
                                               ...
                                      sqrt(N) * (sqrt(N+1) - sqrt(N)) =
         (1 + sqrt(N)) * sqrt(N) / 2 * (sqrt(N+1) - sqrt(N)) = O(N/(sqrt(N+1) + sqrt(N)) = O(sqrt(N))

del(i):  假如删除位置0,需要移动元素:1 +                                                    (sqrt(N) - sqrt(N - 1)) +
                                               2 * (sqrt(N) - sqrt(N - 1)) +
                                               3 * (sqrt(N) - sqrt(N - 1)) +
                                               ...
                                      sqrt(N) * (sqrt(N) - sqrt(N - 1)) =
         (1 + sqrt(N)) * sqrt(N) / 2 * (sqrt(N) - sqrt(N - 1)) = O(N/(sqrt(N - 1) + sqrt(N)) = O(sqrt(N))


所以最坏复杂度O(sqrt(N)), which is sublinear

求大米

评分

参与人数 2大米 +4 收起 理由
financeFree + 3 很有用的信息!
zqzned + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
tobebeyond 2021-1-25 07:02:02 | 只看该作者
全局:
基本上就是  手写一个平衡树。。。
回复

使用道具 举报

🔗
tianlu1 2021-1-25 12:51:42 | 只看该作者
全局:
Map<Original_ID, ID_in_List> + List<Character> 不行吗?
回复

使用道具 举报

🔗
yuxudong199 2021-1-28 10:13:31 | 只看该作者
全局:
tianlu1 发表于 2021-1-25 12:51
Map + List 不行吗?

O(n)的插入。显然不行
回复

使用道具 举报

🔗
lz9527 2021-3-16 10:18:04 | 只看该作者
全局:
fatalme 发表于 2021-1-19 01:05
想到一个数据结构:

vector  v;

你这里sqrt(N) - sqrt(N - 1)接近于0了吧
回复

使用道具 举报

🔗
metacpp1982 2021-4-14 06:38:09 | 只看该作者
全局:
fatalme 发表于 2021-1-19 01:05
想到一个数据结构:

vector  v;

有几个问题:
1. (1 + sqrt(N)) * sqrt(N) / 2 * (sqrt(N+1) - sqrt(N)) = O(N/(sqrt(N+1) + sqrt(N)), 这一步是怎么推导出来的, 可以详细解释一下吗?
2. 删除和插入的时候, 第一行的这个移动1个元素为什么呢?

回复

使用道具 举报

🔗
fatalme 2021-4-14 11:57:02 | 只看该作者
全局:
metacpp1982 发表于 2021-4-14 06:38
有几个问题:
1. (1 + sqrt(N)) * sqrt(N) / 2 * (sqrt(N+1) - sqrt(N)) = O(N/(sqrt(N+1) + sqrt(N)),  ...

1. (a - b) = (a^2 - b^2)/(a + b)  因为初中的因式分解: a^2 - b^2 = (a + b) (a - b)
2. 推导不严格,可以插入任何一个位置,推导类似。结论不变。
回复

使用道具 举报

🔗
metacpp1982 2021-4-14 14:40:34 | 只看该作者
全局:
fatalme 发表于 2021-4-14 11:57
1. (a - b) = (a^2 - b^2)/(a + b)  因为初中的因式分解: a^2 - b^2 = (a + b) (a - b)
2. 推导不严格 ...

原来如此, 很精妙.

插入/删除任何位置后, 从第一个block开始逐个移动元素进行调整, 根据公式, 每个block只需和下一个block之间进行元素相互移动吧.
回复

使用道具 举报

🔗
lz9527 2021-4-17 08:08:17 | 只看该作者
全局:
metacpp1982 发表于 2021-4-14 14:40
原来如此, 很精妙.

插入/删除任何位置后, 从第一个block开始逐个移动元素进行调整, 根据公式, 每个blo ...

sqrt(N+1)  和 sqrt(N)要么相等要么多一,比如sqrt(100) = sqrt(99)+1,这样的话(sqrt(N+1) - sqrt(N))要么0要么1.

所以(1 + sqrt(N)) * sqrt(N) / 2 * (sqrt(N+1) - sqrt(N))就是(1 + sqrt(N)) * sqrt(N) / 2?也就是O(N)?
回复

使用道具 举报

🔗
kazumi 2021-5-23 01:11:55 | 只看该作者
全局:
我一朋友从内部题库看到这题了,其实大家都被误导了。小提示:不要去实现什么平衡树了,用bucket算法就行,比如用个5个元素的bucket,那算法是O(N/5)。这就算sub-linear
回复

使用道具 举报

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

本版积分规则

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