Lütfen bana yığının ne olduğunu sorma

Yazar | Code Hai

Kaynak | Code Sea (ID: seaofcode)

Heap, üretimde çok önemli ve pratik bir veri yapısıdır ve aynı zamanda röportajlarda Top K arama gibi sorular için çok popüler bir test sitesidir.Bu makale, yığının temel işleyişini ve üretimdeki ana uygulamasını kapsamlı bir şekilde tanıtmayı amaçlamaktadır. Göreceğinize inanıyorum Ödüllerle dolu olmalı!

Bu makale, yığını aşağıdaki yönlerden açıklayacaktır:

  • Üretimde yaygın sorunlar

  • Heap'un tanımı

  • Yığının temel çalışması

  • Yığın sıralama

  • Üretimde uygulama

Üretimde sıklıkla aşağıdaki yaygın sorunlarla karşılaşıyoruz:

  • Öncelikli kuyruklar çok çeşitli uygulama senaryolarına sahiptir, nasıl uygulanır?

  • İlk K sorunu nasıl bulunur?

  • TP99, üretimde çok önemli bir göstergedir, nasıl hızlı hesaplanır

  • Tahmin edebileceğiniz gibi, üretimde yukarıdaki tüm yüksek frekans problemleri yığınla gerçekleştirilebilir, bu nedenle yığını anlamak ve temel işlemlerinde ustalaşmak çok önemlidir! Daha sonra, yığın ve ilgili işlemleri adım adım anlayacağız ve yığına hakim olacağız, üretimde yukarıdaki üç yüksek frekans problemi sorun olmayacak.

    Heap'un tanımı

    Yığın aşağıdaki iki özelliğe sahiptir:

  • Yığın, tam bir ikili ağaçtır, bu şekilde uygulanan öbek aynı zamanda ikili yığın olarak da adlandırılır.

  • Yığın içindeki düğümün değeri, alt düğümünün değerine eşit veya ondan büyüktür (veya ona eşittir), eğer öbekteki düğümün değeri alt düğümünün değerinden büyük veya ona eşitse, alt düğümünden küçük veya ona eşitse ona büyük üst yığın deriz Değeri, biz buna küçük üst yığın diyoruz.

  • Tam bir ikili ağacın ne olduğuna dair kısa bir inceleme, onun yaprak düğümleri son seviyededir ve bu yaprak düğümleri sola doğru sıralanmıştır.

    Yığının özelliklerinden, aşağıdaki şekilde 1, 2'nin büyük bir üst yığın olduğunu, 3'ün küçük bir üst yığın olduğunu ve 4'ün bir yığın olmadığını (tam bir ikili ağaç değil) görebiliriz.

    Şekilden de görülebileceği gibi, bir veri kümesi büyük bir üst yığın veya küçük bir üst yığın olarak temsil edilirse, farklı şekillerde temsil edilebilir, çünkü yalnızca düğüm değerinin alt düğüm değerinden büyük veya ona eşit (veya ondan küçük veya eşit) olmasını gerektirir ve sol ve sağ alt düğümler belirtilmez. Düğümlerin nasıl düzenlendiği.

    Yığının en alt katmanı nasıl temsil edilir? Yukarıdaki yığının girişinden, yığının tam bir ikili ağaç olduğunu ve tüm ikili ağacın bir dizi ile temsil edilebileceğini biliyoruz:

    Şekilde gösterildiği gibi: ikili ağacın tamamını yukarıdan aşağıya ve soldan sağa numaralandırın. Herhangi bir düğüm için, dizideki konumu i ise, sol ve sağ alt düğümlerinin dizide olduğunu bilmek kolaydır. Konum 2i, 2i + 1'dir. Bu şekilde, ağaçtaki her bir düğüm konumlandırılabilir, böylece tüm ağaç dizilir.

    Genel olarak bir ikili ağaç için, her düğüm, sol ve sağ alt düğümlerin işaretleyicilerini saklamaktır ve tüm ikili ağacın özelliklerinden dolayı (yaprak düğümler son katmandadır ve bu yaprak düğümleri sola sıralanır), onu temsil etmek için bir dizi kullanılır. Uygun.Ancak, depolama için dizileri kullanmanın avantajları nelerdir? Sol ve sağ düğümlere işaretçi depolamaya gerek olmadığından, ağaç çok büyük olduğunda çok fazla alan tasarrufu sağlanabilir!

    Yığının temel çalışması

    Yığının iki temel işlemi vardır: öbeği oluşturmak (öbeğe öğeler eklemek) ve üst öğeleri silmek. Sırasıyla bu iki işleme bir göz atalım.

    • Öğeleri öbeğe ekle

    Öğeleri öbeğe ekledikten sonra (aşağıda gösterildiği gibi), öbeğin özelliklerini karşılamaya devam etmemiz gerekir, bu nedenle öbeğin özellikleri karşılanıncaya kadar öğelerin konumunu sürekli olarak ayarlamamız gerekir (öbekteki düğümlerin değeri, alt düğümlerine eşit veya ondan büyüktür veya ona eşittir) Değer), öbek olarak öbek (öbekleme) olarak öbek özelliklerini karşılamak için bu öğelerin ayarlanması sürecini diyoruz.

    Yukarıdaki şekildeki yığın büyük bir üst yığın olduğundan, düğümleri büyük üst yığının özelliklerine uyacak şekilde ayarlamamız gerekir. Nasıl ayarlanır? Çocuk düğüm sürekli olarak ebeveyn düğüm ile karşılaştırılır ve eğer çocuk düğüm ebeveyn düğümden daha büyükse, bu işlemi değiştirir ve alt düğüm ebeveyn düğümünden daha küçük olana kadar bu işlemi tekrar eder. Yukarıdaki şekilde düğüm 11'i ekledikten sonra yığınlama işlemine bir göz atın

    Bu ayarlama yöntemi, önce öğeyi yığının sonuna eklemek ve ardından alt düğümün ve aşağıdan yukarıya yığın dediğimiz ana düğümün değerlerini aşağıdan yukarıya doğru sürekli olarak karşılaştırmaktır. Yukarıdaki diyagramla, istifleme için eleman eklemek için kod yazmak zor değildir:

    public class Heap { private int arr; // Yığın, tam bir ikili ağaçtır ve alt katman bir dizide saklanır private int Capacity; // Yığın içinde saklanabilecek maksimum eleman sayısı private int n; // öbekteki mevcut eleman sayısı public Heap (int count) { kapasite = sayı; arr = new int; n = 0; } public void insert (int değeri) { eğer (n > = kapasite) { // yığın boyutunu aşıyor, daha fazla öğe eklenemez dönüş; } n ++; // Önce öğeyi satırın sonuna ekleyin arr = değer; int i = n; // Büyük bir üst yığın oluşturduğumuz için, büyük üst yığının koşullarını karşılaması için sürekli olarak ayarlamamız gerekir. süre (i / 2 > 0 dizi > arr) { takas (dizi, i, i / 2); i = i / 2; } } }

    Zaman karmaşıklığı ağacın yüksekliğidir, dolayısıyla O (logn).

    • Üst öğeyi sil

    Yığının özelliklerinden dolayı (düğümün değeri, alt düğümlerinin değerine eşit veya ondan büyüktür (veya ona eşittir)), kök düğümü (yığın öğesi) ya tüm düğümler arasında en büyüğü veya tüm düğümler arasındaki en küçüktür. Yığının üst kısmını silerken Öğeden sonra, alt düğümleri de yığının koşullarını (büyük üst yığın veya küçük üst yığın) karşılayacak şekilde ayarlamanız gerekir.

    Üzerinde işlem yapmak istediğimiz yığının büyük bir üst yığın olduğunu varsayarsak, yığının en üst öğesini sildikten sonra, en büyük öğeyi doldurmak için orijinal yığındaki en büyük ikinci öğeyi bulmalıyız ve en büyük ikinci öğe de kök düğümün sol ve sağ alt düğümlerinde şüphesizdir. Sol düğüm olduğunu varsayarsak, üstteki elemanı sol düğümle doldurduktan sonra sol düğüm boştur.Şu anda sol düğümü doldurmak için sol düğümün sol ve sağ düğümlerinden ikisinin daha büyük değerini bulmak gerekir ... ve bu işlemi sürekli yinelemek, Ayarlama tamamlanana kadar, ayarlama süreci şu şekilde gösterilir:

    Ancak bu ayarlamadan sonra sorun ortaya çıktı.Yukarıdaki şekilde gösterildiği gibi, ayarlanan son yığınta dizi delikleri vardı. Karşılık gelen diziler aşağıdaki gibidir:

    Nasıl başa çıkılır bununla? Yığının üst elemanını son elemanla kaplayabilir ve ardından, dizi delikleri sorununu çözebilecek büyük üst yığının gereksinimlerini karşılamak için yığını yukarıdan aşağıya ayarlayabiliriz.

    Yukarıdaki şematik diyagrama bakıldığında, kod uygulaması aşağıdaki gibi nispeten basit olmalıdır:

    / ** * Üst elemanı kaldır * / public void removeTopElement { eğer (n == 0) { // Yığın içinde hiç eleman yoksa yani yığının üst elemanını kaldıracak bir durum yok dönüş; } int count = n; arr = arr; --Miktar; heapify (1, sayım); } / ** * Büyük üst yığının koşullarını karşılamak için yukarıdan aşağıya istifleme * / public void heapify (int index, int n) { while (true) { int maxValueIndex = dizin; eğer (2 * dizin < = n dizi < arr) { // Sol düğüm, üst düğümünden daha büyük maxValueIndex = 2 * dizin; } eğer (2 * dizin + 1 < = n dizi < arr) { // Sağ düğüm, sol düğümden veya üst düğümden daha büyüktür maxValueIndex = 2 * dizin + 1; } if (maxValueIndex == index) { // Mevcut düğüm değerinin maksimum değer olduğunu açıklayın, aşağı doğru yinelemeye gerek yok kırmak; } takas (arr, index, maxValueIndex); index = maxValueIndex; } } / ** * Dizinin i-inci ve j-inci elemanlarını değiştirin * / public static void swap (int arr, int i, int j) { int temp = arr ; arr = dizi; arr = temp; }

    Zaman karmaşıklığı, öbeğe eleman eklemekle aynıdır ve aynı zamanda ağacın yüksekliğidir, dolayısıyla O (logn).

    Yığın sıralama

    Sıralama elde etmek için yığın nasıl kullanılır? En büyük yığında, kök düğümün tüm düğümlerin en büyüğü olduğunu biliyoruz, bu nedenle aşağıdaki fikirlere sahibiz:

    Sıralanacak öğelerin sayısının n olduğunu varsayarak (dizide var olduğunu varsayarak), bu veri kümesi için büyük bir üst yığın oluşturun, büyük üst yığının öğelerini silin (dizinin son öğesi ile değiştirin) ve sonra kalan n'yi hesaplayın -1 öğesi büyük bir üst yığın oluşturmak için, ardından yığının üst öğesini silin (dizinin sondan bir önceki öğesi ile değiştirin), ardından kalan n-2 öğeleri için büyük bir üst yığın oluşturun ..., işlemi tekrarlayın , Bu nedenle, son sıralama küçükten büyüğe düzenlenmelidir, yığın sıralama işlemi aşağıdaki şekilde gösterilmektedir:

    Yukarıdaki adımlardan da görülebileceği gibi, önemli adımlar iki adımdır, bir yığın oluşturma (yığın oluşturma, büyük bir üst yığın oluşturma) ve sıralama.

    İlk önce bir yığın nasıl oluşturulacağına bakalım. Aslında, önceki bölümde zemini oluşturduk. Önceki bölümde, yeni bir dizi oluşturup sıralanacak öğeleri gezebilmemiz için yığının temel işlemlerini, ekleme ve silme işlemlerini kısaca tanıttık. Bir öğeyi geçmek için, önceki bölümde tanımladığımız insert (int değeri) yöntemini çağırın. Bu yöntem, öbeği öbeğe eklerken öbeği yığınlayacak ve büyük bir üst öbeğe ayarlayacaktır. Öğeleri geçtikten sonra, son öbek olmalıdır Büyük bir yığın.

    Bu şekilde oluşturulan büyük üst yığının uzay karmaşıklığı nedir? Yeni bir dizi oluşturduğumuz için, uzay karmaşıklığı O (n) 'dir, ancak aslında, yığın sıralaması yerinde sıralanır (ek alana gerek yoktur). Öyleyse, ek alan olmadan büyük bir üst yığın oluşturmaya odaklanalım.

    Aslında fikir çok basittir. Tüm yaprak olmayan düğümler için, büyük üst yığının koşullarını karşılamak için sürekli olarak yukarıdan aşağıya ayarlayın (her bir düğüm değeri, sol ve sağ düğümlerinin değerinden büyük veya ona eşittir). Geçişten sonra elde edilen yığın, Büyük kazık! Aynı zamanda, yığını ayarlama sürecinde, yalnızca dizideki öğeler sürekli olarak değiştirilir ve ek depolama alanı kullanılmaz.

    Öyleyse, yaprak olmayan düğümlerin aralığı nedir? Dizi elemanının n olduğunu varsayarsak, 1'den n / 2'ye kadar dizi indisine sahip elemanlar, yaprak olmayan düğümlerdir. N / 2 + 1 ila n alt simgeli elemanlar yaprak düğümlerdir.

    Seslendirme: Alt simge n / 2 + 1 olan düğümün bir yaprak düğüm olmadığını varsayarsak, sol alt düğümünün alt simgesi (n / 2 + 1) * 2 = n + 2'dir ve bu açıkça mantıksız olan n dizi öğesini aşar. Bu, n / 2 + 1 ile başlayan elemanın bir yaprak düğüm olması gerektiğini kanıtlayabilir.

    Şematik diyagram aşağıdaki gibidir:

    Şekilde gösterildiği gibi: Yaprak olmayan her düğümü yukarıdan aşağıya ayarladıktan sonra, sonunda büyük bir üst yığın elde edilir.

    Yukarıdaki fikirlerle aşağıdaki kodu yazmak zor değil:

    / ** * Büyük bir üst yığın oluşturmak için yukarıdan aşağıya 1 eş n / 2'den oluşan yaprak olmayan düğümleri yığın * / public void buildHeap { for (int i = n / 2; i > 0; i--) { öbek (i); } }

    Bunun gibi bir yığın oluşturmanın zaman karmaşıklığı nedir? Her bir öğeyi yığmanın zaman karmaşıklığının O (log n) olduğunu biliyoruz, bu nedenle 1'den n'ye kadar öğeler yığılıysa, toplam zaman karmaşıklığı açıktır. O (n log n) (aslında, ayrıntılı olarak çıkarılırsa, zaman karmaşıklığı O (n) 'dir, bu yüzden burada genişletmeyeceğim. İlgilenen öğrencilerin, O (n)' nin nasıl geldiğini görmek için bilgileri kontrol etmeleri önerilir).

    Bir yığın oluşturmayı bilerek, sonraki sıralama basittir. N öğe için, yalnızca yığının üst öğesini kaldırın (son öğeyle değiştirin), önceki n-1 öğelerini istifleyin ve ardından Yığının en üst öğesi (sondan bir önceki öğe ile değiştirin) ... Bu işlemi sürekli olarak tekrarlayın, kod aşağıdaki gibidir:

    / ** * Yığın sıralama * / public void heapsort { // Bir yığın oluşturun buildHeap; int i = n; while (true) { Eğer ben < = 1) { kırmak; } // Yığının en üstteki öğesini i-inci konuma koyun takas (dizi, 1, i); ben--; // Büyük bir üst yığının koşullarını karşılamalarını sağlamak için öğeleri 1'den i'ye yeniden istifleyin öbek (1, i); } }

    Hızlı sıralama kadar hızlı olan O (n log n) olan zaman karmaşıklığı yukarıda analiz edilmiştir! Bununla birlikte, yığın sıralama aslında üretimde kullanılmaz.Java'nın varsayılan dizi sıralaması (Arrays.sort ()) da altta hızlı sıralama kullanır. Zaman karmaşıklığı hızlı sıralama kadar hızlıdır. Neden yığın sıralaması gerekli değildir Görüşürüz. İki ana sebep var:

    1. Özyinelemeli sıralama sürecinde, hızlı sıralama, pivotu bitişik öğelerle karşılaştırır.Bilgisayarda çok önemli bir teorem kullanılır: yerellik ilkesi, yerellik ilkesi, basitçe bir CPU okuması olarak anlaşılabilir Belirli bir veriyi aldığında, verinin yakınındaki bitişik verinin de yüksek bir kullanım olasılığına sahip olacağını düşünür, bu nedenle, okunan yakındaki verileri Önbelleğe yükler, böylece bir dahaki sefere döndürülür. İşlem için verileri okumanız gerektiğinde, verileri doğrudan Önbellekten alabilirsiniz (bellekten almaya gerek yoktur) Veri miktarı büyükse, performans büyük ölçüde artar. Yığın sıralama yerellik ilkesini kullanamaz Neden, yığınlama sürecinde bir düğümün boyutunun ve onun sol ve sağ alt düğümlerinin sürekli olarak karşılaştırılması gerektiğini ve sol ve sağ alt düğümlerin de sol ve sağ düğümlerini karşılaştırmaları gerektiğini biliyoruz.

    Şekilde gösterildiği gibi: Düğüm 2'nin yukarıdan aşağıya yığılmasında, dizideki 4, 5, 9, 10 ... öğelerini geçmesi gerekir, bu öğeler bitişik öğeler değildir ve yerellik ilkesi kullanılamaz Performansı artırmak için.

    2. Yığın sıralamanın önemli bir adımının, yığının en üst öğesini kaldırıp yeniden yığınlamak olduğunu biliyoruz.Yığın çok sayıda öğe karşılaştırmasına neden olacağı her seferde, bu aynı zamanda yığın sıralamanın düşük performansının da bir nedenidir.

    3. Yığın sıralaması kararlı bir sıralama değildir, çünkü ilk ve son elemanların öbekleme başlamadan önce değiştirilmesi gerektiğini biliyoruz.Bu iki elemanın değerleri aynıysa, dizideki orijinal göreli sıralarını değiştirebilirler. Aynı zamanda kararsız bir türdür, ancak kararlı sıralamaya yükseltilebilir Bu aynı zamanda yığın ayırmada hızlı ayırmanın önemli bir noktasıdır.

    Üretimde uygulama

    Yığın ayırma yaygın olarak kullanılmasa da, üretimde hala birçok yığın uygulaması vardır.Burada, üretimde yığınla ilgili birkaç önemli uygulamayı ayrıntılı olarak inceleyeceğiz:

    1. Öncelik sırası

    Kuyrukların hepsinin ilk giren ilk çıkar olduğunu ve öncelik kuyruğunda öğelere ağırlık kavramı verildiğini, daha yüksek ağırlığa sahip öğeler önce çalıştırıldığını ve ikinci en yüksek ağırlığa sahip öğelerin bir sonraki sefer yürütmeden sonra çalıştırılacağını biliyoruz ... Öncelik sıralarını uygulamak için bir yığın kullanmak daha uygundur. Öncelik sıralarını uygulamak için yalnızca büyük bir üst yığın kullanın. En yüksek ağırlığa sahip kuyruk yürütüldüğünde, onu kaldırın (yığının üstünü silmeye eşdeğerdir) ve ardından önceliği seçin İkinci en yüksek seviyeye sahip eleman (yığınlama, büyük üst yığının koşullarını karşılamasını sağlar) çok uygundur.Aslında, Java'daki PriorityQueue öncelik sırasının yığın tarafından uygulandığını bilmek için kaynak kodunu görebiliriz.

    2. TopK sorununu bulun

    N element arasında ilk K en büyük / en küçük element nasıl bulunur. Diyelim ki üst K en büyük elementi gerekli, bunu şu şekilde yapabiliriz:

  • Küçük bir üst yığın oluşturmak için n öğesinin ilk K öğelerini alın

  • Elemanları K + 1 ile n arasında çaprazlayın.Her eleman küçük üst kazığın üst elemanı ile karşılaştırılır.Kazığın üst elemanından daha küçük ise herhangi bir işlem yapılmaz.Kazığın üst elemanından büyük ise üst eleman değiştirilir. Geçiş tamamlandıktan sonra, küçük üst yığıntaki tüm öğeler, ihtiyacımız olan TopK'dır.

  • Her bir öğeyi yığmanın zaman karmaşıklığı O (logK) ve n öğenin zaman karmaşıklığı O (nlogK), ki bu oldukça etkileyici!

    3. TP99, üretimde çok önemli bir göstergedir, nasıl hızlı hesaplanır

    Öncelikle TP99'un ne olduğunu açıklayayım. Bir ara yüzün (veya yöntemin) belirli bir süre içinde (5 dakika gibi) her çağrısı için harcanan zamanı ifade eder ve bu zamanlar artan sırada gerçekleştirilir. Sıralama için, TP99 değeri olarak 99. yüzdelik değerini alın Örneğin, bu yöntemin 5 dakikada 1 saniyeden 100 saniyeye 100 sayı aldığını ve ardından TP99'un 99 olduğunu varsayalım. Bu değer neden önemlidir? Belirli bir arayüz için değer ne kadar düşükse, isteklerin% 99'unun çok hızlı olduğu anlamına gelir, bu da arayüzün performansının çok iyi olduğunu gösterir, aksine arayüzün iyileştirilmesi gerektiği anlamına gelir.Bu değer nasıl bulunur?

    Fikir aşağıdaki gibidir:

  • Büyük bir üst yığın ve küçük bir üst yığın oluşturun. Büyük üst yığının üst öğeleri, küçük üst yığınınkilerden daha küçüktür. Büyük üst yığın, istek süresinin% 99'unu ve küçük üst yığın, istek süresinin% 1'ini korur

  • Bir öğe her oluşturulduğunda (istek zamanı), büyük üst yığının üst öğesinden daha küçükse, büyük üst yığına konur ve küçük üst yığının üst öğesinden daha büyükse, küçük üst yığının içine eklenir. En üst yığınta, tabii ki, üst yığının boyutunun gereksinimlerini karşılaması için yerleştirildikten sonra istiflenmesi gerekir.

  • Önceki adımda, yerleştirme işlemine dikkat etmeniz gerekiyor. Bu, büyük üst yığın ve küçük üst yığıntaki öğelerin oranının 99: 1 olmamasına neden olabilir. Şu anda karşılık gelen ayarlamaları yapmanız gerekir. Öğeleri büyük üst yığına eklerseniz, Oran 99: 1'den büyük olarak bulunursa, büyük üst yığının en üst öğelerini küçük üst yığına taşıyın ve ardından iki yığını büyük ve küçük üst yığınların gereksinimlerini karşılamak için istifleyin. Benzer şekilde, oran 99'dan az bulunursa: 1. Küçük üst yığının üst öğelerini büyük üst yığına taşımanız ve ardından ikisini üst üste yığmanız gerekir.

  • Yukarıdaki boyut üst yığın ayarlandıktan sonra, büyük üst yığının üst öğe değeri gerekli TP99 değeridir.

    Birisi, yukarıdaki uygulamaların hızlı sıralama veya diğer sıralama ile elde edilebileceğini söyleyebilir, evet, bu başarılabilir, ancak statik veriler altında hızlı sıralamayı kullanmanın gerçekten uygun olduğunu, ancak dinamik veriler için, eğer Bir eleman her eklendiğinde / silindiğinde tüm elemanların hızlı bir şekilde sıralanması gerçekleştirilir.Aslında, verimlilik çok yüksek değildir.Hızlı sıralama tam sıralama gerektirdiğinden, zaman karmaşıklığı O (nlog n) 'dir ve yığın sıralama bu tür dinamik veriler için çok uygundur. Sıralama, yeni eklenen her dinamik veri için, onu yığına ekleyin ve ardından yığınlayın, zaman karmaşıklığı yalnızca O (logK)

    sonuç olarak

    Yığın çok önemli bir veri yapısıdır.Dinamik verileri sıralarken yüksek performansa sahiptir.Öncelik kuyruğunun en alt katmanı da genellikle yığın tarafından yönetilir, bu nedenle yığının temel işlemlerinde ustalaşmak çok önemlidir. Ek olarak, Java'nın öncelik sırasının (PriorityQueue) de yığın tarafından uygulandığını biliyoruz, bu nedenle bir kez daha temel veri yapısına hakim olmak çok önemlidir, bu da üst uygulamanın temelindeki uygulamasını anlamak için çok yararlıdır!

    referans:

    • https://time.geekbang.org/column/article/69913 Yığın ve yığın sıralama: Neden yığın sıralaması hızlı sıralama kadar hızlı değil?

    • https://time.geekbang.org/column/article/70187 Yığın Uygulaması: En popüler 10 arama anahtar kelimesini hızlı bir şekilde nasıl elde edebilirsiniz?

    • https://www.jianshu.com/p/6b526aa481b1

    Google Wave'in başarısızlığı, modern gerçek zamanlı ortak çalışma ofisine büyük bir ders veriyor!

    Bronzdan krala, Senkronize | Kuvvet Projesi'nin altında yatan uygulama ilkesinden bahsedelim

    Tanrısal programcılar

    Pekin'deki Dördüncü Çevre Yolu'nda trafik sıkışıklığının tetiklediği büyük akıllı ulaşım fikri

    Şirketinizin sanal makinesi hala boşta mı? Jenkins ve Kubernetes'e dayalı sürekli entegrasyon testi uygulamasına bir göz atın!

    Web1.0'dan Web3.0'a: İnternetin son yıllarda gelişimi ve gelecekteki yönünün ayrıntılı analizi

    Bilgi grafiği yeterince sıcak, ancak altta yatan teknik bağlantılar hala tutuşma konusunda yetersiz | AI teknolojisi ekolojisi
    önceki
    Hâlâ birleşip sıralayamadığını duydum?
    Sonraki
    PPT, PyeCharts kadar havalı nasıl yapılır?
    Kıdemli bir geliştirici gibi nasıl düşünülür?
    Bilmediğin LVS sırları
    Tek noktadan katil yapay zeka geliştirme platformu burada! Parçalı modelleme araçlarını değiştirmeye elveda deyin
    Google Wave'in başarısızlığı, modern gerçek zamanlı ortak çalışma ofisine büyük bir ders veriyor
    Üç büyük operatör 5G haberlerini başlatacak; Apple ve Google ekibi 3 milyar kullanıcıyı takip edecek; jQuery 3.5.0 yayınlandı | Geek Headlines
    Derinlik | Perakendede "duygusal bilgi işlem" in uygulama geliştirmesini tek bir makalede okuyun
    Yeni bir programcı iş ararken nasıl özgeçmiş yazmalıdır?
    Zen of Go
    10 satırlık Python kodu hangi ileri teknoloji işlemlere sahip olabilir? | Güç Projesi
    Muhabir: Birkaç röportaj sorusunu ezberledikten sonra, Java kaynak koduna aşina olduğunuzu söylemeye cesaret edebilir misiniz? Kaynak kodunu bile bilmeyen kişileri işe almıyoruz Güç Projesi
    400 satırdan fazla kod! Süper ayrıntılı Rasa Çince sohbet robotu geliştirme kılavuzu | Kuvvet Projesi
    To Top