Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1525476
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: Python/Ruby

2012-07-17 11:20:42

  • 不论原序列是有序还是无序,解决这类题有以下三种办法:1、二分(若无序,先排序后二分),时间复杂度总为O(n*logn),空间复杂度为O(1);2、扫描一遍X-S[i]  映射到一个数组或构造hash表,时间复杂度为O(n),空间复杂度为O(n);3、两个指针两端扫描(若无序,先排序后扫描),时间复杂度最后为:有序O(n),无序O(n*logn+n)=O(n*logn),空间复杂度都为O(1)。
  • 所以,要想达到时间O(N),空间O(1)的目标,除非原数组是有序的(指针扫描法),不然,当数组无序的话,就只能先排序,后指针扫描法或二分(时间n*logn,空间O(1)),或映射或hash(时间O(n),空间O(n))。时间或空间,必须牺牲一个,自个权衡吧。
  • 综上,若是数组有序的情况下,优先考虑两个指针两端扫描法,以达到最佳的时(O(N)),空(O(1))效应。否则,如果要排序的话,时间复杂度最快当然是只能达到N*logN,空间O(1)则是不在话下

点击(此处)折叠或打开

  1. <?php
  2. $arr=range(1,10);
  3. $m=11;

  4. /**
  5.  * 时间复杂度o(n*n)
  6.  * @param unknown_type $m
  7.  * @param unknown_type $arr
  8.  * 思路1:直接穷举,从数组中任意选取两个数,判定它们的和是否为输入的那个数字。
  9.  * 此举复杂度为O(N^2)。很显然,我们要寻找效率更高的解法。
  10.  */
  11. function getM($m,$arr){
  12.     //print_r($arr);

  13.     $len=count($arr);
  14.     for($i=0;$i<$len;$i++){
  15.         for($j=$i+1;$j<$len;$j++){
  16.             if(($arr[$i]+$arr[$j])==$m){
  17.                 //echo 'aaaaaaaaa';

  18.                 echo "($arr[$i]+$arr[$j]=${m})".'
    '
    ;
  19.             }
  20.         }
  21.     }
  22. }
  23. /**
  24.  *方法2
  25.  * @param unknown_type $m
  26.  * @param unknown_type $arr
  27.  * 如果数组是无序的,先排序(n*logn),然后用两个指针i,j,各自指向数组的首尾两端,
  28.  * 令i=0,j=n-1,然后i++,j--,逐次判断a[i]+a[j]?=sum,如果某一刻a[i]+a[j]>sum,
  29.  * 则要想办法让sum的值减小,所以此刻i不动,j--,如果某一刻a[i]+a[j]
  30.  * 法让sum的值增大,所以此刻i++,j不动。所以,数组无序的时候,时间复杂度最终为
  31.  * O(n*logn+n)=O(n*logn),若原数组是有序的,则不需要事先的排序,直接O(n)
  32.  * 搞定,且空间复杂度还是O(1),此思路是相对于上述所有思路的一种改进。
  33.  */
  34. function getM2($m,$arr){
  35.     $len=count($arr);
  36.     $i=0;
  37.     $j=$len-1;
  38.     while($i<$j){
  39.         if(($arr[$i]+$arr[$j])>$m){
  40.             $j--;
  41.             continue;
  42.         }
  43.         if(($arr[$i]+$arr[$j])<$m){
  44.             $i++;
  45.             continue;
  46.         }
  47.         if(($arr[$i]+$arr[$j])==$m){
  48.             echo "($arr[$i]+$arr[$j]=${m})".'
    '
    ;
  49.             $i++;
  50.             $j--;
  51.             continue;
  52.         }
  53.     }
  54. }
  55. $t1=time();
  56.  getM($m,$arr);
  57.  $t2=time();
  58.  echo 't1耗时:'.($t2-$t1).'
    '
    ;
  59. getM2($m,$arr);
  60. $t3=time();
  61. echo 't2耗时:'.($t3-$t2).'
    '
    ;
  62. ?>
阅读(4426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~