LL PLR PCPL LCP PCPR PRL LR

Một phần của tài liệu Tài liệu VOL1_04_Part2_TrialExam(Afternoon)_translated pptx (Trang 55 - 68)

Đỏp ỏn và giải thớch cho cỏc cõu hỏi buổi chiều

LL PLR PCPL LCP PCPR PRL LR

LL PLR PCPL LCP PCPR PRL LR

Việc thay đổi con trỏ được thực hiện như sau:

(1) PCPR được chứa trong PL sao cho LL trỏ đến LR vỡ LCP bị xúa.

(2) PCPL được chứa trong PRL sao cho LR trỏ đến LL vỡ LCP bị xúa.

Xử lý này chỉ bao gồm 2 phộp toỏn (1) và (2) nờn số lượng tớnh toỏn là hằng số.

b) GET() đơn giản đọc LCP tại vị trớ được chỉ bởi CP, do đú số lượng tớnh toỏn là hằng số. c) INSERT(x) thay đổi con trỏ kết nối như hỡnh vẽ dưới đõy. Giả sử rằng LA là dũng được

thờm và con trỏ của dũng thờm vào đó biết.

LL PLR PCPL LCP PCPR PRL LR

LL PLR PCPL LCP PCPR PRL LR

Dũng thờm PAL LA PAR Việc thay đổi con trỏ diễn ra như sau:

(1) PCPL được chứa trong PAL sao cho LA trỏ đến LL khi LA được thờm. (2) PLR được chứa PAR sao cho PAR trỏ tới LCP khi LA được thờm.

(3) Giỏ trị con trỏ của dũng được thờm được chứa trong PCPL sao cho LCP trỏ tới LA khi LA được thờm vào

(4) Giỏ trị con trỏ của dũng được thờm được chứa trong PLR sao cho LL trỏ tới LA khi LA được thờm vào

Quỏ trỡnh này chỉ bao gồm cỏc bước từ (1) đến (4) nờn tổng khối lượng tớnh toỏn là hằng số. d) Ở đõy khụng cú thụng tin về số dũng ở đõu, do đú để tớnh tổng số dũng cần phải tiến hành tớnh

toỏn thật, bắt đầu từ HEAD và cỏc con trỏ tiếp theo. Hoặc, số dũng cú thể tớnh từ TAIL. Do vậy, LAST() cần thời gian tớnh toỏn dài hơn khi cú nhiều dũng hơn. Vỡ vậy khối lượng tớnh toỏn khụng phải là hằng số.

Hỡnh vẽ dưới đõy chỉ ra làm thế nào cỏc dũng đi từ HEAD và TAIL. Việc xúa của L3 dịch chuyển con trỏ như chỉ ra dưới đõy:

Do đú “8 được chuyển thành 9” sao cho NEXT[2] trỏ đến L4, và “8 is changed to 2” sao cho PREV[9] trỏ đến L2.

Sau đú, chỳng ta chuyển con trỏ của danh sỏch rỗng. Khi phần tử số 8 bị xúa, nú trở thành đầu của danh sỏch rỗng. Vỡ vậy EMPTY thay đổi “từ 3 thành 8”. Hơn nữa, chỳng ta chắc chắn rằng NEXT[8] của phần tử số 8 đó xúa sẽ trỏ đến “3” (là đầu của danh sỏch rỗng trước khi xúa).

HEAD CP TAIL 4 4 6 0 L1 2 4 L2 8 2 L3 9 8 L4 6 9 L5 0 4 2 8 9 6 ↓ DELETE () 0 L1 2 4 L2 9 2 L3 9 2 L4 6 9 L5 0 4 2 8 9 6

Q4:

Điểm chớnh chớnh

Trong một đống, giỏ trị của gốc là lớn nhất và giỏ trị nỳt cha lớn hơn giỏ trị nỳt con.

HeapSort lặp lại quỏ trỡnh đưa nỳt gốc ra ngoài và vun đống cho cõy cũn lại.

Đống là một cõy nhị phõn để lưu trữ dữ liệu từ nỳt nụng đến nỳt sõu, ở cựng bậc của cõy, từ trỏi qua phải, giỏ trị cú những giới hạn sau:

Giỏ trị nỳt cha > giỏ trị nỳt con (hoặc giỏ trị nỳt cha < giỏ trị nỳt con )

Như vậy, cỏc phần tử cú giỏ trị lớn hơn (nhỏ hơn) được tập hợp xung quanh gốc và cỏc phần tử cú giỏ trị nhỏ hơn (lớn hơn) gần về phớa cỏc nỳt lỏ hơn. Vỡ gốc của cõy chứa phần tử cú giỏ trị lớn nhất (nhỏ nhất) nờn cấu trỳc dữ liệu này thớch hợp cho việc xỏc định giỏ trị lớn nhất (nhỏ nhất).

Một đống cú thể được biểu diễn bởi một mảng theo cỏch sau. Nếu một nỳt lưu trữ giỏ trị của phần tử A[i]thỡ nỳt con bờn trỏi lưu trữ giỏ trị của phần tử A[2ìi], và nỳt con bờn phải lưu trữ giỏ trị của phần tử A[2ìi + 1]. Theo đú, mảng A chứa cỏc phần tử như sau:

Chỉ số 1 2 3 4 5 6 7 8 9 10

A[] 91 86 72 72 45 69 24 55 1 12

Cõu hỏi con 1: [Đỏp ỏn đỳng] A – c, B – a

A:

Trong chương trỡnh HeapSort, sau khi đổi chỗ giỏ trị nỳt đầu tiờn và nỳt thứ Idx-th (Swap(1, Idx)) chương trỡnh sẽ gọi chương trỡnh con Make Heap. Chương trỡnh con Make Heap vun cõy cũn lại thành đống. Để làm điều này, Make Heap so sỏnh cỏc giỏ trị của nỳt cha, nỳt con trỏi, và nỳt con phải . Sau đú kết quả so sỏnh này được sử dụng để truyền tham số cho chương trỡnh Make Heap khi gọi đệ qui.

Chỉ số của nỳt cha được lưu trữ trong biến Top, vỡ vậy cỏc chỉ số của nỳt con trỏi và nỳt con phải cần phải được xỏc định trong ụ trống “A” và cõu lệnh tiếp theo. Nếu nỳt cha cú chỉ số là TOP thỡ chỉ số của nỳt con trỏi là (Top ì 2) và chỉ số của nỳt con phải là (Top ì 2 + 1). Biểu thức “R  L + 1” ngay sau ụ trống “A” cho thấy L là chỉ số của nỳt con trỏi và R là chỉ số của nỳt con phải. Vậy đỏp ỏn ở đõy là biểu thức “L  Top ì 2” được chốn vào.

B:

(Chỳ ý)

Nếu phần tử đầu tiờn là nỳt cha, nỳt con trỏi của nú cú chỉ số 1 ì 2 = 2. Nỳt con phải cú chỉ số 1 ì 2 + 1 = 3. Nếu phần tử thứ hai là nỳt cha, con trỏi của nú cú chỉ số 2 ì 2 = 4. Nỳt con phải cú chỉ số 2 ì 2 + 1 = 5. Cha C on tr ỏi C on p hả i Cha C on p hả i C on tr ỏi

trị của nỳt con trỏi (với chỉ số L). Dự thế nào cũng cú một nỳt con trỏi được xỏc định bởi “L < Last” giống như “R < Last” đó sử dụng ở phần trước trong chương trỡnh. Do vậy, chỳng ta chốn “L < Last” ở đõy.

Cõu hỏi con 2: [Đỏp ỏn đỳng] C – g, D – c

Theo thuật toỏn của chương trỡnh con MakeHeap, ta sẽ tỡm hiểu mảng trong biểu đồ đống được mụ tả trong cõu hỏi thay đổi như thế nào.

(1) Đổi chỗ lần thứ nhất

Gốc A[1] và phần tử cuối cựng A[10] được đổi chỗ. Sau đú, đống được vun lại.

Chỉ số 1 2 3 4 5 6 7 8 9 10 A[] 91 86 72 72 45 69 24 55 1 12 12 86 72 72 45 69 24 55 1 91 So sỏnh A[] 12 86 72 72 45 69 24 55 1 91 (2) Đổi chỗ lần thứ hai

Giỏ trị 86 (A[2], nỳt con trỏi) cú giỏ trị lớn nhất theo kết quả so sỏnh, vỡ vậy A[1] và A[2]được đổi chỗ.

Chỉ số 1 2 3 4 5 6 7 8 9 10

A[] 12 86 72 72 45 69 24 55 1 91

86 12 72 72 45 69 24 55 1 91

Tiếp theo, nỳt A[2] (nỳt vừa được đổi chỗ ) coi là nỳt cha và quỏ trỡnh xử lớ tương tự xảy ra.

1 2 3 4 5 6 7 8 9 10

A[] 86 12 72 72 45 69 24 55 1 91

(3) Đổi chỗ lần thứ ba

Theo kết quả so sỏnh, 72 (A[4], nỳt con trỏi) cú giỏ trị lớn nhất, vỡ vậy A[2] và A[4] được đổi chỗ.

Chỉ số 1 2 3 4 5 6 7 8 9 10

A[] 86 12 72 72 45 69 24 55 1 91

Tiếp theo, nỳt A[4] (nỳt vừa được đổi chỗ ) coi là nỳt cha và quỏ trỡnh xử lớ tương tự xảy ra.

1 2 3 4 5 6 7 8 9 10

A[] 86 72 72 12 45 69 24 55 1 91

(4) Đổi chỗ lần thứ tư

Theo kết quả so sỏnh, 55 (A[8], nỳt con trỏi) cú giỏ trị lớn nhất, vỡ vậy A[4] và A[8] được đổi chỗ.

Index 1 2 3 4 5 6 7 8 9 10

A[] 86 72 72 12 45 69 24 55 1 91

86 72 72 55 45 69 24 12 1 91

Tiếp theo, coi A[8]là nỳt cha chỳng ta tiếp tục so sỏnh, nhưng do A[8]khụng cú nỳt con nào nờn chương trỡnh kết thỳc ở đõy. Vậy cú tất cả 4 lần đổi chỗ giỏ trị cỏc nỳt.

Trạng thỏi cuối cựng của mảng A được biểu diễn dưới đõy, theo đú giỏ trị của 12 được lưu trữ trong phần tử mảng cú chỉ số là “8.”

1 2 3 4 5 6 7 8 9 10

A[] 86 72 72 55 45 69 24 12 1 91 Theo trờn thỡ cú 4 lần đổi chỗ giỏ trị của cỏc nỳt.

Cõu hỏi con 2: [Đỏp ỏn đỳng] C – g, D – c

Một đống được vun bằng việc tạo nỳt gốc (A[1]) cú giỏ trị lớn nhất. Vỡ vậy ta sẽ vun đống cho cõy con khi coi A[i] là nỳt cha. Ta tiếp tục vun đống cho cỏc cõy con trong khi giảm dần chỉ số đi 1 cho đến lỳc vun tới nỳt A[1]; khi đú cõy đó được vun thành đống. Một nỳt khụng cú nỳt con nào thỡ khụng cần vun đống, nờn giỏ trị khởi tạo của i là chỉ số của nỳt đầu tiờn cú một nỳt con.

Nỳt con trỏi của A[j] là (A[j ì 2]), và nỳt con phải là (A[j ì 2 + 1]), nờn nỳt cha của nỳt của A[k] là A[k / 2]. Dẫn đến chỉ số của nỳt cuối cựng với một con là thương của số cỏc phần tử (Last) cho 2, .., (Last / 2). Trong trường hợp cụ thể, khi Last = 10, chỉ số của nỳt cuối cựng cú một nỳt con là (10 / 2 = ) 5. Vậy ta cần vun lại đống mỗi lần chỉ số Idx giảm đi 1, với giỏ trị khởi tạo là (Last / 2), cho đến khi Idx = 1 (trong khi Idx ≧ 1). Do đú đỏp ỏn ở đõy là “Idx: Last / 2, Idx >= 1, -1.”

Q5:

Điểm chớnh chớnh

Trong bước chuyển trạng thỏi, đớch chuyển tiếp chỉ được xỏc định bằng trạng thỏi hiện tại và đầu vào.

Chỳ ý rằng ban đầu cả cờ trắng và cờ đỏ đều hạ (down).

Cõu hỏi con 1: [Đỏp ỏn đỳng] A – b, B – d, C – a

S0 là trạng thỏi bắt đầu, tại đú “cờ đỏ hạ (red flag down)” và “cờ trắng hạ (white flag down).” Điều này cú thể kiểm tra bằng (2) của [Mụ tả chương trỡnh].

a) Theo đoạn mụ tả của cõu hỏi con, bước chuyển (i) là thao tỏc “nõng cờ đỏ (raise the red flag)” vỡ vậy trạng thỏi S1 là “cờ đỏ nõng (red flag up)” và “cờ trắng hạ (white flag down).”

b) Chuyển tiếp (ii) là từ S3 sang S0. Vỡ S0 là trạng thỏi “cờ đỏ nõng (red flag down)” và “cờ trắng hạ (white flag down)” nờn S3 phải là một trạng thỏi cú ớt nhất một trong cỏc cờ nõng (up). Mặt khỏc, S1 là trạng thỏi “cờ đỏ nõng (red flag up)” và “cờ trắng hạ (white flag down)” nờn S3 phải là trạng thỏi “cờ trắng nõng (white flag up)” vả “cờ đỏ hạ (red flag down).”

Do đú bước chuyển (ii) là hành động “hạ cờ trắng (lower the white flag).”

c) S1 là trạng thỏi “cờ đỏ nõng (red flag up)” và “cờ trắng hạ (white flag down),” cũn S3 là trạng thỏi “cờ đỏ hạ (red flag down)” và “cờ trắng nõng (white flag up),” vậy S2 là trạng thỏi “cờ đỏ nõng (red flag up)” và “cờ trắng nõng (white flag up).” Dưới đõy là phần tổng kết của những trạng thỏi này.

Trạng thỏi (State) Cờ đỏ (Red flag) Cờ trắng (White flag)

S0 Hạ (Down) Hạ (Down)

S1 Nõng (Up) Hạ (Down)

S2 Nõng (Up) Nõng (Up)

S3 Hạ (Down) Nõng (Up)

Do đú, bước chuyển (iii) là “ nõng cờ đỏ (raise the red flag).”

Cõu hỏi con 2: [Đỏp ỏn đỳng] a, g

Thụng tin trong tệp giỏ trị ban đầu, theo (2) của [Giải thớch chương trỡnh] bao gồm (thời gian phỏt hiện cõu trả lời, thời gian hiển thị cửa sổ cho trả lời sai, số lần lặp lại).

Quỏ trỡnh sử dụng thời gian tỡm ra cõu trả lời cú thể được xỏc định như sau. Chỳ ý (4) của [Giải thớch chương trỡnh]: Cú 5 loại thao tỏc cú thể nhận được từ cỏc thiết bị nhập: nõng cờ đỏ, hạ cờ đỏ, nõng cờ trắng, hạ cờ trắng, và khụng di chuyển cờ nào (khi khụng phỏt hiện ra cõu trả lời nào trong thời gian phỏt hiện cõu trả lời).

Mụ tả trờn giỳp ta thấy rừ rằng thời gian phỏt hiện cõu trả lời là cần thiết trong quỏ trỡnh liờn quan đến cỏc thao tỏc này. Quỏ trỡnh này là quỏ trỡnh “phỏt hiện trả lời”.

Bờn cạnh đú, quỏ trỡnh sử dụng thời gian hiển thị cửa sổ cho trả lời sai cú thể được xỏc định như sau. Chỳ ý (5) của phần [Giải thớch chương trỡnh]:

Chương trỡnh sẽ phỏt hiện ra cõu trả lời của người chơi. Nếu đỳng, chương trỡnh sẽ cộng thờm “1” vào số cõu trả lời đỳng và gửi cửa sổ cõu trả lời đỳng tới thiết bị xuất. Nếu sai, chương trỡnh sẽ gửi cửa sổ cõu trả lời sai tới cỏc thiết bị xuất và sau khi hết thời gian hiển thị

cửa sổ cõu trả lời sai trong tệp giỏ trị khởi tạo, chương trỡnh sẽ thiết lập cờ trong cửa sổ này sang trạng thỏi đỳng.

Mụ tả trờn giỳp ta thấy rừ rằng thời gian hiển thị trả lời sai là cần thiết trong quỏ trỡnh liờn quan đến cỏc thao tỏc này. Quỏ trỡnh này là quỏ trỡnh “xử lý trả lời sai.”

Q6:

Điểm chớnh chớnh

Ký tự đầu tiờn là “<,” nờn phải duyệt từ ký tự thứ hai.

Trong vũng lặp “for” chỉ số sẽ dừng khi gặp ký tự “>,” nờn phải duyệt từ ký tự tiếp theo.

Cõu hỏi con: [Đỏp ỏn đỳng] A – a, B – c, C – a, D – d

Chương trỡnh tuy phức tạp nhưng với vớ dụ cụ thể trong Hỡnh 2 và Bảng 2 thỡ đoạn chương trỡnh trở nờn dễ hiểu hơn. Thờm nữa, những chỳ thớch trong chương trỡnh là phự hợp. Theo [Mụ tả chương trỡnh] (2) (iii) chỉ rừ rằng khụng cú lỗi cỳ phỏp nào trong cỏc xõu ký tự gắn thẻ, vỡ vậy một xõu ký tự bắt đầu với ký tự “<” cú nghĩa bắt đầu một thẻ trong khi ký tự “>” thỡ xỏc định kết thỳc thẻ, và hai ký tự đú luụn tạo thành một cặp. Trong chương trỡnh, phần “XXXX” trong “<XXXX>” được lưu trữ như tờn của thẻ. Như vậy, liờn hệ (một cỏch tương ứng) cõu lệnh “mlstr = parse_ml_date(mlstr +1, 1);” với cõu lệnh “char *parse_ml_date(char *mlstr, int level)”, ta thấy quỏ trỡnh duyệt bắt đầu từ ký tự thứ hai của mlstr và độ sõu bắt đầu từ 1. Ở đõy giả thiết rằng ký tự đầu tiờn của mlstr là “<”.

A:

Tham khảo Bảng 2, con trỏ trỏ tới “STUDENT” được lưu trữ trong elmtbl[elmnum].tag. Giỏ trị khởi tạo của elmnum là 0, vỡ vậy con trỏ trỏ tới “STUDENT” (cũng là địa chỉ của ký tự “S”) được lưu trữ trong elmtbl[0].tag. Vậy đỏp ỏn đỳng chốn vào ụ trống là “mlstr”.

Hơn nữa, trong cõu lệnh tiếp theo sẽ lưu trữ chiều sõu của thẻ và con trỏ của xõu duyệt qua cỏc ký tự cho đến khi gặp ký tự “>.” Trờn thực tế ký tự “\0” đươc lưu trữ ở vị trớ của “>” chỉ định rằng quỏ trỡnh lưu trữ tờn thẻ đó hoàn thành.

B:

Đõy là quỏ trỡnh lưu trữ giỏ trị thẻ, vỡ vậy theo Bảng 2, ta thấy con trỏ trỏ tới “BILL” được lưu trữ trong elmtbl[elmnum].value. Hơn nữa, trong vũng lặp “for”, con trỏ xõu dừng tại vị trớ của “>.” Do đú khi tăng giỏ trị của con trỏ 1 thỡ sẽ trỏ tới vị trớ của ký tự “B”. Vậy đỏp ỏn đỳng sẽ là “mlstr + 1”.

C:

Sau khi lưu trữ giỏ trị thẻ, ta duyệt tiếp đến ký tự “<” hoặc “</.” Điều này thể hiện trong vũng lặp “for” sau ụ trống B. Ngay khi bắt đầu phõn tỏch thẻ, con trỏ dừng tại vị trớ của ký tự “<,” vỡ vậy chương trỡnh cần xỏc định ký tự tiếp là kớ tự “/” hay khụng. Nếu ký tự tiếp là “/” thỡ chiều sõu thẻ khụng thay đổi, ngược lại thỡ tồn tại thẻ khỏc mức thấp hơn ở bờn trong. Vậy ở đõy ta cần tăng chỉ số mảng lưu trữ lờn 1 và đỏp ỏn đỳng chốn vào ụ trống là “elmnum++”.

D:

Theo giải thớch ở đỏp ỏn C, nếu ký tự tiếp theo khụng phải là “/” thỡ tồn tại thẻ khỏc mức thấp hơn ở bờn trong. Trong trường hợp này, hàm “parse_ml_date” được gọi đệ qui, và sự phõn tớch xõu lại tiếp tục. Vậy ở đõy, ta chốn vào ụ trống điều kiện ký tự tiếp theo khụng phải là “/.”

Q7:

Điểm chớnh chớnh

Luồng (thread) được bắt đầu như một đơn vị thực thi riờng rẽ và xảy ra đồng thời với phương thức main.

Chiều dương cho x là bờn trỏi, chiều dương cho y là xuống dưới.

Cõu hỏi con 1 : [Đỏp ỏn đỳng] A – c, B – d

Một luồng là một đơn vị của quỏ trỡnh thực thi chương trỡnh, và nú cú thể được bắt đầu như một đơn vị thực thi riờng rẽ xảy ra đồng thời với phương thức main (phương thức main được thực thi ngay từ đầu). Trong Java, cú 2 cỏch để tạo tạo một luồng. Cỏch thứ nhất là thừa kế lớp Thread, và cỏch thứ hai là cài đặt giao diện Runnable. Chương trỡnh này sử dụng cỏch thứ hai.

A:

Trong lớp trừu tượng Motion, thờm vào cho phương thức khởi tạo Motion và phương thức “run()”, được sử dụng để tiếp tục hiển thị chuyển động của điểm, phương thức trừu tượng “update” được định nghĩa để xỏc định chuyển động của điểm. Trong phương thức “run()”, một điểm được vẽ tại vị trớ tọa độ được định nghĩa bởi “while(true){…}”. Cõu lệnh “while” thực hiện việc sau: (1) vẽ điểm, (2) dừng 40 mili giõy, (3) ụ trống A, và (4) xúa điểm. Ở đõy, cú nhu cầu di chuyển điểm giữa (2) và (4) ở trờn, vỡ vậy trong ụ trống A cần gọi phương thức “update()” để di chuyển điểm và thay đổi nội dung của điểm. Do đú, chỳng ta cần chốn “point = update(point)” Chỳ ý rằng “Point current = point;” ngay trước ụ trống A là quỏ trỡnh rỳt lại để xúa điểm trước khi di chuyển với “Space.erase(current)” ngay sau ụ trống A.

B:

ễ trống B nằm bờn trong “new Thread (…)” của “for (int i = 0; i < point.length; i++)” là một quỏ trỡnh được lặp lại. Điều này chỉ ra rằng số luồng sẽ được tạo ra tương ứng với số điểm được vẽ. Với một luồng, như đó được đề cập ở trờn thỡ giao diện Runnable phải được cài đặt, nhưng lớp Motion là một lớp trừu tượng và khụng thể được sinh ra như một luồng. Núi cỏch khỏc, lớp SimpleMotion, thừa kế lớp trừu tượng Motion, được sinh ra như một luồng. Do đú “new SimpleMotion(points[i])” được chốn ở đõy.

Cõu hỏi con 2 : [Đỏp ỏn đỳng] b

Trong hỡnh vẽ của cõu hỏi con 2, ở gúc trỏi dưới cựng được đặt là gốc tọa độ (0, 0). Do đú, cỏc dấu hiệu ban đầu cho mỗi chuyển dời (i), (ii), (iii) và (iv) như sau:

(i) X õm, Y dương (ii) X dương, Y dương

Một phần của tài liệu Tài liệu VOL1_04_Part2_TrialExam(Afternoon)_translated pptx (Trang 55 - 68)