日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

查找算法-志宇

發布時間:2024/3/26 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查找算法-志宇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里寫自定義目錄標題

    • 二分法
    • 插值查找算法
    • 斐波那契(黃金分割法)查找算法
    • 字符串暴力匹配算法
    • kmp字符串匹配算法

二分法

思想
每次和中間值進行比較(以中間點為分割點)
如果中間值小則取中間值右側部分中間值繼續比較
如果中間值大則取中間值左側部分中間值繼續比較
代碼

public class BinarySearchFind {public static void main(String[] args) {int [] arr = {1,8, 10, 89, 1000, 1234};int binarySearch = binarySearch(arr,0,arr.length-1,1234);System.out.println(arr[binarySearch]);}private static int binarySearch(int[] arr, int left, int right,int searchValue) {//代表數組中沒有這個值if(left>right){return -1;}//取得中間值int mid=(left+right)/2;if(searchValue<arr[mid]){//向左面進行查找return binarySearch(arr,left,mid-1,searchValue);}else if(searchValue>arr[mid]){//向右面進行查找return binarySearch(arr,mid+1,right,searchValue);}else{//返回位置return mid;}} }

插值查找算法

思想
和二分查找思想相同,
只是每次取的不是中間點(根據比例計算獲得分割點)
如下圖:中間切割點如下

如下圖:經過中間切割點思想 可以按比例獲得切割點位置

優點:對于數據量較大,關鍵字分布比較均勻的查找,采用插值查找, 速度比二分法快.
代碼

public class BinarySearchFind {public static void main(String[] args) {int [] arr = {1,8, 10, 89, 1000, 1234};int binarySearch = binarySearch(arr,0,arr.length-1,1234);System.out.println(arr[binarySearch]);}private static int binarySearch(int[] arr, int left, int right,int searchValue) {//代表數組中沒有這個值if(left>right){return -1;}//取得中間值int mid=left+(searchValue-arr[left])/(arr[right]-arr[left])*(right-left);if(searchValue<arr[mid]){//向左面進行查找return binarySearch(arr,left,mid-1,searchValue);}else if(searchValue>arr[mid]){//向右面進行查找return binarySearch(arr,mid+1,right,searchValue);}else{//返回位置return mid;}} }

斐波那契(黃金分割法)查找算法

思想
每次以0.618為分割點,在眾多數據中的得到的數據更加完美,但速度較慢
代碼

public class BinarySearchFind {public static void main(String[] args) {int [] arr = {1,8, 10, 89, 1000, 1234};System.out.println("index=" + fibSearch(arr, 1234));}private static int fibSearch(int[] arr, int searchValue) {//創建對應的斐波那契數組int [] feiBoArr=new int[30];CreateFibonacciArray(feiBoArr);//找到數組長度對應的斐波那契數中的值int k=0;while(feiBoArr[k]<arr.length){k++;}//將數組填充斐波那契長度,多出長度用0填充int[] tempArr=Arrays.copyOf(arr, feiBoArr[k]);//將最大數填充到數組末尾 [1, 8, 10, 89, 1000, 1234, 1234, 1234]for(int i=arr.length;i<tempArr.length;i++){tempArr[i]=arr[arr.length-1];}int left=0;int right=tempArr.length-1;while(left<right){//中間坐標位置 =左面坐標+斐波納契中間坐標int mid=left+feiBoArr[k-1];if(searchValue >tempArr[mid]){//要查找的值在右面left=mid+1;//1. 全部元素 = 前面的元素 + 后邊元素//2. f[x]=f[x-2]+f[x-1]//其中f[x-2] 為左面部分,f[x-1]為右面部分//f[x-2]<f[x-1], 右面部分大//下次的分割點就是 f[x-1-1]k--;}else if(searchValue < tempArr[mid]){//要查找的值在左面right=mid-1;//1. 全部元素 = 前面的元素 + 后邊元素//2. f[x]=f[x-2]+f[x-1]//其中f[x-2] 為左面部分,f[x-1]為右面部分//f[x-2]<f[x-1], 左面部分小 //下次的分割點就是 f[x-2-1]k--;k--;}else{//因為后面有的數是填充的,如果匹配到填充的數,則直接返回數組最大索引if(arr[arr.length-1]==tempArr[mid]){return arr.length-1;}return mid;}}return -1;}/*** 創建斐波那契數組*/public static void CreateFibonacciArray(int[] arr){arr[0]=1;arr[1]=1;for(int i=2;i<arr.length;i++){arr[i]=arr[i-1]+arr[i-2]; }}}

字符串暴力匹配算法

思想
每次只移動一位,若是不匹配,移動到下一位接著判斷,浪費了大量的時間
代碼

public class ViolenceMatch {public static void main(String[] args) {String str="asdfa asdfb asdfc asdfd";String match="asdfc";int index=violenceMatch(str,match);System.out.println(index);}private static int violenceMatch(String str, String match) {//每次匹配失敗復原的位置int temp=0;//循環遍歷每個字符for(int i=0,j=0;i<str.length();i++){temp=i;while(str.charAt(i) == match.charAt(j)){i++;j++;if(j == match.length()){//返回匹配出來的位置return i-match.length();}}//這里應用回溯i=temp;j=0;}return -1;} }

kmp字符串匹配算法

思想
在匹配不成功時回溯的位置不是下一位,而是經過計算的指定位置
圖解
部分匹配值”就是”前綴”和”后綴”的最長的共有元素的長度。以”ABCDABD”為例
-”A”的前綴和后綴都為空集,共有元素的長度為0;
-”AB”的前綴為[A],后綴為[B],共有元素的長度為0;
-”ABC”的前綴為[A, AB],后綴為[BC, C],共有元素的長度0;
-”ABCD”的前綴為[A, AB, ABC],后綴為[BCD, CD, D],共有元素的長度為0;
-”ABCDA”的前綴為[A, AB, ABC, ABCD],后綴為[BCDA, CDA, DA, A],共有元素為”A”,A的長度為1;
-”ABCDAB”的前綴為[A, AB, ABC, ABCD, ABCDA],后綴為[BCDAB, CDAB, DAB, AB, B],共有元素為”AB”,AB的長度為2;
-”ABCDABD”的前綴為[A, AB, ABC, ABCD, ABCDA, ABCDAB],后綴為[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長度為0。

代碼

總結

以上是生活随笔為你收集整理的查找算法-志宇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。