Veri yapılarına giriş
Veri yapısı, birkaç şeyi bir arada tuttuğunuz biçimdir ve birini seçmek aslında o veri hakkında hangi sorunun sonradan hızlı yanıt alacağını seçmektir. Günlük işin yüzde doksanını kapsayan üç biçim liste, sözlük ve kümedir; onları ayıran şey ne depoladıkları değil, neyi ucuza buldukları.
- Ders 8 / 14
- Başlangıç
- Ücretsiz, kayıt yok
Sonradan soracağınız sorudan veri yapısı seçmek
-
sıra
Liste
İki üyenin yerini değiştirmek anlamı değiştiriyor mu? O halde sıranın kendisi bilgidir.
-
anahtar
Sözlük
Belirli bir şeye belirli bir adla mı ulaşıyorsunuz? Anahtar, numaranın aksine, yerinden oynamaz.
-
üyelik
Küme
Yalnızca var olup olmadığını mı bilmek istiyorsunuz? Ayrıca tekrarları girdikleri anda düşürür.
-
sabit
Demet
Listeyle aynı, kurulduktan sonra değişemeyeceği garantisiyle.
Bu dört biçimin hepsi aynı veriyi tutabilir. Onları ayıran şey neyi ucuza buldukları, ne depoladıkları değil.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Veri yapısı nedir ve seçimi neden önemli?
Veri yapısı, birkaç şeyi bir arada tuttuğunuz biçimdir. Buraya kadar basit görünüyor ve öneminin fark edilmemesinin nedeni tam olarak bu basitliktir: yeni başlayanların çoğu bu biçimler arasındaki seçimi bir zevk meselesi sanır, çünkü hepsi aynı veriyi tutabilir.
Gerçekten de hepsi tutabilir. Yüz isim bir listeye, bir sözlüğe ya da bir kümeye konabilir. Fark başka yerdedir: her biçim tek bir soruyu ucuza, diğer tüm soruları pahalıya yanıtlar.
Bu dersten çıkarılacak kural şu. Veriyi hangi biçimde tutacağınıza karar verirken veriye bakmayın; sonradan ona soracağınız soruya bakın. "Üçüncü üye hangisi" bir sorudur, "bu anahtarın değeri nedir" başka bir sorudur ve "bu şey burada var mı" üçüncü bir sorudur. Üç soru, üç biçim.
Ve doğru şeyi beklemeniz için: yanlış seçim genelde programı bozmaz. Program çalışır, kodunuz yalnızca basit bir soruyu sormak için çok iş yapmak zorunda kalır ve o fazladan iş, veri büyüdüğünde ya da ona bir şey eklendiğinde kendini gösterir. Bu dersin son bölümü tam olarak bunun gerçek bir örneği.
Liste: sıranın kendisinin bilgi olduğu yer
Liste, sıraları korunarak arka arkaya duran birkaç şeydir. O korunan sıra, listeyi diğerlerinden ayıran tek şeydir ve göründüğünden daha önemlidir.
prices = [12000, 8000, 15000]
prices.append(9000)
print(prices[0])
print(len(prices))Her üyenin dizin denen bir numarası vardır ve numaralar birden değil sıfırdan başlar. Yani prices[0] ilk fiyattır. Sıfırdan başlamanın tarihsel bir nedeni var ve neredeyse tüm modern dillerde aynıdır; koşullar ve döngüler dersinde karşılaştığınız bir fark hatasının kaynağı da budur.
Liste, sıranın anlam taşıdığı yerde doğrudur: bir işin adımları, sıralamaya göre arama sonuçları, bir konuşmanın mesajları. Bunların hepsinde iki üyenin yerini değiştirmek anlamı değiştirir ve bu, listenin doğru seçim olduğunun işaretidir.
Ve ilk bakışta avantaj gibi görünüp sonradan maliyete dönüşen bir özellik: bir üyenin dizini sabit değildir. İlk üyeyi silin, sonraki her üye bir sıra öne gelir ve yeni bir dizin alır. Yani "üç numaralı üye" o üye hakkında hiçbir şey söylemez; yalnızca şu an listede nerede durduğunu söyler. O numarayı sonra kullanmak üzere bir yere kaydettiyseniz, henüz gerçekleşmemiş bir hatayı az önce kurmuş olursunuz.
Sözlük: anahtarın numaranın yerini aldığı yer
Sözlük, anahtar ve değer çiftleridir. Bir şeyi numarasıyla bulmak yerine adıyla bulursunuz. Diller ona farklı adlar verir ama fikir aynıdır.
user = {"name": "sara", "city": "shiraz"}
print(user["city"])
user["city"] = "tabriz"Genelde atlanan önemli fark şu: user["city"] yazdığınızda program sözlüğün içinde arama yapmaz. Doğrudan doğru yere gider. Aynı veriyi çiftlerden oluşan bir listede tutsaydınız, şehri bulmak, anahtarı şehir olan çifte ulaşana kadar listenin tamamını baştan okumak demek olurdu.
Üç üyede bu fark görünmez. Üç bin üyede, hele o arama bir döngünün içindeyse, bir sayfayı yavaşlatan şey tam olarak budur. Müşteri sitelerinde gördüğümüz yavaş kodun çoğu tam olarak bu türdendir: bir döngü içinde doğrusal arama, tek bir anahtarın yeteceği yerde.
Aynı derecede önemli ikinci bir özellik: anahtar değişmez. Ekleme ve silmeyle kayan liste dizininin aksine, anahtar anahtar olarak kalır. Sonradan belirli bir üyeye dönmeniz gerekiyorsa, gerçekten ihtiyacınız olan tek özellik budur ve bu dersin son bölümü bunun pratikte ne kadar ciddi olduğunu gösteriyor.
Numara mı anahtar mı? Fark, veri değiştiğinde ortaya çıkar
Liste: adres bir numaradır
numaralar sıfırdan başlar
- Numara şu an nerede durduğunu söyler
- Bir üyeyi silin, sonraki her numara değişir
Sözlük: adres bir anahtardır
anahtarı siz seçersiniz
- Anahtar üyenin kim olduğunu söyler, nerede olduğunu değil
- Ne eklenirse silinirse silinsin anahtar aynı kalır
ve fark burada kendini gösterir
Belirli bir üyeyi bulmak
genelde bir döngü içinde yapılan iş
- Listede: bulana kadar baştan oku
- Sözlükte: doğrudan anahtara git
Hiç değişmeyen veride bu ikisi denktir ve seçim gerçekten bir zevk meselesidir. Fark, bir şeyin silindiği ya da eklendiği anda başlar.
Küme: yalnızca var mı yok mu bilmek istediğinizde
Küme, belirli bir sırası olmayan birkaç benzersiz şeydir. İki işi çok iyi yapar, diğer bütün işleri hiç yapmaz: tekrarları siler ve bir şeyin içinde olup olmadığını hızla yanıtlar.
tags = {"seo", "speed", "seo"}
print(len(tags))
print("seo" in tags)Üçüncü satır üç değil iki yazdırır, çünkü tekrar eden öğe içeri girdiği anda düştü. Bu davranış kümeyi yararlı kılan şeydir ve dikkat etmezseniz verinizi sessizce küçülten şey de odur; tekrarlar sizin için bir şey ifade ediyorsa küme yanlış biçimdir.
Şimdi gerçek dünyadan bir örnek, bu sitenin kendi kodundan. PHP'de küme diye bir veri tipi hiç yok. Bu yüzden bir kümeye ihtiyaç duyduğumuzda, anahtarları izlemek istediğimiz şeyler olan ve değerleri zerre kadar önemsiz olan bir diziden kuruyoruz:
$used = array();
// ... her başlık için bir kimlik kuran bir döngünün içinde:
while ( isset( $used[ $id ] ) ) {
$id = $base . '-' . $n++;
}
$used[ $id ] = true;Şu true değerine bakın: programın hiçbir yerinde okunmuyor. Gerçekte saklanan şey anahtarın kendisi, yani "bu kimlik daha önce kullanıldı". Bu, eldeki araçtan kurulmuş bir kümenin tanımının ta kendisidir. Ve burada listenin işe yaramamasının nedeni önceki bölümdeki nedendir: isset doğrudan anahtara gider, oysa kimlikler listesinde bir kimlik aramak, her başlık için bir kez çalışan bir döngünün içinde, listenin tamamını okumak demektir.
Hangisi nereye?
Yukarıdaki üç biçim, artı adı henüz geçmemiş olan demet, ilk yılda ihtiyaç duyacağınız hemen her şeyi kapsar. Demet, tek bir farkla bir listedir: kurulduktan sonra değiştirilemez. Doğası gereği değişmemesi gereken şeylere uyar; bir enlem ve boylam çifti gibi.
| Biçim | Sıralı mı? | Tekrar kabul eder mi? | Ucuza yanıtladığı soru |
|---|---|---|---|
| Liste | Evet | Evet | Üç numaralı üye hangisi? |
| Sözlük | Ekleme sırası | Tekrar eden anahtar yok | Bu anahtarın değeri nedir? |
| Küme | Hayır | Hayır | Bu üye burada var mı? |
| Demet | Evet | Evet | Liste ile aynı, ama değişmeyeceği garantili |
Son sütun bu tablonun en önemli sütunudur ve gerisi yalnızca onu açıklar. Hangisini seçeceğinizden emin değilseniz, bu veriye sonradan soracağınız cümleyi yazın ve hangi satıra düştüğüne bakın.
Ve alışılmış eğitimlerle pek uyuşmayan bir tutum: günlük web işinde sözlük listeden daha sık karşınıza çıkar ve olması gerekenden daha az kullanılır. Yeni başlayanlar her şeyi listelere doldurur, çünkü ilk öğrendikleri şey listedir; sonra tek bir üyeyi bulmak için onları döngüyle gezerler. Yalnızca bu alışkanlığı değiştirin, sonradan yazacağınız yavaş kodun önemli bir bölümü hiç yazılmasın.
Gerçek bir karar: bu derslerin yayın defteri neden bir liste değil
Şu anda okuduğunuz öğrenme bölümü derslerini bir programa göre teker teker yayımlıyor: günde üç ders, on altı yol arasında sırayla. Bu sıraların düzeni saklanmıyor; her seferinde derslerin kendisinden yeniden hesaplanıyor.
Ve tam orada gerçek bir sorun var. Boş olan bir yol doldurulduğunda, yeni dersleri kuyruğun ortasına oturur ve onlardan sonraki her dersin konumu bir basamak öne kayar. Şimdi, neyin yayımlandığını kaydeden defterin bir konum listesi olduğunu, hatta ilk beşinin çıktığını söyleyen bir sayı olduğunu düşünün. Dün yayımlanan bir ders, bugünkü kaymadan sonra artık ilk beşte olmazdı; listeden düşer ve sayfası ziyaretçi için 404 verirdi.
Bu yüzden defter bir sözlük. Anahtarı dersin kendi adresi, değeri ilk çıktığı an. Bu dersin denetlendiği gün beş anahtar tutuyordu ve ilki şuydu:
'seo/how-search-engines-work' => 1788539040Şimdi kuyruk ne kadar değişirse değişsin bu anahtar yerinde kalır, çünkü anahtar hiçbir zaman kuyruktaki bir konum değildi; dersin kendi adıydı. Bütün hikaye tek cümlede: liste üçüncü sırada ne olduğunu yanıtlar, sözlük ise bu belirli dersin ne zaman çıktığını yanıtlar. Kuyruk yeniden kurulduğunda hala bir anlamı olan yalnızca ikinci sorudur.
Bu, bu dersin ilk bölümünün söylediği şeydir, yalnızca bu kez gerçek bir sayfa üzerinde: yanlış seçim programı bozmazdı. Program çalışırdı ve bir sabah yayımlanmış birkaç sayfa sessizce yok olurdu.
Kuyruk yeniden kurulduğunda ne kayar, ne kaymaz
-
1
Yeni bir yol doldurulur
Bölüme birkaç yeni ders eklenir.
-
2
Kuyruk yeniden hesaplanır
Sıralar yollar arasında sırayla dizilir.
-
3
Yeni dersler kuyruğun ortasına oturur
Onlardan sonraki her dersin konumu bir basamak öne kayar.
-
4
Listeyle: dünkü ders yok olur
Artık ilk beşte olmadığı için listeden düşer ve sayfası 404 verir.
-
5
Anahtarla: hiçbir şey kaymaz
Anahtar hiçbir zaman bir konum değildi; dersin kendi adıydı.
Bu yol bu öğrenme bölümü için gerçektir, ama sondaki arıza hiç yaşanmadı; defter en baştan anahtarlıydı. Yanlış seçimin neye benzeyeceğini göstermek için çizildi.
Yapay zekayla hızlı yol
Bu konuda gerçekten hızlanan şey bir liste ya da sözlük yazmak değil, çünkü o zaten hiç yavaş değildi. Hızlanan şey, programınızda hali hazırda duran verinin yanlış biçimde tutulduğunu fark etmek. Bu eskiden yılların deneyimini isterdi, şimdi tek bir mesaj alıyor; yeter ki doğru soruyu sorun: "bu kodu iyileştir" demeyin, "bu veri hangi soruları yanıtlamak için kullanılıyor" deyin. Bu bir yargı işi, dolayısıyla üst sınıf bir model ister; kodlama modelleri arasındaki güncel tercihimiz bu sitenin yapay zeka bölümünde.
- Verinin kurulduğu yeri, okunduğu her yerle birlikte kopyalayın. Bir veri yapısı, oluşturulduğu yere bakılarak değerlendirilemez; belirleyici olan ona sonradan sorulan sorudur ve o soru başka bir yerde yazılıdır.
- Aşağıdaki reçeteyi gönderin ve herhangi bir öneriden önce yalnızca sorular tablosunu okuyun. O tabloda programınızın sorduğunu düşünmediğiniz bir soru varsa orada durun; muhtemelen kodunuzun gerçekte ne yaptığını yeni öğrendiniz.
- Biçimi değiştirme önerisini yalnızca karşılık gelen soruyu tabloda gördüğünüzde kabul edin. Kimsenin pahalı bir soru sormadığı veriyi yeniden biçimlendirmek, kazançsız saf risktir.
- Değişiklikten sonra, bir yere numara ya da konum kaydetmiş her yeri arayın. Sessizce kırılan yerler bunlardır, çünkü biçim değiştiğinde kaydettiğiniz numara artık aynı üyeyi göstermez.
Kopyalamaya hazır şablon
Aşağıdaki verinin doğru biçimde tutulup tutulmadığını bilmek istiyorum. Kodu değiştirme.
Verinin kurulduğu yer:
{kodu buraya yapıştırın}
Okunduğu yerler:
{bu verinin kullanıldığı her yeri buraya yapıştırın}
Önce, yalnızca şu üç sütunlu bir tablo ver, başka hiçbir yorum ekleme:
| Kodun bu veriye sorduğu soru | Nerede soruluyor | Yanıtlamak için ne yapılıyor |
Tablodan sonra:
1. Bu sorulardan hangisinin pahalıya yanıtlandığını, yani yanıtlamak için kümenin tamamının okunduğunu söyle.
2. Biçim değişmeliyse, neye değişmesi gerektiğini ve tablonun hangi satırını ucuzlattığını söyle.
3. Mevcut biçim doğruysa bunu söyle ve nedenini yaz. "Her şey yolunda" da kabul edilebilir bir yanıttır.
4. Üyelerin numarasına ya da konumuna dayanan ve biçim değişirse kırılacak her yeri listele.
Bunlardan biri için sana vermediğim bir koda ihtiyacın varsa hangisi olduğunu söyle; tahmin etme.
Çıktıya güvenmeden önce: Üçüncü madde bilerek orada ve onu çıkarmak, yanıtın her zaman bir değişiklik önerisi olması demektir; çünkü modelden öneri istediniz ve o da bir tane veriyor. Gerçek bir programdaki verinin çoğu doğru biçimdedir ve onu değiştirmek saf risktir. Dördüncü madde de tesadüfen orada değil: bir yeniden biçimlendirmeyi sessizce bozan tek şey, bir üyenin numarasını kaydetmiş ve değişiklikten sonra o numaranın başka bir üyeyi gösterdiği bir yerdir. O yerleri kendiniz görmeden değişikliği uygulamayın.
Bu işte yapay zeka
Bir liste ya da sözlük kurmak, bir dil modelinin yanlış yaptığı bir şey değil; bu yapılar eğitim verisinde o kadar çok tekrarlanır ki onları üretmek artık bir beceri değil. Size kalan şey başka yerde: hali hazırda sahip olduğunuz verinin doğru biçimde tutulup tutulmadığını fark etmek ve bu fark ediş veriden değil, kodun ona sorduğu sorulardan gelir. Tutumumuz, modeli bir yapı önermek için değil, o soruları saymak için kullanmaktır: saymak onun iyi yaptığı ve sizin sabrınızın olmadığı iştir; seçmek ise onun programın yalnızca bir parçasını görerek yaptığı, sizinse tamamını bildiğiniz iştir.
Gerçekten işe yarayan araçlar
- Claude Code Bu konuya en uygunu, çünkü "bu veri nerede okunuyor" sorusunun yanıtı ancak deponun tamamı görünürken vardır ve tek bir parça yetmez. Ücretsiz kuruluyor ama bir Claude aboneliği ya da Anthropic Console hesabı olmadan çalışmıyor ve İran desteklenen ülkeler listesinde yok.
- Claude Kodu kendiniz yapıştırdığınızda iyi bir seçim ve hızlı yoldaki soru tablosunu kurma işini görüyor. İran, Anthropic'in iki desteklenen ülke listesinin hiçbirinde yok; bunu ağ testiyle değil, Anthropic'in kendi sayfasında okuduk.
- Gemini Çalışma modu Guided Learning, yanıt vermek yerine soru soruyor; bu da bu dersin özü olan dizin ile anahtar farkının oturması için hazır bir yanıttan daha iyi işliyor. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
Nerede geri teper
Bu konudaki somut riskle pratikte yeterince karşılaştık: "bu kodu iyileştir" deyin, model neredeyse her zaman yapısal bir değişiklik önerir; çünkü öneri istediniz ve "her şey yolunda" ona yararlı bir yanıt gibi görünmez. Oysa gerçek bir programdaki verinin çoğu doğru biçimdedir ve onu değiştirmek yalnızca risk ekler. Bunu kapatmanın yolu hızlı yol reçetesine yazılmış durumda: "değişiklik gerekmiyor" yanıtının kabul edilebilir olduğunu açıkça söyleyin.
İkinci risk daha kesin. Model bir listeyi sözlüğe çevirmeyi önerdiğinde, genelde yalnızca verinin kurulduğu yeri görür, okunduğu her yeri değil. Bir kod bir yere bir üyenin numarasını kaydetmişse, o kod değişiklikten sonra sessizce yanlış üyeyi gösterir ve hiç hata üretilmez. Anthropic, modelin görmediği şey hakkındaki bu tür güveni kendi belgelerinde halüsinasyon diye adlandırıp azaltma yollarını anlatıyor. Bu araçların İran'dan nasıl ödenebileceği için satın alma rehberine bakın; kodlama modelleri arasındaki güncel tercihimiz için kodlama için en iyi yapay zeka sayfasına bakın.
Kaynaklar: Anthropic: reduce hallucinations Anthropic: supported countries Claude Code: overview and install Google: where the Gemini web app is available
Bu tavsiyenin sınırı
Bu ders bilerek günlük iş düzeyinde yazıldı ve sınırını açıkça söylüyoruz. Birincisi, bu sayfanın hiçbir yerinde hesaplama karmaşıklığına ve büyük O gösterimine girmedik. Okuduğunuz "ucuz" ve "pahalı" kelimeleri ölçüm değil, betimlemedir ve hız hakkında hiçbir sayı vermiyoruz, çünkü bunu bu sunucuda ölçmedik. İkincisi, herhangi bir veri yapıları kitabında sırada gelen yapılar burada yok: yığınlar, kuyruklar, ağaçlar, çizgeler ve öncelik kuyrukları. Her biri belirli bir soruyu ucuzlatır ve o soruyla karşılaştığınız gün ne aradığınızı kendiniz anlarsınız. Üçüncüsü, adlar ve garantiler diller arasında değişir: PHP'de hem liste hem sözlük olan tek bir dizi tipi vardır, JavaScript'te ise nesneler ve Map farklı davranışlara sahip iki ayrı şeydir. Son olarak, bu ders tek bir programın belleğine sığan veriyle ilgilidir; veri belleği aştığında konuşma veri yapılarından veritabanlarına geçer ki bu başka bir dersin konusudur.
Kendi işimizden
Bu dersteki iki örnek de bu sitenin kendi kodundan geliyor ve bu sayfanın denetlendiği gün yeniden okundu. Birincisi diziden kurulmuş küme: $used[ $id ] = true; ifadesi üç tema dosyasında geçiyor; inc/editorial.php, inc/helpers.php ve inc/diagram-posts.php, ve üçünde de doğrudan bir while ( isset( $used[ $id ] ) ) altında duruyor. true bu üç yerin hiçbirinde okunmuyor; saklanan şey anahtarın kendisi. İkincisi ise tam da bu öğrenme bölümünün yayın defteri: rgbl_announced adlı bir veritabanı seçeneği; bu dersin denetlendiği gün beş anahtar tutuyordu ve biçimi tam olarak şu: bir ders adresinden bir zaman damgasına. İki örneğin birlikte gösterdiği ve hiçbir giriş kitabının yazmadığı şey şu: pratikte çoğu zaman bir veri yapısı seçmezsiniz, dilinizin verdiği şeyden bir tane kurarsınız; gerçekten seçtiğiniz şey her üyenin adresinin ne olacağıdır ve veri değiştiğinde neyin kırılacağına karar veren şey o seçimdir.
Gerçek devam soruları
Dizi ile liste arasındaki fark nedir?
Günlük konuşmada aynı şeydirler ve ad dile bağlıdır: Python ona liste, JavaScript ve PHP dizi der. Kesin konuşursak, bazı dillerde dizinin boyutu sabittir, liste ise büyüyüp küçülebilir. Başlangıçta bu ayrımı dert etmenize gerek yok; önemli olan sıranın korunması ve her üyenin adresinin bir numara olmasıdır.
Veriyi ne zaman listeden sözlüğe taşımalıyım?
Belirli bir üyeyi bulmak için döngü kurduğunuzu fark ettiğinizde. O döngü, tam olarak bir anahtarın işi göreceği yerdir. Ama veriyi yalnızca baştan sona geziyor ve hiçbir zaman belirli bir üyeyi ayrıca istemiyorsanız, ihtiyacınız olan şey listedir ve onu değiştirmek saf risktir.
Başlamak için veri yapılarını ve algoritmaları ciddi çalışmam gerekir mi?
Başlamak için hayır. Bu üç biçim ve her birinin hangi soruyu ucuza yanıtladığını bilmek, pratik işin ilk yılını kapsar. Ciddi çalışma iki yerde gerekli olur: veriniz büyüyüp gerçek bir yavaşlıkla karşılaştığınızda ve bir iş görüşmesine hazırlandığınızda; ikincisinin ne yazık ki günlük işle pek ilgisi yoktur.