Developer Team
BorntoDev Co., Ltd.
Data Structure มันคืออะไรกัน ?
“Data Structure” แปลตรงตัวก็คือ “โครงสร้างข้อมูล” ความหมายของคำนี้ในด้านคอมพิวเตอร์ก็คือเรื่องเกี่ยวกับวิธีการจัดการกับข้อมูลคอมพิวเตอร์ในรูปแบบและวิธีต่างๆ เพื่อให้สามารถใช้งานข้อมูลเหล่านั้นได้อย่างมีประสิทธิภาพมากที่สุด โดยในครั้งนี้เราจะมาดูกันว่าเราจะสามารถใช้ความรู้เรื่อง Data Structure ไปใช้ทำอะไรในส่วนไหนได้บ้าง ผ่านตัวอย่างรูปแบบข้อมูลแบบต่างๆ
Stack
สำหรับ Stack นั้นจะเป็นการเก็บข้อมูลแบบมีลำดับ โดยมีไอเดียหลักอยู่ที่การ “เข้าทีหลัง ออกก่อน” หรือ Last In First Out” (LIFO) ให้เรานึกถึงการวางของซ้อนกันขึ้นไปเรื่อยๆ เวลาที่เราจะหยิบของออกก็ต้องหยิบจากด้านบนหรือก็คือชิ้นที่วางไปหลังสุดเสมอ ส่วนชิ้นที่วางไปเป็นอันแรกจะอยู่ล่างสุด จะเอาออกมาได้ก็ตอนที่หยิบอันอื่นออกจนหมดเหลือเป็นอันสุดท้ายแล้วนั่นเอง
ในการเขียนโปรแกรมเราสามารถประยุกต์ใช้ Stack ได้หลากหลายสถานการณ์ อย่างเช่นใช้ในการเก็บประวัติการกรอกข้อมูลของผู้ใช้ ให้ผู้ใช้สามารถทำการ “Undo” กลับไปยังการกระทำก่อนหน้าได้ ลองดูโค้ดตัวอย่างด้านล่าง
# สร้างตัวแปรชื่อ stack มาเก็บข้อมูลการใช้งาน stack = [] # รับข้อมูลตัวแรกจากผู้ใช้ input_data = input('Enter Data: ') # วนลูปรับข้อมูลไปเรื่อยๆจนกว่าผู้ใช้พิมพ์มาว่า end while input_data != 'end': # ถ้าผู้ใช้สั่ง undo ก็ pop ข้อมูลออกจาก stack if input_data == 'undo': if len(stack) > 0: removed_data = stack.pop() print('Undo Action Remove:', removed_data) else: print('Stack Empty') # ถ้าไม่ใช่คำสั่ง undo ก็ใส่ข้อมูลที่ผู้ใช้กรอกเข้าไปใน stack ที่สร้างไว้ else: stack.append(input_data) print('Current Stack:', stack) input_data = input('Enter Data: ') # หลังจากได้รับคำสั่ง end ทำการ print ค่าใน stack ที่มีอยู่ออกมา print('Final Stack:', stack)
Output
Enter Data: 1 Current Stack: ['1'] Enter Data: 5 Current Stack: ['1', '5'] Enter Data: 2 Current Stack: ['1', '5', '2'] Enter Data: 3 Current Stack: ['1', '5', '2', '3'] Enter Data: 1 Current Stack: ['1', '5', '2', '3', '1'] Enter Data: undo Undo Action Remove: 1 Current Stack: ['1', '5', '2', '3'] Enter Data: undo Undo Action Remove: 3 Current Stack: ['1', '5', '2'] Enter Data: 4 Current Stack: ['1', '5', '2', '4'] Enter Data: end Final Stack: ['1', '5', '2', '4']
Queue
ตัวต่อมาที่จะยกตัวอย่างในครั้งนี้ก็คือ “Queue” หรือก็คือ “คิว” ที่เรารู้จักกันในการต่อคิว เข้าคิว อะไรแบบนั้น ซึ่งคิวนี้จะต่างกับ Stack ตรงที่คิวจะเป็นการ “เข้าก่อน ออกก่อน” หรือ “First In First Out” (FIFO) ก็คือตามคิวนั่นแหละ คนไปต่อคิวก่อนก็ต้องได้สิทธิ์ก่อนแน่นอนอยู่แล้ว
พอเราเอาเรื่อง Queue ไปเขียนโค้ด ก็จะช่วยให้เราสามารถจัดการข้อมูลที่ต้องการให้มันเป็นไปตามลำดับได้อย่างถูกต้อง สมมติว่าเราเขียนโปรแกรมจัดการคิวการขึ้นชิงช้าสวรรค์ ซึ่งคนที่มาเข้าคิวก่อนก็ต้องได้ขึ้นชิงช้าสวรรค์ก่อน เราจะเขียนโปรแกรมได้แบบโค้ดด้านล้างนี้
import random # สร้างตัวแปรชื่อ queue ไว้เก็บข้อมูลคนที่มาเข้าคิวขึ้นชิงช้าสวรรค์ queue = [] # คนที่จะมาเข้าคิว so_many_people = ['Faye', 'Fang', 'Kaew', 'Golf', 'Mike'] # สุ่มคนมาเข้าคิวในแถวทีละคนจนครบทุกคน enqueue_number = 1 for i in range(len(so_many_people)): someone = random.choice(so_many_people) print('Join a queue {}: {}'.format(enqueue_number, someone)) so_many_people.remove(someone) queue.append(someone) enqueue_number += 1 # เรียกคนมาขึ้นชิงช้าสวรรค์ตามคิว queue_number = 1 for i in range(len(queue)): print('Queue {}: {}'.format(queue_number, queue.pop(0))) queue_number += 1
Output
Join a queue 1: Mike Join a queue 1: Golf Join a queue 2: Faye Join a queue 3: Kaew Join a queue 4: Fang Join a queue 5: Mike Queue 1: Golf Queue 2: Faye Queue 3: Kaew Queue 4: Fang Queue 5: Mike
Set
อีกสักตัวกับรูปแบบข้อมูลที่มีประโยชน์มากๆเช่นกันนั่นก็คือ Set โดยเป็นลักษณะข้อมูลที่เก็บเอาไว้รวมกันแต่จะมีมีลำดับภายในกลุ่ม ไม่ว่าจะเก็บตัวไหนเข้าก่อนหรือหลังก็ไม่มีผลอะไร และอีกหนึ่งจุดเด่นของ Set ก็คือจะไม่สามารถเก็บข้อมูลที่ซ้ำกันเข้าไปได้ คุณสมบัติเหล่านี้ช่วยลดงาน ลดโค้ดที่เราต้องเขียนลงไปได้ในหลายๆกรณี
อย่างเช่นเราต้องการเขียนโค้ดรับข้อมูลที่ไม่ซ้ำกันจนครบจำนวน แล้วทำการสุ่มออกมาทีละตัวจนหมด ถ้าเราไม่ได้ใช้ Set ก็ต้องเขียนโค้ดเช็คทุกครั้งว่าข้อมูลที่รับเข้ามาใหม่นั้นซ้ำกับข้อมูลที่เคยรับมาแล้วรึเปล่า ก่อนจะเลือกว่าจะใส่หรือไม่ใส่เพิ่มเข้าไป และตอนที่จะสุ่มค่าออกมาก็อาจจะต้อง import random มาช่วยสุ่มค่าออกมาอีก แต่ถ้าเราใช้ Set ตั้งแต่ต้น เรื่องพวกนี้ก็จะง่ายมากๆแบบโค้ดด้านล่างนี้เลย
# สร้างตัวแปร my_set ไว้เก็บข้อมูล my_set = set() # กำหนดจำนวนข้อมูลไม่ซ้ำกันที่ต้องการ limit_size = 5 # รับข้อมูลจนกว่าจะได้ตัวไม่ซ้ำกันครบจำนวน while len(my_set) != limit_size: my_set.add(input('Enter Number: ')) # เนื่องจาก Set ไม่มีลำดับ ข้อมูลที่เรียกใช้จึงเป็นการสุ่มออกมา for num in my_set: print(num)
Output ครั้งที่ 1
Enter Number: 1 Enter Number: 1 Enter Number: 5 Enter Number: 4 Enter Number: 6 Enter Number: 4 Enter Number: 3 6 4 3 1 5
ถึงแม้เรารันโค้ดเดิม พร้อมใส่ input เรียงลำดับเหมือนเดิม ผลลัพธ์ที่ได้ก็จะเรียงไม่เหมือนกัน เพราะตอนที่เก็บข้อมูลใส่ใน Set ไม่มีการระบุลำดับ
Output ครั้งที่ 2
Enter Number: 1 Enter Number: 1 Enter Number: 5 Enter Number: 4 Enter Number: 6 Enter Number: 4 Enter Number: 3 6 1 3 5 4
สำหรับ Data Structure ถ้าเราเข้าใจเกี่ยวกับการใช้งานข้อมูลรูปแบบต่างๆ เวลาที่เราได้เขียนโปรแกรมจริงๆแล้วเลือกชนิดข้อมูลมาใช้อย่างเหมาะสม เราก็จะทำงานได้ง่ายขึ้นนั่นเองครับ