算法导论习题2.3-7
来源:互联网 发布:windows server pack 编辑:程序博客网 时间:2024/05/01 13:07
题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
解答:
首先对S进行排序,使用合并算法进行排序,排序算法的时间复杂度为nlogn。
然后对排序的S从左到右(即从大到小)进行算法,首先锁定一个数i,这个数小于x的一半,然后从这个数的右边开始查找x-i,使用2分法查找,算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn。
- #include <iostream>
- const int MAXINT=0xFFFF-1;
- void Merge(int A[], int start, int mid, int end)
- {
- int len1 = mid-start+1+1;//加一个位置用于保存哨兵
- int len2 = end-mid+1;//加一个位置用于保存哨兵
- int *L =new int[len1];
- int *R =new int[len2];
- for(int i=0;i<len1-1;i++)
- L[i]=A[start+i];
- L[len1-1]=MAXINT;
- for(int j=0;j<len2-1;j++)
- R[j]=A[mid+j+1];
- R[len2-1]=MAXINT;
- i=0;j=0;
- for(int k=start;k<=end;k++)
- {
- if(L[i]<=R[j])
- {
- A[k]=L[i];
- i++;
- }
- else
- {
- A[k]=R[j];
- j++;
- }
- }
- }
- void MergeSort(int A[], int start, int end)
- {
- if(start<end)
- {
- int mid = (end +start)/2;
- MergeSort(A,start,mid);
- MergeSort(A,mid+1,end);
- Merge(A,start,mid,end);
- }
- }
- void Find(int A[], int n, int x)
- {
- int needValue;
- int left,right,leftPosition,middle;
- leftPosition=0;
- int count=0;
- while(A[leftPosition]<=x/2)
- {
- needValue = x - A[leftPosition];
- left=leftPosition+1;
- right=n-1;
- while(left<=right)
- {
- middle=(left+right)/2;
- if(A[middle]>needValue)
- right=middle-1;
- else
- if(A[middle]<needValue)
- left=middle+1;
- else
- {
- std::cout<<"the "<<++count<<" : ";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- int temp;
- temp=middle;
- while(A[--temp]==needValue)
- {
- std::cout<<"the "<<++count<<" : ";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- }
- temp=middle;
- while(A[++temp]==needValue)
- {
- std::cout<<"the "<<count++<<" : ";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- }
- break;
- }
- }
- leftPosition++;
- }
- std::cout<<"the total number is "<<count<<std::endl;
- }
- int main(void)
- {
- int *a;
- int x;
- int n;
- std::cout<<"Please input the two number's sum: "<<std::endl;
- std::cin>>x;
- std::cout<<"Please input the array's size: /n";
- std::cin>>n;
- a=new int[n];
- std::cout<<"Please input the array' value: "<<std::endl;
- for(int i=0;i<n;i++)
- std::cin>>a[i];
- MergeSort(a,0,n-1);
- std::cout<<"The sorted number series: ";
- for(i=0;i<n;i++)
- std::cout<<" "<<a[i];
- std::cout<<std::endl<<"the result:/n";
- Find(a,n,x);
- return 0;
- }
- 算法导论习题2.3-7
- 算法导论习题2.3-7
- 算法导论2.3-7习题
- 算法导论习题14.1-7
- 算法导论习题7-6
- 【算法导论】第三版课后习题*2.3-7
- 使用Java完成《算法导论》习题2.3-7
- 算法导论习题自做2.3-1
- 算法导论习题[Exercises 9.3-7 ]
- 算法导论习题7-3 Stooge-Sort
- 算法导论第九章习题9.3-7
- 算法导论 2-3-7 习题
- 算法导论 第7章 课后习题
- 算法导论习题
- 算法导论 习题 10.1
- 算法导论 习题 10.3
- 刘汝佳黑书 算法导论习题
- 算法导论习题
- [德ALL]没村往事
- 理解REST软件架构
- 设计模式之男孩女孩(三)
- 使用Eclipse3.2.1+STP.0.4.0+Apache Tuscany开发SCA的Java组件(1)设置篇
- 使用Eclipse3.2.1+STP.0.4.0+Apache Tuscany开发SCA的Java组件(2)代码篇
- 算法导论习题2.3-7
- 个人外包项目全记 - Best Partner (一)项目确立
- 使用Eclipse3.2.1+STP.0.4.0+Apache Tuscany开发SCA的Java组件(3)运行篇
- linux下的三种可执行文件格式的比较
- i work hard
- C#教程第8讲委托2(学习笔记)
- mysql字符集续1
- Fujitsu(富士通):高可靠数据存储托起中国银行核心业务平台
- Cow Man