用go构建个简略的查找(一)
用go构建个简略的查找(二)最简略的索引文件
用go构建个简略的查找(三)对上篇索引文件优化
用go构建个简略的查找(四)哥伦布Golomb编解码完成
增强、留意事项、翻车当地
没看上篇的能够看这个公式
-
增强:把一个接连的数字数组通过编码次序写进uin32[]数组中,然后根据编码反解析出原有的数组数据
-
留意一点 关于m的取数(不能随意设置)需要求数组的平均值,不然会翻车的(下午调的头疼发现这个问题) 有懂得能够留言
-
翻车描述
-
翻车修正:直接保存余数 限制宽度为b
优势(随着数据量增大消攻作用会很大的
-
test := []uint32{182266, 44916, 144917, 244918, 284919, 244918}
-
uint8 : 0 to 255
-
uint16 : 0 to 65535
-
uint32 : 0 to 4294967295
-
上面的数组保存到文件如果以字符串保存:
-
字符串保存:6+5+6+6+6+6=35个字节
-
数字保存:int32:4*6=24字节
-
Golomb:位数:117位,字节数:14+1=15个字节
增强
go顶用uint32[]接连性的保存编码,以及反解析数据 参考下面代码
作用
// 压缩数组
func getGolombEncodeUnion(encode []uint32, num uint32) ([]uint32, uint32) {
b, t := getBT(num)
var result []uint32
lenCount, currentLen := uint32(0), uint32(0)
for index, en := range encode {
testNum, len := getGolombEncode(en/num, en%num, b, t)
if 0 == index {
result = append(result, testNum)
currentLen++
} else {
//int 64/8=8个字节
if lenCount+len < currentLen*32 {
result[currentLen-1] = result[currentLen-1] | testNum<<(lenCount%32)
} else {
if lenCount%32 == 0 { //刚好结束
result = append(result, testNum)
currentLen++
} else { //一半一半的情况
result[currentLen-1] = result[currentLen-1] | testNum<<(lenCount%32)
result = append(result, testNum>>(32-lenCount%32))
currentLen++
}
}
}
lenCount += len
}
return result, lenCount
}
// 解析数组
func getGolombDncodeUnion(encode []uint32, countLen uint32, num uint32) []uint32 {
fmt.Printf("位数:%d,字节数:%d\n", countLen, countLen/8)
b, t := getBT(num)
var result []uint32
currentLen := uint32(0)
for {
temp := encode[0]
res, curLen := getGolombDecodeLen(temp, b, t, num)
fmt.Printf("偏移:%d\n", curLen)
currentLen += curLen //总长度
encode[0] = (encode[0] >> curLen)
for index := 1; index < len(encode); index++ {
encode[index-1] = encode[index-1] | encode[index]<<(32-curLen)
encode[index] = (encode[index] >> curLen)
}
if currentLen > countLen {
break
}
result = append(result, res)
}
return result
}