和風細雨

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

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

          成員類:
          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 和風細雨 閱讀(3025) 評論(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才是鏈表, 而且鏈表是不支持二分查找的.  回復  更多評論   

          主站蜘蛛池模板: 读书| 乌什县| 萝北县| 潮州市| 鄂州市| 宁晋县| 武宣县| 合山市| 巨野县| 高邮市| 依安县| 成安县| 图片| 潮安县| 娄烦县| 澄城县| 孟津县| 秦皇岛市| 日喀则市| 弋阳县| 丁青县| 五常市| 桐梓县| 共和县| 宁波市| 潮州市| 井研县| 延长县| 军事| 肃北| 南宫市| 五台县| 福安市| 江陵县| 子洲县| 汶川县| 平顶山市| 余江县| 彩票| 金川县| 安陆市|