【问题标题】:Smallest kth for quick select algor快速选择算法的最小 kth
【发布时间】:2018-05-08 00:58:48
【问题描述】:

我一直在开发一个程序,该程序旨在测试快速选择算法在不同组大小设置下的性能。您找到枢轴,算法会将所有元素分成 5 个组。它应该找到每个组的中位数,并使用所有组中位数的中位数作为枢轴。我遇到了最小的第 k 部分的问题。我得到的错误是 n 不是一个常量变量,因此它无法分配数组并且它导致中位数的大小未知。我应该怎么做才能纠正这个?

int smallestKth(int ray[], int l, int r, int k)

 {
if (k > 0 && k <= r - l + 1)

{

    int n = r-l+1; 
    int i, median[(n+4)/5]; 
    for (i=0; i<n/5; i++)
        median[i] = medianFind(ray+l+i*5, 5);
    if (i*5 < n) 

    {
        median[i] = medianFind(ray+l+i*5, n%5);
        i++;
    }   


    int medOfMed = (i == 1)? median[i-1]:
        smallestKth(median, 0, i-1, i/2);


    int pivotPosition = part(ray, l, r, medOfMed);
    if (pivotPosition-l == k-1)
        return ray[pivotPosition];

    if (pivotPosition-l > k-1) 
        return smallestKth(ray, l, pivotPosition-1, k);      
    return smallestKth(ray, pivotPosition+1, r, k-pivotPosition+l-1);

}
return INT_MAX;

}

【问题讨论】:

    标签: c++ algorithm


    【解决方案1】:

    int median[(n+4)/5]; 是一些编译器支持的非标准声明作为扩展。您应该使用std::vector,而不是使用可变长度数组 (VLA)。

    std::vector median((n+4)/5);
    

    【讨论】:

      【解决方案2】:

      您不需要创建一个新数组来保存中位数。只需使用原始数组的五分之一。

      一种方法是stride 数组;将数组表示为起始指针、元素数量和步幅,步幅是两个连续元素之间的距离。例如,一旦你将每组 5 个的中位数放在数组 [start, n, stride] 中的正确位置,你可以递归数组 [start+2, (n+2)/5, 5*步幅]。

      【讨论】:

        【解决方案3】:

        这是通过为中值数组创建一个指针来解决的。

        int n = right-left+1;
            int *median = new int[(n+4)/5];
        

        【讨论】:

        • 当使用new 时,您应该稍后调用delete。不妨按照 1201ProgamAlarm 的建议使用std::vector
        猜你喜欢
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 2020-07-01
        相关资源
        最近更新 更多