V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  程序员

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

  •  
  •   LeeReamond · 233 天前 · 1284 次点击
    这是一个创建于 233 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    跳表
    xichuhanguguan
        7
    xichuhanguguan  
       232 天前
    时间轮算法,可以找找你使用语言的包试试看
    MoYi123
        8
    MoYi123  
       232 天前
    带懒删除的 fib heap
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5463 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:47 · PVG 14:47 · LAX 22:47 · JFK 01:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.