V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mengzhuo
V2EX  ›  问与答

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

  •  
  •   mengzhuo · 2015-01-22 09:46:05 +08:00 · 2088 次点击
    这是一个创建于 3595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如下图:

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

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

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

    10 条回复    2015-01-22 13:52:20 +08:00
    aheadlead
        1
    aheadlead  
       2015-01-22 10:32:28 +08:00 via iPhone
    为啥client 1和2会同时住俩房间..
    mengzhuo
        2
    mengzhuo  
    OP
       2015-01-22 11:03:49 +08:00
    @aheadlead

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

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

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

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

    ╮(╯▽╰)╭
    都是空间换时间啊
    hanwujibaby
        10
    hanwujibaby  
       2015-01-22 13:52:20 +08:00
    @aheadlead 可以的。其实我觉得没有必要用red-black tree ,用skipList或者binary search tree 都可以,在复杂度上 比list快。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.