求数据结构思路,能快速查找房间内的人,或者按人查找房间

2015-01-22 09:46:05 +08:00
 mengzhuo

例如下图:

+--+- Room:A       
   |    +          
   |    +- Client:1
   |    +- Client:2
   |    +- Client:3
   |               
   +- Room:B       
   |    +          
   |    +- Client:1
   |    +- Client:2
   |               
   |               
   +- Room:C

现在我的实现是:
维护Room的哈希表,再维护一张Client所在房间的哈希表,当CRUD发生时,操作两个哈希表(当然是带锁的)

粗略地看过locate的实现,但是没看懂里面的frcode编码(资料实在是太少了,我看C有些吃力)

2035 次点击
所在节点    问与答
10 条回复
aheadlead
2015-01-22 10:32:28 +08:00
为啥client 1和2会同时住俩房间..
mengzhuo
2015-01-22 11:03:49 +08:00
@aheadlead

因为这个是个类似聊天室的程序
Client1/2 都在RoomB 里
comanboy
2015-01-22 11:10:12 +08:00
這裡的Client1/2 是代表每個房間不同的人,而不是固定的一個人,對吧!
hanwujibaby
2015-01-22 11:16:46 +08:00
这个hash+list应该可以实现吧,room添加client的时候,同时维护一个room和client的hash,同时维护对hash对应的list,这样查找和删除room的client的时候,复杂度只是list的O(n)
mengzhuo
2015-01-22 11:22:41 +08:00
@comanboy

是指 Client 1 和 Client 2 这两个固定的人

看主贴里的图,Client可以属于任何一个Room
类似于SQL 里的 N-M 对应问题
aheadlead
2015-01-22 11:28:49 +08:00
@hanwujibaby map+map似乎也不错...(红黑🌲套红黑🌲)
tabris17
2015-01-22 11:32:21 +08:00
Room的数量一般都是固定或者可预见的吧,用数组即可啊
jsq2627
2015-01-22 12:23:07 +08:00
不知楼主有没有用数据库呢?这是一个多对多关系,除了Persom表和Room表,你还得维护一个关联表 PersonRoom。在不担心性能问题的情况下要用外键约束好关系。
如果楼主没有用数据库,简单点的话,把上面三个表对应成三个哈希表,查询的逻辑还是一样。
mengzhuo
2015-01-22 12:58:13 +08:00
@jsq2627

不用数据库, 全部数据扔内存里
为啥是3张表???

╮(╯▽╰)╭
都是空间换时间啊
hanwujibaby
2015-01-22 13:52:20 +08:00
@aheadlead 可以的。其实我觉得没有必要用red-black tree ,用skipList或者binary search tree 都可以,在复杂度上 比list快。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/164367

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX