Структура данных словаря на языке логотипа (хранилище ключей / значений)

Мне интересно, есть ли реализация структуры данных словаря первого класса, доступная для использования на языке Logo? Я не вижу ни одного доступного в документации логотипа UCB или логотипа FMS. Я вижу, что есть списки свойств, но они не относятся к первому классу, и похоже, что это списки ассоциаций с линейным поиском. Я ищу что-то на основе хешей или деревьев. Кажется, там было много исторических Логосов, и, возможно, кто-то реализовал что-то подобное. Кроме того, если кто-нибудь знает о хранилище кода логотипа, я был бы признателен за указатели (например, CPAN для логотипа).

2 ответа

Вот реальная упрощенная реализация чисто функционального дерева на основе списков. Ключи могут быть словами или цифрами. Пустой список - это пустой словарь. Это не самобалансировка, поэтому вам придется вызывать "rebalance" самостоятельно после выполнения вставок с помощью "dict_add". Не делайте этого много, так как "перебалансировка", как реализовано, занимает O(n) время. Процедура "тестирования" немного тренирует вещи.

to dict_lookup :dict :key
   if (empty? :dict) [output []]
   localmake "pair first :dict
   if (empty? :pair) [output []]
   localmake "test_k first :pair
   if (equal? :key :test_k) [output last :pair]
   output dict_lookup (ifelse (before? :key :test_k) [left_tree :dict] [right_tree :dict]) :key
end

to left_tree :dict
    output item 2 :dict
end

to right_tree :dict
    output item 3 :dict
end

to dict_add :dict :key :value
    localmake "new_pair (list :key :value)
    if (empty? :dict) [output (list :new_pair [] [])]
    localmake "old_pair first :dict 
    localmake "old_key first :old_pair

    localmake "l_tree left_tree :dict
    localmake "r_tree right_tree :dict

    if (equal? :key :old_key) [output (list :new_pair :l_tree :r_tree)] 
    ifelse (before? :key :old_key) [
        localmake "l_tree dict_add l_tree :key :value] [
        localmake "r_tree dict_add r_tree :key :value]
    output (list :old_pair :l_tree :r_tree)
end

to in_order :dict
    if (empty? :dict) [output []]
    output (sentence (in_order (left_tree :dict)) 
                     (list (first :dict))
                     (in_order (right_tree :dict)))
end

to draw_tree :dict :size
    if (empty? :dict) [label [[]] stop]
    rt 50 fd :size lt 50
        draw_tree (left_tree :dict) :size * 0.7 
    rt 50 bk :size lt 50
    label (first :dict)
    lt 50 fd :size rt 50 
        draw_tree (right_tree :dict) :size * 0.7
    lt 50 bk :size rt 50
end

to list_to_tree :l
    if (empty? :l) [output []]
    localmake "half int (count :l)/2
    localmake "firsts take :half :l
    localmake "rests drop :half :l
    output (list (first :rests) (list_to_tree :firsts) (list_to_tree bf :rests))
end

to take :n :l
    if (or (empty? :l) (:n < 1)) [output []]
    output fput (first :l) take :n-1 bf :l
end

to drop :n :l
    if (:n < 1) [output :l]
    output drop :n-1 bf :l
end

to rebalance :dict
   output list_to_tree in_order :dict
end

to testing
    localmake "test_dict []
    localmake "items [[apple 1] [ball 2] [banana 3] [cat 4] [zebra 5] 
                      [toy 6] [yak 7] [jump 8]]
    foreach :items [make "test_dict (dict_add :test_dict (first ?) (first bf ?))]
    cs pu
    lt 60 fd 500 setheading 180 pd 
        draw_tree :test_dict 200
    pu lt 90 fd 700 setheading 180 pd 
        draw_tree (rebalance :test_dict) 160
end

Это правда, что в списках недвижимости FMSLogo нет граждан первого класса. Тем не менее, список свойств "имена" первого класса. Также версия 6.32.0 FMSLogo реализует списки свойств в виде деревьев AVL. Это задокументировано здесь: http://sourceforge.net/p/fmslogo/feature-requests/94/

Другие вопросы по тегам