【问题标题】:KDB: In-place delete from dictionaryKDB:从字典中就地删除
【发布时间】:2017-10-21 16:47:16
【问题描述】:

要将元素插入到字典中,我会这样做

q) d[`x]:12345

这修改了现有的字典,操作成本接近O(1)O(log N),具体取决于底层实现(哈希表或树)(我其实不知道)。

但是,要删除我必须使用的密钥:

q) d:(enlist `x) _ d

这至少是O(N),因为它复制了完整的字典而不删除O(N) 中的项目,然后由于指针而分配给O(1) 中的d

这看起来像删除操作歧视!也许就地删除记录不充分,但存在于某个地方?

【问题讨论】:

    标签: dictionary kdb


    【解决方案1】:

    另外两个选项包括apply

    .[`d;();_;`x]
    

    functional delete

    ![`d;();0b;enlist`x]
    

    如果您想一次性删除多个键,最后一种形式很有用。例如,

    ![`d;();0b;`x`y]
    

    【讨论】:

    • 谢谢,关于如何实现嵌套字典的多个就地删除有什么建议吗?大[a;b]:3; large[a] _: b / 只删除一个,我需要删除很多
    • 如果您的嵌套字典将符号映射到通用值,您应该能够使用删除模板或功能删除。我将更新答案以避免 cmets 中的字符限制。
    • 你试过![`large.a;();0b;`b`c]吗?
    【解决方案2】:

    两种方式:

    d _:`x

    delete x from `d

    【讨论】:

      【解决方案3】:

      四种表单支持就地删除

      Drop through assignment 允许您将单键“放置”到位。

      q)show d:`a`b`c`x!(1;2 3;4;5)
      a| 1
      b| 2 3
      c| 4
      x| 5
      q)d _: `x
      q)d
      a| 1
      b| 2 3
      c| 4
      

      Apply 将允许您参数化密钥

      q)show d:`a`b`c`x!(1;2 3;4;5)
      a| 1
      b| 2 3
      c| 4
      x| 5
      q).[`d;();_;`x]
      q)d
      a| 1
      b| 2 3
      c| 4
      

      delete 与所有 Q-SQL 模板一样,同样支持通过引用调用“就地”,并且还允许您删除多个键

      q)show d:`a`b`c`x!(1;2 3;4;5)
      a| 1
      b| 2 3
      c| 4
      x| 5
      q)delete x,b from `d
      `d
      q)d
      a| 1
      c| 4
      

      Functional delete 支持多个键,并允许您对键进行参数化。 (使用parse查看Q-SQL模板的功能形式。)

      q)show d:`a`b`c`x!(1;2 3;4;5)
      a| 1
      b| 2 3
      c| 4
      x| 5
      q)parse "delete x,b from d"
      !
      `d
      ()
      0b
      ,`x`b
      q)![`d;();0b;`x`b]
      `d
      q)d
      a| 1
      c| 4
      

      以上链接指向 kdb+ 文档站点 code.kx.com

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 2022-12-22
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 2019-09-26
        相关资源
        最近更新 更多