データ構造の理解


転載先:http://blog.csdn.net/andrexpert/article/details/77900395
Android Javaデータ構造Android基礎技術核心帰納(一)Java基礎技術核心帰納(一)データ構造基礎知識核心帰納(一)Android基礎技術核心帰納(二)Java基礎技術核心帰納(二)データ構造基礎知識核心帰納(二)Android基礎技術核心帰納(三)Java基礎技術核心帰納(三)データ構造基礎知識核心帰納(三)Android基礎技術核心帰納(四)
     
いつの間にかまた1年の9月で、今日1人の師弟とチャットして、彼の今の面接のいくつかの情況について話して、突然自分がその年もこのように歩いてきたことを思い出して、急に感慨深いです.Android/Java経験まとめシリーズ記事は、当初自分が卒業したときの筆記試験や面接、プロジェクト開発に関するまとめであり、あまり深くないものであり、きちんとまとめられていないものの、Android、アルゴリズム、Javaについては大まかに把握しておくのは問題ないと思いますが、今日はわざわざこれらの記事を出して、このシリーズを見た卒業生の皆さんに少しでも助けてほしいですね.もちろん、当时の知识の制限を受けているので、きちんとまとめられていないかもしれませんが、疑问があればコメントしてください.
1.スタック、キュー、スタックの違いを簡単に説明しますか?1.ヒープ:ヒープは木状のデータ構造です.一般的にプログラマによってリリースが割り当てられ、newによって作成するオブジェクトと配列(Cではmallocによってリリースされ、freeによってリリースされる)が格納され、JVMはこのオブジェクトを不定期に表示し、このオブジェクトを参照しなければ回収する.
(1)利点:メモリサイズを動的に割り当てることができ、生成サイクルは事前にコンパイラに教える必要がなく、Javaゴミ回収自動回収データ;(2)欠点:運転時にメモリを動的に割り当てる必要があるため、データ記憶速度が深入理解数据结构_第1张图片より遅い.スタック:一端のみの挿入と削除を許可する線形テーブルです.すなわち、先進的な後出です.コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などの基本タイプの変数とオブジェクトの参照が格納されます.(1)利点:メモリ速度比較ブロックは、レジスタに次いでスタックデータが共有可能である;(2)欠点:スタックに存在するデータサイズと生存期間は確定しなければならない(int y=4,yはスタックに4バイトを占める)、柔軟性に欠ける.≪キュー|Queue|oem_src≫:エンド・エンドでのみデータ要素の挿入を許可し、エンド・エンド・エンドでデータ要素を削除するリニア・テーブルです.つまり、FIFOを先に出力します.キューでは、データ要素は任意に増減できますが、データ要素の順序は変わりません.キューからデータ要素が取り出されるたびに、後ろのデータ要素は一度に1ビット前進します.参照先:http://www.sxt.cn/u/1349/blog/23302.配列とチェーンテーブルの違いを簡単に話しますか?(1)論理構造から見ると,配列は一定の長さ(要素個数)を定義し,データの動的増減に適応できない場合を実現しなければならない.データが増加すると、オーバーフローを引き起こす可能性があります.データが減少するとメモリが浪費され、配列にデータ項目が挿入、削除されると、他のデータ項目を移動する必要があります.チェーンテーブルは動的にストレージ割り当てを行い、データを動的に増減させることができ、メモリを節約でき、データデータ項目の挿入、削除を容易にすることができる.(2)メモリストレージから見ると、(静的)配列はスタックから空間を割り当て(注:newで作成されたスタックに割り当て)、ストレージ速度は速いが柔軟性に欠けている.チェーンテーブルはスタックから空間を割り当て、柔軟性は良いが、申請管理は面倒である.(3)アクセス方式から見ると,配列はメモリに連続的に格納されているため,下付きインデックスによるランダムアクセスが可能である.チェーンテーブルはチェーンストレージ構造であり,要素にアクセスする際には線形の方法で前後から順次アクセスするしかないため,アクセス効率は配列よりも低い.3.単一チェーンテーブルの作成、挿入、削除操作1.単一チェーンテーブル作成、挿入、削除(1)ノード構造体

    
    
    
    
  1. /***struct Node *
  2. struct Node ** */
  3. typedef struct
  4. {
  5. int data; // ,
  6. struct Node *next; // , next struct Node * ( )
  7. }Node,*LinkList; //Node ,*LinkList
(2)
: , p, p。 , j 1 , j

        _ 2


    
    
    
    
  1. /* : i ,1<=i<=ListLenght(L)
  2. e */
  3. #define UNSUCCESS -1
  4. #define SUCCESS 1
  5. typedef Status int;
  6. Status GetElem(LinkList L,int i,int *e)
  7. {
  8. int j= 1;
  9. LinkList p; // p
  10. p=L->next; // p L
  11. while(p&&j// , j=i-1, p i-1
  12. p=p->next; // p ,
  13. ++j;
  14. }
  15. if(!p || j>i) // p null j ,
  16. return UNSUCCESS ;
  17. *e=p->data; // , i e
  18. return SUCCESS;
  19. }
(3)
: , , i ; , s s ; , p s , s 。

        _ 3


    
    
    
    
  1. /* : e i */
  2. #define UNSUCCESS -1
  3. #define SUCCESS 1
  4. typedef Status int;
  5. Status ListInsert(LinkList *L,int i,ElemType e)
  6. {
  7. int j= 1;
  8. LinkList p,s; // p
  9. p=*L; // p L
  10. while(p&&j// , j=i-1, p i-1
  11. p=p->next; // p
  12. ++j;
  13. }
  14. if(!p || j>i) // p null j ,
  15. return UNSUCCESS ;
  16. s=(LinkList) malloc( sizeof(Node)); // ,
  17. s->data=e; // , e s
  18. s->next =p->next; // p s (p->next p )
  19. p->next=s; // p s
  20. return SUCCESS ;
  21. }
(4)
: , q , i ; , i q; , q ( p ) p ; , i (q) e ,free(q) q 。

        _ 4


    
    
    
    
  1. /*** : L i ( )
  2. e ***/
  3. #define UNSUCCESS -1
  4. #define SUCCESS 1
  5. typedef Status int;
  6. Status ListInsert(LinkList *L,int i,ElemType *e)
  7. {
  8. int j= 1;
  9. LinkList p,q; // p
  10. p=*L;
  11. // , j=i-1, p i-1
  12. while(p->next&&j
  13. {
  14. p=p->next; // p
  15. j++;
  16. }
  17. if(!p || j>i)
  18. return UNSUCCESS;
  19. q=p->next; // q p , i q
  20. p->next=q->next; // q p
  21. *e=q->data; // q e
  22. free(q); // , ,
  23. return SUCCESS;
  24. }
  25. :LinkList s , , 。
    2.
    : , (*L), NULL; , p, , (*L) ( NULL); , p 。
            _ 5
    
        
        
        
        
    1. /***
    2. n , L( )***/
    3. //
    4. typedef struct{
    5. int data;
    6. struct Node* next;
    7. }Node;
    8. //
    9. Node* CreateList(int *a, int count)
    10. {
    11. if( NULL == a)
    12. return NULL;
    13. // : , 、
    14. Node* head = (Node*) malloc( sizeof(Node));
    15. head->data= a[ 0];
    16. head->next = NULL;
    17. // p
    18. Node* p = head;
    19. for ( int i = 1; i < count; ++i)
    20. {
    21. p->next = (Node*) malloc( sizeof(Node));
    22. p->next->data= a[i];
    23. p->next->next = NULL;
    24. p = p->next;
    25. }
    26. return head; //
    27. }
        , main , :
        int a[]={5,9,3,1,2,7,8,6,4};
        Create_LinkList(a,sizeof(a)/sizeof(int));                 // , ,
    3.
    (1) : , , O(1), O(n)
    (2) 、 : : i ;
        ★ , : O(n)。 i , , 。 i , 10 , , n-i , O(n)。 , i , O(n), , O(1)。
    : , 。

    4.

    (1)
    (2) ,

    (1) : O(1); O(n)
    (2) : , O(n); , O(1)

    (1) , , , ;
    (2) , ,
    5.
    (1) : , ( )。 , , 。
    (2) : , 。 , 。


    4. ?
     1.

        , , , 。
    (1)
        A、B , rearA、rearB。
    a. A rearA (rearA->next)B ( );
    b. B rearB (rearB->next)A , 。
    (2)
    
        
        
        
        
    1. p=rearA->next; // p, A
    2. rearA->next=rearB->next->next;
    3. // B ( ) rearA->next( A )
    4. rearB->next=p; // A rearB->next
    5. free(p); // p, p
            _ 6
    : , p->next 。 p->next ; p->next , rear, rear->next 。   
    2.
        , 。 , , , 。 。
    (1)

                a) s, 、
                            s->prior=p;         
                            s->next=p->next;
                b) s p->next (p->next->prior)
                            p->next->prior = s;
                c) s p (p->next)
                           p->next = s;(b.c , p->next->prior = p)
    (2)

    
        
        
        
        
    1. p->prior->next=p->next; // p->next p->prior
    2. p->next->prior=p->prior; // p->prior p->next
    3. free(p); // p

            _ 7

    5. ( ) ( )?
    1. –
    (1) : ,prev NULL,head A,next A B。 A , A next prev, prev NULL, A , head next , B B C( next B , A next ), A 。 , , B、C、D , head Null 。

    
        
        
        
        
    1. head->next = prev; // A next prev
    2. prev = head; // prev A
    3. head = next; // head B
    4. next = head->next; // next( head->next) C

            _ 8

    (2) :
    
        
        
        
        
    1. 61 LINK_NODE *ReverseLink(LINK_NODE *head) // head
    2. 62 {
    3. 63 LINK_NODE *next;
    4. 64 LINK_NODE *prev = NULL; //
    5. 66 while(head != NULL) //
    6. 67 {
    7. 68 next = head->next; // next head->next
    8. 69 head->next = prev;
    9. 70 prev = head;
    10. 71 head = next;
    11. 72 }
    12. 74 return prev;
    13. 75 }
    2..
        , , , 。
    (1) : ,pA ,pB , …… , pB==NULL, ( NULL), ; pB==pA( ), , 。
    (2)
    
        
        
        
        
    1. int RingJudge(LINK_NODE *head){
    2. LINK_NODE *p,*q;
    3. /* h */
    4. if(( NULL == head) || ( NULL == head->next)) /* , , */
    5. {
    6. return 0;
    7. }
    8. p = q = head; /* p q , */
    9. while( 1)
    10. {
    11. p = p->next;
    12. q = (q->next)->next;
    13. if(( NULL == p) || ( NULL == q))
    14. {
    15. printf(“No Ringn”); /* , */
    16. return 0;
    17. }
    18. if(p == q) /* */
    19. {
    20. printf(“Ring occurred
      ”);
    21. return 1;
    22. }
    23. }
    24. }
    :http://blog.csdn.net/autumn20080101/article/details/7607148
    6. K ?
    1.

    (1) a k
    (2) b , a k , a , b k 。   
    2.
        n,a k n-k , b n-k , b =n-(n-k)=k
    
        
        
        
        
    1. LINK_NODE *GetKElem(LINK_NODE *head,int k,ElemType *e){
    2. if(head == null){ //
    3. return null;
    4. }
    5. LINK_NODE *first,*second; // ,
    6. first = second = head;
    7. /*
    8. *(1) k , first k
    9. */
    10. while(k != 0){
    11. if(first == null) // k
    12. return null;
    13. first = first->next;
    14. k--; // first k
    15. }
    16. /*
    17. *(2) first , second , first k
    18. * first->next Null , , second K
    19. */
    20. while(first != null){
    21. first = first->next;
    22. second = second->next;
    23. }
    24. if(second != null && second != head) // K e
    25. *e = second->data;
    26. return second;
    27. }
    7. ? [O(nlogn)],
        , , , , 。
    1. ( )
    (1) : , , , , 。 :
    a. , ;
    b. , ;
    c. , 。
        :
            _ 9
    (2)
    
        
        
        
        
    1. LinkNode* SortLinkListInsertion(LinkNode* head)
    2. {
    3. // , ,
    4. if ( NULL == head || NULL == head->next){
    5. return head;
    6. }
    7. // ,
    8. LinkNode* r = head->next;
    9. LinkNode* tmp;
    10. head->next = NULL; //
    11. while( NULL != r) { //
    12. if (r->data < head->data) {
    13. // , ,
    14. tmp = r->next;
    15. r->next = head;
    16. head = r;
    17. r = tmp;
    18. }
    19. else{
    20. // ,
    21. LinkNode* p = head;
    22. while( NULL != p->next){
    23. // ,
    24. // !
    25. if (r->data < p->next->data) {
    26. tmp = r->next;
    27. r->next = p->next;
    28. p->next = r;
    29. r = tmp;
    30. continue; // ,
    31. }
    32. else {
    33. p = p->next;
    34. }
    35. }
    36. // ,p ,
    37. if ( NULL == p->next){
    38. tmp = r->next;
    39. r->next = NULL;
    40. p->next = r;
    41. r = tmp;
    42. }
    43. } //end else
    44. } //end while(NULL != r)
    45. return head;
    46. }
    2. ( )
    (1) : , , 。 。 , , ( trick, ), : 。 , , 。 , 。
              _ 10
    (2)
    
        
        
        
        
    1. LinkNode* SortLinkListSelection2(LinkNode* head)
    2. {
    3. // , ,
    4. //if (NULL == head || NULL == head->next)
    5. //{
    6. // return head;
    7. //}
    8. LinkNode* p = NULL; //
    9. LinkNode* pminpre = NULL; //
    10. LinkNode L = { 0, NULL}; // ,
    11. LinkNode* Ltail = &L; //Ltail
    12. while ( NULL != head && NULL != head->next) // 2
    13. {
    14. pminpre = head;
    15. p = head->next;
    16. while( NULL != p && NULL != p->next) //
    17. {
    18. if (p->next->val < pminpre->next->val) // pminpre
    19. pminpre = p;
    20. p = p->next;
    21. }
    22. if (head->val <= pminpre->next->val) // , ,
    23. {
    24. Ltail = Ltail->next = head;
    25. head = head->next;
    26. }
    27. else
    28. {
    29. Ltail = Ltail->next = pminpre->next;
    30. pminpre->next = pminpre->next->next;
    31. }
    32. }
    33. Ltail = Ltail->next = head; //
    34. Ltail->next = NULL; //
    35. return L.next;
    36. }
    if < <= , 。
     
    3. ( )
    (1) : , 。 end , ,end , N-1 。 , pre,cur,n , 。
            _ 11
        :
     
    
        
        
        
        
    1. //asscending sort link list
    2. LinkNode* SortLinkListBubble(LinkNode* head)
    3. {
    4. if ( NULL == head)
    5. {
    6. return head;
    7. }
    8. //init end pointer
    9. LinkNode* end = NULL
    10. while( true)
    11. {
    12. LinkNode* n = head->next;
    13. if (n == end)
    14. break;
    15. // ,
    16. if (n->val < head->val)
    17. {
    18. head->next = n->next;
    19. n->next = head;
    20. head = n;
    21. }
    22. LinkNode* pre = head;
    23. LinkNode* cur = head->next;
    24. LinkNode* tmp;
    25. n = cur->next;
    26. while(n != end)
    27. {
    28. if (n->val < cur->val)
    29. {
    30. tmp = n->next;
    31. cur->next = n->next;
    32. n->next = cur;
    33. pre->next = n;
    34. n = tmp;
    35. }
    36. else
    37. {
    38. n = n->next;
    39. }
    40. pre = pre->next;
    41. cur = cur->next;
    42. }
    43. end = cur;
    44. }
    45. return head;
    46. }
    4. ( )
        , QsortList , , , , QsortList 3 , 。 , , , , , 。
    (1) : ( ), pivot, , pivot, pivot, pivot 。 , 。
    (2)
        , , 。
    
        
        
        
        
    1. void QsortList(LinkNode*& head, LinkNode* end)
    2. {
    3. if(head == NULL || head == end)
    4. return;
    5. LinkNode* pivot = head;
    6. LinkNode* p = head->next;
    7. LinkNode* head1 = NULL, *tail1 = NULL;
    8. LinkNode* head2 = NULL, *tail2 = NULL;
    9. while(p != end)
    10. {
    11. if(p->val < pivot->val)
    12. {
    13. if(head1 == NULL)
    14. {
    15. head1 = tail1 = p;
    16. }
    17. else
    18. {
    19. tail1->next = p;
    20. tail1 = p;
    21. }
    22. }
    23. else
    24. {
    25. if(head2 == NULL)
    26. {
    27. head2 = tail2 = p;
    28. }
    29. else
    30. {
    31. tail2->next = p;
    32. tail2 = p;
    33. }
    34. }
    35. p = p->next;
    36. }
    37. if (tail1)
    38. tail1->next = pivot;
    39. if (head2)
    40. pivot->next = head2;
    41. else
    42. pivot->next = end;
    43. if (tail2)
    44. tail2->next = end;
    45. if (head1)
    46. head = head1;
    47. else
    48. head = pivot;
    49. QsortList(head, pivot); // head, head1, head
    50. // pivot->next head2,
    51. QsortList(pivot->next, end);
    52. }
    QsortList QsortList(L, NULL);
    , ; , , , 。
    :http://blog.sina.com.cn/s/blog_6fb300a30100ng0s.html
    8. ?
        , , La , Lb 。 , :
        a. , ( ) ;
        b. , 。
            _ 12
    2.
    (1)
        , , , , 。
        , : ?— : fast slow, ,slow ,fast , , fast , slow , 。 fast Null, , 。
    (2)
            _ 13
    3.
    (1)
        , , , , 。 : , , , 。
    (2)
       O(length1 + length2)
       O(length1)
    : , , , O(length1) , 。
    4.
        ( ), O(len1*len2), , 。
    :http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2580026.html
                http://blog.csdn.net/jiqiren007/article/details/6572685

        1: C , (n) 。
    【 】 L, 4 : prior、 next、 data freq。 freq 0. L.Locate(x) , x freq 1, , , , 。
    【 】
    
        
        
        
        
    1. void Locate(int &x)
    2. {
    3. < >
    4. // , x
    5. *p = first->next;
    6. while (p != first && 1 p->data!=x )
    7. p = p->next;
    8. if (p != first)
    9. {
    10. 2 p->freq++; // , freq 1
    11. < >
    12. *current = p;
    13. current->prior->next = current->next;
    14. current->next->prior = current->prior;
    15. p = current->prior;
    16. // ,
    17. while (p != first && 3 p->freq<=x)
    18. p = p->prior;
    19. current->next = 4 p->next;
    20. current->prior = p;
    21. p->next->prior = current;
    22. p->next = 5 current;
    23. }
    24. else
    25. printf(“Sorry. Not find!
      ”); \* *\
    26. }