Inverted Table Index Of R←X(8⌶)Y
This function computes X
index-of Y
(viz. X⍳Y
) where X
and Y
are compatible inverted tables. R
is the indices of Y
in X
.
An inverted table is a (nested) vector all of whose items have the same number of major cells. That is, 1=⍴⍴⍵
and (≢⊃⍵)=≢¨⍵
. An inverted table representation of relational data is more efficient in time and space than other representations.
The following is an example of an inverted table:
X←(10 3⍴⎕a) (⍳10) 'metalepsis'
X
┌───┬───────────────────┬──────────┐
│ABC│0 1 2 3 4 5 6 7 8 9│metalepsis│
│DEF│ │ │
│GHI│ │ │
│JKL│ │ │
│MNO│ │ │
│PQR│ │ │
│STU│ │ │
│VWX│ │ │
│YZA│ │ │
│BCD│ │ │
└───┴───────────────────┴──────────┘
Using inverted tables, it is often necessary to perform a table look-up to find the "row" indices of one in another. Suppose there is a second table Y
:
Y←(⊂⊂3 1 4 1 5 9)⌷¨X
Y
GHI 3 1 4 1 5 9 tmamli
ABC
JKL
ABC
MNO
YZA
To compute the indices of Y
in X
using dyadic ⍳
, it is necessary to first un-invert each of the tables in order to create nested matrices that ⍳
can handle.
unvert ← {⍉↑⊂⍤¯1¨⍵}
unvert X
┌───┬─┬─┐
│ABC│0│m│
├───┼─┼─┤
│DEF│1│e│
├───┼─┼─┤
│GHI│2│t│
├───┼─┼─┤
│JKL│3│a│
├───┼─┼─┤
│MNO│4│l│
├───┼─┼─┤
│PQR│5│e│
├───┼─┼─┤
│STU│6│p│
├───┼─┼─┤
│VWX│7│s│
├───┼─┼─┤
│YZA│8│i│
├───┼─┼─┤
│BCD│9│s│
└───┴─┴─┘
(unvert X) ⍳ (unvert Y)
3 1 4 1 5 9
Each un-inverted table requires considerably more workspace than its inverted form, so if the inverted tables are large, this operation is potentially expensive in terms of both time and workspace.
8⌶
is an optimised version of the above expression.
X (8⌶) Y
3 1 4 1 5 9