日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
在Golang中如何快速判斷字符串是否在一個(gè)數(shù)組中

[[346073]]

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專(zhuān)注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁(yè)制作,對(duì)塑料袋等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專(zhuān)業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專(zhuān)業(yè)營(yíng)銷(xiāo)推廣優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。

在使用 Python 的時(shí)候,如果要判斷一個(gè)字符串是否在另一個(gè)包含字符串的列表中,可以使用in 關(guān)鍵詞,例如:

 
 
 
 
  1. name_list = ['pm', 'kingname', '青南'] 
  2. if 'kingname' in name_list: 
  3.     print('kingname 在列表里面') 

但是,Golang 是沒(méi)有in這個(gè)關(guān)鍵詞的,所以如果要判斷一個(gè)字符串?dāng)?shù)組中是否包含一個(gè)特定的字符串,就需要一個(gè)一個(gè)對(duì)比:

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5.  
  6. func in(target string, str_array []string) bool { 
  7.      for _, element := range str_array{ 
  8.         if target == element{ 
  9.             return true 
  10.         } 
  11.     } 
  12.     return false 
  13.  
  14. func main(){ 
  15.     name_list := []string{"pm", "kingname", "青南"} 
  16.     target1 := "kingname" 
  17.     target2 := "產(chǎn)品經(jīng)理" 
  18.     result := in(target1, name_list) 
  19.     fmt.Println("kingname 是否在 name_list 中:", result) 
  20.     result = in(target2, name_list) 
  21.     fmt.Println("產(chǎn)品經(jīng)理是否在 name_list 中:", result) 

運(yùn)行效果如下圖所示:

但這種方式有一個(gè)弊端,就是要遍歷整個(gè)字符串?dāng)?shù)組。如果數(shù)組里面有100萬(wàn)條數(shù)據(jù),那么平均要遍歷50萬(wàn)次才能找到。這是一個(gè)非常費(fèi)時(shí)間的操作。

有沒(méi)有什么辦法可以?xún)?yōu)化這個(gè)操作呢?

如果是有序的整型數(shù)組,那么我們可以使用二分查找,把時(shí)間復(fù)雜度O(n)降到對(duì)數(shù)時(shí)間復(fù)雜度。字符串能不能也這樣操作呢?實(shí)際上是可以的。

在 Golang 中,有一個(gè)排序模塊sort,它里面有一個(gè)sort.Strings()函數(shù),可以對(duì)字符串?dāng)?shù)組進(jìn)行排序。同時(shí),還有一個(gè)sort.SearchStrings()[1]函數(shù),會(huì)用二分法在一個(gè)有序字符串?dāng)?shù)組中尋找特定字符串的索引。

結(jié)合兩個(gè)函數(shù),我們可以實(shí)現(xiàn)一個(gè)更高效的算法:

 
 
 
 
  1. package main 
  2.  
  3. import ( 
  4.         "fmt" 
  5.         "sort" 
  6.     ) 
  7.  
  8.  
  9. func in(target string, str_array []string) bool { 
  10.     sort.Strings(str_array) 
  11.     index := sort.SearchStrings(str_array, target) 
  12.     if index < len(str_array) && str_array[index] == target { 
  13.         return true 
  14.     } 
  15.     return false 
  16.  
  17. func main(){ 
  18.     name_list := []string{"pm", "kingname", "青南"} 
  19.     target1 := "kingname" 
  20.     target2 := "產(chǎn)品經(jīng)理" 
  21.     result := in(target1, name_list) 
  22.     fmt.Println("kingname 是否在 name_list 中:", result) 
  23.     result = in(target2, name_list) 
  24.     fmt.Println("產(chǎn)品經(jīng)理是否在 name_list 中:", result) 

運(yùn)行效果如下圖所示:

其中,sort.Strings是一個(gè) in-place 的修改方式,是直接修改的 str_array。修改以后str_array變成有序的字符串?dāng)?shù)組。接下來(lái)通過(guò)二分查找快速定位。如果找到了,那么返回目標(biāo)字符串在排序后的列表中第一次出現(xiàn)的索引。如果沒(méi)有找到,那么返回?cái)?shù)組中最后一個(gè)元素的索引。所以只要 index 小于最后一個(gè)元素的索引,那么目標(biāo)字符串肯定存在;如果等于最后一個(gè)元素的索引,但是值不等于最后一個(gè)元素,那么目標(biāo)字符串就不存在于字符串?dāng)?shù)組中。

通過(guò)先排序再查詢(xún)的方式,對(duì)于100萬(wàn)個(gè)元素的字符串?dāng)?shù)組,只需要查詢(xún)20次左右就能確認(rèn)字符串是否存在。速度大大提升。

最后考大家一個(gè)思考題。name_list一開(kāi)始是亂序的字符串?dāng)?shù)組,在上圖第23行,如果打印一下 name_list,打印出來(lái)的是經(jīng)過(guò)排序的,還是沒(méi)有經(jīng)過(guò)排序的字符串?dāng)?shù)字?

 


網(wǎng)站名稱(chēng):在Golang中如何快速判斷字符串是否在一個(gè)數(shù)組中
文章鏈接:http://www.5511xx.com/article/cdcoecs.html