當前位置: 妍妍網 > 碼農

Rust實作的一些具有挑戰性的演算法範例

2024-11-21碼農

Rust程式語言以其強大的型別系統和記憶體管理特性著稱,可以用來解決復雜的問題。以下是一些用Rust編寫的復雜演算法範例:

Dijkstra演算法(最短路徑)

Dijkstra演算法是一種經典演算法,用於在圖中尋找兩個節點之間的最短路徑。可以使用Rust的 HashMap BinaryHeap 結構來高效實作。

  1. use std::collections::{BinaryHeap,HashMap};

  2. use std::cmp::Ordering;

  3. #[derive(Debug, Clone, Eq, PartialEq)]

  4. structState{

  5. cost: usize,

  6. position: usize,

  7. }

  8. impl OrdforState{

  9. fn cmp(&self, other:&Self)->Ordering{

  10. other.cost.cmp(&self.cost)

  11. }

  12. }

  13. impl PartialOrdforState{

  14. fn partial_cmp(&self, other:&Self)->Option<Ordering>{

  15. Some(self.cmp(other))

  16. }

  17. }

  18. fn dijkstra(graph:&HashMap<usize,Vec<(usize, usize)>>, start: usize, goal: usize)->Option<usize>{

  19. let mut dist:HashMap<usize, usize>=HashMap::new();

  20. let mut heap =BinaryHeap::new();

  21. dist.insert(start,0);

  22. heap.push(State{ cost:0, position: start });

  23. whileletSome(State{ cost, position })= heap.pop(){

  24. if position == goal {

  25. returnSome(cost);

  26. }

  27. if cost >*dist.get(&position).unwrap_or(&usize::MAX){

  28. continue;

  29. }

  30. ifletSome(neighbors)= graph.get(&position){

  31. for&(next_pos, weight)in neighbors {

  32. let next_cost = cost + weight;

  33. if next_cost <*dist.get(&next_pos).unwrap_or(&usize::MAX){

  34. heap.push(State{ cost: next_cost, position: next_pos });

  35. dist.insert(next_pos, next_cost);

  36. }

  37. }

  38. }

  39. }

  40. None

  41. }

歸並排序(Merge Sort)

歸並排序是一種復雜度為O(n log n)的排序演算法。在Rust中,可以利用其數據結構高效地實作該演算法。

  1. fn merge_sort(arr:&mut [i32]){

  2. let len = arr.len();

  3. if len <=1{

  4. return;

  5. }

  6. let mid = len /2;

  7. merge_sort(&mut arr[..mid]);

  8. merge_sort(&mut arr[mid..]);

  9. let mut temp = arr.to_vec();

  10. merge(&arr[..mid],&arr[mid..],&mut temp[..]);

  11. arr.copy_from_slice(&temp);

  12. }

  13. fn merge(left:&[i32], right:&[i32], result:&mut [i32]){

  14. let(mut i, mut j, mut k)=(0,0,0);

  15. while i < left.len()&& j < right.len(){

  16. if left[i]<= right[j]{

  17. result[k]= left[i];

  18. i +=1;

  19. }else{

  20. result[k]= right[j];

  21. j +=1;

  22. }

  23. k +=1;

  24. }

  25. if i < left.len(){

  26. result[k..].copy_from_slice(&left[i..]);

  27. }

  28. if j < right.len(){

  29. result[k..].copy_from_slice(&right[j..]);

  30. }

  31. }

A*演算法(路徑尋找)

A演算法是一種用於尋找目標最短路徑的演算法,特別常用於遊戲和導航系統中。可以使用Rust的數據結構和 BinaryHeap 類來實作A演算法。

  1. use std::collections::{BinaryHeap,HashMap};

  2. use std::cmp::Ordering;

  3. #[derive(Debug, Clone, Eq, PartialEq)]

  4. structNode{

  5. cost: usize,

  6. heuristic: usize,

  7. position: usize,

  8. }

  9. impl OrdforNode{

  10. fn cmp(&self, other:&Self)->Ordering{

  11. (other.cost + other.heuristic).cmp(&(self.cost +self.heuristic))

  12. }

  13. }

  14. impl PartialOrdforNode{

  15. fn partial_cmp(&self, other:&Self)->Option<Ordering>{

  16. Some(self.cmp(other))

  17. }

  18. }

  19. fn a_star(

  20. graph:&HashMap<usize,Vec<(usize, usize)>>,

  21. start: usize,

  22. goal: usize,

  23. heuristic:&HashMap<usize, usize>,

  24. )->Option<usize>{

  25. let mut dist:HashMap<usize, usize>=HashMap::new();

  26. let mut heap =BinaryHeap::new();

  27. dist.insert(start,0);

  28. heap.push(Node{

  29. cost:0,

  30. heuristic:*heuristic.get(&start).unwrap_or(&0),

  31. position: start,

  32. });

  33. whileletSome(Node{ cost, position,..})= heap.pop(){

  34. if position == goal {

  35. returnSome(cost);

  36. }

  37. if cost >*dist.get(&position).unwrap_or(&usize::MAX){

  38. continue;

  39. }

  40. ifletSome(neighbors)= graph.get(&position){

  41. for&(next_pos, weight)in neighbors {

  42. let next_cost = cost + weight;

  43. if next_cost <*dist.get(&next_pos).unwrap_or(&usize::MAX){

  44. heap.push(Node{

  45. cost: next_cost,

  46. heuristic:*heuristic.get(&next_pos).unwrap_or(&0),

  47. position: next_pos,

  48. });

  49. dist.insert(next_pos, next_cost);

  50. }

  51. }

  52. }

  53. }

  54. None

  55. }

混合質數分解

用於將一個數分解為質數因子的演算法,可以利用Rust的記憶體安全和效能優勢高效地執行。

  1. fn prime_factors(mut n: u64)->Vec<u64>{

  2. let mut factors =Vec::new();

  3. let mut divisor =2;

  4. while n >1{

  5. while n % divisor ==0{

  6. factors.push(divisor);

  7. n /= divisor;

  8. }

  9. divisor +=1;

  10. if divisor * divisor > n && n >1{

  11. factors.push(n);

  12. break;

  13. }

  14. }

  15. factors

  16. }

這些演算法利用Rust語言的型別安全、記憶體高效使用以及並行優勢,在解決復雜問題時非常有效。Rust的強型別系統和所有權模型能夠在編譯階段捕獲大多數錯誤,確保程式碼的安全性和無錯誤性。