实现稀疏数组

稀疏数组:把具有不同值的元素的行、列以及值记录到一个小规模的数组中,从而缩短程序的规模,也起到压缩数组的功能。

代码实现如下:

	// 1. 创建一个11X11的二维数组,并初始化两个元素
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2
	// 2. 打印出二维数组如下
	for _, v := range chessMap {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}

打印如下:

把二维数组转换为稀疏数组,实现如下:

        // 定义稀疏数组中的对象结构
	type ValNode struct {
		row int // 行
		col int // 列
		val int // 值
	}
	// 3. 转成稀疏数组,遍历数组,记录不为0的值到node结构体中
	var sparseArr = make([]ValNode, 0)
	sparseArr = append(sparseArr, ValNode{
		row: 11,
		col: 11,
		val: 0,
	})
	for i, v := range chessMap {
		for j, v2 := range v {
			if v2 != 0 {
				var node = ValNode{
					row: i,
					col: j,
					val: v2,
				}
				sparseArr = append(sparseArr, node)
			}
		}
	}
        // 打印出稀疏数组
        fmt.Println(sparseArr)

打印如下:

通过稀疏数组恢复二维数组

var chessMap02 = make([][11]int, sparseArr[0].col)
	for i := 0; i < sparseArr[0].col; i++ {
		for j := 0; j < sparseArr[0].row; j++ {
			chessMap02[i][j] = sparseArr[0].val
		}
	}
	for i := 1; i < len(sparseArr); i++ {
		chessMap02[sparseArr[i].row][sparseArr[i].row] = sparseArr[i].val
	}

	for _, v := range chessMap02 {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}

打印如下:

 完整代码如下:

package main
import "fmt"

/**
稀疏数组的实现原理:
	1. 记录数组一共有几行几列,有多少个不同的值
	2. 把具有不同值的元素的行、列以及值记录到一个小规模的数组中,
	从而缩短程序的规模,也起到压缩数组的功能
*/

func main() {
	// 1. 创建一个11X11的二维数组,并初始化两个元素
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2
	// 2. 打印出二维数组如下
	for _, v := range chessMap {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}
	// 定义稀疏数组中的对象结构
	type ValNode struct {
		row int // 行
		col int // 列
		val int // 值
	}
	// 3. 转成稀疏数组,遍历数组,记录不为0的值到node结构体中
	var sparseArr = make([]ValNode, 0)
	sparseArr = append(sparseArr, ValNode{
		row: 11,
		col: 11,
		val: 0,
	})
	for i, v := range chessMap {
		for j, v2 := range v {
			if v2 != 0 {
				var node = ValNode{
					row: i,
					col: j,
					val: v2,
				}
				sparseArr = append(sparseArr, node)
			}
		}
	}
	fmt.Println(sparseArr)
	// 4. 可以存盘处理,这里就不实现了
	// 5. 模拟从磁盘中恢复出原始数组
	var chessMap02 = make([][11]int, sparseArr[0].col)
	for i := 0; i < sparseArr[0].col; i++ {
		for j := 0; j < sparseArr[0].row; j++ {
			chessMap02[i][j] = sparseArr[0].val
		}
	}
	for i := 1; i < len(sparseArr); i++ {
		chessMap02[sparseArr[i].row][sparseArr[i].row] = sparseArr[i].val
	}

	for _, v := range chessMap02 {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}
}
欢迎关注本人微信公众号
欢迎关注本人微信公众号

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值