算法问题:随机时间选择求中位数超出内存限制如何修改

问题描述

算法问题:随机时间选择求中位数超出内存限制如何修改

求问:怎么修改才能减少内存占用,还是我写的算法本身不行得重写?

#define MAX 8365000
#include //中位数
#include
#include

long long int randomizedselect(long long int a[],long long int left,long long int right,long long int i);
long long int randomizedpartition(long long int a[],long long int left,long long int right);
long long int partition(long long int a[],long long int left,long long int right);
int swap(long long int,long long int);

long long int a[MAX];
int main()
{
long long int n,m,m1,m2,i;

scanf("%lld",&n);
for (i = 1;i <= n;++i)
{
    scanf("%d",&a[i]);
}

if(n%2 == 1)
    m = randomizedselect(a,1,n,(n+1)/2);
else if(n%2 == 0)
{
    m1 = randomizedselect(a,1,n,n/2);
    m2 = randomizedselect(a,1,n,(n+2)/2);
    m = (m1 + m2)/2;
}

printf("%lld",m);

}

long long int randomizedselect(long long int a[],long long int left,long long int right,long long int i)
{
long long int q,k;
if(left == right)
return a[left];

q = partition(a,left,right);//返回是划分哨兵的最后位置
k = q-left+1;
if(i == k)
    return a[q];
else if (i < k)
        return randomizedselect(a,left,q-1,i);
else
    return randomizedselect(a,q+1,right,i-k);

}

/*long long int randomizedpartition(long long int a[],long long int left,long long int right)
{
long long int i;
srand((unsigned)time(NULL));
i = rand()%(right - left + 1)+left;//产生left和right之间的随机值
swap(right,i);

return partition(a,left,right);

}*/

long long int partition(long long int a[],long long int left,long long int right)
{
long long int x,i,j;
x = a[right];
i = left - 1;
for (j = left;j <= right-1;++j)
{
if(a[j] <= x)
{
i++;
swap(i,j);
}
}
swap(i+1,right);
return i+1;//划分值的位置
}
int swap(long long int x,long long int y)
{
int temp;
temp = a[x];
a[x] = a[y];
a[y] = temp;
}

时间: 2024-11-05 14:39:22

算法问题:随机时间选择求中位数超出内存限制如何修改的相关文章

100元50个人 随机生成 大于1小于20的随机金额 求个代码案例

问题描述 100元50个人随机生成大于1小于20的随机金额求个代码案例 解决方案 解决方案二:这个?http://blog.csdn.net/z69183787/article/details/50674531解决方案三:这个达不到我想要的效果,我想的是比如100元20个人抢,我可以设置最高的人可以抢到30元最低的人可能抢到0.1元解决方案四:你发的这个感觉最高的那么不定额度最低的那个也是不低额度解决方案五:以"平均概率"的思路来分配红包,非常无趣,这类创意乏味极了.要分配红包,就要有

删除重复结点的算法,哪里错了求解答,运行不了!!

问题描述 删除重复结点的算法,哪里错了求解答,运行不了!! void DeleteList(linklist &L){ linklist pqs; p=L->next ; while(p){ q=p->next; while(q) { if(q->data==p->data ) { s=q; q=s->next; free(s); } else q=q->next ; } p=p->next ;} } 解决方案 void RemoveDupNode(lin

我真的不会-我是初学,一个关于顺序查找和折半查找的算法有错,求解答

问题描述 我是初学,一个关于顺序查找和折半查找的算法有错,求解答 ```#include #define Max 256 typedef struct Keylist { int key[Max]; int len; }Keylist; void creatKlist(Keylist L) { int i=0; printf("**建立静态表**n"); printf("你需要构建多少个数据,请输入:"); scanf("%d",&L.l

c语言-关于编程求中位数复杂度问题

问题描述 关于编程求中位数复杂度问题 求问,设计一个寻找众数的o(n)算法该如何设计?我利用快速排序和最后的遍历,那个平均情况下的复杂度为o(nΩn) 解决方案 nlogn http://blog.csdn.net/ceofit/article/details/7451463 解决方案二: 求中位数问题:最小堆,最大堆 解决方案三: 表示完全没有看懂楼主的问题 解决方案四: http://www.cnblogs.com/longdouhzt/archive/2012/02/26/2368749.

tld-关于TLD算法的改进,求提供思路

问题描述 关于TLD算法的改进,求提供思路 最近要做一个基于TLD的跟踪算法,主要是对TLD进行改进,不知道各位有啥可以提供的思路没,谢了! 解决方案 你这上来就要改进算法的思路.......你去知网上搜,有一些中文的改进TLD.多看看,自己就会有思路,等着别人告诉你,那就是别人的思路.所以你还是自己多看看,多读文章吧

java-大家觉得我这个算法够随机吗?

问题描述 大家觉得我这个算法够随机吗? 是阿里巴巴的一道笔试题,用nextInt(int i),这个方法能产生0~ (i-1)的其中一个随机数,去产生1~1000中不重复的900个随机数,我只弄了1~1000个随机数,计数截取的部分省略 import java.util.*;public class TestString { public static void main(String[] args) { myWay(1 4); } public static void myWay(int st

java虚拟机-java 垃圾回收 Mark-and-Compact 算法 去碎片如何操作堆中内存的

问题描述 java 垃圾回收 Mark-and-Compact 算法 去碎片如何操作堆中内存的 在压缩堆内存阶段,遍历堆中所有对象并将存活对象重新放入连续的内存地址的 过程中,如果某个存活对象即将放入的地址中存有另一个还没有被移动的存活的对象, java jvm如何进行操作呢? 我看的算法中没有给此方面的信息.它只说存活对象放入 连续的堆中! 大神!!!!求助!!!!!!!!!

sift算法 请求帮忙- 这个SIFT算法中 为什么在求尺度空间的极大值时 val&amp;amp;gt;0,求极小值时 val&amp;amp;lt;=0呢?

问题描述 这个SIFT算法中 为什么在求尺度空间的极大值时 val>0,求极小值时 val<=0呢? 解决方案 http://blog.csdn.net/akunainiannian/article/details/44104763

c++算法编程,急求,谢谢

问题描述 c++算法编程,急求,谢谢 正方形网格中,每个格点有一定数量的宝石.小明从网格左上(0,0)出发, 采集宝石.小明每次横向或竖向移动不超过 ...k.个方格后,停下来采集宝石.强迫 症的小明要求每次采集宝石数量不低于上一次,否则宁愿停止采集. 注: 停下来采集宝石后,才能转向: 一次移动不超过 k 步即,可以是 1,2.-k 经过的格点的宝石数量没有要求: 例如 : 对如下网格,网格中的整数为宝石数: 1 2 5 10 11 6 12 12 7 当 k 为 1 时,优值为 37 : k