İçeriğe atla

Veri yapısı

Veri yapısı, bilgisayar ortamında verilerin etkin olarak saklanması ve işlenmesi için kullanılan yapı.[1]

Veri yapıları, verilerin düzenlenme biçimini belirleyen yapıtaşlarıdır. Bir yazılım değişkeni bile basit bir veri yapısı olarak kabul edilebilir. Değişik algoritmalarda verilerin diziler, listeler, yığıtlar, kuyruklar, ağaçlar ve çizgeler gibi veri modellerine uydurularak düzenlenmesi gerekebilir. Veri, yapı ve algoritma bir yazılımın birbirinden ayrılmaz bileşenleridir. Algoritması hazırlanmış her yapı için verilerin düzenli bir şekilde kullanımı önemlidir. Çünkü yapı iyi kurulduğunda, etkin, doğru, anlaşılır ve hızlı çalışıp az kaynak kullanan algoritma geliştirmek kolaylaşır.

Bilgisayar biliminde veri yapısı, genellikle verilere verimli erişim için seçilen bir veri organizasyonu ve depolama biçimidir. Daha doğrusu veri yapısı, veri değerlerinin, bunlar arasındaki ilişkilerin ve verilere uygulanabilecek işlevlerin veya işlemlerin bir koleksiyonudur; yani verilere ilişkin cebirsel bir yapıdır.

Kullanım

Veri yapıları soyut veri türlerinin (ADT (abstract data types)) temelini oluşturur. ADT, veri tipinin mantıksal formunu tanımlar. Veri yapısı veri tipinin fiziksel formunu uygular.

Farklı türdeki veri yapıları, farklı türdeki uygulamalara uygundur ve bazıları belirli görevlere oldukça uzmanlaşmıştır. Örneğin, ilişkisel veritabanları genellikle veri alımı için B-ağacı dizinlerini kullanırken, derleyici uygulamaları genellikle tanımlayıcıları aramak için karma tabloları kullanır.

Veri yapıları, büyük veritabanları ve internet indeksleme hizmetleri gibi kullanımlar için büyük miktarlardaki verileri verimli bir şekilde yönetmeye yönelik bir araç sağlar. Genellikle verimli veri yapıları, verimli algoritmalar tasarlamanın anahtarıdır. Bazı resmi tasarım yöntemleri ve programlama dilleri, yazılım tasarımında anahtar düzenleme faktörü olarak algoritmalardan ziyade veri yapılarını vurgular. Veri yapıları, hem ana bellekte hem de ikincil bellekte saklanan bilgilerin depolanmasını ve alınmasını düzenlemek için kullanılabilir.

Uygulama

Veri yapıları, çeşitli programlama dilleri ve teknikleri kullanılarak uygulanabilir, ancak hepsi, verileri verimli bir şekilde organize etmek ve depolamak gibi ortak bir hedefi paylaşır. Veri yapıları genellikle bir bilgisayarın, kendisi de bellekte saklanabilen ve program tarafından değiştirilebilen, bir bellek adresini temsil eden bir bit dizisi olan bir işaretçi tarafından belirtilen, belleğindeki herhangi bir yere veri getirme ve saklama becerisine dayanır. Dolayısıyla dizi ve kayıt veri yapıları, veri öğelerinin adreslerinin aritmetik işlemlerle hesaplanmasına dayanırken, bağlantılı veri yapıları, veri öğelerinin adreslerinin yapının kendisi içinde saklanmasına dayanır. Veri yapılandırmasına yönelik bu yaklaşımın, algoritmaların verimliliği ve ölçeklenebilirliği üzerinde derin etkileri vardır. Örneğin, dizilerdeki bitişik bellek tahsisi, hızlı erişim ve değişiklik işlemlerini kolaylaştırarak sıralı veri işleme senaryolarında performansın optimize edilmesini sağlar.

Bir veri yapısının uygulanması genellikle o yapının örneklerini yaratan ve işleyen bir dizi prosedür yazmayı gerektirir. Bir veri yapısının verimliliği bu işlemlerden ayrı olarak analiz edilemez. Bu gözlem, soyut bir veri türü, üzerinde gerçekleştirilebilecek işlemlerle dolaylı olarak tanımlanan bir veri yapısı ve bu işlemlerin matematiksel özellikleri (yer ve zaman maliyetleri dahil) şeklindeki teorik kavramı motive eder.

Örnekler

Genellikle daha basit ilkel veri türleri üzerine inşa edilen çok sayıda veri yapısı türü vardır. İyi bilinen örnekler şunlardır:

  • Dizi, belirli bir sıradaki, genellikle hepsi aynı türde olan bir dizi öğedir (dile bağlı olarak, tek tek öğelerin tümü aynı türde olmaya zorlanabilir veya hemen hemen her türde olabilir). Hangi öğenin gerekli olduğunu belirtmek için öğelere bir tam sayı dizini kullanılarak erişilir. Tipik uygulamalar dizilerin elemanları için bitişik hafıza kelimeleri tahsis eder (ancak bu her zaman bir zorunluluk değildir). Diziler sabit uzunlukta veya yeniden boyutlandırılabilir olabilir.
  • Bağlantılı liste (aynı zamanda liste olarak da adlandırılır), her düğümün kendine ait bir değere sahip olduğu ve bağlantılı listedeki bir sonraki düğüme işaret ettiği, düğüm adı verilen herhangi bir türdeki veri öğelerinin doğrusal bir koleksiyonudur. Bağlantılı listenin diziye göre temel avantajı, listenin geri kalanının yeri değiştirilmeden değerlerin her zaman verimli bir şekilde eklenip çıkarılabilmesidir. Ancak belirli bir öğeye rastgele erişim gibi diğer bazı işlemler, listelerde dizilere göre daha yavaştır.
  • Bir kayıt (aynı zamanda tuple veya yapı olarak da adlandırılır), toplu bir veri yapısıdır. Kayıt, genellikle sabit sayı ve sırayla diğer değerleri içeren ve genellikle adlara göre dizine eklenen bir değerdir. Kayıtların öğelerine genellikle alanlar veya üyeler denir. Nesne yönelimli programlama bağlamında kayıtlar, onları nesnelerden ayıran düz eski veri yapıları olarak bilinir.
  • Hash haritaları olarak da bilinen hash tabloları, anahtarlara dayalı olarak değerlerin hızlı bir şekilde alınmasını sağlayan veri yapılarıdır. Anahtarları bir dizideki indekslere eşlemek için bir karma işlevi kullanırlar ve ortalama durumda sabit zamanlı erişime izin verirler. Hash tabloları sözlüklerde, önbelleklerde ve veritabanı indekslemede yaygın olarak kullanılır. Ancak performanslarını etkileyebilecek karma çarpışmalar meydana gelebilir. Çarpışmaların üstesinden gelmek için zincirleme ve açık adresleme gibi teknikler kullanılır.
  • Çizgeler, varlıklar arasındaki ilişkileri temsil eden, kenarlarla birbirine bağlanan düğümlerin koleksiyonlarıdır. Çizgeler, diğer şeylerin yanı sıra sosyal ağları, bilgisayar ağlarını ve ulaşım ağlarını modellemek için kullanılabilir. Köşelerden (düğümler) ve kenarlardan (düğümler arasındaki bağlantılar) oluşurlar. Çizgeler yönlü veya yönsüz olabilir, döngülere sahip olabilir veya döngüsel olmayabilir. Çizge geçiş algoritmaları, genişlik öncelikli aramayı ve derinlik öncelikli aramayı içerir.
  • Ağaçlar öğelerin hiyerarşik organizasyonunu temsil eder. Ağaç, döngü içermeyen bir çizgedir ve kenarlarla birbirine bağlanan düğümlerden oluşur; bir düğüm köktür ve diğer tüm düğümler alt ağaçları oluşturur. Ağaçlar çeşitli algoritmalarda ve veri depolama senaryolarında yaygın olarak kullanılmaktadır. İkili ağaçlar (özellikle yığınlar), AVL ağaçları ve B ağaçları bazı popüler ağaç türleridir. Verilerin verimli ve optimum şekilde aranmasını, sıralanmasını ve hiyerarşik temsilini sağlarlar.
  • Yığınlar ve kuyruklar, diziler veya bağlantılı listeler kullanılarak uygulanabilen soyut veri türleridir. Bir yığının iki temel işlemi vardır: Son Giren İlk Çıkar (LIFO) prensibini takip eden yığının en üstüne bir öğe ekleme (push) ve yığından en üstteki öğeyi kaldırma (pop). Kuyrukların iki ana işlemi vardır: İlk Giren İlk Çıkar (FIFO), kuyruğun arkasına bir öğe ekleme (enqueue) ve kuyruğun en önündeki öğeyı kaldırma (dequeue).
  • Önek ağacı olarak da bilinen bir trie, karakter dizelerinin verimli bir şekilde alınması için kullanılan özel bir ağaç veri yapısıdır. Her kenar bir karakteri temsil edecek şekilde bir dizenin karakterlerini düğümler halinde depolamaya çalışır. Otomatik tamamlama, yazım denetimi ve sözlük uygulamaları gibi metin işleme senaryolarında özellikle kullanışlıdır. Denemeler, dizelerde hızlı arama ve önek tabanlı işlemleri mümkün kılar.

Dil desteği

Çoğu assembly dili ve BCPL (Basic Combined Programming Language, Temel Birleştirilmiş Programlama Dili) gibi bazı düşük seviyeli diller, veri yapıları için yerleşik destekten yoksundur. Öte yandan, birçok üst düzey programlama dili ve MASM gibi bazı üst düzey assembly dilleri, kayıtlar ve diziler gibi belirli veri yapıları için özel sözdizimine veya diğer yerleşik desteğe sahiptir. Örneğin, C (BCPL'nin doğrudan soyundan gelen) ve Pascal dilleri, vektörlere (tek boyutlu diziler) ve çok boyutlu dizilere ek olarak sırasıyla yapıları ve kayıtları destekler.

Çoğu programlama dili, veri yapısı uygulamalarının farklı programlar tarafından yeniden kullanılmasına izin veren bir tür kütüphane mekanizmasına sahiptir. Modern diller genellikle en yaygın veri yapılarını gerçekleyen standart kütüphanelerle birlikte gelir. Örnekler C++ Standart Şablon Kitaplığı, Java Koleksiyon Çerçevesi ve Microsoft .NET Çerçevesidir.

Modern diller ayrıca genellikle modüler programlamayı, yani bir kütüphane modülünün arayüzü ile bunun uygulanması arasındaki ayrımı destekler. Bazıları, istemcilerin uygulama ayrıntılarını gizlemesine olanak tanıyan opak veri türleri sağlar. C++, Java ve Smalltalk gibi nesne yönelimli programlama dilleri genellikle bu amaç için sınıfları kullanır.

Bilinen birçok veri yapısının, birden fazla bilgi işlem iş parçacığının bir veri yapısının tek bir somut örneğine aynı anda erişmesine izin veren eşzamanlı versiyonları vardır.

Ayrıca bakınız

  • Soyut veri türü
  • Eşzamanlı veri yapısı
  • Veri örneği
  • Dinamizasyon
  • Bağlantılı veri yapısı
  • Veri yapılarının listesi
  • Kalıcı veri yapısı
  • Düz eski veri yapısı
  • Queap
  • Kısa ve öz veri yapısı
  • Ağaç (veri yapısı)

Kaynakça

  1. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009). Introduction to Algorithms, Third Edition (3. bas.). The MIT Press. ISBN 978-0262033848. 10 Şubat 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Temmuz 2024. 

Daha fazla okuma

  • Alfred Aho, John Hopcroft, and Jeffrey Ullman, Data Structures and Algorithms, Addison-Wesley, 1983, ISBN 0-201-00023-7

Dış bağlantılar

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

Paralel hesaplama ya da Koşut hesaplama, aynı görevin, sonuçları daha hızlı elde etmek için çoklu işlemcilerde eş zamanlı olarak işletilmesidir. Bu fikir, problemlerin çözümünün ufak görev parçalarına bölünmesi ve bunların eş zamanlı olarak koordine edilmesine dayanır. Paralel hesaplama ile performans artar, büyük sorunlar daha az sürede çözülür ve bilimdeki gelişmeler paralel hesaplamaya gereksinim duyar.

<span class="mw-page-title-main">Assembly</span> uygulanan işlemlerle programlama dilinin birbirine çok yakın olduğu düşük seviye programlama dilleri

Assembly dili, bir işlemcinin komut kümesi üzerine tanımlanmış alt seviye bir dildir. Assembly dili kolay hatırlanabilir semboller tanımlar ve böylece işlemcinin makina koduna karşılık gelen sayı dizilerinin bilinmesine gerek kalmaz. Assembly dili, platformdan bağımsız yüksek seviyeli programlama dillerinin aksine, işlemci mimarisine bağımlıdır. Tipik uygulamaları; cihaz sürücüleri, alt seviyeli dahili (embedded) ve gerçek zamanlı sistemlerdir. Bır assembly programı assembler kullanılarak makine koduna çevrilir.

Veri türü, bilgisayar programlamasının tür sisteminde veriyi açıklamak üzere kurulmuştur. İlkel türleri de içeren programlama dillerindeki verinin ortak türleri, tuple'ler, kayıtlar, cebirsel veri türleri, soyut veri türleri, referans türleri, sınıflar ve işlev türleridir. Bir veri türü, temsil etmeyi, yorumlamayı ve algoritmaları veya bilgisayar belleğini veya diğer yapılarını tanımlar. Tür sistemi, veri türü bilgisini, veriyi kullanan veya veriye erişen bilgisayar programlarının doğruluğunu kontrol etmek amaçlı kullanır.

Ağ modeli yöneylem araştırmasında belirlenmiş bir sıra problemin düğümler ve dal veya bağlantilardan oluşan bir şebeke halinde tanımlanıp modellemesi türü olup ve tanımlanan sebeke problemlerinin çözümlenmesi için ortaya çıkartılan özel şebeke problemi algoritmalardan oluşur. Bu türlü çalışmalarda önce problemin ögeleri ve amacı tarif edilir. Sonra problemin şekil olarak veya matris olarak dallar ile birbirlerine bağlı düğümler halinde yapılandırılıp tanımlanması gerekir. Örneğin problem bir şehre kurulacak su borusu şebekesinin, bütün şehre en ucuz maliyet ile nasıl kurulacağıdir. Bu problem bir mümkün olan bütün bağlantı parçalarını, maliyetleri ve kapasiteleri gösteren şebeke halinde ifade edilir. Bu problem ve yapılanan model bir minimum maliyet kapasiteli sebeke problemi olduğu için bu çeşit model problemi çözmek için geliştirilmiş olan özel algoritmalardan birini kullanarak çözülebilir.

<span class="mw-page-title-main">Birleştirmeli sıralama</span>

Birleşmeli Sıralama, bilgisayar bilimlerinde derecesinde karmaşıklığa sahip bir sıralama algoritmasıdır. Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma yöntemi kullanarak diziyi sıralar.

<span class="mw-page-title-main">Sıralama algoritması</span>

Sıralama algoritması, bilgisayar bilimlerinde ya da matematikte kullanılan, verilen bir listenin elemanlarını belirli bir sıraya sokan algoritmadır. En çok kullanılan sıralama türleri, sayı büyüklüğüne göre sıralama ve alfabetik sıralamadır. Sıralama işleminin verimli yapılması, arama ve birleştirme algoritmaları gibi çalışması için sıralanmış dizilere gereksinim duyan algoritmaların başarımının yüksek olması için önemlidir. Sıralama algoritmaları bilgisayarlarda tutulan verilerin düzenlenmesini ve insan kullanıcı tarafından daha rahat algılanmasını da sağlar.

Dizi bilgisayar bilimlerinde dizinle erişilen bir veri öbeği oluşturmak için kullanılan bir veri yapısıdır. Çoğu programlama dilinde bir dizinin tuttuğu bütün öğeler aynı veri türündendir ve dizi ardışık bellek adresleriyle gösterilen konumlarda saklanır. Çoğu programlama dilinin İngilizce array sözcüğüyle tanımlanan kendisine ait bir veri türü bulunur. COBOL gibi eski programlama dillerinde dizi yerine "tablo" sözcüğü kullanılır.

<span class="mw-page-title-main">Dinamik dizi</span>

Dinamik dizi, tutabileceği eleman sayısının derleme zamanında bilinmesine gerek olmayan dizidir. Dinamik dizi tanımlandığında, kapasitesini belirten bir bellek tahsis edilir ve kullanımda kapasiteye erişildiğinde yeniden bir dinamik bellek tahsisi yapılır. Dinamik diziye elemanlar eklenebilir, diziden elemanlar silinebilir; dizinin boyutu azaltılabilir ve arttırılabilir. Bazı programlama dillerinde vektör adıyla anılan bu yapıyı birçok modern programlama dili kendi kütüphaneleriyle sunmaktadır.

Bağlı liste, her elemanın bir değerinin yanında bir de referans içerdiği veri yapısıdır.

<span class="mw-page-title-main">Algoritma analizi</span>

Algoritma analizi veya diğer adıyla algoritma çözümlemesi, bilgisayar biliminde bir algoritmayı çalıştırabilmek için gereken kaynakların miktarının tespitidir. Algoritmaların çoğunluğu, rastgele seçilmiş uzunluktaki girdiler ile çalışmak için tasarlanmıştır. Genellikle, bir algoritmanın verimlilik veya çalışma zamanı, adımların sayısı veya depolama yerleri 'nin girdi uzunluğuyla ilişkili olan işlev olarak ifade edilir.

Programlama paradigmaları, programlama dillerini özelliklerine göre sınıflandırmanın bir yoludur. Diller birden fazla paradigma içinde sınıflandırılabilir.

Arama algoritmaları, bilgisayar biliminde seçili özelliklere göre istenilen bilgileri bulan algoritmalardır. Listeler, metinler ve şekiller üzerinde çalışırlar.

<span class="mw-page-title-main">Bayes ağı</span>

Bir Bayes ağı, Bayes modeli ya da olasılıksal yönlü dönüşsüz çizge modeli bir olasılıksal çizge modelidir ve birbirleriyle koşulsal bağımlılıklara sahip bir rassal değişkenler kümesini yönlü dönüşsüz çizge(YDÇ) şeklinde ifade eder. Bayes ağları; gündelik hayatta meydana gelen bir olayı anlatmak ve o olayın gerçekleşmesine sebebiyet verebileceği bilinen birkaç olası nedenden herhangi birinin katkıda bulunan faktör olma olasılığını tahmin etmek için kullanılan ideal bir modelleme türüdür. Örneğin, bir Bayes ağı kullanılarak hastalıklar ve semptomları arasındaki olasılıksal koşul ilişkileri modellenebilir. Bu model kullanılarak, bir kişide görülen semptomlar verildiğinde bu kişinin bazı hastalıklara sahip olma olasılıkları hesaplanabilir. Buna benzer olarak neden-sonuç ilişkisi olan birçok olayın olasılığı bu modelleme ile görselleştirilebilir.

<span class="mw-page-title-main">Ayrıştırıcı (yazılım)</span>

Ayrıştırıcı, girdi verilerini alır ve girdinin yapısal bir temsilini vererek, süreçte doğru sözdizimini kontrol eden bir veri yapısı oluşturan bir yazılım bileşenidir. Ayrıştırma öncesinde veya sonrasında başka adımlar izlenebilir veya bunlar tek bir adımda birleştirilebilir. Ayrıştırıcı, genelde girilen karakter dizisinden belirteçler oluşturan ayrı bir sözcük tabanlı analiz motorunu takip eder. Ayrıştırıcılar elle programlanabilir veya bir ayrıştırıcı üreteci tarafından otomatik olarak veya yarı otomatik olarak oluşturulabilir. Ayrıştırma, biçimlendirilmiş çıktı üretimlerini tek bir şablonda tamamlama görevi görür. Bunlar, farklı etki alanlarına uygulanabilir, ancak bir derleyicinin girdi ve çıktı aşamaları gibi genellikle bir arada sunulur.

<span class="mw-page-title-main">Sığ öncelikli arama</span>

Bilgisayar biliminde, sığ öncelikli arama ya da enine arama, bir çizgenin düğümlerini, başlangıç noktasına daha yakın olanlara öncelik vererek arayan bir algoritmadır. Algoritma ziyaret ettiği düğümlerin bütün komşularını bir kuyruğa ekler ve ziyaret edeceği düğümleri kuyruktaki sıraya göre seçer. Eğer arama yapılan çizge bir ağaç ise kuyruk kullanmaya gerek olmaz.

<span class="mw-page-title-main">Yapı</span> bir nesne veya sistemdeki birbiriyle ilişkili unsurların düzenlenmesi ve organizasyonu veya bu şekilde organize edilmiş nesne veya sistem

Yapı, maddi bir nesne veya sistemdeki birbiriyle ilişkili unsurların düzenlenmesi ve organizasyonu veya bu şekilde organize edilmiş nesne veya sistemdir. Maddi yapılar, binalar ve makineler gibi insan yapımı nesneleri ve biyolojik organizmalar, mineraller ve kimyasallar gibi doğal nesneleri içerir. Soyut yapılar bilgisayar bilimlerindeki veri yapılarını ve müzik formunu içerir. Yapı türleri arasında bir hiyerarşi, çoktan çoğa bağlantılar içeren bir bağlantı veya uzayda komşu olan bileşenler arasındaki bağlantıları içeren bir kafes bulunur.

<span class="mw-page-title-main">Analiz</span> belirli bir türdeki mevcut verilere analitik yöntemler uygulama, karmaşık bir konuyu veya maddeyi daha iyi anlamak için daha küçük parçalara ayırma süreci

Analiz, karmaşık bir konuyu veya maddeyi daha iyi anlamak için daha küçük parçalara ayırma sürecidir. Teknik, matematik ve mantık çalışmalarında Aristoteles'ten önce uygulanmıştır.

Karar ağacı, bir kurum veya kuruluş tarafından tercihlerin, risklerin, kazançların ve hedeflerin anlaşılmasına yardımcı olan bir teknik türüdür. Aynı zamanda birçok önemli yatırım sahalarında uygulanabilen, birbiriyle bağlantılı şans olaylarıyla ilgili olarak çıkan çeşitli karar noktalarını incelemek için kullanılan bir karar destek aracıdır. Yalnızca koşullu kontrol ifadeleri içeren bir algoritmayı görüntülemenin bir yoludur.

Bilgisayar biliminde dizi programlama, işlemlerin bir kerede tüm değerler kümesine uygulanmasına izin veren çözümleri ifade eder. Bu tür çözümler, bilimsel ve mühendislik ortamlarında yaygın olarak kullanılmaktadır.