和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          二分查找示例二(對鏈表進行查找)

          成員類:
          package com.junglesong;

          public class Member implements Comparable{
              
          private String name;
              
          private int age;
              
              
          public Member(String name,int age){
                  
          this.name=name;
                  
          this.age=age;
              }

              
              
          /**
               * 實現成員比較
               
          */

              
          public int compareTo(Object obj){
                  Member another
          =(Member)obj;
                  
          return this.name.compareTo(another.name);
              }

              
              
          /**
               * 實現成員相等運算
               
          */

              
          public boolean equals(Object obj){
                  Member another
          =(Member)obj;
                  
          return this.name.equals(another.name);
              }

              
              
          public String toString(){
                  
          return "名="+name+" 年齡="+age;
              }


              
          public int getAge() {
                  
          return age;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }

          }


          二分查找類:
          package com.junglesong;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 二分查找示例二(對鏈表進行查找)
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class BinSearch2{
              
          public static void main(String[] args){
                  
          // 欲查找的鏈表
                  List<Member> members=new ArrayList<Member>();
                  members.add(
          new Member("Andy",21));
                  members.add(
          new Member("Bill",22));
                  members.add(
          new Member("Cindy",23));
                  members.add(
          new Member("Douglas",24));
                  members.add(
          new Member("Felex",25));
                  members.add(
          new Member("Green",26));
                  
                  
          // 測試鏈表
                  List<Member> tempList=new ArrayList<Member>();
                  tempList.add(
          new Member("Bill",22));
                  tempList.add(
          new Member("Cindy",23));
                  tempList.add(
          new Member("Douglas",24));
                  tempList.add(
          new Member("Felex",25));
                  tempList.add(
          new Member("Hill",26));
                  
                  
          for(Member member:tempList){
                      System.out.println(
          "成員"+member+"的下標為"+binSearch(members,member));
                  }

              }

              
              
          /**
               * 二分查找
               * 
          @param sortedArray 已排序的欲查找的鏈表
               * 
          @param seachValue 查找的值
               * 
          @return 找到的元素下標,若找不到則返回-1
               
          */

              
          public static int binSearch(List<Member> sortedList,Member seachValue){
                  
          // 左邊界
                  int leftBound=0;
                  
          // 右邊界
                  int rightBound=sortedList.size()-1;
                  
          // 當前下標位置
                  int curr;
                  
                  
          while(true){
                      
          // 定位在左邊界和右邊界中間
                      curr=(leftBound+rightBound)/2;
                      
                      
          if(sortedList.get(curr).equals(seachValue)){
                          
          // 找到值
                          return curr;
                      }

                      
          else if(leftBound>rightBound){
                          
          // 左邊界大于右邊界,已經找不到值
                          return -1;
                      }

                      
          else{
                          
          if(sortedList.get(curr).compareTo(seachValue)<0){
                              
          // 當當前下標對應的值小于查找的值時,縮短左邊界
                              leftBound=curr+1;
                          }

                          
          else{
                              
          // 當當前下標對應的值大于查找的值時,縮短右邊界
                              rightBound=curr-1;
                          }

                      }

                  }

              }

          }

          代碼下載:
          http://www.aygfsteel.com/Files/junglesong/BinSearch20080308150836.rar

          posted on 2008-03-08 15:00 和風細雨 閱讀(3016) 評論(3)  編輯  收藏 所屬分類: 算法

          評論

          # re: 二分查找示例二(對鏈表進行查找) 2010-06-26 01:21 tnt_vampire

          二分查找用在鏈表上不但不能使時間復雜度降為O(logN),反而比遍歷的O(N)復雜度更大,變為了O(NlogN),這是因為每次對鏈表取下標都相當要去遍歷一次鏈表;一般來說二分查找只適用于真正可隨機訪問的容器(如vector)。  回復  更多評論   

          # re: 二分查找示例二(對鏈表進行查找) 2010-06-26 02:14 tnt_vampire

          Sorry,把java接口當c++容器看待了,ArrayList確實是支持隨機訪問的類,不過博主你這里把List說成鏈表很容易讓人誤會,只能說List是支持下標索引的接口,具體實現可不一定支持隨機訪問的哦。  回復  更多評論   

          # re: 二分查找示例二(對鏈表進行查找) 2011-03-07 16:44 kevintse

          java中ArrayList不是鏈表, LinkedList才是鏈表, 而且鏈表是不支持二分查找的.  回復  更多評論   

          主站蜘蛛池模板: 洛阳市| 遵义市| 建水县| 鞍山市| 阳高县| 白沙| 大同市| 根河市| 和林格尔县| 文登市| 浦江县| 客服| 黎平县| 定边县| 静宁县| 天柱县| 襄汾县| 兴义市| 商河县| 新宾| 凤阳县| 平凉市| 绍兴市| 湘西| 湘阴县| 龙里县| 翁牛特旗| 宜章县| 乌恰县| 繁昌县| 从化市| 西乡县| 清水县| 灵璧县| 和顺县| 黄浦区| 闽侯县| 临朐县| 江山市| 玉屏| 贡觉县|