วันเสาร์ที่ 10 ตุลาคม พ.ศ. 2552

ลูกแรดเตรียมพร้อมล่าเหยื่อ

สิ่งที่ได้รับจากการเรียนวิชาเตรียมฝึกประสบการณ์วิชาชีพ3

1.ความมีเหตุผล :ความสามารถในการใช้ปัญญาในการประพฤติปฏิบัติ รู้จักไตร่ตรอง พิสูจน์ให้ประจักษ์ ไม่หลงงมงาย มีความยับยั้งชั่งใจ ไม่ผูกพันตนเองกับอารมณ์และความยึดมั่นส่วนตัวความสามารถในการหาสาเหตุของสิ่งต่าง ๆ ได้โดยการคิดใคร่ครวญ ไตร่ตรองปัญหาต่าง ๆ ว่ามีต้นตอมามาจากสิ่งใด รวมไปถึงการพิจารณาว่าถ้าทำสิ่งหนึ่งสิ่งใดลงไปแล้วจะเกิดผลดีหรือผลเสียต่อตนเอง และคนรอบข้างอย่างไรบ้าง
อย่างเช่น
– ใช้กระบวนการคิดอย่างมีเหตุผล
- ศรัทธาต่อการเข้าให้ถึงความจริงของเรื่องต่าง ๆ
- ไม่ลุ่มหลงเพราะเชื่องมงาย
- ไม่ยึดตนเองหรือบุคคลเป็นใหญ่
- ไม่สรุปอย่างง่าย ๆ โดยไม่ใช้เหตุผลอย่างรอบคอบ
- รู้จักเหตุ รู้จักผล รู้จักตน รู้จักประมาณ รู้จักกาละเทศะ
2. ความประหยัด :การใช้สิ่งทั้งหลายอย่างพอเหมาะพอควรเพื่อให้ได้ประโยชน์มากที่สุดการรู้จักใช้ รู้จักออมทรัพย์สิน เวลา ทรัพยากรทั้งส่วนตนและสังคมตามความจำเป็นให้เกิดประโยชน์และคุ้มค่าที่สุด รวมทั้งการรู้จักดำรงชีวิตให้เหมาะสมกับสภาพฐานะความเป็นอยู่ส่วนตนและสังคม
อย่างเช่น
- รู้จักใช้เวลาให้เป็นประโยชน์ เหมาะกับสถานการณ์
- ใช้จ่ายทรัพย์เท่าที่จำเป็น สมควรแก่อัตภาพ
- รู้จักใช้ประโยชน์จากของเก่า
- รู้จักทำของใช้เอง
- ใช้และถนอมของใช้ และทรัพย์สินให้คงคุณค่า และประโยชน์
3. ความอดทนอดกลั้น : ความอดทน คือการกระทำทุกอย่างด้วยความตั้งใจ สม่ำเสมอเป็นระยะเวลานาน โดยไม่ย่อท้อต่อปัญหาและอุปสรรคทั้งปวง ความอดกลั้น คือ การรู้จักข่มใจในเวลาที่เผชิญกับเหตุการณ์ที่เย้ายวนทุกรูปแบบ อันจะทำให้ไม่เกิดความเสียหายหรือถลำลึกลงไปในความชั่วร้าย หรือความทุจริตทั้งปวง ความเข้มแข็ง ความบึกบึน ความหนักแน่นของจิตใจที่สามารถยืนหยัดต่อสู้การกระทบกระทั้งของสภาพการณ์และเหตุการณ์ที่เกิดขึ้น โดยไม่แสดงอาการหวั่นไหวใด ๆ
อย่างเช่น
- ไม่แสดงอาการเจ็บป่วย หรือทุรนทุรายต่อความเจ็บป่วย หรือต่อ ความลำบาก ตรากตรำ
- อดทนต่อความยากลำบาก ต่อคำเย้ยหยัน คำดูหมิ่น และคำวิพากษ์วิจารณ์ของผู้อื่นโดยไม่แสดงปฏิบัติโต้ตอบใด ๆ
- มีจิตใจเข้มแข็ง ไม่ท้อแท้ ไม่ว่าจะตกอยู่ในสภาพการณ์หรือเหตุการณ์ใด ๆ
4. ความเคารพนับถือผู้อื่น : การแสดงออกซึ่งกาย วาจา ใจ อันสุภาพอ่อนโยน การรู้จักสำรวม รู้จักการให้เกียรติผู้อื่นและให้เกียรติสิ่งที่ควรเคารพอย่างถูกต้องเหมาะสมตามโอกาสและสถานการณ์ การเคารพในการแสดงออกทางความคิด คำพูดและการกระทำของผู้อื่น อันจะทำให้ตนเองมีใจที่เปิดกว้าง ไม่หมกมุ่นอยู่แต่ความติดของตนเอง เพราะในบางครั้งการที่ยึดติดอยู่เฉพาะแต่ความคิดของตนอย่างเดียวนั้นอาจจะผิดพลาด หรือมองปัญหาได้ไม่ทั่วถึง
อย่างเช่น
- แสดงความสุภาพอ่อนโยน
- แสดงอากัปกิริยาสำรวมและสงบเสงี่ยม
- ยอมรับฟังคำแนะนำของผู้อื่นด้วยกิริยาอันสำรวม
5.ความสามัคคี :ความพร้อมเพรียงเป็นน้ำหนึ่งใจเดียวกัน การร่วมมือกันทำกิจการให้สำเร็จลุล่วงด้วยดีความพร้อมเพรียง หรือความปรองดองกัน
อย่างเช่น
- รักหมู่คณะ มีใจหวังดี
- มองคนอื่นในแง่ดีเสมอ
- เข้ามีส่วนร่วมอย่างแข็งขันในกิจการของส่วนรวม
- เป็นผู้ประสานความสามัคคีในหมู่คณะ
- ปรับตนเองให้เข้ากับผู้อื่นได้

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

วันเสาร์ที่ 19 กันยายน พ.ศ. 2552

DTS 11-16/09/2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Searching

การค้นหาข้อมูลแบ่งตามลักษณะการจัดเก็บได้ 2 อย่างคือ
1. การค้นหาข้อมูลภายใน (Internal Search)
2. การค้นหาข้อมูลภายนอก (External Search)

แบ่งตามลักษณะการค้นหาได้ 2 อย่างคือ
1. การค้นหาข้อมูลตามลำดับ (Linear Search)
ซึ่งการค้นหาแบบนี้มีเทคนิค 2 อย่างคือ
1.1 Unsorted Linear Search เป็นการค้นหาข้อมูลแบบเรียงลำดับทีละตัว เริ่มตั้งแต่ข้อมูลตัวแรก ไปเรื่อย ๆ จนกระทั่งพบข้อมูลที่ต้องการ หรือจนหมดทุกตัว
Algorithm
1. กำหนดให้ ตัวนับเริ่มต้นเป็นตัวแรกของข้อมูล
2. เปรียบเทียบข้อมูล ถ้า - พบข้อมูล ทำข้อ 5 - ไม่พบข้อมูล ทำข้อ 3
3. เพิ่มค่า ตัวนับ
4. ทำซ้ำข้อ 2
5. จบ

1.2 Sorted Linear Search เป็นการค้นหาข้อมูลแบบเรียงลำดับทีละตัว เริ่มตั้งแต่ข้อมูลตัวแรก ไปเรื่อย ๆ จนกระทั่งพบข้อมูลที่ต้องการ หรือจนค่าของข้อมูลตัวถัดไปมีค่ามากกว่า ซึ่งมีเงื่อนไขว่า ข้อมูลนั้นต้องมีการจัดเรียงแล้วเท่านั้น
Algorithm
1. กำหนดให้ ตัวนับเริ่มต้นเป็นตัวแรกของข้อมูล
2. เปรียบเทียบข้อมูล ถ้า -พบข้อมูล ทำข้อ 5 -ค่าของข้อมูลที่ต้องการค้นหา < ค่าของข้อมูลที่ตำแหน่ง ตัวนับ ทำข้อ 5
3. เพิ่มค่า ตัวนับ
4. ทำซ้ำข้อ 2
5. จบ
2. การค้นหาข้อมูลทวิภาค (Binary Search)
2.1 Binary Search in Array เป็นการค้นหาข้อมูลแบบทวิภาค โดยอาศัยการแบ่งข้อมูลที่มีอยู่ออกเป็นส่วน ๆ ซึ่งต้องหาค่ากลางของข้อมูลแล้วทำการเปรียบเทียบข้อมูลจากค่ากลางนั้น และข้อมูลต้องมีการจัดเรียงแล้วเท่านั้น
Algorithm
1. หาตำแหน่งกึ่งกลางโดย ได้จาก (Lo+Hi)/2
2. เปรียบเทียบ ถ้า
2.1 พบข้อมูล ทำข้อ 4
2.2 ข้อมูลมีค่าน้อยกว่าค่ากลางให้ ค่ากลางทางซ้าย
2.3 ข้อมูลมีค่ามากกว่าค่ากลางให้ ค่ากลางทางขวา
3. ทำซ้ำข้อ 2 จนกระทั่ง ตำแหน่ง Hi=Lo
4. จบ
2.2 Binary Search Tree เป็นการค้นหาข้อมูลแบบทวิภาค ซึ่งข้อมูลจัดอยู่ในรูปแบบของ Tree ที่เป็นลักษณะของ Binary Tree
Algorithm
1. สร้าง Binary Tree
2. เปรียบเทียบ กับ Node ที่อยู่ขณะนั้น ถ้า
2.1 ถ้าพบ ทำข้อ 4
2.2 ถ้า ค่าที่ต้องการค้นหา > Node ที่อยู่ขณะนั้น ให้หา Node ทางขวา
2.3 ถ้า ค่าที่ต้องการค้นหา < Node ที่อยู่ขณะนั้น ให้หา Node ทางซ้าย
3. ทำซ้ำข้อ 2 จน Node ไม่มี Child
4. จบ

DTS10-09/09/2552

สรุปเนื้อหาบทเรียน "Data Structure" เรื่อง Graph (ต่อ) และ Sorting

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

สำหรับเทคนิคการท่องไปในกราฟมี 2 แบบดังนี้
การท่องแบบกว้าง (Breadth first traversal) วิธีนี้ทำโดยเลือกโหนดที่เป็นจุดเริ่มต้น ต่อมาให้เยือนโหนดอื่นที่ใกล้กันกับโหนดเริ่มต้นทีละระดับ จนกระทั่งเยือนหมดทุกโหนดในกราฟ

การท่องแบบลึก (Depth first traversal) การทำงานคล้ายกับการท่องทีละระดับของทรี โดยกำหนดเริ่มต้นที่โหนดแรกและเยือนโหนดถัดไปตามแนววิถีนั้นจนกระทั่งนำไปสู่ปลายวิถีนั้น จากนั้น ย้อนกลับ (backtrack) ตามแนววิถีเดิมนั้น จนกระทั่งสามารถดำเนินการต่อเนื่องเข้าสู่แนววิถีอื่น ๆ เพื่อเยือนโหนดอื่น ๆ ต่อไปจนครบทุกโหนด Sorting
การเรียงลำดับข้อมูลเป็นเรื่องสำคัญมากเรื่องหนึ่งเนื่องจากทำให้ผู้ต้องการใช้ข้อมุลเช่น ผู้บริหาร,ผู้ปฏิบัติงาน (พนักงาน) สามารถทำความเข้าใจกับข้อมูลหรือทำการค้นหาข้อมูลได้ง่ายและเร็วยิ่งขึ้นตามที่ต้องการ

การเรียงข้อมูล สามารถแบ่งได้เป็น 2 ประเภทด้วยกันคือ
การเรียงข้อมูลแบบภายใน (Internal Sorting) คือ การเรียงลำดับข้อมูล โดยทั้งหมดต้องจัดเก็บอยู่ในหน่วยความจำหลัก (main memory) ที่มีการเข้าถึงข้อมูลได้เร็ว โดยไม่จำเป็นต้องใช้หน่วยความจำสำรอง เช่น ดิสค์ หรือเทปสำหรับการจัดเก็บชั่วคราว ใช้ในกรณีที่ข้อมูลไม่มากเกินกว่าพื้นที่ความจำที่กำหนดให้กับผู้ใช้แต่ละราย
การเรียงข้อมูลแบบภายนอก (External Sorting) คือ การ เรียงลำดับข้อมูลที่มีขนาดใหญ่เกินกว่าที่จะสามารถเก็บไว้ใน พื้นที่ความจำหลักที่กำหนดให้ได้ในคราวเดียว ดังนั้นข้อมูล ส่วนมากต้องเก็บไว้ในไฟล์ข้อมูลที่อยู่บนดิสค์ เทป เป็นต้น สำหรับการเรียงข้อมูลแบบภายนอกจะต้องคิดถึงเวลาที่ใช้ใน การถ่ายเทข้อมูลจากหน่วยความจำชั่วคราวกับหน่วยความจำหลัก ด้วยเช่นกัน
การเรียงลำดับแบบเลือก (Selection Sort) เป็นวิธีที่ง่ายที่สุดในการเรียงลำดับข้อมูล โดยเริ่มจาก - หาตำแหน่งของข้อมูลที่มีค่าน้อยที่สุดแล้วสลับค่าของตำแหน่งข้อมูลนั้นกับค่าข้อมูลในตำแหน่ง A(1) จะได้ A(1) มีค่าน้อยที่สุด - หาตำแหน่งของข้อมูลที่มีค่าน้อยที่สุดในกลุ่ม A(2), A(3),....,A(n) แล้วทำกับสลับค่าข้อมูลในตำแหน่ง A(2) อย่างนี้เรื่อยไปจน กระทั่งไม่เกิน N-1 รอบ ก็จะได้ข้อมูลที่เรียงลำดับจากน้อยไปมาก
การเรียงลำดับแบบแทรก (Insertion Sort) หลักการ คือ
1. อ่านข้อมุลที่ต้องการเรียงลำดับเข้ามาทีละตัวโดยเริ่มจากตัวแรกก่อน และหาตำแหน่งของข้อมูลที่ควรจะอยู่
2. หาที่ว่างสำหรับข้อ 1.
3. Insert หรือแทรกข้อมูล ณ ตำแหน่งในข้อ 2.
การเรียงลำดับแบบบับเบิล (Bubble Sort) วิธัการเรียงลำดับแบบบับเบิลจะทำการเปรียบเทียบข้อมูลที่อยู่ในตำแหน่งที่ติดกัน ถ้าข้อมูลไม่อยู่ใลำดับที่ถูกต้อง ก็จะทำการสลับตำแหน่งของข้อมูลที่เปรียบเทียบโดยที่การเปรียบเทียบจะเริ่มที่ตำแหน่งที่ 1 กับตำแหน่งที่ 2 ก่อน ต่อไปนี้เทียบกับ ตำแหน่งที่ 2 และตำแหน่งที่ 3 จนถึงตำแหน่งที่จัดเรียงแล้ว จากนั้นจะกลับไปเริ่มต้นการเปรียบเทียบอีกจนกระทั่งจัดเรียง เรียบร้อยหมดทุกตำแหน่ง ในวิธีแบบ Bubble Sort ค่าในการเปรียบเทียบที่น้อยที่สุดหรือมากที่สุด จะลอยขึ้นข้างบน เหมือนกับฟองอากาศ

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

การเรียงลำดับอย่างเร็ว(quick sort) จะแบ่งข้อมูลเป็นสองกลุ่ม โดยใน การจัดเรียงจะเลือกข้อมุลตัวใดตัวหนึ่งออกมา ซึ่งจะเป็นตัวที่แบ่งข้อมูลออกเป็นสองกลุ่ม โดยกลุ่มแรกจะต้องมีข้อมูลน้อยกว่า ตัวแบ่ง และกลุ่มที่มีข้อมูลน้อยกว่าตัวแบ่ง และอีกกลุ่มจะมีข้อมูลที่มากกว่าตัวแบ่ง ซึ่งเราเรียกตัวแบ่งว่า ตัวหลัก(pivot) ในการเลือกตัวหลักจะมีอิสระในการเลือกข้อมูลตัวใดก็ได้ที่เราต้องการ การเรียงลำดับแบบเร็วเหมาะกับข้อมูลที่มีการเรียกซ้ำ

วันพุธที่ 2 กันยายน พ.ศ. 2552

DTS09-02/09/2552

สรุปเนื้อหาบทเรียน "Data Structure"

เรื่อง ทรี tree(ต่อ) และ เรื่องกราฟ Graph

ไบนารี่เสิร์ชทรี

เป็นไบนารี่ทรีที่รวบรวมค่าของ N เรคคอร์ดซึ่งเป็นคีย์ (Key) ตั้งแต่ K1 , K2 ,…….Kn โดยแต่ละโหนด Ri จะมี Ki เพียงคีย์เดียวสำหรับ i=1,2,….,N คีย์เป็นค่าสร้างความแตกต่าง (Identifier) ให้แต่ละโหนด ในการค้นหาโหนดที่ต้องการจะกระทำโดยค้นหาค่าของคีย์ และโหนด Ri ของไบนารี่เสิร์ชทรีจะถูกจัดการตามคุณสมบัติ ดังนี้

1. ทุก ๆ คีย์ของโหนดที่อยู่ในทรีย่อยด้านซ้ายของ Ri เป็นค่าที่มาก่อนหรือน้อยกว่าคีย์ของ Ri If Ri € Left (Ri) Then Kj <>

- ทุก ๆ คีย์ของโหนดที่อยู่ในทรีย่อยด้านขวาของ Ri เป็นค่าที่ตามหลังหรือมากกว่าคีย์ของ Ri
If Ri € Right (Ri) Then Kj > Ki จะได้ว่าคีย์ที่มาก่อนจะถูกพิจารณาตามลำดับเชิงเส้นและขึ้นกับลำดับการรวบรวม เมื่อพิจารณาตามคุณสมบัติที่ผ่านมาการค้นหาจะได้คีย์ A,B,C,D ตามลำดับและมีหลายวิธีที่จะจัดการกับไบนารี่เสิร์ชทรี จากรูปดังกล่าวจะมีไบนารี่เสิร์ชทรีหลายแบบแต่ลำดับของคีย์เหมือนกัน


วิธีการดึงโหนดออก แยกได้ 3 วิธี
1. กรณีโหนดที่จะดึงออกเป็นโหนดใบ สามารถดึงได้เลยเพราะไม่มีผลกระทบต่อโหนดอื่นๆ แล้วเป็นวิธีที่ง่ายที่สุด
2. กรณีโหนดที่ดึงออกมีเฉพาะทรีย่อยด้านซ้ายหรือทรีย่อยด้านขวาเพียงด้านใดด้านหนึ่ง สามารถทำได้เหมือนวิธีแรก เพียงให้โหนดแม่ของโหนดที่ต้องการดึงออกชี้ไปยังโหนดลูกของโหนดนั้นแทน
3. กรณีโหนดที่ต้องการดึงออกมีทั้งทรีย่อยด้านซ้ายและทรีย่อยด้านขวา ต้องทำการเลือกว่าจะนำทรีย่อยด้านใดมาแทนโหนดที่ถูกดึงออก


กราฟ (Graph)


เป็นโครงสร้างข้อมูลไม่เป็นเชิงเส้น (Nonlinear Data Structure) มีความแตกต่างจากโครงสร้างข้อมูลทรีในบทที่ผ่านมา แต่เป็นลักษณะพิเศษแบบหนี่งของกราฟโดยทรีเป็นกราฟอะไซคลิกที่ไม่มีการวนลูปและการวนถอยกลับ เป็นกราฟเชื่อมกันที่มีเพียงเอจเดียวระหว่างสองโหนด
กราฟเป็นโครงสร้างข้อมูลประเภทหนึ่งที่แสดงความสัมพันธ์ระหว่าง vertex และ edge กราฟจะประกอบด้วยกลุ่มของ vertex ซึ่งแสดงในกราฟด้วยสัญลักษณ์รูปวงกลม และ กลุ่มของ edge (เส้นเชื่อมระหว่าง vertex) ใช้แสดงถึงความสัมพันธ์ระหว่าง vertex หากมี vertex ตั้งแต่ 2 vertex ขึ้นไปมีความสัมพันธ์กัน ใช้สัญลักษณ์เส้นตรงซึ่งอาจมีหัวลูกศร หรือไม่มีก็ได้
กราฟสามารถเขียนแทนด้วยสัญลักษณ์ ดังนี้
G = ( V , E )
G คือ กราฟ
V คือ กลุ่มของ vertex
E คือ กลุ่มของ edge
ศัพท์ที่เกี่ยวข้อง
1.เวอร์เทก (Vertex) หมายถึง โหนด
2.เอดจ (Edge) หมายถึง เส้นเชื่อมของโหนด
3.ดีกรี (Degree) หมายถึง จำนวนเส้นเข้าและออก ของโหนดแต่ละโหนด
4.แอดจาเซนท์โหนด (Adjacent Node) หมายถึง โหนดที่มีการเชื่อมโยงกัน

Graph แบ่งเป็น
1. Directed Graph (Digraph) (Arc) แบบระบุทิศทาง

2. Undirected Graph แบบไม่ระบุทิศทาง


การเก็บข้อมูลในหน่วยความจำสามารถทำได้ 2 แบบ ดังนี้
1. Adjacency Matrix (แอดจาเซนซี เมตริก) : ใช้อาร์เรย์เก็บข้อมูล
2. Adjacency List (แอดจาเซนซี ลิส) : ใช้ลิงค์ลิสต์เก็บข้อมูล
Adjacency Matrix
เป็นโครงสร้างที่ประกอบไปด้วยโหนดและเส้นเชื่อมต่อที่บอกถึงเส้นทางของการเดินทาง หรือความสัมพันธ์ในทิศทางซึ่งสามารถนำมาแทนความสัมพันธ์นั้นด้วยการกำหนดเมตริกซ์ n x n
Mk เป็นเมทริกซ์ของกราฟใด ๆ k คือทางเดินที่มีความยาว k จากโหนดหนึ่งไปอีกโหนดหนึ่ง
Adjacency Matrix
0 : ไม่เป็นแอดจาเซนซีกัน
1 : เป็นแอดจาเซนซีกัน

การท่องไปในกราฟ
เป็นการไปเยือนโหนดในกราฟ ซึ่งแต่ละโหนดจะถูกเยือนเพียงครั้งเดียว แต่กราฟนั้นมาหลายเส้นทางเมื่อเยือนแล้วต้องทำเครื่องหมายว่าได้เยือนเรียบร้อย การท่องไปในกราฟมี 2 แบบ คือ
1.การท่องแบบกว้าง เป็นการกำหนดโหนดที่จะเยือนหรือโหนดเริ่มต้นแล้วทำการเยือนไปยังโหนดที่ใกล้เคียงจนกระทั่งครบทุกโหนด
2.การท่องแบบลึก โดยกำหนดเริ่มต้นที่โหนดแรกแล้วเยือนโหนดถัดไปตามแนววิถีจนถึงปลายวิถี แล้วย้อนกลับมาเพื่อเยือนโหนดอื่นๆ

วันพฤหัสบดีที่ 27 สิงหาคม พ.ศ. 2552

DTS08 26/08/2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง ทรี(Tree)
ทรีเป็นกราฟแบบมีทิศทาง ที่มีโครงสร้างแบบลำดับชั้น ทิศทางของกราฟที่แทนทรีจะมีทิศทางจากบนลงล่าง ดังนั้นการกวาดทรี เราจึงไม่นิยมแสดงทิศทางของเส้นเชื่อม
การให้นิยามในรูปของการเรียกซ้ำซึ่งสอดคล้องกับลักษณะธรรมชาติ ของทรี ดังนี้ คือ ทรีประกอบด้วยโหนด R ซึ่งเรียกว่า โหนดราก (root) และ ทรีย่อย (subtree) จำนวนศูนย์ หรือมากกว่าศูนย์ ซึ่งแต่ละทรีย่อยจะเชื่อมกับโหนดราก (R)โดยตรงด้วยเส้นเชื่อม

การเรียกชื่อองค์ประกอบของทรี
โหนดที่อยู่ระดับบนสุดของทรี เรียกว่า โหนด R ,โหนดราก, พ่อ (father)

โหนดรากของทรีย่อยของ R เรียกว่า ลูก (child) ของ R
โหนดที่ไม่มีโหนดลูก เรียกว่า โหนดใบ (leaf node)
เส้นเชื่อมโหนดทรี เรียกว่า กิ่ง (branch)
โหนดที่มีทั้งพ่อทั้งลูก เรียกว่า โหนดกิ่ง (branch node)
โหนดที่มีพ่อเดียวกัน เรียกว่า โหนดพี่น้อง (sibling) และยังอาจนิยามโหนดว่าเป็น โหนดปู่ (grandfather) หรือ โหนดหลาน (gtrandchild) ได้ในลักษณะเดียวกัน
เส้นทาง (path) จากโหนด n1 ไปยังโหนด nk ใดๆ จะเป็นลำดับของโหนด n1,n2,...,nk
ความยาว (length) ของเส้นทางจะเป็นจำนวนของเส้นเชื่อมที่อยู่ในเส้นทาง ซึ่งเท่ากับ k-1 เส้นทาง จากโหนดใดๆ ไปยังตัวเองจะมีความยาวเป็ยศูนย์ และในทรีแต่ละทรี จะมีเส้นทางหนึ่งเส้นเท่านั้นจากโหนดรากไปยัง โหนดใดๆ ความลึก (depth) เป็น ความยาวของเส้นทางจากโหนดรากไปยังโหนด n โซึ่งมีเส้นทางเดียวที่ไม่ซ้ำกัน) ความสูง (height) เป็น เส้นทางทีสุดจากโหนด n ไปยังโหนดใบถ้ามีเส้นทางจาดโหนด n1 ไปยังโหนด n2 จะเป็น บรรพบุรุษ (ancestor) ของ n2 และ n2 จะเป็น ลูกหลาน (descendant) ของ n1 ถ้า n1 != n2 ดังนั้น n1 จะเป็น บรรพบุรุษที่แท้จริง (proper ascestor) ของ n1 และ n2 ลูกหลานที่แท้จริง (proper descendant)

ทรีแบบลำดับ
ทรีแบบราก (rooted tree ) เป็นทรีที่สามารถวาดได้อิสระ โดยเชื่อมโหนดในระดับต่ำลงไป และมีโหนด ใบอยู่ในระดับล่าง มีโครงสร้างไม่เหมาะสมก่การใช้งาน เนื่องจากวิธีการเรียกชื่อโหนดจากลำดับซ้ายไปขวา "ทรีแบบลำดับ (ordered tree)" คือ ทรีแบบรากที่โหนดลูกของแต่ละโหนดถูกกำหนดลำดับดังรูป ถ้าต้องการจะใช้ทรีแบบลำดับเป็นโครงสร้างข้อมูล ในแต่ละโหนดจะต้องมีจำนวนเขตข้อมูลมากพอๆ กับจำนวน ของโหนดนั้น ดังนั้นถ้ามีบางโหนดในทรีมีจำนวนทรีมากกว่า 10 ทรีย่อย จะต้องมีเขตข้อมูลสำหรับลิงค์ของ แต่ละโหนดถึง 10 เขต ซึ่งแต่ละเขตลิงค์ต่างๆ เหล่านี้ส่วนใหญ่จะมีค่าเป็น NULL ซึ่งทำให้เนื้อที่จำนวนมาก ไม่ได้ใช้งาน
ไบนารีทรี
ไบนารีทรี เป็น ทรีว่าง หรือทรีที่ประกอบด้วยโหนดรากที่เรียกว่า ราก กับ ไบนารีทรี 2 ทรี เรียกว่า ทรีย่อยทางซ้าย (left subtree) และ ทรีย่อยทางขวา (right subtree) ของราก การสร้างไบนารีทรี ที่มีโหนดเดียว สามารถสร้างโหนดนั้นเป็นโหนดรากที่มีทรีย่อยทางซ้าย และทรีทางขวาเป็นทรีว่าง จะเห็นว่าไบนารีทรีแตก ต่างจากทรีทั่วไป เนื่องจากในไบนารีทรี ความหมายของคำว่า ซ้าย หรือ ขวา มีความสำคัญ ไบนารีทรี 2 โหนด ดังนั้นไบนารีทรีสามรถได้มาจากทรีแบบลำดับที่เหมาะสมกัน โดยการแยกกิ่งทางซ้ายออกจากกิ่งทางขวา
การเปลี่ยนทรีทั่วไปเป็นไบนารีทรี
ไบนารีทรีเป็นโครงสร้างข้อมูลที่มีประสิทธิภาพ แต่มีข้อจำกัดว่า แต่ละโหนดมีลูกได้ไม่เกิน 2 และในการประยุกต์ ใช้งานส่วนใหญ่ โครงสร้างข้อมูลเป็นจำนวนใดๆ ได้ตามใจ การเปลี่ยนทรีทั่วไปเป็นไบนารีทรี เริ่มต้นจะเชื่อมโหนด แต่ละโหนดกับโหนดลูกซ้ายสุดของโหนดนั้น ซึ่งเรียกว่าโหนดแรก ต่อมาเชื่อมแต่ละโหนดยกเว้นโหนดรากกับโหนดถัดไป ที่มีพ่อเดียวกัน(พี่น้อง) ซึ่งเรียกว่าเชื่อมโหนดลูกถัดไป
เพื่อให้โครงสร้างของไบนารีทรีที่ดีกว่านี้ จะต้องหมุนทรีเล็กน้อยตามเข็มนาฬิกา ซึ่งจะทำให้เส้นเชื่อมที่ชี้ลงล่าง ชี้ลงไปทางซ้าย และเส้นเชื่อมที่ชี้ตามแนวนอน ชี้ลงไปข้างล่างทางขวา
ป่าและสวน
ป่า (forest) หมายถึงของทรีที่เป็นทรีแบบรก และ สวน (orchard) หมายถึง ชุดของทรีแบบลำดับ แต่โดยทั่วไป แล้วป่ากับสวนมีความหมายเดียวกัน คือ ชุดของทรีทั่วไป
สามารถสร้างป่าหรือสวนได้ โดยการขจัดรากออกไปจากทรีแบบราก หรือแบบลำดับและทำนองเดียวกัน สามารถแปลง จากป่าแสวนไปเป็นไบนารีทรีได้มีขั้นตอนดังต่อไปนี้
1.ขจัดเส้นเชื่อมเดิมออก
2.แปลงทรีแต่ละต้นให้เป็นไบนารีทรี
3.เชื่อมโหนดรากของทรีเขาด้วยกัน ในแนวนอนโดยใช้ความสัมพันธ์พี่น้อง
4.หมุนทรีที่ได้ 45 องศาตามเข็มนาฬิกา ซึ่งจะทำให้เส้นเชื่อมในแนวตั้งกลายเป็นเส้นเชื่อมทางซ้าย และเส้นเชื่อมในแนวนอนกลายเป็นเส้นเชื่อมทางขวา
การท่องไบนารีทรี (traversal of binary tree)
เป็นการเคลื่อนที่ไปยังโหนดทุกโหนดของไบนารีของทรี หรือการเยี่ยมโหนดทุกโหนดของทรี ในข้อมูลแบบทรีโหนด ทุกโหนดที่จะท่องมีลำดับแตกต่างกัน ที่โหนดใด ไๆที่กำหนดให้จะต้องมีการกระทำ 3 อย่าง ในลำดับใดๆ คือ
1. เยี่ยมโหนดนั้น
2. ท่องไปยังทรีย่อยทางซ้ายของโหนดนั้น
3. ท่องไปยังทรีย่อยทางขวาของโหนดนั้น
จุดสำคัญของของการท่องไบนารีทรีคือ จะเยี่ยมททรีย่อยก่อนการท่องทรีย่อยที่มีอยู่ หรือจะเยี่ยมโหนดนั้นใน ระหว่างการท่องทรีย่อยของโหนดนั้น หรือจะเยี่ยมดหนดนั้นในระหว่างการท่องทรีย่อยภายหลังจากการท่องทรีย่อย ทั้งสองของโหนดนั้นเสร็จเรียบร้อยแล้ว


วันพุธที่ 5 สิงหาคม พ.ศ. 2552

DTS07-05/08/2552

สรุปเรื่อง Queue

Queue เป็น List แบบเชิงเส้น (Linear Data Structure) เช่นเดียวกับ Stack แต่มีความแตกต่างกันคือ Queue มีตัวชี้ 2 ตัว คือ
–หัว (Head)
–ท้าย (Tail)
คิวเป็นโครงสร้างข้อมูลแบบหนึ่งซึ่งมีลักษณะที่ว่า ข้อมูลที่นำเข้าไปเก็บก่อนจะถูกนำออกมาทำงานก่อน ส่วนข้อมูลที่เข้าไปเก็บทีหลังก็จะถูกนำออกมาใช้งานทีหลัง ขึ้นอยู่กับลำดับการเก็บข้อมูล จะเรียกลักษณะการทำงานแบบนี้ว่า เข้าก่อนออกก่อน หรือ First In First Out (FIFO)
โครงสร้างข้อมูลแบบนี้เป็นโครงสร้างที่ปรากฏอยู่โดยทั่วๆ ไป โดยเฉพาะอย่างยิ่งในระบบปฏิบัติการคอมพิวเตอร์ ในระบบคมนาคม รวมทั้งในระบบการทดลองดาวเทียมด้วย
ลักษณะของโครงสร้างแบบคิวจะเหมือนกับการเข้าแถวรอคอย ไม่ว่าจะเป็นการรอคอยอะไรก็ตาม หรือจะเรียกสั้นๆ ว่า เข้าคิวก็ได้ ด้วยคุณสมบัติที่เด่นชัดของการทำงานของโครงสร้างข้อมูลแบบคิวนี้ ว่าสิ่งใดที่เข้าก่อนย่อมต้องได้รับการทำงานก่อน เช่น การสั่งพิมพ์งานพร้อมกันหลายๆ คน โดยใช้เครื่องพิมพ์เครื่องเดียวกัน ทำให้ระบบจะต้องมีการจัดระบบให้มีการเข้าคิวรอคอยการทำงาน ถ้าใครสั่งพิมพ์ก่อนก็จะเข้าคิวไปรอการพิมพ์ในลำดับแรก ใครสั่งเป็นคนต่อไปก็จะต้องเข้าคิวรอจนกว่างานแรกจะทำการพิมพ์เสร็จ จึงจะมาทำงานกับคิวที่รออยู่ต่อไปการสร้างคิว (Queue)
คิวที่อยู่ในคอมพิวเตอร์สามารถจัดเก็บได้หลายลักษณะ แต่โดยทั่วไปแล้วจะใช้การจัดเก็บแบบลิงค์ลิสท์เดี่ยวหรือจัดเก็บโดยใช้อาร์เรย์
ก่อนที่จะทำการสร้างคิวจะต้องทำความเข้าใจถึงโครงสร้างของคิว ซึ่งประกอบไปด้วย ตัวคิว ซึ่งในที่นี้ขอแทนด้วยอาร์เรย์ และจะต้องมีตัวชี้อีก 2 ตัว ได้แก่ ตัวชี้ F (Front Pointer) ชี้ไปที่สมาชิกตัวแรก และตัวชี้ R (Rear Pointer) ชี้ไปที่สมาชิกตัวสุดท้ายของคิว โดยที่เวลาข้อมูลจะเข้าสู่คิวจะเข้าทาง R ส่วนเวลาที่ข้อมูลจะออกจากคิวจะออกทาง F
เมื่อเริ่มต้นสร้างคิว คิวนั้นไม่มีค่าใดๆ ยังว่างเปล่า F และ R จะมีค่าเป็น 0 ทั้งคู่ คือไม่ได้ชี้ไปที่สมาชิกตัวใด การนำข้อมูลเข้าสู่คิวเรียกว่า การ Insertion ส่วนการนำข้อมูลออกจากคิวเรียกว่า การ Deletion

การ Insertion
เป็นการนำข้อมูลเข้าสู่คิว โดยการที่จะนำข้อมูลเข้าสู่คิวนั้นจะแบ่งออกเป็น 2 กรณี คือ
1. การนำข้อมูลเข้าไปในคิวว่าง โดยจะต้องดำเนินการให้พอยน์เตอร์ทั้ง 2 คือ F และ R ชี้ไปยังช่องแรกหรือตำแหน่งที่จะเก็บข้อมูลแรก
2. การนำข้อมูลเข้าไปในคิวต่อจากข้อมูลเดิม จะต้องจัดการให้พอยน์เตอร์ R ชี้ไปยังช่องหรือตำแหน่งของข้อมูลที่นำเข้าไป ส่วนพอยน์เตอร์ F ยังคงชี้ไปยังช่องหรือตำแหน่งของข้อมูลที่นำเข้าไปเป็นข้อมูลแรก
จากการ Insertion ข้อมูลเข้าไปในคิวแล้ว ถ้าหากทำการ Insertion ข้อมูลจนพอยน์เตอร์ R อยู่ที่ช่องสุดท้ายแล้ว จะไม่สามารถทำการ Insertion ข้อมูลลงคิวได้อีก เนื่องจากตัวที่เก็บข้อมูลคิวเต็มทำให้ไม่สามารถที่จะรับข้อมูลอื่นๆ อีกได้ ฉะนั้นจะเกิด Error ขึ้น ซึ่ง Error นี้เรียกว่า Overflow ขึ้น

การประยุกต์ใช้คิว
การทำงานของระบบคอมพิวเตอร์ในโลกยุคปัจจุบันจะเป็นการทำงานในลักษณะเครือข่าย และมีการใช้ทรัพยากรร่วมกัน การที่ระบบปฏิบัติการจะจัดสรรทรัพยากรเพื่อให้บริการแก่ผู้ใช้ หรืองานต่าง ๆ อย่างมีประสิทธิภาพ สมดุล และยุติธรรม ชนิดข้อมูลแบบคิวมีความสำคัญมากในการดำเนินงานของระบบปฏิบัติการ ตัวอย่างเช่น ในการใช้ทรัพยากร CPU จากเครื่อง Server หรือการใช้ทรัพยากร System Printer สำหรับผู้ใช้หลายคน ระบบปฏิบัติการจะใช้ชนิดข้อมูลแบบคิวในการจัดระเบียบผู้ใช้

วันอังคารที่ 28 กรกฎาคม พ.ศ. 2552

DTS06-28/07/2552

สรุปเรื่อง สแตก (ต่อ)

การใช้ สแตค เพื่อแปลรูปนิพจน์ทางคณิตศาสตร์
รูปแบบนิพจน์ทางคณิตศาสตร์
• นิพจน์ Infix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่ระหว่างตัวดำเนินการ (Operands) เช่น A+B-C
• นิพจน์ Prefix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่หน้าตัวดำเนินการ (Operands) เช่น +-AB
• นิพจน์ Postfix คือ นิพจน์ที่เครื่องหมายดำเนินการ (Operator) อยู่หลังตัวดำเนินการ (Operands) เช่น AC*+

การแปลงจาก infix เป็น postfix Stack มีการทำงานแบบ LIFO ถูกนำมาอธิบายการทำงานของการแปลงจาก infix เป็น postfix อยู่เสมอ โดยพิจารณาน้ำหนักของเครื่องหมายในนิพจน์ และเครื่องหมายที่ถูกกระทำก่อนไปหลังคือ
1. วงเล็บ Parenthesis ()
2. ยกกำลัง Exponentiation ^ (Left to Right)
3. คูณและหาร Multiplication *, Division / (Left to Right)
4. บวกและลบ Addition +, Subtraction - (Left to Right)


กฎเกี่ยวกับการแปลง
1. ถ้าข้อมูลเข้า (input) เป็นตัวถูกดำเนินการ (operand) ให้นำออกไปเป็นผลลัพธ์ (output)
2. ถ้าข้อมูลเข้าเป็นตัวดำเนินการ (operator) ให้ดำเนินการดังนี้
2.1 ถ้าสแตคว่าง ให้ push operator ลงในสแตค
2.2 ถ้าสแตคไม่ว่าง ให้เปรียบเทียบ operator ที่เข้ามากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค
2.2.1 ถ้า operator ที่เข้ามามีความสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตคให้ push ลงสแตค
2.2.2 ถ้า operator ที่เข้ามามีความสำคัญน้อยกว่าหรือเท่ากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค ให้ pop สแตคออกไปเป็นผลลัพธ์ แล้วทำการเปรียบเทียบ operator ที่เข้ามากับ operator ที่ตำแหน่ง TOP ต่อไป จะหยุดจนกว่า operator ที่เข้ามาจะมีความสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตค แล้วจึง push operator ที่เข้ามานั้นลงสแตค
3. ถ้าข้อมูลเข้าเป็นวงเล็บเปิด ให้ push ลงสแตค
4. ถ้าข้อมูลเข้าเป็นวงเล็บปิด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าจะถึงวงเล็บ เปิด จากนั้นทิ้งวงเล็บเปิดและปิดทิ้งไป
5. ถ้าข้อมูลเข้าหมด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าสแตคจะว่าง

วันพุธที่ 22 กรกฎาคม พ.ศ. 2552

DTS05-22/07/2552

สรุปบทเรียน Linked ListและStack

Linked List (ต่อ)
กระบวนงานและฟังก์ชั่นที่ใช้ดำเนินงานพื้นฐาน
1. กระบวนงาน Create Listหน้าที่ สร้างลิสต์ว่างผลลัพธ์ ลิสต์ว่าง
2. กระบวนงาน Insert Nodeหน้าที่เพิ่มข้อมูลลงไปในลิสต์บริเวณตำแหน่งที่ต้องการข้อมูลนำเข้า ลิสต์ ข้อมูล และตำแหน่งผลลัพธ์ ลิสต์ที่มีการเปลี่ยนแปลง
3. กระบวนงาน Delete Nodeหน้าที่ ลบสมาชิกในลิสต์บริเวณตำแหน่งที่ต้องการข้อมูลนำเข้า ข้อมูลและตำแหน่งผลลัพธ์ ลิสต์ที่มีการเปลี่ยนแปลง
4. กระบวนงาน Search listหน้าที่ ค้นหาข้อมูลในลิสต์ที่ต้องการข้อมูลนำเข้าลิสต์ผลลัพธ์ ค่าจริงถ้าพบข้อมูล ค่าเท็จถ้าไม่พบข้อมูล
5. กระบวนงาน Traverseหน้าที่ ท่องไปในลิสต์เพื่อเข้าถึงและประมวลผลข้อมูลนำเข้าลิสต์ผลลัพธ์ ขึ้นกับการประมวลผล เช่นเปลี่ยนแปลงค่าใน node , รวมฟิลด์ในลิสต์ ,คำนวณค่าเฉลี่ยของฟิลด์ เป็นต้น
6. กระบวนงาน Retrieve Nodeหน้าที่ หาตำแหน่งข้อมูลจากลิสต์ข้อมูลนำเข้าลิสต์ผลลัพธ์ ตำแหน่งข้อมูลที่อยู่ในลิสต์
7. ฟังก์ชั่น EmptyListหน้าที่ ทดสอบว่าลิสต์ว่างข้อมูลนำเข้า ลิสต์ผลลัพธ์ เป็นจริง ถ้าลิสต์ว่างเป็นเท็จ ถ้าลิสต์ไม่ว่าง
8. ฟังก์ชั่น FullListหน้าที่ ทดสอบว่าลิสต์เต็มหรือไม่ข้อมูลนำเข้าลิสต์ผลลัพธ์ เป็นจริง ถ้าหน่วยความจำเต็มเป็นเท็จ ถ้าสามารถมีโหนดอื่น
9. ฟังก์ชั่น list countหน้าที่ นับจำนวนข้อมูลที่อยู่ในลิสต์ข้อมูลนำเข้าลิสต์ผลลัพธ์ จำนวนข้อมูลที่อยู่ในลิสต์
10. กระบวนงาน destroy listหน้าที่ ทำลายลิสต์ข้อมูลนำเข้า ลิสต์ผลลัพธ์ ไม่มีลิสต์

Linked List แบบซับซ้อน
1. Circular Linked List เป็นลิงค์ลิสต์ที่สมาชิกตัวสุดท้ายมีตัวชี้ (list) ชี้ไปที่สมาชิกตัวแรกของลิงค์ลิสต์ จะมีการทำงานไปในทิศทางเดียวเท่านั้นคือเป็นแบบวงกลม
2. Double Linked List เป็นลิงค์ลิสต์ที่มีทิศทางการทำงานแบบ 2 ทิศทาง ในลิงค์ลิสต์แบบ 2ทิศทาง ส่วนข้อมูลจะมีตัวชี้ไปที่ข้อมูลก่อนหน้า (backward pointer) และตัวชี้ข้อมูลถัดไป(forward pointer)

สแตค (Stack)
สแตคเป็นโครงสร้างข้อมูลที่มีลักษณะแบบลำดับ (sequential) คือการกระทำกับข้อมูลจะกระทำที่ปลายข้างเดียวกันที่ส่วนปลายสุดของสแตค การกระทำกับข้อมูลของสแตคประกอบไปด้วยการนำเข้าข้อมูลเข้า (PUSH) ที่ส่วนบนสุดของสแตค และการนำข้อมูลออก (POP) ที่ส่วนบนสุดของสแตคเช่นกัน ในการจะ Push ข้อมูลเข้าก็ต้องตรวจสอบด้วยว่าข้อมูลในสแตคเต็มหรือไม่ หากสแตคเต็มก็จะไม่สามารถ Push หรือนำข้อมูลเข้าได้ เช่นเดียวกับการ Pop ข้อมูลออกก็ต้องตรวจสอบด้วยว่ามีข้อมูลอยู่ในสแตคหรือไม่ หากไม่มีข้อมูลอยู่ในสแตคหรือสแตคว่าง (empty stack) ก็ไม่สามารถ pop ได้การนำข้อมูลเข้า-ออก จากสแตค (push , pop) จะมีลักษณะแบบเข้าหลัง ออกก่อน (LIFO : Last In , First Out) คือ ข้อมูลที่เข้าไปในสแตคลำดับหลังสุด จะถูกนำข้อมูลออกจากสแตคเป็นลำดับแรก

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

วันพฤหัสบดีที่ 16 กรกฎาคม พ.ศ. 2552

การบ้านการใช้ iosteam.h และ stdio.h

<เขียนโปรแกรมโดยใช้ stdio.h >
#include
void main()
{
int N1;
int N2;
int Sum;
printf("Input frist integer number : ");
scanf("%d",&N1);
printf("Input second integer number : ");
scanf("%d",&N2);
Sum = N1 + N2;
printf("So %d + %d = %d",N1,N2,Sum);

}

<เขียนโปรแกรมโดยใช้ iostream.h >
#include
void main()
{
int N1;
int N2;
int Sum;
cout<<"Input frist integer number : "; cin>>N1;
cout<<"Input second integer number : "; cin>>N2;
Sum = N1 + N2;
cout<<"Sum ="<}

DTS04-15/07/2552

สรุปบทเรียน Set and String , Linked List

อะเรย์ของสตริง

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

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

ลิงค์ลิสต์ Linked Lists
โครงสร้างข้อมูลแบบลิงค์ลิสต์ เป็นโครงสร้างข้อมูลแบบไดนามิก โดยที่ขนาด ของมันสามารถเปลี่ยนแปลงได้ โดยสมาชิกแต่ละตัวของลิงค์ลิสต์จะถูกเรียกว่าโหนด (Node) ประกอบด้วย 2 ส่วนคือ ส่วนของข้อมูล (Data) และส่วนที่เป็นตำแหน่งที่อยู่ของ โหนดตัวต่อไปในลิงค์ลิสต์ (Next Address) หรืออาจเรียกว่า พอยเตอร์ (Pointer) ซึ่งทำให้ เราสามารถกำหนดตำแหน่งของโหนดตัวต่อไปได้ กล่าวคือ โหนดตัวแรกจะมี พอยเตอร์ ชี้ไปยังโหนดตัวที่สอง โหนดตัวที่สอง มีพอยเตอร์ชี้ไปยังโหนดตัวที่สาม เป็นเช่นนี้ไปเรื่อยๆ


โครงสร้างลิงค์ลิสต์ (Linked List Structure)
โครงสร้างข้อมูลลิงค์ลิสต์ประกอบไปด้วยข้อมูลที่เชื่อมโยงกันด้วยพอยเตอร์ สมาชิกแต่ละตัวในลิงค์ลิสต์เรียกว่า โหนด (Node) แต่ละโหนดจะประกอบขึ้นจากข้อมูล 2 ส่วนคือ
1. ส่วนที่ใช้เก็บข้อมูลข่าวสาร (information field)
2. ส่วนที่เป็นพอยเตอร์ซึ่งใช้สำหรับชี้ตำแหน่งที่อยู่ของสมาชิกตัวถัดไป



โครงสร้างของโหนด (Node Structure)
เราสามารถนิยามโครงสร้างของโหนดด้วยแบบข้อมูลโครงสร้างซึ่งประกอบด้วยฟิลด์ข้อมูลและฟิลด์พอยเตอร์ดังเช่น
struct Node { char Info;
struct Node *Next;
};
โครงสร้าง Node ประกอบด้วยฟิลด์ Info ซึ่งมีแบบข้อมูล char และฟิลด์ Next ซึ่งเป็นพอยเตอร์ชี้ไปที่ Node จะพบได้ว่าการนิยามโครงสร้าง Node อยู่ในรูปของรีเคอร์สีฟ โดยที่ฟิลด์ Next เป็นพอยเตอร์ที่ชี้ไปยังโครงสร้างของตัวเอง








วันพุธที่ 1 กรกฎาคม พ.ศ. 2552

DTS 03-01/07/2552

สรุปเนื้อหาบทเรียน "Data Structure"
เรื่อง Pointer ,Set and String



pointer

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


จะคล้ายกับการกำหนดตัวแปรชนิดต่างๆ เพียงแต่ต้องมีเครื่องหมาย * หน้าชื่อตัวแปร ดังนี้

int *pt_X; สร้างตัวแปรพอร์ยเตอร์ชนิดintทำให้pt_xใช้เก็บตำแหน่งที่อยู่ขอตัวแปรชนิดintเท่านั้น
float*pt_num; สร้างตัวแปรพอร์ยเตอร์ชนิดfloatทำให้pt_numใช้เก็บตำแหน่งที่อยู่ของตัวแปรชนิดfloatเท่านั้น
char*pt_ch;สร้างตัวแปรพอร์ยเตอร์ชนิดcharทำให้pt_chใช้เก็บตำแหน่งที่อยู่ของตัวแปรชนิดcharเท่านั้น

โครงสร้างข้อมูลแบบ Set
เป็นโครงสร้างที่ข้อมูลแต่ละตัวไม่มีความสัมพันธ์กันเลย ตัวดำเนินการของเซ็ต ประกอบด้วย
-set intersection
-set union
-set difference

โครงสร้างข้อมูลแบบ String

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

วันอังคารที่ 30 มิถุนายน พ.ศ. 2552

วันพุธที่ 24 มิถุนายน พ.ศ. 2552

DTS 02-24/06/2552

สรุปเรื่อง Array and Record

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

การสร้าง Array ขึ้นมาใช้งานนั้น ต้องคำนึงถึง
1. ชื่อของ Array
2. ขนาดของ Array แต่ละช่อง และมิติของ Array
3. ค่าสูงสุด ( Upper Bound) และค่าต่ำสุด (Lower Bound) ในแต่ละมิติ
ในการประกาศตัวแปรหรืออะเรย์ เราสามารถทำการกำหนดค่าเริ่มต้นให้กับตัวแปรหรืออะเรย์นั้นได้


การประกาศตัวแปรอะเรย์
int n[10]; ประกาศตัวแปรอะเรย์ชื่อ n มีขนาด 10 หน่วย แต่ละหน่วยเก็บเล็กจำนวนเต็ม
char a[20]; ประกาศตัวแปรอะเรย์ชื่อ a มีขนาด 20 หน่วย แต่ละหน่วยเก็บตัวอักขระ
float g[5]; ประกาศตัวแปรอะเรย์ชื่อ g มีขนาด 5 หน่วย และหน่วยเก็บเลขทศนิยม

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


การบ้าน


#include
#include
void main ()
{
struct student {
char name [20];
char last_name [20];
char sex [10];
char number [30];
int age;
char brithday [20];
char telephone [20];
char address [20];
}student1;
strcpy(student1.name,"piyanuch");

strcpy(student1.last_name,"polinkong");
strcpy(student1.sex,"female");
strcpy(student1.brithday,"19092532");
strcpy(student1.telephone,"0862266100");
strcpy(student1.address,"bangkok");
strcpy(student1.number,"50152792034");
student1.age=20;
printf("name:%s\n\n",student1.name);

printf("last_name:%s\n\n",student1.last_name);
printf("sex:%s\n\n",student1.sex);
printf("brithdy:%s\n\n",student1.brithday);
printf("telephone:%s\n\n",student1.telephone);
printf("address:%s\n\n",student1.address);
printf("number:%s\n\n",student1.number);
printf("age:%d\n\n",student1.age);
}






ประวัติส่วนตัว




นางสาวปิยนุช พลหินกอง

Miss Piyanuch Polinkong

ชื่อเล่น โบว์ เกิดวันที่ 19 ก.ย.2531

รหัสนักศึกษา 50152792034

หลักสูตรบริหารธุรกิจ(คอมพิวเตอร์ธุรกิจ)

คณะวิทยาการจัดการ

มหาวิทยาลัยราชภัฎสวนดุสิต

E-mail:u50152792034@gmail.com

คติประจำใจ:สู่ให้ถึงที่สุดอย่าหยุดเมื่อสิ้นหวัง