Định nghĩa trực quan cho ba cấu trúc khung cơ bản trên mảng

Một phần của tài liệu Các cấu trúc khung cho lập trình đa lõi (Trang 47 - 53)

5 Kết luận và hướng phát triển

3.1Định nghĩa trực quan cho ba cấu trúc khung cơ bản trên mảng

có thể kết hợp với nhau để mô tả các tính toán phức tạp. Ta gọi là cấu trúc khung song song bởi vì các hàm này có thể song song hóa và cài đặt song song một cách hiệu quả.

Map và Reduce

Cấu trúc khungmapvàreducelà hai trường hợp đặc biệt của homomorphism. Cấu trúc khung map áp dụng một hàm f vào từng phần tử của một mảng hai chiều (vẫn giữ nguyên cấu trúc của mảng), và được định nghĩa bởi

map f |a| =|f a|

map f (xy) = (map f x)(map f y) map f (xy) = (map f x)(map f y),

nghĩa là, map f = (|| · | ◦f,,|). Ví dụ, tích vô hướng của một ma trận được thực hiện với map như sau.

map (2×) 6 2 1 4 3 5 ! = 12 4 2 8 6 4 !

Cấu trúc khungreduce thực hiện thu gọn một mảng hai chiều thành một giá trị sử dụng hai toán tử abide ⊕, ⊗, và được định nghĩa bởi

reduce(⊕,⊗) |a| =a

reduce(⊕,⊗) (xy) = (reduce(⊕,⊗)x)⊕(reduce(⊕,⊗) y) reduce(⊕,⊗) (xy) = (reduce(⊕,⊗)x)⊗(reduce(⊕,⊗) y),

nghĩa là, reduce(⊕,⊗) = (|id,⊕,⊗|). Ví dụ, tổng của một mảng được tính dựa trên reduce như sau.

reduce(+,+) 6 2 1 4 3 5

! = 21

Tất cả các homomorphism đều có thể được viết lại dưới dạng các map và

Bổ đề 3.4.1 (Homomorphism) Một homomorphism (|f,⊕,⊗|) có thể được viết lại dưới dạng các map và reduce:

(|f,⊕,⊗|) =reduce(⊕,⊗)◦map f.

Zipwith

Hai cấu trúc khungmapvàreducevừa được định nghĩa là các cấu trúc khung cơ bản nhất. Ta sẽ xem xét định nghĩa của một cấu trúc khung nữa là mở rộng của hai cấu trúc khung cơ bản này. Cấu trúc khung zipwithlà mở rộng của map, nó nhận vào hai ma trận hai chiều có cùng kích thước, áp dụng hàm f lên các phần tử tương ứng của ma trận và trả về một ma trận mới cùng kích thước.

zipwithf |a||b| =|f a b|

zipwithf (xy)(uv) = (zipwithf x u)(zipwithf y v) zipwithf (xy)(uv) = (zipwithf x u)(zipwithf y v)

Trong định nghĩa này, các mảng hai chiều là tham số của hàm phải được chia thành các phần sau cho kích thước của x và u là giống nhau. Ví dụ, phép cộng hai ma trận được tính bằng reduce như sau.

zipwith(+) 6 2 1 4 3 5 ! 0 8 2 9 1 7 ! = 6 10 3 13 4 12 !

Hàm zip là một trường hợp đặc biệt của zipwith, nó sẽ tạo ra một ma trận hai chiều mới mà các phần tử là cặp các phần tử tương ứng của hai ma trận đầu vào.

zip (u, v) = zipwith(λ xy. (x, y)) u v

Tương tự ta có thể định nghĩa zip và zipwith ứng với các trường hợp có ba hoặc nhiều hơn các ma trận đầu vào, và kí hiệu zipk và zipwithk cho trường

hợp cók ma trận đầu vào. Ta cũng có thể định nghĩaunziplà hàm ngược với

zip. Khi kết hợp các khung đã định nghĩa ở trên, ta có thể mô tả rất nhiều hàm hữu ích.

id =reduce(,)◦map| · | tr =reduce(,)◦map| · | rev =reduce( ˜,˜)◦map| · | f latten =reduce(,)

height =reduce(+,)◦map(λ x. 1) width =reduce(,+)◦map(λ x. 1) cols =reduce(zipwith(),)◦map|| · || rows =reduce(,zipwith())◦map|| · || reducec(⊕) =map(reduce(⊕,))◦cols reducer(⊕) = map(reduce(,⊕))◦rows mapc f =reduce(,)◦map f◦cols mapr f =reduce(,)◦map f◦rows add =zipwith(+)

sub =zipwith(−)

Ở đây, || · || là cách viết gọn của | · | ◦ | · |. Hàm id là hàm đơn vị của (adsbygoogle = window.adsbygoogle || []).push({});

AbideT ree, và tr là hàm chuyển vị ma trận. Hàm rev nhận đầu vào là một ma trận hai chiều và trả lại một ma trận mà vị trí của các giá trị ngược theo cả chiều ngang và chiều cao. Hàm f latten làm phẳng một AbideT ree lồng nhau. Hàm height và width trả về lần lượt số hàng và số cột của ma trận, hàm cols và rows trả về một ma trận mà các phần tử trong đó chính là các cột, hàng của ma trận đầu vào. Hàm reducec và reducer là một trường hợp đặc biệt của hàm reduce, nó rút gọn giá trị của một ma trận hai chiều theo các cột hoặc các hàng, kết quả trả về là một vec-tơ hàng hoặc vec-tơ cột. Hàm mapc và mapr là trường hợp đặc biệt của hàm map, nó áp dụng một hàm lên mỗi cột và mỗi hàng. Hàm add và sub thực hiện cộng, trừ hai ma

Nghiên cứu xây dựng cấu trúc khung cho cấu trúc dữ liệu

HTA

Chương này sẽ trình bày về cấu trúc dữ liệu HTA, một loại cấu trúc dữ liệu mảng lợp phân tầng. Phần đầu của chương đưa ra khái niệm tổng quan về cấu trúc dữ liệu này, các phần tiếp theo sẽ trình bày về việc vận dụng các lý thuyết trong chương 2 và chương 3 để thiết kế cấu trúc đại số và cấu trúc khung cho cấu trúc dữ liệu HTA.

4.1 Cấu trúc dữ liệu HTA

4.1.1 Định nghĩa và phân loại cấu trúc dữ liệu HTA

Định nghĩa 4.1.1 Một Mảng lợp (Tiled Array) là một mảng được phân chia thành các Miếng lợp (hay còn gọi là các Mảng con) theo cách: các miếng lợp kề nhau thì chiều kề nhau của chúng có cùng kích thước.

Một phần của tài liệu Các cấu trúc khung cho lập trình đa lõi (Trang 47 - 53)