婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang中Bit數組的實現方式

Golang中Bit數組的實現方式

熱門標簽:壽光微信地圖標注 外呼系統顯本地手機號 excel地圖標注分布數據 阿克蘇地圖標注 電話機器人軟件免費 評價高的400電話辦理 涿州代理外呼系統 百度地圖標注后傳給手機 外呼系統用什么卡

Go語言里的集合一般會用map[T]bool這種形式來表示,T代表元素類型。集合用map類型來表示雖然非常靈活,但我們可以以一種更好的形式來表示它。

例如在數據流分析領域,集合元素通常是一個非負整數,集合會包含很多元素,并且集合會經常進行并集、交集操作,這種情況下,bit數組會比map表現更加理想。

一個bit數組通常會用一個無符號數或者稱之為“字”的slice來表示,每一個元素的每一位都表示集合里的一個值。當集合的第i位被設置時,我們才說這個集合包含元素i。

下面的這個程序展示了一個簡單的bit數組類型,并且實現了三個函數來對這個bit數組來進行操作:

package main
import (
	"bytes"
	"fmt"
)
// An IntSet is a set of small non-negative integers.
// Its zero value represents the empty set.
type IntSet struct {
	words []uint
}
const (
	bitNum = (32  (^uint(0) >> 63)) //根據平臺自動判斷決定是32還是64
)
// Has reports whether the set contains the non-negative value x.
func (s *IntSet) Has(x int) bool {
	word, bit := x/bitNum, uint(x%bitNum)
	return word  len(s.words)  s.words[word](1bit) != 0
}
// Add adds the non-negative value x to the set.
func (s *IntSet) Add(x int) {
	word, bit := x/bitNum, uint(x%bitNum)
	for word >= len(s.words) {
		s.words = append(s.words, 0)
	}
	s.words[word] |= 1  bit
}
//A與B的交集,合并A與B
// UnionWith sets s to the union of s and t.
func (s *IntSet) UnionWith(t *IntSet) {
	for i, tword := range t.words {
		if i  len(s.words) {
			s.words[i] |= tword
		} else {
			s.words = append(s.words, tword)
		}
	}
}

因為每一個字都有64個二進制位,所以為了定位x的bit位,我們用了x/64的商作為字的下標,并且用x%64得到的值作為這個字內的bit的所在位置。

例如,對于數字1,將其加入比特數組:

func (s *IntSet) Add(x int) {
 word, bit := x/bitNum, uint(x%bitNum) //0, 1 := 1/64, uint(1%64)
 for word >= len(s.words) { // 條件不滿足
  s.words = append(s.words, 0)
 }
 s.words[word] |= 1  bit // s.words[0] |= 1  1
}
// 把1存入后,words數組變為了[]uint64{2}

同理,假如我們再將66加入比特數組:

func (s *IntSet) Add(x int) {
 word, bit := x/bitNum, uint(x%bitNum) //1, 2 := 66/64, uint(66%64)
 for word >= len(s.words) { // 條件滿足
  s.words = append(s.words, 0) // 此時s.words = []uint64{2, 0}
 }
 s.words[word] |= 1  bit // s.words[1] |= 1  2
}
// 繼續把66存入后,words數組變為了[]uint64{2, 4}

所以,對于words,每個元素可存儲的值有64個,每超過64個則進位,即添加一個元素。(注意,0也占了一位,所以64才要進位,第一個元素可存儲0-63)。

所以,對于words中的一個元素,要轉換為具體的值時:首先取到其位置i,用 64 * i 作為已進位數(類似于每10位要進位), 然后將這個元素轉換為二進制數,從右往左數,第多少位為1則表示相應的有這個值,用這個位數 x+64 *i 即為我們存入的值。

相應的,可有如下String()函數

// String returns the set as a string of the form "{1 2 3}".
func (s *IntSet) String() string {
 var buf bytes.Buffer
 buf.WriteByte('{')
 for i, word := range s.words {
  if word == 0 {
   continue
  }
  for j := 0; j  bitNum; j++ {
   if word(1uint(j)) != 0 {
    if buf.Len() > len("{") {
     buf.WriteByte(' ')
    }
    fmt.Fprintf(buf, "%d", bitNum*i+j)
   }
  }
 }
 buf.WriteByte('}')
 return buf.String()
}

例如,前面存入了1和66后,轉換過程為:

// []uint64{2 4}
// 對于2: 1  1 = 2; 所以 x = 0 * 64 + 1 
// 對于4: 1  2 = 4; 所以 x = 1 * 64 + 2
// 所以轉換為String為{1 66}

實現比特數組的其他方法函數

func (s *IntSet) Len() int {
	var len int
	for _, word := range s.words {
		for j := 0; j  bitNum; j++ {
			if word(1uint(j)) != 0 {
				len++
			}
		}
	}
	return len
}
func (s *IntSet) Remove(x int) {
	word, bit := x/bitNum, uint(x%bitNum)
	if s.Has(x) {
		s.words[word] ^= 1  bit
	}
}
func (s *IntSet) Clear() {
	s.words = append([]uint{})
}
func (s *IntSet) Copy() *IntSet {
	intSet := IntSet{
		words: []uint{},
	}
	for _, value := range s.words {
		intSet.words = append(intSet.words, value)
	}
	return intSet
}
func (s *IntSet) AddAll(args ...int) {
	for _, x := range args {
		s.Add(x)
	}
}
//A與B的并集,A與B中均出現
func (s *IntSet) IntersectWith(t *IntSet) {
	for i, tword := range t.words {
		if i >= len(s.words) {
			continue
		}
		s.words[i] = tword
	}
}
//A與B的差集,元素出現在A未出現在B
func (s *IntSet) DifferenceWith(t *IntSet) {
	t1 := t.Copy() //為了不改變傳參t,拷貝一份
	t1.IntersectWith(s)
	for i, tword := range t1.words {
		if i  len(s.words) {
			s.words[i] ^= tword
		}
	}
}
//A與B的并差集,元素出現在A沒有出現在B,或出現在B沒有出現在A
func (s *IntSet) SymmetricDifference(t *IntSet) {
	for i, tword := range t.words {
		if i  len(s.words) {
			s.words[i] ^= tword
		} else {
			s.words = append(s.words, tword)
		}
	}
}
//獲取比特數組中的所有元素的slice集合
func (s *IntSet) Elems() []int {
	var elems []int
	for i, word := range s.words {
		for j := 0; j  bitNum; j++ {
			if word(1uint(j)) != 0 {
				elems = append(elems, bitNum*i+j)
			}
		}
	}
	return elems
}

至此,比特數組的常用方法函數都已實現,現在可以來使用它。

func main() {
	var x, y IntSet
	x.Add(1)
	x.Add(144)
	x.Add(9)
	fmt.Println("x:", x.String()) // "{1 9 144}"
	y.Add(9)
	y.Add(42)
	fmt.Println("y:", y.String()) // "{9 42}"
	x.UnionWith(y)
	fmt.Println("x unionWith y:", x.String())         // "{1 9 42 144}"
	fmt.Println("x has 9,123:", x.Has(9), x.Has(123)) // "true false"
	fmt.Println("x len:", x.Len())                    //4
	fmt.Println("y len:", y.Len())                    //2
	x.Remove(42)
	fmt.Println("x after Remove 42:", x.String()) //{1 9 144}
	z := x.Copy()
	fmt.Println("z copy from x:", z.String()) //{1 9 144}
	x.Clear()
	fmt.Println("clear x:", x.String()) //{}
	x.AddAll(1, 2, 9)
	fmt.Println("x addAll 1,2,9:", x.String()) //{1 2 9}
	x.IntersectWith(y)
	fmt.Println("x intersectWith y:", x.String()) //{9}
	x.AddAll(1, 2)
	fmt.Println("x addAll 1,2:", x.String()) //{1 2 9}
	x.DifferenceWith(y)
	fmt.Println("x differenceWith y:", x.String()) //{1 2}
	x.AddAll(9, 144)
	fmt.Println("x addAll 9,144:", x.String()) //{1 2 9 144}
	x.SymmetricDifference(y)
	fmt.Println("x symmetricDifference y:", x.String()) //{1 2 42 144}
	for _, value := range x.Elems() {
		fmt.Print(value, " ") //1 2 42 144
	}
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang 如何實現函數的任意類型傳參
  • 解決Golang time.Parse和time.Format的時區問題
  • Golang 使用Map實現去重與set的功能操作
  • 使用Golang的channel交叉打印兩個數組的操作
  • golang goroutine順序輸出方式
  • golang 在windows中設置環境變量的操作
  • 解決golang在import自己的包報錯的問題
  • golang 通用Contains方法分享

標簽:重慶 蘭州 汕頭 雞西 吐魯番 梅河口 欽州 銅川

巨人網絡通訊聲明:本文標題《Golang中Bit數組的實現方式》,本文關鍵詞  Golang,中,Bit,數組,的,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中Bit數組的實現方式》相關的同類信息!
  • 本頁收集關于Golang中Bit數組的實現方式的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本va欧美va精品发布| 国产精品色婷婷久久58| 青青草原综合久久大伊人精品| 91精品在线一区二区| gogogo免费视频观看亚洲一| 日韩成人精品视频| 一区二区三区高清在线| 中文字幕欧美日本乱码一线二线 | 欧美成人精品3d动漫h| 99久久精品一区| 国产美女精品人人做人人爽| 日韩成人dvd| 亚洲图片欧美综合| 一区二区国产盗摄色噜噜| 国产精品国产自产拍在线| 国产色一区二区| 欧美变态tickling挠脚心| 在线不卡中文字幕播放| 欧美日韩国产高清一区二区 | 亚洲 欧美综合在线网络| 国产精品久久夜| 国产欧美一二三区| 久久久久久久免费视频了| 日韩女优av电影| 亚洲精品一区二区在线观看| 欧美xfplay| 精品久久人人做人人爽| 26uuu国产日韩综合| 日韩欧美高清一区| 日韩手机在线导航| 精品久久一区二区三区| 精品福利一二区| 精品日韩一区二区三区免费视频| 欧美日韩大陆一区二区| 日韩女优电影在线观看| 精品国产网站在线观看| 久久免费午夜影院| 国产精品女主播在线观看| 亚洲人吸女人奶水| 亚洲最大成人网4388xx| 亚洲国产精品一区二区久久| 午夜精品久久久久久久99樱桃| 丝袜a∨在线一区二区三区不卡| 日韩高清电影一区| 韩国女主播一区| 成人av片在线观看| 欧美中文字幕一区| 欧美一区日本一区韩国一区| 久久久高清一区二区三区| 国产精品久久久久aaaa樱花| 亚洲一区二区三区视频在线| 麻豆一区二区三区| 成人国产在线观看| 欧美日韩成人在线一区| 中文字幕av一区二区三区高 | 韩国女主播成人在线| 成人国产精品免费网站| 欧美精品在线一区二区| 国产亚洲一区二区三区| 一区二区三区四区激情| 日本午夜精品视频在线观看| 成人教育av在线| 91精品免费在线观看| 国产精品欧美一区喷水| 日韩电影一区二区三区| 91免费观看国产| 日韩一区二区三免费高清| 亚洲欧洲三级电影| 久久99国产精品麻豆| 91网页版在线| 久久综合999| 日韩国产欧美三级| 色婷婷综合视频在线观看| 久久婷婷成人综合色| 亚洲第一久久影院| 成人国产精品免费观看视频| 欧美成人精精品一区二区频| 亚洲成人免费影院| zzijzzij亚洲日本少妇熟睡| 日韩欧美第一区| 天天做天天摸天天爽国产一区| 不卡的av在线| www国产精品av| 美女任你摸久久| 欧美色爱综合网| 亚洲美女偷拍久久| 成人av午夜电影| 精品久久久久久久久久久久久久久久久 | 亚洲最新视频在线观看| 国产高清在线观看免费不卡| 4hu四虎永久在线影院成人| 亚洲精品国产无天堂网2021| 中文字幕av资源一区| 夜夜爽夜夜爽精品视频| 国产精品久久久久9999吃药| 欧美成人一级视频| 欧美吞精做爰啪啪高潮| 国产精品人妖ts系列视频| 紧缚捆绑精品一区二区| 69堂成人精品免费视频| 亚洲免费电影在线| 色综合久久88色综合天天 | 亚洲成人中文在线| 欧美亚洲综合色| 亚洲色图视频网| 成人av资源站| 中文字幕一区二区三区四区| youjizz久久| 亚洲一线二线三线视频| 欧美在线观看你懂的| 亚洲成人中文在线| 日韩一区二区电影网| 久久99久久精品| 欧美韩日一区二区三区四区| 丁香天五香天堂综合| 亚洲视频在线观看一区| 欧美日韩综合不卡| 奇米综合一区二区三区精品视频 | 国产拍揄自揄精品视频麻豆| 国产夫妻精品视频| 亚洲欧美日韩电影| 欧美日本韩国一区| 国产成人免费网站| 亚洲一区二区综合| 亚洲精品一线二线三线无人区| 成人午夜视频在线| 亚洲成人精品在线观看| 精品欧美乱码久久久久久1区2区| 粉嫩13p一区二区三区| 香蕉影视欧美成人| 久久嫩草精品久久久精品| 色狠狠色噜噜噜综合网| 蜜桃av一区二区三区| 亚洲欧美一区二区久久| 日韩欧美亚洲一区二区| 91福利在线看| 国产精品中文欧美| 午夜视黄欧洲亚洲| 久久久精品2019中文字幕之3| 91传媒视频在线播放| 国产福利不卡视频| 天天色综合天天| 欧美激情一区二区在线| 欧美日韩一区二区三区不卡| 成人美女视频在线观看| 天天色 色综合| 亚洲精品视频观看| 日本一区二区三区在线观看| 日本高清免费不卡视频| 蜜臀精品久久久久久蜜臀| 国产精品入口麻豆九色| 欧美日韩国产首页在线观看| 国产91精品一区二区麻豆网站| 欧美挠脚心视频网站| 不卡视频在线看| 国产很黄免费观看久久| 亚洲欧美一区二区三区国产精品| 亚洲精品在线免费播放| 亚洲男女毛片无遮挡| 激情成人午夜视频| 欧美精选一区二区| 樱花草国产18久久久久| 成人免费在线视频| 从欧美一区二区三区| 欧美性生交片4| 亚洲成人资源网| 色综合久久中文字幕综合网| 日韩影院精彩在线| 国产精品综合在线视频| 欧美视频在线播放| 一级做a爱片久久| 欧美日本一区二区在线观看| 国产一区二区三区四| 青青草97国产精品免费观看 | 视频一区免费在线观看| 国产人成亚洲第一网站在线播放 | 亚洲三级免费电影| 久久蜜臀精品av| 亚洲女女做受ⅹxx高潮| 亚洲丝袜自拍清纯另类| 欧美大胆人体bbbb| 国产成人精品免费看| 在线综合亚洲欧美在线视频| 日韩av在线发布| 国产精品色哟哟| 欧美一区二区国产| 成人激情av网| 中日韩av电影| 久久日韩精品一区二区五区| 欧美视频一区二区三区| 欧美丰满一区二区免费视频| 成人app下载| 色哟哟国产精品| 亚洲精品一区二区在线观看| 国产亚洲精品bt天堂精选| 国产亚洲一区二区三区四区| 精品理论电影在线观看| 欧美精品一区二区三区很污很色的 | 久久精品72免费观看| 日韩av中文字幕一区二区 |