go 數據結構 之 稀疏數組

在這裏插入圖片描述

什麼是稀疏數組

如果一個數組(包括多維數組)中的大部分元素爲0,或者爲同一個值的數組時,可以使用稀疏數組來保存該數組,節約空間。
一般來說,稀疏數組的處理方法是:
1.記錄數組一共有幾行幾列,有多少個不同的數值。
2.把具有不同值的元素的行列及記錄在一個小規模的數組中,從而縮小程序的規模。

下面是代碼實現

package main

import "fmt"

//定義存儲數據的結構體
type valNode struct {
	row int		//表示二維數組的行
	clo int		//表示二維數組的列
	val int		//表示二維數組的值
}

func main() {

	//定義一個二維數組表示棋盤
	var valMaps  [11][11]int
	valMaps[1][2] = 1		//表示第二行(因爲下標從零開始)第三列有顆黑色棋子
	valMaps[2][3] = 2		//表示第三行第四列有顆白色棋子

	//遍歷數組表示棋盤
	for _,v := range valMaps{
		for _,v2 := range v{
			fmt.Printf("%d",v2)
		}
		fmt.Println()
	}

	//轉換爲稀疏數組
	var valNodes []valNode

	//稀疏數組的第一位我們固定放入二維數組的行和列的固定值
	valNodes = append(valNodes, valNode{
		row: 11,
		clo: 11,
		val: 0,
	})


	for i,v := range valMaps{
		for j,v2 := range v{
			//當數組中有不爲0的元素,我們記錄行和列放入稀疏數組
			if v2 != 0{
				valNodes = append(valNodes, valNode{
					row: i,
					clo: j,
					val: v2,
				})
			}
		}
	}

	//打印稀疏數組
	fmt.Println(valNodes)

	//恢復數據到新的數組中
	var newValMaps [11][11]int
	for i,v := range valNodes{
		//排除二維數組的第一位
		if i != 0{
			//將數據恢復到新的數組中
			newValMaps[v.row][v.clo] = v.val
		}
	}

	//打印新的數組
	for _,v := range newValMaps{
		for _,v2 := range v{
			fmt.Printf("%d",v2)
		}
		fmt.Println()
	}
}

下面是代碼的執行結果

GOROOT=C:\Go #gosetup
GOPATH=E:\gopath #gosetup
C:\Go\bin\go.exe build -o C:\Users\v_licguo\AppData\Local\Temp\___go_build_dataStructure.exe dataStructure #gosetup
C:\Users\v_licguo\AppData\Local\Temp\___go_build_dataStructure.exe #gosetup
00000000000
00100000000
00020000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
[{11 11 0} {1 2 1} {2 3 2}]
00000000000
00100000000
00020000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章