【问题标题】:Finding element of a given rank in an arbitrary array在任意数组中查找给定等级的元素
【发布时间】:2015-01-10 14:39:52
【问题描述】:

我正在做的是使用快速排序算法,以便我的枢轴元素(它将始终是数组的第一个元素)定位到已排序数组中的适当位置,并且我再次调用此方法,直到我这样做不将元素定位在给定的等级。有更好的解决方案吗?

这是我的代码:

public static int arbitrary(int a[],int x,int y,int rank)//x and y are first and last indecies of the array
{
    int j=y,temp;
    if(x<y)
    {
        for(int i=y;i>x;i--)
        {
            if(a[i]>a[x])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                j--;
            }
        }
        temp=a[x];
        a[x]=a[j];
        a[j]=temp;
        //System.out.println("j is "+j);
        if(j==rank)
            return a[j];
        else if(rank<j)
            return arbitrary(a,x,j-1,rank);
        else
            return arbitrary(a,j+1,y,rank);
    }
    else
        return 0;

}

【问题讨论】:

  • 排名元素是什么意思?
  • 如果“rank”是指“排序后元素在数组中的位置”,构造一个minheap并用它来查找第N大元素。
  • @Kevin 是的,这就是我所说的排名。您能否详细说明您的答案,因为我不完全了解 minheap 如何帮助我,因为在构建 minheap 后我可以知道所有最大的 n/ 2 个元素在叶子中,仅此而已...感谢您的回复

标签: algorithm rank


【解决方案1】:

您实现的算法称为Quickselect。 只需选择一个随机枢轴并摆脱 O(n²) 时间复杂度的最坏情况。
现在预期的运行时间约为3.4n + o(n)
快速选择可能是性能和简单性之间的最佳权衡。

更高级的枢轴选择策略导致1.5n + o(n) 预期时间 (Floyd-Rivest Algorithm)。

有趣的事实:使用确定性算法,你不能比2n 做得更好。例如BFPRT 需要大约2.95n 来选择中位数。

【讨论】:

    【解决方案2】:

    使用 QuickSort 方法查找 Rank 元素的最佳方法:

    • 在 QuickSort 中,每次迭代都可以固定一个枢轴元素。

    • 当 RankElement == PivotIndex 时,并打破条件并返回值。

    public class FindRank {
     public void find(int[] arr, int low, int high, int k) {
        if (low < high) {
            int pivot = partition(arr, low, high, k);
            find(arr, low, pivot - 1, k);
            find(arr, pivot + 1, high, k);
        }
    }
    
    public int partition(int[] arr, int low, int high, int k) {
        int pivotIndex = high;
        while (low < high) {
            while (low < high && arr[low] <= arr[pivotIndex]) {
                low++;
            }
            while (low > high && arr[high] >= arr[pivotIndex]) {
                high--;
            }
            if (low < high) {
                swap(arr, low, high);
            }
        }
        swap(arr, pivotIndex, high);
        if (pivotIndex == k) {
            System.out.println("Array Value:" + arr[k] + " index:" + k);
            return k;
        }
        return high;
    }
    
    private void swap(int[] arr, int low, int high) {
        int temp = arr[low];
        arr[low] = arr[high];
        arr[high] = temp;
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多