【发布时间】:2018-11-18 00:05:57
【问题描述】:
我最近接受了一家社交媒体公司的采访,我被问到以下问题。
有 k 个长度为 m 的未排序数组。目标是在给定 a b m。在后续问题中,将“未排序的数组”更改为跨 MySQL 数据库中不同表的列,可以使用哪些高效的数据结构以及相应的检索算法是什么。
我想出了两种可能的解决方案:
第一:暴力破解:
- 首先使用快速选择找到每个数组的第 b 个最小元素。
- 然后找到小于每个数组的b-th元素的元素,存入一个大小为k * b B-tree C。
- 然后在C中找到a-th到b-th个最小的元素。
第一步使用快速选择找到b-th个最小元素,平均时间是从O(km)到O(km * log(m)) 总计。第 2 步的时间复杂度为 O(km)。最后一步是找到 C 中 a-th 和 b-th 最小元素之间的元素,取 O((ba)日志(kb))。所以总共需要 O(km) 到 O(km * log(m)) + O((ba)log(kb )) 在时间上,在空间上 O(kb)。
第二:递归弹出最小的元素
对于每个循环,做
- 找到所有k个数组的最小元素,存储在B-treeC中
- 在C中找到最小的元素,并从C中弹出这个元素,并从它来的数组中弹出。
- 重复直到弹出a-1个数字,然后转到4
- 将值从 a 存储到 b,同时重复 1 到 2
所以计算复杂度是O(k * log(k)) + O(b * log(k) ),空间复杂度为O(max( k , ba ))。这似乎是最小的空间复杂度。
有哪些更有效的方法来做到这一点?尤其是快速选择最坏的情况是O(n^2),这似乎太大了,而对于b = m/2正好在中位数O(kb ) 在空间或 O(b * log(k)) 在时间被认为太大。对于 MySQL 数据库,我建议使用 B-tree,它在解决方案 1 中提供快速排名选择,同时在空间和时间上仍然存在 O(kb),k 查询数据库。在解决方案 2 中,据说对 MySQL 数据库的 b 查询太大并且 B-tree 插入是 O(log(m)) 其中 m 可能非常大.
【问题讨论】:
-
你有这份工作吗?
标签: python mysql algorithm sorting time-complexity