期望为线性时间的选择算法
2014-10-16 10:32
411 查看
randomized_select函数的期望运行时间是Θ(n),这里假设输入数据都是互异的.它返回数组A[p, r]中第i小的元素.该函数最坏情况运行时间为Θ(n2),即使是找最小元素也是如此,以为在每次划分时可能极不走运地总是按余下的元素中最大的来进行划分,而划分操作需要Θ(n)时间.我们也将看到该算法有线性的期望运行时间,又因为它是随机化的,所以不存在一个特定的会导致其最坏情况发生的输入数据.
输入:数组A,整数i(i不大于数组的个数).
输出:数组A中第i小的元素.
期望运行时间:Θ(n).最坏运行时间:Θ(n2).
下面是剑指offer上面的一段代码,求数组中出现次数超过一半的数字:
输入:数组A,整数i(i不大于数组的个数).
输出:数组A中第i小的元素.
期望运行时间:Θ(n).最坏运行时间:Θ(n2).
#include <stdio.h> #include <stdlib.h> #include <time.h> static int randomized_select(int *, int, int, int); static int randomized_partition(int *, int, int); static int partition(int *, int, int); static int randomd(int, int); static void swap(int *, int *); int main(int argc, char *argv[]) { int mid; int array[9] = {1,2,4,7,3,5,6,8,12}; /*返回第5小的元素.*/ mid = randomized_select(array, 0, 8, 5); printf("%d\n", mid); return 0; } static int randomized_select(int *A, int p, int r, int i) { int q, k; if (p == r) return A[p]; q = randomized_partition(A, p, r); k = q - p + 1; if (i == k) return A[q]; else if (i < k) return randomized_select(A, p, q - 1, i); else return randomized_select(A, q + 1, r, i - k); } static int randomized_partition(int *A, int p, int r) { int i, temp; i = randomd(p, r); swap(A + r, A + i); /* temp = A[r]; A[r] = A[i]; A[i] = temp; */ return partition(A, p, r); } /*划分,跟快速排序一样.*/ static int partition(int *A, int p, int r) { int a, i, j, temp; a = A[r]; i = p - 1; for (j = p; j < r; ++j) { if (A[j] <= a) { ++i; swap(A + j, A + i); /* temp = A[j]; A[j] = A[i]; A[i] = temp; */ } } swap(A + r, A + i + 1); /* temp = A[r]; A[r] = A[i + 1]; A[i + 1] = temp; */ return i + 1; } /*返回特定范围[a, b]内的一个随机数.*/ static int randomd(int a, int b) { int q; srand((unsigned int)time(NULL)); q = rand()%(b - a + 1) + a; return q; } /*交换值.*/ static void swap(int *num1, int *num2) { int temp; temp = *num1; *num1 = *num2; *num2 = temp; }
下面是剑指offer上面的一段代码,求数组中出现次数超过一半的数字:
int MoreThanHalfNum(int *numbers, int length) { if (CheckInvalidArray(numbers, length)) return 0; int middle = length >> 1; int start = 0; int end = length - 1; int index = Partition(numbers, length, start, end); while (index != middle) { if (index > middle) { end = index - 1; index = Partition(numbers, length, start, end); } else { start = index + 1; index = Partition(numbers, length, start, end); } } int result = numbers[middle]; if (!CheckMoreThanHalf(numbers, length, result)) return 0; return result; }
相关文章推荐
- 第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法
- 期望为线性时间的选择算法
- 第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法
- 选择问题的线性期望时间算法
- 期望为线性时间的选择算法RANDOM_SELECT
- 算法之分治——期望线性时间的选择(基础版本的选择)
- 期望为线性时间的选择算法randomizedSelect
- 期望时间为线性时间的选择算法(C++)
- 算法--顺序统计-期望线性时间做选择
- 期望为线性时间的选择算法(c语言)
- 算法导论程序19-期望为线性时间的选择算法(Python)
- 算法导论:第9章 中位数和顺序统计量_1期望为线性时间的选择算法
- 小白进阶之期望为线性时间的选择算法
- Java 期望为线性时间的选择算法
- CLRS 9.2期望为线性时间的选择算法
- 算法导论,9.3,最坏情线性时间的选择算法
- 顺序统计量和中位数——线性时间的选择算法
- 《算法导论》笔记 第9章 9.2以期望线性时间做选择
- 线性时间选择算法——源码(正确运行哦)
- 算法之线性时间选择(最坏情况下)