Go中的查找表?

时间:2014-03-17 18:39:38

标签: go lookup lookup-tables

这是在Go中实现查找表的合适方法吗?有没有更好的方法?如果条目恰好是非连续的,我希望这样做。

func LookupRpMax(val uint8) float64 {
    rpMaxRegisters := map[uint8]float64 {
        0x00 : 3926991,
        0x01 : 3141593,
        0x02 : 2243995,
        0x03 : 1745329,
        0x04 : 1308997,
        0x05 : 981748,
        0x06 : 747998,
        0x07 : 581776,
        0x08 : 436332,
        0x09 : 349066,
        0x0A : 249333,
        0x0B : 193926,
        0x0C : 145444,
        0x0D : 109083,
        0x0E : 83111,
        0x0F : 64642,
        0x10 : 48481,
        0x11 : 38785,
        0x12 : 27704,
        0x13 : 21547,
        0x14 : 16160,
        0x15 : 12120,
        0x16 : 9235,
        0x17 : 7182,
        0x18 : 5387,
        0x19 : 4309,
        0x1A : 3078,
        0x1B : 2394,
        0x1C : 1796,
        0x1D : 1347,
        0x1E : 1026,
        0x1F : 798,
    }
    return rpMaxRegisters[val];

}

1 个答案:

答案 0 :(得分:1)

如果您愿意,可以使用平面切片 - 那么对于没有条目的条目,您只需要null / 0。如果您的非连续值可以达到非常高的值,那么这种方法会很糟糕。

使用此代码:http://play.golang.org/p/gLni-BzMKy

在切片和地图上运行100,000,000个索引后,我得到了这些结果: 地图:3062 ms切片:56 ms

话虽如此 - 在几乎任何现实世界的用例中,速度差异都无关紧要。我个人会使用地图。

编辑:我同意其他评论说要在函数外部初始化地图,所以它只需要构建一次而不是每次调用。