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

Microsoft(2) 找出第k大的数

 
🔗
darksteel 2011-4-20 11:11:58 | 只看该作者
全局:
回复 8# argumentt
其实这些东西也就当个现成结论用用,那个期望为什么是Theta(n)的证明估计就很少有人认真看。你说的东西都是这个问题的一些更深入研究了,估计很难一下想清楚。如果你研究算法,这些问题可能都是能发出paper的。
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-4-20 11:47:29 | 只看该作者
全局:
回复  vvnesaa
这个问题在算法导论上有讨论,就是那个RANDOMIZED-SELECT问题吧,期望时间为Theta(n)的

...
darksteel 发表于 2011-4-19 22:05


就是把快排的一次iteration从头开始的那个改成random就是了,还是快排的思想,没多大变化
回复

使用道具 举报

🔗
darksteel 2011-4-20 12:04:12 | 只看该作者
全局:
回复 13# wwwyhx
有点那个意思,都是随机找个pivot,只不过快排要递归两边这个只要处理一边,复杂度就降下来了


   
回复

使用道具 举报

🔗
benny 2011-4-25 10:55:35 | 只看该作者
全局:
wiki上有一个页面专门讲这个selection problem的en.wikipedia.org/wiki/Selection_algorithm

其中有一个Median of median 的方法,保证最差情况也是O(n)的
话说开发这方法的第一作者就图灵奖- -||

回复

使用道具 举报

🔗
sing1ee 2012-10-1 08:29:49 | 只看该作者
全局:
有个median of media,最差O(n)
  1. #include <iostream>

  2. using namespace std;

  3. int select(int array[], int left, int right, int k) {
  4.     int len = right - left;
  5.     if (len <= 10) {
  6.         for (int i = left + 1; i < right; ++i) {
  7.             for (int j = i; j > left; --j) {
  8.                 if (array[j] < array[j - 1]) {
  9.                     array[j - 1] = array[j - 1]^array[j];
  10.                     array[j] = array[j - 1]^array[j];
  11.                     array[j - 1] = array[j - 1]^array[j];
  12.                 }
  13.             }
  14.         }
  15.         return left + k - 1;
  16.     }
  17.     int group_nums = len / 5;
  18.     int x[group_nums];
  19.     for (int i = 0; i < group_nums; ++i) {
  20.         x[i] = array[select(array, left + i * 5, left + (i + 1) * 5, 3)];
  21.     }
  22.     int median = select(x, 0, group_nums, len / 10);
  23.     for (int i = left; i < right; ++i)
  24.         if (x[median] == array[i]) {
  25.             median = i;
  26.             break;
  27.         }
  28.     array[left] = array[left]^array[median];
  29.     array[median] = array[left]^array[median];
  30.     array[left] = array[left]^array[median];
  31.     int i = left + 1;
  32.     int j = right - 1;
  33.     while (i < j) {
  34.         while (array[i] < array[left]) ++i;
  35.         while (array[j] > array[left]) --j;
  36.         if (j <= i) break;
  37.         array[i] = array[i]^array[j];
  38.         array[j] = array[i]^array[j];
  39.         array[i] = array[i]^array[j];
  40.     }
  41.     array[left] = array[left]^array[j];
  42.     array[j] = array[left]^array[j];
  43.     array[left] = array[left]^array[j];
  44.     int t = j - left + 1;
  45.     if (k == t) return j;
  46.     if (k < t)
  47.         return select(array, left, j , k);
  48.     else
  49.         return select(array, j + 1, right, k - t);
  50. }

  51. int main() {
  52.     int n = 20;
  53.     //cout << "input array size n" << endl;
  54.     //cin >> n;
  55.     int array[n];
  56.     //cout << "input array element:" << endl;
  57.     for (int i = 0; i < n; ++i) {
  58.         array[i] = n - i;
  59.     }

  60.     cout << array[select(array, 0, n, 11)] << endl;
  61.     cout << "k\tvalue" << endl;
  62.     for (int i = 1; i <= n; ++i) {
  63.         cout << i << "\t" << array[select(array, 0, n, i)] << endl;
  64.     }
  65.     return 0;
  66. }
复制代码
回复

使用道具 举报

🔗
xyqshi 2012-10-9 03:02:41 | 只看该作者
全局:
wwwyhx 发表于 2011-4-19 21:23
MM 太聪明了。。。

。。。。。。quicksort是O(nlog(n))啊。。。worst case是O(n*n)的。。。。
回复

使用道具 举报

🔗
285845348 2012-10-9 03:09:39 | 只看该作者
全局:
本帖最后由 285845348 于 2012-10-8 12:10 编辑

Partition O(n)
回复

使用道具 举报

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

本版积分规则

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