`
hotcharm
  • 浏览: 16892 次
  • 性别: Icon_minigender_1
  • 来自: 义乌
最近访客 更多访客>>
社区版块
存档分类
最新评论

算法导论习题2.3-7

 
阅读更多

题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。

解答:

首先对S进行排序,使用合并算法进行排序,排序算法的时间复杂度为nlogn。

然后对排序的S从左到右(即从大到小)进行算法,首先锁定一个数i,这个数小于x的一半,然后从这个数的右边开始查找x-i,使用2分法查找,算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn。

  1. #include<iostream>
  2. constintMAXINT=0xFFFF-1;
  3. voidMerge(intA[],intstart,intmid,intend)
  4. {
  5. intlen1=mid-start+1+1;//加一个位置用于保存哨兵
  6. intlen2=end-mid+1;//加一个位置用于保存哨兵
  7. int*L=newint[len1];
  8. int*R=newint[len2];
  9. for(inti=0;i<len1-1;i++)
  10. L[i]=A[start+i];
  11. L[len1-1]=MAXINT;
  12. for(intj=0;j<len2-1;j++)
  13. R[j]=A[mid+j+1];
  14. R[len2-1]=MAXINT;
  15. i=0;j=0;
  16. for(intk=start;k<=end;k++)
  17. {
  18. if(L[i]<=R[j])
  19. {
  20. A[k]=L[i];
  21. i++;
  22. }
  23. else
  24. {
  25. A[k]=R[j];
  26. j++;
  27. }
  28. }
  29. }
  30. voidMergeSort(intA[],intstart,intend)
  31. {
  32. if(start<end)
  33. {
  34. intmid=(end+start)/2;
  35. MergeSort(A,start,mid);
  36. MergeSort(A,mid+1,end);
  37. Merge(A,start,mid,end);
  38. }
  39. }
  40. voidFind(intA[],intn,intx)
  41. {
  42. intneedValue;
  43. intleft,right,leftPosition,middle;
  44. leftPosition=0;
  45. intcount=0;
  46. while(A[leftPosition]<=x/2)
  47. {
  48. needValue=x-A[leftPosition];
  49. left=leftPosition+1;
  50. right=n-1;
  51. while(left<=right)
  52. {
  53. middle=(left+right)/2;
  54. if(A[middle]>needValue)
  55. right=middle-1;
  56. else
  57. if(A[middle]<needValue)
  58. left=middle+1;
  59. else
  60. {
  61. std::cout<<"the"<<++count<<":";
  62. std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
  63. inttemp;
  64. temp=middle;
  65. while(A[--temp]==needValue)
  66. {
  67. std::cout<<"the"<<++count<<":";
  68. std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
  69. }
  70. temp=middle;
  71. while(A[++temp]==needValue)
  72. {
  73. std::cout<<"the"<<count++<<":";
  74. std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
  75. }
  76. break;
  77. }
  78. }
  79. leftPosition++;
  80. }
  81. std::cout<<"thetotalnumberis"<<count<<std::endl;
  82. }
  83. intmain(void)
  84. {
  85. int*a;
  86. intx;
  87. intn;
  88. std::cout<<"Pleaseinputthetwonumber'ssum:"<<std::endl;
  89. std::cin>>x;
  90. std::cout<<"Pleaseinputthearray'ssize:/n";
  91. std::cin>>n;
  92. a=newint[n];
  93. std::cout<<"Pleaseinputthearray'value:"<<std::endl;
  94. for(inti=0;i<n;i++)
  95. std::cin>>a[i];
  96. MergeSort(a,0,n-1);
  97. std::cout<<"Thesortednumberseries:";
  98. for(i=0;i<n;i++)
  99. std::cout<<""<<a[i];
  100. std::cout<<std::endl<<"theresult:/n";
  101. Find(a,n,x);
  102. return0;
  103. }
分享到:
评论

相关推荐

    算法导论课后习题2.3-7和思考题2-4答案源码

    在这个压缩包中,包含了课后习题2.3-7“合并排序”和思考题2-4“逆序对”的解答源码。这两个问题都是围绕着算法设计和效率分析展开的,对于理解和掌握排序算法及其内在性质至关重要。 首先,我们来看课后习题2.3-7...

    算法导论习题解-相信大家都知道

    根据提供的文件信息,可以看出这是一本关于《算法导论》习题解答的手册。下面将对文件中的几个关键章节进行详细解析,以便更好地理解其中所包含的重要知识点。 ### 一、算法在计算中的角色(第1章) 这一章主要...

    算法导论习题答案

    综上所述,《算法导论习题答案》不仅提供了具体的习题解答,更重要的是通过这些练习帮助读者深刻理解算法设计与分析的基本概念和技术。这些章节涵盖的内容广泛,包括排序算法、递归算法、分治策略、数据结构(如二叉...

    算法导论习题答案(中文版)

    根据提供的信息,《算法导论习题答案(中文版)》这本书是针对同名教材的一系列习题解答。原书深入探讨了多种类型的算法,并且力求让不同水平的读者都能理解和掌握算法的设计与分析方法。这份资源包含了从第2章到第...

    算法导论(introduction to algorithms )课后习题经典解析及答案

    例如,提到了2.3-3、2.3-4、2.3-5、2.3-6、2.3-7等习题,很可能涉及递归式求解或者递归算法的时间复杂度分析。而提到的voidMerge函数是归并排序算法的核心部分,它展示了如何将一个数组分为两个子数组,递归排序这两...

    算法导论第二版(中文,高清)经典答案

    #### 习题2.3-1至2.3-7 这部分习题涵盖了分治法在解决具体问题时的应用案例,如计算矩阵乘法、计算多项式的值等。 ### 第3章:设计与分析案例 #### 习题3.1-1至3.1-8 这些习题主要考察了对不同算法效率的评估以及...

    大工软院历年算法导论考试题

    《大工软院历年算法导论考试题》的解析涵盖了算法导论的多个核心主题,主要针对大连理工大学软件学院研究生研一的课程内容。通过对这些考试题目的分析,我们可以深入理解算法设计、分析及其应用的关键知识点。 首先...

Global site tag (gtag.js) - Google Analytics