什么是演算法?
演算法是一組解決問題的步驟或指令,它包含了輸入、輸出、處理和控制流程等組成部分,用于處理資料、完成任務和解決問題的程序,演算法通常用于計算機程式中,但它也可以用于各種領域的問題和應用中,
演算法需要滿足以下要求:正確性、可讀性、效率、魯棒性、可維護性等,
演算法的分類包括線性演算法、分治演算法、貪心演算法、動態規劃演算法、回溯演算法等,每種演算法的特點不同,適用于不同型別的問題,演算法的選擇和設計取決于問題本身的特征及其他限制條件,
演算法在計算機科學和計算機編程中是非常重要的,它在解決復雜問題和進行科學研究中起著重要作用,在實際應用中,演算法的選擇和優化可以大大提高程式的性能和效率,
演算法的本質特征是什么?
演算法的本質特征包括以下幾點:
- 有限性:演算法必須能夠在有限的時間內完成,它需要在一定的時間范圍內,通過有限的計算步驟來得出問題的解答,
- 明確性:演算法必須是清晰、明確的,演算法應該描述問題的解決程序,并指導程式員完成實際程式撰寫,
- 輸入:演算法必須具有輸入資料的概念,它需要明確定義輸入引數的型別、范圍和有效值,以便正確的執行程式,
- 輸出:演算法必須能夠產生輸出結果,輸出應該與輸入相關,以及滿足對問題的正確描述,
- 可以實作:演算法必須能夠通過計算來實作,它需要在計算機程式中正確的實作,并可以在計算機上執行,
- 無歧義性:演算法的所有操作步驟都應該具有明確的意義并且要精確的定義下來,以消除歧義,
演算法的本質特征使得它們可以用于解決不同型別的問題,并且這些解決方案都具有通用性和普適性,演算法對于計算機科學和計算機編程都是非常重要的,因為它們為我們提供了一種非常有效的工具來解決現實世界中的問題,
演算法的分類
演算法的分類可以根據其解決問題的方法、應用領域、時間和空間復雜度等方面進行劃分,以下是常見的演算法分類:
1.按處理方式分類:
(1)遞推演算法:遞推演算法是一種依靠前面的計算結果來確定后面的值的演算法,
(2)分治演算法:分治演算法是通過將問題劃分為許多小部分來求解大問題的演算法,
(3)貪心演算法:貪心演算法是通過每個步驟盡可能地優化來最終求解問題的演算法,
(4)動態規劃演算法:動態規劃演算法是一種通過建立較小的子問題來解決大問題的方法,
(5)回溯演算法:回溯演算法是一種逐步構建解決方案的演算法,經過每一步之后都會檢查結果是否滿足條件,
2.按應用領域分類:
(1)圖論演算法:用于解決圖論問題的演算法,例如最短路徑、最小生成樹等,
(2)字串演算法:用于字串處理和匹配的演算法,例如字串查找、排序、匹配等,
(3)數學演算法:用于數學問題的演算法,例如素數測驗、最大公因數、最小公倍數等,
(4)計算幾何演算法:用于幾何問題的演算法,例如尋找幾何物體的位置和形狀等,
3.按時間和空間復雜度分類:
(1)常量時間演算法:演算法的執行時間不會隨著資料量的增加而增加,
(2)線性時間演算法:演算法的執行時間隨資料量的增加而線性增加,
(3)對數時間演算法:演算法的執行時間隨資料量的增加而對數增加,
(4)指數時間演算法:演算法的執行時間隨資料量的增加而指數級增加,
除了以上列舉的分類方法,還有其他的分類方式,例如近似演算法、并行演算法、隨機化演算法等,不同的演算法分類方法可以很好地幫助我們理解和學習演算法,
演算法的復雜度分析方法有哪些?
演算法的復雜度分析方法主要有以下幾種:
-
時間復雜度:時間復雜度是演算法運行時間與問題規模之間的關系,一般使用大O符號表示演算法的時間復雜度,例如O(1)、O(n)、O(nlogn)等,表示演算法運行時間隨問題規模的增加而增加的速率,
-
空間復雜度:空間復雜度是指演算法執行中所需記憶體空間的大小,一般也使用大O符號表示,例如O(1)、O(n)等,
-
最壞情況復雜度:最壞情況復雜度是指演算法在最壞情況下的時間或空間復雜度,即演算法在所有可能輸入中最耗時或最耗空間的情況下的復雜度,
-
平均情況復雜度:平均情況復雜度是指演算法在所有可能輸入的平均情況下的時間或空間復雜度,一般情況下難以確定所有可能輸入的分布,因此平均情況復雜度常常不太實用,
-
最好情況復雜度:最好情況復雜度是指演算法在最好情況下的時間或空間復雜度,即演算法在所有可能輸入中最快速或最省空間的情況下的復雜度,最好情況復雜度一般不常用,通常只用于特殊情況下的演算法,
-
演算法復雜度的漸進性:演算法復雜度的漸進性是指演算法在輸入規模無限增大時復雜度表現的趨勢,通常情況下只考慮演算法復雜度的漸進性,并用大O符號標記演算法的漸進復雜度,
為什么要進行演算法復雜度分析
演算法復雜度分析是衡量演算法效率的重要手段,具有以下幾個原因和意義:
- 預估演算法的運行時間:對于一個好的演算法來說,運行時間應該隨著輸入規模的增加而增加的不太快,否則演算法效率低下,難以承受大規模資料的處理,通過演算法復雜度分析,可以對一個演算法的運行時間進行預估,從而知道演算法在處理規模較大資料時,是否會超時或耗費過多時間,
- 選擇最優演算法:對于一個特定的問題,可能有多種演算法可以解決,通過演算法復雜度分析,可以比較不同演算法的效率,選擇最優演算法,從而更高效地解決問題,
- 看到演算法的瓶頸:演算法復雜度分析可以幫助開發者看到演算法的瓶頸所在,即哪些操作是最耗時、最消耗空間的,從而可以優化演算法,提升運行效率,
- 分析演算法的可擴展性:當處理規模小的資料時,許多演算法都能較快地完成任務,但在處理大規模資料時,演算法的效率可能會急劇降低,通過演算法復雜度分析,可以分析演算法的可擴展性,了解演算法在處理大規模資料時的最大處理能力,
綜上所述,演算法復雜度分析是對演算法進行評估和優化的一個重要手段,有助于優化演算法的效率和性能,提高程式整體的運行效率和處理能力,
什么是時間復雜度?如何計算?
時間復雜度是衡量演算法時間效率的度量標準,通常用大O符號(O)表示,它描述了演算法的運行時間與問題規模之間的關系,當問題規模變大時,時間復雜度主要考慮的是演算法執行次數的增長率,比如,當問題規模增加k倍時,若演算法的執行次數也增加了k倍,則該演算法的時間復雜度為O(k),
時間復雜度的計算主要從演算法的基本操作出發,通過估算演算法的執行次數,得出最差情況下的大O估計,基本操作是指演算法中執行次數最多,最能反映運行時間的操作,通常是算術運算、比較運算、賦值、陣列下標訪問等,
以下是一個簡單的選擇排序演算法的偽代碼,用來舉例說明時間復雜度的計算方法:
SelectionSort(A, n) // A是待排序的陣列,n是陣列大小
for i = 0 to n-2 // 執行n-1次
k = i // 執行n-1次
for j = i+1 to n-1 // 執行(n-1)+(n-2)+...+2+1次
if A[j] < A[k] // 執行最多(n-1)+(n-2)+...+2+1次
k = j // 執行最多(n-1)+(n-2)+...+2+1次
if k != i // 執行n-1次
Swap(A[i], A[k]) // 執行0到n-2次
- 根據偽代碼中的回圈和條件陳述句,我們可以計算出每個基本操作在最差情況下執行的次數,從而得出演算法的時間復雜度:
- 外層回圈執行n-1次,基本操作為賦值陳述句,執行次數為n-1次,
- 內層回圈執行(n-1)*n/2次,基本操作為比較和賦值陳述句,執行次數最多為(n-1)*n/2次,
- 條件陳述句執行的次數等于內層回圈執行的次數,
- Swap函式執行的次數最多為n-1次,
- 因此,最差情況下該演算法的時間復雜度為O(n^2),
從這個例子可以看出,時間復雜度是對演算法執行次數的一種估計,它與具體的機器、編程語言和編譯器無關,只要問題規模(即問題的輸入資料)足夠大,時間復雜度就可以很好地反映出演算法的效率,
什么是空間復雜度?如何計算?
空間復雜度是衡量演算法空間效率的度量標準,通常也用大O符號(O)表示,它描述了演算法所需的額外空間(即除了輸入資料占用的空間之外的空間)與問題規模之間的關系,當問題規模變大時,空間復雜度主要考慮的是演算法所需的額外空間與問題規模的增長率,比如,當問題規模增加k倍時,若演算法所需的額外空間也增加了k倍,則該演算法的空間復雜度為O(k),
空間復雜度的計算主要從演算法所需的額外空間出發,通過估算演算法所需的最大額外空間,得出最差情況下的大O估計,計算時通常會考慮演算法中使用的變數、陣列和遞回呼叫所需的堆疊空間等,
以下是一個簡單的歸并排序演算法的偽代碼,用來舉例說明空間復雜度的計算方法:
MergeSort(A, L, R) // A是待排序的陣列,L是左邊界,R是右邊界
if L < R
mid = (L + R) / 2
MergeSort(A, L, mid) // 遞回呼叫左邊子陣列
MergeSort(A, mid+1, R) // 遞回呼叫右邊子陣列
Merge(A, L, mid, R) // 合并左右兩個有序子陣列
Merge(A, L, mid, R) // 合并左右兩個有序子陣列
n1 = mid - L + 1
n2 = R - mid
left = new Array[n1] // 分配額外空間
right = new Array[n2] // 分配額外空間
for i = 0 to n1-1 // 復制左邊子陣列
left[i] = A[L+i]
for j = 0 to n2-1 // 復制右邊子陣列
right[j] = A[mid+1+j]
i = 0
j = 0
k = L
while i < n1 and j < n2
if left[i] <= right[j]
A[k] = left[i]
i = i+1
else
A[k] = right[j]
j = j+1
k = k+1
while i < n1 // 復制剩余元素
A[k] = left[i]
i = i+1
k = k+1
while j < n2 // 復制剩余元素
A[k] = right[j]
j = j+1
k = k+1
delete left // 釋放額外空間
delete right // 釋放額外空間
根據偽代碼中的陣列、變數和遞回呼叫陳述句,我們可以計算出演算法在最差情況下所需的最大額外空間,從而得出演算法的空間復雜度:
- 歸并函式中使用了兩個大小為n/2的臨時陣列left和right,因此最大額外空間為O(n),
- MergeSort函式的遞回呼叫堆疊深度為O(log n),因為每次遞回呼叫都會把輸入資料的規模縮小一半,因此最大額外空間也為O(log n),
- 因此,最差情況下該演算法的空間復雜度為O(n),取兩者的較大值,
從這個例子可以看出,空間復雜度是對演算法所需的額外空間的一種估計,它與具體的機器、編程語言和編譯器有關,只要問題規模不斷增大,空間復雜度就可以很好地反映出演算法的效率,
遞推演算法是什么
遞推演算法(Recurrence Relation)是一種數學演算法,通過利用已知的問題規模推匯出未知問題規模的解,遞推演算法最常用于計算斐波那契數列、二項式系數、卷積等問題,
遞推演算法是一種自底向上的計算方法,在計算遞推公式的程序中,我們需要預先計算出所有比當前問題規模小的所有子問題的解,并存盤在一個資料結構中(例如陣列、矩陣等),然后利用公式和已經求解出來的子問題解,計算當前問題規模的解,
以下是一個遞推演算法的偽代碼示例,用于計算斐波那契數列:
function fibonacci(n):
# 初始化
memo = [0, 1]
# 遞推計算
for i in range(2, n+1):
memo.append(memo[i-1] + memo[i-2])
return memo[n]
在上述示例中,我們定義了一個fibonacci函式,用于計算斐波那契數列的第n項,在實作程序中,我們使用一個串列(memo)存盤所有小于n的斐波那契數列項的值,然后按照遞推公式利用已知的子問題解計算得到第n項的值,
遞推演算法通過自底向上的計算方式,將原問題分解成小規模的子問題,并對已知的子問題解進行簡單組合,計算得到原問題的解,由于遞推演算法不需要進行回溯,因此可以獲得更好的時間和空間效率,
分治演算法是什么
分治演算法是一種高效的演算法設計策略,其核心思想是將一個問題分解為若干個相互獨立且同樣結構的子問題,并遞回求解這些子問題,這些子問題求解的結果最終被合并起來,得到原問題的解, 分治演算法應用廣泛,包括排序、查找、逆向思維等領域,是解決計算機科學中常見問題的常用方法之一,其特點是簡單易懂、實作方便且性能表現優異,
以下是一個分治演算法的偽代碼示例,用于歸并排序:
function mergeSort(arr):
# 邊界條件:當陣列長度<=1時無需繼續劃分
if len(arr) <= 1:
return arr
# 將陣列分成左右兩部分
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:]
# 遞回求解左右兩部分并合并結果
return merge(mergeSort(left), mergeSort(right))
function merge(left, right):
result = []
i, j = 0, 0
# 合并左右兩部分
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
# 處理剩余元素
result.extend(left[i:])
result.extend(right[j:])
return result
在上述示例中,我們定義了一個mergeSort函式,用于歸并排序演算法的實作,在每次遞回呼叫中,我們將輸入陣列分成左右兩部分,并分別遞回求解,當左右兩部分求解完畢后,我們合并它們得到結果,
分治演算法通過將問題分解為相互獨立的子問題并遞回求解它們,從而大大降低了問題的復雜度,同時,它也有助于實作并行化和利用多核計算機和計算集群,
貪心演算法是什么
貪心演算法是一種常見的演算法思想,主要應用于優化問題中,特別是在計算機科學和運籌學領域中,貪心演算法的核心思想是每一步都選擇當前最好的選項,從而得到全域最優解,
貪心演算法通常包括以下步驟:
-
確定問題的最優子結構:即在問題中尋找那些可以自行解決的子問題,
-
開始構建解決方案:從問題的初始狀態開始,按照某種規則選擇一個最優解,并將其添加到中間方案中,該步驟不斷重復,直到找到全域最優解,
-
判斷可行性:為了確保得到一個全域最優解,需要在每個構建解決方案的步驟中,檢查得到的區域最優解是否是可行的,如果當前的區域最優解無法滿足問題的限制條件,則需要放棄此區域最優解,重新開始構建方案,
貪心演算法的優點是輸入資料越大,運行時間越短;同時,由于貪心演算法的設計都是區域的最優決策,不是全域的最優決策,因此可能不會得到最優解,但通常會得到接近最優解的解決方案,
貪心演算法適用于一些特殊的演算法場景,如圖論中的最小生成樹演算法、哈夫曼編碼等,同時,在一些工業設計、物流計劃及經濟學領域中也有應用,
貪心演算法需要注意的問題是不能保證一定得到全域最優解,有可能會導致次優解的出現,因此,在具體應用中,需要充分了解問題的性質,深入分析問題才能設計出較好的貪心演算法,
例如,有一個任務調度問題,有n個任務需要在k個處理器上執行,每個任務需要的執行時間不同,將任務分配給處理器,使得所有任務的完成時間最短(即最小化所有處理器上任務的完成時間),使用貪心演算法解決該問題的偽代碼如下:
- 將所有任務按執行時間從大到小排序,
- 對于每個任務,將其分配給處理器中當前執行時間最短的那個處理器,并將該處理器的執行時間加上該任務的執行時間,
- 最后的最小完成時間即為所有處理器中執行時間最長的那個時間,
偽代碼實作:
sort(tasks) //將任務按執行時間從大到小排序
processors = [0]*k //初始化處理器執行時間為0
for task in tasks: //遍歷每個任務
min_time = min(processors) //找到處理器中執行時間最短的那個處理器
processors[processors.index(min_time)] += task //將該任務分配給該處理器,并將執行時間加上該任務的執行時間
min_completion_time = max(processors) //所有處理器中最大的執行時間即為最小完成時間
return min_completion_time //回傳最小完成時間
動態規劃演算法是什么
動態規劃(Dynamic Programming)是一種求解最優化問題的方法,常用于解決具有重疊子問題和最優子結構性質的問題,
動態規劃的核心思想是將問題分解為若干個子問題,并從簡單的子問題開始構建問題的解,在求解子問題的程序中,通過將子問題的解存盤在表格中,避免不必要的重復計算,最終,利用存盤的子問題解構建出原問題的解,
以下是一個簡單的動態規劃偽代碼示例,用于計算斐波那契數列中的第n項:
function fib(n):
if n < 0:
return None
if n == 0 or n == 1:
return n
# 初始化值
memo = [0, 1]
# 計算斐波那契數列中的第n項
for i in range(2, n+1):
memo.append(memo[i-1] + memo[i-2])
return memo[n]
在上述示例中,我們使用了一個串列(memo)來存盤斐波那契數列中每一項的值,在求解第n項時,我們通過利用存盤在memo中的前兩個值,依次計算得到第n項的值,
在上述示例中,我們可以看到動態規劃通過分治、遞回、和快取的策略來優化時間復雜度,
回溯演算法是什么
回溯演算法是一種經典的搜索演算法,常用于解決組合優化問題和排列組合問題等,回溯演算法通過列舉所有可能的解、逐步試探和回溯來求解問題,因此也被稱為試探法或莫斯科大學方法,
回溯演算法通常通過遞回的方式實作,在實作程序中,我們首先定義一個狀態變數,用于表示當前搜索狀態,在每次遞回的呼叫中,我們根據當前狀態變數的值,列舉下一步可能的選擇,依次進行試探,在進行試探時,我們需要判斷當前狀態變數是否滿足問題的要求,如果滿足,我們就繼續遞回尋找下一步的解決方案,否則,我們回溯到上一個狀態,重新選擇下一步的路徑,
以下是一個回溯演算法的偽代碼示例,用于求解數獨問題:
def backtrack(board, row, col):
# 邊界條件:搜索完整個數獨
if row == 9:
return True
# 計算下一個格子的位置
next_row = row if col < 8 else row+1
next_col = col+1 if col < 8 else 0
# 如果當前格子不為空格,遞回求解下一個格子
if board[row][col] != '.':
return backtrack(board, next_row, next_col)
# 列舉當前格子的可能取值
for i in range(1, 10):
if isValid(board, row, col, str(i)):
board[row][col] = str(i)
if backtrack(board, next_row, next_col):
return True
board[row][col] = '.'
return False
在上述示例中,我們定義了一個回溯函式backtrack,用于遞回求解數獨問題,在遞回的每一步,我們根據當前格子的值和下一個格子的位置,計算出所有可能的取值,并依次進行試探,如果當前取值符合數獨的規則,我們就繼續遞回搜索下一個格子,否則,我們回溯到上一個狀態,并選擇下一個可能的取值,
回溯演算法的核心思想在于列舉所有的解空間,并不斷試探和回溯,直到找到解或者窮盡所有可能的選擇,由于它的復雜度很高,因此需要結合剪枝等優化技巧來提高效率,
什么是圖論演算法
圖論演算法是研究圖結構和應用的數學分支,用于描述現實世界中的一些問題,例如交通網路、通信網路、社交網路等,圖論演算法主要通過定義圖中節點之間的關系,來研究節點之間的連接方式和網路結構,
圖論演算法包括許多不同的演算法,例如最短路徑演算法、最小生成樹演算法、最大流演算法、二分圖匹配演算法、搜索演算法等,每種演算法都有自己的特點和適用范圍,在不同的應用場景中發揮著不同的作用,
以下是一個圖論演算法的偽代碼示例,用于搜索圖中的最短路徑:
function shortestPath(graph, start, end):
# 初始化距離和前驅節點
dist = { start: 0 }
pre = {}
# 將所有節點加入優先佇列中
queue = PriorityQueue()
for v in graph:
queue.put(v)
if v != start:
dist[v] = float('inf')
# 優先佇列中不為空時,不斷尋找最短路徑
while not queue.empty():
u = queue.get()
if u == end:
break
# 對于每個相鄰節點,計算到當前節點的距離
for v in graph[u]:
alt = dist[u] + graph[u][v]
if alt < dist[v]:
dist[v] = alt
pre[v] = u
queue.put(v)
# 回溯查找最短路徑
path = []
while end != start:
path.append(end)
end = pre[end]
path.append(start)
path.reverse()
return path
在上述示例中,我們定義了一個shortestPath函式,用于搜索圖中的最短路徑,在實作程序中,我們使用了一個優先佇列來維護待處理的節點,并使用字典來存盤每個節點到起點的最短距離和前驅節點,通過不斷更新距離和前驅節點的值,我們最終得到了起點到終點的最短路徑,
圖論演算法通過定義節點之間的關系,來研究圖的結構和特性,并開發了許多高效的演算法來解決不同的圖論問題,在現代科技中,圖論演算法需要廣泛使用于從社會網路到大規模網路問題的復雜問題,
什么是字串演算法
字串演算法是計算機科學中研究字串匹配、替換、壓縮、解壓、編輯距離、最長公共子序列等問題的演算法,字串演算法在文本編輯、自然語言處理、影像處理、生物資訊學等領域中常被使用,
字串演算法包括匹配演算法、壓縮演算法、編輯距離演算法、最長公共子序列演算法等,其中匹配演算法是最為常見的一種,用于在一個字串中查找另一個字串出現的位置,
以下是一個字串匹配演算法的偽代碼示例,用于查找字串中的子串:
function indexOf(text, pattern):
# 計算next陣列
next = computeNext(pattern)
# 根據next陣列逐次遍歷text和pattern
i, j = 0, 0
while i < len(text) and j < len(pattern):
if j == -1 or text[i] == pattern[j]:
i += 1
j += 1
else:
j = next[j] # 根據next陣列跳轉
# 查找結果
if j == len(pattern):
return i - j
else:
return -1
def computeNext(pattern):
next = [-1] * (len(pattern) + 1)
i, j = 0, -1
while i < len(pattern):
if j == -1 or pattern[i] == pattern[j]:
i += 1
j += 1
next[i] = j
else:
j = next[j]
return next
在上述示例中,我們定義了一個indexOf函式,用于在text中查找pattern的位置,在實作程序中,我們根據pattern計算出next陣列,并使用雙指標逐個遍歷text和pattern,根據next陣列跳轉指標位置,如果最終能夠找到pattern,則回傳在text中的位置;否則回傳-1,
字串演算法通過機智且高效地處理字串,可以在數學、自然語言和影像處理等領域中發揮作用,在工業實踐中,字串演算法被廣泛應用于計算機視覺、自然語言處理、大資料分析等,
什么是數學演算法
數學演算法由數學和計算機科學交叉而來,解決包括線性代數、離散數學和數值分析在內的問題,數學演算法可以用于資料分析、影像處理、人工智能、科學計算等多個領域,
數學演算法包括線性代數演算法、矩陣計算、最優化演算法、數值方法、加密演算法等,其中,矩陣計算是數學演算法的核心,廣泛應用于人工智能、計算機視覺等領域,例如使用矩陣計算進行影像處理和深度學習等,
以下是一個矩陣計算演算法的偽代碼示例,用于計算矩陣的乘積:
function matrixMultiplication(a, b):
# 初始化結果矩陣
result = [[0 for _ in range(len(b[0]))] for _ in range(len(a))]
# 對于每個元素,計算其值并填入結果矩陣中
for i in range(len(a)):
for j in range(len(b[0])):
for k in range(len(b)):
result[i][j] += a[i][k] * b[k][j]
return result
在上述示例中,我們定義了一個matrixMultiplication函式,用于計算矩陣的乘積,在實作程序中,我們使用三重回圈遍歷矩陣a和矩陣b中的每一個元素,然后計算它們的乘積并填入結果矩陣中,
數學演算法通過嚴謹和高效的數學方法,解決現實世界中復雜的問題,在現代科技中,數學演算法被廣泛應用于資料分析、影像處理、人工智能、科學計算等領域,在對現實世界進行建模和計算中發揮著重要的作用,
什么是計算幾何演算法
計算幾何演算法是指利用計算機來解決幾何問題的一類演算法,它是一種兼具數學理論和計算機科學的交叉學科,可以應用于計算機圖形學、CAD等領域,
常見的計算幾何演算法包括凸包演算法、線段交點、點是否在多邊形內、點到直線距離等,
舉一個例子,我們來看點到線段的距離演算法偽代碼:
function distancePointToLineSegment(point, segment):
# 將點p和線段上的兩個點a、b相連,求垂足c
ac = point - segment.start
ab = segment.end - segment.start
t = dot(ac, ab) / dot(ab, ab)
if t ≤ 0:
c = segment.start
elif t ≥ 1:
c = segment.end
else:
c = segment.start + t * ab
# 回傳點p到垂足c的距離
return distance(point, c)
其中,`point`表示點的坐標,`segment`表示線段的兩個端點坐標,`dot`表示兩個向量的點積,`distance`表示兩點之間的距離,該演算法首先計算點到線段端點的向量`ac`和線段的向量`ab`的點積,再將其除以`ab`的點積,得到垂足到起點之間的比例`t`,如果`t`小于等于0,則垂足在`segment.start`處,如果`t`大于等于1,則垂足在`segment.end`處,否則垂足在線段上,具體位置為`segment.start + t * ab`,最后回傳點`p`到垂足`c`的距離即可,
在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555698.html
標籤:其他
下一篇:返回列表
