You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.7 KiB

数据结构

  • 数据结构是存储、组织数据的方式
  • 精心选择的数据结构可以带来更高的运行或者存储效率
  • 数据结构是很多算法得以进行的载体

最基本的数据结构

  • 数组 按照下标寻址的时间复杂度为O(1),不便于增删数据
  • 链表 便于增删数据,不便于寻址

前缀和数组

可以考虑使用二维数组保存前缀和,避免每次做减法。

private static int preSum(int[] arr, int left,int right) {
    int length = arr.length;
    int[] preSum = new int[length];
    for (int i = 0; i < length; i++) {
        if (i == 0) {
            preSum[i] = arr[i];
        } else {
            preSum[i] = preSum[i - 1] + arr[i];
        }
    }
    return left == 0 ? preSum[right] : preSum[right] - preSum[left];
}

从1-5随机到1-7随机 从a-b随机到c-d随机 01不等概率随机到01等概率随机

    private static int f1(){
        return (int) (Math.random() * 5) + 1;
    }

    private static int f2(){
        int ans = 0;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    // 000 - 111 等概率
    private static int f3(){
        return f2() << 2 + f2() << 1 + f2();
    }

固定概率方法等概率返回0或者1

// 固定概率返回0或者1
private static int x(){
    return Math.random() < 0.84 ? 0 : 1;
}

// 等概率返回0或者1
private static int y() {
    int ans = 0;
    do {
        ans = x();
    } while (ans == x());
    return ans;
}

生成随机数组,判断排序结果

public static void main(String[] args) {
    int maxLen = 50;
    int maxValue = 3000;
    int times = 10000;
    for (int i = 0; i < times; i++) {
        int[] arr = randomArr(maxLen, maxValue);
        int[] tmp = copyArr(arr);
        //        selectionSort(arr);
        //        bubbleSort(arr);
        insertSort(arr);
        boolean result = validateArr(arr);
        if (!result) {
            for (int j = 0; j < arr.length; j++) {
                System.out.print(tmp[j] + " ");
            }
            System.out.println();
            System.out.println("排序结果错误");
            break;
        }
    }

}

private static int[] copyArr(int[] arr){
    int[] ans = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        ans[i] = arr[i];
    }
    return ans;
}

private static boolean validateArr(int[] arr) {
    if (arr.length < 2) {
        return true;
    }
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (max > arr[i]) {
            return false;
        }
    }
    return true;
}

小和问题、逆序对、大于两倍问题 区间和leetcode327 可以用有序表、归并解决 荷兰国旗问题