c - C语言中使用二分查找查找交错序列

标签 c sequence binary-search interleave

我有两个数组,A 和 X,其中 A >= X。我想找到 X^i 的最大交织因子 i,使得 X^i 是 A 的子序列。例如,如果 A = [4 ,3,2,1,4,3,2,1,4,3,2,1,4,3,2,1],并且 X = [1,2,3],则 i = 1,因为 X ^1 = [1,2,3] 并且该序列在 A 中。我的程序应该使用二分搜索来找到这个最大交错因子 i 并跟踪每次迭代是否是 A 的序列。因此,使用二分搜索来查找上面的例子,我会开始 = 3 (A/X = 6 的最大可能),并且 X^3 = [1,1,1,2,2,2,3,3,3] 这不是一个序列在 A 中。

这是迄今为止我的代码:

#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); //practice reallocating size of array


    //for(int i = 0; i < size_x; i++){
      //  printf("%d ", A[i]);
    //}



}

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 i, j, k, count = 0, max_repeat = 0;

    while(min_i <= max_i){

    int repeats = (max_i + min_i)/2;

    printf("\n");

    int * temp = realloc(X, size_x * sizeof(int) * repeats);
    X = temp;

    for(k = 0; k < size_x; ++k){
        int idx = size_x - k -1;
        temp = &X[idx];
        for(j = 0; j < repeats; ++j){
            X[idx * repeats + j] = *temp;
        }
    }

    printf("New X: ");
        for(i = 0; i < size_x * repeats; i++){
            printf("%d ", X[i]);
        }

    for(i = 0; i < size_x * repeats; i++){
        for(j = 0; j < size_a; j++){
            if(A[j] == X[i]){
                count++;
                i++;
            }
        }
    }

    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;
    }

    printf("Max repeat: %d", max_repeat);
}

这是我当前的输出:

New X: 1 1 1 2 2 2 3 3 3 Low: 0 Mid 3 High  6 Fails

New X: 1 1 1 Low: 0 Mid 1 High  2 Fails

New X: Low: 0 Mid 0 High  0 Fails

我期待这个:

New X: 1 1 1 2 2 2 3 3 3 Low: 0 Mid 3 High  6 Fails

New X: 1 2 3 Low: 0 Mid 1 High  2 Passes

New X: Low: 2 Mid 2 High  2 Fails

Max i = 1.

意思是,我的代码在第二次迭代时没有创建正确的数组。 X^1 应该等于 [1,2,3] 而不是 [1,1,1]。为什么在第二次迭代时没有正确创建数组,但在第一次迭代时却正确创建了数组?

最佳答案

Why is it not creating the array properly on the second iteration but it does on the first?

在第一个循环中,您采用 X这是 {1, 2, 3}并将其更改为 {1, 1, 1, 2, 2, 2, 3, 3, 3}重复第一个数字3次,重复第二数字3次,重复第三数字3次。

在第二个循环中,您从 X 开始是{1, 1, 1, 2, 2, 2, 3, 3, 3} 。现在您构建一个新的 X重复第一个数字1次,重复第二数字1次,重复第三数字1次。

如第一个、第二个、第三个数字都是 1你最终得到 {1, 1, 1}

换句话说:你的第一个循环改变了X因此,您的第二个循环使用 X 的另一个值比第一个循环。因此,第二个循环产生 X 的意外值。

关于c - C语言中使用二分查找查找交错序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675371/

相关文章:

c - 如何基本上加密 ELF 二进制文件中的文本?

c# - 在 .NET/C# 上下文中,什么是二分搜索以及如何/为什么使用二分搜索?

c - 如何将一行整数拆分为数组?

c - 排序链表位置

c - 为什么流的 C 函数以字符 f 开头?

python - 协调Python Aggdraw中的容器类型以获得最快的渲染速度?

python - 检测数字序列中的重复循环(python)

.net - .NET 的稀疏排序数字序列类

c - 尝试在c中递归二分搜索字符串

java - Arrays.copyOfRange() 的运行时