1.数据结构
1)数据结构是存储、组织数据的方式
2)精心选择的数据结构可以带来更高的运行或者存储效率
3)数据结构是很多算法得以进行的载体
2.最基本的数据结构
1)数组
便于寻址,不便于增删数据
2)链表
便于增删数据,不便于寻址
3.前缀数组
假设有一个数组arr,用户总是频繁的查询arr中某一段的累加和
你如何组织数据,能让这种查询变得便利和快捷?
public class demo3 {
private static int[] arr;
public static void main(String[] args) {
int[] arr={1,2,5,2,3,5,9,4};
int[] presum=new int[arr.length];
presum[0]=arr[0];
for (int i = 1; i < arr.length; i++) {
presum[i]=presum[i-1]+arr[i];
}
print(presum);
int sum=presum(presum,3,5);
System.out.println(sum);
RangeSum1(arr);
int sum1=rangeSum(3,5);
System.out.println(sum1);
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static int presum(int[] arr,int begin,int end) {
return begin==0?arr[end]:arr[end]-arr[begin-1];
}
public static void RangeSum1(int[] array) {
arr = array;
}
public static int rangeSum(int L, int R) {
int sum = 0;
for (int i = L; i <= R; i++) {
sum += arr[i];
}
return sum;
}
}
4.介绍随机函数
Java中的Math.random()函数
5.补充题目
如果利用Math.random()函数,
把得到[0,x)范围上的数的概率从x调整成x^2
public static void main(String[] args) {
System.out.println("测试开始");
int testTimes = 10000000;
int count = 0;
count = 0;
double x = 0.17;
for (int i = 0; i < testTimes; i++) {
if (xToXPower2() < x) {
count++;
}
}
System.out.println((double) count / (double) testTimes);
System.out.println((double) 1 - Math.pow((double) 1 - x, 2));
}
public static double xToXPower2() {
return Math.max(Math.random(),Math.random());
}
从1~
5随机到1~
7随机
public class demo5 {
public static void main(String[] args) {
int testTimes = 10000000;
int[] arr=new int[5];
for (int i = 0; i < testTimes; i++) {
int num=five();
arr[num-1]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(i+1 + "这个数,出现了 " + arr[i] + " 次");
}
System.out.println("===============================");
arr=new int[8];
for (int i = 0; i < testTimes; i++) {
int num=seven();
arr[num]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(i + "这个数,出现了 " + arr[i] + " 次");
}
System.out.println("===============================");
arr=new int[7];
for (int i = 0; i < testTimes; i++) {
int num=avgseven();
arr[num-1]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(i+1 + "这个数,出现了 " + arr[i] + " 次");
}
}
public static int five() {
return (int)(Math.random()*5)+1;
}
public static int avgfive() {
int num=0;
do {
num=five();
}while (num==3);
return num<3?0:1;
}
public static int seven() {
return (avgfive()<<2)+(avgfive()<<1)+(avgfive()<<0);
}
public static int avgseven() {
int num=0;
do {
num=seven();
}while (num==0);
return num;
}
}
从a~
b随机到c~
d随机
0~
1不等概率随机到0~
1等概率随机
public class demo6 {
public static void main(String[] args) {
int testTimes = 10000000;
int[] arr=new int[2];
double x=0.7;
for (int i = 0; i < testTimes; i++) {
int num=unavgzero(x);
arr[num]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(i + "这个数,出现了 " + arr[i] + " 次");
}
arr=new int[2];
System.out.println("===============================");
for (int i = 0; i < testTimes; i++) {
int num=avgzero(x);
arr[num]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(i + "这个数,出现了 " + arr[i] + " 次");
}
}
public static int unavgzero(double x) {
return Math.random()<x?0:1;
}
public static int avgzero(double x) {
int num=0;
do {
num=unavgzero(x);
}while (num==unavgzero(x));
return num;
}
}
6.对数器的使用
选择、冒泡、插入排序的对数器验证
public class demo7 {
public static void main(String[] args) {
int maxlen = 5;
int maxvalue = 50;
int testTimes = 10;
for (int i = 0; i < testTimes; i++) {
int[] arr = random(maxlen, maxvalue);
// print(arr);
// selectsort(arr);
bubblesort(arr);
// insertsort1(arr);
// insertsort2(arr);
if(!checkout(arr)){
print(arr);
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void selectsort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
swap(arr, i, min);
}
}
public static void bubblesort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = arr.length - 1; end > 0; end--) {
for (int i = 0; i < end; i++) {
if (arr[i + 1] < arr[i]) {
swap(arr, i, i + 1);
}
}
}
}
public static void insertsort1(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = 1; end < arr.length; end++) {
int second = end - 1;
while (second >= 0 && arr[second + 1] < arr[second]) {
swap(arr, second, second + 1);
second--;
}
}
}
public static void insertsort2(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = 1; end < arr.length; end++) {
for (int second = end - 1; second > 0 && arr[second + 1] < arr[second]; second--) {
swap(arr, second, second + 1);
}
}
}
public static int[] random(int maxlen, int maxvalue) {
int[] arr = new int[maxlen];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * maxvalue) + 1;
}
return arr;
}
public static boolean checkout(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
if(arr[i]>arr[j]){
return false;
}
}
}
return true;
}
}