数组 – 在Golang中的Integer范围的映射中查找

数组 – 在Golang中的Integer范围的映射中查找,第1张

概述我想解决的问题可以这样表达:我想在整数范围的hashmap中查找Integer. 0-4: dog,5-8: cat,9-18: bird,19-21: dog,22-22: bird,... 哪里: lookup(3) -> doglookup(10) -> bird 但是,将此问题视为散列图可能不是正确的方法. 我正在使用~140,000个范围,属于~200个可能类别中的一个. 知 我想解决的问题可以这样表达:我想在整数范围的hashmap中查找Integer.
0-4: dog,5-8: cat,9-18: bird,19-21: dog,22-22: bird,...

哪里:

lookup(3) -> doglookup(10) -> bird

但是,将此问题视为散列图可能不是正确的方法.
我正在使用~140,000个范围,属于~200个可能类别中的一个.

知道怎么在Golang做这个吗?或者通过哪条跟踪来达到合理的解决方案(~O(log(n)?)?更一般地描述这个问题的方法是什么?

谢谢你的帮助 !

如果范围是不连续的(即具体数字只能属于一个范围),则可以使用二进制搜索找到范围.这是O(log(n))的复杂性.

如果范围是连续的,那么仅使用一个数字来“建模”一个范围就足够了,无论是开始还是结束.这也适用于您的情况.

我们可以按顺序列出int切片中的范围边界,并且我们可以在此排序切片中执行二进制搜索.我们用最大值对范围进行建模,因为范围序列没有任何孔.这将为我们提供范围的索引.我们可以将名称存储在单独的切片中,并在我们刚刚找到的索引处返回名称作为二进制搜索的结果.

这是一个令人惊讶的简短实现,一个单行功能:

var ranges = []int{-1,4,8,18,21,22}var names = []string{"","dog","cat","bird",""}func getname(n int) string {    return names[sort.SearchInts(ranges,n)]}

测试它:

nums := []int{-1,3,6,10,20,22,100}for _,n := range nums {    if name := getname(n); name == "" {        fmt.Printf("InvalID number: %4d\n",n)    } else {        fmt.Printf("Number        : %4d,name: %s\n",n,name)    }}

输出(在Go Playground上试试):

InvalID number:   -1Number        :    3,name: dogNumber        :    6,name: catNumber        :   10,name: birdNumber        :   20,name: dogNumber        :   22,name: birdInvalID number:  100

注意:此解决方案也用于Code Review StackExchange站点上的类似问题:Classifying by age

处理非连续范围

如果范围不会覆盖每个数字(意味着范围之间有“漏洞”),那么您可以通过将孔添加为“虚拟”范围来轻松处理,并为它们提供空字符串“”名称(我们用于无效范围) ).就这样.

例如,让我们将原始问题修改为:

0-4: dog,9-15: bird,

如你所见,9-15之间有一个“洞”:鸟和19-21:狗.范围16-17无效.这是你如何映射这个:

var ranges = []int{-1,15,"",""}

对于15到18之间的范围,有一个空的“”名称.测试它:

nums := []int{15,16,19}for _,name)    }}

输出(在Go Playground上尝试此变体):

Number        :   15,name: birdInvalID number:   16Number        :   19,name: dog
总结

以上是内存溢出为你收集整理的数组 – 在Golang中的Integer范围的映射中查找全部内容,希望文章能够帮你解决数组 – 在Golang中的Integer范围的映射中查找所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1293771.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-10
下一篇2022-06-10

发表评论

登录后才能评论

评论列表(0条)

    保存