想模拟按时间顺序执行的任务队列该用啥数据结构? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
LeeReamond
V2EX    程序员

想模拟按时间顺序执行的任务队列该用啥数据结构?

  •  
  •   LeeReamond 2024-04-07 13:35:05 +08:00 1695 次点击
    这是一个创建于 555 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近自走棋游戏挺有意思的,想自己模拟个自走棋游戏的后端,大概就是需要不同棋子按照时间顺序依次执行各自的任务,然后各自的任务执行结果又会影响任务队列本身这样。

    想了想,大概需要维护一个类似于时间循环的东西,需求大概是:

    1. 维护一个顺序队列
    2. 要能弹出任务,时间复杂度最好是 O(1)
    3. 要能插入新任务,复杂度不超过 O(logN)
    4. 要能修改已存在的任务

    不知道该用啥数据结构,有没有大佬提提意见。如果用各种树的话,感觉平衡树不太适合任务队列?任务队列需要频繁删除栈底,用树感觉很亏。如果单纯是一个数组然后用类似快排的思路实现插入和修改(先查找再插入),感觉也是效率很低。一时想不到啥合适的,学艺不精了属于是

    8 条回复    2024-04-08 10:12:05 +08:00
    pengdachxx
        1
    pengdachxx  
       2024-04-07 13:38:41 +08:00
    修改不好搞,可以研究下延时队列或者优先队列
    Maboroshii
        2
    Maboroshii  
       2024-04-07 13:40:24 +08:00
    维护的任务数量不多,每次插入用冒泡排序都可以实现需求。 (认真点,谷歌搜时间轮)
    LeeReamond
        3
    LeeReamond  
    OP
       2024-04-07 13:43:12 +08:00
    @Maboroshii 确实不多,自走棋游戏首先都会限制棋子上限,任务的数量级靠硬怼也能搞。只是我是想后面有没有可能跑大量测试和数据分析,所以性能上想尽量基线做高点
    mezi04
        4
    mezi04  
       2024-04-07 17:41:48 +08:00
    Java 有 DelayQueue ,不知道 op 用的啥开发语言
    sketcherly
        5
    sketcherly  
       2024-04-08 00:01:09 +08:00 via Android
    b+tree ?没细琢磨,感觉上 叶子节点可以作为作为队列,本身又是树适合写操作
    tiandishi
        6
    tiandishi  
       2024-04-08 04:45:23 +08:00
    双向链表扩展一下:

    跳表
    xichuhanguguan
        7
    xichuhanguguan  
       2024-04-08 09:43:00 +08:00
    时间轮算法,可以找找你使用语言的包试试看
    MoYi123
        8
    MoYi123  
       2024-04-08 10:12:05 +08:00
    带懒删除的 fib heap
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4330 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 10:13 PVG 18:13 LAX 03:13 JFK 06:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86