Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

Fisher–Yates สับเปลี่ยนใน JavaScript คืออะไร


อัลกอริธึมสับเปลี่ยนฟิชเชอร์-เยทส์

อัลกอริทึมนี้คือการสับเปลี่ยนองค์ประกอบในอาร์เรย์ ในการสับเปลี่ยนองค์ประกอบในอาร์เรย์ เราสามารถเขียนตรรกะของเราเองได้ แต่นักพัฒนาหลายคนคิดว่า F อิชเชอร์-เยทส์ อัลกอริทึมการสับเปลี่ยนสมัยใหม่เป็นวิธีที่ดีที่สุดในการสับเปลี่ยนองค์ประกอบในอาร์เรย์ อัลกอริทึมนี้มีขั้นตอนดังต่อไปนี้

ขั้นตอนที่ต้องปฏิบัติตาม

  • ตามอัลกอริธึมนี้ เราควรวนรอบอาร์เรย์จากหลังมาข้างหน้า ตัวอย่างเช่น ในตัวอย่างต่อไปนี้ เรามีอาร์เรย์ที่ประกอบด้วย 8 องค์ประกอบ (A,B,C,D,E,F,G,H) จากดัชนี 0 ถึงดัชนี 7 ดังนั้นการวนรอบแรกจะส่งผลต่อองค์ประกอบที่ ดัชนีสุดท้าย 7 นั่นคือ H.
  • ขั้นตอนต่อไปคือการสร้างตัวเลขสุ่ม (ดัชนีสุ่ม) ระหว่างดัชนีที่เลือก 7 และดัชนี 0 สำหรับสมมติว่าดัชนีสุ่มเป็น 3
  • หลังจากได้รับดัชนีสุ่มสลับองค์ประกอบที่อยู่ในดัชนีที่เลือกและที่ดัชนีสุ่ม องค์ประกอบที่ดัชนีสุ่มในอาร์เรย์ที่ระบุคือ D ดังนั้นหลังจากสลับอาร์เรย์แล้ว อาร์เรย์จะเปลี่ยนเป็น A,B,C ,H,E,G,F,D
  • ในการวนรอบที่สองให้ละเว้นดัชนีสุดท้าย (เนื่องจากวนซ้ำแล้ว) และพยายามค้นหาดัชนีสุ่มระหว่างดัชนี 0 และดัชนี 6 ที่อยู่ระหว่างองค์ประกอบ A และ F ปล่อยให้ดัชนีสุ่มที่สร้างขึ้นเป็น 2
  • หลังจากได้รับดัชนีสุ่มแล้ว ให้สลับองค์ประกอบที่ดัชนีที่ 6 และ 2 ตอนนี้อาร์เรย์จะมีลักษณะเป็น A,B,F,H,E,G,C,D
  • อัลกอริธึมนี้ใช้รูปแบบเดียวกับที่ไม่สนใจดัชนี 6 และเริ่มค้นหาดัชนีสุ่มระหว่างดัชนี 5 และดัชนี 0 เป็นต้น จนกว่าจะถึงดัชนี 1 ไม่สามารถใช้ดัชนี 0 วนซ้ำได้เนื่องจากไม่มีดัชนี น้อยกว่า 0 เพื่อวัตถุประสงค์ในการแลกเปลี่ยน
  • โปรดทราบว่ามีความเป็นไปได้ที่จะสร้างดัชนีสุ่มเลือกดัชนีวนรอบ ตัวอย่างเช่น ให้ลูปทำงานระหว่างดัชนี 4 และดัชนี 0 ที่เลือก ปล่อยให้ดัชนีสุ่มสร้างเป็น 4 จากนั้นค่าที่ดัชนี 4 จะยังคงอยู่ที่ตำแหน่งเดิม

ตัวอย่างต่อไปนี้แสดงให้เห็นถึง ฟิชเชอร์-เยทส์ อัลกอริธึมสับเปลี่ยนที่ทันสมัย

ตัวอย่าง

<html>
<body>
<script>
   var arr = ['A','B','C','D','E','F','G','H']
   var i = arr.length, k , temp;      // k is to generate random index and temp is to swap the values
   while(--i > 0){
      k = Math.floor(Math.random() * (i+1));
      temp = arr[k];
      arr[k] = arr[i];
      arr[i] = temp;
   }
   document.write(arr);
</script>
</body>
</html>

ผลลัพธ์

C,F,H,D,A,G,E,B  // note that output will change for every iteration.