public int[] randomPick(int[] A, int[] W, int num) { int length = W.length; //将权重数组分段 for (int i = 1; i < length; i++) { W[i] = W[i] + W[i - 1]; } int total = W[length - 1]; int random; //初始化一个数组来统计出现的次数 int[] count = new int[A.length]; for (int i = 0; i < num; i++) { //生成小于等于总权重的随机数 random = (int) (Math.random() * (total) + 1); for (int j = 0; j < length; j++) { if (random <= W[j]) { //修改出现的次数 count[j]++; break; } } } return count; } 分析一下
时间: 2024-02-14 15:31:14 浏览: 50
这段代码是一个用于根据权重数组随机选择元素的方法。下面是对代码的分析:
1. 首先,通过获取`W`数组的长度来确定权重数组的大小,并将其存储在`length`变量中。
2. 然后,通过循环遍历`W`数组,计算每个位置的累积权重。这是通过将当前位置的权重与前一个位置的累积权重相加来实现的。这样,`W`数组就被转换成一个分段的区间。
3. 计算总权重,即最后一个位置的累积权重。
4. 定义一个`random`变量,用于存储生成的随机数。
5. 创建一个大小与`A`数组相同的`count`数组,用于记录每个元素出现的次数。
6. 使用循环生成指定次数的随机数,并将其存储在`random`变量中。
7. 使用嵌套循环遍历分段区间,找到第一个大于等于生成的随机数的区间。一旦找到,就将对应的元素出现次数加一,并跳出内部循环。
8. 返回记录元素出现次数的`count`数组。
总结起来,这段代码通过生成随机数并与分段区间进行比较,实现了根据权重数组随机选择元素的功能。返回的是一个记录每个元素出现次数的数组。
相关问题
分析时间复杂度public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); String num[]=new String[N]; for(int i=0;i<N;i++) { int res=0; num[i]=sc.next(); if(ishui(num[i])) {//输入即回文 System.out.println(0+num[i]); break; } while(!ishui(num[i])) {//非回文 int a=0; int temp=Integer.valueOf(num[i]);//String转int while(temp!=0) { int n=temp%10; a=a*10+n; temp/=10; } temp=a+Integer.valueOf(num[i]);// num[i]=String.valueOf(temp); res++; } System.out.println(res+" "+num[i]); } } //判断字符串 private static boolean ishui(String a) { int i=0;int j=a.length()-1; while(i<j) { if(a.charAt(i)!=a.charAt(j)) { return false; } i++;j--; } return true; }
这段代码的时间复杂度分析如下:
1. 第1行创建了一个 Scanner 对象,时间复杂度为 O(1)。
2. 第2行读取一个整数 N,时间复杂度为 O(1)。
3. 第3行创建一个长度为 N 的字符串数组,时间复杂度为 O(N)。
4. 第4~18行的 for 循环中,每次迭代都会进行如下操作:
a. 第6行判断当前字符串是否为回文,时间复杂度为 O(N)。
b. 如果不是回文,则进入 while 循环。
c. while 循环中,第11行将字符串转换成整数,并且第16行将整数转换成字符串,这两个操作的时间复杂度均为 O(N)。
d. while 循环中,第12~15行的操作次数取决于字符串的长度 N,时间复杂度为 O(N)。
e. 循环次数最多为 N 次,因此整个 for 循环的时间复杂度为 O(N^2)。
5. ishui 函数的时间复杂度为 O(N)。
因此,整个程序的时间复杂度为 O(N^2)。
修正以下代码:public class Example{ public static void main(String[] args){ int s = 0 ,e,N,m; int[] a = {1,4,7,13,19,20}; int N = a.length -1; int m = (s+N) /2; Scanner scanner = new Scanner (System.in); int sum = scanner.nextInt(); whlie(s != e){ if(num > a[m]){ s = m; s++; } else if(num < a[m]){ e = m; e--; } m = (e + s) /2; if(num = a[m]){ System.out.println("have"); break; } } } }
修正后的代码如下:
```
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
int s = 0, e, N, m;
int[] a = {1, 4, 7, 13, 19, 20};
N = a.length - 1;
m = (s + N) / 2;
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
e = N;
while (s <= e) {
if (num > a[m]) {
s = m + 1;
} else if (num < a[m]) {
e = m - 1;
} else {
System.out.println("have");
break;
}
m = (s + e) / 2;
}
}
}
```
修正点:
1. 将 `whlie` 改为 `while`。
2. 去掉了重复定义变量 `N` 和 `m`。
3. 初始化变量 `e` 为 `N`。
4. 将 `s != e` 改为 `s <= e`。
5. 在 `if`、`else if` 和 `else` 语句中分别加上了代码块 `{}`。
6. 在 `if (num = a[m])` 中将赋值运算符 `=` 改为相等运算符 `==`。
7. 将 `s++` 和 `e--` 合并为 `s = m + 1` 和 `e = m - 1`。
8. 将求中间位置 `m` 的公式改为 `(s + e) / 2`。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)