" W informatyce strukturami danych nazywamy takie sposoby przechowywania i organizowania porcji informacji, które sprzyjają ich efektywnemu wykorzystaniu w ramach projektowanego rozwiązania. Różne z tych form udostępniają zawartość zróżnicowanym typom aplikacji, stąd wybór odpowiedniej reprezentacji danych nie jest trywialny również z punktu widzenia języków programowania. W tym podrozdziale postaramy się wyliczyć niektóre podstawowe struktury i ich właściwości posługując się do tego celu przykładami z języka Processing jako przeznaczonego i szczególnie nadającego się do kreatywnego stosowania w sztuce nowych mediów i różnego rodzaju projektach spod znaku digital humanities. Dodatkowo, w późniejszych częściach pracy będę się od czasu do czasu wspierał przykładami z JavaScriptu oraz C++ i Javy jako jednych z najpopularniejszych aktualnie języków programowania na świecie (samym językom i ich właściwościom poświęcony został rozdział A 5 tej dysertacji)."
"
Język programowania Processing!
"
" P r o c e s s i n g - j a k p i s z ą j e g o t w ó r c y s t r o n i e i n t e r n e t o w e j p r o j e k t u (www.processing.org) - to język programowania, darmowe zintegrowane środowisko developerskie (IDE) oraz społeczność on-line stworzone jako narzędzie dla twórców sztuki elektronicznej. "
"
" Processing powstał w ramach Aesthetic and Computation Group (ACG) w przy MIT Media Lab. Jego oryginalnymi twórcami są Ben Fry i Casey Reas ale projekt „uwolnił się”
spod opieki autorów i jest rozwijany przez społeczność."
"
" Język pozwala na pisanie kodu zarówno w paradygmacie proceduralnym jak i obiektowym oraz jest multiplatformowy."
"
" Cechą charakterystyczną Processingu jest nastawienie na uproszczenie złożonych konstrukcji programistycznych oraz szybkie uzyskiwanie efektów wizualnych lecz bez pozbawiania narzędzia właściwości „porządnego” języka programowania – pomimo bowiem swojego edukacyjnego rodowodu rozwinął się on do postaci pełnowartościowego narzędzia programistycznego."
"
" Tablice (array) i tablice mieszające (hash table)"
" Pierwszym i zarazem jednym z najpopularniejszych typów danych jest tablica (ang.
array). Funkcjonuje ona zarówno jako struktura danych jak i kontener, w którym poszczególne komórki są dostępne za pomocą kluczy (nazw, numerów). Tablice mogą być jednowymiarowe (ciąg), dwuwymiarowe (macierz) lub wielowymiarowe. W języku Processing tablice inicjuje się poleceniem [ ] podając nazwę tablicy oraz jej strukturę i typ przechowywanych informacji np.:"
"
int[] liczba = new int[2]
"
tworzy jednowymiarową tablicę o dwóch elementach i nazwie „liczba”, zawierającą liczby całkowite (integer)(
"
liczba [0] = 1; liczba [1] = 2
"
przypisuje elementowi tablicy „liczba” o indeksie 0 wartość 1 i elementowi o indeksie 1 wartość 2. "
"
" Oczywiście na tablicach możemy wykonywać bardziej złożone operacje.
Realizować działania arytmetyczne na ich zawartości, umieszczać w pętlach etc."
"
" Krotki [tuple, record]"
" To struktury danych będące realizacjami n-ki matematycznej, czyli pewnego uporządkowanego ciągu wartości. Przykłady krotek to np."
"
Zwierz = („kot”, „mainecoon”, 5)
"
Do takiej konstrukcji mo1emy odwo#a0 si. przez podanie jej indeksu. Na krotkach równie1 mo1emy realizowa0 operacje logiczne i arytmetyczne. W j.zyku Processing tak$ struktur.
mo1emy sobie zorganizowa0 poprzez stworzenie klasy z przypisywan$ list$ parametrów np.:"
"
class xy {!
float x,y; xy(float _x, float _y)
{x=_x; y=_y;}}
!
! Tablice mieszaj"ce [hash table]!
! Ta struktura danych daje mo#liwo$% realizowania uk&adów w rodzaju tablic asocjacyjnych, które s&u#" do przechowywania informacji szybkiego dost'pu. Najpro$ciej rzecz ujmuj"c hash table dzia&a podobnie do zwyk&ej tablicy z tym, #e umo#liwia stosowanie funkcji mieszaj"cych (czasami mówi si' haszuj"cych), które &"cz" indeks tablicy z zadanym kluczem.!
!
( !
!
Ilustracja 9: Zastosowanie tablicy haszuj"cej na przyk&adzie ksi"#ki telefonicznej. !8
!!! !!
!
( z ( 70 257
)ród&o: http://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Hash_table_3_1_1_0_1_0_0_SP.svg/
8
315px-Hash_table_3_1_1_0_1_0_0_SP.svg.png (dost'p: 1.03.2014).
! Reprezentacja grafu [graph]!
! ! Graf stanowi specyficzny sposób uporządkowania i opisu relacji między elementami. Najczęściej pojawia się tu użycie macierzy i listy sąsiedztwa. Formalizacja wygląda następująco: jeśli to graf, V zbiór wierzchołków, E zbiór krawędzi - to możemy taki układ indeksować przypisując wierzchołkowi . Zbiór wierzchołków będzie miał postać: . Wierzchołki mogą być reprezentowane za pomocą różnorodnych struktur danych. Jest to bardzo wygodna i łatwa do zoperacjonalizowania koncepcja reprezentowanie założonych relacji. !
! !
W Processingu możemy zdefiniować graf za pomocą klasy:!
g = new Graf();
!
Następnie jego wierzchołki i krawędzie za pomocą tablic (array):!
Node[] nodes = new Node[numerOfNodes]
!
A dalej wywoływać je do dalszego przetwarzania za pomocą funkcji w rodzaju!
Node[] nodes = przypisane.wartosci[x][y].getAdjacentNodes(1,0);
!
Oczywiście elementy tablicy trzeba najpierw wygenerować za pomocą np. pętli for.
! !
! Dzięki podobnym operacjom możemy przedstawiać nasze dane w postaci grafu i!
generować ich wizualizacje np. takie jak na ilustracji poniżej.!
Ilustracja 10: Przykładowa struktura grafowa !9
!
G=< V,E >
i∈0...|V | −1 v0,...,v|v|−1
źródło: http://stackoverflow.com/questions/10874024/data-structure-and-algorithm-for-circular-graph
9
(dostęp 1.03.2014)
! Drzewo [tree]!
! Drzewo to struktura danych, która mając swoje źródło w matematyce nadaje się bardzo dobrze do reprezentowania hierarchii dowolnych elementów (danych). Podobnie jak graf składa się ona z wierzchołków (węzłów/nodes) oraz krawędzi, które łączą je między sobą. W niepustym drzewie wyróżniany jest jeden element – korzeń. Poziom węzła jest określany przez ilość krawędzi od niego do korzenia. Wysokość jest wyznaczana przez odległość od korzenia do najdalszej krawędzi (gałęzi). Wierzchołki niższe w hierarchii są nazywane dziećmi węzła, jeśli takowy nie posiada elementów niższych – jest liściem.!
Ilustracja 11: Przykładowa struktura drzewiasta z opisem !10
!!
! Obiekt [object]!
! To jedno z najważniejszych pojęć dla naszych dalszych rozważań. Dokładne jego wyjaśnienie znajduje się w rozdziale dotyczącym paradygmatów oprogramowania (dokładnie zaś kiedy mowa jest właśnie o paradygmacie obiektowym [object oriented paradigm] ). Na potrzeby aktualnego wywodu wystarczy opisanie obiektu w sensie 11 programistycznym jako struktury zawierającej dane oraz metody rozumiane jako procedury służące do realizowania konkretnych zadań. Obiekty są swego rodzaju samodzielnymi „bytami” w specyficznej ontologii języków programowania. Waga tego pojęcia dla dalszej części rozważań poświęconych metodom konstruowania i sposobom działania oprogramowania polega na specyficznym zwrocie jaki dokonał się za sprawą OOP. Chodzi mianowicie o fakt, że programy w takim ujęciu nie są już tylko nierozłącznymi zbiorami danych i procedur (do manipulacji danymi) lecz zyskują swoistą autonomię, stają się elementami „świata” konstruowanego za pomocą opisu informatycznego.
źródło: http://img.sparknotes.com/figures/B/becc4efefde067dce51a326cca23c5f0/treedefinition.gif (dostęp
10
1.03.2014)
vide: A 4 Paradygmaty programowania
11