【分治】最接近點對Python實現

文章目錄

    • @[toc]
      • 問題描述
      • 一維最接近點對算法
        • `Python`實現
      • 二維最接近點對算法
        • 分治算法
        • 時間復雜性
        • `Python`實現

問題描述

  • 給定平面上 n n n個點,找其中的一對點,使得在 n n n個點組成的所有點對中,該點對的距離最小

一維最接近點對算法

Python實現
import sysdef closest_pair(points):points.sort()  # 按照橫坐標排序min_dist = sys.maxsize  # 初始化最小距離為一個很大的數closest = None  # 初始化最接近點對為 Nonefor i in range(len(points) - 1):dist = abs(points[i] - points[i + 1])  # 計算相鄰點對的距離if dist < min_dist:min_dist = distclosest = (points[i], points[i + 1])return closestpoints = [2, 4, 1, 5, 8, 9, 3]res = closest_pair(points)print(f'最接近的點對: {res}')

二維最接近點對算法

分治算法
  • 選取一垂直線 l : x = m l : x = m l:x=m m m m S S S中各點 x x x坐標的中位數,將 S S S分割為 S 1 = { p ∈ S ∣ x ( p ) ≤ m } S_{1} = \set{p \in S \mid x(p) \leq m} S1?={pSx(p)m} S 2 = { p ∈ S ∣ x ( p ) > m } S_{2} = \set{p \in S \mid x(p) > m} S2?={pSx(p)>m}
  • 遞歸地在 S 1 S_{1} S1? S 2 S_{2} S2?上解最接近點對問題,分別得到 S 1 S_{1} S1? S 2 S_{2} S2?中的最小距離 d 1 d_{1} d1? d 2 d_{2} d2?
  • d = min ? { d 1 , d 2 } d = \min\set{d_{1} , d_{2}} d=min{d1?,d2?},若 S S S的最接近點對 ( p , q ) (p , q) (p,q)之間的距離小于 d d d,則 p p p q q q必分屬于 S 1 S_{1} S1? S 2 S_{2} S2?,設 p ∈ S 1 p \in S_{1} pS1? q ∈ S 2 q \in S_{2} qS2?,則 p p p q q q距直線 l l l的距離均小于 d d d
  • P 1 P_{1} P1? P 2 P_{2} P2?分別表示直線 l l l的左側和右側寬為 d d d的兩個垂直長條區域,則 p ∈ P 1 p \in P_{1} pP1? q ∈ P 2 q \in P_{2} qP2?,此時 P 1 P_{1} P1?中所有點與 P 2 P_{2} P2?中所有點構成的點對均為最接近點對的候選者,在最壞情況下有 n 2 / 4 n^{2} / 4 n2/4對這樣的候選者,但是對于 P 1 P_{1} P1?中任一點 p p p P 2 P_{2} P2?中最多只有 6 6 6個點與它構成最接近點對的候選者
    • 實際上對于 P 1 P_{1} P1?中任一點 p p p,若與 P 2 P_{2} P2?中的點構成最接近點對的候選者,則必有 d i s t a n c e ( p , q ) < d distance(p , q) < d distance(p,q)<d,滿足這個條件的 P 2 P_{2} P2?中的點一定落在一個 d × 2 d d \times 2d d×2d的矩形 R R R
    • 可將矩形 R R R的長為 2 d 2d 2d的邊 3 3 3等分,將長為 d d d的邊 2 2 2等分,由此導出 6 6 6 ( d / 2 ) × ( 2 d / 3 ) (d / 2) \times (2d / 3) (d/2)×(2d/3)的矩形,矩形 R R R中最多只有 6 6 6 S S S中的點

1

  • 合并步驟中,最多只需檢查 6 × n / 2 = 3 n 6 \times n / 2 = 3n 6×n/2=3n個候選者,為了確切地知道要檢查哪 6 6 6個點,將 p p p P 2 P_{2} P2?中的點投影到垂直線 l l l上,能與 p p p點一起構成最接近點對候選者的 q q q p p p l l l上投影點的距離小于 d d d,且這種投影點最多只有 6 6 6個,若將 P 1 P_{1} P1? P 2 P_{2} P2?中所有 S S S中點按其 y y y坐標排好序,則對 P 1 P_{1} P1?中所有點,對排好序的點列做一次掃描,就可以找出所有最接近點對的候選者
時間復雜性

T ( n ) = { O ( 1 ) , n < 4 2 T ( n / 2 ) + O ( n ) , n ≥ 4 T(n) = \begin{cases} O(1) , & n < 4 \\ 2 T(n / 2) + O(n) , & n \geq 4 \end{cases} T(n)={O(1),2T(n/2)+O(n),?n<4n4?

T ( n ) = O ( n log ? n ) T(n) = O(n \log{n}) T(n)=O(nlogn)

Python實現
import math# 計算兩點之間的歐幾里德距離
def dist(p1, p2):return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)# 分治法求解最接近點對問題
def closest_pair(points):# 如果點集中的點個數小于等于 3 個, 直接計算并返回最小距離對if len(points) <= 3:min_dist = float('inf')min_pair = Nonefor i in range(len(points)):for j in range(i + 1, len(points)):d = dist(points[i], points[j])if d < min_dist:min_dist = dmin_pair = (points[i], points[j])return min_pair# 將點集按照 x 坐標排序sorted_points = sorted(points, key=lambda p: p[0])# 將點集分成左右兩部分mid = len(sorted_points) // 2left_points = sorted_points[:mid]right_points = sorted_points[mid:]# 遞歸求解左右兩部分的最接近點對left_min_pair = closest_pair(left_points)right_min_pair = closest_pair(right_points)# 取左右兩部分最接近點對的最小距離if left_min_pair is None:min_dist = dist(right_min_pair[0], right_min_pair[1])min_pair = right_min_pairelif right_min_pair is None:min_dist = dist(left_min_pair[0], left_min_pair[1])min_pair = left_min_pairelse:left_dist = dist(left_min_pair[0], left_min_pair[1])right_dist = dist(right_min_pair[0], right_min_pair[1])if left_dist <= right_dist:min_dist = left_distmin_pair = left_min_pairelse:min_dist = right_distmin_pair = right_min_pair# 在橫跨左右兩部分的點中尋找更近的點對mid_x = sorted_points[mid][0]strip = []# 將點集按照 y 坐標排序sorted_points = sorted(points, key=lambda p: p[1])for point in sorted_points:if abs(point[0] - mid_x) < min_dist:strip.append(point)for i in range(len(strip)):for j in range(i + 1, min(i + 7, len(strip))):d = dist(strip[i], strip[j])if d < min_dist:min_dist = dmin_pair = (strip[i], strip[j])return min_dist, min_pairpoints = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]min_dist, min_pair = closest_pair(points)print(f'最接近的點對為: {min_pair}, 點對距離為 {min_dist}')

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

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

相關文章

LED透鏡粘接UV膠是一種特殊的UV固化膠,用于固定和粘合LED透鏡。

LED透鏡粘接UV膠是一種特殊的UV固化膠&#xff0c;用于固定和粘合LED透鏡。 它具有以下特點&#xff1a; 1. 高透明度&#xff1a;LED透鏡粘接UV膠具有高透明度&#xff0c;可以確保光線的透過性&#xff0c;不影響LED的亮度和效果。 2. 快速固化&#xff1a;經過UV紫外線照射…

CPU、MCU、MPU、DSP、FPGA各是什么?有什么區別?

1、CPU 中央處理器&#xff0c;簡稱 CPU&#xff08;Central Processing Unit&#xff09;&#xff0c;中央處理器主要包括兩個部分&#xff0c;即控制器、運算器&#xff0c;其中還包括高速緩沖存儲器及實現它們之間聯系的數據、控制的總線。 電子計算機三大核心部件就是CPU…

力扣257. 二叉樹的所有路徑(遞歸回溯與迭代)

題目&#xff1a; 給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,null,5] 輸出&#xff1a;["1->2->5","…

[隴劍杯 2021]簡單日志分析

[隴劍杯 2021]簡單日志分析 題目做法及思路解析&#xff08;個人分享&#xff09; 問一&#xff1a;某應用程序被攻擊&#xff0c;請分析日志后作答&#xff1a; 黑客攻擊的參數是______。&#xff08;如有字母請全部使用小寫&#xff09;。 題目思路&#xff1a; 分析…

C++牛客知識點2

提示&#xff1a;接上文 文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 例如&#xff1a;隨著人工智能的不斷發展&#xff0c;機器學習這門技術也越來越重要&#xff0…

http與https的區別,以及生產環境配置https的幾種方式

http HTTP(超文本傳輸協議)是一種用于傳輸和處理超文本文檔的協議。HTTP使用客戶端-服務器模型。客戶端通過HTTP請求協議向服務器發送請求&#xff0c;服務器則使用HTTP響應協議返回響應。HTTP協議通常使用TCP/IP作為底層傳輸協議&#xff0c;但它也可以使用其他傳輸協議。 H…

sql注入學習

基礎查詢語句&#xff1a; 給指定字段添加數據 insert into 表名(字段名1,字段名2,.....) values(值1,值2,......); 給全部字段添加數據 insert into 表名 values (值1,值2,.....);--無限制條件的修改,會修改整張表 update 表名 set 字段 值; --有限制條件的修改,只修改特定記…

軟件設計師——計算機網絡(二)

&#x1f4d1;前言 本文主要是【計算機網絡】——軟件設計師——計算機網絡的文章&#xff0c;如果有什么需要改進的地方還請大佬指出?? &#x1f3ac;作者簡介&#xff1a;大家好&#xff0c;我是聽風與他&#x1f947; ??博客首頁&#xff1a;CSDN主頁聽風與他 &#x1…

Promise介紹和使用

Promise Promise是一門新的技術&#xff08;ES6規范&#xff09;&#xff0c;JS中進行異步編程的新解決方案。&#xff08;舊的方案是使用回調函數&#xff0c;比如AJAX請求&#xff09;。 從語法上來說Promise是一個構造函數。 從功能上來說Promise對象用來封裝一個異步操作并…

生成式AI賦能千行百業加速創新,2023亞馬遜云科技re:Invent行業盤點

2023亞馬遜云科技re:Invent全球大會已于上周圓滿閉幕&#xff0c;在本次大會中&#xff0c;亞馬遜云科技又為大家帶來了很多功能/項目迭代更新&#xff0c;也重磅發布了很多全新的功能。今天從行業視角來盤點回顧哪些重磅發布適用于垂直行業客戶&#xff0c;以及面向汽車、制造…

ChatGLM3-6B和langchain阿里云部署

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、ChatGLM3-6B部署搭建環境部署GLM3 二、Chatglm2-6blangchain部署三、Tips四、總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; …

ffmpeg之ffprobe.c源碼分析一---大流程及核心代碼分析

文章目錄 前言為什么學習ffprobe源碼源碼調試main()函數重要流程函數分析open_input_file函數分析avformat_match_stream_specifier函數分析read_packets函數分析本篇文章帶你打通ffprobe源碼的脈絡。 關注公眾號免費看: 前言 注:本文章全憑個人經驗以及平時學習所記錄,由…

gdal合成多個波段

def synthesis_bands(dst_list, outfile):"""將多光譜波段合成一個tif:param dst_list: 輸入待合成文件的列表:param outfile: 影像的輸出文件夾"""dataset_init gdal.Open(dst_list[0])# 創建待輸出的圖tiff_driver gdal.GetDriverByName(GTi…

【MySQL進階】索引使用

一、索引使用 1.驗證索引效率 tb_sku 這張表中準備了 1000w 的記錄。 我用夸克網盤分享了「1000w的模擬數據」鏈接&#xff1a;https://pan.quark.cn/s/15cf665202b2 這張表中id為主鍵&#xff0c;有主鍵索引&#xff0c;而其他字段是沒有建立索引的。 我們先來查詢其中的…

JS基礎之原型原型鏈

JS基礎之原型&原型鏈 原型&原型鏈構造函數創建對象prototypeprotoconstructor實例與原型原型的原型原型鏈其他constructorproto繼承 原型&原型鏈 構造函數創建對象 我們先使用構造函數創建一個對象&#xff1a; function Person(){ } var person new Person();…

多窗口文件管理工具Q-Dir安裝以及使用教程

軟件介紹 Q-Dir 是一款功能強大的Windows資源管理器&#xff0c;可以非常方便的管理你的各種文件。Q-Dir有4 個窗口&#xff0c;特別適用于頻繁在各個目錄間跳躍復制粘貼的情況&#xff0c;每個窗口都可以方便的切換目錄&#xff0c;以不同顏色區分不同類型的文件&#xff0c;…

(企業項目)微服務項目解決跨域問題:

前后端分離項目中前端出現了跨域的問題 在網關模塊配置文件中添加 配置 application.properties # 允許請求來源&#xff08;老版本叫allowedOrigin&#xff09; spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns* # 允許攜帶的頭信息 spri…

idea__SpringBoot微服務06——靜態資源(新依賴),首頁和圖標定制

靜態資源 一、靜態資源二、首頁和圖標定制————————創作不易&#xff0c;如覺不錯&#xff0c;隨手點贊&#xff0c;關注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;謝謝~~ 新依賴&#xff1a;jquery的 <dependency><groupId>org.webjars&…

說說設計體系、風格指南和模式庫

目錄 一、定義 二、設計體系 2.1 Design system 2.2 風格指南 2.3 Component 三、樣式庫 一、定義 設計體系&#xff08;Design system&#xff09;&#xff1a;可共享的設計語言的基礎合集&#xff0c;包含了設計價值&#xff0c;語義&#xff0c;語法和上下文。 風格…

matplotlib 默認屬性和繪圖風格

matplotlib 默認屬性 一、繪圖風格1. 繪制疊加折線圖2. Solarize_Light23. _classic_test_patch4. _mpl-gallery5. _mpl-gallery-nogrid6. bmh7. classic8. fivethirtyeight9. ggplot10. grayscale11. seaborn12. seaborn-bright13. seaborn-colorblind14. seaborn-dark15. sea…