1、集合與數據結構
一、集合:是一種對象,相似於保存其餘對象的存儲庫;
二、做用:表示一個專用與保存元素的對象,而且該對象還提供增添、刪除等管理所保存元素的服務;php
2、集合的同構與異構
一、同構:保存類型所有相同的對象的集合;
二、異構:能夠保存各類類型的對象的集合;html
3、分離接口與實現
一、ADT:是由數據和在該數據上所實施的具體操做構成的集合,yigeADT有名稱、值域和一組容許執行的操做。
二、其之因此被視爲抽象數據類型,是由於在ADT上能夠執行的操做與底層的實現分離開了。
三、對象具備定義良好的接口,從而成爲一種實現集合的完整機制。java
4、數據結構的動態表示
一、動態數據結構的大小規模隨須要增加和收縮;
二、經過保存和更新對象引用來實現一個鏈表的管理;git
5、線性數據結構
一、隊列:是一種先進先出方式管理數據的線形數據結構;
二、堆棧:是一種之後進先出方式管理數據的線形數據結構;web
6、非線性結構
一、樹:是一種以層次結構組織數據的非線性數據結構;
二、圖:是非線性數據結構,使用常見的邊來鏈接節點;算法
7、Java 集合類
一、Java集合類API定義了幾種以不一樣方式實現的集合類;編程
- 問題1:看到過這樣一句話,「數組與鏈表爲同級」,那他們能夠互換嗎,或者彼此替代嗎?數組
- 問題1解決方案:
首先咱們從他們不一樣的概念和特色來說:數據結構
數組的特色
一、在內存中,數組是一塊連續的區域。
二、數組須要預留空間,在使用前要先申請佔內存的大小,可能會浪費內存空間。 好比看電影時,爲了保證10我的能坐在一塊兒,必須提早訂好10個連續的位置。這樣的好處就是能保證10我的能夠在一塊兒。可是這樣的缺點是,若是來的人不夠10個,那麼剩下的位置就浪費了。若是臨時有多來了我的,那麼10個就不夠用了,這時可能須要將第11個位置上的人挪走,或者是他們11我的從新去找一個11連坐的位置,效率都很低。若是沒有找到符合要求的做爲,那麼就無法坐了。
三、插入數據和刪除數據效率低,插入數據時,這個位置後面的數據在內存中都要向後移。刪除數據時,這個數據後面的數據都要往前移動。 好比原來去了5我的,而後後來又去了一我的要坐在第三個位置上,那麼第三個到第五個都要日後移動一個位子,將第三個位置留給新來的人。 當這我的走了的時候,由於他們要連在一塊兒的,因此他後面幾我的要往前移動一個位置,把這個空位補上。
四、隨機讀取效率很高。由於數組是連續的,知道每個數據的內存地址,能夠直接找到給地址的數據。
五、而且不利於擴展,數組定義的空間不夠時要從新定義數組。工具
鏈表的特色
一、在內存中能夠存在任何地方,不要求連續。
二、每個數據都保存了下一個數據的內存地址,經過這個地址找到下一個數據。 第一我的知道第二我的的座位號,第二我的知道第三我的的座位號……
三、增長數據和刪除數據很容易。 再來我的能夠隨便坐,好比來了我的要作到第三個位置,那他只須要把本身的位置告訴第二我的,而後問第二我的拿到原來第三我的的位置就好了。其餘人都不用動。
四、查找數據時效率低,由於不具備隨機訪問性,因此訪問某個位置的數據都要從第一個數據開始訪問,而後根據第一個數據保存的下一個數據的地址找到第二個數據,以此類推。 要找到第三我的,必須從第一我的開始問起。
五、不指定大小,擴展方便。鏈表大小不用定義,數據隨意增刪。
綜上所述:
我發現同級只是它們的共同點之一,不一樣僅僅以這樣一個標準就去認爲能夠互換,實際上講,各個都有彼此的優勢,互換的也僅僅是方法,各自有實現目標的辦法,只是有些方法複雜,有些比較簡單而已,因此講,從實際問題上講,是能夠互換的,可是不能直接講位置互換就能夠,須要進行方法內部的修改,而後發現問題,及時修改。
ps:就這樣問題,其實我在作pp13.3的時候深入體會的到,由於數組有數組實現排序的方法,而鏈表也有鏈表實現排序的方法,就問題來論方法纔是咱們當今學習Java的主要進步過程,不能盲目去學習。感受又一波雞湯,自我安慰,習慣習慣
- 問題2:什麼叫作冒泡排序?
- 問題2解決方法:
這個問題是我在看排序的時候發現的,以前總以爲冒泡排序就是鏈表的插入排序法,後來發現本身太傻了,憑空製造了一個概念,如今我來說一下我學習這種排序的經歷。
1、首先,冒泡排序:
一、原理:比較兩個相鄰的元素,將值大的元素交換至右端。
二、思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。而後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至所有排序完成。
三、優勢:每進行一趟排序,就會少比較一次,由於每進行一趟排序都會找出一個較大值。如上例:第一趟比較以後,排在最後的一個數必定是最大的一個數,第二趟排序的時候,只須要比較除了最後一個數之外的其餘的數,一樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只須要比較除了最後兩個數之外的其餘的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,必定程度上減小了算法的量。4
例子:
第一種:假若有幾個數字int score[] = {67, 69, 75, 88}; 按照從大到小排序。
咱們就能夠用這個方法進行排序:
for(int i =0;i < score.length - 1;i++) { for(int j = 0;j < score.length - 1-i;j++)// j開始等於0, { if(score[j] < score[j+1]) { int temp = score[j]; score[j] = score[j+1]; score[j+1] = temp; } } }
測試結果:
第二種:第二種思路,用88 和 75 比較,在和69 比較 在和 67 比較,發現88是最大的,吧他排到第一位(index=0的位置),而後i=1,也就是第二輪,就不用看下標爲0的88了由於他是老大,而後接着比較。;
for(int i =0;i < score.length - 1;i++) { for(int j = (score.length - 2);j >= i;j--) { if(score[j] < score[j+1]) { int temp = score[j]; score[j] = score[j+1]; score[j+1] = temp; } } }
測試結果:
ps:我發現這個和pp13.3好像啊,而後就和那個選擇排序法好像啊,可是仍是不同,具體體如今一個是左右相鄰的元素進行比對,一個是先找到最小的那一個元素再去與那個最小的進行對比再進行排序。
- 問題1:
在作pp13.3的時候,最初我想用的方法就是用兩個指針,分別指向thisXX
和thisXX.next
,可是在我寫完排序程序之後,會發如今第一個循環中,它會吞一些節點;
- 問題1解決方案:
由於是經過一個Boolean對象來判斷是否進入下一個循環,因此在排好序之後,他老是又進入第一個大循環裏,把以前排好隊的對象給一個一個給刪了,最後我就把Boolean給刪了,而後只留下了一個內循環,只是爲了找最小的那一個節點,例:
BUT,又奔出現一個bug,我發現,雖然說第一個和第二個參與排序了,可是第一個和第二個沒有進行互換,暈.....
我只得用循環外部弄一個在以前課堂做業裏和小趙同窗一塊兒弄出的方法,加一個互換
如此甚好,問題也就隨之解決了。
- 問題2:
就pp13.3的問題,我還想再寫一個問題,由於很想知道爲何兩個指針就會消去呢,因而次日我繼續寫了一個相似的兩個指針,但是,奇蹟出現了,它居然,排序成功了,我竟久久不能,不知所措,昨兒,個人半下午一直在調試,沒了,半下午就這麼沒了
- 問題2解決方案:
具體:直接放上代碼好了
錯題1
Why is the following method one which has infinite recursion?
public int infiniteRecursion(int n)
{
if (n > 0) return infiniteRecursion(n) + 1;
else return 0;
}
A. Because there is no base case
B. Because the base case will never be true
C. Because the recursive call does not move the parameter closer to the base case
D. Because the recursive call moves the problem further away from the base case
E. None of the above, there is no infinite recursion in this method
正確答案: C 個人答案: A
解析:遞歸的狀況下,該方法使用相同的參數調用本身,因此n不會改變,所以若是(n> 0)最初爲真,它將保持爲真。
錯題2
If there are 2 disks to move from one Tower of Hanoi to another, how many disk movements would it take to solve the problem using the recursive solution?
A. 0
B. 1
C. 2
D. 3
E. 4
正確答案: D 個人答案: B
解析:Hanoi解決方案須要使用之前的解決方案兩次+ 1次額外的移動。要解決它1個磁盤,它須要1移動。要解決它的2個磁盤,它須要使用解決方案1個磁盤兩次+1,或1移動+ 1移動+ 1移動= 3移動。咱們在等式2 ^ n - 1中捕獲它,其中n是磁盤的數量。
錯題3
If there are 6 disks to move from one Tower of Hanoi to another, how many disk movements would it take to solve the problem using the recursive solution?
A. 6
B. 13
C. 31
D. 63
E. 127
正確答案: D 個人答案: A
解析:Hanoi解決方案須要使用之前的解決方案兩次+ 1次額外的移動。要解決它1個磁盤,它須要1移動。要解決它的2個磁盤,它須要使用解決方案1個磁盤兩次+ 1個額外的移動,或1移動+ 1移動+ 1額外移動= 3個移動。咱們在等式2 ^ n - 1中捕獲它,其中n是磁盤的數量。對於3個磁盤,這須要7次移動,對於4個磁盤須要15次移動,對於5個磁盤須要31次移動,對於6個磁盤,這須要63次移動。
錯題4
The difference between direct and indirect recursion is
A. direct recursion occurs when a method invokes itself; indirect recursion occurs when there is an intervening method
B. indirect recursion occurs when a method invokes itself; direct recursion occurs when there is an intervening method
C. direct recursion only occurs with methods declared to be private; indirect recursion can occur with methods declared to be private, protected, or public
D. indirect recursion only occurs with methods declared to be private; direct recursion can occur with methods declared to be private, protected, or public
E. none of the above
正確答案: A 個人答案: B
解析:直接遞歸意味着一種方法直接調用本身而不須要插入方法。間接遞歸在原始方法再次調用以前有一個或多箇中介方法時發生。
錯題5
It always is possible to replace a recursion by an iteration and vice versa.
A. true
B. false
正確答案: A 個人答案: B
解析:遞歸和迭代都是重複的形式。不管是使用遞歸仍是迭代來重複重複都是風格,品味,有時效率,有時方便。但它們在計算方面是等價的 - 每個均可以被另外一個替代。
正確使用Markdown語法(加1分):
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
忽然發現已經敲了半個多學期的代碼了,時間老是在不經意間失去,其實,不管是一我的敲代碼,仍是完成集體的結對編程,考驗的終究是咱們本身的能力,合做能力,編程能力,有時候老是以爲本身不行,拖後腿,有時候在寫博客的時候老是抱怨,有沒有什麼問題,還要找問題,可是其實細細的想,或許問題不是出在本身編的某一個程序裏,而是出在整個學習的過程當中呢?由於其實從一些實驗,做業中,其實均可以透露出別人的影子,但有時還要強做是本身絞盡腦汁想出來的,我記得高中老師給咱們這麼說:「借鑑,其實就是一種變相的抄襲,雖然說不是徹底抄,可是你借取的仍是別人的經驗,本身只是負責修改。」的確是這樣,課程難,你們都累,天天看着那密密麻麻的代碼,有些人以爲它就是世界上最美的語言,而有些人,僅僅把它看做之後,將來盈利的一種工具,或是本身上位的一種能力,咱們你們都應該反思,爲了什麼而學習。只剩下半學期的學習時間,你們能夠以一個積極的方式去學習,不是隻是盲目追求着一個目標,事到臨頭的時候就仿照別人的寫一個,因此合理分配時間,制定方案,計劃,進行合理學習,創造更多的自我價值。
加油!!
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 156/156 | 1/1 | 15/15 |
第二週 | 217/371 | 1/2 | 20/35 |
第三週 | 233/604 | 2/4 | 20/55 |
第四周 | 1382/1986 | 1/5 | 35/90 |
第五週 | 146/2196 | 1/6 | 25/115 |
第六週 | 462/2658 | 1/7 | 15/130 |
第七週 | 856/3514 | 1/8 | 20/150 |
第八週 | 1877/5391 | 3/11 | 20/170 |
第九周 | 1747/7138 | 1/12 | 20/190 |
第十週 | 1323/8461 | 2/14 | 30/220 |
Java程序設計
藍墨雲
數組和鏈表的區別
單向鏈表(單鏈表)的Java實現
Java實現單向鏈表的歸併排序
冒泡排序的2種寫法
Java中的經典算法之冒泡排序(Bubble Sort)