【问题标题】:Moving element in a dictionary consisting of element:position pairs在由 element:position 对组成的字典中移动元素
【发布时间】:2013-11-02 18:31:48
【问题描述】:

我有一本这样的字典:{a:0, b:1, c:2}。实际上,字段名称和它在表中的顺序。我需要采用这种结构,以便(例如)如果 b 的位置变为 0,则结​​果为{b:0, a:1, c:2}。如果 b 的位置变为 2 则结果必须是 {a:0, c:1, b:2} 等等...

如何做到这一点?我不能使用内置函数(如果有的话),因为该字典中的每个字段都取自更复杂的结构。我基本上只能遍历这个字典,排序与否,改变位置值。

我使用 Javascript/Coffeescript,但这没关系 - 我会欣赏任何语言的想法。

【问题讨论】:

  • 因此,如果您有 k 条目,那么您将只有从 0k-1 的值?
  • 是的。最好。无论如何,我可以按索引对结构进行排序,然后遍历它并将 i++ 应用为位置,以便 1,2,5 变为 0,1,2(例如)。但如果这可以在第一次(也是唯一一次)迭代期间完成,那就更好了。
  • k 的数量级是多少?该函数需要多久调用一次?

标签: javascript algorithm sorting data-structures dictionary


【解决方案1】:

这是一个不会遍历地图中所有元素的解决方案。
这很复杂,我认为它对小型数据集的速度并没有太大的提高。
抱歉,这不是正确的 javascript:

add = function(dict, vector, k)
{
    var size=len(vector);
    vector[size]=k;
    dict[k]=size;
}
swap(dict, vector, name, newOrder)
{   
    var oldOrder = dict[name]
    if(oldOrder < newOrder)
    {
        for(var i=oldOrder+1; i<=newOrder; i++)
        {  dict[vector[i]]--;
           vector[i-1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
    else
    {
        for(var i=oldOrder-1; i>=newOrder; i--)
        {  dict[vector[i]]++;
           vector[i+1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
}

解释:

add = function(dict, vector, k)
{
    var size=len(vector);
    vector[size]=k;
    dict[k]=size;
}
// vector: 0a 1b 2c 3d 4e
// map: a0 b1 c2 d3 e4

swap(dict, vector, name, newOrder)
{   
    // newOrder = 4

    var oldOrder = dict[name]
    // oldOrder = 1

    if(oldOrder < newOrder)
    {   
        // goes here
        for(var i=oldOrder+1; i<=newOrder; i++)
        {  
           // map: a0 b1 c2 d3 e4
           dict[vector[i]]--;
           // map: a0 b1 c1 d3 e4 //after one iteration

           // vector: 0a 1b 2c 3d 4e
           vector[i-1]=vector[i];
           // vector: 0a 1c 2c 3d 4e //after one iteration

        }
        // map: a0 b1 c1 d2 e3             
     // vector: 0a 1c 2d 3e 4e

        dict[name]=newOrder;
        vector[newOrder]=dict[name]

        // map: a0 b4 c1 d2 e3             
     // vector: 0a 1c 2d 3e 4b
    }
    else
    {
        for(var i=oldOrder-1; i>=newOrder; i--)
        {  dict[vector[i]]++;
           vector[i+1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
}

【讨论】:

    【解决方案2】:

    考虑需要发生什么:如果将某个值从 n 阶移动到 n' 阶,则实际上只有 n 阶和 n' 阶之间的值的顺序会发生变化。如果 n > n',它们向下移动 1,如果 n

    function(dict, name, newOrder)
    {
        var oldOrder = dict[name];
        foreach((k, order) in dict)
        {
            if(order > oldOrder && order <= newOrder)
                dict[k]--;
            else if(order >= newOrder && order < oldOrder)
                dict[k]++;
        }
        dict[name] = newOrder;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多