Programcılar veri yapılarını ve algoritmaları nasıl öğrenmelidir?

Yazar | Shuaidi

Baş Editör | Guo Rui

Veri yapılarının ve algoritmaların önemi programcılar için apaçık ortadadır. Bu makale veri yapılarını ve algoritmaları nasıl öğrendiğimi paylaşacaktır. Umarım size yardımcı olur.

Algoritmayı öğrenmenin kısayolu daha fazla soru yazmaktır

Kısayol demek için, ayaklarınızı yerde tutmak ve daha fazla soru sormak olduğunu düşünüyorum.

Ancak acemiyseniz, yani ortak veri yapılarını (bağlantılı listeler, ağaçlar gibi) ve ortak algoritma fikirlerini (özyineleme, numaralandırma, dinamik programlama gibi) bile öğrenmediyseniz, o zaman size tavsiye etmiyorum Doğrudan soruya gidin. Bunun yerine, önce bunları öğrenmek için bir kitap bulun ve sonra probleme gidin.

Diğer bir deyişle, soruları fırçalamak için leetcode gibi sitelere gitmek istiyorsanız, öncelikle belirli bir temele sahip olmanız gerekir. Bu vakıflar şunları içerir:

  • Ortak veri yapısı: bağlantılı liste, ağaç (ikili ağaç gibi).
  • Yaygın algoritma fikirleri: açgözlü yöntem, böl ve yönet yöntemi, ayrıntılı yöntem, dinamik programlama, geriye dönük izleme yöntemi.

Yukarıdaki liste en basit olanıdır. Yani, soruları fırçalamadan önce, bunlardan tekrar geçmeli ve sonra soruları fırçalamalısınız. En temelini bile bilmiyorsan, o zaman soru yazma sürecinde çok acı çekeceksin ve görece az fikrin olacak.

Kısacası endişelenmeyin, önce bu temel bilgileri gözden geçirin, anlamaya çalışın ve sonra sorulara gidin. Bu temel veri yapılarını ve algoritmaları kitap okuyarak öğrendim. O sırada okuduğum kitaplar:

  • Algoritma analizi ve analiz temeli: Bu kitap nispeten basittir ve yeni başlayanlar için önerilir.
  • Veri yapısı ve algoritma analizi-C dil açıklaması: Kod C ile yazılmıştır, okumanız tavsiye edilir.
  • Challenge Programming Competition (İkinci Baskı): Aynı zamanda çok iyi bir kitap, okumanız tavsiye edilir.

Dürüst olmak gerekirse, veri yapıları ve algoritmalar üzerine neredeyse bir süre harcadım, ancak çok az soru yaptım, sadece kitaplarda bazı örnekler. Bu temel bilgileri inceledikten sonra, soruları tazelemek için bazı web sitelerine gittim ve hala çok iyiydi. Öyleyse, bu fikirleri çalışmayı bitirdikten sonra, soruları okumada çok iyi olacağınızı düşünmeyi beklemeyin Sadece daha fazla soru okuyarak ve daha fazla uygulamalı uygulama yaparak duyarlılığınız artacaktır.

Özetle, veri yapısını ve algoritmaları iyileştirmek için kısayollar yoktur, en iyi kısayol daha fazla soru yazmaktır. Bununla birlikte, soruları fırçalamanın öncülü, önce bazı temel veri yapılarını ve algoritma fikirlerini öğrenmeniz gerektiğidir.

mükemmelliğin peşinde

Nasıl soru yazılır? Bir algoritma problemi nasıl tedavi edilir?

Bence bir soru üzerinde çalışırken mükemmellik için çabalamalısın, tamamlandıktan sonra soru göndermeyin ve bir sonrakine acele edin.

Algoritma yeteneğinin gelişmesi ile soru sayısı arasında belirli bir ilişki vardır, ancak doğrusal değildir. Diğer bir deyişle, bir problemi çözerken, bir problemle birden fazla problemi çözmeye çalışın Eğer gerçekten başka yollar düşünemiyorsanız, gidip başkalarının nasıl yaptığını görebilirsiniz.Başkalarının uygulamalarını taklit etmenin utanç verici olduğunu düşünmeyin.

Soruları yaptığımda, belki de ilk fikir bunu çok kaba bir şekilde yapmaktı, çünkü birçok sorunun şiddet yöntemiyle yapılması kolaydır, ancak zaman karmaşıklığı çok yüksektir. Bundan sonra, yavaş düşüneceğim ve zaman karmaşıklığını veya uzay karmaşıklığını azaltmanın başka yolları olup olmadığını göreceğim. Son olarak, diğer insanların uygulamalarına bakacağım, elbette her sorun bu şekilde uygulanmayacaktır.

Bir algoritma probleminin kalitesini ölçmek, zaman karmaşıklığından ve uzay karmaşıklığından başka bir şey değildir, bu yüzden mükemmellik için çabalamak istiyorsak, bu ikisini en aza indirmeliyiz ki birbirlerini tamamlasınlar.

Bir örnek vereyim:

Bir kurbağa bir seferde bir veya iki adıma kadar atlayabilir. Kurbağanın n seviyeli bir adıma atlaması için kaç tane atlama yöntemi vardır?

Yöntem 1: Şiddetli özyineleme

Bu soru zor değil, belki aşağıdaki yaklaşımı benimseyeceksiniz:

public static int çözüm (int n) { eğer (n == 1 || n == 2) { dönüş n; } else if (n < = 0) { dönüş 0; }Başka{ dönüş çözme (n-1) + çözme (n-2); } }

Bu yaklaşımın zaman karmaşıklığı çok yüksek, üstel. Ama teslim olduktan sonra tesadüfen geçerseniz ve bir sonraki soruya geçerseniz, o zaman düşünmeniz gerekir.

İkinci Yöntem: Zaman için alan

Mükemmellik için çabalarken, zaman için yer kullanmayı düşünebiliriz: Bu soruyu dikkatlice düşünürseniz, çoğunun tekrarlandığını göreceksiniz. Böylece aşağıdaki yöntemleri uygulayabilirsiniz:

// Hesaplanan durumu kaydetmek için bir HashMap kullanın statik Harita < Tamsayı, Tamsayı > map = new HashMap (); public static int çözüm (int n) { eğer (n < = 0) 0 döndür; else if (n < = 2) { dönüş n; } else {// Hesapladınız mı if (map.containsKey (n)) { return map.get (n); }Başka{ int m = çöz (n-1) + çöz (n-2); map.put (n, m); dönüş m; } } }

Bu şekilde, zaman büyük ölçüde azaltılabilir. Başka bir deyişle, bir soruyu yanıtladıktan ve zaman karmaşıklığının çok yüksek olduğunu gördükten sonra, daha iyi bir yol olup olmadığını ve zaman için yer kullanıp kullanamayacağınızı düşünebilirsiniz.

Üçüncü Yöntem: Fibonacci dizisi

Aslında, alan karmaşıklığını daha küçük hale getirebiliriz ve durumu kaydetmek için HashMap'e ihtiyacımız yoktur:

public static int çözüm (int n) { eğer (n < = 0) dönüş 0; eğer (n < = 2) { dönüş n; } int f1 = 0; int f2 = 1; int toplam = 0; for (int i = 1; i < = n; i ++) { toplam = f1 + f2; f1 = f2; f2 = toplam; } getiri toplamı; }

Bu soruyu size göstermek için yaptım, bu sorunun nasıl yapılacağını öğretmek için değil, aşağıdaki amaçlarla:

  • Soru yazarken mükemmellik için çabalamalıyız.
  • Ya bu yöntemleri düşünemezsem? O zaman başkalarının ne yaptığını görebilirsiniz. Daha sonra benzer sorularla karşılaştığınızda daha fazla fikriniz olacak ve hangi yönde düşünmeniz gerektiğini bileceksiniz.
  • Bir problemi çözmek için basit bir şiddetle başlayabilir ve zaman ve mekan ölçümlerinde yavaş yavaş optimize edebilirsiniz.

Fırçalama web siteleri önerin

Genellikle Leetcode ve Niuke.com'a sorular yazıyorum, bu oldukça iyi hissettiriyor, ancak soruların zorluğu çok büyük değil.

Niuke.com'da esas olarak tekliflere atıfta bulunuyorum, ancak aynı zamanda çevrimiçi bir leetcode da var, ancak nispeten az sayıda soru var. Niuke.com'da soruları fırçalamak için en uygun yerlerden biri, çözümü bulmak için Baidu'ya gitmemize gerek kalmadan birçok büyük adamın problem çözme yöntemlerini paylaşacağı bir tartışma alanıdır. Yani onu bitirdikten sonra gerçekten düşünemezsiniz, başkalarının nasıl yaptığını kolayca görebilirsiniz. Leetcode'a gelince, soruların çoğu resmi olarak yanıtlanır ve aynı zamanda soruları tazelemek için iyi bir web sitesidir. İkisinden birini seçebilir veya her ikisini de fırçalayabilirsiniz.

Elbette, soruları yeniden yazmak için başka web siteleri de var, ancak diğer web siteleri yeniden kontrol edilmedi, bu yüzden nasıl yapılacağını bilmiyorum.

Veri yapısı hakkında konuşalım

Genelde algoritmaları nasıl öğrendiğim hakkında konuştum. Veri yapısı yönteminde, bağlantılı listeleri ve ağaçları (ikili yığın) öğrenmeniz gerektiğini, ancak bu en temel olanı ve soruları fırçalamadan önce ustalaşmanız gerektiğini sıraladım. Veri yapısı için daha önemli olanlardan bazılarını listeliyorum:

  • Bağlı listeler (tek bağlantılı listeler, çift bağlantılı listeler gibi).
  • Ağaçlar (ikili ağaçlar, dengeli ağaçlar, kırmızı-siyah ağaçlar gibi).
  • Grafik (en kısa yol için çeşitli algoritmalar gibi).
  • Kuyruk, yığın, matris.

Bunlar için kendin yapmalısın. Bir kitabı okuyabilir veya bir video izleyebilirsiniz. Acemiler önce videoyu izleyebilir, ancak yine de videoyu izlemenin erken aşamasında kitabı okumanız gerekir.

Örneğin dengeli bir ağaç için belki kitaptaki kodla uyguladıktan sonra bir süre sonra unutursunuz ama fark etmez unutmuş olsanız da, daha önce kodda uygulayıp anladıysanız, sonra tekrar gördüğünüzde, Çabucak hatırlayacak, fikirlerinizi çabuk anlayacak ve soyut yeteneğiniz bilmeden gelişecektir. Daha sonra kırmızı-siyah ağaçları ve veri yapılarını hızlı bir şekilde öğreneceksiniz.

Son olarak, yap, yap, yap. Önemli olanı üç kez söyleyin. Önce en temel bilgileri öğrenebilir ve ardından uzun vadeli bir ısrar olan soruları fırçalayabilirsiniz. Soru yazma sürecinde elbette diğer veri yapılarını da öğrenebilirsiniz.

Yazar: yakışıklı, okulda bir aşk programlama, benim dünyam sadece kodlama değil, yazma. Şu anda, algoritmalar ve veri yapıları, Java ve bilgisayar ağları yazmaya odaklanan "The Hardcore Code Farmer" abonelik hesabını sürdürüyor.

Feragatname: Bu makale yazarın kişisel bir katkısıdır ve telif hakkı kendisine aittir.

Önerilen Kaynaklar:

  • Google feda edildi!
  • Ren Zhiqiang, Liu Qiangdong adını verdi; Aç mısın ve Koubei birleşti; Tesla Mercedes-Benz'i geride bıraktı | Geek Manşet
  • Para kazanmak için programlamayı öğrenmeyi nasıl düşünüyorsunuz?
  • Boston dinamik robotu gökyüzüne karşı ve insanlar artık üçlü zıplamasını durduramaz!
  • Monkey King bir programcıya dönüştü, size "harici sıralama" öğretir
  • Web3.0 burada! Oynanış değişti
  • Ali Feizhu, Didi ve Ctrip'in büyük veriyi kötüye kullandığından neden şüpheleniliyor?

2018 AI Geliştirici Konferansı

AI Mühendisleri için Gerekli Konferans

2018 AI Geliştirici Konferansı, Çinli ve Amerikalı yapay zeka teknolojisi uzmanları tarafından ortaklaşa oluşturulan AI teknolojisi ve endüstrisinin yıllık bir etkinliğidir! Sadece teknoloji hakkında konuşuyoruz ve boş konuşmaları reddediyoruz!

İşte 10 teknik forum: Bilgisayarla görme, veri analizi, makine öğrenimi, bilgi grafiği, akıllı finans, akıllı sürüş, ses teknolojisi, akıllı tıbbi bakım, makine öğrenimi araçları, doğal dil işleme.

Ayrıca 15'ten fazla Silikon Vadisi güçlü öğretim görevlisi, 80'den fazla yapay zeka lider kurumsal teknoloji temel figürü, 100'den fazla teknik kitle medyası ve 1500'den fazla yapay zeka profesyonel geliştiricisi bulunmaktadır.

Konferans hakkında hızlı bir şekilde daha fazla bilgi almak ve en düşük indirimli biletleri almak için aşağıdaki QR kodunu tanımlayın!

Tıklamak "Orijinali okuyun" Ayrıca hemen kaydolabilirsiniz.

22 yılı dört gözle bekliyorum, Pekin Madencilik Tapınağının yeniden yerleşim evi, ilk gün% 93,1'i önceden imzalanmış olarak imza aşamasına girdi
önceki
Son kuğu şarkısı Mercedes-Benz, SLC sınıfı resmi haritanın son versiyonunu yayınladı
Sonraki
Yemeğiniz güvenli mi? Pekin, "emin olun Yeni Yıl akşam yemeği" incelemesini başlattı, doğrudan restoran mutfağına vurdu
JD 618'in en büyük kazananı Xiaomi, netizenlerin tepkisi de oldukça saçma!
Neden Java, JavaScript, Ruby'yi terk ediyorum ve yeni programlama dilleri arıyorum?
Kral olmaya devam edip önce Haval H6 Coupe'yi test edebilir mi?
Anneniz size uzun pantolon giymenizi söylüyor: Tmall Double 11% 34 artışla 4,74 milyon ürün satıyor
Beijing Daxing Yinghai Kasabası, yer değiştirme topluluğunda "kırmızı mülk" için yeni bir yönetim modeli oluşturuyor
One Piece bir tekneye biner ve Neptün bir çatal kullanır. Denizi fethetmek için Lincoln Navigator'a ihtiyacınız var!
Aylık 30k ~ 50k maaşla, bu alandaki yetenekler kapılıyor!
Çok bilgili! Kamyon gerçekten yakışıklı olacak, bir süper otomobil bile üç puanlık hayranlık içinde olmalı!
Google programcıları yapay zekayı nasıl araştırıyor?
Hem nominal değer hem de IQ çevrimiçi, Hisensein tarihteki en güçlü "grup ordusu" AWE2019'da şok edici bir şekilde göründü
90'ların sonrası küçük kurbağaların annesi olacak, mobil oyun pazarında kadın oyuncuların ne kadar potansiyeli var
To Top