Pratik bir durumda kullandığınız en karmaşık veri yapısı nedir? [kapalı]


17

Bu sorudaki mikrop, sektördeki birkaç geliştirici ile yaptığım bir tartışmadan geldi.

Birçok yerde proje yöneticilerinin karmaşık veri yapıları konusunda ihtiyatlı oldukları ve genellikle standart kütüphane / paketlerden çıkan her şeyde ısrar ettikleri ortaya çıkıyor. Genel fikir, performans ciddi şekilde engellenmedikçe halihazırda mevcut olanların bir kombinasyonunu kullanmak gibi görünüyor. Bu, kod tabanını basit tutmaya yardımcı olur, bu da diplomatik olmayanlar için "yüksek yıpranmaya sahibiz ve işe aldığımız yeni olanlar o kadar iyi olmayabilir" anlamına gelir.

Bu yüzden CS junkies için çiçek filtresi veya atlama listeleri veya yayvan ağaçları yok. İşte soru (tekrar): Ofiste yaptığınız veya kullandığınız en karmaşık veri yapısı nedir?

Gerçek dünya yazılımlarının ne kadar iyi / sofistike olduğunu anlamaya yardımcı olur.


Başkaları tarafından mı yoksa kendimiz tarafından mı yazılmış?

Benim asıl amacım, kendinin geliştirdiği şeydi, ama bence soruya ilginç bir boyut katıyor. Orijinal soru düzenlendi.
Fanatic23

Karmaşık yapmak, karmaşık olduğu anlamına gelmez. Daha basit = her zaman daha iyi.
tp1

En karmaşık olanlar her zaman STL'den temin edilebilirdi. Karmaşıklık genellikle türlerinden değil, iç içe veri yapılarından gelir. Basit yapı = profiler şikayet etmedikçe iyi.
Kodlayıcı

Gereksiz değer değerlendirmesi için -1. Şunu da söyleyebilirim: bu günlerde, veri yapılarını kendiniz uygularsanız, aptal ve inatçısınız. Bir veri yapısını yanlış şekilde uygulayabileceğini düşünen bir sonraki akıllı çocuk olmayın.
Pieter B

Yanıtlar:


7

Arama için atlama listelerini kullandınız. Çalıştığım yerde standart bir uygulama var ve herkes bunu kullanmaya teşvik ediliyor. Patricia, IP adreslerini verimli bir şekilde saklamak ve almak için kullanmıştır. Yine uygulama zaten mevcuttu.


7

Ben Java geliştiricisiyim. Java Collection Framework ,% 90 veri yapısı problemlerimi çözebilir, diğer% 10 çaba gerektirir. Uzmanlar tarafından yazılan sofistike standart lib'i gerçekten anlarsanız, çoğu durumda yardımcı olduklarını göreceksiniz.

Karmaşık veri yapılarının gerçek dünyada bakımı zordur. Kodu karıştırmaktan kaçınmak için, bir problemi daha küçük olanlara bölerim. Her küçük problem Java Collection Framework ile çözülebilir . Belki de çözüm en akıllısı değildir (daha fazla bellek ve daha yavaş gerekir), ancak çalışır ve bakımı kolaydır. Bu değiş tokuş.

Karmaşık veri yapısı yazmam gerekiyorsa ders kitabını alacağım :)


4

İşte kullandığım en karmaşık veri yapısı üç katıydı. Ancak, bu yirmi yıl önceydi.

Endüstriyel yazılım geliştirmeyle ilgili sorun, endüstriyel programcıların çoğunun bilgisayar bilimi (CompSci) mezunları olmamasıdır; bu nedenle ortalama CompSci derecesinin aldığı tekniklerin ekmek ve tereyağı programcılarının bakımı için çok zor olduğu düşünülmektedir.

Sektördeki genel CompSci bilgisinin eksikliği ciddi bir sorundur. Örneğin, tanıştığım yazılım geliştiricilerinin sayısını (a! = 5 && b! = 3) ve a == 5 || b == 3 mantıksal olarak eşdeğerdir. DeMorgan Teoreminin nasıl uygulanacağını bilen herkes, bu ifadelerin mantıksal olarak eşdeğer olduğunu anlayabilir. CompSci üyesi olmayan mezunların çoğu DeMorgan Teoremini hiç duymamıştır. Herhangi bir önemli kod tabanı araştırılırsa, negatif mantıksal alt ifadeleri reddeden ifadelerin birçok örneği bulunur. Negatif negatif mantıksal alt ifadeler içeren kodun okunabilirliği, bu ifadelerin negatif olmayan biçimlerine dönüştürülmesiyle neredeyse her zaman geliştirilir.


5
"Aşağı" oy kullanan herkese tavsiyem, birinin neden "aşağı" oy verdiğini belirten bir yorum eklemesidir. Farklı görüşlere sahip biriyle başa çıkabilirim. Ancak idare edemediğim şey korkaklık.
bit-twiddler

2
@ bit-twiddler De Morgan'ın Teoremini Felsefe derecemde öğrendim. Şimdi CS yapıyorum, bundan bahsedilmedi. Dürüst olmak gerekirse, bu tür şeyleri en iyi deneyimle gelen bir stenografi olarak görüyorum. Bir denklemi çarpanlarına ayırırken uyguladığınız kuralları (ve ismiyle!) Gerçekten hatırlamanız gerekiyor mu? Seni bilmiyorum, ama bunu önümde olan şeylere dayanarak yapıyorum ve ezberden değil. Aynı şey mantıksal ifadeleri değiştirmek için de geçerlidir.
Rupert Madden-Abbott

2
@Rupert: De Morgan Teoremi genellikle ayrık matematik ve bilgisayar organizasyonu kapsamındadır (her ikisi de ABD'de lisans dersleri gereklidir). Lisans olarak bilgisayar mimarisi / sistem yazılımları üzerine yoğunlaştım. De Morgan teoremi dijital mantık tasarımında yoğun olarak kullanılmaktadır. Düşük seviyeli yazılım geliştirmede De Morgan Teoreminin bilinmesinin kritik hale geldiği alanlar vardır. Örneğin, tam bir Boolean yönergesi seti içermeyen en az yönerge kümesi bilgisayarı vardır; bu nedenle, biri bir Boole işlemini diğerinden türetebilmelidir.
bit-twiddler

1
(devamı) İşte bilgisayar dışı bilim / bilgisayar mühendisliği / elektrik mühendisliği (bilgisayar mühendisliği konsantrasyonu) notlarının ya açık bir şekilde başarısız olduklarını ya da cevap vermeleri çok uzun sürdüğü bir test. Yalnızca NAND (negatif) işlemi verildiğinde, şu Boole işlemlerini türetin: NOT, AND, OR, NOR, XOR ve XNOR. De Morgan Teoremini bilmek, bu altı Boole operasyonunu türetmeyi çok daha kolay hale getirir. De Morgan Teoremi, dijital mantık tasarımında kolayca en önemli teoremdir.
bit-twiddler

1
..... Her ne kadar adil olsa da, bir sürü işin küçük işletmeler için yarım yamalak RoR uygulamaları yazmaya başladığı bir endüstride, 1000000000'de, hatta HEARD'a bile ihtiyaç duyacağınız yaklaşık 1 kez var. mantık kapıları ve boolean cebiri kavramları, sadece "veya" ve "ve" ingilizce kelimelerinin anlamını bilmek yerine. bu şeylerin CS çalışması mı yoksa karmaşık algoritmalar mı, optimizasyonlar mı yoksa düşük seviyeli programlama mı yaptığınızı bilmekle alakası yoktur, ancak programcı olarak çalışanların çoğunluğu için bu işe yaramaz önemsiz şeylerdir.
sara

2

Bir keresinde, profil oluşturmanın mevcut yığının bir darboğaz olduğunu gösterdiği olaya dayalı bir simülasyon için bir takvim kuyruğu (O (1) öncelik kuyruğu) yazdım.

Ayrıca, yaklaşık 80000 eyaletli sonlu durum makinesi içeren bir ürün de piyasaya sürdüm - en az söylemek gerekirse, bunu üretmek için kod biraz zordu.


2

Uzun, uzun, önce, bir galakside ... Knuth'un "arkadaş arabelleklerini" montajcıda bir RTOS'da kullanan bir ekip üzerinde çalıştı.

Ayrıca, 1024 x 1024 dünyası için 256 nesil Conway'in Hayat Oyunu.


1

Gerçekten çok özel bir şey kullanmadım, sıfırdan iki katına çıkmış bir liste olurdu .

Çok heyecan verici değil, başka yapılar kullandım. Ama sorunuz sıfırdan söyledi.


C ++ 'da, bu std::listve gerçekten karmaşık bir şey yok: / Kırmızı-siyah ağacı / AVL ağacını çok daha karmaşık buluyorum, tüm bu yeniden dengeleme koşulları ile!
Matthieu M.

@Mathieu std :: map ve büyük olasılıkla bir rb ağacı alacaksınız.
aufather

1

Genel finansal veri listelerini içeren bir karma ağaç - sormayın bile. Bazen keşke kovboy olsaydım. Ah, yıldızların altındaki basit yaşam ...


gözlük kaldırır "Sevgili Tanrım."
Len Joseph

1

Sudoku çözücü için Dancing Links Algoritması için sıfırdan Dairesel Çift Bağlantılı Liste yapısı yazmak zorunda kaldım . Bir Rubik küpü tasarlamak gibiydi. Tüm yapı temel olarak bir liste listesiydi - her bir düğüm diğer dörtünü işaret ediyordu.


1
Bir kaba kuvvet geri izleme algoritması bulmacayı veriye girebildiğinizden daha hızlı çözdüğü için bu bir Sudoku çözücü için aşırıya kaçış gibi geliyor.
kevin cline

3
@kevin, dans eden bağlantılar kaba kuvvetli bir geri izleme algoritmasıdır - ama makul bir buluşsal yöntemle.
Peter Taylor

Toplam çözüm sayısını sıralamak ve bir Sudoku'nun sadece 1 benzersiz çözümü olduğunu iddia etmek gibi şeyler yapacaksanız bir buluşsal yöntem gerekir.
ProdigySim


0

Bir düşünce verdikten sonra, sıfırdan yaptığım en "karmaşık" veri yapısı, çift bağlantılı listelere dayanan bir elemanlar ağını modellemek. Ancak yıllar önce sistem düzeyinde programlama yapıyordum.

Bugünlerde neredeyse hiç fantezi veri yapıları oluşturmuyorum. Çoğu, bir tabloya ne koyduğunuza karar verdiğiniz veritabanında gerçekleşir, belki de önceden hesaplanmamış bir değer, belki de gereksiz aramalardan kaçınmak için hızlı erişim için bazı ilgili kayıtların kimliği.

Şahsen eldeki görevin araçları tanımladığı şey. Kullanılmıyorsa neden bazı egzotik veri yapılarından faydalanmaya çalışıyoruz? Ve pratik uygulamalı programlamanın çoğunda söyleyebilirsem, muhtemelen tekerleği yeniden keşfetmeye gerek yoktur.


Amacım, bazı egzotik veri yapısını zorlamak değildi. Ama kutudan bir şeye ihtiyacın olduğunda ve şirket politikasının gerektirdiği için zaten mevcut olanlarla uğraşmak üzücü bir durum.
Fanatic23

0

Öncelik kuyruğu geçerli mi? Bu yazdığım neredeyse her gerçek zamanlı uygulamada ortaya çıkıyor. Sadece son zamanlarda standart Java kitaplığının bir parçası oldu (Java 1.5).

Bunun dışında, gerçekten bir kütüphaneden çıkamamamı istediğim karmaşık bir şey düşünemiyorum. Bunun beni durdurmasına izin vermem, ama kütüphanelerin dahil etmesi için neden çok egzotik bir veri yapısına ihtiyaç duyduğumu sorgularım. Bir trie veya çiçek filtresi veya mevcut bir açık kaynak uygulamasını kendim yazmaya çalışmadan önce kesinlikle ararım.

Genel olarak, müdürünüze, kütüphane sürümü olmayacak kadar özel bir veri yapısı oluşturma ve sürdürme maliyetinin, bundan elde edilen herhangi bir performans avantajından daha ağır basması muhtemel olduğunu kabul ediyorum. Profilleme yoluyla, düz kütüphane yapılarının, devam etmenize ve onları süslü bir şeyle optimize etmenize izin vermeden önce önemli bir performans cezasına neden olduğunu göstermenizi istiyorum. Çünkü genel bir kural olarak, işlemci döngülerini satın almak mühendislik döngülerinden daha ucuzdur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.