常見算法和Lambda

常見算法和Lambda

文章目錄

  • 常見算法和Lambda
    • 常見算法
      • 查找算法
        • 基本查找(順序查找)
        • 二分查找/折半查找
        • 插值查找
        • 斐波那契查找
        • 分塊查找
        • 擴展的分塊查找(無規律的數據)
    • 常見排序算法
      • 冒泡排序
      • 選擇排序
      • 插入排序
      • 快速排序
        • 遞歸
        • 快速排序
    • Arrays
    • Lambda表達式
      • 函數式編程

常見算法

查找算法

基本查找(順序查找)

核心:從0索引開始挨個往后查找

  • 需求定義:一個方法利用基本查找,查找某個元素是否存在
  • 數據如下:{131,127,147,81,103,23,7,79}
package com.example.demo;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79};int number = 81;System.out.println(basicSearch(arr,number));}private static boolean basicSearch(int[] arr, int number) {for (int i = 0; i < arr.length; i++) {if(arr[i] == number){return true;}}return false;}
}
  • 需求:定義一個方法利用基本查找,查詢某個元素在數組中的索引
  • 要求:不需要考慮數組中元素是否重復
package com.example.demo;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79};int number = 81;System.out.println(basicSearch(arr,number));}private static int basicSearch(int[] arr, int number) {for (int i = 0; i < arr.length; i++) {if(arr[i] == number){return i;}}return -1;}
}
  • 需求:定義一個方法利用基本查找,查詢某個元素在數組中的索引
  • 要求:需要考慮數組中元素有重復的可能性
package com.example.demo;import java.util.ArrayList;public class Text{public static void main(String[] args) {int [] arr = {131,127,147,81,103,23,7,79,81};int number = 81;System.out.println(basicSearch(arr,number));}private static ArrayList<Integer> basicSearch(int[] arr, int number) {ArrayList<Integer> list = new ArrayList<>();for (int i = 0; i < arr.length; i++) {if(arr[i] == number){list.add(i);}}return list;}
}
二分查找/折半查找

前提條件:數組中的數據必須是有序的

核心思想:每次排除一半的查找范圍

  • min和max表示當前要查找的范圍
  • mid是在min和max中間的
  • 如果要查找的元素在mid的左邊,縮小范圍時,min不變,max等于mid減一
  • 如果要查找的元素在mid的右邊,縮小范圍,max不變,min等于mid加一
package com.example.demo;public class Text{public static void main(String[] args) {
//        需求:定義一個方法利用二分查找,查詢某個元素在數組中的索引
//        數據如下:{7,23,79,81,103,127,131,147}int [] arr = {7,23,79,81,103,127,131,147};System.out.println(binarySearch(arr,131));}private static int binarySearch(int[] arr, int number) {
//       1.定義兩個變量記錄要查找的范圍int min = 0;int max = arr.length-1;//        2.利用循環不斷地去找要查找的數據while (true){if(min > max){return -1;}//            3.找到min和max的中間位置int mid = (min + max)/2;
//            4.拿著mid指向的元素跟要查找的元素進行比較if (arr[mid] > number){//4.1 number在mid的左邊// min不變,max = min -1;max = mid - 1;}else if(arr[mid] < number){//4.2 number子啊mid的右邊//max不變,min = mid + 1min = mid + 1;}else{//4.3 number跟mid指向的元素一樣//找到了return mid;}}}
}

1720164211486

插值查找

數組中的值,分布比較均勻。

1720164511201

斐波那契查找

1720164773883

1720164896413

分塊查找
  • 前一塊中的最大數據,小于后一塊中所有的數據(塊內無序,塊間有序)
  • 塊數數量一般等于數字的個數開根號。比如:16個數字一般分為4塊左右

核心思路:先確定要查找的元素在哪一塊,然后在塊內挨個查找。

package com.example.demo;public class Text{public static void main(String[] args) {int[] arr = {16,5,9,12,21,18,32,23,37,26,45,34,50,48,61,52,73,66};//創建三個的塊對象Block b1 = new Block(21,0,5);Block b2 = new Block(45,6,11);Block b3 = new Block(73,12,17);//        定義數組用來管理三個塊的對象(索引表)Block[] blockArr = {b1,b2,b3};//        定義一個變量用來記錄要查找的元素int number = 30;//        調用方法,傳遞索引表,數組,要查找的元素int index = getIndex(blockArr,arr,number);//        打印System.out.println(index);}//    利用分塊查找的原理,查詢number的索引
//    1.確定number在索引表的位置private static int getIndex(Block[] blockArr, int[] arr, int number) {//1.確定number是在哪一塊中的int indexBlock = findIndexBlock(blockArr,number);if(indexBlock == -1){//表示number不在數組當中return -1;}//        2.獲取這一塊的起始索引和結束索引int startIndex = blockArr[indexBlock].getStartIndex();int endIndex = blockArr[indexBlock].getEndIndex();//        3.遍歷for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}return -1;}//    定義一個方法,用來確定number在哪一塊public static int findIndexBlock(Block[] blockArr,int number){//從0索引開始遍歷blockArr,如果number小于max,那么就表示number是在這一塊當中的。for (int i = 0; i < blockArr.length; i++) {if(number <= blockArr[i].getMax()){return i;}}return -1;}}class Block{private int max;private int startIndex;private int endIndex;public Block() {}public Block(int max, int startIndex, int endIndex) {this.max = max;this.startIndex = startIndex;this.endIndex = endIndex;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}public int getStartIndex() {return startIndex;}public void setStartIndex(int startIndex) {this.startIndex = startIndex;}public int getEndIndex() {return endIndex;}public void setEndIndex(int endIndex) {this.endIndex = endIndex;}@Overridepublic String toString() {return "Block{" +"max=" + max +", startIndex=" + startIndex +", endIndex=" + endIndex +'}';}
}
擴展的分塊查找(無規律的數據)

1720168388226

package com.example.demo;public class Text{public static void main(String[] args) {int[] arr = {27,22,30,40,36,13,19,16,20,7,10,43,50,48};//創建三個的塊對象Block b1 = new Block(22,40,0,4);Block b2 = new Block(13,20,5,8);Block b3 = new Block(7,10,9,10);Block b4 = new Block(43,50,11,13);//        定義數組用來管理三個塊的對象(索引表)Block[] blockArr = {b1,b2,b3,b4};//        定義一個變量用來記錄要查找的元素int number = 48;//        調用方法,傳遞索引表,數組,要查找的元素int index = getIndex(blockArr,arr,number);//        打印System.out.println(index);}//    利用分塊查找的原理,查詢number的索引
//    1.確定number在索引表的位置private static int getIndex(Block[] blockArr, int[] arr, int number) {//1.確定number是在哪一塊中的int indexBlock = findIndexBlock(blockArr,number);if(indexBlock == -1){//表示number不在數組當中return -1;}//        2.獲取這一塊的起始索引和結束索引int startIndex = blockArr[indexBlock].getStartIndex();int endIndex = blockArr[indexBlock].getEndIndex();//        3.遍歷for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}return -1;}//    定義一個方法,用來確定number在哪一塊public static int findIndexBlock(Block[] blockArr,int number){//從0索引開始遍歷blockArr,如果number小于max,大于min,那么就表示number是在這一塊當中的。for (int i = 0;i < blockArr.length; i++) {if(number <= blockArr[i].getMax() && number >= blockArr[i].getMin()){return i;}}return -1;}}class Block{private int max;private int min;private int startIndex;private int endIndex;public Block() {}public Block(int min,int max, int startIndex, int endIndex) {this.min = min;this.max = max;this.startIndex = startIndex;this.endIndex = endIndex;}public int getMin() {return min;}public void setMin(int min) {this.min = min;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}public int getStartIndex() {return startIndex;}public void setStartIndex(int startIndex) {this.startIndex = startIndex;}public int getEndIndex() {return endIndex;}public void setEndIndex(int endIndex) {this.endIndex = endIndex;}@Overridepublic String toString() {return "Block{" +"max=" + max +", min=" + min +", startIndex=" + startIndex +", endIndex=" + endIndex +'}';}
}

常見排序算法

冒泡排序

  • 相鄰的數據兩兩比較,小的放前面,大的放后面。
  • 第一輪循環結束,最大值已經找到,在數組的最右邊。第二輪可以少循環一次,后面以此類推。
  • 如果數組中有n個數據,總共我們只要執行n-1輪的代碼就可以。
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定義數組int[] arr = {2,4,5,3,1};//        2.利用冒泡排序將數組的數據變成1,2,3,4,5
//        外循環:表示我要執行多少輪,如果有n個數據,那么執行n-1輪for (int i = 0; i < arr.length-1; i++) {
//            內循環:每一輪中我如何比較數據并找到當前的最大值//-1:為了防止索引越界//-i:提高效率,每一輪執行的次數應該比上一輪少一次。for (int j = 0; j < arr.length-1 - i; j++) {if(arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i] + " ");}}
}

選擇排序

  • 從0索引開始,拿著每一個索引上的元素跟后面的元素依次比較,小的放前面,大的放后面,以此類推。
  • 第一輪結束后,最小的數據已經確定
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定義數組int[] arr = {2, 4, 5, 3, 1};//        2.利用選擇排序讓數組變成1 2 3 4 5for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if(arr[i] > arr[j]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

插入排序

  • 將0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一個當成是無序的。
  • 遍歷無序的數據,將遍歷的元素插入有序序列中適當的位置,如遇到相同數據,插在后面。
  • N的范圍:0~最大索引
package com.example.demo;public class Text {public static void main(String[] args) {
//        1.定義數組int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//        2.找到無序的那一組數組是從哪個索引開始的int startIndex= -1;for (int i = 0; i < arr.length; i++) {if(arr[i] > arr[i+1] ){startIndex = i + 1;break;}}//        3.遍歷從startIndex開始到最后一個元素,依次得到無序的那一組數據中的每一個元素for (int i = startIndex; i < arr.length; i++) {
//            記錄當前要插入數據的索引int j = i;while (j > 0 && arr[j] < arr[j-1]){
//                交換位置int temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;j--;}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

快速排序

遞歸

方法中調用方法本身的現象

注意點:遞歸一定要有出口,否則就會出現內存溢出

作用:把一個復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解

遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算

package com.example.demo;public class Text {public static void main(String[] args) {//求1~100之間的和System.out.println(getSum(100));}public static int getSum(int number){if(number == 1){return 1;}//        如果number不是1?return number + getSum(number-1);}
}
package com.example.demo;public class Text {//求5的階乘public static void main(String[] args) {System.out.println(getFactorial(5));}public static int getFactorial(int number){if(number == 1){return 1;}
//        如果number不是1?return number * getFactorial(number-1);}
}
快速排序

第一輪:把0索引的數字作為基準數,確定基準數在數組中正確的位置。

比基準數小的全部在左邊,比基準數大的全部在右邊。

package com.example.demo;public class Text {public static void main(String[] args) {int[] arr = {6,1,2,7,9,3,4,5,10,8};quickSort(arr,0,arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void quickSort(int[] arr,int i,int j){
//        定義兩個變量記錄要查找的范圍int start= i;int end = j;if(start > end){return;}//        記錄基準數int baseNumber = arr[i];
//        利用循環找到要交換的數字while (start != end) {
//            利用end,從后往前開始找,找比基準數小的數字while (true){if(end <= start || arr[end] < baseNumber){break;}end--;}
//            利用start,從前往后找,找比基準數大的數字while (true){if(end <= start || arr[start] > baseNumber){break;}start++;}
//            把end和start指向的元素進行交換int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}
//    當start和end直系那個了同一個元素的時候,那么上面的循環就會結束
//    表示已經找到了基準數在數組中應存入的位置
//    基準數歸位int temp = arr[i];arr[i] = arr[start];arr[start] = temp;//        確定6左邊的范圍,重復剛剛所做的事情quickSort(arr,i,start-1);
//        確定6右邊的范圍,重復剛剛所做的事情quickSort(arr,start+1,j);}}

1720173652777

Arrays

操作數組的工具類

1720174919002

1720175136896

1720175208004

1720175250562

1720175475272

1720175524323

1720175695912

1720175851349

Lambda表達式

函數式編程

是一種思想特點。函數式編程思想忽略面向對象的復雜語法,強調做什么,而不是誰去做。

1720176866498

1720176984576

1720177474422
1720177720800

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41005.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot新手快速入門系列教程二:MySql5.7.44的免安裝版本下載和配置,以及簡單的Mysql生存指令指南。

我們要如何選擇MySql 目前主流的Mysql有5.0、8.0、9.0 主要區別 MySQL 5.0 發布年份&#xff1a;2005年特性&#xff1a; 基礎事務支持存儲過程、觸發器、視圖基礎存儲引擎&#xff08;如MyISAM、InnoDB&#xff09;外鍵支持基本的全文搜索性能和擴展性&#xff1a; 相對較…

2024年江蘇省研究生數學建模競賽B題火箭煙幕彈運用策略優化論文和代碼分析

經過不懈的努力&#xff0c; 2024年江蘇省研究生數學建模競賽B題火箭煙幕彈運用策略優化論文和代碼已完成&#xff0c;代碼為B題全部問題的代碼&#xff0c;論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解&#xff08;問題1模型的建立和求解、問題2模…

[學習筆記]SQL學習筆記(連載中。。。)

學習視頻&#xff1a;【數據庫】SQL 3小時快速入門 #數據庫教程 #SQL教程 #MySQL教程 #database#Python連接數據庫 目錄 1.SQL的基礎知識1.1.表(table)和鍵(key)1.2.外鍵、聯合主鍵 2.MySQL安裝&#xff08;略&#xff0c;請自行參考視頻&#xff09;3.基本的MySQL語法3.1.規…

進程控制-fork函數

一個進程&#xff0c;包括代碼、數據和分配給進程的資源。 fork &#xff08;&#xff09;函數通過系統調用創建一個與原來進程幾乎完全相同的進程&#xff0c;也就是兩個進程可以做完全相同的事&#xff0c;但如果初始參數或者傳入的變量不同&#xff0c;兩個進程也可以做不同…

DatawhaleAI夏令營2024 Task2

#AI夏令營 #Datawhale #夏令營 賽題解析一、Baseline詳解1.1 環境配置1.2 數據處理任務理解2.3 prompt設計2.4 數據抽取 二、完整代碼總結 賽題解析 賽事背景 在數字化時代&#xff0c;企業積累了大量對話數據&#xff0c;這些數據不僅是交流記錄&#xff0c;還隱藏著寶貴的信…

【鴻蒙學習筆記】@Link裝飾器:父子雙向同步

官方文檔&#xff1a;Link裝飾器&#xff1a;父子雙向同步 目錄標題 [Q&A] Link裝飾器作用 [Q&A] Link裝飾器特點樣例&#xff1a;簡單類型樣例&#xff1a;數組類型樣例&#xff1a;Map類型樣例&#xff1a;Set類型樣例&#xff1a;聯合類型 [Q&A] Link裝飾器作用…

信號與系統-實驗6-離散時間系統的 Z 域分析

一、實驗目的 1、掌握 z 變換及其性質&#xff1b;了解常用序列的 z 變換、逆 z 變換&#xff1b; 2、掌握利用 MATLAB 的符號運算實現 z 變換&#xff1b; 3、掌握利用 MATLAB 繪制離散系統零、極點圖的方法&#xff1b; 4、掌握利用 MATLAB 分析離散系統零、極點的方法&a…

字符串中的注意事項

在比較早的C/C版本中&#xff0c;經常可以看到推薦使用gets函數來進行整行字符串的輸入&#xff0c;就像下面這樣的簡單寫法即可輸入一整行&#xff1a; C gets(str);但是當輸入的字符串長度超過數組長度上限MAX_LEN時&#xff0c;gets函數會把超出的部分也一并讀進來&#x…

MySQL基礎篇(二)字符集以及校驗規則

在MySQL基礎篇&#xff08;一&#xff09;中&#xff0c;我們知道了如何創建數據庫&#xff0c;這篇文章帶大家了解創建的一些細節。 紅色框&#xff1a;可省略&#xff0c;作用如果存在相同的數據庫名稱&#xff0c;就不會再創建&#xff0c;反之&#xff0c;創建。 藍色框&…

uniapp 封裝請求

新建request文件夾 下新建index.js 和index.js 或者創建units文件放入index.js 和api文件夾放入index.js(api.js)//看公司規范 1. index.js // 全局請求封裝 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…

可用于多個微信管理的神器

以下僅是多微信聚合聊天管理界面&#xff1a; 可以在一個頁面上同時收發多個微信的消息&#xff0c;可以添加好友&#xff0c;通過好友請求。 可以修改昵稱&#xff0c;不受字數限制。 可以將常用圖片&#xff0c;文件等放入素材庫&#xff0c;方便聊天時查找和發送。 可以設置…

速盾:cdn 緩存圖片

現如今&#xff0c;互聯網已經成為我們日常生活中不可或缺的一部分。在我們使用互聯網時&#xff0c;經常會遇到圖片加載緩慢、文章打開慢等問題。為了解決這些問題&#xff0c;CDN&#xff08;內容分發網絡&#xff09;應運而生。CDN 是一種通過將數據緩存在世界各地的服務器上…

集群環境下,調用半數以上節點進行數據同步的實現

核心實現是使用CountDownLatch來實現的&#xff0c;先取集群節點總數一半以上數量的CountDownLatch 再發送請求調用其他節點&#xff0c;在這個過程中對于正常響應的節點進行latch.countDown(); 最后再統計數量是否為0再決定是否拋異常 // 請求參數final String content jso…

Java:封裝

文章目錄 一、概念二、實現三、測試四、總結 一、概念 在面向對象編程中&#xff0c; 封裝從字面上來理解就是包裝的意思&#xff0c;特點就是信息隱藏&#xff0c;防止該類的代碼和數據被外部類的代碼隨機訪問。 封裝的優點&#xff1a; 良好的封裝能夠減少耦合。 統一接口…

搜索旋轉數組

題目鏈接 搜索旋轉數組 題目描述 注意點 數組已被旋轉過很多次數組元素原先是按升序排列的若有多個相同元素&#xff0c;返回索引值最小的一個 解答思路 首先需要知道的是&#xff0c;本題數組中的旋轉多次只是將頭部的某些元素移動到尾部&#xff0c;所以不論怎么旋轉&am…

uni-app怎樣使用組件

在uni-app中使用組件&#xff0c;主要遵循以下幾個步驟&#xff1a; 創建組件文件&#xff1a;在UniApp項目中創建一個新的組件&#xff0c;通常將組件文件保存在components文件夾下。如果components文件夾不存在&#xff0c;需要先創建它。然后在components文件夾下創建一個新…

Pycharm python解釋器 unsupported python 3.1 解決

Pycharm 環境 unsupported python 3.1解決 1. 問題重現2. 原因分析3. 解決方法 1. 問題重現 之前使用Pycharm 2024.1.1的時候&#xff0c;環境配置的Python 3.11.9&#xff0c;現在改成使用Pycharm 2020.2.2&#xff0c;結果Python解釋器顯示“unsupported python 3.1”&#…

Java ORM框架FastMybatis踩坑

Java ORM框架FastmyBatis踩坑 問題&#xff1a;使用了FastmyBatis的saveOrUpdate方法&#xff0c;明明設置了主鍵的值且表中存在&#xff0c;但是依然執行insert操作。導致Duplicate PK。 原因&#xff1a;使用了其他第三方包的注解指定表的主鍵&#xff0c;沒有按照FastmyBat…

低音炮內存卡格式化后無法播放音樂文件

試了多次 不支持ntfs不支持exfat 僅支持fat32 FAT32與exFAT的區別主要體現在來源、單個文件限制、適用情況以及兼容性方面。12 來源&#xff1a; FAT32是Windows平臺的傳統文件格式&#xff0c;首次在Windows 95第二版中引入&#xff0c;旨在取代FAT16&#xff0c;具有良好的…

自動駕駛中的逆透視變換(Inverse Perspective Mapping,IPM)詳解

前言 IPM(Inverse Perspective Mapping,逆透視變換)圖的歷史可以追溯到計算機視覺和圖像處理領域的發展。逆透視變換是一種用于消除圖像中透視效應的技術,使得原本由于透視產生的形變得以糾正,進而更準確地描述和理解圖像中的場景。比如在行車中的車道線檢測,泊車中的常見…