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.

query_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
  1. keys ← [10, 20, 30]

    9keys = [10, 20, 30]10values = [5, 8, 13]
    values this step[10, 20, 30]keys
  2. values ← [5, 8, 13]

    9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 20
    values this step[5, 8, 13]values
  3. query_key ← 20

    10values = [5, 8, 13]11query_key = 2012result = 0
    values this step20query_key
  4. result ← 0

    11query_key = 2012result = 013do i = 1, 3
    values this step0result
  5. i ← 1

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step1i
  6. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(1) == query_key
  7. i ← 2

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step2i
  8. result ← 8

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step8result.true.keys(2) == query_key
  9. i ← 3

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step3i
  10. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(3) == query_key
  11. print '(I0, 1X, I0)', query_key, result

    15    end do16    print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demo
    output20 8
    values this step20query_key8result
  1. keys ← [10, 20, 30]

    9keys = [10, 20, 30]10values = [5, 8, 13]
    values this step[10, 20, 30]keys
  2. values ← [5, 8, 13]

    9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 30
    values this step[5, 8, 13]values
  3. query_key ← 30

    10values = [5, 8, 13]11query_key = 3012result = 0
    values this step30query_key
  4. result ← 0

    11query_key = 3012result = 013do i = 1, 3
    values this step0result
  5. i ← 1

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step1i
  6. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(1) == query_key
  7. i ← 2

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step2i
  8. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(2) == query_key
  9. i ← 3

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step3i
  10. result ← 13

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step13result.true.keys(3) == query_key
  11. print '(I0, 1X, I0)', query_key, result

    15    end do16    print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demo
    output30 13
    values this step30query_key13result
  1. keys ← [10, 20, 30]

    9keys = [10, 20, 30]10values = [5, 8, 13]
    values this step[10, 20, 30]keys
  2. values ← [5, 8, 13]

    9keys = [10, 20, 30]10values = [5, 8, 13]11query_key = 40
    values this step[5, 8, 13]values
  3. query_key ← 40

    10values = [5, 8, 13]11query_key = 4012result = 0
    values this step40query_key
  4. result ← 0

    11query_key = 4012result = 013do i = 1, 3
    values this step0result
  5. i ← 1

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step1i
  6. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(1) == query_key
  7. i ← 2

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step2i
  8. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(2) == query_key
  9. i ← 3

    12result = 013do i = 1, 314    if (keys(i) == query_key) result = values(i)
    values this step3i
  10. if (keys(i) == query_key) result = values(i)

    13do i = 1, 314    if (keys(i) == query_key) result = values(i)15end do
    values this step.false.keys(3) == query_key
  11. print '(I0, 1X, I0)', query_key, result

    15    end do16    print '(I0, 1X, I0)', query_key, result17end program sparse_lookup_demo
    output40 0
    values 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`.