20172323 2018-2019-1 《程序設計與數據結構》第三週學習總結

20172323 2018-2019-1 《程序設計與數據結構》第三週學習總結

教材學習內容總結

本週學習第五章隊列,主要了解了隊列的模型(處理過程),並學習了經過幾種方式來實現隊列,運用隊列解決問題以及幾種實現隊列方式的比較。php

5.1 概述

  • 隊列是一種線性結構,隊列元素按FIFO方式處理,從隊列刪除元素的次序,與往隊列放置元素的次序是同樣的。
    html

    在棧中,其處理過程只在棧的某一端進行,而在隊列中,其處理過程可在隊列的兩端進行
  • 關於隊列的操做前端

操做 說明
enqueue 向隊列末端添加一個元素
dequeue 從隊列前端刪除一個元素
first 考察隊列前端的那個元素
isEmpty 斷定隊列是否爲空
size 斷定隊列中元素的個數
toString 返回隊列的字符串表示

5.2 JavaAPI中的隊列

  • API沒有提供隊列類,只提供了一個Queue接口,提供了兩個方法add和offer用於添加和插入,element方法可用於檢索隊列首部的元素,poll和remove用於從隊列中刪除元素。

5.3 使用隊列:代碼密鑰

import java.util.*;

/**
 * Codes demonstrates the use of queues to encrypt and decrypt messages.
 *
 * @ author 20172323
 * @version 4.0
 */
public class Codes {
    /**
     * Encode and decode a message using a key of values stored in
     * a queue.
     */
    public static void main (String[] args){
        int[] key = {5, 12, -3, 8, -9, 4, 10};
        Integer keyValue;
        String encoded = "", decoded = "";
        String message = "All programmers are playwrights and all " + "computers are lousy actors.";
        Queue<Integer> encodingQueue = new LinkedList<>(Integer);
        Queue<Integer> decodingQueue = new LinkedList<>(Integer);

        /** load key queue */
        for (int scan = 0; scan < key.length; scan++){
            keyValue = encodingQueue.remove();
            encoded += (char) message.charAt(scan) + keyValue;
            ((LinkedList<Integer>) encodingQueue).add(keyValue);
        }
        System.out.println("Encoded Message:\n" + encoded + "\n");

        /** decode message */
        for (int scan = 0; scan < encoded.length(); scan++){
            keyValue = decodingQueue.remove();
            encoded += (char) message.charAt(scan) - keyValue;
            ((LinkedList<Integer>) decodingQueue).add(keyValue);
        }

        System.out.println("Decoded Message:\n" + decoded);
    }
}

隊列的性質使得密鑰值能保持正確的順序,不用擔憂什麼時候抵達密鑰末尾。java

5.4 使用隊列:售票口模擬

Customergit

public class Customer {
    private int arrivalTime, departureTime;
    public Customer(int arrives) {
        this.arrivalTime = arrives;
        this.departureTime = 0;
    }

    public int getArrivalTime() {
        return arrivalTime;
    }

    public void setArrivalTime(int arrivalTime) {
        this.arrivalTime = arrivalTime;
    }

    public int getDepartureTime() {
        return departureTime;
    }

    public void setDepartureTime(int departureTime) {
        this.departureTime = departureTime;
    }

    public int totalTime(){
        return departureTime-arrivalTime;
    }
}

TicketCounterweb

import java.util.LinkedList;
import java.util.Queue;


public class TicketCounter {
    final static int PROCESS = 120;
    final static int MAX_CASHIERS = 10;
    final static int NUM_CUSTOMERS = 100;

    public static void main(String[] args) {
        Customer customer;
        Queue<Customer> customerQueue = new LinkedList<Customer>();

        int[] cashierTime = new int[MAX_CASHIERS];
        int totalTime, averageTime, departs;

        /** process the simulation for various number of cashiers */
        for (int cashiers = 0; cashiers < MAX_CASHIERS; cashiers++) {
            /** set each cashiers time to zero initially */
            for (int count = 0; count < cashiers; count++)
                cashierTime[count] = 0;

            /** load customer queue */
            for (int count = 1; count <= NUM_CUSTOMERS; count++)
                customerQueue.offer(new Customer(count * 15));

            totalTime = 0;

            /** process all customers in the queue */
            while (!(customerQueue.isEmpty())) {
                for (int count = 0; count <= cashiers; count++) {
                    if (!(customerQueue.isEmpty())) {
                        customer = customerQueue.poll();
                        if (customer.getArrivalTime() > cashierTime[count])
                            departs = customer.getArrivalTime() + PROCESS;
                        else
                            departs = cashierTime[count] + PROCESS;

                        customer.setDepartureTime(departs);
                        cashierTime[count] = departs;
                        totalTime += customer.totalTime();

                    }
                }
            }

            /** output results for this simulation */
            averageTime = totalTime / NUM_CUSTOMERS;
            System.out.println("Number of cashiers: " + (cashiers + 1));
            System.out.println("Average time: " + averageTime + "\n");
        }
    }
}

5.5 隊列ADT

public interface QueueADT<T> {
    public void enqueue (T element);
    public T dequeue();
    public T first();
    public boolean isEmpty();
    public int size();
    public String toString();

}

5.6 用鏈表實現隊列

  • head是指向鏈表首元素的引用,tail指向鏈表末元素的引用,整型變量count跟蹤隊列中的元素數目

5.7 用數組實現隊列

  • 因爲隊列操做會修改集合的兩端,所以將一端固定於索引0處要求移動元素,而非環形數組實現元素移位會產生O(n)的複雜度,因此數組實現的隊列操做效率低。
  • 把數組看做是環形的,能夠除去在隊列的數組實現中把元素移位的須要。
  • 用環形數組來實現隊列,它定義在名爲CircleArrayQueue的類中。環形數組並非一種新結構,它只是一種把數組用來存儲隊列的方法。從概念上說,若是數組的最後一個索引後面跟的是第一個索引,那麼該數組就可用做環形數組。

5.8 雙端隊列

  • 雙端隊列是隊列的擴展,它容許從隊列的兩端添加、刪除和查看元素。

教材學習中的問題和解決過程

  • 問題1:關於dequeue操做複雜度的理解問題
  • 問題1解決方案:因爲隊列的特殊性,enqueue操做與dequeue操做必須做用於隊列的對立端。在鏈表的前端進行dequeue操做,在鏈表的末端進行enqueue操做時,設置一個臨時變量指向頭結點的next,處理的複雜度爲O(1)。在鏈表的前端進行enqueue操做,在鏈表的末端進行dequeue操做時,因爲須要遍歷鏈表找到倒數第二個結點,其操做複雜度爲O(n)。

代碼調試中的問題和解決過程

  • 問題1:教材上的代碼就有不少的問題
  • 問題1解決方案:
    1.P74代碼的Integer應在<>裏
    Queue<Integer> encodingQueue = new LinkedList<>(Integer);-->Queue<Integer> encodingQueue = new LinkedList<Integer>();
    2.P74for循環中的圓括號)多了
    encoded += (char) message.charAt(scan) - keyValue;)-->encoded += (char) message.charAt(scan) - keyValue;
    3.P83代碼中front應該改爲head

代碼託管

上週考試錯題總結

上週沒有進行測試,錯題 = null。編程

結對及互評

博客中值得學習的或問題:

  • 教材學習內容詳實,有本身的理解感悟
  • 排版簡潔明瞭
  • 基於評分標準,我給譚鑫的博客打分:5分。得分狀況以下:
    正確使用Markdown語法(加1分):
    模板中的要素齊全(加1分)
    教材學習中的問題和解決過程, 一個問題加1分
    代碼調試中的問題和解決過程, 一個問題加1分api

  • 基於評分標準,我給方藝雯的博客打分:5分。得分狀況以下:、
    正確使用Markdown語法(加1分):
    模板中的要素齊全(加1分)
    教材學習中的問題和解決過程, 一個問題加1分
    代碼調試中的問題和解決過程, 一個問題加1分數組

點評過的同窗博客和代碼

其餘

最近其餘事務不少,因此比較忙,時間也很緊張,但絲絕不能澆滅我敲代碼的熱情數據結構

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 470/470 1/2 12/20
第三週 685/1155 2/4 10/30

補充做業

在你一輩子中身體最健康、最旺盛的時候,能在大學學習和研究,是一輩子中少有的機會。請說明一下,你以及具有的專業知識、技能、能力上還差距哪些?請看這個技能調查表,從表中抽取5-7項你認爲對你特別重要的技能,記下你目前的水平,和你想在課程結束後達到的水平(必須列出5項)。

Skills/技能 當前水平 目標水平
Programming Overall/對編程總體的理解 3 7
Programming Comprehension/程序理解 3 7
Programming Design/架構設計,模塊化設計,接口設計 3 6
Programming Test/單元測試、代碼覆蓋率 2 6
Programming :Code Review/Code Quality(代碼複審/代碼規範/代碼質量) 3 6

參考資料

相關文章
相關標籤/搜索