最短點對

来源:https://www.cnblogs.com/he-zhidan/archive/2018/12/31/10202274.html
-Advertisement-
Play Games

難點:如何測試。我的解決方式是:a,三種解法,看結果是否一致。b,小數據(100個點),人工排查。第一種方法,暴力法適合小數據。第二種方法:我的改進型。第三種方法:經典方法(分治法)。實驗證明1000萬數據時,我的演算法有優勢。暴力演算法,O(n2)。我的改進型要點:先對所有數據按Y排序。只比較y距離小 ...


難點:如何測試。我的解決方式是:a,三種解法,看結果是否一致。b,小數據(100個點),人工排查。第一種方法,暴力法適合小數據。第二種方法:我的改進型。第三種方法:經典方法(分治法)。實驗證明1000萬數據時,我的演算法有優勢。
暴力演算法,O(n2)。我的改進型要點:先對所有數據按Y排序。只比較y距離小於等於已知最小距離的點對。經典方法:按Y排序,分成兩部分,遞歸調用。合併師只比較距離分界線不超過已知最小距離的點對。
實際證明500萬數據以下,我的改進演算法明顯優於經典演算法;1000萬數據時,略強於經典演算法。

 

核心代碼:

double Dis(const CPT& pt1,const CPT& pt2)
{
    return sqrt((double) (pt1.x-pt2.x)*(pt1.x-pt2.x)+(pt1.y-pt2.y)*(pt1.y-pt2.y)+(pt1.z-pt2.z)*(pt1.z-pt2.z) );
}

void InitData(CPT* pts,int iNum)
{
    srand(time(NULL));

    for( int i = 0 ; i < iNum ; i++)
    {
        pts[i].x = rand()%10000;
        pts[i].y = rand()%10000;
        pts[i].z = rand()%10000;
    }
}

double Fun1(CPT* pts,const int iNum)
{
     double dMinDis = 10000*10000 ;
    for(int i = 0 ; i < iNum ; i++ )
        for( int j = i+1 ; j < iNum ; j++ )
        {
            const double d = Dis(pts[i] , pts[j]);
            if( d < dMinDis)
            {
                dMinDis = d ;
            }
        }
        return dMinDis;
}

class CCmpY
{
public:
    bool operator()(const CPT& pt1,const CPT& pt2)
    {
        return pt1.y < pt2.y ;
    }
};

double Fun2(CPT* pts,const int iNum)
{
    std::sort(pts,pts+iNum,CCmpY() );

    double dMinDis = 10000*10000 ;
    for(int i = 0 ; i < iNum ; i++ )
        for( int j = i+1 ; j < iNum ; j++ )
        {
            const double d = Dis(pts[i] , pts[j]);
            if( d < dMinDis)
            {
                dMinDis = d ;
            }
            if( abs(pts[i].y - pts[j].y )> dMinDis )
            {
                break;
            }
        }
        return dMinDis;
}

double Fun3(CPT* pts,const int iNum)
{
    std::sort(pts,pts+iNum,CCmpY() );

    if( iNum < 100 )
    {
        return Fun1(pts,iNum);
    }

    const int iMid = iNum/2 ;
    const double dMin1 = Fun3(pts,iMid);
    const double dMin2 = Fun3(pts+iMid,iNum-iMid);
    double dMinDis = min(dMin1,dMin2) ;
    for(int i = iMid-1 ; i >= 0 ; i-- )//左集合
    {
        if( abs(pts[i].y - pts[iMid].y ) > dMinDis )
        {
            break;
        }
        for( int j = iMid ; j < iNum ; j++ )//右集合
        {
            const double d = Dis(pts[i] , pts[j]);
            if( d < dMinDis)
            {
                dMinDis = d ;
            }
            if( abs(pts[i].y - pts[j].y )> dMinDis )
            {
                break;
            }
        }
    }
        return dMinDis;
}

 


可通過以下鏈接下載測試數據,exe,源碼(VS2005,VC8)
https://pan.baidu.com/s/1QyQgtUvqtuH3n7TCLHxKtA


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 本次分析基於 CPython 解釋器,python3.x版本 在python2時代,整型有 int 類型和 long 長整型,長整型不存在溢出問題,即可以存放任意大小的整數。在python3後,統一使用了長整型。這也是吸引科研人員的一部分了,適合大數據運算,不會溢出,也不會有其他語言那樣還分短 ...
  • 一、視圖函數 一個視圖函數,簡稱視圖,是一個簡單的python函數,接收web請求並返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤等。在函數中必須寫一個request的參數,然後必須要有返回值,中間的邏輯隨便,整個函數寫在哪裡也無所謂,只要python目錄下就行,但我們 ...
  • 一、憧憬和期待 這一年從畢業到工作經歷了很多,沒畢業之前的各種憧憬和期待,到工作的迷茫和無奈。 從對PHP的認知的到現在的技術開發,上學時感覺良好的我到工作中的手忙腳亂。仿佛現實給了我重重的一擊,每天起來鏡子中的我是迷茫找不到未來的人生方向的屌絲小青年。沒工作前憧憬著朝九晚五每天寫寫代碼拿著很高的月 ...
  • 1 輸出大寫字母、小寫字母、大小寫字母、數字、大小寫字母和數字 1.1輸出小寫:找到小寫a(97)到z(122)的的ASCII碼,然後轉義為字母lower = ""for i in range(97,123): lower += chr(i)print('%s' % lower) 1.2輸出大寫:找 ...
  • jsp隱式對象都包括什麼?包括request、response、out、session、application、config、pageContext。 ...
  • org.hibernate.exception.SQLGrammarException:could not insert ...
  • VSCode配置JAVA開發環境 1:給機器安裝JDK、MAVEN 下載JDK 下載路徑:https://www.oracle.com/technetwork/java/javase/downloads/jdk11 downloads 5066655.html 配置JAVA的環境變數 我的JDK在硬 ...
  • 一.random模塊 隨機 random() 隨機小數 uninform(a,b) 隨機小數 randint(a,b) 隨機整數 choice() 隨機選擇一個 sample() 隨機選擇多個 shuffle() 打亂 二.Counter 計數 三.字典 1.預設值字典 2.有序字典 四.棧和隊列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...