คำถามติดแท็ก efficiency

ใช้ทรัพยากรให้น้อยที่สุด (เช่นเวลาพื้นที่) ให้มากที่สุดในขณะที่แก้ปัญหา ใช้แท็กนี้หากคำถามของคุณเกี่ยวกับการใช้ทรัพยากรโดยเฉพาะไม่ใช่สำหรับคำถามอัลกอริทึมทั่วไปที่กล่าวถึงเวลาที่ใช้งาน

10
ภาษาที่คอมไพเลอร์เขียนใน C จะเร็วกว่า C ได้อย่างไร?
ลองดูที่หน้าเว็บของ Juliaคุณสามารถดูเกณฑ์มาตรฐานของหลายภาษาในหลาย ๆ อัลกอริทึม (การกำหนดเวลาที่แสดงด้านล่าง) ภาษาที่คอมไพเลอร์เขียนด้วยภาษา C ได้ดีกว่าโค้ด C อย่างไร รูป: เวลามาตรฐานเทียบกับ C (เล็กกว่าดีกว่า, ประสิทธิภาพ C = 1.0)

4
ทำไมเวลาพหุนามจึงเรียกว่า“ มีประสิทธิภาพ”?
ทำไมในวิทยาการคอมพิวเตอร์ความซับซ้อนใด ๆ ที่มากที่สุดในพหุนามถือว่ามีประสิทธิภาพ? สำหรับแอปพลิเคชันเชิงปฏิบัติใด ๆ(a)อัลกอริทึมที่มีความซับซ้อนนั้นเร็วกว่าอัลกอริธึมที่ใช้ในเวลาพูดแต่ตัวแรกถือว่าไม่มีประสิทธิภาพในขณะที่หลังมีประสิทธิภาพ ตรรกะอยู่ที่ไหน! n 80nlognnlog⁡nn^{\log n}n80n80n^{80} (ก) สมมติตัวอย่างเช่นจำนวนของอะตอมในจักรวาลจะอยู่ที่ประมาณ{80}1080108010^{80}

6
การจัดการกับการล่วงล้ำ: ปัญหา NP-complete
สมมติว่าฉันเป็นโปรแกรมเมอร์และฉันมีปัญหาที่สมบูรณ์แบบที่ฉันต้องแก้ปัญหา มีวิธีการใดบ้างที่สามารถจัดการกับปัญหา NPC มีแบบสำรวจหรืออะไรที่คล้ายกันในหัวข้อนี้?

3
อัลกอริธึมแบบแฟคทอเรียลมีประสิทธิภาพมากกว่าการคูณแบบไร้เดียงสา
ฉันรู้วิธีเขียนโค้ดสำหรับแฟคทอเรียลที่ใช้ทั้งแบบวนซ้ำและวนซ้ำ (เช่นn * factorial(n-1)สำหรับตัวอย่าง) ฉันอ่านในตำราเรียน (โดยไม่ได้รับคำอธิบายเพิ่มเติมใด ๆ ) ว่ามีวิธีที่มีประสิทธิภาพยิ่งขึ้นในการเขียนโปรแกรมสำหรับแฟคทอเรียลด้วยการแบ่งครึ่งแบบวนซ้ำ ฉันเข้าใจว่าทำไมถึงเป็นเช่นนั้น อย่างไรก็ตามฉันต้องการลองเขียนโค้ดด้วยตัวเองและฉันไม่คิดว่าจะเริ่มต้นอย่างไร เพื่อนแนะนำให้ฉันเขียนเคสพื้นฐานก่อน และฉันกำลังคิดที่จะใช้อาร์เรย์เพื่อให้ฉันสามารถติดตามตัวเลข ... แต่ฉันไม่เห็นวิธีการออกแบบรหัสดังกล่าว ฉันควรค้นคว้าเทคนิคแบบใด

5
การเพิ่มองค์ประกอบให้กับอาร์เรย์ที่เรียงลำดับ
อะไรจะเป็นวิธีที่เร็วที่สุดในการทำสิ่งนี้ (จากมุมมองอัลกอริทึมเช่นเดียวกับเรื่องจริง) ฉันกำลังคิดอะไรบางอย่างตามบรรทัดต่อไปนี้ ฉันสามารถเพิ่มในตอนท้ายของอาร์เรย์แล้วใช้ bubbleort เนื่องจากมีกรณีที่ดีที่สุด (เรียงลำดับทั้งหมดตอนเริ่มต้น) ที่อยู่ใกล้กับนี้และมีเวลาทำงานเชิงเส้น (ในกรณีที่ดีที่สุด) ในทางกลับกันถ้าฉันรู้ว่าฉันเริ่มต้นด้วยอาร์เรย์ที่เรียงลำดับฉันสามารถใช้การค้นหาแบบไบนารีเพื่อค้นหาจุดแทรกสำหรับองค์ประกอบที่กำหนด ลางสังหรณ์ของฉันคือวิธีที่สองเกือบจะดีที่สุด แต่อยากรู้ว่ามีอะไรเกิดขึ้นบ้าง วิธีนี้ทำได้ดีที่สุด?

7
อัลกอริทึม (และประสิทธิภาพโดยทั่วไป) มีความสำคัญน้อยลงหรือไม่?
เนื่องจากความสามารถในการคำนวณการซื้อมีราคาไม่แพงมากในอดีตความรู้เกี่ยวกับอัลกอริธึมและการมีประสิทธิภาพมีความสำคัญน้อยลงหรือไม่? เป็นที่ชัดเจนว่าคุณต้องการหลีกเลี่ยงการวนซ้ำไม่สิ้นสุดดังนั้นทุกอย่างจะไม่เกิดขึ้น แต่ถ้าคุณมีฮาร์ดแวร์ที่ดีกว่าคุณมีซอฟต์แวร์ที่แย่กว่านี้ได้ไหม?
29 efficiency 

3
เหตุใดการเรียงลำดับการเลือกจึงเร็วกว่าการจัดเรียงฟอง
มันเขียนไว้ใน Wikipediaว่า "... การเรียงลำดับการเลือกเกือบจะดีกว่าการเรียงลำดับฟองและเรียงลำดับคำพังเพย" ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมการเรียงลำดับการเลือกจึงถือว่าเร็วกว่าการเรียงลำดับฟองแม้ว่าทั้งคู่จะมี: ความซับซ้อนของเวลากรณีที่แย่ที่สุด :O ( n2)O(n2)\mathcal O(n^2) จำนวนการเปรียบเทียบ : O ( n2)O(n2)\mathcal O(n^2) ความซับซ้อนของเวลากรณีที่ดีที่สุด : การจัดเรียงฟอง:O (n)O(n)\mathcal O(n) ตัวเลือกการเรียง:O ( n2)O(n2)\mathcal O(n^2) ความซับซ้อนของเวลากรณีโดยเฉลี่ย : การจัดเรียงฟอง:O ( n2)O(n2)\mathcal O(n^2) ตัวเลือกการเรียง:O ( n2)O(n2)\mathcal O(n^2)

2
โครงสร้างข้อมูลแผนที่ที่มีประสิทธิภาพรองรับการค้นหาโดยประมาณ
ฉันกำลังมองหาโครงสร้างข้อมูลที่สนับสนุนการค้นหาคีย์โดยประมาณอย่างมีประสิทธิภาพ (เช่นระยะทางของ Levenshtein สำหรับสตริง) โดยคืนค่าการจับคู่ที่ใกล้เคียงที่สุดสำหรับคีย์อินพุต โครงสร้างข้อมูลที่เหมาะสมที่สุดที่ฉันเคยพบคือต้นไม้ Burkhard-Kellerแต่ฉันสงสัยว่ามีโครงสร้างข้อมูลอื่น ๆ / ดีกว่าสำหรับจุดประสงค์นี้ แก้ไข: รายละเอียดเพิ่มเติมเกี่ยวกับกรณีเฉพาะของฉัน: สายอักขระมักจะมีความแตกต่างกันมากในระดับที่ค่อนข้างใหญ่ สตริงมีความยาวสูงสุดประมาณ 20-30 ตัวอักษรโดยมีค่าเฉลี่ยใกล้เคียงกับ 10-12 ฉันสนใจในการค้นหาที่มีประสิทธิภาพมากกว่าการแทรกเนื่องจากฉันจะสร้างชุดข้อมูลสแตติกส่วนใหญ่ที่ฉันต้องการค้นหาอย่างมีประสิทธิภาพ

3
การดึงเส้นทางที่สั้นที่สุดของกราฟแบบไดนามิก
ฉันกำลังศึกษาเส้นทางที่สั้นที่สุดในกราฟกำกับ มีอัลกอริธึมที่มีประสิทธิภาพมากมายสำหรับการค้นหาเส้นทางที่สั้นที่สุดในเครือข่ายเช่น dijkstra's หรือ bellman-ford's แต่ถ้ากราฟเป็นไดนามิก? โดยการพูดแบบไดนามิกฉันหมายความว่าเราสามารถแทรกหรือลบจุดยอดในระหว่างการดำเนินการของโปรแกรม ฉันพยายามที่จะหาขั้นตอนวิธีการที่มีประสิทธิภาพสำหรับการปรับปรุงเส้นทางที่สั้นที่สุดจากจุดสุดยอดทุกจุดสุดยอดอื่น ๆUหลังจากการใส่ขอบอีโดยไม่จำเป็นต้องเรียกใช้อัลกอริทึมเส้นทางที่สั้นที่สุดในกราฟใหม่อีกครั้ง ฉันจะทำสิ่งนี้ได้อย่างไร ขอบคุณล่วงหน้า.vvvuuueee หมายเหตุ:การเปลี่ยนแปลงสามารถทำได้หลังจากการวนซ้ำครั้งแรกของอัลกอริทึม หมายเหตุ [2]: ให้สองโหนดคือต้นทางและtเป้าหมาย ฉันต้องการค้นหาเส้นทางที่สั้นที่สุดระหว่างโหนดเหล่านี้ เมื่อกราฟมีการปรับปรุงฉันมีเพียงแค่การปรับปรุงπ ( s , T )ซึ่งเป็นเส้นทางที่สั้นที่สุดระหว่างsและเสื้อssstttπ(s,t)π(s,t)\pi(s,t)sssttt หมายเหตุ [3]:ฉันสนใจเฉพาะเคสใส่ขอบเท่านั้น ความหมายอย่างเป็นทางการ : ให้กราฟ ) กำหนดดำเนินการปรับปรุงเป็น 1) แทรกของขอบอีเพื่อEหรือ 2) การลบขอบ AA อีจากE วัตถุประสงค์คือการหาค่าใช้จ่ายของเส้นทางที่สั้นที่สุดของคู่ทั้งหมดอย่างมีประสิทธิภาพหลังจากการดำเนินการอัพเดท อย่างมีประสิทธิภาพเราหมายถึงอย่างน้อยก็ดีกว่าดำเนินการอัลกอริทึม All-Pairs-Shortest-Path เช่นอัลกอรึทึมของ Bellman-Ford หลังจากการดำเนินการอัพเดทแต่ละครั้งG=(V,E)G=(V,E)G = (V,E)eeeEEEeeeEEE แก้ไข:ด้านล่างมีปัญหาในเวอร์ชันที่ง่ายขึ้น: กราฟถ่วงน้ำหนักจะได้รับประกอบด้วยขอบทิศทางเดียวและสองจุดสำคัญsและเสื้อ ชุดของขอบสองทิศทางของผู้สมัครจะได้รับเช่นกัน ฉันจะต้องสร้างขอบเพื่อลดระยะทางจากไปทีG(V,E)G(V,E)G(V,E)ssstttCCC(u,v)∈C(u,v)∈C(u,v) \in Csssttt

3
การทดสอบดั้งเดิมของ AKS จะเร็วกว่าการทดสอบอื่น ๆ จริง ๆ เมื่อใด
ฉันพยายามที่จะเข้าใจว่าการทดสอบ AKS primalityควรตีความอย่างไรเมื่อฉันเรียนรู้เช่นข้อพิสูจน์สำหรับการพิสูจน์ว่า PRIMES ⊆ P หรืออัลกอริทึมจริง ๆ สำหรับการทดสอบแบบดั้งเดิมบนคอมพิวเตอร์ การทดสอบมีพหุนาม แต่มีระดับสูงและค่าคงที่สูงที่เป็นไปได้ ดังนั้นในทางปฏิบัติที่nnnไม่ผ่านการทดสอบแบบดั้งเดิมอื่น ๆ ? ที่นี่nnnคือจำนวนหลักของนายกและ "เกิน" หมายถึงรันไทม์โดยประมาณของการทดสอบบนสถาปัตยกรรมคอมพิวเตอร์ทั่วไป ฉันสนใจในอัลกอริธึมที่เทียบเท่ากับการใช้งานซึ่งเป็นสิ่งที่กำหนดได้ซึ่งไม่จำเป็นต้องมีการคาดเดาเพื่อความถูกต้อง นอกจากนี้การใช้การทดสอบดังกล่าวมากกว่าสิ่งอื่น ๆ ที่ใช้งานได้จริงตามข้อกำหนดของหน่วยความจำของการทดสอบหรือไม่

7
องค์ประกอบหนึ่งที่แตกต่างกันในสองอาร์เรย์ วิธีการค้นหาอย่างมีประสิทธิภาพ?
ฉันกำลังเตรียมการสัมภาษณ์การเขียนโปรแกรมและฉันไม่สามารถหาวิธีที่มีประสิทธิภาพที่สุดในการแก้ปัญหานี้ได้ สมมติว่าเรามีสองอาร์เรย์ประกอบด้วยตัวเลขที่ไม่เรียงกัน Array 2 มีหมายเลขที่ Array 1 ไม่มี ทั้งสองอาร์เรย์มีหมายเลขที่ตั้งแบบสุ่มไม่จำเป็นต้องอยู่ในลำดับเดียวกันหรือในดัชนีเดียวกัน ตัวอย่างเช่น: Array 1 [78,11, 143, 84, 77, 1, 26, 35 .... n] Array 2 [11,84, 35, 25, 77, 78, 26, 143 ... 21 ... n + 1] อัลกอริทึมที่เร็วที่สุดสำหรับการค้นหาหมายเลขที่แตกต่างคืออะไร? เวลาทำงานคืออะไร ในตัวอย่างนี้จำนวนที่เราจะค้นหาคือ 21 ความคิดของฉันคือการทำงานผ่าน Array 1 และลบค่านั้นออกจากอาร์เรย์ 2 ซ้ำแล้วซ้ำอีกจนกว่าคุณจะเสร็จสิ้น นี่ควรจะเป็นเวลาประมาณใช่ไหม?O ( n บันทึกn …

3
วิธีที่มีประสิทธิภาพมากที่สุดในการคำนวณแฟคทอเรียลโมดูโลคืออะไร?
คุณรู้จักอัลกอริธึมที่คำนวณแฟคทอเรียลหลังจากโมดูลัสอย่างมีประสิทธิภาพหรือไม่? ตัวอย่างเช่นฉันต้องการโปรแกรม: for(i=0; i<5; i++) sum += factorial(p-i) % p; แต่pเป็นจำนวนมาก (นายก) สำหรับการใช้ปัจจัยโดยตรง8)(p≤108)(p≤108)(p \leq 10^ 8) ใน Python งานนี้ง่ายมาก แต่ฉันอยากรู้วิธีเพิ่มประสิทธิภาพ

6
การหาค่า XOR สูงสุดของตัวเลขสองตัวในช่วงเวลาหนึ่ง: เราจะทำได้ดีกว่าสมการกำลังสองหรือไม่?
สมมติว่าเรากำลังได้รับสองหมายเลขและและที่เราต้องการที่จะหาสำหรับL \ le i, \, J \ le Rlllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r อัลกอริทึมnaïveเพียงตรวจสอบคู่ที่เป็นไปได้ทั้งหมด เช่นในทับทิมเรามี: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end ฉันรู้สึกว่าเราสามารถทำได้ดีกว่าสมการกำลังสอง มีอัลกอริทึมที่ดีกว่าสำหรับปัญหานี้หรือไม่?

2
ขั้นตอน "หาร" ในการเรียงแบบผสานสามารถหลีกเลี่ยงได้หรือไม่
การเรียงลำดับผสานจึงเป็นอัลกอริธึมการแบ่งและพิชิต ขณะที่ฉันดูแผนภาพข้างต้นฉันคิดว่าถ้าเป็นไปได้ที่จะข้ามขั้นตอนหารทั้งหมด หากคุณวนซ้ำอาร์เรย์เดิมในขณะที่กระโดดสองครั้งคุณจะได้รับองค์ประกอบที่ index i และ i + 1 และใส่เข้าไปในอาร์เรย์ที่เรียงลำดับของตัวเอง เมื่อคุณมีอาร์เรย์ย่อยทั้งหมดเหล่านี้ ([7,14], [3,12], [9,11] และ [2,6] ดังที่แสดงในแผนภาพ) คุณสามารถดำเนินการตามปกติตามปกติเพื่อรับ อาร์เรย์ที่เรียงลำดับ วนซ้ำผ่านอาร์เรย์และสร้างอาร์เรย์ย่อยที่จำเป็นในทันทีมีประสิทธิภาพน้อยกว่าการดำเนินการตามขั้นตอนหารอย่างครบถ้วนหรือไม่

7
เราสามารถพูดได้ว่า DFA มีประสิทธิภาพมากกว่า NFA หรือไม่
ฉันเพิ่งเริ่มอ่านเกี่ยวกับทฤษฎีการคำนวณ ถ้าเราเปรียบเทียบว่าอันไหนมีพลังมากกว่า (ในการรับสาย) ทั้งคู่ก็เหมือนกัน แต่สิ่งที่เกี่ยวกับประสิทธิภาพ DFA จะถูกเปรียบเทียบอย่างรวดเร็วกับ NFA เนื่องจากมีเพียงหนึ่งขอบขาออกและจะไม่มีความคลุมเครือ แต่ในกรณีของ NFA เราต้องตรวจสอบทุกกรณีที่เป็นไปได้ & นั่นต้องใช้เวลาแน่นอน ดังนั้นเราสามารถพูดได้ว่า DFA มีประสิทธิภาพมากกว่า NFA หรือไม่ แต่สมองอีกส่วนหนึ่งของฉันก็กำลังคิดว่า NFA มีอยู่ในทางทฤษฎีเท่านั้นดังนั้นเราจึงไม่สามารถเปรียบเทียบประสิทธิภาพกับ DFA ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.