索引O(log(n))删除或更好的对象集合

时间:2016-08-03 16:59:51

标签: javascript collections lookup-tables

我想存储一组javascript对象。

每个对象代表一个时间,以及与该时间相关的一组属性。例如,这可能是一个计划任务 - 一个任务执行的时间。

我的问题是,在下面的代码中,Scheduler.remove(scheduledTask)的数据结构和算法是一个不错的选择:

var Scheduler = function()
{
    this.sheduledTasks = [];
}
Scheduler.prototype.add = function(scheduledTask)
{
    // adds scheduled task, maintaining their order by time. for sake of argument, it could be as simple as this:
    this.scheduledTasks.push(scheduledTask);
    this.scheduledTasks.sort(function(a, b) {
        return a.time - b.time;
    });        
}
Scheduler.prototype.getNext = function()
{
    // returns the scheduledTask with lowest time value
    return this.scheduledTasks[0];
}
Scheduler.prototype.remove = function(scheduledTask)
{
    // usually called after this.getNext() to remove a handled Task,
    // but is not necessarily used to remove a ScheduledTask with the 
    // lowest time value
}


/**
 * ScheduledTask
 * @param {number} time 
 * @param {Task} task
 */
var ScheduledTask = function(time, task){
    this.time = time;
    this.task = task;
}

var Task = function(/*...*/){
   // ...
}

如果要移除scheduler.remove(scheduledTask),该如何实施:

  1. 特定ScheduledTask的实例
  2. 在特定时间具有特定Task实例的ScheduledTask的所有实例
  3. 第一个问题:对于上面的1和2,它必须维护对象标识到数组索引的映射,因此可以在给定对象的标识的情况下查找索引。

    第二个问题:对于上面的2,它需要在给定时间内查找索引。但由于时间是一个浮点,错误可能会蔓延,意味着查找所需的精确值会导致找到错误的(或没有)条目。

    如何处理以上问题?

    要解决第一个问题,可以为每个新对象分配一个ID,该ID可用于查找它们。有没有一种方法可以让javascript本机化,或者这是否必须自己实现?

    但如何解决第二个问题?

0 个答案:

没有答案