99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組_數(shù)據(jù)分析師
數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組_數(shù)據(jù)分析師
2014-12-10
收藏

數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組_數(shù)據(jù)分析師

數(shù)組是應(yīng)用最廣泛的一種數(shù)據(jù)結(jié)構(gòu),常常被植入到編程語(yǔ)言中,作為基本數(shù)據(jù)類(lèi)型使用,因此,在一些教材中,數(shù)組并沒(méi)有被當(dāng)做一種數(shù)據(jù)結(jié)構(gòu)單獨(dú)拿出來(lái)講 解(其實(shí)數(shù)組就是一段連續(xù)的內(nèi)存,即使在物理內(nèi)存中不是連續(xù)的,在邏輯上肯定是連續(xù)的)。其實(shí)沒(méi)必要在概念上做糾纏,數(shù)組可以當(dāng)做學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的敲門(mén)磚, 以此為基礎(chǔ),了解數(shù)據(jù)結(jié)構(gòu)的基本概念以及構(gòu)建方法數(shù)據(jù)結(jié)構(gòu)不僅是數(shù)據(jù)的容器,還要提供對(duì)數(shù)據(jù)的操作方法,比如檢索、插入、刪除、排序等。

無(wú)序數(shù)組

下面我們建立一個(gè)類(lèi),對(duì)數(shù)組的檢索、插入、刪除、打印操作進(jìn)行封裝,簡(jiǎn)便起見(jiàn),我們假設(shè)數(shù)組中沒(méi)有重復(fù)值(實(shí)際上數(shù)組可以包含重復(fù)值)。

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. public class Array { 
  2.        
  3.       private String [] strArray; 
  4.       private int length = 0;       //數(shù)組元素個(gè)數(shù) 
  5.              
  6.       //構(gòu)造方法,傳入數(shù)組最大長(zhǎng)度 
  7.       public Array(int max){ 
  8.              strArray = new String [max]; 
  9.       } 
  10.        
  11.       //檢測(cè)數(shù)組是否包含某個(gè)元素,如果存在返回其下標(biāo),不存在則返回-1 
  12.       public int contains(String target){ 
  13.              int index = -1
  14.              for(int i=0;i<length;i++){ 
  15.                     if(strArray[i] == target){ 
  16.                            index = i; 
  17.                            break
  18.                     } 
  19.              } 
  20.              return index; 
  21.       } 
  22.        
  23.       //插入 
  24.       public void insert(String elem) { 
  25.              strArray[length] = elem; 
  26.              length++; 
  27.       } 
  28.        
  29.       //刪除某個(gè)指定的元素值,刪除成功則返回true,否則返回false 
  30.       public boolean delete(String target){ 
  31.              int index = -1
  32.              if((index = contains(target)) !=-1){ 
  33.                     for(int i=index;i<length-1;i++){ 
  34.                            //刪除元素之后的所有元素前移一位 
  35.                            strArray[i] =strArray[i+1];   
  36.                     } 
  37.                     length--; 
  38.                     return true
  39.              }else
  40.                     return false
  41.              } 
  42.       } 
  43.        
  44.       //列出所有元素 
  45.       public void display(){ 
  46.              for(int i=0;i<length;i++){ 
  47.                     System.out.print(strArray[i]+"\t"); 
  48.              } 
  49.       } 
  50.        

 

無(wú)序數(shù)組的優(yōu)點(diǎn):插入快,如果知道下標(biāo),可以很快的存取

無(wú)序數(shù)組的缺點(diǎn):查找慢,刪除慢,大小固定。

有序數(shù)組

所謂的有序數(shù)組就是指數(shù)組中的元素是按一定規(guī)則排列的,其好處就是在根據(jù)元素值查找時(shí)可以是使用二分查找,查找效率要比無(wú)序數(shù)組高很多,在數(shù)據(jù)量很大時(shí)更加明顯。當(dāng)然缺點(diǎn)也顯而易見(jiàn),當(dāng)插入一個(gè)元素時(shí),首先要判斷該元素應(yīng)該插入的下標(biāo),然后對(duì)該下標(biāo)之后的所有元素后移一位,才能進(jìn)行插入,這無(wú)疑增加了很大的開(kāi)銷(xiāo)。

因此,有序數(shù)組適用于查找頻繁,而插入、刪除操作較少的情況。

有序數(shù)組的封裝類(lèi)如下,為了方便,我們依然假設(shè)數(shù)組中是沒(méi)有重復(fù)值的,并且數(shù)據(jù)是按照由小到大的順序排列的。

 

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. public class OrderArray { 
  2.       private int [] intArray; 
  3.       private int length = 0;       //數(shù)組元素個(gè)數(shù) 
  4.        
  5.       //構(gòu)造方法,傳入數(shù)組最大長(zhǎng)度 
  6.       public OrderArray(int max){ 
  7.              intArray = new int [max]; 
  8.       } 
  9.        
  10.       //用二分查找法定位某個(gè)元素,如果存在返回其下標(biāo),不存在則返回-1 
  11.       public int find(int target){ 
  12.              int lowerBound = 0;                 //搜索段最小元素的小標(biāo) 
  13.              int upperBound = length-1;      //搜索段最大元素的下標(biāo) 
  14.              int curIn;                                   //當(dāng)前檢測(cè)元素的下標(biāo) 
  15.              
  16.              if(upperBound<0){     //如果數(shù)組為空,直接返回-1 
  17.                     return -1
  18.              } 
  19.              
  20.              while(true){ 
  21.                     curIn =(lowerBound+upperBound)/2
  22.                      
  23.                     if(target == intArray[curIn]){ 
  24.                            return curIn; 
  25.                     }else if(curIn ==lowerBound){ 
  26.                     //在當(dāng)前下標(biāo)與搜索段的最小下標(biāo)重合時(shí),代表搜索段中只包含1個(gè)或2個(gè)元素, 
  27.                     //如果低位元素和高位元素都不等于目標(biāo)元素,證明數(shù)組中沒(méi)有該元素,搜索結(jié)束 
  28.                            if(target !=intArray[upperBound]){ 
  29.                                   return -1
  30.                            } 
  31.                     }else{//搜索段中的元素至少有三個(gè),且當(dāng)前元素不等于目標(biāo)元素 
  32.                            if(intArray[curIn]< target){ 
  33.                                   //如果當(dāng)前元素小于目標(biāo)元素,則將下一個(gè)搜索段的最小下標(biāo)置為當(dāng)前元素的下標(biāo) 
  34.                                   lowerBound =curIn; 
  35.                            }else
  36.                                   //如果當(dāng)前元素大于目標(biāo)元素,則將下一個(gè)搜索段的最大下標(biāo)置為當(dāng)前元素的下標(biāo) 
  37.                                   upperBound =curIn; 
  38.                            } 
  39.                     } 
  40.              } 
  41.       } 
  42.        
  43.       //插入 
  44.       public void insert(int elem) { 
  45.              int location = 0
  46.              
  47.              //判斷應(yīng)插入位置的下標(biāo) 
  48.              for(;location<length;location++){ 
  49.                     if(intArray[location] >elem) 
  50.                            break
  51.              } 
  52.              //System.out.println(location); 
  53.              //將插入下標(biāo)之后的所有元素后移一位 
  54.              for(inti=length;i>location;i--){ 
  55.                     intArray[i] = intArray[i-1]; 
  56.              } 
  57.              
  58.              //插入元素 
  59.              intArray[location] = elem; 
  60.              
  61.              length++; 
  62.       } 
  63.        
  64.       //刪除某個(gè)指定的元素值,刪除成功則返回true,否則返回false 
  65.       public boolean delete(int target){ 
  66.              int index = -1
  67.              if((index = find(target)) != -1){ 
  68.                     for(inti=index;i<length-1;i++){ 
  69.                            //刪除元素之后的所有元素前移一位 
  70.                            intArray[i] = intArray[i+1];   
  71.                     } 
  72.                     length--; 
  73.                     return true
  74.              }else
  75.                     return false
  76.              } 
  77.       } 
  78.        
  79.       //列出所有元素 
  80.       public void display(){ 
  81.              for(int i=0;i<length;i++){ 
  82.                     System.out.print(intArray[i]+"\t"); 
  83.              } 
  84.              System.out.println(); 
  85.       } 

 

有序數(shù)組最大的優(yōu)勢(shì)就是可以提高查找元素的效率,在上例中,find方法使用了二分查找法,該算法的示意圖如下:

這個(gè)方法在一開(kāi)始設(shè)置變量lowerBound和upperBound指向數(shù)組的第一個(gè)和最后一個(gè)非空數(shù)據(jù)項(xiàng)。通過(guò)設(shè)置這些變量可以確定查找的范圍。然后再while循環(huán)中,當(dāng)前的下標(biāo)curIn被設(shè)置為這個(gè)范圍的中間值。

如果curIn就是我們要找的數(shù)據(jù)項(xiàng),則返回下標(biāo),如果不是,就要分兩種情況來(lái)考慮:如果curIn指向的數(shù)據(jù)項(xiàng)比我們要找的數(shù)據(jù)小,則證明該元素 只可能在curIn和upperBound之間,即數(shù)組后一半中(數(shù)組是從小到大排列的),下輪要從后半段檢索;如果curIn指向的數(shù)據(jù)項(xiàng)比我們要找的 數(shù)據(jù)大,則證明該元素只可能在lowerBound和curIn之間,下一輪要在前半段中檢索。文章來(lái)自:CDA數(shù)據(jù)分析師培訓(xùn)官網(wǎng)

按照上面的方法迭代檢索,直到結(jié)束。

有序數(shù)組的優(yōu)點(diǎn):查找效率高

有序數(shù)組的缺點(diǎn):刪除和插入慢,大小固定

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢(xún)
客服在線
立即咨詢(xún)
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }