【问题标题】:How To increase input size of program如何增加程序的输入大小
【发布时间】:2012-10-21 17:51:42
【问题描述】:

这个程序需要两个输入。第一个数组大小(n)和选择 例如:- 如果 n 为 100,则我的程序生成 100 个随机数并使用合并对它们进行排序 排序和快速排序。

现在如果您输入choice==2,则显示两种排序算法所花费的时间

我的程序可以在输入大小 10^8 下工作,但我希望它可以在 10"10 下工作。如果我输入输入大小 10^9,则会出现分段错误。分配大量内存时存在问题 .malloc 返回 null如果输入大小超过 10^9

谁能告诉我如何提高我的程序的输入大小............

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

long long merge(int *A,long long i,long long mid,long long j)                   

{   

int *C;
C=(int *)malloc(sizeof(int)*(j-i+1));                           
long long  r,start,k;
r=0;
start=i;
k=mid+1;
while((i<=mid)&&(k<=j))
{
    if(A[i]>A[k])
    {
        C[r]=A[k];
        r++;k++;
    }
    else
    {
        C[r]=A[i];
        r++;i++;
    }
}
while(i<=mid)
{
    C[r]=A[i];
    r++;i++;
}
while(k<=j)
{
    C[r]=A[k];
    r++;k++;
}
for(i=0;i<r;i++,start++)
    A[start]=C[i];
free(C);
  }
   long long partition(int *A,long long i,long long j)                           
   {

long long mid;
mid=(i+j)/2;                                    
if(i<j)
{
    partition(A,i,mid);                         
    partition(A,mid+1,j);
    merge(A,i,mid,j);                       
}
    }

    long long find_position(int A[],long long i,long long j)                        

    {

long long pivot,temp,end;
end=j;
pivot=i;
while(i<j)
{
    while(A[i]<=A[pivot]&&i<end)
        i++;
    while(A[j]>A[pivot])
        j--;
    if(i<j)
    {
        temp=A[i];
        A[i]=A[j];
        A[j]=temp;
    }
}
temp=A[pivot];
A[pivot]=A[j];
A[j]=temp;
return j;
  } 
  long long quicksort(int A[],long long  i,long long  j)                                
  {
long long position;
if(j>i)
{
    position = find_position(A,i,j);
    quicksort(A,i,position-1);
    quicksort(A,position+1,j);
  }
    }
   int main()
  {
clock_t start,end,quick_sort,merge_sort;
long long input_size,i;
int choice,x;
srand(time(NULL));
printf("Enter input Size\n");
scanf("%lld",&input_size);
int *A,*B;
printf("input your choice\n");
scanf("%d",&choice);
A=(int *)malloc(input_size*sizeof(int));
B=(int *)malloc(input_size*sizeof(int));
if(A==NULL||B==NULL)
{
    printf("sorry that much memory can't be allocated\n");
    return 0;
}
for(i=0;i<input_size;i++)
{
    x=rand();
    A[i]=x;
    B[i]=x;
}
if(choice==1)
{
    printf("Array entered by user\n");
    for(i=0;i<input_size;i++)
        printf("%d  ",A[i]);
}
start=clock();
partition(A,0,input_size-1);
end=clock();
merge_sort=end-start;
if(choice==2)
    printf("\n time taked by merge sort is %6.6f",((double)(merge_sort)/CLOCKS_PER_SEC));
if(choice==1)
{
    printf("\nmerge sorted array\n");
    for(i=0;i<input_size;i++)
        printf("%d  ",A[i]);
}
start=clock();
quicksort(B,0,input_size-1);
end=clock();
quick_sort=end-start;
if(choice==2)
    printf("\n time taked by quick sort is %6.6f",((double)(quick_sort)/CLOCKS_PER_SEC));
if(choice==1)
{
    printf("\nquick sorted array\n");
    for(i=0;i<input_size;i++)
        printf("%d  ",B[i]);
}
printf("\n");
return 0;

}

【问题讨论】:

  • 什么操作系统和编译器?
  • 它可能超过了 2GB 的限制。
  • 当我看到这个:mid=(i+j)/2;(虽然你使用的是long long)它总是提醒我这个:googleresearch.blogspot.ch/2006/06/…
  • 10 ^ 10 对于 64 位机器来说应该没问题,比如说 96GB RAM(100 亿整数 = 40GB,你分配了 两次)。 32 位机器只能访问 2GB 工作内存。您可能应该重新考虑您的问题,这行不通...
  • @fvu cmets 有一个“编辑”选项。

标签: c


【解决方案1】:

malloc 的最大可分配大小为 2GB(需要 size_t)。因此你的程序崩溃了。我假设您使用的是 32 位机器。

请参阅下面的链接以了解更多信息并测试您是否可以实际分配那么多内存。

How Big can a malloc be in C

要解决这个问题,您需要使用二进制文件编写自己的虚拟内存管理器和内存分配器,并编写自己的free()malloc() 例程。

查看示例(仅适用于 iPhone):Create your own VMM

【讨论】:

  • 那么解决方案是什么。我应该在 64 位机器上运行我的程序吗?
  • 我使用的是ubuntu(32位),gcc编译器。
  • @stranger001 是的,解决方案是在 RAM 超过 6-8GB 的​​ 64 位机器上运行它。但要保持架构独立(可在 32 位和 64 位上运行),您可能必须编写自己的 VMM 和 malloc()/free()
【解决方案2】:

您需要考虑到地址范围可以是 32 位或 64 位,其中一些是堆栈、其他变量、内务管理等所必需的。此外,许多(全部?)操作系统都有软限制和硬限制以防止一个占用所有物理和交换内存的进程。

你为什么要这样做?

【讨论】:

  • 他可能正在编写一种巨型病毒,该病毒会导致我们所有的系统崩溃,然后他会要求出售并接管我们的世界。我可能认为它的作业或面试官提出的问题之类的。
  • 我个人讨厌那些面试问题。我提出了一些面试问题。这个人很紧张,那么你到底为什么要证明你是一个明亮的火花?我认为最好找一个更好的候选人来测试他或她对该主题的了解。例如指针是什么意思?
  • 就我个人而言,我喜欢测试人们已经知道的知识以及他们将如何解决棘手的问题。解决方案很简单,但问题会欺骗候选人。它测试了他们在压力下的表现以及他们的思考速度。
  • @PrototypeStark - 你在棋盘中间,你可以走四个方格,你在哪里?
  • 在棋盘中间
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2012-07-01
  • 2018-05-07
  • 2015-09-08
  • 1970-01-01
  • 2018-01-16
  • 2016-04-23
相关资源
最近更新 更多