diff --git a/src/class29/Code01_FindMinKth.java b/src/class29/Code01_FindMinKth.java index aefb6d9..e317550 100644 --- a/src/class29/Code01_FindMinKth.java +++ b/src/class29/Code01_FindMinKth.java @@ -30,6 +30,7 @@ public class Code01_FindMinKth { } // 改写快排,时间复杂度O(N) + // k >= 1 public static int minKth2(int[] array, int k) { int[] arr = copyArray(array); return process2(arr, 0, arr.length - 1, k - 1); @@ -53,10 +54,6 @@ public class Code01_FindMinKth { } // 不止一个数 L + [0, R -L] int pivot = arr[L + (int) (Math.random() * (R - L + 1))]; - - // range[0] range[1] - // L ..... R pivot - // 0 1000 70...800 int[] range = partition(arr, L, R, pivot); if (index >= range[0] && index <= range[1]) { return arr[index]; @@ -100,6 +97,10 @@ public class Code01_FindMinKth { if (L == R) { return arr[L]; } + // L...R 每五个数一组 + // 每一个小组内部排好序 + // 小组的中位数组成新数组 + // 这个新数组的中位数返回 int pivot = medianOfMedians(arr, L, R); int[] range = partition(arr, L, R, pivot); if (index >= range[0] && index <= range[1]) { diff --git a/src/class29/Code03_ReservoirSampling.java b/src/class29/Code03_ReservoirSampling.java index e4d0710..c2ce9e3 100644 --- a/src/class29/Code03_ReservoirSampling.java +++ b/src/class29/Code03_ReservoirSampling.java @@ -38,7 +38,38 @@ public class Code03_ReservoirSampling { } + // 请等概率返回1~i中的一个数字 + public static int random(int i) { + return (int) (Math.random() * i) + 1; + } + public static void main(String[] args) { + System.out.println("hello"); + int test = 10000; + int ballNum = 17; + int[] count = new int[ballNum + 1]; + for (int i = 0; i < test; i++) { + int[] bag = new int[10]; + int bagi = 0; + for (int num = 1; num <= ballNum; num++) { + if (num <= 10) { + bag[bagi++] = num; + } else { // num > 10 + if (random(num) <= 10) { // 一定要把num球入袋子 + bagi = (int) (Math.random() * 10); + bag[bagi] = num; + } + } + + } + for (int num : bag) { + count[num]++; + } + } + for (int i = 0; i <= ballNum; i++) { + System.out.println(count[i]); + } + System.out.println("hello"); int all = 100; int choose = 10;