目錄
範例
方法一
演算法
輸出
方法二
首頁 後端開發 C++ 使用優先隊列找到離原點最近的K個點

使用優先隊列找到離原點最近的K個點

Sep 14, 2023 pm 09:01 PM
優先隊列 起源 離近點

使用優先隊列找到離原點最近的K個點

在這個問題中,我們將從給定的 N 個點中找到 2D 平面中距離原點最近的 K 個點。

我們可以使用標準的歐氏距離公式來計算原點到每個給定點之間的距離。之後,我們可以將有距離的點儲存到數組中,根據距離對數組進行排序,並取前K個點。

然而,我們也可以使用優先權佇列根據點與原點的距離來儲存二維點。之後,我們可以從隊列中出隊K次。

問題陳述− 我們在二維平面上給定了N個點。我們要找出離平面原點最近的K個點。

注意- 將歐幾里德距離視為原點和平面給定點之間的距離。

範例

輸入

points = {{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}}, K = 4
登入後複製

輸出

{2,1} {2,-2} {0,3} {-5,1}
登入後複製

Explanation − 這裡是每個點到原點的歐幾里德距離。

  • (2, −2) −> sqrt(8)

  • (−5, 1) −> sqrt(26)

  • (2, 1) -> sqrt(5)

  • (0, 3) −> sqrt(9)

  • (6, 0) -> sqrt(36)

  • (5, 5) -> sqrt(50)

  • (4, 9) -> sqrt(97)

因此,4 個最近的點是 {2,1} {2,−2} {0,3} {−5,1}。

輸入

points = {{1, 2}, {2, 1}, {-2, 1}, {1, -2}} K = 2
登入後複製

輸出

{1, 2}, {2, 1}
登入後複製

Explanation − 所有點到原點的距離都是相同的。因此,我們可以將任意2個點作為輸出列印。

輸入

points = {{1, 3}, {6, 7}, {1, 1}, {1, 0}} K = 4
登入後複製

輸出

{1, 0}, {1, 1}, {1, 3}, {6, 7}
登入後複製

解釋− K 等於給定點。因此,我們需要列印所有點。

方法一

在這種方法中,我們將使用 sort() 方法對陣列進行排序。此外,我們將使用比較器函數根據點與原點的距離對點進行排序。之後,我們列印排序數組的前 K 個元素。

演算法

步驟 1 − 使用sort()方法對清單進行排序,並將distComparator()函數作為第三個參數傳遞。

第二步− 定義distComparator()函數來比較給定點的距離。此函數以p和q對作為參數。

步驟 2.1 − 取得點 p 到原點的距離並將其儲存在 dist_p 中。

步驟 2.2 − 將點 q 到原點的距離儲存在 dist_q 變數中。

步驟 2.3 − 如果 dist_p 小於 dist_q,則傳回 true。否則,返回 false。

第 3 步- 遍歷數組,並列印數組的前 K 個點。

範例

#include <bits/stdc++.h>
using namespace std;

bool distComparator(const pair<int, int> &p, const pair<int, int> &q) {
    int dist_p = p.first * p.first + p.second * p.second;
    int dist_q = q.first * q.first + q.second * q.second;
    return dist_p < dist_q;
}
vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) {
    vector<pair<int, int>> res_points;
    sort(points.begin(), points.end(), distComparator);
    // Get the first K points
    for (int p = 0; p < k; p++)     {
        res_points.push_back({points[p].first, points[p].second});
    }
    return res_points;
}
int main() {
    int k = 4, n = 7;
    vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}};
    vector<pair<int, int>> res = findKPoints(points, n, k);
    cout << "The " << k << " closest points from origin are - ";
    for (int p = 0; p < k; p++) {
        cout << "{" << res[p].first << "," << res[p].second << "} ";
    }
    return 0;
}
登入後複製

輸出

The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
登入後複製
登入後複製

時間複雜度 - 對陣列進行排序的時間複雜度為O(NlogN)。

空間複雜度 - O(N) 用於對陣列進行排序。

方法二

在這種方法中,我們將使用優先權佇列來插入點。此外,我們將使用比較器函數和優先權佇列來根據離原點的最短距離來儲存點。

演算法

步驟 1 − 定義‘res_points’列表,用於儲存K個最近的點。

步驟 2- 定義優先權佇列。這裡,‘pair’表示使用優先權佇列來儲存整數對。 ‘vector>’表示使用向量來儲存對。此外,我們還使用了具有優先權佇列的“cmp”函數。

第三步驟− 定義cmp()函數來比較兩個點到原點的歐幾裡得距離。

步驟 3.1 - 根據 a 點到原點的距離大於 b 點到原點的距離,傳回布林值。

第 4 步- 將陣列的每個元素插入優先權佇列。

步驟5− 從佇列中彈出前K個元素,並將它們儲存在res_points清單中。

第 6 步− 回傳點的 res_points 清單。

範例

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) {
    vector<pair<int, int>> res_points;
    // Custom comparator to compare points based on their distance from the origin
    auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) {
        return (a.first * a.first + a.second * a.second) > (b.first * b.first + b.second * b.second);
    };
    // Use the custom comparator in the priority_queue
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> p_que(cmp);
    for (int p = 0; p < n; p++) {
        // Inserting points in a queue
        p_que.push(points[p]);
    }
    // Get first K points
    while (k--) {
        auto temp = p_que.top();
        res_points.push_back(temp);
        p_que.pop();
    }
    return res_points;
}
int main() {
    int k = 4, n = 7;
    vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}};
    vector<pair<int, int>> res = findKPoints(points, n, k);
    cout << "The " << k << " closest points from origin are - ";
    for (int p = 0; p < k; p++) {
        cout << "{" << res[p].first << "," << res[p].second << "} ";
    }
    return 0;
}
登入後複製

輸出

The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
登入後複製
登入後複製

時間複雜度 - O(N*logN) 將 N 個元素插入優先權佇列。這裡,N是總點數。

空間複雜度 - 在優先權佇列中儲存點的 O(N)。

優先佇列使用堆疊資料結構。因此,插入和刪除元素只需O(logN)的時間。這兩種方法都需要相同的記憶體和時間。然而,第二種方法更有效率,因為它使用了堆資料結構。

以上是使用優先隊列找到離原點最近的K個點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Redis實作優先隊列詳解 Redis實作優先隊列詳解 Jun 20, 2023 am 08:31 AM

Redis實作優先權佇列詳解優先權佇列是一種常見的資料結構,它可以按照某種規則對元素進行排序,並在佇列操作時保持這個排序,從而使得佇列中取出的元素總是按照預設的優先權進行。 Redis作為記憶體資料庫,因其快速、高效的資料存取能力,在實現優先隊列時也有著優勢。本文將詳細介紹Redis實作優先隊列的方法與應用。一、Redis實作基本原理Redis實作優先隊列的基本

C++中的堆和優先隊列 C++中的堆和優先隊列 Aug 22, 2023 pm 04:16 PM

堆和優先佇列是C++中常用的資料結構,它們都具有重要的應用價值。本文將分別對堆和優先隊列進行介紹和解析,以幫助讀者更好地理解和使用它們。一、堆堆是一種特殊的樹狀資料結構,它可以用來實作優先權佇列。在堆中,每個節點都滿足如下性質:它的值不小於(或不大於)其父節點的值。它的左右子樹也是一堆。我們將不小於其父節點的堆稱為“最小堆”,將不大於其父節點的堆稱為“最大堆”

Python中的堆和優先隊列的使用場景有哪些? Python中的堆和優先隊列的使用場景有哪些? Oct 28, 2023 am 08:56 AM

Python中的堆和優先隊列的使用場景有哪些?堆是一種特殊的二元樹結構,常用於有效率地維護一個動態的集合。 Python中的heapq模組提供了堆的實現,可以方便地進行堆的操作。優先隊列也是一種特殊的資料結構,不同於普通的佇列,它的每個元素都有一個與之相關的優先權。最高優先順序的元素先被取出。 Python中的heapq模組也可以實現優先權佇列的功能。下面我們介紹一些

在PHP中使用Memcache快取技術提高優先權佇列的效率 在PHP中使用Memcache快取技術提高優先權佇列的效率 May 17, 2023 pm 03:31 PM

隨著社會的不斷發展,人們對於電腦科技的要求也變得越來越高。在計算機中,佇列是一種非常重要的資料結構,能夠幫助我們有效率地解決許多問題。然而,在實際的應用過程中,佇列的效率往往會受到一些因素的限制,例如網路的延遲、查詢資料庫的速度等等。所以,今天我們來介紹一個解決這個問題的方法:在PHP中使用Memcache快取技術,以提高優先權佇列的效率。一、什麼是優先隊列

使用優先隊列找到離原點最近的K個點 使用優先隊列找到離原點最近的K個點 Sep 14, 2023 pm 09:01 PM

在這個問題中,我們將從給定的N個點中找到2D平面中距離原點最近的K個點。我們可以使用標準的歐氏距離公式來計算原點到每個給定點之間的距離。之後,我們可以將有距離的點儲存到數組中,根據距離對數組進行排序,並取前K個點。然而,我們也可以使用優先隊列根據點與原點的距離來儲存二維點。之後,我們可以從隊列中出隊K次。問題陳述−我們在二維平面上給定了N個點。我們要找出離平面原點最近的K個點。注意-將歐幾裡得距離視為原點和平面給定點之間的距離。範例輸入points={{2,-2},{-5,1},{2,1},{

PHP資料結構:優先隊列的應用,掌控有序元素的獲取 PHP資料結構:優先隊列的應用,掌控有序元素的獲取 Jun 01, 2024 pm 05:55 PM

優先佇列允許按優先權儲存和存取元素,基於可比較標準(如值、時間戳記或自訂邏輯)設定優先權。 PHP中的實作方法包括SplPriorityQueue類別和Min/Max堆。實戰案例示範如何使用SplPriorityQueue類別建立優先隊列並按優先順序取得元素。

Python中的堆和優先佇列是如何實現的? Python中的堆和優先佇列是如何實現的? Oct 18, 2023 am 10:22 AM

Python中的堆和優先佇列是如何實現的?堆和優先隊列是在電腦科學中常用的資料結構。在Python中,我們可以使用heapq模組來實作堆和優先隊列。堆是一種特殊的完全二元樹,在堆中,每個父節點的值都比它的子節點的值要小(或大),這樣的堆被稱為小根堆(或大根堆)。在Python中,堆可以透過列表來表示。 Python的heapq模組提供了一些方法來操作堆。首先

檢查是否可能從原點到達給定圓的周長上的任意點 檢查是否可能從原點到達給定圓的周長上的任意點 Aug 29, 2023 pm 09:13 PM

圓的周長可以定義為圓的外邊界。它是圓的周長。圓周圍的每一個點都遵循某些屬性,如下所示-點(x,y)位於圓內,使得$\mathrm{x^2+y^2R^2}$其中R=圓的半徑。問題陳述給定一個表示一系列移動(L、R、U、D)的字串S和一個表示圓半徑的整數R。檢查是否可以透過選擇從S開始的任何移動子序列來到達以原點為半徑為R的圓的圓週上的任何點。每個移動的操作如下所示,L=減少x座標R=增量x座標U=y座標增量D=遞減y座標範例1輸入S=“RURDLR”R=2輸出Yes說明選擇子序列「RR ”-最初,(

See all articles