Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang快速判断字符串是否在一个数组中

Golang实现快速判断字符串是否在一个数组中方式

作者:好易学·数据结构

这篇文章主要介绍了Golang实现快速判断字符串是否在一个数组中方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Golang快速判断字符串是否在一个数组中

在使用 Python 的时候,如果要判断一个字符串是否在另一个包含字符串的列表中,可以使用in 关键词,

例如

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

但是,Golang 是没有in这个关键词的,所以如果要判断一个字符串数组中是否包含一个特定的字符串,

就需要一个一个对比:

package main

import "fmt"

func in(target string, str_array []string) bool {
	for _, element := range str_array{
		if target == element{
			return true
		}
	}
	return false
}

func main(){
	name_list := []string{"Go", "Golang", "Gin框架"}
	target1 := "Gin框架"
	result := in(target1, name_list)
	fmt.Println("Gin框架 是否在 name_list 中:", result)
}

但这种方式有一个弊端,就是要遍历整个字符串数组。如果数组里面有100万条数据,那么平均要遍历50万次才能找到。这是一个非常费时间的操作。

有没有什么办法可以优化这个操作呢?

如果是有序的整型数组,那么我们可以使用二分查找,把时间复杂度O(n)降到对数时间复杂度。字符串能不能也这样操作呢?

实际上是可以的。

Golang 中,有一个排序模块sort,它里面有一个sort.Strings()函数,可以对字符串数组进行排序。同时,还有一个sort.SearchStrings()函数会用二分法在一个有序字符串数组中寻找特定字符串的索引

结合两个函数,我们可以实现一个更高效的算法:

package main

import (
	"fmt"
	"sort"
)

func in(target string, str_array []string) bool {
	sort.Strings(str_array)
	index := sort.SearchStrings(str_array, target)
	//index的取值:[0,len(str_array)]
	if index < len(str_array) && str_array[index] == target { //需要注意此处的判断,先判断 &&左侧的条件,如果不满足则结束此处判断,不会再进行右侧的判断
		return true
	}
	return false
}

func main(){
	name_list := []string{"Go", "Golang", "Gin框架"}
	target1 := "Gin框架"
	result := in(target1, name_list)
	fmt.Println("Gin框架 是否在 name_list 中:", result)
}

其中,sort.Strings是直接修改的 str_array。修改以后str_array变成有序的字符串数组。接下来通过二分查找快速定位。

如果找到了,那么返回目标字符串在排序后的列表中第一次出现的索引。

如果没有找到,那么返回数组中最后一个元素的索引。所以只要 index 小于最后一个元素的索引,那么目标字符串肯定存在;如果等于最后一个元素的索引,但是值不等于最后一个元素,那么目标字符串就不存在于字符串数组中。

通过先排序再查询的方式,对于100万个元素的字符串数组,只需要查询20次左右就能确认字符串是否存在。速度大大提升。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文