當前位置:編程學習大全網 - 編程語言 - 數據結構線性表幾個基本操作無法實現,大神們來幫忙解決壹下

數據結構線性表幾個基本操作無法實現,大神們來幫忙解決壹下

1 學習方法

因為要準備這個話題, 所以我認真的思考了我的學習方法, 但是我覺得基本上我就是上課前看看書、上課時認真聽課、 下課以後復習復習、當然還有做作業時很認真的去做。根本談不上什麽好方法, 不過我還是有壹些話要送給大家。

我能行!

個人覺得這句話非常重要,不知道大家是怎樣看待數據結構這門課的, 有多少人覺得數據結構很難呢看我知道還是有壹些同學這樣覺得的, 有時候我跟我的朋友講要怎樣學,講了壹大堆以後, 他就向我抱怨:我以前c++都沒有學好, 數據結構更學不好了, 這哪跟哪的話啊,數據結構與c++沒有什麽關系,我想假如抱有這樣的心態, 自己就不相信自己, 那是不可能學好的, 然後那些覺得數據結構很難的同學, 我想他們應該會很看重數據結構的吧, 然後就壹天到晚捧著壹本數據結構, 這樣不會覺得很累嗎看而且因為覺得很難, 就容易不相信自己, 學的效率也不會很好, 個人認為數據結構很好學, 很容易學, 或許這有點妄自菲薄吧, 但是因為我覺得很容易, 當然就會覺得自己沒問題, 學得很輕松, 效果也還可以。大家都是從高考走過來的, 應該知道心態的重要性吧, 兩種不同的心態, 完全就是兩種不同的效果。 學了這麽久數據結構了, 我們到底在學些什麽呢看 不知道大家有沒有想過, 那現在我們現在來歸納壹下我們學習的內容吧, 其實學到現在我們也就學了幾種普通的數據結構, 象二叉樹, 樹, 圖,還有排序的問題, 前面的線性表和字符串也就是壹些概念, 當然還有壹個很重要的KMP算法, 然後在每種數據結構中我們也就是學到了若幹處理的算法, 我想真正數起來也就是幾十個算法吧。 學習數據結構也就是要掌握這幾十種算法, 多簡單。至於如何掌握每個算法呢, 我想就是多看看書, 重要的是能夠理解。

我能獨自完成作業!

這裏我的定義和老師的不同, 老師是鼓勵大家討論的, 不過我發現還是有壹些同學就是先問好別人算法,然後再自己寫, 雖然這個不算抄襲作業, 但自己基本上沒有壹個思考問題的過程, 雖然要理解算法也會要思考很多, 但是因為沒有自己獨立的思考過程, 要自己寫程序、 寫算法的時候根本寫不出來, 所以我想如果真的想學好數據結構的話, 最好是能夠自己思考問題, 不要剛想了壹會就覺得做不出來, 然後就去問其他人。其實老師給我們的作業還是基於我們的水平的, 我絕對相信我們自己能夠獨自想出算法, 雖有可能會比較長時間吧, 但是這樣肯定會比問其他人學到更多的東西。當然我並不是說不要問同學, 有時候就是腦筋轉不過來,壹問別人就懂了, 當然問了別人不能只是我知道了這個算法, 還應該去想如何思考才能得到這個算法,這樣水平會提高很多。

多實驗!

這個就沒有太多理由了, 我壹直覺得編程是壹門熟練科學, 多編程,水平肯定會提高, 最重要的是能夠養成壹種感覺,就是對程序對算法的敏感, 為什麽那些牛人看壹個算法壹下子就看懂了看而自己要看很久才能弄懂, 而且弄懂了過了壹陣子又忘記了看其實這個是因為牛人們以前看的程序很多, 編得也很多, 所以他們有了那種感覺,所以我覺得大家應該多看程序, 多寫程序, 培養自己的感覺。

2 復習和考試的技巧

我想大家應該都有這樣的感覺,就是覺得自己什麽都掌握了, 但是在考試的時候就是會犯暈, 有時候壹出考場就知道錯在哪個了, 然後考完以後壹對答案,發現其實考得很簡單, 應該都是自己會做的, 這個就是與自己的復習和考試的技巧有關系了。

首先就是復習, 前面已經說過其實我們學的算法也就是幾十個, 那麽我們的任務也就是理解這幾十個算法, 復習也就是要加深妳的理解。如何理解算法, 然後理解到什麽程度呢看 是能默出整個算法嗎看其實不是這樣的, 數據結構的考試有它的特點, 考過期中考試了, 大家應該都發現數據結構其實不要求妳把整個算法背出來, 它註重考察妳的理解, 那麽怎麽考察呢看其實也就是兩種方式吧, 壹種就是用實例, 就是給妳壹個例子, 要妳用某個算法運行出結果, 我想這個期末考試的時候仍然會有很多這樣的題目, 比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個算法都自己用例子去實踐壹下, 以不變應萬變,我期中復習的時候就是這樣去做的, 而且考試之前我就覺得那個並查集的題目就很有可能會考, 於是就自己出了幾個例子,做了壹下。另外壹種考察方式就是算法填空和算法改錯, 可能有壹些同學覺得這種題目很難, 其實我們首先可以確定這兩種題目肯定是與書上算法有關系的, 只要理解了書上的算法就可以了,有人覺得看完書以後什麽都懂了, 而且要默也默得出來, 其實不是這樣的,算法改錯和填空主要是考察的細微處, 雖然妳覺得妳默得出來, 那是能夠默出算法的主體部分, 很多細微的地方妳就會很容易忽略。我想大家考過期中考以後應該都有這種感覺吧看那要怎樣解決這種問題呢看 我覺得有兩種方法, 壹種就是自己去編程實現, 這種方法比較有意義,還能夠提高編程水平, 另外壹種就是用實例分析算法的每句話, 我認為這種方法是最有效的。

然後還有壹種題目, 就是最後的寫算法的題目, 我覺得這種題目還是很好解決的, 只要是能夠自己做出作業的, 基本上都會很容易做出來,這也是為什麽我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心, 尤其是題目簡單的時候, 那肯定會有壹些小地方要考慮清楚,壹不小心就會被扣掉很多分, 這樣很不值。

我覺得考試的時候沒有太多要講的, 只要復習好了, 考試的時候細心壹點就可以了, 然後就是做壹個題目開始就要盡量保證正確,如果覺得留在那裏等後面做完了再來檢查,這樣錯誤還是很有可能檢查不出來, 我期中考試的時候就基本上沒有檢查, 因為我做每個題目都是確保正確, 用的時間也挺多的, 然後也覺得沒有檢查的必要了。

壹個學生學習數據結構的體會(轉)

讀《數據結構(C語言版)》(1)

今天開始認真讀這本清華版的數據結構,嚴蔚敏和吳偉民編著。也許妳會奇怪我為什麽會選擇這本C語言描述的數據結構書,現在的數據結構不都用面向對象語言描述嗎看其實這本書不是我選的,而是我參加的機試指定的參考書。不過對於本書選用的語言,我倒有自己的看法。用C語言描述顯然有很多不便,但是在壹個充斥著用OO描述數據結構的世界裏,從OO中抽身出來用C看待數據結構的思想,也許更能看清數據結構的本質。

好了,言歸正傳。在今天這第壹篇文章裏,我來探討壹下數據結構的基本概念。作者壹開篇就歸納了計算機解題的壹般步驟:逗首先要從具體問題抽象出壹個適當的數學模型,然後設計壹個解此數學模型的算法,最後編出程序,進行測試、調試直至得到最終解答。地我把它再進壹步歸納壹下,就是:抽象數學模型——設計算法——編寫程序。這個思路非常重要,除了壹些非常簡單的問題,所有的程序設計都應該遵循這三個基本步驟。我們平時寫程序常犯的錯誤是忽略第壹個或第二個步驟,或者更甚者,前兩個都忽略。

在設計數學模型的過程中,實際上就引出了數據結構的概念。本書中作者給出的定義是:逗簡單來說,數據結構是壹門研究非數值計算的程序設計問題中計算機的操作對象以及它們之間的關系和操作等的學科。地國內的教材為了語言上的嚴謹常常把話說得很難懂。請大家註意這句話裏的這幾個關鍵詞:1)非數值計算,這說明了數據結構這門學科的應用範圍,如果妳想解壹個線性方程組,大概很難直接找到合適的數據結構;2)操作對象,也就是問題中的數據及其表示的形式;3)關系,即數據間的關系;4)操作,即針對數據的操作。

把以上的定義用公式寫出來,就是

Data_Structure = (D, S)

其中D是數據元素的有限集,S是D上關系的有限集。所以在設計數據結構時,首要的任務就是找出要操作的數據,其次是挖掘出數據間的關系。這兩步完成以後,數據的邏輯結構就定下來了。其中數據間的結構有以下幾種:

集合,這和數學中的集合概念是壹致的;

線性結構,即數據元素之間壹對壹的關系;

樹形結構,即數據元素之間壹對多的關系;

圖狀結構或網狀結構,即數據元素之間多對多的關系。

然而只有邏輯結構是不夠的,程序要能夠運行,必須把數據的邏輯結構在計算機中表示出來,也就是設計物理結構。大多數高級語言都對數據的物理結構有較好支持,如各種數據類型。作者在解釋數據類型的概念時說到:逗引入數據類型的目的,從硬件的角度看,是作為解釋計算機內存中信息含義的壹種手段,而對使用數據類型的用戶來說,實現了信息的隱蔽,即將壹切用戶不必了解的細節都封裝在類型中。地這個概括非常精辟,從中可以看出以後的OOP只是在更高層次上對信息的封裝和隱蔽。

對數據類型進壹步擴展,作者引出了抽象數據類型的概念。抽象數據類型(ADT)是指壹個數學模型以及定義在該模型上的壹組操作。在引入抽象數據類型後,使邏輯結構更加獨立,從而讓程序員可以更加專註於邏輯結構的設計。把抽象數據類型用公式表示出來,就是(D, S, P),其中D是數據對象,S是D上的關系集,P是對D的基本操作集。如果計算機解題壹定要遵循壹個通用的模式的話,上面這個式子就給出了答案。

讀《數據結構(C語言版)》(2)

本節談壹談算法分析和大O估算法(big-O notation)。算法效率的度量壹般采用事前分析估算的方法,通常的做法是,逗從算法中選取壹種對於所研究的問題(或算法類型)來說是基本操作的原操作,以該基本操作重復執行的次數作為算法的時間量度地。談到這裏時,作者引出了大O估算法。

在本書中,作者對大O估算法的介紹顯得有些草率。壹開始就冒出壹個式子T(n) = O(n3),然後在本頁最底下用小字介紹了所謂的逗"O"的形式定義地:若f(n)是正整數n的壹個函數,則xn=O(f(n))表示存在壹個正的常數M,使得當n≥n0時都滿足|xn|≤M|f(n)|。也許是我數學基礎太差,總之看到這個定義時我壹頭霧水。不知道為什麽作者沒有花壹點篇幅介紹大O估算法的由來和定義。我google了壹下,發現了這樣的介紹:

Definition: A theoretical measure of the execution of an algorithm, usually the time or memory needed, given the problem size n, which is usually the number of items. Informally, saying some equation f(n) = O(g(n)) means it is less than some constant multiple of g(n). The notation is read, "f of n is big oh of g of n".

Formal Definition: f(n) = O(g(n)) means there are positive constants c and k, such that 0 ≤ f(n) ≤ cg(n) for all n ≥ k. The values of c and k must be fixed for the function f and must not depend on n.

Note: As an example, n2 + 3n + 4 is O(n2), since n2 + 3n + 4 < 2n2 for all n > 10. Strictly speaking, 3n + 4 is O(n2), too, but big-O notation is often misused to mean equal to rather than less than. The notion of "equal to" is expressed by Θ(n).

The importance of this measure can be seen in trying to decide whether an algorithm is adequate, but may just need a better implementation, or the algorithm will always be too slow on a big enough input. For instance, quicksort, which is O(n log n) on average, running on a small desktop computer can beat bubble sort, which is O(n2), running on a supercomputer if there are a lot of numbers to sort. To sort 1,000,000 numbers, the quicksort takes 20,000,000 steps on average, while the bubble sort takes 1,000,000,000,000 steps!

Any measure of execution must implicitly or explicitly refer to some computation model. Usually this is some notion of the limiting factor. For one problem or machine, the number of floating point multiplications may be the limiting factor, while for another, it may be the number of messages passed across a network. Other measures which may be important are compares, item moves, disk accesses, memory used, or elapsed ("wall clock") time.

(以上介紹來自:Paul E. Black, "big-O notation", from Dictionary of Algorithms and Data Structures, Paul E. Black, ed., NIST.)

另外,這個帖子也討論了算法的時間復雜度估計,說得非常通俗易懂。

讀《數據結構(C語言版)》(3)

問題描述

設計壹個可進行復數運算的演示程序。

基本要求

實現下列六種基本運算:

由輸入的實部和虛部生成壹個復數;

兩個復數求和;

兩個復數求差;

兩個復數求積;

從已知復數中分離出實部;

從已知復數中分離出虛部。

運算結果以相應的復數或實數的表示形式顯示。

(全文見附件)

  • 上一篇:如何學好英語
  • 下一篇:輕音少女田井中律(CV:佐藤聡美目指せハッピー100%↑↑↑羅馬
  • copyright 2024編程學習大全網