Java detaylı öğrenme rotası ve yol haritası, gelin ve görün

java ayrıntılı rota:

Bu makale size Java öğrenirken ulaşmanız gereken 30 hedefi, öğrenme sürecinde karşılaşabileceğiniz sorunları ve öğrenme yolunu anlatacaktır. Çalışmanıza yardımcı olacağını umuyoruz. Kendinizi karşılaştırın, bunlardan kaç tanesinde uzmanlaştınız?

rota

Java bugüne kadar geliştirildi, uygulamaya göre üç ana bölüme ayrıldı: J2SE, J2ME ve J2EE.

Bu üç parça birbirini tamamlar ve farklı uygulama alanlarına sahiptir.

J2SE, Java2'nin standart sürümüdür ve temel olarak masaüstü uygulama yazılımı programlaması için kullanılır;

J2ME, temel olarak cep telefonlarının ve PDA'ların programlanması gibi gömülü sistem geliştirmede kullanılır;

J2EE, temel olarak e-ticaret web siteleri ve ERP sistemleri gibi dağıtılmış ağ programlarının geliştirilmesi için kullanılan Java2'nin kurumsal sürümüdür.

Önce j2se'yi öğrenin

J2ee öğrenmek için önce j2se öğrenmelisiniz. J2se öğrenmeye başlarken IDE'yi kullanmamanız ve sonra yavaş yavaş IDE geliştirmeye geçmeniz tavsiye edilir, ne de olsa kullanmak uygundur. J2se'yi öğrenmek için iki kitap önerilir, "Java2 Core Technology Volume One and Two", "Java Programming Thoughts" ve "Java Mode". Bunların arasında "Java Programlama Düşüncesi" üzerinde çalışılmalı ve yoğun bir şekilde okunmalıdır. Bu süre, öğrencinin kendi seviyesine bağlı olarak uzun veya kısa olabilen temel becerilerin öğrenilmesidir.

IDE'den rahatsız olmayın

Java ve j2ee öğrenme sürecinde çok çeşitli IDE'lerle karşılaşacaksınız. Kafanızı karıştırmayın. JAVA öğrenirken dilin kendisini öğrenin. IDE'nin ek işlevlerine çok fazla dikkat etmeyin. JAVA programlamanın farklı IDE'ler arasında dönüşümü Çok kolay IDE'nin işlevlerine çok fazla dikkat etmek, dilin anlaşılmasını kolaylıkla geciktirebilir. Şu anda popüler IDE'ler jbuilder, eclipse ve eclipse'in WSAD'nin geliştirilmiş sürümüdür. Sadece birini iyi kullanın, j2ee'yi tutulmadan başlatmanız önerilir. Çünkü Jbuilder, j2se programları yazmak için daha uygundur.

Sunucu yapılandırmasını seçin ve öğrenin

J2se ve IDE deneyiminiz olduğunda j2ee, web sunucusu öğrenmeye başlayabilirsiniz: tomcat, şüphesiz, tomcat web hizmetlerini öğrenmek için ilk tercihtir. Şu anda üç ana uygulama sunucusu bulunmaktadır: jboss, weblogic ve websphere. Birçok proje jboss'u benimsemeye başladı ve çok sayıda şirket websphere veya weblogic'i jboss uygulama sunucusuna taşımaya başladı (maliyet tasarrufu) Burada söylemek istediğim, tomcat ve jboss öğrenmenin ilk seçenek ve başlamak için en kolay yol olduğu. Sunucu yapılandırması hakkında bilgi edinmek için en iyisi deneyimli kişilere sormaktır (mümkünse), çünkü sorunu tek bir cümleyle çözebilirler ve İnternet'i kendi başınıza keşfetmeniz bir veya iki gün sürebilir (çok aptalca bir şey yaptım), Ana zaman öğrenme ilkelerine ve teorilerine ayrılmıştır Belirli bir teknolojinin kullanımı asla bir kişinin bilgi ve öğrenmesinin yerini almayacaktır.

Web bilgisini öğrenin

Bir e-ticaret web sitesi yapıyorsanız, birkaç rol oynamanız gerekebilir, öğrenmeniz gereken şey bu:

html, dreamwave gibi IDE kullanılabilir.

Javascript, basit veri doğrulama, veri bağlantı ekranı vb. Öğrenin.

J2eeAPI öğrenimi

J2eeAPI ve öğrenme sunucusunu öğrenmek yinelemeli bir süreç olmalıdır.

Önce jsp ve servlet programlamayı öğrenin Bu alanda birçok kitap var. Oreilly'nin "jsp design" ve "java servlet programlama" adlı iki kitabını kurup okudum. Oreilly'nin kitapları her zaman mükemmeldir ve onlara hayran kalmam gerekir.

Jdbc veritabanı programlamayı öğrenin, j2ee projelerinin çoğu MIS sistemleridir ve veritabanına erişim temeldir. Bu, onu vurgulamak için burada j2se öğrenimine ait olmalıdır.

Jndi api öğrenmek, ejb öğrenmek ile birleştirilebilir.

Ejb api'yi öğrenin, öneri kitabı "Master ejb"

Yukarıdaki öğrenmeden sonra, muhtemelen genel uygulamalarla ilgilenebilirsiniz.

Bazı insanlar Sun'ın "j2ee eğitimini" sonuna kadar takip edebileceğinizi söylüyor.

Ejb tasarım modellerini öğrenin ve koda bakın (en önemlisi)

Tasarım kalıbı, iç becerileri uygulamaktır. Diyelim ki önemi. Tasarım modelini nasıl kullanacağınızı bilmiyorsanız, ejb kullanan, yavaş ve bir sürü hata içeren bir grup çöp yazacaksınız. Sonuç, ejb kullanmamak kadar iyi değil ( ejb, j2ee'ye eşit değildir)

Hangi dili öğrenirsen öğren, çok fazla koda bakmalısın, eğer belli bir miktardan daha az kod okursan, j2ee'yi iyi öğrenemezsin.

Öğretim materyali olarak kullanılabilecek birçok açık kaynak projesi vardır:

jive forum

Petstore sun

kumul güneşi

Bekleyin, çalışın ve kendi projelerinizde kullanın.

J2ee diğer öğrenim

Yavaş yavaş j2ee'yi belirli bir derinliğe kadar öğrendiğinizde, mevcut alandaki bazı teknolojik değişikliklere dikkat etmeye başlamalısınız.J2ee, yüzlerce düşünce okulunun yarıştığı bir alandır ve herkes burada yapılar, hiberate, ofbiz vb. Gibi kendi çözümlerini önermek için buradadır, öğrenin Bunlar projenize ve hedeflerinize bağlıdır. Önceden toplamak iyi bir fikir değildir, ancak çok fazla dahil etmeyin. Sonuçta, ilkeleri ve teorileri öğrenmek en önemli şeydir.

Şu anda yaygın j2eeAPI

JavaServer Pages (JSP) teknolojisi 1.2

Java Servlet teknolojisi 2.3

JDBC API 2.0

Java XML İşleme API (JAXP) 1.1

Kurumsal JavaBeans Teknolojisi 2.0

Java Mesaj Hizmeti (JMS) 1.0

Java Adlandırma Dizini Arayüzü (JNDI) 1.2

Java Transaction API (JTA) 1.0

JavaMail API 1.2

JavaBeans aktivasyon çerçevesi (JAF) 1.0

J2EE Bağlayıcı Mimarisi (JCA) 1.0

Java Kimlik Doğrulama ve Yetkilendirme Hizmeti (JAAS) 1.0

Yukarıdaki API'lerden bazılarını öğrenmek projenize bağlıdır ve kısaca hepsini bilmek iyidir.

Yukarıdakiler herkesin söylediği şeyi doğruluyor, java dilinin kendisi öğrenmesi zor değil, çok fazla teknoloji, bu yüzden java öğrenmek çok zor. Temelde her yeni başlayan kişinin başkalarına java öğrenirken sorabileceğini hatırlayın, hangi pakette hangi yöntemin (api) olduğunu nasıl anlarsınız? Haha, onsuz, sadece eller tanıdık geliyor.

1 Temel kraldır. Temelimiz sağlam ve sağlam olmalıdır.

Yukarıdaki sürece bakıldığında, Java'nın birçok teknik dalı vardır ve tamamen ustalaşmak kesinlikle imkansızdır. Sadece bir veya iki parçasında ustalaşıyoruz. Ancak java da evrenseldir, sözde değişim ayrılamaz. Java'daki tüm programlama fikirleri "nesne yönelimli" programlamadır. Bu nedenle, herkesin daha yüksek bir seviyeye geçmeden önce iyi bir temel oluşturması gerekir, böylece gelecekte jree veya j3d olursa olsun, bir cevap gibi hissedecektir. Burada "java programlama fikirlerini" şiddetle tavsiye ediyorum.

2 Sözde temel, tüm java koduna aşina olmamalıdır. Demek istediğim, java'nın yapısını anlamak. Sınıf, yöntem, nesne, her türlü içe aktarma, genişletme, böylece yapıda java hakkında üç boyutlu ve genel bir anlayışa sahip olursunuz. Aslında, java öğrenmek için koda aşina olmak için inatçı olmanıza gerek yoktur. 1 java birçok demo ile birlikte gelir, java2d

Hemen hemen tüm soruların demo örnekleri var. 2. Java açık koddur, demo ağı olmasa bile, kodunu paylaşan birçok usta vardır. Bu yüzden hiç bir referans olmadığından korkmayın, referanslar her yerde mevcuttur.

3 Son olarak, sizinle paylaşılacak bir deneyim noktası var.Güneş API'sini ister öğreniyor olsun ister bir referans api olarak kullanmayı öğrenmelisiniz, çok faydalıdır.Java'nın yapısını tam olarak anlamak temelinde, herhangi bir yöntem kullanılabilir. API aracılığıyla bulun. Bu nedenle, bir yöntem bulmaktan, yapıyı anlamaktan ve yöntemi bulmak için API'yi anlamaktan korkmayın.

Odaklanma

Yetkin: Bu teknolojinin teknik noktalarının% 85'inden fazlasına hakim olun, bu teknolojiyi iki yıldan fazla kullanın ve bu teknolojiyi 5'ten fazla projeyi başarıyla uygulamak için kullanın. Bu teknik, mümkün olan en yüksek yeniden kullanımı elde etmek için performansı veya kodu optimize etmek için kullanılabilir.

Yeterlilik: Bu teknolojinin teknik noktalarının% 60'ından fazlasına hakim olun, bu teknolojiyi bir yıldan fazla kullanın ve bu teknolojiyi 3'ten fazla projeyi başarıyla uygulamak için kullanın. Bu teknolojiyi, yazılım gereksinimlerini karşılamak için kullanabilir ve modüllerin veya kodların mümkün olduğunca yeniden kullanımını sağlamak için uygulamadan önce tasarımı optimize etmek için birikmiş deneyime sahip olun.

Aşinalık: Bu teknolojinin teknik noktalarının% 50'sinden fazlasına hakim olun, bu teknolojiyi yarım yıldan fazla kullanın ve birden fazla projeyi başarıyla uygulamak için bu teknolojiyi kullanın. Yazılım gereksinimlerini karşılamak için bu teknolojiyi kullanabilir.

Anlama: İhtiyaç duyduğunuz anda ihtiyaçlarınızı karşılamak için teknik belgelere veya yardım dosyalarına başvurabilirsiniz.Temel olarak bu teknolojinin uygulamanızdaki rolünü bilirsiniz ve yönetmeliklere göre size sağlanan çağrı yöntemlerini arayabilir veya kullanabilirsiniz.

İki: Temel gereksinimler

1: html ustalığı: uzman. Sebep: HTML bilmiyorsanız JSP yazamaz mısınız?

2: javascript / jscript: Ustalık: Tanıdık. Nedeni: İstemci tarafında veri doğrulama ve bazı sayfa işlemleri, komut dosyalarını kullanmanızı gerektirir.

3: CSS ustalığı: aşinalık. Sebep: Sayfa stilinin birliğini sağlamak genellikle css kullanılarak elde edilir.

4: Java temel programlama Uzmanlığı: uzman. Sebep: JSP'yi java olmadan yazabilir misin? Şaka yapıyorum. Ve aşağıdaki paketlere çok aşina olmalısınız: java.lang; java.io; java.sql; java.util; java.text; javax.sevrlet; javax.servlet.http; javax.mail; vb.

5: SQL ustalığı: uzman. Sebep: Veritabanı kullanmıyorsanız, sql'de master yapmanız gerekmeyebilir. Aynı zamanda, aşağıdaki veritabanlarında birden fazla SQL türüne aşina olmanız gerekir. Oracle, DB2, Mysql, Postgresql.

6: xml ustalığı: anlamak Neden: AppServer yapılandırması genellikle XML kullanılarak gerçekleştirilir.

7: Ejb ustalığı: Nedeni anlayın: birçok projede iş mantığı ejb tarafından gerçekleştirilir, bu yüzden ...

8: Aşağıdaki AppServer'dan (engnier) birden fazlasını bilmeniz gerekir.

a:) Tomcat b:) WebLogic c:) WebSphere d:) JRun e:) Resin Nedeni: jsp'niz ne üzerinde çalışıyor?

Üç: Seçim gereksinimleri (projeye bağlı olarak)

1: LDAP ustalığı: anlayın Nedeni: LADP, erişim kontrolünde giderek daha fazla kullanılmaktadır.

2: Struts ustalığı: yeterlilik Nedeni: MVC tasarımına uygunsa, genellikle C elde etmek için Struts kullanın.

3: Xsp Ustalığı: İhtiyaçlara göre pek çok durumda kullanılmaz, ancak Xsp ejb'ye ihtiyaç duyulmadığında ancak jsp + servlet + bean gerçekleştirilemediğinde çok iyi bir seçimdir.

4: Linux Ustalığı: Tanıdık Neden: Uygulamanız Linux / Unix üzerinde çalışıyorsa, en azından rm, mv, cp, vi, tar gzip / gunzip'in ne için kullanıldığını bilmelisiniz.

Dört: araçların kullanımı 1: UltraEdit (EditPlus) + jakarta-ant + jakarta-log4j; 2: Jubilder4-63: Visual Age For Java 4: VCafe

Aşina olduğunuz araçları seçin. Ancak, log4j'yi hata ayıklama aracı olarak kullanmanız şiddetle önerilir.

Beş: büyümeye giden yol

1: html çalışma süresi, IQ'nuz 80'in üzerindeyse 15 gün yeterli olacaktır. En azından elle bir sayfa yazabilirsin.

2: jacascript / jscript öğrenme zamanı, söylemek gerçekten zor, daha ezoterik şeyler, eğer kullanabilirseniz, bir hafta içinde yazmayı öğrenebilirsiniz.

3: css öğrenme süresi, üç gün içinde css'yi nasıl kullanacağınızı bilmelisiniz, yazmak zorunda değilsiniz, genellikle css yazmak için bir sanatçı.

4: Java öğrenme süresi, bir dahi için üç ay. Yavaş öğren. Yetenekli olmak istiyorsanız, ne kadar zaman alacağını bilmiyorum. Yazardım

jsp, dört ay yeterli olmalıdır.

5: SQL öğrenme süresi, sadece tablo ekleme, silme, güncelleme, seçme, oluşturma / bırakma bilgisine ihtiyacınız var, o zaman bunu bir gün içinde bilmelisiniz.

6: XML öğrenme zamanı, henüz öğrenmediğimi bilmiyorum. Ha ha. Ama DTD'nin ne için kullanıldığını biliyorum.

7: ejb çalışma süresi, temel arama, arayacağınız 3 güne bağlıdır. Ama sizin java bilginize dayanmaktadır.

8: AppServer'a aşina olan Tomcat, kurulum ve konfigürasyonda dört gün içinde ustalaşabilirsiniz. Jsp çalıştırın. WebLogic ise yeterlidir, ancak ejb kullanmak sizi ilgilendirmez. SA ne yaptı.

9: Linux'a aşina olmak çok zaman alıyor. Adama yavaşça bakın.

10: Daha fazlasını öğrenmeniz gerekiyorsa destekler.

Amaçları

1. Nesneye yönelik analiz ve tasarımda (OOA / OOD), mod (GOF, J2EEDP) ve entegre modu içeren uzman olmanız gerekir. UML'yi, özellikle sınıf, nesne, etkileşim ve belirtilen diyagramları iyi anlamanız gerekir.

2. JAVA dilinin ve çekirdek sınıf kitaplıklarının temellerini öğrenmeniz gerekir (koleksiyonlar, serileştirme, akışlar, ağ oluşturma, çoklu okuma, yansıma, olay, işleme, NIO, yerelleştirme ve diğerleri).

3. JVM'nin, sınıf yükleyicilerin, sınıf yansımasının ve çöp toplamanın temel çalışma mekanizmasını anlamalısınız. Bir sınıf dosyasını yeniden derleyebilmeli ve bazı temel birleştirme talimatlarını anlayabilmelisiniz.

4. İstemci programları yazacaksanız, WEB uygulamalarını öğrenmeniz ve GUI tasarımının fikir ve yöntemlerinin yanı sıra masaüstü programlarının SWING, AWT, SWT'sinde ustalaşmanız gerekir. Ayrıca UI widget'larının JAVABEAN bileşen modelini de anlamış olmalısınız. JAVABEANS, JSP'de iş mantığını sunum katmanından ayırmak için de kullanılır.

5. JDBCAPI gibi java veritabanı teknolojisini öğrenmeniz ve Hibernate, JDO, CocoBase, TopLink, InsideLiberator (yerel JDO kırmızı fabrika yazılımı) veya iBatis gibi en az bir kalıcılık / ORM mimarisi kullanmanız gerekir.

6. Nesne ilişkisinin empedans uyumsuzluğunun anlamını ve bunun iş nesnesi ile ilişkisel veritabanı arasındaki etkileşimi ve işletim sonuçlarını nasıl etkilediğini de anlamalı ve ayrıca farklı veritabanı ürünlerinin popülaritesinde ustalaşmanız gerekir mi? Oracle, mysql , Mssqlserver.

7. JAVA'nın korumalı alan güvenlik modunu (sınıf yükleyiciler, bayt kod doğrulaması, yöneticiler, politika izinleri,

Kod imzalama, dijital imzalar, kriptografi, sertifikasyon, Kerberos ve diğerleri) ayrıca JAAS (JavaAuthenticationandAuthorizationService), JCE (JavaCryptographyExtension), JSSE (JavaSecureSocketExtension) ve JGSS (JavaGeneralSecurityService) gibi farklı güvenlik / kimlik doğrulama API'lerine sahiptir.

8. Servletler, JSP ve JSTL (StandardTagLibraries) ve isteğe bağlı üçüncü taraf TagLibraries öğrenmeniz gerekir.

9. JSF, Struts, Tapestry, Cocoon, WebWork gibi genel web çerçevelerine ve MVC / MODEL2 gibi bunlarla ilgili modlara aşina olmanız gerekir.

10. tomcat, resin ve Jrun gibi WEB sunucularını nasıl kullanacağınızı ve yöneteceğinizi öğrenmeniz ve bunlara dayalı olarak WEB programlarını nasıl genişletip bakımını yapacağınızı bilmeniz gerekir.

11. Dağıtılmış nesneleri ve RMI ve RMI / IIOP gibi uzak API'leri öğrenmeniz gerekir.

12. Çeşitli popüler ara yazılım teknik standartlarında uzmanlaşmanız ve bunu Tuxedo, CROBA ve tabii ki javaEE gibi java ile birlikte uygulamanız gerekir.

13. JAXP (JavaAPIforXMLProcessing), JDOM (JavaforXMLDocumentObjectModel), DOM4J veya JAXR (JavaAPIforXMLRegistries) gibi en az bir tür XMLAPI öğrenmeniz gerekir.

14. Web Hizmeti oluşturmak için JAVAAPI'yi ve araçları nasıl kullanacağınızı öğrenmelisiniz. Örneğin, JAX-RPC (JavaAPIforXML / RPC), SAAJ (SOAPwithAttachmentsAPIforJava), JAXB (JavaArchitectureforXMLBinding), JAXM (JavaAPIforXMLMessaging), JAXR (JavaAPIforXMLRegistries) veya JWServices (JavaAPIforXMLRegistries).

15. Spring, PicoContainer, Avalon ve bunların IoC / DI stilleri (ayarlayıcı, yapıcı, arayüz enjeksiyonu) gibi hafif bir uygulama çerçevesi öğrenmeniz gerekir.

16. JNDI (JavaNamingandDirectoryInterface), JMS (JavaMessageService), JTA / JTS (JavaTransactionAPI / JavaTransactionService), JMX (JavaManagementeXtensions) ve JavaMail gibi farklı J2EE teknolojilerine aşina olmanız gerekir.

17. Kurumsal düzeyde JavaBeans (EJB) ve bunların farklı bileşen modlarını öğrenmeniz gerekir: Stateless / StatefulSessionBeans, EntityBeans (Bean-ManagedPersistence veya Container-ManagedPersistence ve EJB-QL dahil) veya Message-DrivenBeans (MDB).

18. WebLogic, JBoss vb. Gibi bir J2EE uygulama sunucusunu nasıl yönetip yapılandıracağınızı ve küme sınıfları, bağlantı havuzları ve dağıtılmış işleme desteği gibi ek hizmetlerini nasıl kullanacağınızı öğrenmeniz gerekir. Ayrıca, üzerindeki uygulamaları nasıl paketleyip yapılandıracağınızı anlamanız ve performansını izleyip ayarlayabilmeniz gerekir.

19. Görünüşe yönelik programlamaya ve öznitelik odaklı programlamaya aşina olmanız gerekir (her ikisi de kafa karışıklığıyla yoğunlaşır.

AOP olarak yazılmıştır) ve genel JAVA spesifikasyonları ve uygulamaları. Örneğin, AspectJ ve AspectWerkz.

20. Size hizmet verebilmek için farklı kullanışlı API'lere ve çerçeve çalışmasına aşina olmanız gerekir. Örneğin, Log4J (günlük kaydı / izleme), Quartz (planlama), JGroups (ağ grubu iletişimi), JCache (dağıtılmış önbellekleme), Lucene (tam metin arama), JakartaCommons, vb.

21. Eski bir sistem veya yerel platforma bağlanacaksanız, JNI (JavaNativeInterface) ve JCA (JavaConnectorArchitecture) öğrenmeniz gerekir.

22. JINI teknolojisine ve CROBA gibi ilgili dağıtılmış sistemlerine aşina olmanız gerekir.

23. JavaCommunityProcess (JCP) ve onun Portletler (168), JOLAP (69), DataMiningAPI (73), vb. Gibi farklı JavaSpecificationRequests (JSR'ler) 'e ihtiyacınız var.

24. sunOne, netBeans, IntelliJIDEA veya Eclipse gibi bir JAVAIDE konusunda uzman olmalısınız. (Bazı insanlar VI veya EMACS'ı dosya yazmayı tercih eder. Ne kullanırsanız kullanın :)

25. JAVA (kesin olmak gerekirse, bazı konfigürasyonlar) ayrıntılıdır, çok sayıda manuel kod gerektirir (EJB gibi), bu nedenle XDoclet gibi kod oluşturma araçlarına aşina olmanız gerekir.

26. Bir birim test sistemine (JNunit) aşina olmanız ve farklı üretim ve dağıtım araçlarını (Ant, Maven) öğrenmeniz gerekir.

27. JAVA geliştirmede sıklıkla kullanılan bazı yazılım mühendisliği süreçlerine aşina olmanız gerekir. Örneğin, RUP (Rational Unified Process) ve Agilemethodologies.

28. Çapraz platform yazılım geliştiricisi olarak GNU / linux, sunsolaris, macOS, vb. Gibi farklı işletim sistemlerini anlayabilmeniz ve yetkin bir şekilde çalıştırabilmeniz ve yapılandırabilmeniz gerekir.

29. Ayrıca java geliştirme hızına da ayak uydurmanız gerekir, örneğin artık javaME'yi derinlemesine öğrenebilir, ayrıca yeni web açısından zengin istemci teknolojisi gibi çeşitli yeni java spesifikasyonlarının ve teknolojilerinin uygulanmasını öğrenebilirsiniz.

30. Açık kaynak bilgisine sahip olmalısınız, çünkü en azından birçok java teknolojisi, java3D teknolojisi gibi doğrudan açık kaynak tarafından yönlendirilir. (BlogJava-Topquan'ın Blogu)

Orijinal metin, bağlantıyı açmak için tıklamaktan gelir

Tabii temelleri öğrendikten sonra bazı veri yapılarını ve algoritmaları anlamak gerekiyor.

Veri yapısı, verileri bir şekilde birlikte düzenleyen bir koleksiyondur.Sadece verileri depolamakla kalmaz, aynı zamanda verilere erişme ve işleme işlemleri de destekler. Bir algoritma, bir problemi çözmek için izlenmesi gereken, açıkça belirtilmiş basit talimatların bir koleksiyonudur. Aşağıda benim tarafımdan derlenen ortak veri yapısı ve algoritma ile ilgili içerik yer almaktadır.Hatalar varsa lütfen belirtiniz.

Açıklamayı kolaylaştırmak için, makalede yer alan kod Java dilinde yazılmıştır.Aslında Java, genellikle kullandığımız doğrusal tablolar, yığınlar ve kuyruklar gibi birkaç ortak veri yapısının daha iyi uygulanmasını sağlar. Java koleksiyon çerçevesi, ihtiyacınız olursa bu makaleyi okuyabilirsiniz. Java toplama çerçevesi tamamen çözüldü

Bir, doğrusal tablo 1. Dizi uygulaması 2. Bağlantılı liste İki, yığın ve sıra Üç, ağaç ve ikili ağaç 1. Ağaç 2. İkili ağacın temel kavramları 3. İkili arama ağacı 4. Dengeli İkili Ağaç 5. Kırmızı-siyah ağaç Dört, şekil Beş, özet

Bir, doğrusal tablo

Doğrusal tablo, en yaygın kullanılan ve en basit veri yapısıdır ve n veri öğesinin sonlu bir dizisidir.

Doğrusal bir tabloyu uygulamanın genellikle iki yolu vardır: Biri, doğrusal tablonun öğelerini depolamak için bir dizi kullanmaktır, yani doğrusal tablonun veri öğelerini bir dizi sürekli depolama birimi ile sırayla depolamaktır. Diğeri, doğrusal tablonun öğelerini depolamak için bağlantılı bir liste kullanmaktır, yani doğrusal tablonun veri öğelerini depolamak için bir dizi rastgele depolama birimi kullanmaktır (depolama birimleri sürekli veya süreksiz olabilir).

Dizi uygulaması

Dizi sabit boyutlu bir veri yapısıdır ve doğrusal tablolardaki tüm işlemler diziler aracılığıyla gerçekleştirilebilir. Dizinin boyutu bir kez oluşturulduktan sonra değiştirilemezse de, dizi artık doğrusal tabloda yeni öğeler depolayamadığında, mevcut dizinin yerini alacak yeni bir büyük dizi oluşturabiliriz. Bu şekilde, dinamik veri yapılarını uygulamak için dizileri kullanabilirsiniz.

  • Kod 1 Mevcut diziyi değiştirmek için daha büyük bir dizi oluşturun
int oldArray = yeni int; int newArray = yeni int; for (int i = 0; i < oldArray.length; i ++) { newArray = oldArray ; } // Diziler arasında kopyalamak için System.arraycopy yöntemini de kullanabilirsiniz // System.arraycopy (oldArray, 0, newArray, 0, oldArray.length); oldArray = newArray;
  • Kod 2 Dizi konumu dizinine e öğesini ekleyin
// oldArray, geçerli depolama öğelerinin dizisini temsil eder // boyut, mevcut elemanların sayısını gösterir public void add (int index, int e) { eğer (dizin > boyut || indeks < 0) { System.out.println ("Konum geçersiz ..."); } // Dizi doluysa genişletin eğer (boyut > = oldArray.length) { // Genişletme işlevi kod 1'e başvurabilir } for (int i = size-1; i > = dizin; i--) { oldArray = oldArray ; } // dizi elementData öğesini, konum dizinindeki tüm öğelerden bir konum geri taşı // System.arraycopy (oldArray, index, oldArray, index + 1, size-index); oldArray = e; boyut ++; }

Doğrusal tabloları uygulamak için dizilerin iki tipik işlevi basitçe yukarıda yazılmıştır.Ayrıntılar için, Java'daki ArrayList koleksiyon sınıfının kaynak koduna başvurabiliriz. Dizi tarafından uygulanan doğrusal tablonun avantajı, öğelere alt simge aracılığıyla erişebilmeniz veya bunları değiştirebilmenizdir, bu daha verimli olur. Ana dezavantaj, ekleme ve silme maliyetinin yüksek olmasıdır. Örneğin, bir öğe ilk konumdan önce eklendiğinde, sonra tümü Eleman bir konum geri hareket eder. Herhangi bir pozisyonda eleman ekleme veya silme verimliliğini artırmak için, doğrusal bir tabloyu uygulamak için bir zincir yapısı kullanılabilir.

Bağlantılı liste

Bağlantılı bir liste, fiziksel bir depolama birimindeki bitişik olmayan, sıralı olmayan bir depolama yapısıdır ve veri öğelerinin mantıksal sırası, bağlantılı listedeki işaretçilerin bağlantı sırası aracılığıyla elde edilir. Bağlantılı liste bir dizi düğümden oluşur ve bu düğümlerin belleğe bağlanması gerekmez. Her düğüm, veri bölümü Veri ve Sonraki, Sonraki zincir bölümü tarafından bir sonraki düğüme işaret edilir, böylece eklerken veya silerken, yalnızca ilgili düğümün Sonraki yönünü değiştirmeniz gerekir ki bu çok verimli olur.

Tek bağlantılı bir listenin yapısı

Aşağıdaki kod esas olarak bağlantılı listenin bazı temel işlemlerini göstermek için kullanılır.Burada örnek olarak esas olarak tek bağlantılı bir liste olduğu ve şimdilik çift bağlantılı listeleri ve döngüsel bağlantılı listeleri dikkate almadığına dikkat edilmelidir.

  • Bağlantılı listenin Kod 3 Düğümleri
sınıf Düğümü < E > { E öğesi; Düğüm < E > Sonraki; // Yapıcı Düğüm (E öğesi) { this.item = eleman; this.next = null; } }
  • Kod 4 Düğüm tanımlandıktan sonra, baş düğüm ve kuyruk düğümü genellikle kullanımdan önce başlatılır
// Baş düğüm ve kuyruk düğümü boş, bağlantılı liste boş Düğüm < E > head = boş; Düğüm < E > kuyruk = boş;
  • Kod 5 Boş bağlantılı liste ile yeni bir düğüm oluşturun
// Yeni bir düğüm oluşturun ve başın bu düğümü göstermesine izin verin head = new Düğüm ("nodedata1"); // Kuyruk düğümünün de bu düğümü göstermesine izin verin kuyruk = kafa;
  • Kod 6 Bağlantılı listeye bir düğüm ekleyin
// Yeni bir düğüm oluşturun ve aynı anda son düğüme bağlanın tail.next = new Düğüm ("node1data2"); // Kuyruk düğümü yeni düğüme işaret ediyor kuyruk = kuyruk.sonraki;
  • Kod 7 bağlantılı listeyi sırayla dolaş
Düğüm < Dize > akım = kafa; while (geçerli! = boş) { System.out.println (current.item); akım = akım.sonraki; }
  • Kod 8 Bağlantılı listeyi ters sırada gez
statik void printListRev (Düğüm < Dize > head) { // Bağlantılı listenin ters çevrilmesi esas olarak özyineleme fikrini kullanır eğer (kafa! = null) { printListRev (head.next); System.out.println (head.item); } }
  • Tekil bağlantılı liste ters kodla
// Tek bağlantılı listenin tersine çevrilmesi, esas olarak iki düğüm arasındaki bağlantı ilişkisini tek tek değiştirerek yapılır statik Düğüm < Dize > revList (Düğüm < Dize > head) { eğer (head == null) { boş döndür; } Düğüm < Dize > nodeResult = null; Düğüm < Dize > nodePre = boş; Düğüm < Dize > akım = kafa; while (geçerli! = boş) { Düğüm < Dize > nodeNext = current.next; eğer (nodeNext == null) { nodeResult = geçerli; } current.next = nodePre; nodePre = geçerli; akım = nodeNext; } dönüş nodeResult; }

Yukarıdaki birkaç kod parçası esas olarak bağlantılı listenin birkaç temel işlemini gösterir ve belirtilen öğeleri elde etme, öğeleri kaldırma vb. Gibi birçok başka işlem vardır. Bu kodları yazarken, düğümler arasındaki ilişkiyi netleştirmeniz gerekir, böylece bunlar olmamalıdır hata yapmak kolay.

Dairesel tek bağlantılı listeler, çift bağlantılı listeler ve döngüsel çift bağlantılı listeler gibi bağlantılı listeleri uygulamanın başka yolları da vardır. Dairesel tek bağlantılı liste Esas olarak, bağlantılı listenin son düğümü, bir bütün olarak bir zincir oluşturan birinci düğüme işaret eder. Çift bağlantılı liste Temel olarak, düğüm iki işaretçi parçası içerir, biri öncül öğeyi gösterir ve diğeri ardıl öğeyi işaret eder, JDK'daki LinkedList toplama sınıfının gerçekleştirilmesi, çift bağlantılı bir listedir. ** Dairesel çift bağlantılı liste **, ilk düğüme işaret eden son düğümdür.

İki, yığın ve sıra

Yığınlar ve sıralar da nispeten yaygın veri yapılarıdır.Özel doğrusal tablolardır.Yığın için, öğelere erişim, ekleme ve silme işlemleri yalnızca yığının en üstünde gerçekleştirilebilir. Sıralar için, öğeler yalnızca sıranın sonundan eklenebilir. Sıranın başından erişin ve silin.

Yığın

Yığın, ekleme ve silmeyi yalnızca bir konumla sınırlayan bir tablodur. Bu konum, yığının tepesi olarak adlandırılan tablonun sonudur. Yığın üzerindeki temel işlemler, itme (yığına) ve pop'u (yığında) içerir; eski, eklemeye eşdeğerdir , İkincisi, son öğeyi silmeye eşdeğerdir. Yığın bazen LIFO (Son Giren İlk Çıkar) tablosu olarak adlandırılır, yani son giren ilk çıkar.

Yığın modeli

Yığınla ilgili anlayışımızı derinleştirmek için klasik bir konuya bakalım.

Yığınlar hakkında klasik bir konu

Yukarıdaki şekildeki cevap C'dir ve ilke düşünülebilir.

Yığın aynı zamanda bir tablo olduğu için, bir tabloyu uygulayan herhangi bir yöntem bir yığını uygulayabilir. JDK'da Stack sınıfının kaynak kodunu açtığımızda, Vector sınıfını miras aldığını görebiliriz. Elbette Stack, Java2 öncesi bir konteyner sınıfıdır ve artık yığın üzerindeki tüm işlemleri gerçekleştirmek için LinkedList'i kullanabiliriz.

kuyruk

Sıra, özel bir doğrusal tablodur. Özel özellik, yalnızca masanın önünde (ön) silme işlemlerine ve tablonun arkasına (arka) eklemelere izin vermesidir. Yığın gibi, sıra da tabi olan bir işlemdir Doğrusal limit tablosu. Ekleme işlemini gerçekleştiren sona takım sonu, silme işlemini gerçekleştiren sona ise takım başkanı denir.

Kuyruk diyagramı

Bir kuyruğu uygulamak için bağlantılı bir liste kullanabiliriz.Aşağıdaki kod, bir kuyruk sınıfını uygulamak için LinkedList'in kullanımını gösterir.

  • Kod 9 basitçe kuyruk sınıfını uygular
genel sınıf MyQueue < E > { özel LinkedList < E > liste = yeni LinkedList < > (); // Takıma katıl public void enqueue (E e) { list.addLast (e); } // Kalkış public E dequeue () { return list.removeFirst (); } }

Sıradan kuyruk, ilk giren ilk çıkar veri yapısıdır ve öncelik kuyruğunda tüm öğelere öncelik verilir. Bir öğeye erişirken, önce en yüksek önceliğe sahip öğe silinir. Hayatta birçok öncelik sırası uygulaması vardır, örneğin bir hastanenin acil servisi hastalara öncelik verir ve en yüksek önceliğe sahip hastalar önce tedavi edilir. Java toplama çerçevesinde, PriorityQueue sınıfı, öncelik kuyruğunun uygulama sınıfıdır.Ayrıntılar için kaynak kodunu okuyabilirsiniz.

Üç, ağaç ve ikili ağaç

Ağaç yapısı, aralarında ağaçların ve ikili ağaçların en yaygın olarak kullanıldığı, doğrusal olmayan çok önemli bir veri yapısıdır. İkili ağacı tanıtmadan önce ağacın ilgili içeriğini kısaca anlayalım.

ağaç

** Ağaç N (n > = 1) Bir dizi sonlu düğüm hiyerarşik bir ilişki oluşturur. Aşağıdaki özelliklere sahiptir: her düğümün sıfır veya daha fazla alt düğümü vardır; ana düğümü olmayan düğümler çağrılır Kök Düğüm; her kök olmayan düğümde yalnızca bir Ana düğüm **; Kök düğüm haricinde, her bir alt düğüm birden fazla ayrık alt ağaca bölünebilir.

Ağaç yapısı

İkili Ağacın Temel Kavramları

  • tanım

İkili ağaç, düğüm başına en fazla iki alt ağacı olan bir ağaç yapısıdır. Genellikle alt ağaçlara "sol alt ağaç" ve "sağ alt ağaç" denir. İkili ağaçlar genellikle ikili arama ağaçları ve ikili yığınları uygulamak için kullanılır.

  • İlgili özellikler

İkili ağacın her düğümünün en fazla 2 alt ağacı vardır (2'den büyük dereceye sahip düğüm yoktur) İkili ağacın alt ağaçları sola ve sağa bölünür ve sıra tersine çevrilemez.

İkili ağacın i'inci seviyesi en fazla 2 (i-1) düğüme sahiptir; k derinliğindeki ikili ağaç en fazla 2k-1 düğüme sahiptir.

Derinliği k ve 2 ^ k-1 düğümlü bir ikili ağaca ** tam ikili ağaç ** denir;

Derinliği k ve düğümleri olan bir ikili ağaç, ancak ve ancak her düğüm tam ikili derinlik k derinlik ağacında sıra numaraları 1'den n'ye kadar olan bir düğüme karşılık gelirse, buna ** tam ikili ağaç ** denir.

  • Üç geçiş yöntemi

İkili ağaçların bazı uygulamalarında, genellikle ağaçta belirli özelliklere sahip düğümler bulmak veya ağaçtaki tüm düğümler üzerinde ikili ağacın geçişini içeren belirli işlemleri gerçekleştirmek gerekir. İkili ağaç temelde 3 temel birimden oluşur; kök düğüm, sol alt ağaç ve sağ alt ağaç. Sınır sola ve sonra sağa ise, bu üç bölümün geçiş sırasına göre üç türe ayrılabilir: ön sipariş geçişi, orta sıra geçişi ve sonraki geçiş.

(1) Ön sipariş geçişi İkili ağaç boşsa herhangi bir işlem yapılmaz, aksi takdirde önce kök düğüm ziyaret edilir, önce soldaki alt ağaç geçilir ve önce sağ alt ağaç geçilir. (2) Sıralı geçiş İkili ağaç boşsa, hiçbir şey yapmayın.Aksi takdirde, önce soldaki alt ağacı orta sırayla çaprazlayın, ardından kök düğümü ziyaret edin ve son olarak sağ alt ağacı orta sırada çaprazlayın. (3) Sipariş sonrası geçiş İkili ağaç boş ise herhangi bir işlem yapılmaz, aksi takdirde sol alt ağaç kök düğümü ziyaret etmek için sırayla geçilir ve ardından sağ alt ağaç sırayla geçilir ve sonunda kök düğüm ziyaret edilir.

Bir ikili ağaç verildiğinde, üç geçiş sonucu yazın

  • Ağaç ve ikili ağaç arasındaki fark

(1) İkili ağacın her düğümü en fazla 2 alt düğüme sahiptir ve ağaç sınırsızdır. (2) İkili ağaçtaki düğümün alt ağacı, sol alt ağaç ve sağ alt ağaca bölünmüştür.Bir düğümün yalnızca bir alt ağacı olsa bile, alt ağacın bir sol alt ağaç mı yoksa bir sağ alt ağaç mı olduğunu, yani ikili ağacın sıralı olduğunu belirtmek gerekir. (3) Ağaç boş olmamalıdır, en az bir düğümü vardır ve bir ikili ağaç boş olabilir.

Yukarıda temel olarak ikili ağaçlarla ilgili kavramları tanıttık.Aşağıda ikili arama ağaçları ile başlayacağız, birkaç yaygın ikili ağaç türü tanıtacağız ve önceki teorik bölümleri kodda uygulayacağız.

İkili arama ağacı

  • tanım

İkili arama ağacı, ikili arama ağacı olarak da adlandırılan ikili sıralama ağacıdır. İkili arama ağacı ya boş bir ağaçtır ya da aşağıdaki özelliklere sahip bir ikili ağaçtır: (1) Sol alt ağaç boş değilse, sol alt ağaçtaki tüm düğümlerin değerleri kök düğümünün değerinden daha azdır; ( 2) Sağ alt ağaç boş değilse, sağ alt ağaçtaki tüm düğümlerin değerleri, kök düğümünün değerinden daha büyüktür; (3) Sol ve sağ alt ağaçlar da ikili olarak sıralanmış ağaçlardır; (4) Anahtar yoktur Eşit değerlere sahip düğümler.

Tipik İkili Arama Ağacı Yapım Süreci

  • Performans analizi

İkili arama ağacı için, verilen değer aynı ancak sıra farklı olduğunda, oluşturulan ikili arama ağacının şekli farklıdır, bir örneğe bakalım.

Dengeli ikili ağaçların farklı formlarının farklı ASL'leri vardır

Düğümlü bir ikili arama ağacının ortalama arama uzunluğunun ağacın şekli ile ilişkili olduğu görülebilir. En kötü durumda, sıralı olarak eklenen anahtar kelimeler sıralı olduğunda, oluşturulan ikili arama ağacı tek bir ağaca dönüşecektir.Ağacın derinliği n'dir ve ortalama arama uzunluğu (n + 1) / 2'dir (sıralı aramayla aynı) En iyi durum, ikili arama ağacının şeklinin ikili aramanın karar ağacı ile aynı olması ve ortalama arama uzunluğunun log2 (n) ile orantılı olmasıdır. Ortalama olarak, bir ikili arama ağacının ve logn'un ortalama arama uzunluğu aynı büyüklüktedir, bu nedenle daha iyi performans elde etmek için, ikili arama ağacının yapım sürecinin genellikle "dengeli" olması gerekir ve sonra dengeli ikili ağaçtan bahsedeceğiz Ve kırmızı-siyah ağaçlar, bunlar arama ağacının yüksekliğini O (log (n)) yapabilir.

  • Kod 10 Bir ikili ağacın düğümleri
sınıf TreeNode < E > { E öğesi; TreeNode < E > ayrıldı; TreeNode < E > sağ; public TreeNode (E e) { eleman = e; } }

İkili arama ağacının üç geçişi, özyinelemeli yöntemlerle doğrudan uygulanabilir:

  • Kod 12 birinci dereceden geçiş
korumalı boşluk ön siparişi (TreeNode < E > kök) { eğer (root == null) dönüş; System.out.println (root.element + ""); ön sipariş (kök.left); ön sipariş (root.right); }
  • Geçiş sırasına göre Kod 13
korumalı boşluk sıralı (TreeNode < E > kök) { eğer (root == null) dönüş; inorder (kök.left); System.out.println (root.element + ""); inorder (root.right); }
  • Kod 14 sipariş sonrası geçiş
korumalı boşluk postorder (TreeNode < E > kök) { eğer (root == null) dönüş; konumlayıcı (root.left); konumlayıcı (root.right); System.out.println (root.element + ""); }
  • Kod 15 İkili arama ağacının basit uygulaması
/ ** * @yazar JackalTsc * / genel sınıf MyBinSearchTree < E, Karşılaştırılabilir < E > > { // kök özel TreeNode < E > kök; // Varsayılan kurucu genel MyBinSearchTree () { } // ikili arama ağacında arama genel boole arama (E e) { TreeNode < E > akım = kök; while (geçerli! = boş) { eğer (e.compareTo (current.element) < 0) { current = current.left; } else if (e.compareTo (current.element) > 0) { current = current.right; } Başka { doğruya dön; } } yanlış dönüş; } // İkili arama ağacının eklenmesi public boolean insert (E e) { // Önceden boş bir ikili ağaç olsaydı, eklenen öğe kök düğüm olur if (root == null) { root = createNewNode (e); } Başka { // Aksi takdirde, uygun bir üst düğüm bulana kadar kök düğümden geçiş yapın TreeNode < E > parent = null; TreeNode < E > akım = kök; while (geçerli! = boş) { eğer (e.compareTo (current.element) < 0) { ebeveyn = akım; current = current.left; } else if (e.compareTo (current.element) > 0) { ebeveyn = akım; current = current.right; } Başka { yanlış dönüş; } } // ekle eğer (e.compareTo (parent.element) < 0) { parent.left = createNewNode (e); } Başka { parent.right = createNewNode (e); } } doğruya dön; } // Yeni bir düğüm oluştur korumalı TreeNode < E > createNewNode (E e) { yeni TreeNode (e) döndür; } } // ikili ağacın düğümü sınıf TreeNode < E, Karşılaştırılabilir < E > > { E öğesi; TreeNode < E > ayrıldı; TreeNode < E > sağ; public TreeNode (E e) { eleman = e; } }

Yukarıdaki kod 15, esas olarak, kendi kendinize uyguladığınız ve birkaç ortak işlemi içeren basit bir ikili arama ağacını gösterir, elbette, yine de kendi başınıza daha fazla işlemi tamamlamanız gerekir. İkili arama ağacındaki bir düğümü silme işlemi daha karmaşık olduğu için, onu aşağıda ayrıntılı olarak tanıtacağım.

  • İkili arama ağacında düğümlerin silinmesinin analizi

İkili arama ağacındaki bir öğeyi silmek için, önce öğeyi ve onun üst düğümünü içeren düğümü bulmanız gerekir. Akımın, ikili arama ağacındaki elemanı içeren düğüme işaret ettiği ve ebeveynin, mevcut düğümün ebeveyn düğümü işaret ettiği varsayıldığında, mevcut düğüm, ebeveyn düğümün sol çocuğu veya sağ çocuğu olabilir. Burada dikkate alınması gereken iki durum vardır:

  • Geçerli düğümün sol çocuğu yoktur, bu nedenle patent düğümünü geçerli düğümün sağ çocuğuna bağlamanız yeterlidir.
  • Geçerli düğümün bir sol alt öğesi var. RightMost'un sol alt ağaçta geçerli düğümü içeren en büyük öğeye sahip düğümü ve parentOfRightMost'un sağdaki düğümün üst düğümünü gösterdiğini varsayın. Ardından, önce geçerli düğümdeki öğe değerini sağdaki öğe değeriyle değiştirin, parentOfRightMost düğümünü ve rightMost düğümün sol alt öğesini bağlayın ve ardından sağdaki düğümü silin.
  • // ikili arama ağacındaki düğümü sil public boolean delete (E e) { TreeNode < E > parent = null; TreeNode < E > akım = kök; // Silinecek düğümün konumunu bulun while (geçerli! = boş) { eğer (e.compareTo (current.element) < 0) { ebeveyn = akım; current = current.left; } else if (e.compareTo (current.element) > 0) { ebeveyn = akım; current = current.right; } Başka { kırmak; } } // Silinecek düğüm bulunamadı if (current == null) { yanlış dönüş; } // if (current.left == null) { if (parent == null) { root = current.right; } Başka { if (e.compareTo(parent.element) < 0) { parent.left = current.right; } Başka { parent.right = current.right; } } } else { // TreeNode < E > parentOfRightMost = current; TreeNode < E > rightMost = current.left; // while (rightMost.right != null) { parentOfRightMost = rightMost; rightMost = rightMost.right; } // current.element = rightMost.element; // parentOfRightMostrightMost if (parentOfRightMost.right == rightMost) { parentOfRightMost.right = rightMost.left; } Başka { parentOfRightMost.left = rightMost.left; } } return true; }

    AVL1

    AVLAVL1nAVL1.44log2nOlog n

    O(log n)(1) (2)

    • Giriş

    • İlgili Okuma

    (1)

    (2)

    I. Genel Bakış

    I. Genel Bakış

    nf(n) ** T(n) = O(f(n)) **nf(n)

    3 1{++x;} 2for(i = 1; i < = n; i++) { ++x; } 3for(j = 1; j < = n; j++) for(j = 1; j < = n; j++) { ++x; } ++x 1 n n^2 n31 n n^2 O(1)O(n )O(n^2)

    S(n)=O(f(n))

    • Giriş

    naxx=a,xx < aaxx > aax

    O(logn)

    //array data // -1 static int funBinSearch(int array, int data) { int low = 0; int high = array.length - 1; while (low < = high) { int mid = (low + high) / 2; if (data == array) { return mid; } else if (data < array) { high = mid - 1; } Başka { low = mid + 1; } } dönüş -1; }

    İnternetten resim

    Kabarcık Sıralama

    • Giriş

    nn-1n-1

    (3,2,1,5)313231,3515(2,1,3,5)22123232(1,2,3,5)312(1,2,3,5)

    // flag static void funBubbleSort(int array) { boolean flag = true; for (int i = 0; i < array.length - 1 flag; i++) { flag = false; for (int j = 0; j < array.length - 1 - i; j++) { eğer (dizi > array) { int temp = array; dizi = dizi; dizi = sıcaklık; bayrak = doğru; } } } for (int i = 0; i < dizi.length; i ++) { System.out.println(array ); } }
    • analiz

    ** O(n) **

    n-1n-1n-2...1** O(n^2) **

    • Giriş

    nn-1n-i+1(i = 1,2,...,n-1)i

    (3,2,1,5)31411(1,3,2,5)21322(1,2,3,5)3331,2,3,5

    static void funSelectionSort(int array) { for (int i = 0; i < array.length - 1; i++) { int mink = i; // for (int j = i + 1; j < array.length; j++) { eğer (dizi < array) { mink = j; } } // if (mink != i) { int temp = array; array = array ; array = temp; } } for (int i = 0; i < dizi.length; i ++) { System.out.print(array + " "); } }
    • analiz

    ** .i=1n-1i=2n-2(n-1)+(n-2)++2+1=n(n-1)/2 O(n^2) O(n) . O(n^2) **

    3n-1

    • Giriş

    1

    (3,2,1,5)(3)1223(2,3)1,(1,2,3)5(1,2,3,5).

    static void funDInsertSort(int array) { int j; for (int i = 1; i < dizi.length; i ++) { int temp = array ; j = i - 1; while (j > -1 temp < array) { dizi = dizi; j--; } dizi = sıcaklık; } for (int i = 0; i < dizi.length; i ++) { System.out.print(array + " "); } }
    • analiz

    n-1** O(n) . O(n^2) . O(n^2) **

    (1) (2)

    Sıralamayı birleştir

    • Giriş

    (3,2,8,6,7,9,1,5)(3,2,8,6)(7,9,1,5)1(3,2,8,6)2(7,9,1,5)1(3,2)(8,6)(3,2)(3)(2)(8,6)(8)(6)(2,3)(6,8)(2,3,6,8)2(1,5,7,9)(1,2,3,5,6,7,8,9)

    // static void funMergeSort(int array) { if (array.length > 1) { int length1 = array.length / 2; int array1 = new int; System.arraycopy(array, 0, array1, 0, length1); funMergeSort(array1); int length2 = array.length - length1; int array2 = new int; System.arraycopy(array, length1, array2, 0, length2); funMergeSort(array2); int datas = merge(array1, array2); System.arraycopy(datas, 0, array, 0, array.length); } } // static int merge(int list1, int list2) { int list3 = new int; int count1 = 0; int count2 = 0; int count3 = 0; while (count1 < list1.length count2 < list2.length) { if (list1 < list2) { list3 = list1; } Başka { list3 = list2; } } while (count1 < list1.length) { list3 = list1; } while (count2 < list2.length) { list3 = list2; } return list3; }
    • analiz

    O(nlogn)java.util.Arrayssort

    Hızlı sıralama

    • Giriş

    // static void funQuickSort(int mdata, int start, int end) { if (end > start) { int pivotIndex = quickSortPartition(mdata, start, end); funQuickSort(mdata, start, pivotIndex - 1); funQuickSort(mdata, pivotIndex + 1, end); } } // static int quickSortPartition(int list, int first, int last) { int pivot = list; int low = first + 1; int high = last; while (high > low) { while (low < = high list < = pivot) { low++; } while (low < = high list > pivot) { high--; } if (high > low) { int temp = list; list = list; list = temp; } } while (high > first list > = pivot) { high--; } if (pivot > list) { list = list; list = pivot; return high; } Başka { return first; } }
    • analiz

    nnnO(n)1(n-1)+(n-2)+...+1= ** O(n^2) **

    ** O(nlogn) **

    • Giriş

    nK1K2Kn(1) ki < = k(2i ki < = k(2i+1) (1 i n/2 > =

    n-1

    // public class TestHeapSort { public static void main (String args) { int arr = { 5, 6, 1, 0, 2, 9 }; heapsort(arr, 6); System.out.println(Arrays.toString(arr)); } static void heapsort(int arr, int n) { // for (int i = n / 2 - 1; i > = 0; i--) { heapAdjust(arr, i, n); } for (int i = 0; i < n - 1; i++) { swap(arr, 0, n - i - 1); heapAdjust(arr, 0, n - i - 1); } } // static void swap(int arr, int low, int high) { int temp = arr; arr = arr; arr = temp; } // static void heapAdjust(int arr, int index, int n) { int temp = arr; int child = 0; while (index * 2 + 1 < n) { child = index * 2 + 1; // child if (child != n - 1 arr < arr) { child++; } // if (temp > arr) { kırmak; } Başka { // arr = arr; index = child; } } arr = temp; } }
    • analiz

    O(nlogn)O(1)

    ...

    Özyineleme

    • Giriş

    ·0112358132134F0=0F1=1Fn=F(n-1)+F(n-2)n2nN*

    // static long funFib(long index) { if (index == 0) { return 0; } else if (index == 1) { dönüş 1; } Başka { return funFib(index - 1) + funFib(index - 2); } }

    O(2^n)

    static long funFib2(long index) { long f0 = 0; long f1 = 1; long f2 = 1; if (index == 0) { return f0; } else if (index == 1) { return f1; } else if (index == 2) { return f2; } for (int i = 3; i < = index; i++) { f0 = f1; f1 = f2; f2 = f0 + f1; } return f2; }

    static void funSwapTwo(int a, int b) { a = a ^ b; b = b ^ a; a = a ^ b; System.out.println(a + " " + b); }

    static boolean funIsPrime(int m) {

    boolean flag = true;

    if (m == 1) {

    flag = false;

    } Başka {

    for (int i = 2; i < = Math.sqrt(m); i++) {

    if (m % i == 0) {

    flag = false;

    kırmak;

    }

    }

    }

    return flag;

    }

    8 fotoğraf sizi Java bilgisini kolayca incelemenizi sağlar
    önceki
    Wu Yifan'ın Weibo'sundan veri ileten 102.118 veri taranıyor ve trafiğin doğru mu yanlış mı?
    Sonraki
    Tarayıcı, hangi programlama dilinin en karlı olduğunu analiz eder: Python ve Java en yüksek maaşı mı alıyor?
    Kritik derecede hasta olan yaşlı, doktora bir not doldurdu: Ben vücut bağışçısıyım, unutma
    "Mikro haklara" bir "elektronik göz" ekleyin ve Xin'an Caddesi'nde üç seviyeli temiz bir hükümet denetim sistemi oluşturun
    Çin Ulusal Kongre Merkezi, "Kuşak ve Yol" Zirve Forumu için "hareket eden bulutlar ve akan su" ile "Çin hizmetleri" sunmaktadır.
    Ağır Ceza! 5,71 milyon kişi başı yüksek hızlı tren bileti satın almakla sınırlıdır
    Fikri mülkiyet koruması, Çin'in gereksinimleri ve eylemleri vardır
    Çin Donanması'nın "Aegis Tiantuan" askeri geçit töreninde göründü.Yıldız gemilerinin hepsi hazır!
    numpy advanced tutorial np.where ve np.piecewise
    Gelişmiş matplotlib çiziminin ayrıntılı açıklaması
    Koleksiyonda 5.000'den fazla antik kitapla, Zhongshan'ın gizli topluluğundaki halka açık kitap dükkanının hikayesi nedir?
    Makine öğrenimi hakkında bilmeniz gereken 3 popüler profesyonel terim
    GitHub'da yüz teknolojisi ile ilgili kaynakların tanınması, tespiti, kalibrasyonu, yeniden yapılandırılması, oluşturulması vb.
    To Top