ไล่ตรวจทีละตัวจากซ้ายไปขวา
วน loop for ตั้งแต่ i = 0 ถึง i < values.length เปรียบเทียบค่าทีละตำแหน่ง
Searching
เรียนรู้ Linear Search ตั้งแต่แนวคิด ขั้นตอนการทำงาน โค้ด JavaScript ไปจนถึงการวิเคราะห์ Time/Space Complexity พร้อม playground สำหรับทดลองเขียน และแบบฝึกหัด 3 ข้อ
Linear Search (การค้นหาเชิงเส้น) คืออัลกอริทึมสำหรับค้นหาข้อมูลที่ง่ายที่สุด — เราไล่ตรวจสมาชิกในอาเรย์ทีละตัว จากตำแหน่งแรกไปตำแหน่งสุดท้าย จนกว่าจะเจอค่าที่ต้องการ หรือตรวจครบแล้วไม่เจอ
ข้อได้เปรียบที่สำคัญที่สุดของ Linear Search คือใช้ได้ทันทีแม้ข้อมูลยังไม่เรียงลำดับ — ไม่ต้องจัดเรียงก่อน ไม่ต้องเตรียมอะไรก่อน แค่มีอาเรย์กับค่าเป้าหมายก็เริ่มค้นหาได้เลย
ลองนึกภาพว่าเรามีรายชื่อนักเรียนเขียนบนกระดาษ และต้องหาชื่อใครสักคน — เราจะอ่านชื่อจากบรรทัดแรกลงไปทีละบรรทัดจนกว่าจะเจอชื่อนั้น หรืออ่านหมดทั้งหน้าแล้วยังไม่เจอ นี่คือแนวคิดเดียวกับ Linear Search
ไล่ตรวจจากซ้ายไปขวาทีละตำแหน่ง — เจอเมื่อไหร่หยุดเมื่อนั้น
ในโลกโค้ด เราก็ทำแบบเดียวกัน — ใช้ loop (เช่น for) วนเช็กค่าทีละ index จนกว่าค่าตรงกับเป้าหมาย
โครงคิดก่อนลงมือเขียนโค้ดจริง — วนตั้งแต่ตัวแรกถึงตัวสุดท้าย เจอเมื่อไหร่หยุดเมื่อนั้น
ฟังก์ชัน linearSearch(values, target):
สำหรับ i จาก 0 ถึง values.length - 1:
ถ้า values[i] เท่ากับ target:
คืนค่า i
คืนค่า -1หัวใจมีแค่นี้: loop + if + return ถ้าเข้าใจ loop for และการเปรียบเทียบค่า คุณก็เขียน Linear Search ได้แล้ว
ฟังก์ชันที่คืน index เมื่อเจอ target และคืน -1 เมื่อไม่เจอ
function linearSearch(values, target) {
for (let i = 0; i < values.length; i += 1) {
if (values[i] === target) {
return i;
}
}
return -1;
}
// ตัวอย่างการใช้งาน
const numbers = [4, 9, 2, 7, 5];
console.log(linearSearch(numbers, 7)); // 3 (พบ 7 ที่ index 3)
console.log(linearSearch(numbers, 4)); // 0 (พบที่ index แรก)
console.log(linearSearch(numbers, 8)); // -1 (ไม่มี 8 ในอาเรย์)
console.log(linearSearch([], 3)); // -1 (อาเรย์ว่าง ตรวจอะไรไม่ได้)อธิบายทีละส่วน: • `for (let i = 0; i < values.length; i++)` — วน loop ตั้งแต่ index 0 จนถึงตัวสุดท้าย • `if (values[i] === target)` — เปรียบเทียบค่าที่ตำแหน่งปัจจุบันกับค่าเป้าหมาย • `return i` — เจอแล้วหยุดทันที คืน index ที่เจอ • `return -1` — หลุดจาก loop แสดงว่าตรวจครบแล้วไม่เจอ จึงคืน -1 Edge cases ที่โค้ดจัดการให้: • อาเรย์ว่าง (length = 0) → for loop ไม่รันเลย → return -1 • เจอที่ index แรก → return ทันที (Best Case O(1)) • target ปรากฏหลายครั้ง → คืน index แรกสุดที่เจอ
พื้นที่หน่วยความจำ (Space Complexity) = O(1) — ฟังก์ชันแบบ iterative ใช้ตัวแปรเพิ่มแค่ `i` เท่านั้น ไม่ต้องสร้างโครงสร้างข้อมูลใหม่
| n (ขนาดอาเรย์) | Worst Case (รอบ) | เปรียบเทียบ |
|---|---|---|
| 10 | 10 | 10 รอบ |
| 1,000 | 1,000 | 1,000 รอบ |
| 1,000,000 | 1,000,000 | 1 ล้านรอบ — ช้ามาก! |
| ข้อดี | ข้อเสีย | กรณีที่เหมาะสม |
|---|---|---|
| ไม่ต้องเรียงข้อมูลก่อน | ช้าเมื่อข้อมูลมีขนาดใหญ่ (O(n)) | ข้อมูลยังไม่เรียง และไม่อยากเสียเวลาจัดเรียง |
| เขียนง่ายมาก เข้าใจได้ใน 5 นาที | ค้นหาบ่อย ๆ กับข้อมูลใหญ่ ต้นทุนรวมสูง | จำนวนข้อมูลไม่มาก (< 100 ตัว) |
| ใช้หน่วยความจำเพิ่มน้อย (O(1)) | มีวิธีที่เร็วกว่าถ้าข้อมูลเรียงแล้ว (Binary Search) | ค้นหาไม่ถี่มาก |
รู้ไว้ก่อน: Binary Search ต้องการข้อมูลที่เรียงแล้ว
ถ้าข้อมูลเรียงลำดับแล้ว Binary Search จะเร็วกว่า Linear Search มาก — O(log n) vs O(n) แต่ต้องลงทุนเรียงข้อมูลก่อนเสมอ
| หัวข้อ | Linear Search | Binary Search |
|---|---|---|
| ต้องเรียงข้อมูลก่อนหรือไม่ | ไม่จำเป็น | จำเป็น |
| แนวคิดหลัก | ไล่ทีละตำแหน่ง | ตัดครึ่งช่วงค้นหา |
| Best Time | O(1) | O(1) |
| Average Time | O(n) | O(log n) |
| Worst Time | O(n) | O(log n) |
| Space | O(1) | O(1) |
| ตัวอย่าง n = 1,000,000 | อาจเช็กได้ถึง 1,000,000 ครั้ง | ประมาณ 20 ครั้ง |
หัวใจสำคัญที่ต้องจำให้ขึ้นใจ
วน loop for ตั้งแต่ i = 0 ถึง i < values.length เปรียบเทียบค่าทีละตำแหน่ง
คำสั่ง return ใน loop จะหยุดการทำงานทันที — ไม่ต้องตรวจตัวที่เหลือต่อ
หลังจากหลุดจาก loop แสดงว่าตรวจครบทุกตัวแล้วไม่เจอ ให้คืน -1 เพื่อบอกว่าไม่พบข้อมูล
จุดเด่นที่สุดของ Linear Search — ไม่ต้องเรียงก่อน ใช้ได้ทันที ต่างจาก Binary Search ที่ต้องเรียงก่อนเสมอ
O(n) ใน Worst Case — ถ้า n = 1,000,000 และต้องค้นหาวันละหลายพันครั้ง ควรเรียงข้อมูลแล้วใช้ Binary Search แทน
ทดสอบความเข้าใจก่อนเริ่มทำแบบฝึกหัด
คิดถึงจุดเด่นของ Linear Search — ใช้ได้กับอาเรย์ทุกรูปแบบ
แบบฝึกหัด 3 ข้อนี้จะช่วยให้คุณเขียน Linear Search ได้คล่อง — เริ่มจากการคืน index แบบพื้นฐาน ไปจนถึงการคืนทุกตำแหน่งที่พบ