数据结构之稀疏数组

数据结构之稀疏数组(Sparsearray)

一、使用条件

当一个数组中大部分元素都是0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
eg:记录五指棋的棋盘、发送消息时的大量重复信息

二、处理方法

1)记录数组一共有几行几列,有多少个不同的值;
2)把不同的值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

三、图解例子

在这里插入图片描述
解析:左边为一个数据比较多的6*7的二维数组,储存的时候会比较多,可以使用稀疏数组储存该二维数组达到提升效率的效果,右图中row代表左图的行,col代表列,val代表值,右图第一行表示左图有6行7列,最多的一个值是0,第二行表示0行3列有一个值是22,0行6列有一个值是15,以此类推完成稀疏数组。

四、原始数组转换为稀疏数组
原始数组初始化,遍历,储存

	var SparseArr [11][11]int
	SparseArr[1][2]=1
	SparseArr[2][3]=2  //初始化数组
    for _,v:=range SparseArr{
		for _,v1:=range v{
			fmt.Printf("%d\t",v1)
		}
		fmt.Println();
	}

输出结果:
在这里插入图片描述
转换为稀疏数组

package main
import (
	"fmt"
)
type Sparse struct {
	row int
    col int
	val int
}            //定义稀疏数组的结构
func main(){
	var SparseArr [11][11]int
	var Slice []Sparse
	//标准稀疏数组加上第一行
	Sparse1:=Sparse{
		row:11,
		col:11,
		val:0,
	}
	Slice=append(Slice,Sparse1)
	SparseArr[1][2]=1
	SparseArr[2][3]=2  //初始化数组
    for i,v:=range SparseArr{
		for j,v1:=range v{
			if v1!=0{
				Sparse:=Sparse{
					row:i,
					col:j,
					val:v1,
				}
				Slice=append(Slice,Sparse)
			}
		}
	}
	//构造稀疏数组
   for i,v :=range Slice{
	   fmt.Printf("%d:%d\t%d\t%d\n",i,v.row,v.col,v.val)
   }
   //读取稀疏数组
}

稀疏数组储存结果:
在这里插入图片描述
五、稀疏数组转换为原始数组

 //读取稀疏数组
   var SparseArr1[11][11] int
   for i,v:=range Slice{
	   if i!=0{
		   SparseArr1[v.row][v.col]=v.val
	   }
   }
   for _,v:=range SparseArr1{
       for _,v1:=range v{
		   fmt.Printf("%d\t",v1)
	   }
	   fmt.Println()
   }

将稀疏数组保存在文件中,在从文件中读取,即可实现高效率传输。

package main
import (
	"fmt"
	"os"
	"bufio"
	"io"
	"strings"
	"strconv"
)
type Sparse struct {
	row int
    col int
	val int
}            //定义稀疏数组的结构
func main(){
	defer func(){
         err:=recover()
		 if err!=nil{
			 fmt.Println("出现错误")
		 }
	}()
	var SparseArr [11][11]int
	var Slice []Sparse
	//标准稀疏数组加上第一行
	Sparse1:=Sparse{
		row:11,
		col:11,
		val:0,
	}
	Slice=append(Slice,Sparse1)
	SparseArr[1][2]=1
	SparseArr[2][3]=2  //初始化数组
    for i,v:=range SparseArr{
		for j,v1:=range v{
			if v1!=0{
				Sparse:=Sparse{
					row:i,
					col:j,
					val:v1,
				}
				Slice=append(Slice,Sparse)
			}
		}
	}
	//构造稀疏数组
	//文件保存
   var path string ="G:\\Goproject\\goFile.txt"
   file,err:=os.OpenFile(path,os.O_WRONLY|os.O_RDONLY,0666)
   defer file.Close()
   if err!=nil{
	   fmt.Println("出现错误")
   }
   writer:=bufio.NewWriter(file)
   for _,v :=range Slice{
	   str:=fmt.Sprintf("%d\t%d\t%d\n",v.row,v.col,v.val)
	   writer.WriteString(str)
   }
   writer.Flush()
   fmt.Println("储存成功")
   //文件读取
   file1,err:=os.Open(path)
   reader:=bufio.NewReader(file1)
   var i int = 0
   var Slice1 []Sparse
   for{
	str,err:=reader.ReadString('\n')
	if i==0{
		i++
		continue
	}
	if err==io.EOF{
		fmt.Println("读取完毕")
		break
	}
	str=strings.TrimRight(str,"\n")
	arrSplit:=strings.Split(str,"\t")
	row,err:= strconv.Atoi(arrSplit[0])
	col,err:= strconv.Atoi(arrSplit[1])
	val,err:= strconv.Atoi(arrSplit[2]) //string转换为Int
	if err!=nil{
		fmt.Println(err)
	}
	sparse:=Sparse{
         row:row,
		 col:col,
		 val:val,
	}

    Slice1=append(Slice1,sparse)
   }
//    fmt.Println(Slice1)
//    读取稀疏数组
   var SparseArr1[11][11] int
   for _,v:=range Slice1{
		   SparseArr1[v.row][v.col]=v.val
   }
   for _,v:=range SparseArr1{
       for _,v1:=range v{
		   fmt.Printf("%d\t",v1)
	   }
	   fmt.Println()
   }
}

如果这篇文章对大家有帮助,请点赞支持,谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值