我已经尝试过手动执行该程序,但是仍然无法正常工作。
我有一个数组A = [4,3,2,1,4,3,2,1,4,3,2,1,4,3,2,1,4,3,2,1]
和一个数组X = [1,2,3]
。
我需要找到i
的子序列X^i
的最大数目A
,并通过二进制搜索来完成。
由于A
的大小为20,而X
的大小为3,因此最大可能的i = 20/3 = 6
。因此,我的搜索将从i = 3
开始,这意味着X^3 = [1,1,1,2,2,2,3,3,3]
。
这不是A
的子序列,因此对i = 1, X^1 = [1,2,3]
重复二进制搜索。
这是A的子序列,这意味着它应该通过并且二进制搜索应为i = 2
再试一次。
但是,我查看迭代是否通过的条件无法正常工作。
代码如下:
#include <stdio.h>
#include <stdlib.h>
void create_initial_arrays(int size_a, int *A, int size_x, int *X);
void binary_search(int size_a, int * A, int size_x, int *X, int max_i, int min_i);
int main(){
int size_a, size_x;
scanf("%d", &size_a);
scanf("%d", &size_x);
int max_i = size_a / size_x;
int min_i = 0;
printf("Max: %d\n", max_i);
int *A = (int*) malloc(size_a *sizeof(int));
int *X = (int*) malloc(size_x *sizeof(int));
create_initial_arrays(size_a, A, size_x, X);
printf("Old X: ");
for(int i = 0; i < size_x; i++){
printf("%d ", X[i]);
}
printf("\n");
binary_search(size_a, A, size_x, X, max_i, min_i);
free(X);
free(A);
}
void create_initial_arrays(int size_a, int *A, int size_x, int *X){
int i, throwaway;
for(i = 0; i < size_a; i++){
scanf("%d", &A[i]);
}
scanf("%d", &throwaway);
for(i = 0; i < size_x; i++){
scanf("%d", &X[i]);
}
scanf("%d", &throwaway);
}
void binary_search(int size_a, int * A, int size_x, int *X, int max_i, int min_i){
int j, k, max_repeat = 0;
while(min_i <= max_i){
int i = 0, count = 0, repeats = (max_i + min_i)/2;
printf("\n");
int * temp = (int*) malloc(size_x * sizeof(int) * repeats);
for(k = 0; k < size_x; ++k){
for(j = 0; j < repeats; ++j){
temp[k * repeats + j] = X[k];
}
}
printf("New X: ");
for(i = 0; i < size_x * repeats; i++){
printf("%d ", temp[i]);
}
printf("A: ");
for (i = 0; i < size_a; i++){
printf("%d ", A[i]);
}
for(j = 0; j < size_a; j++){
if(A[j] == temp[i]){
count++;
i++;
}
}
printf("Count: %d", count);
if (count >= size_x * repeats){
printf("Low: %d Mid %d High % d Passes\n", min_i, repeats, max_i);
min_i = repeats + 1;
max_repeat++;
}
else{
printf("Low: %d Mid %d High % d Fails\n", min_i, repeats, max_i);
max_i = repeats - 1;
}
free(temp);
}
printf("Max repeat: %d", max_repeat);
}
这是我认为必须有问题的部分:
for(j = 0; j < size_a; j++){
if(A[j] == temp[i]){
count++;
i++;
}
}
我已经输出了两个数组以确保它们正确填充(它们是),并且在每次迭代后都输出了计数器。这是我的代码输出:
Old X: 1 2 3
New X: 1 1 1 2 2 2 3 3 3 A: 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 Count: 0Low: 0 Mid 3 High 6 Fails
New X: 1 2 3 A: 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 Count: 0Low: 0 Mid 1 High 2 Fails
New X: A: 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 Count: 0Low: 0 Mid 0 High 0 Passes
Max repeat: 1
请注意,整个计数仍为0
。在X^3 = [1,1,1,2,2,2,3,3,3]
的第一次迭代中,条件为5的真值([1,1,1,2,2]
是A的子序列,因此count应该是5,但是5 is not >= size_x * repeats(3 * 3)
则按预期失败。降低为低0中1高2,所以i = repeats = 1
。
X^1 = [1,2,3]
是A
的子序列,在此迭代中计数应为5([1,2,3]
加上两个额外的计数3)>= size_x * repeats (3*1)
,因此应该通过,然后重新搜索i = 2
。但是,计数仍然为零并且失败。
为什么计数不更新?我知道我需要将其保留在循环中,因为我需要在每次迭代时将其重置为0,但是我真的不明白为什么A[j] == temp[i]
永远不会过去。