面试题:设计具备 putAll 功能的哈希表,时间复杂度限定 O(1)

Go语言精选

共 1180字,需浏览 3分钟

 ·

2020-08-18 00:15


【题目】

  哈希表常见的三个操作是 put、get 和 containsKey ,而且这三个操作的时间复杂度为 O(1)。现在想加一个 putAll 功能,就是把所有的 keyvalue 值都设成统一的值。请使用 Golang 设计并实现这种有 putAll 功能的哈希表,并且 putget、和 putAll 操作的时间复杂度都为 O(1) 。

【基本思路】

  加入版本号字段 Version

  1、把每一个记录的版本号都 + 1,标记每条记录建立的顺序;

  2、设置一个 putAll 记录在之前 put 的操作之上版本号再 +1,以标记 putAll 记录何时建立;

  3、查询记录时,如果某条记录的版本号小于 putAll 记录的版本,说明 putAll 是最新数据,返回 putAll 记录的值。如果某条记录的版本号大于 putAll 记录的版本,说明该记录的值是最新数据,返回该条记录的值。

* golang 代码实现 *

  1. package main


  2. import "fmt"


  3. type PutAllValue struct {

  4. Value string

  5. Version int

  6. }


  7. func (p *PutAllValue) GetValue() string {

  8. return p.Value

  9. }


  10. func (p *PutAllValue) GetVersion() int {

  11. return p.Version

  12. }


  13. type MyMap struct {

  14. Version int

  15. Mp map[string]*PutAllValue

  16. }



  17. func (m *MyMap) Put(key, value string) {

  18. p := &PutAllValue{}

  19. p.Value = value

  20. m.Version += 1

  21. m.Mp[key] = p

  22. }

  23. var pForPutAll = &PutAllValue{}


  24. func (m *MyMap) PutAll(value string) {


  25. pForPutAll.Value = value

  26. m.Version += 1

  27. // 关键操作,要共享版本号的值

  28. pForPutAll.Version = m.Version


  29. }


  30. func (m *MyMap) Get(key string) string {

  31. if v, ok := m.Mp[key]; ok {

  32. if v.GetVersion() < pForPutAll.GetVersion() {

  33. return pForPutAll.GetValue()

  34. }else {

  35. return v.GetValue()

  36. }

  37. }else {

  38. return ""

  39. }

  40. }


  41. func main() {

  42. tmpM := make(map[string]*PutAllValue)

  43. mm := &MyMap{0,tmpM}


  44. mm.Put("1","a")

  45. mm.Put("2","b")

  46. mm.Put("3","c")

  47. res := mm.Get("2")

  48. fmt.Println(res)


  49. // Put all the key as 'd'

  50. mm.PutAll("d")


  51. afterRes := mm.Get("1")

  52. fmt.Println(afterRes)

  53. res2 := mm.Get("2")

  54. fmt.Println(res2)

  55. fmt.Println("All the key's value set as 'd' ")

  56. }

可以看到在 O(1) 的时间复杂度内可以做到 putAll 的操作。

以上。






推荐阅读



学习交流 Go 语言,扫码回复「进群」即可


站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验


Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注


浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报