Sparse Data Patterns
Sparse Lookup
Searching Stored Keys
A sparse lookup scans stored keys and returns zero when the requested key is absent.
Program
Play the program to query a present or missing sparse key.
sparse_lookup.f90
Replay: real traced execution (multi-file project)
program sparse_lookup_demo
implicit none
integer :: keys(3)
integer :: values(3)
integer :: query_key
integer :: i
integer :: result
keys = [10, 20, 30]
values = [5, 8, 13]
query_key = 20
result = 0
do i = 1, 3
if (keys(i) == query_key) result = values(i)
end do
print '(I0, 1X, I0)', query_key, result
end program sparse_lookup_demo
program sparse_lookup_demo
implicit none
integer :: keys(3)
integer :: values(3)
integer :: query_key
integer :: i
integer :: result
keys = [10, 20, 30]
values = [5, 8, 13]
query_key = 30
result = 0
do i = 1, 3
if (keys(i) == query_key) result = values(i)
end do
print '(I0, 1X, I0)', query_key, result
end program sparse_lookup_demo
program sparse_lookup_demo
implicit none
integer :: keys(3)
integer :: values(3)
integer :: query_key
integer :: i
integer :: result
keys = [10, 20, 30]
values = [5, 8, 13]
query_key = 40
result = 0
do i = 1, 3
if (keys(i) == query_key) result = values(i)
end do
print '(I0, 1X, I0)', query_key, result
end program sparse_lookup_demo
keys ← [10, 20, 30]
9keys = [10, 20, 30]10values = [5, 8, 13]values this step[10, 20, 30]keysvalues ← [5, 8, 13]
9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 20values this step[5, 8, 13]valuesquery_key ← 20
10values = [5, 8, 13]11query_key = 2012result = 0values this step20query_keyresult ← 0
11query_key = 2012result = 013do i = 1, 3values this step0resulti ← 1
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step1iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(1) == query_keyi ← 2
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step2iresult ← 8
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step8result.true.keys(2) == query_keyi ← 3
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step3iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(3) == query_keyprint '(I0, 1X, I0)', query_key, result
15 end do16 print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demooutput20 8values this step20query_key8result
keys ← [10, 20, 30]
9keys = [10, 20, 30]10values = [5, 8, 13]values this step[10, 20, 30]keysvalues ← [5, 8, 13]
9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 30values this step[5, 8, 13]valuesquery_key ← 30
10values = [5, 8, 13]11query_key = 3012result = 0values this step30query_keyresult ← 0
11query_key = 3012result = 013do i = 1, 3values this step0resulti ← 1
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step1iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(1) == query_keyi ← 2
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step2iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(2) == query_keyi ← 3
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step3iresult ← 13
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step13result.true.keys(3) == query_keyprint '(I0, 1X, I0)', query_key, result
15 end do16 print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demooutput30 13values this step30query_key13result
keys ← [10, 20, 30]
9keys = [10, 20, 30]10values = [5, 8, 13]values this step[10, 20, 30]keysvalues ← [5, 8, 13]
9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 40values this step[5, 8, 13]valuesquery_key ← 40
10values = [5, 8, 13]11query_key = 4012result = 0values this step40query_keyresult ← 0
11query_key = 4012result = 013do i = 1, 3values this step0resulti ← 1
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step1iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(1) == query_keyi ← 2
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step2iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(2) == query_keyi ← 3
12result = 013do i = 1, 314 if (keys(i) == query_key) result = values(i)values this step3iif (keys(i) == query_key) result = values(i)
13do i = 1, 314 if (keys(i) == query_key) result = values(i)15end dovalues this step.false.keys(3) == query_keyprint '(I0, 1X, I0)', query_key, result
15 end do16 print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demooutput40 0values this step40query_key0result
stored keys
`keys` identifies only positions that have stored values.
zero default
`result` starts at zero, which represents a missing sparse value.
lookup scan
A matching key copies the stored value into `result`.