เกินกำลังไปเต็มๆ วิธีการแจงนับในปัญหาการค้นหา
ปัญหาหลายมิติโดยธรรมชาติแล้วจะซับซ้อนและใช้เวลานานกว่าปัญหาในมิติเดียว และความยากลำบากในการแก้ปัญหามักจะเพิ่มขึ้นตามมิติที่เพิ่มขึ้น เพื่อให้คุณรู้สึกดีขึ้น เรามาใช้วิธีการประมาณค่าที่ง่ายที่สุดในแนวคิดเพื่อหาค่าที่น้อยที่สุดของฟังก์ชันกันดีกว่า มาครอบคลุมพื้นที่ที่พิจารณาด้วยตาราง G ด้วยขั้นตอน h (รูปที่ 10.8) และกำหนดค่าของฟังก์ชันที่โหนด เมื่อเปรียบเทียบตัวเลขที่ได้รับเราจะหาค่าที่เล็กที่สุดและถือว่าเป็นค่าที่น้อยที่สุดของฟังก์ชันสำหรับทั้งภูมิภาคโดยประมาณ
ข้าว. 10.8.
ดังที่เราได้กล่าวไว้ข้างต้น วิธีนี้ใช้ในการแก้ปัญหามิติเดียว บางครั้งก็ใช้เพื่อแก้ปัญหาสองมิติและปัญหาสามมิติที่ไม่ค่อยพบบ่อยนัก อย่างไรก็ตาม สำหรับปัญหาที่มีขนาดใหญ่กว่านั้นถือว่าไม่เหมาะสมในทางปฏิบัติ เนื่องจากเวลาที่ต้องใช้ในการคำนวณนานเกินไป อันที่จริง สมมติว่าฟังก์ชันวัตถุประสงค์ขึ้นอยู่กับตัวแปร 5 ตัว และโดเมนของคำจำกัดความ G คือลูกบาศก์ห้ามิติ ซึ่งแต่ละด้านเมื่อสร้างตารางเราจะแบ่งออกเป็น 40 ส่วน จากนั้นจำนวนโหนดกริดทั้งหมดจะเท่ากับ ให้การคำนวณค่าของฟังก์ชัน ณ จุดหนึ่งต้องใช้การดำเนินการทางคณิตศาสตร์ 1,000 ครั้ง (ซึ่งถือว่าไม่มากสำหรับฟังก์ชันของตัวแปร 5 ตัว) ในกรณีนี้จำนวนการดำเนินการทั้งหมดจะเป็น 10 11 หากเรามีคอมพิวเตอร์ที่มีความเร็ว 1 ล้านการทำงานต่อวินาทีการแก้ปัญหาโดยใช้วิธีนี้จะต้องใช้เวลา 10 5 วินาทีซึ่งเกินหนึ่งวันของการทำงานต่อเนื่อง การเพิ่มตัวแปรอิสระตัวอื่นจะเพิ่มเวลานี้ 40 เท่า การประเมินแสดงให้เห็นว่าวิธีการค้นหาแบบละเอียดถี่ถ้วนไม่เหมาะสำหรับปัญหาการปรับให้เหมาะสมที่มีขนาดใหญ่ บางครั้งการค้นหาแบบละเอียดจะถูกแทนที่ด้วยการค้นหาแบบสุ่ม ในกรณีนี้ จุดกริดจะไม่ถูกดูเป็นแถว แต่จะเรียงลำดับแบบสุ่ม เป็นผลให้การค้นหาค่าที่เล็กที่สุดของฟังก์ชันวัตถุประสงค์นั้นเร็วขึ้นอย่างมาก แต่สูญเสียความน่าเชื่อถือ
4. วิธีประสานการสืบเชื้อสาย
ลองพิจารณาฟังก์ชันของตัวแปรสองตัวกัน เส้นระดับคงที่แสดงไว้ในรูปที่ 1 10.9 และค่าต่ำสุดอยู่ที่จุดนั้น (โปรดจำไว้ว่าเส้นระดับคงที่คือเส้นโค้งในส่วนสองมิติของพื้นที่พารามิเตอร์ (ในกรณีนี้ในระนาบ (x1, x2) ซึ่งเป็นค่าของฟังก์ชันที่เป็นค่าคงที่) การค้นหาที่ง่ายที่สุด วิธีการคือ ประสานวิธีการสืบเชื้อสาย- จากจุด A เราค้นหาค่าต่ำสุดตามทิศทางของแกน x1 และหาจุด Bat ซึ่งเส้นสัมผัสของเส้นระดับคงที่นั้นขนานกับแกน x1 จากนั้น เมื่อค้นหาจากจุด B ในทิศทางของแกน x2 เราจะได้จุด C ค้นหาแบบขนานกับแกน x1 เราได้จุด D เป็นต้น ดังนั้นเราจึงมาถึงจุดที่เหมาะสมที่สุด วิธีการหนึ่งมิติใดๆ ที่อธิบายไว้ในบทที่แล้วสามารถใช้ที่นี่เพื่อค้นหาตามแกน แน่นอนว่าแนวคิดนี้สามารถนำไปใช้กับฟังก์ชันของตัวแปร n ตัวได้
ข้าว. 10.9.
ลองพิจารณาวิธีนี้โดยละเอียดโดยใช้ตัวอย่างของฟังก์ชันเป้าหมายบางอย่าง
ให้คุณต้องค้นหาค่าที่เล็กที่สุดของฟังก์ชันวัตถุประสงค์ u=f(M)=f(x 1 ,x 2 ,...,x n) โดยที่ M หมายถึงจุดในพื้นที่ n มิติพร้อมพิกัด x 1 ,x 2 ,...,x n:M=(x 1 ,x 2 ,...,x n)- ลองเลือกจุดเริ่มต้นแล้วพิจารณาฟังก์ชัน f สำหรับค่าคงที่ของตัวแปรทั้งหมดยกเว้นตัวแรก: - จากนั้นจะกลายเป็นฟังก์ชันของตัวแปรตัวเดียว x 1 โดยการเปลี่ยนตัวแปรนี้ เราจะย้ายจากจุดเริ่มต้นไปในทิศทางของฟังก์ชันที่ลดลงจนกระทั่งถึงจุดต่ำสุดที่ หลังจากนั้นจะเริ่มเพิ่มขึ้น เราแสดงจุดด้วยพิกัดด้วย M 1 และ .
ตอนนี้ให้เราแก้ไขตัวแปรกัน: และพิจารณาฟังก์ชัน f เป็นฟังก์ชันของตัวแปรตัวหนึ่ง โดยการเปลี่ยน x 2 เราจะย้ายจากค่าเริ่มต้นไปสู่การลดลงของฟังก์ชันอีกครั้งจนกระทั่งถึงค่าต่ำสุดที่ เราแสดงจุดด้วยพิกัดด้วย M 2 และ - ขอให้เราดำเนินการย่อเล็กสุดของฟังก์ชันวัตถุประสงค์ให้เหลือน้อยที่สุดเหนือตัวแปร x 3 , x 4 ,...,x n . เมื่อถึงตัวแปร xn แล้ว ให้กลับไปที่ x 1 อีกครั้งแล้วดำเนินการต่อไป
ขั้นตอนนี้จะปรับชื่อของวิธีการอย่างสมบูรณ์ ด้วยความช่วยเหลือเราจะสร้างลำดับของจุด M 0 , M 1 , M 2 ,... . ซึ่งลำดับโมโนโทนิกของค่าฟังก์ชันสอดคล้องกัน โดยการยกเลิกที่ขั้นตอนหนึ่ง k เราสามารถนำค่าของฟังก์ชัน f(M k) มาเป็นค่าที่น้อยที่สุดในภูมิภาคที่พิจารณา (รูปที่ 10.10) .
โปรดทราบว่าวิธีนี้ช่วยลดปัญหาในการค้นหาค่าที่น้อยที่สุดของฟังก์ชันของตัวแปรหลายตัว เพื่อแก้ปัญหาการหาค่าเหมาะที่สุดมิติเดียวซ้ำๆ หากฟังก์ชันวัตถุประสงค์ f(x 1 ,x 2 ,\ldots,x n กำหนดไว้โดยสูตรที่ชัดเจนและสามารถหาอนุพันธ์ได้ เราก็สามารถคำนวณอนุพันธ์ย่อยของมันและใช้มันเพื่อกำหนดทิศทางการลดลงของฟังก์ชันในแต่ละตัวแปรและค้นหา สำหรับค่าต่ำสุดหนึ่งมิติที่สอดคล้องกัน
ในรูป 10.10. แสดงเส้นระดับของฟังก์ชันหนึ่งของตัวแปรสองตัว u=f(x,y) ตามบรรทัดเหล่านี้ฟังก์ชันจะรักษาค่าคงที่เท่ากับ 1, 3, 5, 7, 9 วิถีการค้นหาค่าที่น้อยที่สุดซึ่งทำได้ที่จุด O จะแสดงโดยใช้
วิธีเดรัจฉานเป็นวิธีที่ง่ายที่สุดในการแก้ปัญหาใดๆ วิธีเดียวที่ง่ายกว่าน่าจะเป็นวิธีการเลือก หากคุณไม่สามารถเลือกคำตอบได้ทันที (โดยไม่ได้ตั้งใจ) และมีปัญหาที่ไม่ทราบมากกว่าเงื่อนไขที่กำหนด ดังนั้นวิธีการค้นหาอย่างละเอียดถี่ถ้วนก็เหมาะสมแล้ว แน่นอน ขั้นแรก คุณต้องตรวจสอบให้แน่ใจว่าตัวเลือกโซลูชันอื่นๆ ทั้งหมดไม่เหมาะสม และมีการกำหนดเงื่อนไขที่ชัดเจนและโดยนัยทั้งหมดเพื่อจำกัดชุดค่าผสมที่กำลังลองใช้ มิฉะนั้น เวลาที่ใช้ในการลองใช้ตัวเลือกที่เป็นไปได้ทั้งหมดจะหมดเวลา
เรามาดูตัวอย่างการใช้วิธีกำลังเดรัจฉานในการแก้ปัญหาต่างๆ กัน
ค้นหาลำดับ
สมมติว่าเราเจอลำดับตัวเลข 141526418 และเรารู้ว่าคำบางคำถูกเข้ารหัสด้วยตัวอักษรละติน วิธีที่ง่ายที่สุดในการเข้ารหัสคำคืออะไร? แน่นอนใช้รหัสทดแทน! จำนวนหลักเป็นเลขคี่ ซึ่งหมายความว่ามีการเข้ารหัสตัวอักษรอย่างน้อยหนึ่งตัวด้วยตัวเลขเพียงหลักเดียว แต่จะแยกตัวอักษรสิบตัวแรกออกจากตัวถัดไปที่เข้ารหัสด้วยตัวเลขสองหลักได้อย่างไร? 14 AD หรือ N? นี่คือจุดที่วิธีกำลังเดรัจฉานมีประโยชน์ มาดูการผสมตัวเลขหนึ่งหรือสองหลักจากช่วงกัน
ในลำดับ 141526418 เราสามารถแยกแยะชุดค่าผสมต่อไปนี้ที่ตรงตามเงื่อนไขของเรา: 1,2,4,5,6,8,14,15,18,26 ตัวเลขเหล่านี้สอดคล้องกับตัวอักษร A,B,D,E,F,H,N,O,R,Z ชุดค่าผสม 41, 52 และ 64 ไม่เหมาะสำหรับเราเนื่องจากอักษรละตินมีเพียง 26 ตัวเท่านั้น
เราจะเรียงลำดับดังนี้ อันดับแรก เราจะนำลำดับที่ขยายมากที่สุด โดยที่ตัวอักษรทั้งหมดมาจากสิบตัวแรก จากนั้นเราจะเพิ่มจำนวนที่ใช้ทีละตัว นั่นคือแทนที่ลำดับ 1-4 ด้วย 14 , 1-5 กับ 15, 1-8 กับ 18, 2- 6 คูณ 26 ผ่านชุดค่าผสมที่เป็นไปได้ทั้งหมด
1-4-1-5-2-6-4-1-8 = อดาบีฟดาห์
1-4-1-5-2-6-4-18 = ADAEBFDR
1-4-1-5-26-4-1-8 = อดีซดาห์
1-4-1-5-26-4-18 = อดาเอซดีอาร์
1-4-15-2-6-4-1-8 = ADOBFDAH
1-4-15-2-6-4-18 = ADOBFDR
1-4-15-26-4-1-8 = อดอซดาห์
1-4-15-26-4-18 = ADOZDR
14-1-5-2-6-4-1-8 = แน็บฟดาห์
14-1-5-2-6-4-18 = NAEBFDR
14-1-5-26-4-1-8 = นาเอซดาห์
14-1-5-26-4-18 = เอ็นเอซดีอาร์
14-15-2-6-4-1-8 = NOBFDAH
14-15-2-6-4-18 = NOBFDR
14-15-26-4-1-8 = นอซดาห์
14-15-26-4-18 = นอซดีอาร์
โดยรวมแล้วเราได้รับ 16 ตัวเลือก คำเดียวที่อ่านได้ NOZDR (บางคนอ่านได้แต่บางคนอ่านไม่ได้) อยู่ตอนท้ายสุด นี่จะเป็นคำตอบ ตอนนี้หากในตอนแรกมีคำใบ้ว่าลำดับ 141526418 ควรมีตัวอักษร 5 ตัวแสดงว่าปัญหาจะได้รับการแก้ไขอย่างไม่น่าสงสัย และไม่จำเป็นต้องใช้กำลังดุร้ายเพราะมีเพียงวิธีเดียวเท่านั้นที่จะแยกลำดับ 141526418 ออกเป็น 5 ตัวอักษร แต่ไม่มีคำใบ้เช่นนั้น และวิธีการใช้กำลังดุร้ายก็มีประโยชน์
การแจงนับวิธีแก้ปัญหาเมื่อมีเงื่อนไขไม่เพียงพอ
บางครั้งในวิชาคณิตศาสตร์ก็มีปัญหาที่ดูเหมือนเป็นไปไม่ได้ที่จะแก้ไขแบบเผชิญหน้า ปัญหาดังกล่าวมักจะได้รับการแก้ไขที่การแข่งขันกีฬาโอลิมปิกและการแข่งขัน ซึ่งหมายความว่าเหมาะสำหรับเราสำหรับภารกิจ ตัวอย่างเช่น นี่คือปัญหา
ในระหว่างบทเรียนคณิตศาสตร์ ครูถามนักเรียนเกี่ยวกับปัญหาต่อไปนี้ “แม่มีลูกสาวสามคน ผลคูณของอายุของลูกสาว = 40 ผลรวมของอายุเท่ากับจำนวนนักเรียนในชั้นเรียน ลูกสาวแต่ละคนอายุเท่าไหร่?”นักเรียนคำนวณอย่างรวดเร็วว่ามีกี่คนในชั้นเรียนและเริ่มแก้ไขปัญหา พวกเขาตัดสินใจแล้วตัดสินใจ... ตัดสินใจไม่ได้ เราขอคำใบ้จากอาจารย์ ครูคิดแล้วพูดว่า: “โอ้แม่นเลย! น้องคนสุดท้องมีตาสีฟ้า!”- นักเรียนมีความสุขและแก้ไขปัญหาได้ และตอนนี้คำถามสำหรับคุณ: ลูกสาวแต่ละคนอายุเท่าไหร่?
หากคุณแก้ปัญหาแบบตรงหน้า (AxBxC=40, A+B+C=D, ดวงตาสีฟ้าเล็กๆ) คุณจะพบกับสิ่งที่ไม่ทราบจำนวนมากและการขาดเงื่อนไขทันที 4 สิ่งลึกลับ สองสมการ และแม้แต่ดวงตาสีฟ้าเล็กๆ น้อยๆ!!! ดังที่คุณทราบ มีสิ่งแปลกปลอมมากมายเท่าที่ต้องมี ก็ต้องมีเงื่อนไขที่เป็นอิสระมากมาย ในปัญหาของเรา เรามีเงื่อนไขปกติสองเงื่อนไขและเงื่อนไขหนึ่งที่เข้าใจยาก วิธีแก้ปัญหา?
และด้วยกำลังอันดุร้าย! ประการแรก ปัญหาดังกล่าวได้รับการแก้ไขเป็นจำนวนเต็มตามค่าเริ่มต้น ลองหาชุดค่าผสมของจำนวนเต็มสามจำนวนทั้งหมด ซึ่งผลคูณที่ได้ให้ 40 ในเวลาเดียวกัน ลองคำนวณผลรวมของตัวเลขเหล่านี้ ปรากฎว่ามีชุดค่าผสมดังกล่าวไม่มากนัก - มีเพียงหกชุดเท่านั้น
1x1x40=40, 1+1+40=42
1x2x20=40, 1+2+20=23
1x4x10=40, 1+4+10=15
1x5x8=40, 1+5+8= 14
2x2x10=40, 2+2+10= 14
2x4x5=40, 2+4+5=11
หากมีนักเรียนในชั้นเรียน 42, 23, 15 หรือ 11 คน พวกเขาจะแก้ไขปัญหาทันที แต่พวกเขาประสบปัญหา - มี 14 คนและพวกเขาไม่สามารถเลือกตัวเลือก 1-5-8 หรือ 2-2-10 ใดที่เหมาะสมได้ แต่เมื่อครูพูดถึงเรื่องตาสีฟ้าก็ช่วยให้พวกเขาตัดสินใจได้ คนสุดท้องมีตาสีฟ้าคือมีลูกสาวคนเล็กและในรุ่น 2-2-10 มีลูกสาวคนเล็กสองคน ซึ่งหมายความว่ามีเพียงตัวเลือกที่สี่ 1-5-8 เท่านั้นที่เหมาะกับเรา
ดูเหมือนจะเป็นปัญหาที่แก้ไขไม่ได้ในทางปฏิบัติ แต่วิธีกำลังดุร้ายทำให้สามารถแก้ไขได้อย่างรวดเร็ว ดังนั้นคุณจึงไม่ควรกลัวที่จะแก้ไขปัญหาโดยใช้กำลังอันดุร้าย บ่อยครั้งที่จำนวนตัวเลือกที่เป็นไปได้นั้นไม่มากเท่าที่ควรในตอนแรก
ในส่วนนี้เราจะดูปัญหาบางอย่างที่เกี่ยวข้องกับปัญหาการดึงข้อมูล นี่เป็นปัญหาระดับใหญ่ซึ่งอธิบายไว้อย่างละเอียดเพียงพอในวรรณกรรมคลาสสิกเกี่ยวกับการเขียนโปรแกรม (ดูตัวอย่างในหนังสือของ N. Wirth, D. Knuth และอื่น ๆ )
ความหมายทั่วไปของงานค้นหามีดังนี้: จากข้อมูลที่จัดเก็บไว้ในหน่วยความจำคอมพิวเตอร์ ให้เลือกข้อมูลที่จำเป็นที่ตรงตามเงื่อนไข (เกณฑ์) บางประการ
เราได้พิจารณาปัญหาที่คล้ายกันแล้ว ตัวอย่างเช่น การค้นหาจำนวนสูงสุดในอาร์เรย์ตัวเลข การค้นหาบันทึกที่ต้องการในไฟล์ข้อมูล ฯลฯ การค้นหาดังกล่าวดำเนินการโดยการแจกแจงองค์ประกอบทั้งหมดของโครงสร้างข้อมูล และตรวจสอบความพึงพอใจของเงื่อนไขการค้นหา การแจงนับที่มีการตรวจสอบองค์ประกอบทั้งหมดของโครงสร้างเรียกว่าการแจงนับที่สมบูรณ์
การค้นหาแบบละเอียดเป็นวิธีการค้นหาแบบใช้กำลังและแน่นอนว่าไม่ใช่วิธีที่ดีที่สุดเสมอไป
ลองดูตัวอย่าง ในอาร์เรย์ X หนึ่งมิติ พิกัดของจุด n จุดที่วางอยู่บนแกนจำนวนจริงจะได้รับ คะแนนมีเลขกำกับ ตัวเลขเหล่านี้สอดคล้องกับลำดับในอาร์เรย์ X กำหนดจำนวนของจุดแรกที่อยู่ห่างจากจุดเริ่มต้นมากที่สุด
เป็นเรื่องง่ายที่จะเข้าใจว่านี่เป็นปัญหาที่คุ้นเคยในการกำหนดจำนวนขององค์ประกอบโมดูโลที่ใหญ่ที่สุดของอาร์เรย์ X ซึ่งแก้ไขได้โดยการค้นหาอย่างละเอียดดังนี้:
การแจกแจงองค์ประกอบของอาร์เรย์หนึ่งมิติที่สมบูรณ์จะดำเนินการโดยใช้โครงสร้างแบบวนเดียว
และตอนนี้งานต่อไปนี้: ข้อมูลเริ่มต้นเหมือนกับข้อมูลก่อนหน้า คุณต้องกำหนดจุดคู่ที่มีระยะห่างระหว่างจุดเหล่านั้นมากที่สุด
เมื่อใช้วิธีการแจงนับ ปัญหานี้สามารถแก้ไขได้ดังนี้ แจกแจงจุดทั้งหมดจาก Ladanny และกำหนดจำนวนของจุดที่มีระยะห่างระหว่างจุดเหล่านั้นมากที่สุด (โมดูลัสที่ใหญ่ที่สุดของความแตกต่างของพิกัด) การค้นหาอย่างละเอียดนี้ดำเนินการผ่านสองลูปที่ซ้อนกัน:
เห็นได้ชัดว่าการแก้ปัญหาดังกล่าวไม่สมเหตุสมผล ในที่นี้แต่ละจุดจะถูกตรวจสอบสองครั้ง ตัวอย่างเช่น สำหรับ i = 1, j = 2 และ i = 2, j= 1 สำหรับกรณี n = 100 ลูปจะทำซ้ำการดำเนินการ 100 x 100 = 10,000 ครั้ง
การทำงานของโปรแกรมจะเร็วขึ้นหากไม่มีการทำซ้ำ ควรยกเว้นกรณีของความบังเอิญของค่า i และ j ด้วย จากนั้นจำนวนการวนซ้ำจะเท่ากับ
เมื่อ n = 100 ผลลัพธ์คือ 4950
เพื่อกำจัดการซ้ำซ้อน คุณต้องเปลี่ยนจุดเริ่มต้นของวงในจาก 1 เป็น i +1 ในโปรแกรมก่อนหน้า โปรแกรมจะมีลักษณะดังนี้:
เราจะเรียกอัลกอริธึมกำลังเดรัจฉานเวอร์ชันที่พิจารณาโดยไม่ต้องทำซ้ำ
ความคิดเห็น แน่นอนว่าปัญหานี้สามารถแก้ไขได้ด้วยวิธีอื่น แต่ในกรณีนี้ เราสนใจอัลกอริธึมแบบ brute-force ในกรณีของจุดที่ไม่ได้อยู่บนเส้นตรง แต่บนเครื่องบินหรือในอวกาศ การค้นหาทางเลือกอื่นแทนอัลกอริธึมดังกล่าวจะกลายเป็นปัญหามาก
ปัญหาต่อไปนี้จำเป็นต้องเลือกตัวเลขแฝดทั้งหมดโดยไม่มีการซ้ำซึ่งผลรวมเป็น 10 จากอาร์เรย์ X
ในกรณีนี้ อัลกอริธึมจะถูกสร้างขึ้นจากสามลูปที่ซ้อนกัน ห่วงด้านในมีความยาวผันแปรได้
สำหรับฉัน:=l ถึง N ทำ
สำหรับ J:=I+1 ถึง N Do
สำหรับ K:=J+1 ถึง N Do
ถ้า X[I]+X[J]+X[K]=10
จากนั้น WriteLn(X[I],X[J],X[K]);
ทีนี้ลองจินตนาการว่าจากอาร์เรย์ X คุณต้องเลือกกลุ่มตัวเลขทั้งหมดที่มีผลรวมเท่ากับสิบ กลุ่มสามารถมีตัวเลขได้ตั้งแต่ 1 ถึง n ในกรณีนี้จำนวนตัวเลือกการค้นหาจะเพิ่มขึ้นอย่างรวดเร็วและอัลกอริทึมเองก็กลายเป็นเรื่องไม่สำคัญ
ดูเหมือนว่าจะแล้วไงล่ะ? เครื่องทำงานเร็ว! และยังมานับกัน จำนวนกลุ่มที่แตกต่างกันของวัตถุ n อัน (รวมถึงวัตถุว่างด้วย) คือ 2n สำหรับ n = 100 จะเป็น 2100 ‐ 1,030 คอมพิวเตอร์ที่ทำงานด้วยความเร็วพันล้านการดำเนินการต่อวินาทีจะดำเนินการค้นหานี้เป็นเวลาประมาณ 10 ปี แม้แต่การกำจัดการเรียงสับเปลี่ยนซ้ำก็ไม่ทำให้อัลกอริธึมการค้นหาที่ละเอียดถี่ถ้วนดังกล่าวเป็นไปได้ในทางปฏิบัติ
เส้นทางสู่การแก้ไขปัญหาดังกล่าวในทางปฏิบัติคือการหาวิธีแยกออกจากตัวเลือกการค้นหาที่ไม่มีท่าว่าจะดีจากมุมมองของเงื่อนไขของปัญหา สำหรับปัญหาบางอย่าง สามารถทำได้โดยใช้อัลกอริทึมที่อธิบายไว้ในส่วนถัดไป
เกินกำลังกับผลตอบแทน ลองพิจารณาอัลกอริธึมการย้อนรอยโดยใช้ตัวอย่างปัญหาการผ่านเขาวงกต (รูปที่ 52)
มีเขาวงกต เมื่อเข้าไปข้างในแล้วคุณจะต้องหาทางออก คุณสามารถเคลื่อนที่ได้เฉพาะในแนวนอนและแนวตั้งเท่านั้น รูปนี้แสดงตัวเลือกทั้งหมดสำหรับเส้นทางออกจากจุดศูนย์กลางของเขาวงกต
หากต้องการรับโปรแกรมสำหรับแก้ไขปัญหานี้ คุณต้องแก้ไขปัญหาสองข้อ:
วิธีจัดระเบียบข้อมูล
วิธีสร้างอัลกอริทึม
เราจะจัดเก็บข้อมูลเกี่ยวกับรูปร่างของเขาวงกตไว้ใน LAB เมทริกซ์จัตุรัสประเภทสัญลักษณ์ขนาด N x N โดยที่ N เป็นเลขคี่ (เพื่อให้มีจุดศูนย์กลาง) ตารางถูกซ้อนทับบนโปรไฟล์ของเขาวงกตเพื่อให้ในแต่ละเซลล์มีทั้งผนังหรือทางเดิน
เมทริกซ์สะท้อนถึงการเติมตาราง: องค์ประกอบที่สอดคล้องกับเนื้อเรื่องเท่ากับช่องว่าง และผนังเท่ากับสัญลักษณ์บางอย่าง (เช่น ตัวอักษร M)
เส้นทางผ่านเขาวงกตจะมีเครื่องหมาย + กำกับไว้
ตัวอย่างเช่น รูปด้านบน (ตรงกลาง) สอดคล้องกับความสมบูรณ์ของเมทริกซ์ LAB ต่อไปนี้:
ข้อมูลเริ่มต้น - โปรไฟล์ของเขาวงกต (เมทริกซ์ LAB เริ่มต้นที่ไม่มีกากบาท) ผลลัพธ์คือวิถีทางออกที่เป็นไปได้ทั้งหมดจากจุดศูนย์กลางของเขาวงกต (สำหรับแต่ละเส้นทาง LAB matrix จะแสดงพร้อมกับวิถีที่มีเครื่องหมายกากบาท)
อัลกอริธึมการย้อนรอยเรียกอีกอย่างว่าวิธีทดลองใช้
สาระสำคัญของมันมีดังนี้:
1. จากแต่ละจุดที่ต่อเนื่องกันของวิถี ทิศทางการเคลื่อนที่ที่เป็นไปได้จะถูกดูในลำดับเดียวกัน เรายอมรับว่าการรับชมจะเกิดขึ้นทวนเข็มนาฬิกาในแต่ละครั้ง - ขวาบน-ซ้ายล่าง; ขั้นตอนจะถูกส่งไปยังเซลล์ข้างเคียงอิสระที่ตรวจพบเป็นเซลล์แรก เซลล์ที่ทำตามขั้นตอนนั้นจะมีเครื่องหมายกากบาทกำกับไว้
3. หากเซลล์ถัดไปที่ก้าวเข้าไปอยู่ที่ขอบของเขาวงกต (ที่ทางออก) เส้นทางที่พบจะถูกพิมพ์
เราจะสร้างโปรแกรมโดยใช้วิธีการแสดงรายละเอียดตามลำดับ ขั้นตอนแรกของรายละเอียด:
ขั้นตอน GO พยายามก้าวเข้าไปในเซลล์ที่มีพิกัด x, y หากเซลล์นี้อยู่ที่ทางออกจากเขาวงกต เส้นทางที่เดินทางจะถูกพิมพ์ ถ้าไม่เช่นนั้น ให้นำขั้นตอนเข้าไปในเซลล์ที่อยู่ติดกันตามลำดับที่กำหนดไว้ข้างต้น ถ้าเซลล์เป็นทางตัน ก็จะทำการถอยกลับ จากที่กล่าวมาข้างต้น กระบวนการดังกล่าวมีลักษณะเป็นแบบวนซ้ำ
ก่อนอื่นให้เราเขียนโครงร่างทั่วไปของขั้นตอนโดยไม่มีรายละเอียด:
เพื่อส่งออกวิถีที่พบ ขั้นตอน PRINTLAB จะถูกคอมไพล์
โปรแกรมสุดท้ายจะมีลักษณะดังนี้:
อีกตัวอย่างหนึ่งของโปรแกรมที่สวยงามที่ใช้คำจำกัดความขั้นตอนแบบเรียกซ้ำ (จำหอคอยแห่งฮานอย!)
อัลกอริธึมของโปรแกรมนี้เป็นเรื่องปกติสำหรับวิธีการย้อนรอย อัลกอริธึมที่คล้ายกันนี้ใช้เพื่อแก้ปัญหายอดนิยม เช่น การเคลื่อนย้ายหมากรอบๆ กระดานหมากรุก หรือการจัดเรียงหมากบนกระดานเพื่อไม่ให้ "ชน" กัน ชุดปัญหาทางเลือกที่ดีที่สุด (ปัญหาการเดินทางของพนักงานขาย ปัญหาการก่อสร้างถนนที่เหมาะสม ฯลฯ)
ความคิดเห็น เนื่องจากการใช้อาร์เรย์ LAB เป็นพารามิเตอร์ค่าในขั้นตอน GO ปัญหาหน่วยความจำอาจเกิดขึ้นเมื่อใช้งานโปรแกรมบนคอมพิวเตอร์ ในกรณีนี้ คุณสามารถดำเนินการถ่ายโอนอาเรย์ส่วนกลางได้
ตามวิธีเดรัจฉานฟอร์ซ เป็นวิธีสากลที่สุด แต่ก็ยาวที่สุดเช่นกัน
YouTube สารานุกรม
1 / 5
√ เกินกำลัง อัลกอริธึมโลภ: การใช้กำลังดุร้ายโดยใช้ลูป ศูนย์การเรียนรู้ออนไลน์ Foxford
út #82. ความก้าวหน้าทางคณิตศาสตร์ การหารและการแจกแจงตัวเลือกอย่างละเอียดถี่ถ้วน! ทฤษฎีจำนวนในการสอบ Unified State
√ อัลกอริทึม C ++ กำลังดุร้าย (ตอนที่ 1)
út #84. ปัญหาเรื่องทหารสองหมวด! ทางออกที่เข้มงวดและชัดเจน การสอบ Unified State ในวิชาคณิตศาสตร์ (โปรไฟล์)
√ เกินกำลัง อัลกอริธึมโลภ: ปัญหาการแลกเปลี่ยนเหรียญ ศูนย์การเรียนรู้ออนไลน์ Foxford
คำบรรยาย
วิธีหมดแรง
คำศัพท์เฉพาะทาง
ในภาษาอังกฤษ คำว่า "brute-force" ที่กล่าวถึงในบทความนี้มักหมายถึงการโจมตีประเภทหนึ่งของแฮ็กเกอร์ ในเวลาเดียวกัน แนวคิดทั่วไปซึ่งเป็นวิธีการทางคณิตศาสตร์ในการทำให้ตัวเลือกที่เป็นไปได้ทั้งหมดหมดหมดในการค้นหาวิธีแก้ไขปัญหา สอดคล้องกับคำว่า "พิสูจน์โดยหมดแรง"
คำอธิบาย
"วิธีการหมดแรง" รวมถึงวิธีการต่างๆ มากมาย โดยปกติแล้ว การกำหนดปัญหาเกี่ยวข้องกับการพิจารณาจำนวนสถานะของระบบตรรกะที่กำหนดเพื่อระบุความจริงของข้อความเชิงตรรกะผ่านการวิเคราะห์ที่เป็นอิสระของแต่ละรัฐ วิธีการพิสูจน์ข้อความประกอบด้วย 2 ส่วน คือ
- พิสูจน์ความเป็นไปได้ที่จะทำให้ทุกสถานะของระบบหมดลง จำเป็นต้องแสดงให้เห็นว่าสถานะเฉพาะใดๆ ของระบบ (เช่น ค่าของนิพจน์เชิงตรรกะที่กำลังพิสูจน์) สอดคล้องกับโซลูชันที่อยู่ระหว่างการพิจารณาอย่างน้อยหนึ่งรายการ
- ตรวจสอบแต่ละตัวเลือกและพิสูจน์ว่าตัวเลือกที่อยู่ระหว่างการพิจารณานั้นเป็นหรือไม่ใช่วิธีแก้ปัญหา
ปัญหาทั่วไปแก้ไขได้ด้วยวิธีการค้นหาอย่างละเอียดถี่ถ้วน
แม้ว่าการค้นหาอย่างละเอียดไม่ได้ใช้ในทางปฏิบัติกับปัญหาที่ใช้ส่วนใหญ่ (โดยเฉพาะอย่างยิ่งที่ไม่เกี่ยวข้องกับรหัสถอดรหัส) แต่ก็มีข้อยกเว้นหลายประการ โดยเฉพาะอย่างยิ่งเมื่อการค้นหาอย่างละเอียดถี่ถ้วนยังคงกลายเป็นสิ่งที่ดีที่สุดหรือเป็นตัวแทน ขั้นแรกในการพัฒนาอัลกอริธึมการใช้งานนั้นมีความสมเหตุสมผล ตัวอย่างของการค้นหาอย่างละเอียดถี่ถ้วนคืออัลกอริธึมสำหรับการประมาณเวลาของการคำนวณผลคูณของห่วงโซ่ของเมทริกซ์ ซึ่งไม่สามารถเร่งความเร็วได้เมื่อเปรียบเทียบกับอัลกอริธึมที่ใช้วิธีเดรัจฉานแรง อัลกอริทึมนี้ใช้เพื่อแก้ปัญหาคลาสสิกของการเขียนโปรแกรมแบบไดนามิก - กำหนดลำดับความสำคัญของการคำนวณผลคูณเมทริกซ์ในรูปแบบต่อไปนี้: A 1 A 2 A 3 ⋯ A n (\รูปแบบการแสดงผล A_(1)A_(2)A_(3)\cdots A_(n)).
ตัวอย่างการใช้กำลังดุร้าย
ปัญหาเบื้องต้นคือการคำนวณลูกโซ่ที่กำหนด (ผลคูณเมทริกซ์) ในระยะเวลาน้อยที่สุด เป็นไปได้ที่จะใช้อัลกอริธึมลำดับเล็กน้อยที่คำนวณผลิตภัณฑ์ที่ต้องการ เนื่องจากผลคูณเมทริกซ์เป็นการดำเนินการเชื่อมโยง จึงเป็นไปได้ที่จะคำนวณผลคูณลูกโซ่โดยการสุ่มเลือกคู่องค์ประกอบของลูกโซ่ (A i A i + 1) , i = 1.. n − 1 (\displaystyle (A_(i)A_(i+1)),i=1..n-1)และแทนที่ด้วยเมทริกซ์ผลลัพธ์ A i 1: A i 1 = (A i A i + 1) (\displaystyle A_(i)^(1)\โคลอน A_(i)^(1)=(A_(i)A_(i+1)) )- หากคุณทำซ้ำขั้นตอนที่อธิบายไว้ n − 1 (\displaystyle n-1)เท่า ดังนั้นเมทริกซ์ผลลัพธ์ที่เหลือคือ A k n − 1 (\displaystyle A_(k)^(n-1))และคำตอบจะเป็น: A k n − 1 = (A k n − 2 A k + 1 n − 2) = … = A 1 A 2 A 3 ⋯ A n , k = 1.. n − 1 (\displaystyle A_(k)^(n- 1)=(A_(k)^(n-2)A_(k+1)^(n-2))=\ldots =A_(1)A_(2)A_(3)\cจุด A_(n), k=1..n-1)- สูตรนี้สามารถแสดงได้ดังนี้ พิจารณาห่วงโซ่เมทริกซ์: ⟨ A 1 , A 2 , A 3 , A 4 ⟩ (\displaystyle \left\langle A_(1),A_(2),A_(3),A_(4)\right\rangle )- มี 5 วิธีต่อไปนี้ในการคำนวณผลิตภัณฑ์ที่สอดคล้องกับห่วงโซ่นี้: A 1 A 2 A 3 A 4 (\รูปแบบการแสดงผล A_(1)A_(2)A_(3)A_(4)):
(A 1 (A 2 (A 3 A 4))) , (\displaystyle (\color (Violet)()A_(1)(\color (BurntOrange)()A_(2)(\color (BrickRed)() A_(3)A_(4)(\color (BrickRed)))(\color (BurntOrange)))(\color (ม่วง))))) (A 1 ((A 2 A 3) A 4)) , (\displaystyle (\color (Violet)()A_(1)(\color (BurntOrange)()(\color (BrickRed)()A_(2) A_(3)(\color (BrickRed)))A_(4)(\color (BurntOrange)))(\color (สีม่วง))))) ((A 1 A 2) (A 3 A 4)) , (\displaystyle (\color (Violet)()(\color (BrickRed)()A_(1)A_(2)(\color (BrickRed))) (\color (BurntOrange)()A_(3)A_(4)(\color (BurntOrange)))(\color (สีม่วง))))) ((A 1 (A 2 A 3)) A 4) , (\displaystyle (\color (Violet)()(\color (BurntOrange)()A_(1)(\color (BrickRed)()A_(2) A_(3)(\color (BrickRed)))(\color (BurntOrange)))A_(4)(\color (ม่วง))))) (((ก 1 ก 2) ก 3) ก 4) . (\displaystyle (\color (Violet)()(\color (BurntOrange)()(\color (BrickRed)()A_(1)A_(2)(\color (BrickRed)))A_(3)(\color (BurntOrange)))A_(4)(\color (ม่วง))).)ด้วยการเลือกลำดับการคำนวณที่ถูกต้อง คุณสามารถเร่งความเร็วการคำนวณได้อย่างมาก หากต้องการดูสิ่งนี้ ลองพิจารณาตัวอย่างง่ายๆ ของสายโซ่ของเมทริกซ์ 3 ตัว สมมติว่าขนาดเท่ากันตามลำดับ 10 × 100, 100 × 5, 5 × 50 (\รูปแบบการแสดงผล 10\คูณ 100,100\คูณ 5.5\คูณ 50)- อัลกอริธึมมาตรฐานสำหรับการคูณเมทริกซ์สองตัวด้วยขนาด p × q , q × r (\displaystyle p\times q,q\times r)ต้องใช้เวลาคำนวณตามสัดส่วนของตัวเลข pqr (\displaystyle pqr)(จำนวนผลิตภัณฑ์สเกลาร์ที่จะคำนวณ) ดังนั้นให้คำนวณลูกโซ่ตามลำดับ ((A 1 A 2) A 3) (\รูปแบบการแสดงผล ((A_(1)A_(2))A_(3))), เราได้รับ 10 ⋅ 100 ⋅ 5 = 5000 (\displaystyle 10\cdot 100\cdot 5=5000)ผลิตภัณฑ์จุดที่จะคำนวณ (A 1 A 2) (\displaystyle (A_(1)A_(2)))บวกเพิ่ม 10 ⋅ 5 ⋅ 50 = 2500 (\displaystyle 10\cdot 5\cdot 50=2500)ดอทโปรดัคเพื่อคำนวณผลคูณเมทริกซ์ตัวที่สอง จำนวนผลิตภัณฑ์สเกลาร์ทั้งหมด: 7500 ด้วยตัวเลือกลำดับการคำนวณที่แตกต่างกัน เราได้รับ 100 ⋅ 5 ⋅ 50 = 25000 (\displaystyle 100\cdot 5\cdot 50=25000)บวก 10 ⋅ 100 ⋅ 50 = 50000 (\displaystyle 10\cdot 100\cdot 50=50000)ผลิตภัณฑ์ดอท ซึ่งก็คือ 75,000 ผลิตภัณฑ์ดอท
ดังนั้นการแก้ปัญหานี้สามารถลดเวลาที่ใช้ในการคำนวณลูกโซ่เมทริกซ์ได้อย่างมาก โซลูชันนี้สามารถหาได้จากการค้นหาอย่างละเอียด: จำเป็นต้องพิจารณาลำดับการคำนวณที่เป็นไปได้ทั้งหมดและเลือกลำดับที่ใช้ผลิตภัณฑ์สเกลาร์จำนวนน้อยที่สุดเมื่อคำนวณลูกโซ่ อย่างไรก็ตาม จะต้องคำนึงว่าอัลกอริทึมนี้ต้องใช้เวลาในการคำนวณแบบเอ็กซ์โปเนนเชียล ดังนั้นสำหรับเมทริกซ์เชนแบบยาว ผลได้จากการคำนวณเชนด้วยวิธีที่มีประสิทธิภาพมากที่สุด (กลยุทธ์ที่เหมาะสมที่สุด) อาจสูญหายไปโดยสิ้นเชิงเมื่อต้องใช้เวลาในการค้นหาสิ่งนี้ กลยุทธ์.
เชื่อมโยงกับแนวคิด “แบ่งแยก พิชิต”
ตัวอย่างที่ชัดเจนอีกประการหนึ่งของแนวคิดพื้นฐานในทฤษฎีอัลกอริธึมคือหลักการ "แบ่งแยกและพิชิต" แนวคิดนี้ใช้ได้เมื่อระบบสามารถแบ่งออกเป็นระบบย่อยจำนวนมากซึ่งมีโครงสร้างคล้ายกับระบบดั้งเดิม ในกรณีเช่นนี้ ระบบย่อยยังสามารถแยกออกจากกันหรือไม่สำคัญก็ได้ สำหรับระบบดังกล่าว ปัญหาที่เกิดขึ้นในตอนแรกนั้นไม่สำคัญนัก ดังนั้น การนำแนวคิด "แบ่งแยกและพิชิต" ไปใช้จึงมีลักษณะเป็นแบบวนซ้ำ
ในทางกลับกัน การเรียกซ้ำเป็นการค้นหาแบบละเอียดถี่ถ้วน ดังนั้นการเรียกซ้ำจึงใช้ได้กับเท่านั้น ระบบที่ไม่ต่อเนื่อง- อย่างไรก็ตาม ข้อกำหนดนี้ใช้ไม่ได้กับสถานะของระบบที่กำหนด แต่ใช้กับระบบของมัน โครงสร้างย่อย- การพิจารณาอย่างสอดคล้องกันของทุกระดับจะให้แนวทางแก้ไขปัญหาที่ครอบคลุมสำหรับระบบแยกทั้งหมด
เมื่อเปรียบเทียบกับตัวอย่างอื่นๆ ของการค้นหาอย่างละเอียด คุณลักษณะหนึ่งของวิธีการเรียกซ้ำก็คือ วิธีแก้ปัญหาขั้นสุดท้ายไม่ได้ขึ้นอยู่กับระบบย่อยเล็กๆ น้อยๆ เพียงระบบเดียว ในกรณีทั่วไป การแก้ปัญหาจะเกิดขึ้นบนพื้นฐานของระบบย่อยทั้งชุด
สำหรับตัวอย่างปัญหาการแบ่งแยกและพิชิตแบบคลาสสิกต่อไปนี้ การค้นหาอย่างละเอียดอาจเป็นวิธีการแก้ปัญหาเดียวที่ทราบหรือการดำเนินการดั้งเดิมที่ได้รับการปรับปรุงให้เหมาะสมเพิ่มเติม:
การโจมตีด้วยกำลังอันดุร้าย
จำนวนตัวอักษร | จำนวนตัวเลือก | ความทนทาน | เวลาค้นหา |
---|---|---|---|
1 | 36 | 5 บิต | น้อยกว่าหนึ่งวินาที |
2 | 1296 | 10 บิต | น้อยกว่าหนึ่งวินาที |
3 | 46 656 | 15 บิต | น้อยกว่าหนึ่งวินาที |
4 | 1 679 616 | 21 บิต | 17 วินาที |
5 | 60 466 176 | 26 บิต | 10 นาที |
6 | 2 176 782 336 | 31 บิต | 6 ชั่วโมง |
7 | 78 364 164 096 | 36 บิต | 9 วัน |
8 | 2,821 109 9x10 12 | 41 บิต | 11 เดือน |
9 | 1.015 599 5x10 14 | 46 บิต | 32 ปี |
10 | 3.656 158 4x10 15 | 52 บิต | 1,162 ปี |
11 | 1.316 217 0x10 17 | 58 บิต | 41,823 ปี |
12 | 4,738 381 3x10 18 | 62 บิต | 1,505,615 ปี |
ดังนั้นรหัสผ่านที่มีความยาวไม่เกิน 8 ตัวอักษรโดยทั่วไปจึงไม่เข้มงวด สำหรับคอมพิวเตอร์สมัยใหม่ ตัวเลขนี้สูงกว่ามาก ดังนั้น คีย์ 64 บิต (รหัสผ่าน) จึงสามารถค้นหาบนคอมพิวเตอร์สมัยใหม่ได้ภายในเวลาประมาณ 2 ปี และสามารถกระจายการค้นหาไปยังคอมพิวเตอร์หลายเครื่องได้อย่างง่ายดาย
หมายถึงการโจมตี
คอมพิวเตอร์ส่วนบุคคลสมัยใหม่ช่วยให้คุณสามารถถอดรหัสรหัสผ่านโดยใช้วิธีการแบบ Brute Force ได้อย่างมีประสิทธิภาพตามที่แสดงในตารางด้านบน อย่างไรก็ตาม ด้วยการเพิ่มประสิทธิภาพแบบเดรัจฉานโดยอิงจากการคำนวณแบบขนาน ประสิทธิภาพของการโจมตีจึงสามารถเพิ่มขึ้นได้อย่างมาก ซึ่งอาจต้องใช้คอมพิวเตอร์ที่ปรับให้เหมาะกับการประมวลผลแบบมัลติเธรด ในช่วงไม่กี่ปีที่ผ่านมา โซลูชันการประมวลผลที่ใช้ GPU เช่น Nvidia Tesla แพร่หลายมากขึ้น ตั้งแต่ Nvidia สร้างสถาปัตยกรรม CUDA ในปี 2550 ก็มีโซลูชันมากมายปรากฏขึ้น (ดูตัวอย่าง Cryptohaze Multiforcer, Pyrit) ซึ่งช่วยให้สามารถเลือกคีย์ได้เร็วขึ้นโดยใช้เทคโนโลยีเช่น CUDA, FireStream, OpenCL
ทนต่อการโจมตีด้วยกำลังดุร้าย
ในกระบวนการปรับปรุงระบบความปลอดภัยของข้อมูลที่สัมพันธ์กับการโจมตีแบบ brute-force สามารถแยกแยะได้สองทิศทางหลัก:
- ข้อกำหนดที่เพิ่มขึ้นสำหรับคีย์การเข้าถึงจากข้อมูลที่ได้รับการคุ้มครอง
- เพิ่มความน่าเชื่อถือของส่วนประกอบทั้งหมดของระบบรักษาความปลอดภัย
ดังนั้นจึงเป็นไปไม่ได้ที่จะได้รับการป้องกันในระดับสูงโดยการปรับปรุงพารามิเตอร์เหล่านี้เพียงตัวเดียว - มีตัวอย่างว่าระบบการตรวจสอบสิทธิ์ตามความซับซ้อนของรหัสผ่านที่เหมาะสมที่สุดกลายเป็นช่องโหว่ในการคัดลอกฐานข้อมูลไปยังเครื่องคอมพิวเตอร์ของผู้โจมตีได้อย่างไร หลังจากนั้นจึงถูกโจมตีแบบดุร้ายโดยใช้การเพิ่มประสิทธิภาพเฉพาะที่และเครื่องมือคำนวณที่ไม่สามารถใช้งานได้กับระยะไกล การเข้ารหัส สถานการณ์เช่นนี้ทำให้ผู้เชี่ยวชาญด้านความปลอดภัยคอมพิวเตอร์บางคนแนะนำให้ใช้มุมมองที่สำคัญยิ่งขึ้นเกี่ยวกับแนวทางปฏิบัติด้านความปลอดภัยมาตรฐาน เช่น การรักษารหัสผ่านให้นานที่สุด ด้านล่างนี้คือรายการวิธีการบางอย่างที่ใช้ในทางปฏิบัติเพื่อเพิ่มความน่าเชื่อถือของระบบเข้ารหัสที่เกี่ยวข้องกับการโจมตีแบบเดรัจฉาน:
วิธีการเพิ่มประสิทธิภาพแบบเดรัจฉาน
สาขาและวิธีการผูกมัด
การคำนวณแบบขนาน
วิธีหนึ่งในการเพิ่มความเร็วของการเลือกคีย์คือการคำนวณแบบขนาน มีสองวิธีในการขนาน:
- แนวทางแรกคือการสร้างไปป์ไลน์ ปล่อยให้อัลกอริทึมอัตราส่วน E k (x) = y (\displaystyle E_(k)\ (x)=y)สามารถแสดงเป็นลูกโซ่ของการกระทำง่าย ๆ (การดำเนินการ): โอ 1, โอ 2, . -- , O N (\รูปแบบการแสดงผล (O_(1)\ ,O_(2),...,O_(N)))- เอาล่ะ ยังไม่มีข้อความ (\displaystyle N\ )โปรเซสเซอร์ ก 1 , 2 , . -- , O N (\รูปแบบการแสดงผล (O_(1)\ ,O_(2),...,O_(N))), A N (\displaystyle (A_(1)\ ,A_(2),...,A_(N))) ให้เรากำหนดลำดับและสันนิษฐานว่าฉัน (\displaystyle i\ ) - โปรเซสเซอร์ตัวที่ 3 ดำเนินการสามอย่างในเวลาเดียวกัน: จากนั้นไปป์ไลน์จากโปรเซสเซอร์ที่เชื่อมต่อแบบอนุกรม ขนานและซิงโครนัสทำงานด้วยความเร็ว
- v / 3 (\displaystyle v/3\ ) , ที่ไหนโวลต์ (\displaystyle v\ ) - ความเร็วในการดำเนินการหนึ่งการดำเนินการโดยโปรเซสเซอร์ตัวเดียวแนวทางที่สองก็คือชุด K (\รูปแบบการแสดงผล K\ )คีย์ที่เป็นไปได้ทั้งหมดจะถูกแบ่งออกเป็นชุดย่อยที่ไม่ต่อเนื่องกัน ก 1 , 2 , . -เค 1 เค 2 , . - -, K N (\รูปแบบการแสดงผล (K_(1)\,K_(2),...,K_(N))) - ระบบจากถาม (\displaystyle Q\ ) -เค | (\displaystyle |K|\ ) , O N (\รูปแบบการแสดงผล (O_(1)\ ,O_(2),...,O_(N)))คือจำนวนองค์ประกอบในชุดคีย์ และ
- จำนวนโปรเซสเซอร์
โต๊ะสายรุ้ง
ข้อกำหนดเบื้องต้นสำหรับการปรากฏตัว
ระบบคอมพิวเตอร์ที่ใช้รหัสผ่านในการตรวจสอบความถูกต้องจะต้องตรวจสอบว่ารหัสผ่านที่ป้อนนั้นถูกต้องหรือไม่ วิธีแก้ไขเล็กๆ น้อยๆ สำหรับปัญหานี้คือการจัดเก็บรายการรหัสผ่านที่ถูกต้องทั้งหมดสำหรับผู้ใช้แต่ละราย แต่วิธีนี้ไม่ปลอดภัย วิธีหนึ่งที่ต้องการคือการคำนวณฟังก์ชันแฮชที่เข้ารหัสจากข้อความรหัสผ่าน ตารางสายรุ้งเป็นการเพิ่มประสิทธิภาพของวิธีนี้ ข้อได้เปรียบหลักคือลดจำนวนหน่วยความจำที่ใช้ลงอย่างมาก
การใช้งาน
ตารางสายรุ้งถูกสร้างขึ้นโดยการสร้างกลุ่มรหัสผ่านที่เป็นไปได้ แต่ละห่วงโซ่เริ่มต้นด้วยรหัสผ่านผู้สมัครแบบสุ่ม จากนั้นอยู่ภายใต้ฟังก์ชันแฮชและฟังก์ชันลด ฟังก์ชันนี้จะแปลงผลลัพธ์ของฟังก์ชันแฮชเป็นรหัสผ่านที่เป็นไปได้ (เช่น ถ้าเราถือว่ารหัสผ่านมีความยาว 64 บิต ฟังก์ชันลดขนาดอาจใช้ 64 บิตแรกของแฮช โดยเพิ่มบล็อกแฮช 64 บิตทั้งหมด ระดับบิต เป็นต้น) รหัสผ่านระดับกลางในห่วงโซ่จะถูกละทิ้ง และเฉพาะองค์ประกอบแรกและสุดท้ายของห่วงโซ่เท่านั้นที่ถูกเขียนลงในตาราง การสร้างตารางดังกล่าวต้องใช้เวลามากกว่าที่ใช้ในการสร้างตารางการค้นหาปกติ แต่มีหน่วยความจำน้อยกว่ามาก (มากถึงหลายร้อยกิกะไบต์ ในขณะที่ไดรฟ์ข้อมูลสำหรับตารางปกติคือ N คำ ตารางสายรุ้งต้องการเพียง N 2/3 เท่านั้น) ในเวลาเดียวกันแม้ว่าจะต้องใช้เวลามากขึ้น (เมื่อเทียบกับวิธีทั่วไป) ในการกู้คืนรหัสผ่านเดิม แต่ก็มีความเป็นไปได้มากกว่าในทางปฏิบัติ (เพื่อสร้างตารางปกติสำหรับรหัสผ่าน 6 ตัวอักษรที่มีอักขระไบต์ 256 6 = 281,474,976,710,656 บล็อกหน่วยความจำ จะต้องใช้ในขณะที่สายรุ้ง - เพียง 256 6 ·⅔ = 4,294,967,296 บล็อก)
ในการกู้คืนรหัสผ่าน ค่าแฮชนี้อยู่ภายใต้ฟังก์ชันการลดขนาดและค้นหาในตาราง หากไม่พบรายการที่ตรงกัน ฟังก์ชันแฮชและฟังก์ชันลดจะถูกใช้อีกครั้ง การดำเนินการนี้จะดำเนินต่อไปจนกว่าจะพบรายการที่ตรงกัน เมื่อพบรายการที่ตรงกัน สายโซ่ที่บรรจุข้อมูลจะถูกสร้างขึ้นใหม่เพื่อค้นหาค่าที่ถูกละทิ้ง ซึ่งจะเป็นรหัสผ่านที่ค้นหา
ผลลัพธ์ที่ได้คือตารางที่สามารถกู้คืนรหัสผ่านได้ในเวลาอันสั้นซึ่งมีความเป็นไปได้สูง
แม้ว่าการป้องกันระบบข้อมูลใดๆ ประการแรกจะต้องเชื่อถือได้ต่อการโจมตีแบบเดรัจฉาน แต่กรณีการใช้งานการโจมตีนี้โดยผู้โจมตีสำเร็จนั้นค่อนข้างเป็นเรื่องปกติ
การโจมตีของปริศนา
เครื่องเข้ารหัสที่เรียกว่า Enigma ประดิษฐ์ขึ้นในปี พ.ศ. 2461 และถูกใช้อย่างแพร่หลายโดยกองทัพเรือเยอรมัน โดยเริ่มตั้งแต่ปี พ.ศ. 2472 ในอีกไม่กี่ปีถัดมา ระบบก็ได้รับการแก้ไข และตั้งแต่ปี 1930 เป็นต้นมา ระบบนี้ก็ถูกใช้อย่างแข็งขันโดยกองทัพและรัฐบาลเยอรมันในช่วงสงครามโลกครั้งที่สอง
การสกัดกั้นข้อความครั้งแรกที่เข้ารหัสด้วยรหัส Enigma ย้อนกลับไปในปี 1926 อย่างไรก็ตาม พวกเขาไม่สามารถอ่านข้อความได้เป็นเวลานาน ตลอดช่วงสงครามโลกครั้งที่สอง มีการเผชิญหน้ากันระหว่างนักเข้ารหัสชาวโปแลนด์และชาวเยอรมัน ชาวโปแลนด์ซึ่งได้รับผลอีกประการหนึ่งในการแฮ็กระบบเข้ารหัสลับของเยอรมัน ต้องเผชิญกับปัญหาใหม่ที่นำเสนอโดยวิศวกรชาวเยอรมัน ผู้ซึ่งปรับปรุงระบบ Enigma ให้ทันสมัยอยู่ตลอดเวลา ในฤดูร้อนปี พ.ศ. 2482 เมื่อการรุกรานโปแลนด์กลายเป็นเรื่องหลีกเลี่ยงไม่ได้ สำนักงานจึงส่งมอบผลงานให้กับหน่วยข่าวกรองของอังกฤษและฝรั่งเศส
มีการจัดงานแฮ็กเพิ่มเติมที่ Bletchley Park เครื่องมือหลักของนักวิเคราะห์การเข้ารหัสคือเครื่องถอดรหัสระเบิด ต้นแบบของมันถูกสร้างขึ้นโดยนักคณิตศาสตร์ชาวโปแลนด์ในช่วงก่อนสงครามโลกครั้งที่สองสำหรับกระทรวงกลาโหมโปแลนด์ จากการพัฒนานี้และด้วยการสนับสนุนโดยตรงของผู้สร้าง หน่วย "ขั้นสูง" ได้รับการออกแบบในอังกฤษ
ส่วนทางทฤษฎีของงานนี้ดำเนินการโดย Alan Mathieson Turing งานของเขาเกี่ยวกับการวิเคราะห์การเข้ารหัสของอัลกอริธึมที่ใช้ในเครื่องเข้ารหัส Enigma มีพื้นฐานมาจากการวิเคราะห์การเข้ารหัสก่อนหน้านี้ของเครื่องรุ่นก่อนๆ ซึ่งดำเนินการในปี 1938 โดย Marian Rejewski นักวิเคราะห์การเข้ารหัสชาวโปแลนด์ หลักการทำงานของตัวถอดรหัสที่พัฒนาโดยทัวริงคือการแจกแจงตัวแปรที่เป็นไปได้ของคีย์ตัวเลขและพยายามถอดรหัสข้อความหากทราบโครงสร้างของข้อความที่ถูกถอดรหัสหรือเป็นส่วนหนึ่งของข้อความธรรมดา
จากมุมมองสมัยใหม่ รหัส Enigma นั้นไม่น่าเชื่อถือมากนัก แต่เพียงการรวมกันของปัจจัยนี้กับการมีอยู่ของข้อความที่ถูกดัก หนังสือรหัส รายงานข่าวกรอง ผลของความพยายามทางทหาร และแม้แต่การโจมตีของผู้ก่อการร้ายเท่านั้นที่ทำให้สามารถ " ทำลาย” รหัส
การแฮ็กเครือข่ายในบ้านครั้งใหญ่โดยใช้ WASP
ดูสิ่งนี้ด้วย
หมายเหตุ
วรรณกรรม
- รีด, ดี.เอ. และคณะ การพิสูจน์ ใน คณิตศาสตร์ การศึกษา: การวิจัย การเรียนรู้ และ การสอน- - John Wiley & SSense Publishersons, 2010. - หน้า 266. - ISBN 978-9460912443.
- พาร์, คริสตอฟ และคณะ.
3) การเลือกเครื่องมือทางคณิตศาสตร์ เครื่องมือทางคณิตศาสตร์ที่ใช้สร้างแบบจำลองจะขึ้นอยู่กับประเภทของแบบจำลอง ดังนั้น เพื่อจัดอัลกอริธึมแบบจำลองการคำนวณ จึงมีการใช้สูตรวิเคราะห์ของความซับซ้อนใดๆ ระบบสมการเชิงเส้นหรือสมการเชิงอนุพันธ์ (กฎของ Kirchhoff วิธีของกระแสที่สำคัญและแรงดันไฟฟ้าของลูป)
ในการกำหนดอัลกอริธึมแบบจำลองการทำนาย จะใช้อัลกอริธึมที่รู้จักกันดีของแบบจำลองการคำนวณ โดยเน้นข้อมูลเริ่มต้นและพารามิเตอร์ที่คาดการณ์ของระบบ
สำหรับคำอธิบายทางคณิตศาสตร์ของแบบจำลองการปรับให้เหมาะสมนั้นใช้วิธีการทางคณิตศาสตร์พิเศษ - วิธีการปรับให้เหมาะสม
3. ขั้นตอนที่สามคือการใช้อัลกอริธึมโมเดลที่สร้างขึ้นบนคอมพิวเตอร์
4. ศึกษาผลลัพธ์ของการสร้างแบบจำลองเชิงตัวเลข การประเมินความเพียงพอ และความเหมาะสมทั่วไปของแบบจำลองในการใช้งาน
5. การตีความผลการสร้างแบบจำลองและการตัดสินใจเกี่ยวกับการใช้แบบจำลองทางคณิตศาสตร์หรือความจำเป็นในการพัฒนา ที่นี่จะพิจารณาวงจรชีวิตของโมเดลและความจำเป็นในการอัปเดตโมเดลนั่นคือการเปลี่ยนแปลงพารามิเตอร์เนื่องจากการเปลี่ยนแปลงสภาพการทำงาน
วิธีการเพิ่มประสิทธิภาพ
เมื่อเริ่มดำเนินกิจกรรมผู้คนจะประเมินผลที่ตามมาและตัดสินใจเลือกไม่ทางใดก็ทางหนึ่งหรือพารามิเตอร์อื่นที่ขึ้นอยู่กับพวกเขา - วิธีการจัดกิจกรรมและกระบวนการ ทฤษฎีการตัดสินใจใช้แบบจำลองการปรับให้เหมาะสมและแก้ไขปัญหาการปรับให้เหมาะสม
เป้าหมายของการเพิ่มประสิทธิภาพคือการปรับปรุงตัวบ่งชี้ของระบบหรือกระบวนการที่เป็นแบบจำลองโดยการเลือกเงื่อนไขสำหรับกระบวนการหรือการเลือกพารามิเตอร์ของระบบบางอย่าง
ฟังก์ชันบางอย่าง F(x) เรียกว่าฟังก์ชันวัตถุประสงค์ ถือเป็นเกณฑ์การหาค่าเหมาะที่สุด ฟังก์ชั่นวัตถุประสงค์แสดงการวิเคราะห์การพึ่งพาตัวบ่งชี้ที่ปรับให้เหมาะสมที่สุดในพารามิเตอร์บางตัว x ซึ่งค่าที่สามารถเปลี่ยนแปลงได้เรียกว่าพารามิเตอร์ควบคุม
xi, i = 1,2,...,n.
พารามิเตอร์ที่ควบคุม xi นั้นเป็นอิสระจากกัน และในระหว่างกระบวนการปรับให้เหมาะสม พารามิเตอร์เหล่านั้นสามารถเปลี่ยนแปลงได้ภายในขีดจำกัดที่ทราบ (ขอบเขตที่อนุญาต) Dx ในเชิงวิเคราะห์สามารถระบุช่วงของค่าที่ยอมรับได้ในเชิงวิเคราะห์ในรูปแบบของชุดฟังก์ชัน
Ψ k (x 1 ,...,xn )= 0
โดยทั่วไป ปัญหาการหาค่าเหมาะที่สุดทางคณิตศาสตร์สามารถกำหนดได้ดังนี้:
ย่อเล็กสุด (ขยายใหญ่สุด) ฟังก์ชั่นวัตถุประสงค์โดยคำนึงถึงข้อจำกัดของตัวแปรที่ถูกควบคุม
โดยการลด (ขยายใหญ่สุด) ฟังก์ชันของตัวแปร n ตัว F(x)=F(x1, ... ,xn) บนชุด Dx ที่กำหนด เราหมายถึงการกำหนดค่าต่ำสุดโดยรวม (สูงสุด) ของฟังก์ชันนี้บนชุด Dx ที่กำหนด
ช่วงการเปลี่ยนแปลงที่อนุญาตในพารามิเตอร์ควบคุมไม่ได้นูนเสมอไปและอาจไม่ได้เชื่อมต่อกันง่ายๆ มักเป็นไปไม่ได้ที่จะแก้ระบบข้อจำกัดแบบไม่เชิงเส้นในเชิงวิเคราะห์ และหาจุดปลายสุดของฟังก์ชันวัตถุประสงค์ที่ไม่เชิงเส้นที่ซับซ้อนในเชิงวิเคราะห์
การเพิ่มฟังก์ชันวัตถุประสงค์ให้สูงสุด (F(x) -> สูงสุด) เทียบเท่ากับการลดปริมาณตรงข้ามให้เหลือน้อยที่สุด (−F(x) -> min) ดังนั้นจึงพิจารณาเฉพาะปัญหาการย่อให้เล็กที่สุดเท่านั้น
ไม่มีวิธีการที่เป็นสากลในการแก้ปัญหาการปรับให้เหมาะสมแบบไม่เชิงเส้น แต่มีการพัฒนาแล้ว จำนวนมากวิธีที่ใช้ในการแก้ปัญหาการหาค่าเหมาะที่สุดของฟังก์ชันวัตถุประสงค์ยูนิโมดัลหนึ่งมิติ ยูนิโมดัลหลายมิติ มัลติโมดัลหนึ่งมิติ หรือหลายมิติหลายมิติ
วิธีการเชิงตัวเลขสำหรับการแก้ปัญหาการหาค่าเหมาะที่สุดมิติเดียว
ปัญหาการย่อเล็กสุดหนึ่งมิติแสดงถึงแบบจำลองการหาค่าเหมาะที่สุดทางคณิตศาสตร์ที่ง่ายที่สุด ซึ่งฟังก์ชันวัตถุประสงค์ขึ้นอยู่กับตัวแปรตัวเดียว และเซตที่ยอมรับได้คือส่วนของแกนจริง:
F(x) -> min , x เป็นของ
ปัญหาการปรับให้เหมาะสมที่ประยุกต์กับตัวแปรควบคุมตัวเดียวนำไปสู่ปัญหาทางคณิตศาสตร์ของการย่อเล็กสุดหนึ่งมิติ นอกจากนี้ ความจำเป็นในการลดฟังก์ชันของตัวแปรหนึ่งให้เหลือน้อยที่สุดเกิดขึ้นเมื่อใช้วิธีการบางอย่างในการแก้ปัญหาการปรับให้เหมาะสมที่ซับซ้อนมากขึ้น
เพื่อแก้ปัญหาการลดฟังก์ชัน F(x) บนเซกเมนต์ให้เหลือน้อยที่สุด ในทางปฏิบัติมักใช้วิธีการโดยประมาณ ช่วยให้สามารถค้นหาวิธีแก้ไขปัญหานี้ด้วยความแม่นยำที่ต้องการโดยการกำหนดค่าจำนวน จำกัด ของฟังก์ชัน F(x) และอนุพันธ์ของมันในบางจุดของเซ็กเมนต์ วิธีที่ใช้เฉพาะค่าของฟังก์ชันและไม่จำเป็นต้องคำนวณอนุพันธ์เรียกว่าวิธีการย่อขนาดโดยตรง
ข้อได้เปรียบที่สำคัญของวิธีการโดยตรงก็คือ ฟังก์ชันเป้าหมายไม่จำเป็นต้องสร้างความแตกต่าง และยิ่งไปกว่านั้น อาจไม่สามารถระบุในรูปแบบการวิเคราะห์ได้ สิ่งเดียวที่ใช้อัลกอริธึมของวิธีการย่อขนาดโดยตรงคือความสามารถในการกำหนดค่าของ F(x) ณ จุดที่กำหนด
ข้อกำหนดที่อ่อนแอที่สุดสำหรับฟังก์ชัน F(x) ซึ่งอนุญาตให้ใช้เมธอดเหล่านี้ได้คือสภาวะแบบยูนิโมดิกชัน (การมีค่าต่ำสุดหนึ่งค่าในช่วงของค่าที่อนุญาต) ดังนั้น เราจะสมมติต่อไปว่าฟังก์ชัน F(x) เป็นแบบยูนิโมดัลในช่วงเวลา
วิธีใช้กำลังดุร้าย
วิธีค้นหาแบบกำลังเดรัจฉานหรือแบบสม่ำเสมอเป็นวิธีที่ง่ายที่สุดในบรรดาวิธีการย่อขนาดโดยตรง และประกอบด้วยสิ่งต่อไปนี้
ลองแบ่งส่วนออกเป็น n ส่วนเท่าๆ กันโดยใช้จุดหาร:
xi =A+i·(B − A)/n, i=0,...n
เมื่อคำนวณค่าของ F(x) ที่จุด xi โดยการเปรียบเทียบเราจะพบจุด xm โดยที่ m คือตัวเลขตั้งแต่ 0 ถึง n ดังนั้น
F(xm) = นาที F(xi) สำหรับ i ทั้งหมดตั้งแต่ 0 ถึง n
ข้อผิดพลาดในการกำหนดจุดต่ำสุด xm ของฟังก์ชัน F(x) โดยใช้วิธีการแจงนับไม่เกินค่า ε = (B − A)/n
วิธีการแบ่งขั้ว
วิธีการนี้ใช้เพื่อค้นหาค่าสูงสุด-ปลายสุดหรือต่ำสุด-ปลายสุดของฟังก์ชันวัตถุประสงค์ยูนิโมดัลหนึ่งมิติแบบไม่เชิงเส้น
สาระสำคัญของวิธีการมีดังนี้ ให้ระบุฟังก์ชันวัตถุประสงค์ F(x) ในช่วงเวลา A≤ x ≤ B โดยแบ่งครึ่งในแต่ละระยะ สำหรับการค้นหาสองครั้งแรก
ด้วยการคำนวณฟังก์ชันวัตถุประสงค์ F(x) ที่จุด x1, x2 ทิศทางการค้นหาจึงได้รับการขัดเกลา ถ้าหาค่าต่ำสุดสุดขีดและ F(x1)< F(х2 ), то смещается правая граница первоначального интервала неопределенности , т.е. полагается В = x2 , если F(х1 ) >F(x2) จากนั้นขอบเขตด้านซ้าย A = x1 จะถูกเลื่อน หากช่วงความไม่แน่นอนใหม่ [В−А] มากกว่าค่าความคลาดเคลื่อนของสารละลายที่กำหนด ε แล้ว
การลดลงครึ่งหนึ่งยังคงดำเนินต่อไป ถ้า B−A ≤ ε แล้วคำตอบคือ x* =A + 2 B , F(x) = F(x*)
วิธีฟีโบนัชชี
วิธีการแบ่งขั้วในขณะที่อนุญาตให้ลดช่วงความไม่แน่นอนได้อย่างต่อเนื่องนั้นจำเป็นต้องมีการคำนวณค่าสองค่าของฟังก์ชันวัตถุประสงค์ที่มักจะซับซ้อนหรือการตั้งค่าการทดลองค้นหาสองครั้งเมื่อปรับโมเดลการระบุให้เหมาะสม ข้อเสียนี้ไม่มีอยู่ในการค้นหา Fibonacci วิธีฟีโบนัชชีจะขึ้นอยู่กับการใช้ลำดับของตัวเลขฟีโบนัชชีเพื่อสร้างช่วงความไม่แน่นอนที่ลดลงซึ่งเป็นช่วงที่คำตอบอยู่ ลำดับของตัวเลขฟีโบนัชชีถูกกำหนดโดยสูตรที่เกิดซ้ำ
Nn =Nn-1 +Nn-2 โดยที่ N1 =N2 =1
ช่วงความไม่แน่นอนเริ่มต้น [В−А] จะถือว่าเป็นสัดส่วนกับจำนวนฟีโบนัชชี Fn ที่กำหนดตาม