算法分析与设计 |
您所在的位置:网站首页 › 如何获取set中的元素个数和位数 › 算法分析与设计 |
(一)题目
问题描述
给定 n n n个互不相同的数组成的集合 S S S以及正整数 k ≤ n k\leq n k≤n,试设计一个 O ( n ) \Omicron(n) O(n)时间算法找出 S S S中最接近 S S S的中位数的 k k k个数。 注意:此处“最接近”指数值大小接近,而不是排序位置接近。 (二)解答 算法思路若已知能在线性时间内找到数组中第 k k k小的元素的算法,求解步骤如下: 1.通过该算法求数组的中位数; 2.计算数组中每个元素与中位数之差的绝对值并存放在绝对值数组; 3.通过该算法求绝对值数组中第 k k k小的数; 4.将原数组中与中位数之差的绝对值小于等于第 k k k小的绝对值的元素输出即为答案。 (注意:该算法要求绝对值数组中的元素不重复) 能在线性时间内找到数组中第 k k k小的元素的算法在另一篇博客中已有介绍,此处不再赘述,参考链接: 算法分析与设计-线性时间选择详解(通俗易懂,含图解,附源码)(c++)__Eliuak_的博客-CSDN博客 源代码(RandomizedSelect算法) #include #include #include using namespace std; int n, k, len; //将数组数组首元素a[p]作为基准数将数组分割 int Partition(int a[], int p, int r); //交换两个元素 void Swap(int &a, int &b); //在数组中随机选择一个数将数组分割 int RandomizedPartition(int a[], int p, int r); //产生随机数 int Random(int x, int y); //线性划分 int RandomizedSelect(int a[], int p, int r, int k); int main() { coutn; //输入数组 cout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |