bd201d6fd8a288e9ed8664ad0178b042.png

摄影:产品经理 继续跟产品经理吃大餐
in
name_list = ['pm', 'kingname', '青南']
if 'kingname' in name_list:
    print('kingname 在列表里面')
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{"pm", "kingname", "青南"}
    target1 := "kingname"
    target2 := "产品经理"
    result := in(target1, name_list)
    fmt.Println("kingname 是否在 name_list 中:", result)
    result = in(target2, name_list)
    fmt.Println("产品经理是否在 name_list 中:", result)
}

运行效果如下图所示:

4cb4ecbc7e4c4b98a2947a76eecfb33e.png

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

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

O(n)
sortsort.Strings()

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

package main

import (
        "fmt"
        "sort"
    )


func in(target string, str_array []string) bool {
    sort.Strings(str_array)
    index := sort.SearchStrings(str_array, target)
    if index len(str_array) && str_array[index] == target {
        return true
    }
    return false
}

func main(){
    name_list := []string{"pm", "kingname", "青南"}
    target1 := "kingname"
    target2 := "产品经理"
    result := in(target1, name_list)
    fmt.Println("kingname 是否在 name_list 中:", result)
    result = in(target2, name_list)
    fmt.Println("产品经理是否在 name_list 中:", result)
}

运行效果如下图所示:

42e8aec6bed357d5ff191fe10cfaefd1.png
sort.Stringsstr_arraystr_array

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

name_listname_list

参考资料

[1]
sort.SearchStrings()

256007e5f1b8195be08557eb17f68eac.gif