mengzhuo
V2EX  ›  问与答

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

  •  
  •   mengzhuo · Jan 22, 2015 · 2443 views
    This topic created in 4128 days ago, the information mentioned may be changed or developed.

    例如下图:

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

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

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

    10 replies    2015-01-22 13:52:20 +08:00
    aheadlead
        1
    aheadlead  
       Jan 22, 2015 via iPhone
    为啥client 1和2会同时住俩房间..
    mengzhuo
        2
    mengzhuo  
    OP
       Jan 22, 2015
    @aheadlead

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

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

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

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

    ╮(╯▽╰)╭
    都是空间换时间啊
    hanwujibaby
        10
    hanwujibaby  
       Jan 22, 2015
    @aheadlead 可以的。其实我觉得没有必要用red-black tree ,用skipList或者binary search tree 都可以,在复杂度上 比list快。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4868 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 10:04 · PVG 18:04 · LAX 03:04 · JFK 06:04
    ♥ Do have faith in what you're doing.