Q语言 - 属性

表的列表,词典或列可以应用属性.属性在列表中强加某些属性.某些属性可能会在修改时消失.

属性类型

已排序(`s#)

s#表示列表按升序排序.如果列表由asc(或xasc)显式排序,则列表将自动设置已排序的属性.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

已知的清单要排序也可以明确设置属性. Q 将检查列表是否已排序,如果不是,则会抛出 s-fail 错误.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

排序的属性将在未排序的附加时丢失.

Parted(`p#)

`p#表示列表分开并且相同的项目是连续存储的.

范围是 int 时态类型具有基础int值,例如如果枚举了符号,您也可以对符号进行分区.

应用parted属性会创建一个索引字典,将每个唯一的输出值映射到其位置.第一次出现.当列表被分开时,查找速度要快得多,因为线性搜索被哈希表查找替换.

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

注意 :  

  • parted属性不会保留在列表上的操作下,即使
    操作会保留分区.

  • 当实体数量达到十亿且大多数分区具有相当大的重量时,应考虑parted属性,即重复次数很多.

分组(`g#)

`g#表示列表已分组.构建和维护内部字典,将每个唯一项映射到其每个索引,这需要相当大的存储空间.对于包含 u 大小 s 的唯一项目的长度 L 的列表,这将是(L×4)+(u× s) bytes.

当没有关于其结构的其他假设时,可以将分组应用于列表.

属性可以应用于任何类型的列表.它保留在追加上,但在删除时丢失.

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

唯一(`#u)

应用唯一属性(列表中的"u#"表示列表中的项目是不同的.知道列表的元素是唯一的,可以大大加快不同并允许 q 提前执行一些比较.

列表时标记为唯一,为列表中的每个项创建内部哈希映射.列表上的操作必须保持唯一性或属性丢失.

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

注意和减号;

  • `u#保留在连接上,保留了唯一性.它在删除和非唯一连接时丢失.

  • 搜索`u#列表是通过哈希函数完成的.

删除属性

可以通过应用`#.


删除属性

应用属性

应用属性的三种格式是 :

  • L: `s#14 2 3 3 9 /在列表创建期间指定

  • @ [`.; `L; `s#] /功能适用,即到变量列表L

    /在默认命名空间中(即`.)apply

    /排序的`s#属性

  • 从'tab 更新`s#time

    <p style ="padding-left:28% ;>>/更新表格(标签)以应用

    /attribute.

让我们将上述三种不同的格式应用于示例.

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
上面我们可以看到元表结果中的属性列显示了时间列的排序(`s#).