go 稀疏数组

 

稀疏数组实现:

package main

import "fmt"

type SparseArray struct {
	col   int
	row   int
	value int
}

func main() {
	// 源数据格式:
	/*
		0       0       0       2       0       0       0       0       0       0
		0       0       1       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
		0       0       0       0       0       0       0       0       0       0
	*/

	va := [10][10]int{}
	va[0][3] = 2
	va[1][2] = 1

	fmt.Println("原稀疏数组")
	for _, v := range va {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Printf("\n")
	}

	// 生成稀疏数组
	var sparseArray []SparseArray
	baseArray := SparseArray{
		col:   11,
		row:   11,
		value: 0,
	}
	sparseArray = append(sparseArray, baseArray)
	for i, v := range va {
		for j, v2 := range v {
			if v2 != 0 {
				var array = SparseArray{
					col:   i,
					row:   j,
					value: v2,
				}
				sparseArray = append(sparseArray, array)
			}
		}
	}
	// 打印稀疏数组
	fmt.Printf("稀疏数组: %v\n", sparseArray)

	// 恢复稀疏数组
	// 1、先获取x轴、y轴及默认值val
	baseNum := sparseArray[0]
	fmt.Printf("x轴:  %d\ny轴:  %d\n默认值val: %d\n", baseNum.col, baseNum.row, baseNum.value)
	x := baseNum.col
	y := baseNum.row
	val := baseNum.value

	// 2、 恢复
	for i := 0; i < x; i++ {
		for j := 0; j < y; j++ {
			// 获取稀疏数组中的数据,防止下标溢出
			if i+1 < len(sparseArray) {
				array := sparseArray[i+1]
				// 当col 和 row 与稀疏数组中的col、row对应时,打印value值
				if array.col == i && array.row == j {
					fmt.Printf("%d\t", array.value)
				} else {
					// 其他情况下值为:默认值
					fmt.Printf("%d\t", val)
				}
			} else {
				fmt.Printf("%d\t", val)
			}
		}
		println("")
	}
	// 可以考虑落盘(先把稀疏数组写入文件,再从文件中读出)
}

  

 

posted @ 2022-09-25 22:26  萤huo虫  阅读(17)  评论(0编辑  收藏  举报