」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我們如何在由兩列「Identifier1」和「Identifier2」所表示的無向圖中將相關識別碼分組,並為它們指派唯一的群組ID?

我們如何在由兩列「Identifier1」和「Identifier2」所表示的無向圖中將相關識別碼分組,並為它們指派唯一的群組ID?

發佈於2024-10-31
瀏覽:830

How do we group related identifiers in an undirected graph represented by two columns, \'Identifier1\' and \'Identifier2\', and assign them unique group IDs?

在無向圖中查找連通子圖

問題:

給定一個由兩列「Identifier1」和「Identifier2」表示的無向圖,我們如何將彼此相關的識別碼進行分組並為它們分配唯一的群組ID?

解決方案:

這個問題可以透過將資料視為圖中的邊並遍歷所有邊來解決遞歸地。

遞歸演算法:

  1. 建立一個包含兩列中所有唯一識別碼的表。
  2. 建立一個包含兩列中所有邊(識別碼對)的表格方向。
  3. 定義一個遞歸查詢,從每個標識符開始遍歷圖形,並建立遍歷標識符的路徑。
  4. 以起始標識符(錨點標識符)將結果分組,以識別連接的元件。
  5. 根據錨點識別碼為每個連接的元件分配唯一的群組 ID。

範例查詢 (SQL):

WITH
CTE_Idents AS (
    SELECT Ident1 AS Ident
    FROM @T

    UNION

    SELECT Ident2 AS Ident
    FROM @T
),
CTE_Pairs AS (
    SELECT Ident1, Ident2
    FROM @T
    WHERE Ident1 <> Ident2

    UNION

    SELECT Ident2 AS Ident1, Ident1 AS Ident2
    FROM @T
    WHERE Ident1 <> Ident2
),
CTE_Recursive AS (
    SELECT
        CAST(CTE_Idents.Ident AS varchar(8000)) AS AnchorIdent 
        , Ident1
        , Ident2
        , CAST(','   Ident1   ','   Ident2   ',' AS varchar(8000)) AS IdentPath
        , 1 AS Lvl
    FROM 
        CTE_Pairs
        INNER JOIN CTE_Idents ON CTE_Idents.Ident = CTE_Pairs.Ident1

    UNION ALL

    SELECT 
        CTE_Recursive.AnchorIdent 
        , CTE_Pairs.Ident1
        , CTE_Pairs.Ident2
        , CAST(CTE_Recursive.IdentPath   CTE_Pairs.Ident2   ',' AS varchar(8000)) AS IdentPath
        , CTE_Recursive.Lvl   1 AS Lvl
    FROM
        CTE_Pairs
        INNER JOIN CTE_Recursive ON CTE_Recursive.Ident2 = CTE_Pairs.Ident1
    WHERE
        CTE_Recursive.IdentPath NOT LIKE CAST('%,'   CTE_Pairs.Ident2   ',%' AS varchar(8000))
),
CTE_RecursionResult AS (
    SELECT AnchorIdent, Ident1, Ident2
    FROM CTE_Recursive
),
CTE_CleanResult AS (
    SELECT AnchorIdent, Ident1 AS Ident
    FROM CTE_RecursionResult

    UNION

    SELECT AnchorIdent, Ident2 AS Ident
    FROM CTE_RecursionResult
)
SELECT
    CTE_Idents.Ident
    ,CASE WHEN CA_Data.XML_Value IS NULL 
    THEN CTE_Idents.Ident ELSE CA_Data.XML_Value END AS GroupMembers
    ,DENSE_RANK() OVER(ORDER BY 
        CASE WHEN CA_Data.XML_Value IS NULL 
        THEN CTE_Idents.Ident ELSE CA_Data.XML_Value END
    ) AS GroupID
FROM
    CTE_Idents
    CROSS APPLY
    (
        SELECT CTE_CleanResult.Ident ','
        FROM CTE_CleanResult
        WHERE CTE_CleanResult.AnchorIdent = CTE_Idents.Ident
        ORDER BY CTE_CleanResult.Ident FOR XML PATH(''), TYPE
    ) AS CA_XML(XML_Value)
    CROSS APPLY
    (
        SELECT CA_XML.XML_Value.value('.', 'NVARCHAR(MAX)')
    ) AS CA_Data(XML_Value)
WHERE
    CTE_Idents.Ident IS NOT NULL
ORDER BY Ident;

重點:

  • 遞歸CTE(公共表表達式)遍歷圖並建立連通分量。
  • 最終的SELECT語句指派群組ID 並以所需格式產生輸出。
  • 此解決方案經過最佳化,可避免冗餘計算並提供高效的結果。
最新教學 更多>
  • 使用 Vue jsx 進行動態佈局:靈活且可維護的 UI 指南
    使用 Vue jsx 進行動態佈局:靈活且可維護的 UI 指南
    Written by Dubem Izuorah Have you ever spent hours tweaking the same web layout across multiple pages or struggled to make your UI adapt to changing ...
    程式設計 發佈於2024-11-08
  • 以下是一些標題選項,請記住問題格式和文章的重點是控制選擇框選項寬度:

**選項 1(更多技術性):**
* **如何控制Sele的寬度
    以下是一些標題選項,請記住問題格式和文章的重點是控制選擇框選項寬度: **選項 1(更多技術性):** * **如何控制Sele的寬度
    如何控制選擇框選項的寬度當選擇框中的選項超出框的寬度時,可能會造成混亂以及笨拙的外觀。為了解決這個問題,我們可以同時使用 CSS 和 JavaScript 來自訂選項的寬度並截斷任何多餘的文字。 CSS 方法:雖然單獨使用 CSS 是不行的足以設定選項的寬度,我們可以利用它來固定選擇框本身的寬度。透...
    程式設計 發佈於2024-11-08
  • C++ 異常說明符值得這麼麻煩嗎?
    C++ 異常說明符值得這麼麻煩嗎?
    C 中的異常說明符:你應該使用它們嗎? C 中的例外說明符可讓您指示函數是否可能拋出特定的例外類型。然而,由於擔心 Visual Studio .NET 中的編譯器執行、程式終止和非標準行為,人們對其實際用途產生了疑問。 為什麼不使用異常說明符:有限執行:編譯器不嚴格執行異常說明符,從而減少了它們提...
    程式設計 發佈於2024-11-08
  • 使用 .EJS 範本配置 Express
    使用 .EJS 範本配置 Express
    通常,我使用經典的入門版。 Expressjs.com const express = require('express') const app = express() const port = 3000 app.set('view engine', 'ejs') app.use(express....
    程式設計 發佈於2024-11-08
  • 如何將自訂字體新增至 Tailwind - 對於網頁和本機下載的字體
    如何將自訂字體新增至 Tailwind - 對於網頁和本機下載的字體
    创建 Web 应用程序时,包含您喜欢的字体就像锦上添花。字体增强文本效果,使网站更具吸引力,并提供更好的用户体验。设计师和开发人员对某些字体又爱又恨,使用默认字体可能会限制他们的创造力。添加自定义字体使开发人员可以自由地将外部字体添加到他们的应用程序中。 先决条件 在本教程中,我强烈...
    程式設計 發佈於2024-11-08
  • JavaScript 柯里化的詳細討論
    JavaScript 柯里化的詳細討論
    Currying হলো একটি ফাংশনাল প্রোগ্রামিং কৌশল যেখানে একটি ফাংশন একাধিক আর্গুমেন্ট নেওয়ার পরিবর্তে একটি একক আর্গুমেন্ট গ্রহণ করে এবং একটি নতুন ফাংশন রিটা...
    程式設計 發佈於2024-11-08
  • 了解 Python 裝飾器:深入探討
    了解 Python 裝飾器:深入探討
    Python 裝飾器是強大的工具,允許我們修改或增強函數或方法的行為。常見用例包括日誌記錄、授權等。 然而,當被要求定義裝飾器時,許多人可能會說, 它是函數的包裝器。 雖然這在技術上是正確的,但幕後還發生了更多事情。 剖析一個簡單的裝飾器 讓我們探討一個簡單的例子: def my_decora...
    程式設計 發佈於2024-11-08
  • 課程計畫:年級學生 Python 基礎知識(初級)
    課程計畫:年級學生 Python 基礎知識(初級)
    客观的: 在本课程结束时,学生将对 Python 编程有基本的了解,包括变量、基本数据类型、循环和函数。他们将使用 Python 创建简单的程序,运用逻辑思维和解决问题的技能。 持续时间:6 节课 第 1 课:Python 简介和设置 目标:让学生熟...
    程式設計 發佈於2024-11-08
  • 如何在 Java 中正確複製二維數組以保留修改?
    如何在 Java 中正確複製二維數組以保留修改?
    透過複製保留二維數組修改在 Java 中,建立物件副本時,了解引用分配行為至關重要。在給定的場景中,定義了兩個名為 current 和 old 的二維數組,以及複製內容的方法。 old() 方法將 current 陣列指派給 old 。然而,這只是將引用傳輸到記憶體中的相同數組。當 current ...
    程式設計 發佈於2024-11-08
  • 使用 JavaScript 創建令人著迷的粒子動畫
    使用 JavaScript 創建令人著迷的粒子動畫
    這就是我們要創建的,將滑鼠移到粒子上即可查看效果。 在本文中,我將引導您完成使用 JavaScript 和 HTML5 畫佈建立迷人粒子動畫的過程。該專案不僅增強了網頁的美觀性,而且還是深入研究一些有趣的編碼概念的絕佳機會。讓我們開始吧! 項目概況 動畫的特點是粒子圍繞中心點以圓...
    程式設計 發佈於2024-11-08
  • 使用 JavaScript 釋放大型語言模型的力量:實際應用程式
    使用 JavaScript 釋放大型語言模型的力量:實際應用程式
    In recent years, Large Language Models (LLMs) have revolutionized how we interact with technology, enabling machines to understand and generate human-...
    程式設計 發佈於2024-11-08
  • Bootstrap 與 Tailwind 整合:Pro 與 Contro | Bootstrap 和 Tailwind:優點和缺點
    Bootstrap 與 Tailwind 整合:Pro 與 Contro | Bootstrap 和 Tailwind:優點和缺點
    简介 |介绍 意大利语: 本文有意大利语和英语版本。向下滚动查看英文版本。 英语: 本文有意大利语和英语版本。向下滚动查看英文版本。 意大利语版 Bootstrap 和 Tailwind 集成简介 近年来,Bootstrap和Tailwind CSS已经成为前端开发最流行的两个框架。 Boot...
    程式設計 發佈於2024-11-08
  • 我們如何使用 Gin 框架來增強 Go 應用程式中的錯誤處理?
    我們如何使用 Gin 框架來增強 Go 應用程式中的錯誤處理?
    更好的錯誤處理問題在Go應用程式中,我們如何透過定義自訂錯誤類型(例如appError和實現自定義處理程序來捕獲錯誤並將其寫入回應中?正常的流程邏輯。 ))建立錯誤中間件:func JSONAppErrorReporter() gin.HandlerFunc { 返回 func(c *gin...
    程式設計 發佈於2024-11-08
  • DOM API 終極指南
    DOM API 終極指南
    // Selecting Elements: document is not the real DOM element. document.documentElement; // Select the entire page document.head; // Select the head doc...
    程式設計 發佈於2024-11-08
  • Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    深入研究類別和實例方法的細微差別:Beyond Self 與ClsPython 增強提案(PEP) 8 建議使用“self”作為實例方法中的第一個參數,「cls」作為類別方法中的第一個參數。這種差異源自於這些方法在處理實例和類別時所扮演的不同角色。 實例方法:自我優勢實例方法在實例的實例上呼叫班級。...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3