第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法


package chap09_Medians_and_Order_Statistics;

import static org.junit.Assert.*;

import java.util.Random;

import org.junit.Test;

public class SearchAlorithms {
/**
* 分割(快速排序中对数组的分割)
*
* @param n
* @param start
* @param end
* @return
*/
protected static int partition(int[] n, int start, int end) {
int p = end - 1;
int s = start;// s位于大于a[p]和小于a[p]之间的位置
int tmp;
for (int i = start; i < end; i++) {
if (n[i] < n[p]) {
tmp = n[i];
n[i] = n[s];
n[s] = tmp;
s++;
}
}
{
tmp = n[s];
n[s] = n[p];
n[p] = tmp;
}
return s;
}

/**
* 随机分割,将一个数组从随机选择的位置处分割,左边小,右边大
*
* @param n
* @param start
* @param end
* @return
*/
static protected int randomPartition(int[] n, int start, int end) {
Random rand = new Random(23);
int t = rand.nextInt(end - start) + start;
int tmp;
{
tmp = n[t];
n[t] = n[end - 1];
n[end - 1] = tmp;
}
return partition(n, start, end);
}

/**
* 搜索数组n中从start到end之间第k小的数字
*
* @param n
* @param start
* @param end
* @param k
* @return
*/
static int randomSearch(int[] n, int start, int end, int k) {
if (start == end - 1)
return n[start];
int q = randomPartition(n, start, end);
int p = q - start + 1;
if (k == p)
return n[q+1];
else if (k > p)
return randomSearch(n, q, end, k - q);
else
return randomSearch(n, start, q, k);
}

@Test
public void testName() throws Exception {
int[] n = { 13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11 };
int a = randomSearch(n, 0, 12, 1);
System.out.println(a);
}

}

第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法

时间: 2024-12-22 18:41:02

第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法的相关文章

期望为线性时间的选择算法

randomized_select函数的期望运行时间是Θ(n),这里假设输入数据都是互异的.它返回数组A[p, r]中第i小的元素.该函数最坏情况运行时间为Θ(n2),即使是找最小元素也是如此,以为在每次划分时可能极不走运地总是按余下的元素中最大的来进行划分,而划分操作需要Θ(n)时间.我们也将看到该算法有线性的期望运行时间,又因为它是随机化的,所以不存在一个特定的会导致其最坏情况发生的输入数据. 输入:数组A,整数i(i不大于数组的个数). 输出:数组A中第i小的元素. 期望运行时间:Θ(n)

期望为线性时间的选择算法RANDOM_SELECT

1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 void swap(int *a, int *b) 5 { 6 int *c = a; 7 a = b; 8 b = c; 9 } 10 int Partition(int *A, int p, int r)// 划分 11 { 12 int x = A[r]; 13 int i = p - 1; 14 for (int j = p; j < r;

平均期望为线性时间的选择算法

从一组无序数据中选择出第i小的元素,采用了快速排序的思想. #include <iostream> #include <algorithm> using namespace std; int partition(int a[], int l, int r){ int key = a[l]; int i=l; swap(a[l],a[r]); for(int j=l;j<r;j++) if(a[j]<key) swap(a[i++],a[j]); swap(a[i],a[

算法导论第九章中位数和顺序统计量(选择问题)

本章如果要归结成一个问题的话,可以归结为选择问题,比如要从一堆数中选择最大的数,或最小的数,或第几小/大的数等, 这样的问题看似很简单,似乎没有什么可研究的必要,因为我们已经知道了排序算法,运用排序+索引的方式不就轻松搞定了?但细想,排序所带来的时间复杂度是不是让这个问题无形之中变得糟糕.那算法研究不就是要尽可能避免一个问题高复杂度地解决,让那些不敢肯定有无最优解的问题变得不再怀疑,这也是算法研究者所追求的一种极致哲学.既然排序让这个问题解决的性能无法确定,那我们就抛开排序,独立研究问题本身,看

【算法导论】学习笔记——第9章 中位数和顺序统计量

在一个由n个元素组成的集合中,第i个顺序统计量(order statistic)是该集合中第i小的元素.用非形式化的描述来说,一个中位数(median)使它所属集合的“中点元素”.当n为奇数时,中位数是唯一的,位于i=(n+1)/2处.当n为偶数时,存在两个中位数,分别位于i=n/2和i=n/2+1处.因此不考虑n的奇偶性,中位数总是出现在i=floor((n+1)/2)处(下中位数)与i=ceil((n+1)/2)处(上中位数).本章将讨论一个由n个互异的元素构成的集合中选择第i个顺序统计量的

算法导论9.2以期望线性时间做选择

#include <stdint.h> #include <time.h> #include <iostream> #ifdef __linux #include <stdio.h> #include <stdlib.h> #endif void swap(int64_t* A, uint64_t i, uint64_t j) { int64_t tmp = A[i]; A[i] = A[j]; A[j] = tmp; } int64_t par

算法导论-中位数和顺序统计量

在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素.一个中位数是它所属集合的“中点元素”.当n为奇数时,中位数是唯一的,位于i=(n+1)/2处:当n为偶数时,存在两个中位数,分别位于i=n/2和i=n/2+1处.如果不考虑n的奇偶性,中位数总是出现在i=⌊(n+1)/2⌋处(下中位数)和i=⌈(n+2)/2⌉(上中位数). 1.最小值和最大值 在一个有n个元素的集合中,需要做n-1次(上界)比较才能找到最小值或最大值. int MiniValue(const int *A,

算法导论—中位数与顺序统计量

一.选择最大值或者最小值的最优算法 对于长度为n的数组,已证找最大值或者最小值比较操作下界就是n-1.所以只需要让第一个值为初始最大值或者初始最小值,用所有的值与这个值比较,更新这个值即可. def minimum(a): minNum=a[0] for i in range(1,len(a)): if minNum>a[i]: minNum=a[i] return minNum print(minimum ([1,2,3,4,5,6,7,8,9])) 二.同时选择最大值和最小值的快速算法(成对

(转)算法导论—中位数与顺序统计量

http://m.blog.csdn.net/blog/zhangzhengyi03539 http://m.blog.csdn.net/blog/zhangzhengyi03539/46795831 一.选择最大值或者最小值的最优算法 对于长度为n的数组,已证找最大值或者最小值比较操作下界就是n-1.所以只需要让第一个值为初始最大值或者初始最小值,用所有的值与这个值比较,更新这个值即可. def minimum(a): minNum=a[0] for i in range(1,len(a)):