Які структури даних за електронною таблицею?


35

Я хотів би зрозуміти, як вирішується електронна таблиця (група іменованих або іншим чином ідентифікованих комірок, що містять значення або формули, що посилаються на інші комірки). Я спробував переглянути існуючі проекти, але з графічним інтерфейсом, серіалізацією, подіями і т. Д. Було багато чого, що я не зміг знайти електронну таблицю.

Як найпростіше, як це працює?


1
Якщо ви хочете переглянути реалізацію електронних таблиць, яка має дуже мінімальний інтерфейс (і, таким чином, менше відволікається на проблему), подивіться на sc: linuxjournal.com/article/10699?page=0,0
itsbruce

Відповіді:


21

За своєю суттю електронна таблиця - це функціональна мова з динамічним набором тексту, і кожну функцію чи значення можна посилати як клітинку в матриці.

Замість того , щоб такі речі , як (defn some-name ...)в some-nameчастині поміщається в самій клітині.

Якщо ви перейдете до динамічного оновлення функціональної мови ідеї (наприклад, lighttable для clojure), ви побачите майже таку ж функціональність, як електронна таблиця. Прив’яжіть значення до імені, запишіть функцію, яка використовує це значення, змініть значення і результат функції негайно зміниться. Це те саме, що робити щось на кшталт написання =A1 + B2у розташуванні C3в excel.

Таким чином, функціональні програмісти часто люблять писати електронні таблиці як іграшкові програми ... і тему дослідницьких робіт. (Так, вибачте, всі вони стоять за платою ACM.org)

  • Функціональне програмування електронних таблиць

    Співтовариство функціонального програмування виявило певний інтерес до електронних таблиць, але на диво, але, здається, ніхто не розглядав можливість створення стандартної електронної таблиці, наприклад, Excel, працювати зі стандартною функціональною мовою програмування, наприклад Haskell. У цій роботі ми показуємо один із способів, що це можна зробити. Ми сподіваємось, що, зробивши це, ми можемо отримати програмістів електронних таблиць, щоб спробувати функціональне програмування.

  • Форми / 3: візуальна мова першого порядку для вивчення меж парадигми електронних таблиць

    Хоча зловмисники функціонального програмування іноді стверджують, що функціональне програмування є занадто важким або неінтуїтивним для більшості програмістів для розуміння та використання, докази протилежного можна знайти, вивчивши популярність електронних таблиць. Парадигма електронних таблиць - підмножина парадигми функціонального програмування першого порядку знайшла широке визнання як серед програмістів, так і серед кінцевих користувачів. Тим не менш, у більшості систем електронних таблиць існує багато обмежень. У цій роботі ми обговорюємо мовні особливості, які усувають декілька цих обмежень, не відхиляючись від декларативної моделі оцінки першого порядку.

  • Реалізація електронних таблиць функцій

    Велика кількість розробок кінцевих користувачів здійснюється за допомогою електронних таблиць. Метафора електронних таблиць приваблива тим, що є візуальною та вміщує інтерактивне експериментування, але, як зауважують Пейтон Джонс, Блеквелл та Бернетт, метафора електронної таблиці не допускає навіть найосновнішої абстракції: перетворення виразу на названу функцію. Отже, вони запропонували спосіб визначення функції з точки зору робочого аркуша з позначеними клітинками вводу та виводу; ми будемо називати це функціональним аркушем.


Початок роботи електронної таблиці у Вікіпедії дає деякі підказки щодо її реалізації:

Електронна таблиця - це інтерактивна програма для комп'ютерних програм для організації та аналізу даних у табличній формі. Електронні таблиці розроблені як комп’ютеризоване моделювання аркушів паперового обліку. Програма працює на даних, представлених у вигляді комірок масиву, впорядкованих у рядки та стовпці. Кожна комірка масиву є елементом контролера моделі-перегляду, який може містити чисельні чи текстові дані, або результати формул, які автоматично обчислюють та відображають значення на основі вмісту інших комірок.

Спираючись на це на основі структури парадигми Model-View-Controller, як це виражено в бібліотеках Java . Автор продовжує згадувати аплети (трохи датовані, це було написано у '93 -96 рр.) І згадує свою веб-сторінку, яка переходить до http://csis.pace.edu/~bergin/Java/applets.htm (так , аплети) для відповідного коду електронних таблиць http://csis.pace.edu/~bergin/Java/Spreadsheet.java

Я зазначу, що сукупність електронної таблиці не настільки велика в цьому аплеті 570 рядків, включаючи документацію.

Це говорило, що залежно від мови, ви, ймовірно, могли зробити це все за допомогою лише покажчиків функцій у розрізненому масиві.


32

Концептуально кожна комірка - це вузол спрямованого ациклічного графіка , а посилання на інші комірки створюють краї цього графіка. Коли ви змінюєте комірку, топологічне сортування всіх вузлів, до яких можна дістатись із зміненої комірки, надасть вам порядок, необхідний для оцінки комірок. Після того, як ви визначили правильний порядок, це просто стандартний аналіз виразів.


3
Ну, назвіть мене охайним, але немає гарантії, що ви не зможете створити жодних циклів у таблиці. Насправді я просто перевірив це за допомогою Excel, отримуючи попередження, але, ігноруючи його, я міг легко створити циклічну посилання.
Док Браун

1
@DocBrown Щоб уникнути попадання в цикл та заморожування програми, він, ймовірно, перерізається на останньому посиланні, на тому, яке його спричинить.
Ізката

1
Хороший момент, @DocBrown. Ви все ще повинні виявити цикл і розглянути його як DAG для цілей порядку розрахунків, навіть якщо ви вирішили дозволити рекурсію. Ви просто проходите це замовлення кілька разів.
Карл Білефельдт

Які структури даних можуть бути використані для моделювання подібних залежностей DAG? Я перевіряв матрицю суміжності, але за допомогою масиву * n ми не могли пов’язати атрибути з вузлами та ребрами. Наприклад, формула на клітинку була б одним із атрибутів
Енді Дюфресне

6

Як вже було сказано, електронну таблицю легко реалізувати як DAG (спрямований ациклічний графік), що зберігається в простому хеші або словнику. Деякі прості коди, з якими можна грати, мабуть, найпростіший спосіб зрозуміти це:

Дуже проста версія Python: http://code.activestate.com/recipes/355045-spreadsheet/

Це було пояснено та розроблено у цій публікації в блозі: http://ralsina.me/weblog/posts/BB585.html

Тут також є проста версія JavaScript з графічним інтерфейсом: http://jsfiddle.net/ondras/hYfN3/


0

Я зашифрував пакет python, який дозволяє перетворити структуру клітин об'єктивної функції файлу MS Excel в Python. XL2py

Значення комірок розбираються на об'єкт типу dict (), додає їх значення. Клітини, що мають посилання на інші клітини за формулами, містять вузли. Вузли відносяться до комірки, значення якої визначено її формулою. З кожної формули вузла визначається структура залежності, щоб визначити, чи існують кругові посилання чи ні. Порядки обчислення вузлів визначаються з урахуванням залучених структур залежності комірок.

Що стосується структури дерева вводу / виводу, ви можете використовувати будь-який алгоритм мінімізації, реалізований в Python, за вашим бажанням.

Я б запропонував вам поглянути на https://github.com/gusmaogabriels/XL2py

З найкращими побажаннями, Габріеле

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.