Google    Youtube      Psv     สพม.11

หน่วยที่2โครงสร้างข้อมูลอาร์เรย์

โครงสร้างข้อมูลอาร์เรย์

ปกติการเก็บข้อมูลที่มีเพียงค่าเดียวก็สามารถใช้โครงสร้างข้อมูลเบื้องต้น แต่เมื่อลักษณะของข้อมูลเริ่มซับซ้อนและมีจำนวนมากขึ้นจึงไม่เพียงพอที่จะใช้ข้อมูลโครงสร้างข้อมูลเบื้องต้นได้จึงต้องนำโครงการข้อมูลแบบอื่น ๆ มาใช้แทน ในบทนี้จะกล่าวถึงโครงสร้างข้อมูลอาร์เรย์ ซึ่งสามารถเก็บข้อมูลได้จำนวนมาก ๆ และเป็นชุดของข้อมูลที่เกี่ยวข้องกัน

โครงสร้างข้อมูลอาร์เรย์

อาร์เรย์เป็นโครงสร้างข้อมูลแบบหนึ่งที่ผู้ใช้ต้องกำหนดคุณสมบัติขึ้นมาก่อน  โดยที่อาร์เรย์จะประกอบด้วยสมาชิกจำนวนหนึ่งที่เรียกต่อรวมกันตามลำดับที่ถูกมองเป็นตาราง (Table) สมาชิกทุกตัวจะมีชนิดข้อมูลที่เป็นแบบเดียวกัน  ในการใช้อาร์เรย์เป็นการเข้าถึงแบบสุ่ม (Random Access) หรือโดยตรง เป็นการอ้างไปยังแต่ละสมาชิกที่ต้องการได้โดยตรง ซึ่งมีตัวชี้ใช้อ้างไปยังแต่ละสมาชิกเรียกว่าดัชนี (Index) หรือ Subscript และต้องเป็นเลขจำนวนเต็ม การกำหนดช่วงหรือจำนวนของสมาชิกจะใช้ขอบเขตล่าง (Lower Bound) ซึ่งมีค่าน้อยที่สุด และขอบเขตบน (Upper Bound) ซึ่งมีค่ามากที่สุดอาร์เรย์เป็นโครงสร้างข้อมูลที่คงที่ (Static) เปลี่ยนแปลงจำนวนสมาชิกไม่ได้ขณะทำงาน และเนื่องจากข้อมูลอาร์เรย์ถูกมองเป็นตารางในการใช้งาน จึงมีการกำหนดลักษณะของอาร์เรย์ออกเป็นมิติต่าง ๆ ได้ดังนี้

อาร์เรย์หนึ่งมิติ

อาร์เรย์หนึ่งมิติ (One-dimension Array) มีลักษณะที่ง่ายที่สุดเป็นตารางที่มีเพียงแถว (Row) เดียว บางครั้งก็เรียกว่าเว็กเตอร์  (Vector)

ดังรูปที่ 2.1 เป็นอาร์เรย์หนึ่งมิติชื่อ A ที่ประกอบด้วยสมาชิก N ตัว

A(1)

A(2)

A(I)

A(N)

 

รูปที่ 2.1 ตัวอย่างเป็นอาร์เรย์หนึ่งมิติชื่อ A มีสมาชิก N ตัว

อาร์เรย์หนึ่งมิติจะมีดัชนีเพียงตัวเดียวใช้อ้างไปยังตำแหน่งของแต่ละสมาชิกในอาร์เรย์มีค่าเป็นลำดับ สมาชิกแต่ละตัวจะถูกแยกแยะตัวชื่ออาร์เรย์ตามด้วยดัชนีที่อยู่ในวงเล็บดังในรูป  ดังนั้น เมื่อต้องการใช้อาร์เรย์ก็เพียงแต่กำหนดชื่อและใช้ดัชนีอ้างไปยังแต่ละสมาชิก การเขียนอัลกอริทึมจึงใช้โครงสร้างควบคุมการทำงาน (Control Structure) แบบวนลูปเพื่อใช้ควบคุมสมาชิกแต่ละตัว

การกำหนดอาร์เรย์หนึ่งมิติ

การกำหนดอาร์เรย์หนึ่งมิติจะมีรูปแบบที่กำหนดไว้เป็นดังนี้

V(L:U) = { V(I) }

สำหรับ I = L,L+1,…,U-1,U ซึ่งสมาชิกแต่ละตัว V(I) จะมีโครงสร้างข้อมูล T หมายความว่าอาร์เรย์ V มีสมาชิกที่มีโครงสร้างข้อมูล T และมีดัชนีมีค่าเริ่มจาก L ไปสิ้นสุดที่ U จะได้ช่วงดัชนีจาก L ไป U เท่ากับ U-L+1 ถ้าหากให้อาร์เรย์ V(1:N) จะได้ช่วงดัชนีเท่ากับ N ในการกำหนดค่าให้กับ L อาจเป็น 0 หรือเป็นค่าติดลบได้ เช่น V(-5:5) และมีช่วงดัชนีเท่ากับ 5-(-5)+1 = 11

ตัวอย่างการใช้อาร์เรย์หนึ่งมิติ

การนำอาร์เรย์หนึ่งมิติมาใช้งานทำได้หลายหลายและมักนำไปใช้ร่วมกับโครงสร้างข้อมูลชนิดอื่น ๆ เหมือนตัวอย่างต่อไปนี้เป็นการบันทึกอุณหภูมิแต่ละชั่วโมงภายในหนึ่งวันหรือ 24 ชั่วโมง จะเห็นว่าสมาชิกถูกจัดลำดับตามช่วงระยะเวลาของวันสมาชิกเหล่านี้เป็นชนิดเดียวกัน คือ อุณหภูมิ ดังในตารางที่ 2.1 เป็นตัวอย่างโปรแกรม Temp1.c ที่ทำการบันทึกอุณหภูมิและแสดงผล

อาร์เรย์ที่สร้างขึ้นมาบันทึกอุณหภูมิมีชื่อว่า Temp โดยดัชนีจะมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 24 จะได้ว่า Temp(I)เป็นอุณหภูมิในช่วงโมงที่ I โดย 1≤ I≤ 24 และการประกาศตัวแปร Temp ดังนี้

int Temp [24];

เนื่องจากต้องมีดัชนีใช้กับอาร์เรย์จึงประกาศเป็นตัวแปร I ดังนี้

int i;

การทำงานกับสมาชิกในอาร์เรย์จะใช้การวนลูปเพื่อเก็บค่า ดังนี้

srand ( time(NULL) );

for ( i = 0; i < 24; i++ )

Temp[i] = rand( ) %20+20;

เป็นการกำหนดค่าให้แต่ละสมาชิกโดยการสุ่มค่าให้ หลังจากนั้นทำการแสดงผลบนหน้าจอ ดังนี้

for ( i = 0; i < 24; i++ )

printf ( “%d”, Temp [i] );

การสร้างอาร์เรย์มาใช้งานจะมีโครงสร้างข้อมูลที่มาเกี่ยวข้อง 2 ชนิด เพื่อกำหนดให้สมาชิกในอาร์เรย์และกำหนดให้กับดัชนี นอกจากนี้การใช้ดัชนีอ้างไปยังสมาชิกเพียงบางตัวในอาร์เรย์อาจไม่จำเป็นต้องใช้การวนลูปมาช่วย

อาร์เรย์สองมิติ

อาร์เรย์สองมิติ (Tow-dimension Array) เป็นอาร์เรย์ที่สมาชิกมีโครงสร้างข้อมูลอาร์เรย์ ลักษณะเป็นตารางที่มีทั้งแถว (Row) และคอลัมน์ หรือเรียกว่าแมตทริก (Matrix) ดังรูปที่ 2.1 เป็นอาร์เรย์สองมิติชื่อ Matrix ที่ประกอบด้วยสมาชิกใยแถว M ตัว แต่ละสมาชิกจะมีสมาชิกในคอลัมน์ N ตัว ก็จะได้เป็นตารางขนาด M ต่อ N

1                      2                      …                     J                       …                     N

1

Matrix(1,1)

2

I

Matrix(I,J)

M

Matrix(M,N)

 รูปที่ 2.2 ตัวอย่างอาร์เรย์สองมิติชื่อ Matrix มีสมาชิก M*N ตัว

อาร์เรย์สองมิติจะใช้ดัชนีสองตัวเพื่ออ้างไปยังตำแหน่งของแต่ละสมาชิกแยกกัน โดยดัชนีตัวแรกใช้กับสมาชิกในแถว ส่วนตัวที่สองใช้กับสมาชิกในคอลัมน์ ดังนั้นสมาชิกอาร์เรย์ Matrix(I,J) จึงอยู่ในตำแหน่งแถวที่ I ตำแหน่งคอลัมน์ที่ J อาร์เรย์ Matrix จะเรียกว่าอาร์เรย์มิติ M ต่อ N แต่ละแถวมีสมาชิกเท่ากับ N แต่ละคอลัมน์มีสมาชิกเท่ากับ M จะได้สมาชิกทั้งหมดเท่ากับ M*N

การเขียนอัลกอริทึมเพื่อใช้อาร์เรย์สองมิติจะนำโครงสร้างควบคุมการทำงานแบบวนลูปมาใช้ 2 ลูป โดยส่วนใหญ่จะให้ลูปแรกอยู่ด้านนอกใช้ควบคุมสมาชิกในแถว ส่วนลูปที่สองซ้อนอยู่ภายในลูปแรกใช้ควบคุมสมาชิกในคอลัมน์

การกำหนดอาร์เรย์สองมิติ

การกำหนดอาร์เรย์สองมิติจะมีรูปแบบคล้ายกับอาร์เรย์หนึ่งมิติ ซึ่งการกำหนดจะเป็นดังนี้

M(L1:U1,L2:U2) = { M(I,J) }

สำหรับ L1 ≤ I ≤ U1 และ L2 ≤ I ≤ U2 ซึ่งสมาชิกแต่ละตัว M(I,J) จะมีโครงสร้างข้อมูล T

อาร์เรย์ M มีสมาชิกที่มีโครงสร้างข้อมูล T มีสมาชิกในแถวเท่ากับ U2 – L2 + 1 และมีสมาชิกในคอลัมน์เท่ากับ U1 – L1 + 1 ดังนั้นสมาชิกทั้งหมดจะเท่ากับ (U2 – L2 +1)*(U1 – L1 +1)

ตัวอย่างการใช้อาร์เรย์สองมิติ

ตัวอย่างที่จะกล่าวถึงเป็นการบันทึกอุณหภูมิแต่ละชั่วโมงภายในหนึ่งวันเช่นเดียวกับตัวอย่างอาร์เรย์หนึ่งมิติ แต่ต้องการจะเก็บอุณหภูมิทุกวันในหนึ่งสัปดาห์ จะเห็นว่าสมาชิกจะถูกจัดลำดับตามช่วงระยะเวลาชั่วโมงของวันและตามช่วงแต่ละวันในหนึ่งสัปดาห์ สำหรับตัวอย่างโปรแกรม คือ Temp2.C ดังในตารางที่ 2.2

อาร์เรย์ที่สร้างขึ้นมาชื่อ Temp มีดัชนีตัวแรกมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 7 ส่วนดัชนีตัวที่สองมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 24 จะได้ว่า Temp(I,J) เป็นอุณหภูมิในชั่วโมงที่ J ของวันที่ I โดย 1 ≤ I ≤ 7, 1 ≤ J ≤ 24 และการประกาศตัวแปร Temp ดังนี้

int Temp[4] [7] [24];

ดัชนีที่นำมาใช้มีตัวแปร i ใช้กับแถวละตัวแปร j ใช้กับคอลัมน์ ดังนี้

int i,j;

การทำงานกับสมาชิกในอาร์เรย์จะใช้การวนลูป 2 ลูปเพื่อเก็บค่า ดังนี้

srand ( time(NULL) );

for ( i = 0; i < 7; i++ )

for( j = 0; j < 24; j++ )

Temp[i] [j]= rand( ) %20+20;

กำหนดค่าให้สมาชิกโดยการสุ่มค่าให้ จากนั้นแสดงผลบนหน้าจอ ดังนี้

for ( i = 0; i < 7; i++ ){

printf ( “%d”, Temp [i] [j] );

printf( “\n” );

}

การสร้างอาร์เรย์สองมอตอมาใช้งานนิยมใช้กับการวนลูปที่ซ้อนกัน 2 ลูป ดังนั้นสิ่งที่ควรพิจารณา คือ การใช้ลูปควบคุมสมาชิกในแถวกับคอลัมน์ควรเป็นอย่างไร จากตัวอย่างการเก็บอุณหภูมิจะเห็นว่าเวลาแต่ละชั่วโมงเป็นส่วนย่อยในแต่ละวัน แต่ละวันเป็นส่วนย่อยของสัปดาห์ การสร้างอาร์เรย์จึงใช้ส่วนหลักกำหนดเป็นแถวคือวัน ส่วนย่อยกำหนดเป็นคอลัมน์คือชั่วโมง เมื่อเขียนโปรแกรมก็จะใช้ลูปข้างนอกเป็นแถว ส่วนลูปข้างในเป็นคอลัมน์ ในกรณีที่เห็นว่าส่วนของแถวและคอลัมน์มีความสำคัญเท่ากัน อาจมีการเปลี่ยนสลับตำแหน่ง โดยการสลับดัชนีระหว่างของแถวและคอลัมน์จากอาร์เรย์ M ต่อ N ไปเป็นอาร์เรย์ N ต่อ M

อาร์เรย์หลายมิติ

การสร้างอาร์เรย์อาจเป็น สามมิติ สี่มิติ หรือมากกว่านั้นเรียกว่าอาร์เรย์หลายมิติหรือ N- มิติ ดัชนีและช่วงจำนวนสมาชิกก็จะเพิ่มมากขึ้นตามจำนวนมิติ อาร์เรย์ N-มิติจะใช้ค่าดัชนี N ตัวอ้างไปยังตำแหน่งสมาชิกแต่ละตัว การกำหนดอาร์เรย์ N-มิติจะเป็นดังนี้

M (L1:U1,L2:U2, …,Ln :Un)

แต่ละสมาชิกของอาร์เรย์จะถูกอ้างถึงโดยกำหนดเป็น M(I1,I2,…,In) ซึ่งแต่ละดัชนีที่

Ik ≤ Ik ≤ Uk สำหรับ k = 1,2,…,N จำนวนสมาชิกทั้งในอาร์เรย์ M เท่ากับ

(U1 – L1 +1) * (U2 – L2 +1) * … * (Un – Ln +1)

 

ตัวอย่างการใช้อาร์เรย์หลายมิติ

ตัวอย่างที่จะกล่าวถึงจะใช้อาร์เรย์สามมิติเพื่อบันทึกอุณหภูมิแต่ละชั่วโมงภายในแต่ละวันของสัปดาห์ และแต่ละสัปดาห์ภายในหนึ่งเดือน ดังนั้น สมาชิกของอาร์เรย์จะถูกจัดลำดับตามชั่วระยะเวลาชั่วโมงของวันและตามช่วงแต่ละวันในหนึ่งสัปดาห์ ช่วงแต่ละสัปดาห์ในหนึ่งเดือนได้เป็นตัวอย่างโปรแกรม

อาร์เรย์ Temp มีดัชนีตัวแรกอยู่ในช่วง 1 ถึง 4 ตัวที่สองอยู่ในช่วง 1 ถึง 7 และตัวที่สามอยู่ในช่วง 1 ถึง 24 ซึ่งเป็นจำนวนสัปดาห์ วัน และชั่วโมงตามลำดับ จะได้ว่า Temp(I,J,K) เป็นอุณหภูมิในชั่วโมงที่ K ของวันที่ J ในสัปดาห์ที่ I การประกาศตัวแปร Temp ได้เป็นดังนี้

int Temp [7] [24];

เนื่องจากดัชนีหลายตัวอาจสับสนได้ง่าย จึงตั้งชื่อที่มีความหมายให้เข้าใจง่ายดังนี้

int week,day,hour;

และเป็นอาร์เรย์สามมิติการทำงานกับสมาชิกจึงต้องใช้การวนลูป 3 ลูปเพื่อเก็บค่าดังนี้

srand (time(NULL) );

for(week=0;week<4;week++)

for(day=0;day<7; day++)

for (hour=0;hour<24;hour++)

Temp[week] [day] [hour] = rand( ) %20+20;

หลังจากกำหนดค่าให้แต่ละสมาชิกจะแสดงผลบนหน้าจอดังนี้

for (week =0;week<4;week++){

printf (“Temperator of week %d \n”, week+1);

for (day = 0; day<7; day++){

printf(“Day %d \n”, day+1);

for (hour =0; hour <24;hour++)

printf(“%d”,Temp[week] [day] [hour] );

}

printf(“\n”);

getch();

}

ตัวอย่างการเก็บอุณหภูมินี้อาจสร้างอาร์เรย์สี่มิติได้โดยเพิ่มการเก็บข้อมูลในช่วงระยะเวลาหนึ่งปี การสร้างอาร์เรย์หลายมิติเริ่มมีความซับซ้อนมากขึ้นและทำความเข้าใจยากจึงนำมาใช้งานน้อย จะมีที่ใช้คือ อาร์เรย์สามมิติดังในตัวอย่างซึ่งมีลักษณะเป็นกล่อง หรือลูกบาศก์ ดังแสดงในรูป 2.3 ที่ยังทำความเข้าใจได้ เป็นอาร์เรย์สามมิติชื่อ Triangle โดยมิติแรกมีช่วงระยะเท่ากับ 2 มิติที่สองมีช่วงระยะเท่ากับ 3 และมิติที่สามมีช่วงระยะเท่ากับ 5 จะมีสมาชิกทั้งหมดเท่ากับ 30 (M*N*P)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s