MATLAB中,如何找第K大的值及其所在位置?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中,如何找第K大的值及其所在位置?相关的知识,希望对你有一定的参考价值。
假如一个向量a=[1 2 3 4 5 5 6 7 8 9 9 10]
如何找出向量a的第二大值以及其位置呢?
这里的第二大值是9,它有两个位置,分别是10,11.
当向量长度很长的时候,如何找出这个位置呢?
请教高手了,要求使用的命令越简单越好。
还有就是找出大于某一个值,比如大于8.5的所有的值,以及这些值所在的位置。
在上面的a向量中,大于8.5的是9,9,10,他们的位置分别是10,11,12.
要实现这个功能,又要使用什么命令呢?要求越简单越好。
a = [1 2 3 4 5 5 6 7 8 9 9 10];
b = sort(unique(a), 'descend'); %不重复的从大到小排序
find(a == b(k))
2.
a = [1 2 3 4 5 5 6 7 8 9 9 10];
ind = find(a > 8.5)
b = a(ind)本回答被提问者采纳
无序数组中找第k大的数
类快排算法
由于只要求找出第k大的数,没必要将数组中所有值都排序。
快排中的partition算法,返回key在数组中的位置的cnt(相对于left的偏移量),如果cnt正好等于k,那么问题则得到解决;如果cnt小于k,去左边找第k个;如果cnt>k,则去右边找第k-cnt个。直到key的位置等于k-1,则找对问题的解。
/*快排中的划分算法*/ int partition(int* input, int low, int high) { int tmp = input[low]; // 取一个基准元素 while (low < high) { while (low < high && input[high] >= tmp) { high--; } input[low] = input[high]; while (low < high && input[low] <= tmp) { low++; } input[high] = input[low]; } input[low] = tmp; return low; } // 这里得到的是第k小,自己n-k转换下即可 int findK(int* array, int left, int right, int k) { //printf("%d %d %d ", left, right, k); int i = partition(array, left, right); int cnt = i - left + 1; if (k == cnt) { return array[i]; } else if (k < cnt) { return findK(array, left, i - 1, k); } else if (k > cnt) { return findK(array, i + 1, right, k-cnt); } return 0; }
此解法的时间复杂度为O(N*lgK),logK次每次O(N),优于排序解法
最小堆解法
构造一个大小为k的最小堆,堆中根节点为最小值。如果数组中最大的几个数均在堆中,那么堆中根节点的值就是问题的解。
可以用STL中的优先队列实现,因为优先队列的内部就是最大堆/最小堆实现的。
此解法的时间复杂度O(NlogK),N次logK。但是相比与类快速排序算法,需要额外的存储空间。
参考链接:
1. https://www.jianshu.com/p/33ee33ce8699
2. https://blog.csdn.net/qq_14821023/article/details/50793468
以上是关于MATLAB中,如何找第K大的值及其所在位置?的主要内容,如果未能解决你的问题,请参考以下文章