데이터 구조 와 알고리즘 --- 자바 실현 (제2 장 데이터 구조 상)

제2 장 데이터 구조
1. 데이터 구조의 개술
  • 데이터 구 조 는 모든 알고리즘 이 실현 하 는 기초 이자 프로 그래 밍 언어의 기초 이다.
  • 데이터 구 조 는 컴퓨터 가 데 이 터 를 저장 하고 조직 하 는 방식 이자 서로 한 가지 또는 여러 가지 관계 가 존재 하 는 데이터 의 집합 을 말한다.

  • 2. 데이터 구조의 기본 적 인 의미
  • 하나의 데이터 구 조 는 데이터 요소 가 특정한 논리 에 따라 구 성 된 것 으로 데이터 요소 간 의 논리 관계 에 대한 묘 사 를 데이터 의 논리 구조 라 고 한다.데 이 터 는 반드시 컴퓨터 에 저장 해 야 하기 때문에 데이터 의 저장 구 조 는 컴퓨터 내 에서 의 표현, 즉 데이터 구조의 실현 형식 이다.

  • 3. 데이터 구조 에서 의 기본 개념
    (Data): 데 이 터 는 정보의 매개체 이다.
  • 데이터 요소 (데이터 Element): 데이터 의 기본 단위;
  • 데이터 구조 (데이터 Structure): 데이터 간 의 상호 관계, 즉 데이터 의 조직 형식 입 니 다.
  • 4. 데이터 구조의 내용
  • 데이터 의 논리 구조: 데이터 요소 간 의 논리 관계
  • 데이터 의 저장 구조: 데이터 요소 와 그 논리 관계 가 컴퓨터 메모리 에서 의 표현 형식
  • 데이터 의 연산: 데이터 에 대한 조작
  • 데이터 구 조 는 유기적인 전체
  • 이다.
    같은 논리 구 조 는 서로 다른 저장 구 조 를 가 질 수 있다 (예 를 들 어 선형 표 는 순서 표 화해시키다 링크
    같은 저장 구조 에 도 서로 다른 데이터 연산 집합 이 있 을 수 있다 (예 를 들 어 선형 표 의 삽입 과 삭제 위치 가 다르다. 창고.
    5. 데이터 구조의 분류
  • 선형 구조: 각 결점 간 은 선형 관계
  • 선형 구조 비 공 집합
    시작 점 과 끝 점 이 하나 밖 에 없다.
    최대 하나의 직접 전구 결점 과 하나의 직접 후계 결점 만 있다.
        2. 비 선형 구조: 각 결점 간 은 다 대응 관계 이다.
    비 선형 구조 비 공 집합
    하나의 결점 은 여러 개의 직접 전구 결점 과 직접 후계 결점 이 있 을 수 있다
    6. 데이터 구조의 몇 가지 저장 방식
  • 순서 저장: 연속 적 인 저장 구역 에 하나씩 저장 되 는데 주로 기 존의 논리 구 조 를 묘사 하 는 저장
  • 에 사용 된다.
  • 링크 저장 소: 논리 적 으로 인접 한 결점 이 물리 적 위치 에서 도 인접 하도록 요구 하지 않 고 결점 간 의 논리 관 계 는 인용 필드 로 표시 합 니 다
  • 색인 저장: 추가 색인 표 방식 으로 노드 정 보 를 저장 하고 조밀 한 색인 과 희소 색인 두 가지
  • 로 나 뉜 다.
  • 해시 저장: 노드 의 키워드 에 따라 노드 가 저장 주소 에 있 는 위 치 를 직접 계산 합 니 다
  • 7. 데이터 형식 
  • 기본 데이터 형식: 값 은 더 이상 분해 할 수 없습니다. eg: 정형, 문자 형, 부동 소수점 형
  • 취 합 데이터 형식: 몇 개의 분량 으로 나 눌 수 있 습 니 다. eg: 배열, 사용자 정의 데이터 형식
  • 추상 적 인 데이터 형식 ADT: 데이터 의 조직 과 관련 된 조작 은 데이터 의 논리 구조 와 논리 결과 에 정 의 된 조작 이 라 고 볼 수 있다
  • 일반적으로 두 가지 중요 한 특징 을 가지 는데 그것 이 바로 데이터 추상, 데이터 봉인 이다.
    장점: 데이터 와 조작 을 한데 묶 어 정보의 숨 김 을 실현 한다.
    자바 에 서 는 인터페이스 로 ADT 를 나타 내 고 인터페이스의 실현 류 로 ADT 를 실현 하 며 ADT 는 개념 층 의 추상 이 고 인 터 페 이 스 는 실현 층 의 추상 이다.
    8. 상용 데이터 구조
    배열 (Array), 스 택 (Stack), 대기 열 (Queue), 링크 (Linked) List), 트 리 (Tree), 그림 (Graph), 더미 (Heap), 산 목록 (Hash)
    9. 적합 한 데이터 구 조 를 선택 하여 실제 문 제 를 해결한다.
    수치 계산 문제: 수학 과 공학 의 계산 알고리즘
    비수 치 계산 문제: 데이터 구조
    10. 선형 표
           1. 선형 표 란 무엇 인가
             n (n > 0) 개 데이터 요소 로 구 성 된 유한 서열.
           2. 선형 표 의 기본 연산
             초기 화, 계산 표 길이, 결점 가 져 오기, 결점 찾기, 결점 삽입, 결점 삭제
    11. 순서 표 구조
            1. 순서대로 저장 하 는 선형 표. 이 선형 표 의 결산 점 은 논리 적 순서에 따라 컴퓨터 의 연속 적 인 저장 장치 에 저장 된다.
            2. 조작 순서 표 연산 의 기본 규칙: LOC(ai)= LOC(a1) + (i-1)* c   (1<= i <= n)
            3. 순서 표 구조의 프로 그래 밍
             코드 표시:
    import java.util.Scanner;
    
    /**
     *     
     *            
     */
    //         
    class DATA {
        String key;                                 //      
        String name;
        int age;
    }                                               //    
    
    //     
    class SLType {                                  //       
        static final int MAXLEN = 2;              //          (       )
        DATA[] ListData = new DATA[MAXLEN + 1];    //          
        int ListLen;                                //          
    
        //     
        void SLInit(SLType SL) { //      
            SL.ListLen = 0;       //      
        }
    
        //       (     L      )
        int SLLength(SLType SL) {
            return SL.ListLen;
        }
    
        //    
        int SLInsert(SLType SL, int n, DATA data) {
            int i;
            if (SL.ListLen >= MAXLEN) {
                System.out.println("     ,      ");
                return 0;       //      
            }
            if (n < 1 || n > SL.ListLen - 1) {
                System.out.println("        ,    !");
                return 0;
            }
            //            
            for (i = 0; i < SL.ListLen; i++) {
                SL.ListData[i + 1] = SL.ListData[i];
            }
            SL.ListData[n] = data;
            SL.ListLen++;
            return 1;   //    
        }
        
        //    
        int SLAdd(SLType SL, DATA data) {
            if (SL.ListLen >= MAXLEN) {
                System.out.println("     ,        ");
                return 0;
            }
            SL.ListData[++SL.ListLen] = data;
            return 1;
        }
        
        //     
        int SLDelete(SLType SL, int n) {
            int i;
            if (n < 1 || n > SL.ListLen + 1) {
                System.out.println("        ,    !");
                return 0;
            }
            for (i = 0; i < SL.ListLen; i++) {
                SL.ListData[i] = SL.ListData[i + 1];
            }
            SL.ListLen--;
            return 1;
        }
    
        /**
         *     (          )
         */
    
        //        
        DATA SLFindByNum(SLType SL, int n) {
            if (n < 1 || n > SL.ListLen) {
                System.out.println("      ,      !");
                return null;
            }
            return SL.ListData[n];
        }
    
        //         
        int SLFindByCont(SLType SL, String key) {
            int i;
            for (i = 1; i <= SL.ListLen; i++) {
                if (SL.ListData[i].key.compareTo(key) == 0) {
                    return i;       //      
                }
            }
            return 0;
        }
    
        //      
        int SLAll(SLType SL) {
            int i;
            for (i = 1; i <= SL.ListLen; i++) {
                System.out.println(SL.ListData[i].key + " " + SL.ListData[i].name + " " + SL.ListData[i].age);
            }
            return 0;
        }
    }
    //-------------------------------------------------------------------//
    /**
     *                      
     */
    public class SortTable {
        public static void main(String[] args) {
            
            int i;
            SLType SL = new SLType();
            DATA pdata;
            String key;
    
            System.out.println("       !");
    
            SL.SLInit(SL);  //      
            System.out.println("        ");
            Scanner scanner = new Scanner(System.in);
    
            do {    //        
                System.out.println("        (        )");
                DATA data = new DATA();
                data.key = scanner.next();
                data.name = scanner.next();
                data.age = scanner.nextInt();
                if (data.age != 0) {    //      0,    
                    if (SL.SLAdd(SL, data) == 0) {   //       
                        break;
                    }
                } else {  //    0
                    break;
                }
    
            } while (true);
            System.out.println("          :");
            SL.SLAll(SL);   //        
    
            System.out.println("        :");
            i = scanner.nextInt();
            pdata = SL.SLFindByNum(SL, i);
            if (pdata != null) {
                System.out.println(" " + i + "    :" + pdata.key + " " + pdata.name + " " + pdata.age);
            }
    
            System.out.println("         :");
            key = scanner.next(); //           
            i = SL.SLFindByCont(SL, key);
            pdata = SL.SLFindByNum(SL, i);
            if (pdata != null) {
                System.out.println("    " + key + "    :" + pdata.key + " " + pdata.name + " " + pdata.age);
            }
        }
    }
    
    
    //  :
           !
            
            (        )
     
      
    18
            (        )
     
      
    30
            (        )
     
      
    30
         ,        
              :
         18
         30
            :
    1
     1    :     18
             :
     
             :     30

        코드 가 길 어서 개발 도구 에 넣 어 보 는 것 을 권장 합 니 다.
        4. 순서 구조의 단점:
                4.1 노드 를 삽입 하고 삭제 할 때 대량의 데 이 터 를 이동 해 야 한다.
                4.2 표 가 크 면 충분 한 저장 공간 을 분배 하기 어려워 서 메모리 분배 에 실패 할 때 가 있다.
    12. 링크 구조
             1. 링크 구조 란 무엇 입 니까? 동적 저장 분배 의 구조 형식 으로 필요 에 따라 동적 으로 신청 할 수 있 는 메모리 유닛 입 니 다.
             2. 링크 구조의 구성:
                데이터 부분: 실제 데이터 저장
                주소 부분: 다음 노드 의 주 소 를 저장 합 니 다.
             3. 장단 점
                           장점: 논리 연속 실제 주소 가 연속 되 지 않 고 대량의 데 이 터 를 저장 할 때 대량의 연속 공간 을 분배 할 필요 가 없다.
                            단점: 모든 노드 는 인용 변 수 를 추가 로 저장 하고 저장 공간 을 차지 해 야 합 니 다.
              4. 링크 분류:
                      단일 체인 시트, 양 방향 링크, 단일 순환 링크, 다 중 체인 의 순환 링크
               5. 코드 전시
    import java.util.Scanner;
    
    /**
     * 1.    
     */
    
    //         
    class DATA {
        String key;                                 //      
        String name;
        int age;
    }                                               //      
    
    //     
    class CLType {                                  //       
        DATA nodeData = new DATA();                 //      
        CLType nextNode;                            //       
    
        /**
         *     
         *       :
         * 1.            
         * 2.    head    ,     
         * 3.                  
         * 4.          null
         */
        CLType CLAddEnd(CLType head, DATA nodeData) {
            CLType node, htemp;
            if ((node = new CLType()) == null) { //  new              
                System.out.println("      !");
                return null;
            } else {
                node.nodeData = nodeData; //    
                node.nextNode = null; //          ,           ,       null
                if (head == null) {     //   
                    head = node;
                    return head;
                }
                htemp = head;
                while (htemp.nextNode != null) {   //       
                    htemp = htemp.nextNode;   //    ,       
                }
                htemp.nextNode = node;    //                ,         
                return head;
            }
        }
    
        /**
         *      
         * 1.      ,       
         * 2.          head      
         * 3.    head      
         */
        CLType CLAddFirst(CLType head, DATA nodeData) {
            CLType node;
            if ((node = new CLType()) == null) {
                System.out.println("      !");
                return null;
            } else {
                node.nodeData = nodeData; //        
                node.nextNode = head;     //           
                head = node;               //         ,          
                return head;
            }
        }
    
        /**
         *     
         *            
         *            
         */
        CLType CLFindNode(CLType head, String key) {
            CLType htemp;
            htemp = head;
            while (htemp != null) {
                //                   
                if (htemp.nodeData.key.compareTo(key) == 0) {
                    return htemp;
                }
                htemp = htemp.nextNode;    //       
            }
            return null;     //     
        }
    
        /**
         *     (             )
         * 1.      ,       
         * 2. head            ,            
         * 3.                    ,            
         */
        CLType CLInsert(CLType head, String findKey, DATA nodeData) {
    
            CLType node, nodeTemp;
            if ((node = new CLType()) == null) {
                System.out.println("      !");
                return null;
            }
            node.nodeData = nodeData; //       
            nodeTemp = CLFindNode(head, findKey);   //             
    
            if (nodeTemp != null) {
                node.nextNode = nodeTemp.nextNode;   //                 
                nodeTemp.nextNode = node;              //                
            } else {
                System.out.println("           !");
            }
            return head;
        }
    
        /**
         *     
         * 1.         
         * 2.                   
         * 3.    
         */
    
        int CLDelete(CLType head, String key) {
            CLType node, hTemp;      //node           
            hTemp = head;
            node = head;
            while (hTemp != null) {
                if (hTemp.nodeData.key.compareTo(key) == 0) {  //     ,    
                    node.nextNode = hTemp.nextNode;   //                
                    hTemp = null;                       //    
                    return 1;
                } else {
                    node = hTemp;                       //      
                    hTemp = hTemp.nextNode;             //      
                }
            }
            return 0;                                   //    
        }
    
        /**
         *       
         */
        int CLLength(CLType head) {
            CLType htemp;
            int Len = 0;
            htemp = head;
            while (htemp != null) {        //      
                Len++;
                htemp = htemp.nextNode;
            }
            return Len;
        }
    
        /**
         *       
         */
        void CLAllNode(CLType head) {
            CLType htemp;
            DATA nodeData;
            htemp = head;
            System.out.println("         " + CLLength(head) + "   ,     :");
            while (htemp != null) {
                nodeData = htemp.nodeData;  //        
                System.out.println(nodeData.key + " " + nodeData.name + " " + nodeData.age);
                htemp = htemp.nextNode;
            }
        }
    }
    //-------------------------------------------------------------------------
    
    /**
     * 2.       
     */
    public class LInkedTable {
    
        public static void main(String[] args) {
            //   
            CLType node, head = null;
            CLType CL = new CLType();
            String key, findKey;
    
    
            Scanner input = new Scanner(System.in);
            System.out.println("    .         ,   (         )");
            //    
            do {
                DATA nodeData = new DATA();
                nodeData.key = input.next();
                if (nodeData.key.equals("0")) {
                    break;                   //   0    ,       
                } else {
                    nodeData.name = input.next();
                    nodeData.age = input.nextInt();
                    head = CL.CLAddEnd(head, nodeData);  //        
                }
            } while (true);
            CL.CLAllNode(head);         //      
    
            System.out.println("      ,          :");
            findKey = input.next();
            System.out.println("           :(   ( 0)      )");
            DATA nodeData = new DATA();
            nodeData.key = input.next();
            nodeData.name = input.next();
            nodeData.age = input.nextInt();
            CL.CLInsert(head, findKey, nodeData);
            CL.CLAllNode(head);         //      
    
            System.out.println("      ,           :");
            key=input.next();
            CL.CLDelete(head,key);
            CL.CLAllNode(head);         //      
    
            System.out.println("        ,           :");
            key=input.next();
            node = CL.CLFindNode(head, key);
            if(node==null){
                System.out.println("     "+key+"   !");
            }else{
                nodeData = node.nodeData;
                System.out.println("         :"+nodeData.key+" "+nodeData.name+" "+nodeData.age);
            }
    
        }
    }
    
    //  :
        .         ,   (         )
            1
              
            18
            2
              
            20
            3
              
            30
            0
                     3   ,     :
            1    18
            2    20
            3    30
                  ,          :
            2
                       :(   ( 0)      )
            4
              
            32
                     4   ,     :
            1    18
            2    20
            4    32
            3    30
                  ,           :
            4
                     3   ,     :
            1    18
            2    20
            3    30
                    ,           :
            3
                     :3    30

               6. 눈 으로 만 보 는 것 보다 손 을 쓰 는 것 이 낫다.
    따뜻 한 알림: 코드 를 글 에 놓 으 면 너무 큰 폭 을 차지 하 는 것 같 습 니 다. 뒤의 긴 코드 는 github 에 놓 을 것 입 니 다. 필요 한 파트너 가 스스로 참고 지 도 를 다운로드 하 기 를 바 랍 니 다.
    Github 주소:https://github.com/flakkaqi/DataStructure_and_Algorithms.git

    좋은 웹페이지 즐겨찾기