PowerBI實戰-制作帶有同比及趨勢線的雙柱狀圖

一、引言

今天的PowerBI報表的制作相對有一點復雜,我們直接根據最終展示圖來講解:

可以看到,我們今天要制作的圖像需要包括以下幾點:時間維度的趨勢、兩種不同維度的數據對比、不同數據標簽的展示、不同年份間環比的標簽展示以及上方趨勢線以及趨勢標簽的制作。

最終清晰展現交互性的時間趨勢環比雙柱狀圖。

二、具體教學

那么該如何制作這樣一張表呢?

我們的基礎數據源需要用到三列數據:

【日期列】(圖中年份數據)、【雙柱狀圖數據】(圖中淺藍色為中國部分的數據,橙色為Global部分數據)

首先我們需要用到的可視化對象:

接著我們需要構建在兩個基礎度量值,分別計算當前計算到的中國部分數據總和以及Global部分數據總和:

Current_year_CNPVO_value = sum('PVO&CNI_BI'[Total CHN PVO])

Current_year_GlobalPVO_value = sum('PVO&CNI_BI'[Global?PVO])

接著我們繪制我們的雙柱狀圖的代碼:

Bar_PVO =
// 'PVO&CNI_BI'[YEAR] ), [000 Current_year_CNPVO_value], [000 Current_year_GlobalPVO_value]

VAR Width_Bar =80 //每個柱形空間寬度

VAR Width_BarAct =35 //每個柱形實際寬度(減小寬度以容納兩個柱子)

VAR GapBetweenBars = 3 //兩個柱子之間的間距

VAR Height_ItemLabel = 20 //類別標簽高度

VAR Height_Bar = 200 //柱形最大高度

VAR FontSize = 14 //字號

VAR SpaceAboveRect = 100 //柱形上方留一定空間

VAR Height_Total = Height_ItemLabel + Height_Bar + SpaceAboveRect

VAR MaxValueCN = MAXX( ALLSELECTED( 'PVO&CNI_BI'[YEAR] ), [000 Current_year_CNPVO_value] )

VAR MaxValueGlobal = MAXX( ALLSELECTED( 'PVO&CNI_BI'[YEAR] ), [000 Current_year_GlobalPVO_value] )

VAR MaxValue = MAX(MaxValueCN, MaxValueGlobal) //取兩個指標的最大值

VAR Chart ="

????????<!-- CN PVO 柱子 -->

????????<rect

????????????????x='" & (Width_Bar - (Width_BarAct * 2 + GapBetweenBars)) / 2 & "'

????????????????y='" & Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_CNPVO_value] / ????????????????MaxValue & "'

????????????????height='" & Height_Bar * [000 Current_year_CNPVO_value] / MaxValue & "'

????????????????width='" & Width_BarAct & "'

????????????????fill='lightblue' />

????????<!-- Global PVO 柱子 -->

????????<rect

????????????????x='" & (Width_Bar - (Width_BarAct * 2 + GapBetweenBars)) / 2 + Width_BarAct + GapBetweenBars & "'

????????????????y='" & Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue & "'

????????????????height='" & Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue & "'

????????????????width='" & Width_BarAct & "'

????????????????fill='orange' />

????????<!-- 數值標簽 -->

????????<text

????????????????x='" & (Width_Bar - (Width_BarAct * 2 + GapBetweenBars)) / 2 + Width_BarAct / 2 & "'

????????????????y='" & Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_CNPVO_value] / ????????????????MaxValue - 5 & "' text-anchor='middle'

????????????????font-size='" & FontSize * 0.7 & "'

????????????????fill='deepskyblue'

????????>" & "</text>

????????<text

????????????????x='" & (Width_Bar - (Width_BarAct * 2 + GapBetweenBars)) / 2 + Width_BarAct * 1.5 + GapBetweenBars & "'

????????????????y='" & Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue - 5 & "'

????????????????text-anchor='middle'

????????????????font-size='" & FontSize * 0.7 & "'

????????????????fill='orange'

>" & "</text>

????????<!-- 年份標簽 -->

????????<text

????????????????x='" & Width_Bar / 2 & "' y='" & Height_Total - FontSize / 2 & "' text-anchor='middle'

????????????????dominant-baseline='middle'

????????????????font-size='" & FontSize & "'

????????????????font-weight='bold' >" & SELECTEDVALUE('PVO&CNI_BI'[YEAR]) & "</text>"

RETURN

????????"<svg xmlns='http://www.w3.org/2000/svg' id='" & ????????SELECTEDVALUE('PVO&CNI_BI'[YEAR]) & "'

????????width='" & Width_Bar & "'

????????height='" & Height_Total & "'>"

????????& Chart & "

</svg>"

然后是將對應數據與上面繪制的圖像相結合:

Stylesheet =?
// 'PVO&CNI_BI'[YEAR] ), [000 Current_year_CNPVO_value], [000 Current_year_GlobalPVO_value]
VAR n = COUNTROWS( ALLSELECTED( 'PVO&CNI_BI'[YEAR] ))
VAR Width_Bar = 80 //每個柱形空間寬度
VAR Width_BarAct_CNPVO = 35 //CNPVO柱形實際寬度
VAR Width_BarAct_Global = 21 //GlobalPVO柱形實際寬度(CNPVO寬度的60%)
VAR Width_Total = Width_Bar * n
VAR Height_ItemLabel = 20 //類別標簽高度
VAR Height_Bar = 200 //柱形最大高度
VAR FontSize = 12 //字號
VAR SpaceAboveRect = 100 //柱形上方留一定空間
?

// 分別計算CNPVO和GlobalPVO的最大值
VAR MaxValue_CNPVO =
? ? MAXX ( ALLSELECTED ( 'PVO&CNI_BI'[YEAR] ), [000 Current_year_CNPVO_value] )
VAR MaxValue_GlobalPVO =
? ? MAXX ( ALLSELECTED ( 'PVO&CNI_BI'[YEAR] ), [000 Current_year_GlobalPVO_value] )

// 分別計算CNPVO和GlobalPVO的總高度
VAR Height_Total_CNPVO = Height_ItemLabel + Height_Bar + SpaceAboveRect
VAR Height_Total_Global = Height_ItemLabel + Height_Bar + SpaceAboveRect

// 修正FirstValue和LastValue的計算
VAR FirstValue =
? ? CALCULATE(
? ? ? ? [000 Current_year_CNPVO_value],
? ? ? ? TOPN(1, ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR], ASC)
? ? )
VAR LastValue =
? ? CALCULATE(
? ? ? ? [000 Current_year_CNPVO_value],
? ? ? ? TOPN(1, ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR], DESC)
? ? )
VAR Gap = DIVIDE(LastValue-FirstValue,FirstValue)
?

// 獲取第一個和最后一個柱子的中心X坐標
VAR FirstBarCenterX = Width_Bar / 4 ? ? ? ? ?// 調整gap線的首端位置
VAR LastBarCenterX = Width_Total - Width_Bar*(3/4) // 調整gap線的尾端位置
?

// 創建橫向排列的柱形
VAR HorizontalBars =?
CONCATENATEX(
? ? ALLSELECTED('PVO&CNI_BI'[YEAR]),
? ? VAR CurrentValue = [000 Current_year_CNPVO_value]
? ? VAR GlobalValue = [000 Current_year_GlobalPVO_value]
? ??
? ? // 分別計算CNPVO和GlobalPVO的柱子高度
? ? VAR CNPVO_BarHeight = Height_Bar * CurrentValue / MaxValue_CNPVO
? ? VAR Global_BarHeight = Height_Bar * GlobalValue / MaxValue_GlobalPVO
? ??
? ? // 分別計算CNPVO和GlobalPVO的柱子Y位置
? ? VAR CNPVO_PositionY = Height_Total_CNPVO - Height_ItemLabel - CNPVO_BarHeight
? ? VAR Global_PositionY = Height_Total_Global - Height_ItemLabel - Global_BarHeight
? ??
? ? VAR PositionX = (RANKX(ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR],,ASC) - 1) * Width_Bar

? ??
? ? // 分別計算CNPVO和GlobalPVO的X位置
? ? VAR CNPVO_PositionX = PositionX + (Width_Bar - Width_BarAct_CNPVO) / 2
? ? VAR Global_PositionX = PositionX + (Width_Bar - Width_BarAct_Global) / (1.2)
? ??
? ? VAR YearValue = SELECTEDVALUE('PVO&CNI_BI'[YEAR])
? ??
? ? // 分別計算CNPVO和GlobalPVO柱子中心X坐標
? ? VAR CNPVO_BarCenterX = CNPVO_PositionX + Width_BarAct_CNPVO / 2
? ? VAR Global_BarCenterX = Global_PositionX + Width_BarAct_Global / 2
? ??
? ? // 計算百分比標簽的X坐標
? ? VAR MonthIndex = RANKX(ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR],,ASC)
? ? VAR PercentPositionX = (MonthIndex - 1) * Width_Bar + (Width_Bar - Width_BarAct_CNPVO) / 5.5
? ? VAR PercentBarCenterX = PercentPositionX + Width_BarAct_CNPVO / 4
? ??
? ? // 計算百分比標簽的Y坐標,并向上移動10個單位
? ? VAR PercentBarHeight = Height_Bar * CurrentValue / MaxValue_CNPVO * 0.3
? ? VAR PercentPositionY = Height_Total_CNPVO - Height_ItemLabel - PercentBarHeight - 45 - 10
? ??
? ? // 計算CNPVO數值標簽的Y坐標,位于百分比標簽下方
? ? VAR CNPVO_ValueLabelY = PercentPositionY + 20


RETURN
? ? // CNPVO柱形
? ? "<rect x='" & CNPVO_PositionX & "' y='" & CNPVO_PositionY &?
? ? "' width='" & Width_BarAct_CNPVO & "' height='" & CNPVO_BarHeight &?
? ? "' fill='transparent' rx='2'/>" &
? ??
? ? // GlobalPVO柱形
? ? "<rect x='" & Global_PositionX & "' y='" & Global_PositionY &?
? ? "' width='" & Width_BarAct_Global & "' height='" & Global_BarHeight &?
? ? "' fill='transparent' opacity='0.6' rx='2'/>" &
? ??
? ? // 年份標簽
? ? "<text x='" & CNPVO_BarCenterX & "' y='" & (Height_Total_CNPVO - 5) &?
? ? "' text-anchor='middle' font-size='" & FontSize * 0.8 & "'>" & YearValue & "</text>" &
? ??
? ? // CNPVO數值標簽
? ? "<text x='" & PercentBarCenterX & "' y='" & CNPVO_ValueLabelY &
? ? "' text-anchor='middle' font-size='" & FontSize * 0.8 & "'>" & FORMAT(CurrentValue, "#,##0.0") & "</text>" &
? ??
? ? // GlobalPVO數值標簽(使用Global柱子的中心X坐標)
? ? "<text x='" & Global_BarCenterX & "' y='" & (Global_PositionY - 5) &
? ? "' text-anchor='middle' font-size='" & FontSize * 0.7 & "' fill='black'>" & FORMAT(GlobalValue, "#,##0.0") & "</text>"
)


// LineBtw保持不變(百分比標簽的位置計算),但需要向上移動10個單位
VAR LineBtw = ADDCOLUMNS(ALLSELECTED('PVO&CNI_BI'[YEAR]),"line",
VAR CurrentYear = SELECTEDVALUE('PVO&CNI_BI'[YEAR])
VAR PreviousYearIndex = RANKX(ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR],,ASC) - 1
VAR PreviousValue =?
? ? IF(PreviousYearIndex >= 1,
? ? ? ? CALCULATE(
? ? ? ? ? ? [000 Current_year_CNPVO_value],
? ? ? ? ? ? WINDOW(
? ? ? ? ? ? ? ? -1,
? ? ? ? ? ? ? ? REL,
? ? ? ? ? ? ? ? -1,
? ? ? ? ? ? ? ? REL,
? ? ? ? ? ? ? ? ALLSELECTED('PVO&CNI_BI'[YEAR]),
? ? ? ? ? ? ? ? ORDERBY('PVO&CNI_BI'[YEAR])
? ? ? ? ? ? )
? ? ? ? )
? ? )

VAR YoY = IF(ISBLANK(PreviousValue) || PreviousValue = 0, BLANK(), DIVIDE([000 Current_year_CNPVO_value] - PreviousValue, PreviousValue))
VAR MonthIndex = RANKX(ALLSELECTED('PVO&CNI_BI'[YEAR]), 'PVO&CNI_BI'[YEAR],,ASC)
VAR CurrentValue = [000 Current_year_CNPVO_value]
VAR BarHeight = Height_Bar * CurrentValue / MaxValue_CNPVO * 0.3 // YoY顯示在柱子上的高度
VAR PositionX = (MonthIndex - 1) * Width_Bar + (Width_Bar - Width_BarAct_CNPVO) / 5.5
VAR BarCenterX = PositionX + Width_BarAct_CNPVO / 4 ?// 柱子中心X坐標
VAR PositionY = Height_Total_CNPVO - Height_ItemLabel - BarHeight - 45 - 10 ?// 向上移動10個單位
RETURN
IF(NOT ISBLANK(YoY),
? ? "<text x='" & BarCenterX & "' y='" & PositionY &?
? ? "' font-size='" & FontSize * 0.8 & "' text-anchor='middle' fill='" &?
? ? IF(YoY>0,"green","red") & "'>" & FORMAT(YoY,"▲0.0%;▼0.0%;-") & "</text>"
))

// 使用CNPVO的總高度作為SVG容器的高度
VAR _CSS =?
"body { background-image: url(""data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='" & ?Width_Total & "' height='" & Height_Total_CNPVO & "'><path d='M" & FirstBarCenterX & " " & Height_Total_CNPVO - Height_ItemLabel - Height_Bar * FirstValue / MaxValue_CNPVO & "L" & FirstBarCenterX & " " & SpaceAboveRect * 0.2 & " " & ?LastBarCenterX & " " & SpaceAboveRect * 0.2 & " " & LastBarCenterX & " " & Height_Total_CNPVO - Height_ItemLabel - Height_Bar * LastValue / MaxValue_CNPVO & "' fill='none' stroke='lightgrey' stroke-width='1.5' stroke-dasharray='5 2'/><path d='M" & Width_Total / 2 - Width_Bar ?& " " & SpaceAboveRect * 0.2 ?& "L" & Width_Total / 2 & " " & SpaceAboveRect * 0.1 & " " & ?Width_Total / 2 + Width_Bar ? & " " & SpaceAboveRect * 0.2 & " " & Width_Total / 2 & " " & SpaceAboveRect * 0.3 & "' fill='" & IF (Gap>0,"green","tomato") &"'/><text x='" & Width_Total / 2 & "' y='" & SpaceAboveRect * 0.25 & "' font-size='" & FontSize & "' text-anchor='middle' fill='snow'>" & FORMAT(Gap,"+0.0%;-0.0%;-") & "</text><text x='" & LastBarCenterX & "' y='" & Height_Total_CNPVO - Height_ItemLabel - Height_Bar * LastValue / MaxValue_CNPVO - 15 & "' font-size='12' text-anchor='middle' fill='grey'>▼</text>" & HorizontalBars & CONCATENATEX(LineBtw,[line]) & "</svg>"");background-repeat: no-repeat; }" & "
#htmlContent {
? ? display: flex;?
? ? flex-wrap: nowrap;?
? ? overflow-x: auto;
? ? white-space: nowrap;?
}"
RETURN IF(n>1,_CSS)

代碼部分確實有一點復雜,大家可以參照代碼后面所標的注釋一同理解,如果大家想要套用,只需修改表以及列的相關變量即可。

接著,我們拖入剛剛創建的第一個長度量值名稱為【Bar_PVO】到Values部分,Year為表格中日期維度。

然后把第二個長度量值【Style Sheet】拖入到該視覺對象Format下的【Style Sheet】中

接著我們就得到了所想要制作的效果。

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

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

相關文章

物聯網智能網關配置教程:實現注塑機數據經基恩士PLC上傳至云平臺

一、項目背景隨著制造業向智能化、信息化方向快速發展&#xff0c;注塑車間作為塑料制品制造的核心環節&#xff0c;面臨著設備協議多樣、數據孤島嚴重、系統集成困難等問題。某大型注塑企業計劃對其老舊車間進行數字化改造&#xff0c;實現設備數據采集、遠程監控與MES系統對接…

【實戰】預警算法--噪聲添加機制

1. 背景 在多變量自聯想預測或異常檢測場景中&#xff0c;我們常使用帶噪自編碼器&#xff08;Denoising AutoEncoder&#xff0c;DAE&#xff09;來訓練模型&#xff0c;使模型能夠從帶噪輸入中重構原始數據。噪聲的添加方式對訓練效果、穩定性以及模型用途有顯著影響。 2. 兩…

ChromaDB探索

關于 ChromaDB、向量與 RAG 系統的核心知識問答總結 ??Q1: ChromaDB 是什么&#xff1f;它在數據庫領域中扮演什么角色&#xff1f;????A:?? ChromaDB 是一款開源的??向量數據庫??。它的核心角色是專門為 AI 應用&#xff08;如語義搜索、推薦系統、RAG&#xff09…

C# 基于halcon的視覺工作流-章33-矩狀測量

C# 基于halcon的視覺工作流-章33-矩狀測量 本章目標&#xff1a; 一、gen_measure_rectangle2準備提取垂直于矩形的直邊&#xff1b; 二、measure_pos 提取垂直于矩形或環形弧的直線邊緣&#xff1b; 三、measure_pairs提取垂直于矩形或環形弧長軸的直邊對&#xff1b; 四、匹配…

Day05_蒼穹外賣——Redis店鋪營業狀態設置

目錄1.1 Redis簡介1.2 Redis下載與安裝1.2.1 Redis下載1.2.2 Redis安裝1.3 Redis服務啟動與停止1.3.1 服務啟動命令1.3.2 客戶端連接命令1.3.3 修改Redis配置文件1.3.4 Redis客戶端圖形工具2. Redis數據類型2.1 五種常用數據類型介紹2.2 各種數據類型特點3. Redis常用命令3.1 字…

雙指針:字符串

題目&#xff1a;字符串 題目概述&#xff1a;找包含所有小寫字母的最短字符串。 重點思路&#xff1a; right是 < len-1字符 - ‘26’轉換成整形再判斷&#xff08;寫字符a也可以&#xff0c;更準確&#xff09;。 #include <iostream> #include <algorithm>…

HarmonyOS 應用開發深度實踐:精通 Stage 模型與 UIAbility 生命周期

好的&#xff0c;請看這篇關于 HarmonyOS Stage 模型與 UIAbility 深度實踐的技術文章。 HarmonyOS 應用開發深度實踐&#xff1a;精通 Stage 模型與 UIAbility 生命周期 引言 隨著 HarmonyOS 4、5 的廣泛部署和 HarmonyOS NEXT (API 12) 的發布&#xff0c;華為的分布式操作系…

DEDECMS 小程序插件簡介 2.0全新上線

網上有很多的dedecms的小程序插件&#xff0c;但是有的依賴他們第三方、有的需要一定php或sql基礎、有的插件免費但是小程序源碼價格昂貴&#xff0c;這也是促使我開發dedecms小程序插件的一大原因。2025年9月4日 dedecms小程序插件2.0版本正式上線&#xff0c;由于使用人數減少…

Flink 1.17.2 集群安裝部署

Flink集群的安裝 1. 集群規劃 Ip host Server Note 192.168.10.101 node01 jobManager、TaskManagerRunner 老大和小弟服務 192.168.10.102 node02 TaskManagerRunner 小弟 192.168.10.103 node03 TaskManagerRunner 小弟 注意&#xff1a;本次使用jdk-1.8.0…

[vue.js] 樹形結點多選框選擇

vue.js前端代碼&#xff1a; <template><div><el-tree:data"treeData"node-key"id"show-checkboxref"tree"check-change"handleCheckChange"/><el-button click"getSelectedNodes">獲取選中的節點&…

Web 服務器基本工作流程

這是一個關于 ??Web 服務器基本工作流程?? 的全面解釋。我們以最經典的 ??客戶端-服務器-后端?? 三層架構為例&#xff0c;并結合你之前遇到的 Nginx 場景進行說明。??核心角色????客戶端 (Client)??&#xff1a; 通常是 ??Web 瀏覽器?? (Chrome, Firefox)…

IDEA 連接MySQL數據庫

一、 連接數據庫1、打開連接2、建立連接3、輸入用戶名和密碼二、操作數據庫1、選擇數據庫2、New| Query Console 查詢控制臺3、寫查詢語句4、New| SQL Script| sql Generator 生成這個數據庫表的SQL結構New | SQL Script | Generate DDL to Query Console 在查詢控制臺生成…

江協科技STM32課程筆記(二)—外部中斷EXTI

二、外部中斷EXTI中斷&#xff1a;在主程序運行過程中&#xff0c;出現了特定的中斷觸發條件&#xff08;中斷源&#xff09;&#xff0c;使得CPU暫停當前正在運行的程序&#xff0c;轉而去處理中斷程序&#xff0c;處理完成后又返回原來被暫停的位置繼續運行。1、stm32中斷簡介…

Java常見排序算法實現

以下是Java中幾種常見排序算法的實現&#xff0c;包括冒泡排序、選擇排序、插入排序、快速排序和歸并排序。 各排序算法特點說明&#xff1a;冒泡排序&#xff1a; 原理&#xff1a;重復比較相鄰元素&#xff0c;將大的元素逐步"冒泡"到數組末尾特點&#xff1a;穩定…

Python爬蟲實戰:研究Pandas,構建地理信息數據采集和分析系統

1. 引言 1.1 研究背景 地理數據作為描述地球表面空間要素的數據,包含了豐富的空間位置、分布特征和屬性信息,在城市規劃、環境監測、商業分析等眾多領域發揮著不可替代的作用。隨著 "數字地球"、"智慧城市" 等概念的提出和發展,地理數據的重要性日益凸…

nvm安裝node后出現報錯: “npm 不是內部或外部命令,也不是可運行的程序 或批處理文件”

一、問題描述 使用nvm安裝node后&#xff0c;使用npm命令報錯如下 報錯1&#xff1a;npm : 無法將“npm”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c;然后再試一次。報錯2&#xf…

【高等數學】第十二章 無窮級數——第二節 常數項級數的審斂法

上一節&#xff1a;【高等數學】第十二章 無窮級數——第一節 常數項級數的概念和性質 總目錄&#xff1a;【高等數學】 目錄 文章目錄1. 正項級數及其審斂法1. 正項級數及其審斂法 正項級數 各項都是正數或零的級數稱為正項級數正項級數收斂 正項級數 ∑n1∞un\displaystyle\…

圖觀 流渲染場景編輯器

一、 產品簡介圖觀 流渲染場景編輯器&#xff0c;以編輯器插件形式&#xff0c;在Unreal Engine中輕松編輯并發布數字孿生場景。支持 GIS 全球/局部 數字孿生場景構建&#xff0c;并預置 圖觀技術架構工程模板&#xff0c;支持對 場景效果、鏡頭視野&#xff0c;環境時間氣象、…

Visual Studio 函數頭顯示引用個數

在visual studio 里面有自帶的顯示引用方案 codeLens

數據結構的哈希表沖突解決方法

哈希表是一種高效的數據結構,通過哈希函數將鍵映射到存儲位置。但由于哈希函數可能將不同鍵映射到相同位置(稱為哈希沖突),需要有效的方法來解決沖突。以下是常見的沖突解決策略,每種方法都有其原理、優缺點和適用場景。我將逐步解釋這些方法,確保內容清晰可靠。 1. 開放…