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 ถ้าเราเข้าใจเกี่ยวกับการใช้งานข้อมูลรูปแบบต่างๆ เวลาที่เราได้เขียนโปรแกรมจริงๆแล้วเลือกชนิดข้อมูลมาใช้อย่างเหมาะสม เราก็จะทำงานได้ง่ายขึ้นนั่นเองครับ