Veri Yapılarına Giriş

Veri Yapılarına Giriş

Veri Yapılarına Giriş konulu ders notları, önemli bilgiler, projeler

Veri Yapılarına Giriş QR Kod
Yazılım geliştirme sürecinde veri yapıları ve modelleri önemli yer tutar. Bir yazılımı geliştirirken öncelikle ilgili programlama diline ait veri yapılarını ve modellerini kullanırız. Eğer bu veri yapıları uygun değilse isteğimize göre bir veri yapısı tanımlayıp kullanabiliriz.

Yazılım ve Program

Yazılım, donanım dışında kalan ve programcının kodlama yaparak istenilen bir işi veya görevin yerine getirilmesi için oluşturduğu programlar / kodlar kümesidir.
Program, kendi içerisinde bir bütün olan ve belirli bir işi / görevi yerine getiren algoritmik bir ifadedir. Bir program yazılımla gerçekleştirileceği gibi donanım tabanlı da tasarlanabilir.
Kod, bir işin yapılması için algoritmik ifadeyi gösteren programın herhangi bir programlama diline dayanılarak, o dilin deyimleri, fonksiyonları ve özellikleri ile elde edilmiş program parçasıdır.

Donanım ve Bellek

Donanım, genel olarak, pasif veya aktif elektronik elemanlardan oluşan ve bilgisayar sistemini oluşturan birimlerle bunlar üzerindeki tümdevreler ve aralarındaki bağlantılara verilen adlandırmadır.
Donanım fizikseldir, yazılım ise sanaldır. Yazılıma ait programlar / kodlar bellek veya saklama birimi üzerindedir. Bellek, program kodlarının ve program parametrelerinin üzerinde saklandığı donanım birimidir. Saklama birimi ise, disk, disket, CD ve teyp yedekleme gibi birimlerdir.
Bellek ve saklama birimlerinin erişim hızı bakımından hiyerarşisi "saklayıcı, işlemci iç belleği, cep bellek, ana bellek, saklama birimleri" şeklindedir.

İşletim Sistemi

İşletim sistemi, bilgisayarda çalışan, bilgisayar donanım kaynaklarını yöneten ve çeşitli uygulama yazılımları için yaygın servisleri sağlayan bir yazılımlar bütünüdür. (Örnek: DOS, Windows, UNIX, LINUX, Netware)
İşletim sistemleri kullanıcı sayısına göre tek kullanıcılı - çok kullanıcılı, kullanım amacına göre genel amaçlı - özel amaçlı, proses işleme şekline göre tek prosesli - çok prosesli, zamana duyarlığa göre gerçek zamanlı - gerçek zamanlı olmayan işletim sistemi olarak sınıflandırılır.

Veri Yapısı ve Veri Modeli

Veri yapısı (Data Structure) verinin veya bilginin bellekte tutulma şeklini veya düzenini gösterir. Tüm programlama dillerinin, genel olarak, tamsayı, kesirli sayı, karakter ve sözcük saklanması için temel veri yapıları vardır. Tasarlanacak program, temel veri yapısı dışında farklı veri yapılarına ihtiyaç duyuyorsa, bunlar kullanılan programlama dilinin elverdiği ölçüde tanımlanmalıdır. Örneğin, C programlama dilinde struct ve union deyimleri kullanılarak yeni yeni veri yapıları tanımlanmaktadır.
Veri modeli (data model), verilerin birbirleriyle ilişkisel veya sırasal durumunu gösterir; problemin çözümü için kavramsal bir yaklaşım yöntemidir denilebilir. Bilgisayar ortamında uygulanacak tüm matematik ve mühendislik problemleri bir veri modeline yaklaştırılarak veya yeni veri modelleri tanımlaması yapılarak çözülebilmektedir. Örneğin, yanda yaygın olarak kullanılan iki veri modeli, ağaç ve graf veri modeli gösterilmiştir.

Algoritma

Algoritma, belirli bir işi veya görevi var olan veya sonradan tanımlanan veri modeline dayandırılarak adım adım ortaya koymak ve bunu bilgisayar ortamında herhangi bir programlama diliyle kodlamaktır. Bir program, tasarlanması ne kadar güç görünse de, gerekli veri modeli ve yapısı belirlenmişse ve algoritmik ifadesi ortaya koyulmuşsa, kolayca kodlanabilir; böylelikle programı tasarlamak ve geliştirmek oldukça kolaylaşır.
Program tasarlanırken, kullanılacak veri yapısı ve algoritma doğrudan uygulamaya bağlıdır. Bazı uygulamalar için programlama dilinin halıhazırda sahip olduğu veri modelleri yeterliyken, bazı uygulamalar için programcı, var olan veri modellerini de kullanarak yeni yeni veri modelleri tanımlar ve programın algoritmik ifadesini bunlara dayanarak geliştirir.
Algoritma, belirli bir problemin sonucunu elde etmek için art arda uygulanacak adımları ve koşulları kesin olarak ortaya koyar. Bu adımlar, ilgili koşullar altında adım adım izlendiğinde bir sonuca ulaşılır. Bilgisayar uygulamasında, bir yazılım geliştirirken birçok algoritmaya ihtiyaç duyulur. Örneğin,
- arama algoritması
- sıralama algoritması
- matris veya vektörel işlem algoritması
- graf algoritması
bir matematiksel modelin çözülmesi algoritması
gibi birçok algoritma türü vardır ve uygulama geliştirirken, bunların biri veya birkaçı her zaman kullanılır.

Program Çalışma Hızı ve Bellek Gereksinimi

Programın çalışma hızı karmaşıklıkla ifade edilir; bu kavram zaman birimiyle ifade edilmeyip doğrudan işlem adedi veya döngü sayısıyla ifade edilir. Çünkü, programın çalışma hızında zaman miktarı programın üzerinde koştuğu donanıma çok bağlıdır; dolayısıyla algoritmaları birbiriyle karşılaştırmak için zaman miktarını kullanmak gerçekçi olmayıp yanılgılara neden olmaktadır. Bunun yerine, ilgili algoritmanın bilgisayar donanımından bağımsız olarak kaç adet işlem veya döngüyle gerçekleştirilebileceği hesaplanır. Algoritma karmaşıklığı iki açıdan ele alınır. Biri zaman karmaşıklığı, diğeri alan (veya bellek) karmaşıklığıdır. Zaman karmaşıklığı (time complexity) algoritmanın sonuca ulaşması için gerekli zaman hakkında bilgi verir. Alan karmaşıklığı (space complexity) ise algoritmanın ihtiyaç duyacağı bellek miktarı hakkında bilgi verir.
Algoritma karmaşıklığı iki şekilde ifade edilebilir. Biri doğrudan parametrelere bağlı olarak tam matematiksel ifadeyle; ikincisiyse, parametrelerin karmaşıklığı nasıl etkilediğini mertebe şeklinde gösterir; Mertebesi göstermek için O (büyük o), Ω gibi birçok asimtotik notasyon kullanılır; genel olarak O notasyonunu kullanmak yaygındır. Örneğin iki matrisin çarpılması için gerekli zaman karmaşıklığı O(n2,81) olarak hesaplanmışsa bu algoritma zaman karmaşıklığı O(n3)'den daha iyidir.
Bir program iki açıdan belleğe ihtiyaç duyar; biri kodun tutulması diğeri de kodun çalışması için üzerinde işlem yapacağı verilerin tutulması için.

İşlemci, Makina Kodu ve Assembly Dili

İşlemci, bir bilgisayar veya sayısal sistem içerisinde aritmetik, mantık ve karşılaştırma gibi işlemlerin yapıldığı ve bu işlemlerin anlamlı sıralarda art arda kullanılmasıyla daha karmaşık işlemlerin kotarıldığı programlanabilen sayısal bir birimdir. İşlemcilere örnek olarak, Standart PC’ler içerisinde kullanılan intel tabanlı Pentium işlemciler; Motorola firmasının 68040 işlemcisi; Zilog firmasının Z80, Z8000 işlemcileri; IBM firmasının RISC 6000 işlemcisi; Texas firmasının sayısal işaret işlemcileri verilebilir. İşlemciler, mimarisine, üretim teknolojisine, özelliğine ve birimlere erişim şekline göre çeşitli şekillerde sınıflanmaktadırlar.
Makina kodu, işlemcinin komut kümesindeki komutlarla yazılmış bir program parçasıdır. İşlemci, makina koduyla yazılmış programları hiçbir derleyici veya dönüştürücüye ihtiyaç duymadan doğrudan çalıştırabilir.
Assembly dili, makina kodu düzeyinde olan komutlara simgesel isimler vermek ve program yazarken simgesel isimler kullanmaya dayanır. Böylece insanlara karmakarışık gelen makina kodu yerine insanlara daha anlamlı olan sözcüklerle uğraşılmış olunur.
Her işlemci ailesinin herbir üyesi için farklı makina kodu ve assembly dili vardır denilebilir; dolayısıyla makina kodu veya assembly ile program yazmak ve tasarlamak hem zor ve güç, hem de her işlemci için ona kodun veya dilin öğrenilmesi gerektiği için zaman alıcı ve uygulaması güç bir durumdur.

Programlama Dilleri

Programlama dilleri, bilgisayar donanımı fazla bilinmeden program geliştirmeye imkan veren bir kodlama şeklidir. Herbiri farklı bir alana yönelmiş veya genel amaçlı olarak tasarlanmış BASIC, FORTRAN, PASCAL, C, PYHTON vs. gibi adlandırılan birçok programlama dili vardır; bunlar genel olarak üst veya orta düzey programlama dili olarak adlandırılır. En temelde, çalışabilen bir program makina kodunda olmalıdır; mikroişlemci, ancak makina kodundaki komutları çözümler ve yürütebilir. Ancak, makina koduyla program geliştirmek oldukça zor ve zahmetli olduğundan assembly dili ve üst düzey programlama dilleri geliştirilmiştir.
Assembly, altdüzey programlama dilidir; işlemcinin iç yapısının bilinmesini gerektirir. İşlemcinin saklayıcılarını, adresleme modlarını ve saklayıcılar arası veri akışının bilinmesini gerektirir. C, bir orta düzey programlama dilidir ve altdüzey ile üstdüzey programlama dillerinin yeteneklerinin bir araya getirilmesini sağlamıştır denilebilir. Üstdüzey ve ortadüzey programlama dilleriyle tasarlanan bir programın makina kodunu üretmek için derleyici olarak adlandırılan yazılım kullanılır. Her dilin kendine özgü derleyicisi vardır.
Görsel programlama dilleri, kullanıcıya görsel arayüz sunan Windows, Görsel arayüzlü UNIX/LINUX işletim sistemleri üzerinde asıl program kısmına ek olarak görsel arayüz oluşturma olanağı sunan dillerdir. Çok değişik görsel programlama dilleri geliştirilmiştir. Örneğin, görsel programlama dilleri denildiğinde, ilk akla gelen, Windows için Visual BASIC, Visual C, Visual C++; LINUX için GTK+/GNOME kütüphanesi akla gelir denilebilir.

Veritabanı ve SQL

Veritabanı, bilgilerin belirli bir disiplin altında saklanması ve gerektiğinde hızlı bir şekilde aranıp bulunması/sorgulanması için geliştirilmiş bir saklama/sorgulama sistemidir. SQL (Structured Query Language) ise bir sorgulama dilidir; veritabanı ile etkileşimin kotarılması, veritabanı veri yapısının tanımlanması, veritabanına veri yazma/sorgulama işlemlerinin yapılmasını sağlar. SQL standart bir sorgulama dili olup Access, Microsoft SQL Server, ORACLE, SYBASE, Ingres gibi birçok veritabanı yönetim sistemleri tarafından desteklenmektedir; MySQL’de, temelde, SQL’in Linux işletim sistemi altında uygulanmasıdır denilebilir. ORACLE, SYBASE ve Ingres profesyonel anlamda veritabanı yönetim sistemleridir; hem tasarım ortamı sunarlar hem de uygulamanın etkin bir şekilde çalışmasını sağlarlar.
Internet uygulamalarında, MySQL ve PHP ikilisi, veritabanına dayalı sorgulamalı dinamik Web sayfalarının tasarlanmasında ve uygulanmasında yoğun olarak kullanılmaktadır.
SQL, aslında yaptığı iş büyük kendisi kolay öğrenilebilecek bir dildir; özellikle İngilizce bilen program tasarımcıları için anlaşılması kolay bir dildir. Yapısı, genel olarak İngilizce bir cümleyi andırır. SQL, genel olarak, Select, Insert, Update, Delete gibi yapıları üzerinde alanlar, tablolar ve veritabanı dosyaları üzerinde işlem yapılmasını sağlar.

Böl ve Yönet (Divide-and-Conquer) Yaklaşımı

Böl ve yönet yaklaşımı bilgisayar biliminde önemli bir yere sahiptir; büyükçe denilebilecek problemler, özellikleri aynı kalmak koşuluyla, daha küçük parçalara ayrılıp küçük problemler haline getirilir ve kolayca çözülür. Örneğin elemanları rastgele yerleştirilmiş elemanlı bir dizi, bölüne bölüne iki elemanlı hale getirilirse sıralanması kolayca yapılabilir: önce ikiye bölünür, dolayısıyla elemanlı iki parça elde edilir; parçalar yeteri kadar küçülmemişse yeniden iki bölünür ve büyüklükte dört parça edilir; yeteri kadar küçülmemişse bölme işlemi tekrarlanarak yeteri kadar küçük hale getirilir.
Birçok problem doğası gereği bölünmeye çok yatkındır; dolayısıyla böylesi problemlerin çözümü böl ve yönet yaklaşımına çok uygun düşer. Örneğin sıralama/arama algoritmalarında, ağaç veri modelinde, bazı matris işlemlerinde böl ve yönet algoritması çözümün görülmesini/sağlanmasını kolaylaştırır.

Network Yazılımı/Programlaması

Network yazılımı, ağ üzerindeki farklı bilgisayarların veya aynı bilgisayar üzerindeki farklı uygulamaların birbirleriyle etkileşim içerisinde karşılıklı olarak çalışmasını ve veri alış-verişinde bulunmasını sağlayan bir yazılım çeşidir. İletişimde bulunacak iki program arasında, önce, sanal bağlantı kurulur ve programlar arası sanal bir iletişim kanalı oluşturulur. Bu aşamadan sonra, programlar, sanki yerel bir kaynağa erişiyorlarmış gibi veri aktarımında bulunabilir. Network yazılımı, kullanılan protokol kümesine çok bağlıdır; doğrudan o protokol kümesinin sunduğu yapı ve hizmetler üzerinden yapılır. Bir protokol kümesi için geliştirilen bir yazılım bir başka protokol kümesi altında çalışmaz. TCP/IP, NETBUI, NETWARE, AppleTalk bilinen ağ protokol kümeleri olup, uygulamada, Internet’in de protokol kümesi olan TCP/IP yaygın olarak kullanılmaktadır.
Ağ programlama ise, uygulamaya dönük programların bir ağ ortamı üzerinden haberleşerek karşılıklı etkileşimde bulunmasını sağlayan programlama şeklidir. Burada temel gereksinim, aynı uygulamaya ait, ancak farklı sistemler üzerinde koşan program parçalarının hatadan arınmış olarak karşılıklı haberleşmelerini, etkileşimde bulunmalarını sağlamaktır. Ağ programlaması, ağın protokol kümesine ve mimarisine çok bağlıdır; bir program TCP/IP için geliştirilmişse, ancak ve ancak TCP/IP ağlarda çalışır. Dolayısıyla program parçalarının koştuğu sistemler üzerinde TCP/IP protokol kümesi yüklü olmalıdır.

Kıyaslama (Benchmarking)

Kıyaslama, aynı işi yapan iki programın veya yazılımın evrensel anlamda örnek veriler üzerinde çalıştırılarak başarımlarını karşılaştırmaktır; kıyaslama donanım için de yapılabilir. Örneğin iki tane bilgisayara, önceden tanımlanmış işler belirli sayıda yaptırılır ve bir başarım sayısı elde edilir; bu iki sayı kıyaslanarak daha büyük olanın daha başarımlı olduğu belirlenir. Kıyaslamada önemli unsurlar, örnek verinin herkes tarafından bilinen ve kolayca elde edilen evrensel düzeyde olmasıdır ki, herkes kendi sistemini kıyaslayabilsin. Kıyaslama verisi, çok özel bir durum için değilse, olası tüm durumları yeteri kadar deneyecek özellikte olmalıdır; özel bir durum için hazırlanmış ise, verinin özelliği açıkça belirtilmelidir.

Kaynaklar

- Veri Yapıları ve Algoritmalar - Rıfat Çölkesen

İlgili İçerikler

İlgili İçerikler

#Ver #Values #Var #Very #Value

İlgili İçerikler QR Kod

Value

Value

Değer

Value QR Kod

Very

Very

Çok

Very QR Kod

Var

Var

Değişken

Var QR Kod

Values

Values

Değerler

Values QR Kod

Ver

Ver

Sürüm

Ver QR Kod