青少年編程與數學 02-018 C++數據結構與算法 10課題、搜索[查找]

青少年編程與數學 02-018 C++數據結構與算法 10課題、搜索[查找]

  • 一、線性搜索(Linear Search)
        • 原理
        • 實現步驟
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 二、二分搜索(Binary Search)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 三、深度優先搜索(Depth-First Search, DFS)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 四、廣度優先搜索(Breadth-First Search, BFS)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 五、A* 搜索算法
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 六、跳躍搜索(Jump Search)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 七、插值搜索(Interpolation Search)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 八、斐波那契搜索(Fibonacci Search)
        • 原理
        • 代碼示例(C++)
        • 復雜度分析
        • 優缺點
  • 九、搜索算法的總結
  • 十、搜索算法的用途
      • (一)數據處理和分析
      • (二)搜索引擎
      • (三)人工智能和機器學習
      • (四)網絡通信
      • (五)游戲開發
      • (六)電子商務
      • (七)文件系統
      • (八)圖像和音頻處理
      • (九)金融領域
      • (十)物流和供應鏈管理
      • (十一)社交網絡
      • (十二)生物信息學
      • (十三)軟件開發
      • (十四)硬件設計
      • (十五)教育和研究
      • 總結

課題摘要:
搜索(查找)算法是計算機科學中用于在數據結構中查找特定元素的一類算法。這些算法在各種應用場景中都非常重要,例如在數據庫中查找記錄、在文件系統中查找文件、在網頁中查找關鍵詞等。搜索算法可以根據數據結構的不同和查找效率的需求分為多種類型。


一、線性搜索(Linear Search)

線性搜索是最簡單的搜索算法,它通過逐個檢查數組中的每個元素來查找目標值。

原理

從數組的第一個元素開始,逐個與目標值進行比較,直到找到目標值或遍歷完整個數組。

實現步驟
  1. 從數組的第一個元素開始。
  2. 將當前元素與目標值進行比較。
  3. 如果當前元素等于目標值,返回當前索引。
  4. 如果當前元素不等于目標值,移動到下一個元素。
  5. 如果遍歷完整個數組仍未找到目標值,返回 -1 表示未找到。
代碼示例(C++)
#include <iostream>
#include <vector>
using namespace std;int linear_search(const vector<int>& arr, int target) {for (size_t i = 0; i < arr.size(); ++i) {if (arr[i] == target) {return i;  // 返回目標值的索引}}return -1;  // 如果未找到,返回 -1
}// 示例
int main() {vector<int> arr = {10, 20, 30, 40, 50};int target = 30;cout << "Index of target: " << linear_search(arr, target) << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(n)),其中 (n) 是數組的長度。
  2. 空間復雜度:(O(1)),不需要額外的存儲空間。
優缺點
  1. 優點:實現簡單,適用于小規模數據。
  2. 缺點:效率較低,對于大規模數據,查找速度較慢。

二、二分搜索(Binary Search)

二分搜索是一種高效的搜索算法,它要求數組必須是有序的。通過不斷將搜索范圍縮小一半來查找目標值。

原理
  1. 初始化兩個指針,left 指向數組的起始位置,right 指向數組的末尾。
  2. 計算中間位置 mid
  3. 如果 arr[mid] 等于目標值,返回 mid
  4. 如果 arr[mid] 小于目標值,將 left 移動到 mid + 1
  5. 如果 arr[mid] 大于目標值,將 right 移動到 mid - 1
  6. 重復上述步驟,直到 left 大于 right,表示未找到目標值。
代碼示例(C++)
#include <iostream>
#include <vector>
using namespace std;int binary_search(const vector<int>& arr, int target) {int left = 0, right = arr.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;  // 返回目標值的索引} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;  // 如果未找到,返回 -1
}// 示例
int main() {vector<int> arr = {10, 20, 30, 40, 50};int target = 30;cout << "Index of target: " << binary_search(arr, target) << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(\log n)),其中 (n) 是數組的長度。
  2. 空間復雜度:(O(1)),不需要額外的存儲空間。
優缺點
  1. 優點:效率高,適用于大規模有序數據。
  2. 缺點:要求數組必須是有序的,對于無序數據需要先排序。

三、深度優先搜索(Depth-First Search, DFS)

深度優先搜索是一種用于遍歷或搜索樹或圖的算法。它從根節點開始,沿著當前分支盡可能深地搜索,直到達到葉子節點或目標節點,然后回溯。

原理
  1. 從根節點開始。
  2. 選擇一個子節點,沿著該子節點繼續搜索。
  3. 如果當前節點是目標節點,返回成功。
  4. 如果當前節點沒有子節點或所有子節點都已訪問過,回溯到上一個節點。
  5. 重復上述步驟,直到找到目標節點或所有節點都已訪問過。
代碼示例(C++)
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;bool dfs(const unordered_map<char, vector<char>>& graph, char start, char target, unordered_set<char>& visited) {visited.insert(start);if (start == target) {return true;}for (char neighbor : graph.at(start)) {if (visited.find(neighbor) == visited.end()) {if (dfs(graph, neighbor, target, visited)) {return true;}}}return false;
}// 示例
int main() {unordered_map<char, vector<char>> graph = {{'A', {'B', 'C'}},{'B', {'D', 'E'}},{'C', {'F'}},{'D', {}},{'E', {'F'}},{'F', {}}};char start = 'A';char target = 'F';unordered_set<char> visited;cout << "Target found: " << (dfs(graph, start, target, visited) ? "true" : "false") << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(V + E)),其中 (V) 是節點數,(E) 是邊數。
  2. 空間復雜度:(O(V)),用于存儲訪問過的節點。
優缺點
  1. 優點:實現簡單,適用于查找路徑或連通性問題。
  2. 缺點:可能會陷入無限循環,對于有環圖需要額外處理。

四、廣度優先搜索(Breadth-First Search, BFS)

廣度優先搜索是一種用于遍歷或搜索樹或圖的算法。它從根節點開始,逐層訪問所有節點,直到找到目標節點。

原理
  1. 從根節點開始,將其加入隊列。
  2. 從隊列中取出一個節點,訪問該節點。
  3. 將該節點的所有未訪問的子節點加入隊列。
  4. 重復上述步驟,直到隊列為空或找到目標節點。
代碼示例(C++)
#include <iostream>
#include <queue>
#include <unordered_set>
#include <unordered_map>
using namespace std;bool bfs(const unordered_map<char, vector<char>>& graph, char start, char target) {unordered_set<char> visited;queue<char> q;q.push(start);while (!q.empty()) {char node = q.front();q.pop();if (node == target) {return true;}if (visited.find(node) == visited.end()) {visited.insert(node);for (char neighbor : graph.at(node)) {if (visited.find(neighbor) == visited.end()) {q.push(neighbor);}}}}return false;
}// 示例
int main() {unordered_map<char, vector<char>> graph = {{'A', {'B', 'C'}},{'B', {'D', 'E'}},{'C', {'F'}},{'D', {}},{'E', {'F'}},{'F', {}}};char start = 'A';char target = 'F';cout << "Target found: " << (bfs(graph, start, target) ? "true" : "false") << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(V + E)),其中 (V) 是節點數,(E) 是邊數。
  2. 空間復雜度:(O(V)),用于存儲訪問過的節點。
優缺點
  1. 優點:可以找到最短路徑,適用于無權圖的最短路徑問題。
  2. 缺點:需要較多的存儲空間來存儲隊列。

五、A* 搜索算法

A* 搜索算法是一種啟發式搜索算法,它結合了 Dijkstra 算法和貪心最佳優先搜索算法的優點,用于在圖中找到從起點到終點的最短路徑。

原理
  1. 使用一個優先隊列(通常是最小堆)來存儲待訪問的節點。
  2. 每個節點的優先級由兩個部分組成:從起點到當前節點的實際代價 (g(n)) 和從當前節點到終點的啟發式估計代價 (h(n))。
  3. 選擇優先級最高的節點進行擴展,直到找到目標節點。
代碼示例(C++)
#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;struct Node {char node;int cost;bool operator<(const Node& other) const {return cost > other.cost;}
};vector<char> a_star(const unordered_map<char, unordered_map<char, int>>& graph, char start, char goal, const unordered_map<char, int>& heuristic) {priority_queue<Node> open_set;open_set.push({start, heuristic.at(start)});unordered_map<char, char> came_from;unordered_map<char, int> g_score;for (const auto& node : graph) {g_score[node.first] = INT_MAX;}g_score[start] = 0;unordered_map<char, int> f_score;for (const auto& node : graph) {f_score[node.first] = INT_MAX;}f_score[start] = heuristic.at(start);while (!open_set.empty()) {char current = open_set.top().node;open_set.pop();if (current == goal) {vector<char> path;while (came_from.find(current) != came_from.end()) {path.push_back(current);current = came_from[current];}path.push_back(start);reverse(path.begin(), path.end());return path;}for (const auto& neighbor : graph.at(current)) {int tentative_g_score = g_score[current] + neighbor.second;if (tentative_g_score < g_score[neighbor.first]) {came_from[neighbor.first] = current;g_score[neighbor.first] = tentative_g_score;f_score[neighbor.first] = tentative_g_score + heuristic.at(neighbor.first);open_set.push({neighbor.first, f_score[neighbor.first]});}}}return {};
}// 示例
int main() {unordered_map<char, unordered_map<char, int>> graph = {{'A', {{'B', 1}, {'C', 4}}},{'B', {{'A', 1}, {'C', 2}, {'D', 5}}},{'C', {{'A', 4}, {'B', 2}, {'D', 1}}},{'D', {{'B', 5}, {'C', 1}}}};unordered_map<char, int> heuristic = {{'A', 5}, {'B', 3}, {'C', 2}, {'D', 0}};char start = 'A';char goal = 'D';vector<char> path = a_star(graph, start, goal, heuristic);cout << "Path found: ";for (char node : path) {cout << node << " ";}cout << endl;return 0;
}
復雜度分析
  1. 時間復雜度:取決于啟發式函數的質量,通常為 (O(b^d)),其中 (b) 是分支因子,(d) 是解的深度。
  2. 空間復雜度:(O(b^d)),用于存儲優先隊列和已訪問的節點。
優缺點
  1. 優點:可以找到最優解,適用于路徑規劃和最短路徑問題。
  2. 缺點:需要設計合適的啟發式函數,否則可能退化為 Dijkstra 算法。

六、跳躍搜索(Jump Search)

跳躍搜索是一種用于有序數組的搜索算法,它通過跳躍式前進查找目標值,然后在目標值可能存在的范圍內進行線性搜索。

原理
  1. 確定跳躍步長 (m),通常為 (\sqrt{n}),其中 (n) 是數組的長度。
  2. 從數組的起始位置開始,每次跳躍 (m) 步,直到找到一個大于或等于目標值的元素。
  3. 在目標值可能存在的范圍內進行線性搜索。
代碼示例(C++)
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;int jump_search(const vector<int>& arr, int target) {int n = arr.size();int step = static_cast<int>(sqrt(n));int prev = 0;while (prev < n && arr[min(step, n) - 1] < target) {prev = step;step += static_cast<int>(sqrt(n));if (prev >= n) {return -1;}}for (int i = prev; i < min(step, n); ++i) {if (arr[i] == target) {return i;}}return -1;
}// 示例
int main() {vector<int> arr = {10, 20, 30, 40, 50};int target = 30;cout << "Index of target: " << jump_search(arr, target) << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(\sqrt{n})),其中 (n) 是數組的長度。
  2. 空間復雜度:(O(1)),不需要額外的存儲空間。
優缺點
  1. 優點:效率高于線性搜索,適用于有序數組。
  2. 缺點:對于大規模數據,效率不如二分搜索。

七、插值搜索(Interpolation Search)

插值搜索是一種基于目標值可能出現的位置來查找目標值的搜索算法。它假設數據是均勻分布的,根據目標值與數組中最小值和最大值的關系來估計目標值的位置。

原理
  1. 計算目標值可能的位置 (pos):
    [
    pos = low + \left( \frac{(high - low)}{(arr[high] - arr[low])} \times (target - arr[low]) \right)
    ]
  2. 如果 (arr[pos]) 等于目標值,返回 (pos)。
  3. 如果 (arr[pos]) 小于目標值,調整 (low) 為 (pos + 1)。
  4. 如果 (arr[pos]) 大于目標值,調整 (high) 為 (pos - 1)。
  5. 重復上述步驟,直到找到目標值或 (low) 大于 (high)。
代碼示例(C++)
#include <iostream>
#include <vector>
using namespace std;int interpolation_search(const vector<int>& arr, int target) {int low = 0, high = arr.size() - 1;while (low <= high && target >= arr[low] && target <= arr[high]) {if (low == high) {if (arr[low] == target) {return low;}return -1;}int pos = low + ((high - low) / (arr[high] - arr[low]) * (target - arr[low]));if (arr[pos] == target) {return pos;} else if (arr[pos] < target) {low = pos + 1;} else {high = pos - 1;}}return -1;
}// 示例
int main() {vector<int> arr = {10, 20, 30, 40, 50};int target = 30;cout << "Index of target: " << interpolation_search(arr, target) << endl;return 0;
}
復雜度分析
  1. 時間復雜度:在數據均勻分布的情況下為 (O(\log \log n)),在最壞情況下為 (O(n))。
  2. 空間復雜度:(O(1)),不需要額外的存儲空間。
優缺點
  1. 優點:在數據均勻分布的情況下效率較高。
  2. 缺點:對于非均勻分布的數據,效率可能較低。

八、斐波那契搜索(Fibonacci Search)

斐波那契搜索是一種基于斐波那契數列的搜索算法,它通過斐波那契數列來劃分數組,逐步縮小搜索范圍。

原理
  1. 找到一個大于或等于數組長度的斐波那契數 (F(m))。
  2. 將數組分為兩部分,長度分別為 (F(m-1)) 和 (F(m-2))。
  3. 比較目標值與中間元素,根據比較結果調整搜索范圍。
  4. 重復上述步驟,直到找到目標值或搜索范圍為空。
代碼示例(C++)
#include <iostream>
#include <vector>
using namespace std;int fibonacci_search(const vector<int>& arr, int target) {int fibMMm2 = 0;  // (m-2)th Fibonacciint fibMMm1 = 1;  // (m-1)th Fibonacciint fibM = fibMMm2 + fibMMm1;  // m'th Fibonacciwhile (fibM < arr.size()) {fibMMm2 = fibMMm1;fibMMm1 = fibM;fibM = fibMMm2 + fibMMm1;}int offset = -1;while (fibM > 1) {int i = min(offset + fibMMm2, static_cast<int>(arr.size()) - 1);if (arr[i] < target) {fibM = fibMMm1;fibMMm1 = fibMMm2;fibMMm2 = fibM - fibMMm1;offset = i;} else if (arr[i] > target) {fibM = fibMMm2;fibMMm1 = fibMMm1 - fibMMm2;fibMMm2 = fibM - fibMMm1;} else {return i;}}if (fibMMm1 && arr[offset + 1] == target) {return offset + 1;}return -1;
}// 示例
int main() {vector<int> arr = {10, 20, 30, 40, 50};int target = 30;cout << "Index of target: " << fibonacci_search(arr, target) << endl;return 0;
}
復雜度分析
  1. 時間復雜度:(O(\log n)),其中 (n) 是數組的長度。
  2. 空間復雜度:(O(1)),不需要額外的存儲空間。
優缺點
  1. 優點:效率與二分搜索相當,適用于有序數組。
  2. 缺點:實現相對復雜,對于大規模數據,效率不如二分搜索。

九、搜索算法的總結

搜索算法在計算機科學中有著廣泛的應用,不同的搜索算法適用于不同的數據結構和應用場景。以下是對幾種常見搜索算法的總結:

搜索算法數據結構時間復雜度空間復雜度優點缺點
線性搜索數組(O(n))(O(1))實現簡單,適用于小規模數據效率較低,對于大規模數據查找速度慢
二分搜索有序數組(O(\log n))(O(1))效率高,適用于大規模有序數據要求數組必須是有序的
深度優先搜索圖或樹(O(V + E))(O(V))實現簡單,適用于查找路徑或連通性問題可能會陷入無限循環,對于有環圖需要額外處理
廣度優先搜索圖或樹(O(V + E))(O(V))可以找到最短路徑,適用于無權圖的最短路徑問題需要較多的存儲空間來存儲隊列
A* 搜索(O(b^d))(O(b^d))可以找到最優解,適用于路徑規劃和最短路徑問題需要設計合適的啟發式函數
跳躍搜索有序數組(O(\sqrt{n}))(O(1))效率高于線性搜索,適用于有序數組對于大規模數據,效率不如二分搜索
插值搜索有序數組(O(\log \log n))(O(1))在數據均勻分布的情況下效率較高對于非均勻分布的數據,效率可能較低
斐波那契搜索有序數組(O(\log n))(O(1))效率與二分搜索相當,適用于有序數組實現相對復雜

十、搜索算法的用途

搜索算法在計算機科學和實際應用中有著極其廣泛的應用。它們是解決各種查找和優化問題的基礎工具。以下是搜索算法的一些主要用途,按不同領域分類介紹:

(一)數據處理和分析

  1. 數據庫查詢
    • 數據庫管理系統(DBMS)使用搜索算法來快速定位和檢索數據。例如,B樹和B+樹索引結構利用二分搜索原理,快速查找特定的鍵值。
    • SQL 查詢優化器使用搜索算法來選擇最優的查詢執行計劃,提高查詢效率。
  2. 數據清洗和預處理
    • 在數據預處理階段,線性搜索和二分搜索可用于查找重復數據、缺失值或異常值。
    • 例如,在處理用戶注冊信息時,通過搜索算法可以快速發現重復的用戶名或郵箱地址。
  3. 數據分析
    • 在數據分析中,搜索算法可用于快速定位特定的數據點,計算統計量(如中位數、四分位數等)。
    • 例如,通過排序和二分搜索可以快速計算數據的分位數。

(二)搜索引擎

  1. 網頁索引和檢索
    • 搜索引擎(如谷歌、百度)使用復雜的搜索算法來索引和檢索網頁。例如,PageRank 算法用于評估網頁的重要性,從而對搜索結果進行排序。
    • 倒排索引(Inverted Index)是一種高效的數據結構,用于快速查找包含特定關鍵詞的網頁。
  2. 關鍵詞匹配
    • 搜索引擎使用搜索算法來匹配用戶輸入的關鍵詞和網頁內容。例如,通過TF-IDF(Term Frequency-Inverse Document Frequency)算法評估關鍵詞的相關性。

(三)人工智能和機器學習

  1. 路徑規劃
    • 在機器人導航和自動駕駛中,A* 搜索算法和Dijkstra算法用于找到從起點到終點的最優路徑。
    • 例如,在地圖應用中,A* 算法結合啟發式函數可以快速找到最短路徑。
  2. 模型評估
    • 在機器學習中,搜索算法用于評估模型的性能。例如,通過交叉驗證和網格搜索(Grid Search)選擇最優的超參數。
  3. 特征選擇
    • 搜索算法可用于選擇最重要的特征。例如,基于信息增益的搜索算法可用于選擇決策樹中的最優特征。

(四)網絡通信

  1. 路由算法
    • 在網絡通信中,Dijkstra算法和Bellman-Ford算法用于計算最短路徑,優化數據包的傳輸路徑。
    • 例如,OSPF(Open Shortest Path First)協議使用Dijkstra算法來計算網絡中的最短路徑。
  2. 流量控制
    • 搜索算法可用于管理網絡流量,優化數據包的傳輸順序。例如,通過優先隊列管理高優先級數據包。

(五)游戲開發

  1. 路徑查找
    • 在游戲開發中,A* 搜索算法用于計算角色的移動路徑。例如,在策略游戲中,AI 使用A* 算法找到從起點到目標點的最優路徑。
  2. 事件處理
    • 游戲中的事件系統使用搜索算法來處理和排序事件。例如,通過優先隊列管理事件的處理順序。

(六)電子商務

  1. 商品推薦
    • 電子商務平臺使用搜索算法來推薦商品。例如,通過協同過濾算法和內容基推薦算法,為用戶推薦最相關的商品。
  2. 商品排序
    • 在商品搜索結果中,使用搜索算法對商品進行排序。例如,根據銷量、價格、好評率等對商品進行排序。

(七)文件系統

  1. 文件查找
    • 文件系統使用搜索算法來查找文件和目錄。例如,通過哈希表和B樹索引快速定位文件。
    • 在Windows和Linux操作系統中,findgrep 命令使用搜索算法來查找文件和內容。
  2. 目錄管理
    • 文件系統使用搜索算法來管理目錄結構。例如,通過樹結構和廣度優先搜索(BFS)管理目錄層次。

(八)圖像和音頻處理

  1. 圖像識別
    • 在圖像處理中,搜索算法用于識別和定位圖像中的特定對象。例如,通過滑動窗口和卷積神經網絡(CNN)檢測圖像中的目標。
  2. 音頻信號處理
    • 在音頻處理中,搜索算法用于匹配音頻信號中的特定模式。例如,通過動態時間彎曲(DTW)算法匹配音頻信號。

(九)金融領域

  1. 交易匹配
    • 在金融市場中,搜索算法用于匹配買賣訂單。例如,通過優先隊列管理訂單的優先級,快速匹配交易。
  2. 風險評估
    • 金融機構使用搜索算法來評估風險。例如,通過蒙特卡洛模擬和優化算法評估投資組合的風險。

(十)物流和供應鏈管理

  1. 路徑優化
    • 在物流配送中,搜索算法用于優化配送路徑。例如,通過遺傳算法和模擬退火算法優化車輛路徑問題(VRP)。
  2. 庫存管理
    • 在庫存管理中,搜索算法用于優化庫存水平。例如,通過線性規劃和動態規劃算法管理庫存。

(十一)社交網絡

  1. 好友推薦
    • 社交網絡平臺使用搜索算法來推薦好友。例如,通過圖算法和機器學習算法推薦可能認識的人。
  2. 信息傳播
    • 在信息傳播中,搜索算法用于跟蹤和預測信息的傳播路徑。例如,通過PageRank算法評估用戶在社交網絡中的影響力。

(十二)生物信息學

  1. 基因序列比對
    • 在生物信息學中,搜索算法用于比對基因序列。例如,通過動態規劃算法和啟發式搜索算法比對DNA序列。
  2. 蛋白質結構預測
    • 搜索算法用于預測蛋白質的三維結構。例如,通過蒙特卡洛模擬和分子動力學模擬優化蛋白質結構。

(十三)軟件開發

  1. 代碼搜索
    • 在軟件開發中,搜索算法用于查找代碼中的特定模式。例如,通過正則表達式和文本搜索算法查找代碼中的錯誤。
  2. 版本控制
    • 版本控制系統(如Git)使用搜索算法來管理代碼的版本歷史。例如,通過二分搜索算法快速定位特定的代碼版本。

(十四)硬件設計

  1. 電路設計
    • 在硬件設計中,搜索算法用于優化電路布局。例如,通過遺傳算法和模擬退火算法優化電路的布線。
  2. 故障診斷
    • 在硬件故障診斷中,搜索算法用于定位故障點。例如,通過二分搜索算法快速定位硬件故障。

(十五)教育和研究

  1. 教學工具
    • 在計算機科學教育中,搜索算法是教學的重要內容。例如,通過可視化工具展示搜索算法的執行過程。
  2. 科學研究
    • 在科學研究中,搜索算法用于優化實驗設計和數據分析。例如,通過拉丁方設計和田口方法優化實驗條件。

總結

搜索算法在各個領域都有著廣泛的應用。它們不僅提高了數據處理和分析的效率,還在優化路徑、推薦系統、風險評估等方面發揮了重要作用。隨著技術的發展,搜索算法將繼續在新的領域和應用場景中發揮關鍵作用。

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

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

相關文章

Linux操作系統從入門到實戰(三)Linux基礎指令(上)

Linux操作系統從入門到實戰&#xff08;三&#xff09;Linux基礎指令&#xff08;上&#xff09; 前言一、ls 指令二、pwd三、cd四、touch 指令五、mkdir六、rmdir 指令和 rm 指令七、man 指令八、cp九、mv 指令十、cat 指令十一、 more 指令十二、less 指令十四、head 指令十五…

Java對象轉換的多種實現方式

Java對象轉換的多種實現方式 在Java開發中&#xff0c;對象轉換是一個常見的需求。特別是在不同層次間傳遞數據時&#xff0c;通常需要將一個對象轉換為另一個對象。雖然JSON序列化/反序列化是一種常見的方法&#xff0c;但在某些場景下可能并不是最佳選擇。本文將總結幾種常見…

頭歌實訓之索引

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 種一棵樹最好是十年前&#xff0c;其次是現在&#xff01; &#x1f680; 今天來學習C語言的相關知識。 &#x1f44d; 如果覺得這篇文章有幫助&#xff0c;歡迎您一鍵三連&#xff0c;分享給更…

Rundeck 介紹及安裝:自動化調度與執行工具

Rundeck介紹 概述&#xff1a;Rundeck 是什么&#xff1f; Rundeck 是一款開源的自動化調度和任務執行工具&#xff0c;專為運維場景設計&#xff0c;幫助工程師通過統一的平臺管理和執行跨系統、跨節點的任務。它由 PagerDuty 維護&#xff08;2016 年收購&#xff09;&#…

基于 Python 的自然語言處理系列(85):PPO 原理與實踐

&#x1f4cc; 本文介紹如何在 RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff09;中使用 PPO&#xff08;Proximal Policy Optimization&#xff09;算法對語言模型進行強化學習微調。 &#x1f517; 官方文檔&#xff1a;trl PPOTrainer 一、引言&…

珍愛網:從降本增效到綠色低碳,數字化新基建價值凸顯

2024年12月24日&#xff0c;法大大聯合企業綠色發展研究院發布《2024簽約減碳與低碳辦公白皮書》&#xff0c;深入剖析電子簽在推動企業綠色低碳轉型中的關鍵作用&#xff0c;為企業實現環境、社會和治理&#xff08;ESG&#xff09;目標提供新思路。近期&#xff0c;法大大將陸…

Java實現HTML轉PDF(deepSeekAi->html->pdf)

Java實現HTML轉PDF,主要為了解決將ai返回的html文本數據轉為PDF文件方便用戶下載查看。 一、deepSeek-AI提問詞 基于以上個人數據。總結個人身體信息&#xff0c;分析個人身體指標信息。再按一個月為維度&#xff0c;詳細列舉一個月內訓練計劃&#xff0c;維度詳細至每周每天…

Estimands與Intercurrent Events:臨床試驗與統計學核心框架

1. Estimands(估計目標)概述 1.1 定義與作用 1.1.1 定義 Estimand是臨床試驗中需明確提出的科學問題,即研究者希望通過數據估計的“目標量”,定義“治療效應”具體含義,確保分析結果與臨床問題一致。 例如,在研究某種新藥對高血壓患者降壓效果時,Estimand可定義為“在…

Jsp技術入門指南【十】IDEA 開發環境下實現 MySQL 數據在 JSP 頁面的可視化展示,實現前后端交互

Jsp技術入門指南【十】IDEA 開發環境下實現 MySQL 數據在 JSP 頁面的可視化展示&#xff0c;實現前后端交互 前言一、JDBC 核心接口和類&#xff1a;數據庫連接的“工具箱”1. 常用的 2 個“關鍵類”2. 必須掌握的 5 個“核心接口” 二、創建 JDBC 程序的步驟1. 第一步&#xf…

深入理解HotSpot JVM 基本原理

關于JAVA Java編程語言是一種通用的、并發的、面向對象的語言。它的語法類似于C和C++,但它省略了許多使C和C++復雜、混亂和不安全的特性。 Java 是幾乎所有類型的網絡應用程序的基礎,也是開發和提供嵌入式和移動應用程序、游戲、基于 Web 的內容和企業軟件的全球標準。. 從…

【HTTP/3:互聯網通信的量子飛躍】

HTTP/3&#xff1a;互聯網通信的量子飛躍 如果說HTTP/1.1是鄉村公路&#xff0c;HTTP/2是現代高速公路系統&#xff0c;那么HTTP/3就像是一種革命性的"傳送門"技術&#xff0c;它徹底重寫了數據傳輸的底層規則&#xff0c;讓信息幾乎可以瞬間抵達目的地&#xff0c;…

Apipost免費版、企業版和私有化部署詳解

Apipost是企業級的 API 研發協作一體化平臺&#xff0c;為企業提供 API研發測試管理全鏈路解決方案&#xff0c;不止于API研發場景&#xff0c;增強企業API資產管理。 Apipost 基于同一份數據源&#xff0c;同時提供給后端開發、前端開發、測試人員使用的接口調試、Mock、自動化…

使用若依二次開發商城系統-1:搭建若依運行環境

前言 若依框架有很多版本&#xff0c;這里使用的是springboot3vue3這樣的一個前后端分離的版本。 一.操作步驟 1 下載springboot3版本的后端代碼 后端springboot3的代碼路徑&#xff0c;https://gitee.com/y_project/RuoYi-Vue 需要注意我們要的是springboot3分支。 先用g…

速成GO訪問sql,個人筆記

更多個人筆記&#xff1a;&#xff08;僅供參考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 本文是基于原生的庫 database/sql進行初步學習 基于ORM等更多操作可以關注我…

【C++指南】告別C字符串陷阱:如何實現封裝string?

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 種一棵樹最好是十年前&#xff0c;其次是現在&#xff01; &#x1f4ac; 注意&#xff1a;本章節只詳講string中常用接口及實現&#xff0c;有其他需求查閱文檔介紹。 &#x1f680; 今天通過了…

系統架構師2025年論文《論軟件架構評估2》

論軟件系統架構評估 v2.0 摘要: 某市醫院預約掛號系統建設推廣應用項目是我市衛生健康委員會 2019 年發起的一項醫療衛生行業便民惠民信息化項目,目的是實現轄區內患者在轄區各公立醫療機構就診時,可以通過多種線上渠道進行預約掛號,提升就醫體驗。我作為系統架構師參與此…

BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection

背景 對于現有的BEVDet方法,它對于速度的預測誤差要高于基于點云的方法,對于像速度這種與時間有關的屬性,僅靠單幀數據很難預測好。因此本文提出了BEVDet4D,旨在獲取時間維度上的豐富信息。它是在BEVDet的基礎上進行拓展,保留了之前幀的BEV特征,并將其進行空間對齊后與當…

el-upload 上傳邏輯和ui解耦,上傳七牛

解耦的作用在于如果后面要我改成從阿里云oss上傳文件&#xff0c;我只需要實現上傳邏輯從七牛改成阿里云即可&#xff0c;其他不用動。實現方式有2部分組成&#xff0c;一部分是上傳邏輯&#xff0c;一部分是ui。 上傳邏輯 大概邏輯就是先去服務端拿上傳token和地址&#xff0…

酒水類目電商代運營公司-品融電商:全域策略驅動品牌長效增長

酒水類目電商代運營公司-品融電商&#xff1a;全域策略驅動品牌長效增長 在競爭日益激烈的酒水市場中&#xff0c;品牌如何快速突圍并實現長效增長&#xff1f;品融電商憑借「效品合一 全域增長」方法論與全鏈路運營能力&#xff0c;成為酒水類目代運營的領跑者。從品牌定位、視…

機器學習特征工程中的數值分箱技術:原理、方法與實例解析

標題&#xff1a;機器學習特征工程中的數值分箱技術&#xff1a;原理、方法與實例解析 摘要&#xff1a; 分箱技術作為機器學習特征工程中的關鍵環節&#xff0c;通過將數值數據劃分為離散區間&#xff0c;能夠有效提升模型對非線性關系的捕捉能力&#xff0c;同時增強模型對異…