คำถามติดแท็ก runtime-analysis

คำถามเกี่ยวกับวิธีการประเมินการเพิ่มขึ้นของรันไทม์ของอัลกอริทึมเมื่อขนาดอินพุตเพิ่มขึ้น

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

4
(เมื่อใด) คือการค้นหาตารางแฮช O (1)?
มักจะกล่าวว่าการค้นหาตารางแฮชทำงานในเวลาคงที่: คุณคำนวณค่าแฮชซึ่งให้ดัชนีสำหรับการค้นหาอาร์เรย์ แต่สิ่งนี้ไม่สนใจการชน ในกรณีที่เลวร้ายที่สุดทุกรายการเกิดขึ้นในถังเดียวกันและเวลาค้นหากลายเป็นเชิงเส้น ( )Θ(n)Θ(n)\Theta(n) มีเงื่อนไขเกี่ยวกับข้อมูลที่สามารถทำการค้นหาตารางแฮชอย่างแท้จริงหรือไม่ เป็นค่าเฉลี่ยเท่านั้นหรือตารางแฮชมีค้นหาตัวพิมพ์ที่เลวร้ายที่สุด?O ( 1 )O(1)O(1)O(1)O(1)O(1)O(1) หมายเหตุ: ฉันมาจากมุมมองของโปรแกรมเมอร์ที่นี่ เมื่อฉันเก็บข้อมูลในตารางแฮชมันมักจะเป็นสตริงหรือโครงสร้างข้อมูลคอมโพสิตบางส่วนและข้อมูลจะเปลี่ยนแปลงในช่วงอายุของตารางแฮช ดังนั้นในขณะที่ฉันชื่นชมคำตอบเกี่ยวกับแฮ็กที่สมบูรณ์แบบพวกเขาน่ารัก แต่เป็นข้อมูลเล็ก ๆ น้อย ๆ และไม่สามารถใช้งานได้จริงจากมุมมองของฉัน การติดตามผล PS: ข้อมูลประเภทใดที่มีการดำเนินการตารางแฮช O (1)

5
อัลกอริทึมการเรียงลำดับนี้เป็นอย่างไร³ (n³) และไม่Θ (n²) เป็นกรณีที่เลวร้ายที่สุด?
ฉันเพิ่งเริ่มเรียนหลักสูตรโครงสร้างข้อมูลและอัลกอริธึมและผู้ช่วยสอนของฉันให้รหัสหลอกต่อไปนี้สำหรับการเรียงลำดับอาร์เรย์ของจำนวนเต็ม: void F3() { for (int i = 1; i < n; i++) { if (A[i-1] > A[i]) { swap(i-1, i) i = 0 } } } อาจไม่ชัดเจน แต่ที่นี่คือขนาดของอาร์เรย์ที่เราพยายามเรียงลำดับnnnA ในกรณีใด ๆ ผู้ช่วยสอนอธิบายให้ชั้นเรียนรู้ว่าอัลกอริทึมนี้อยู่ในเวลา (แย่ที่สุดฉันเชื่อ) แต่ไม่ว่าฉันจะผ่านมันไปกี่ครั้งด้วยอาเรย์เรียงกลับด้าน มันดูเหมือนว่าฉันที่มันควรจะเป็นและไม่ได้3)Θ(n3)Θ(n3)\Theta(n^3)Θ(n2)Θ(n2)\Theta(n^2)Θ(n3)Θ(n3)\Theta(n^3) คนที่จะสามารถอธิบายให้ฉันทำไมนี้เป็นΘ(n3)Θ(n3)Θ(n^3)และไม่Θ(n2)Θ(n2)Θ(n^2) ?

3
ทำไมการค้นหาแบบไบนารี่จึงเร็วกว่าการค้นหาแบบไตรภาค
การค้นหาอาเรย์ขององค์ประกอบโดยใช้การค้นหาแบบไบนารี่จะใช้เวลาในกรณีที่ซ้ำที่สุดการทำซ้ำเพราะในแต่ละขั้นตอนเราตัดแบ่งครึ่งของพื้นที่การค้นหาของเรา หากเราใช้ 'การค้นหาแบบไตรภาค' แทนเราจะตัดพื้นที่การค้นหาของเราสองในสามในแต่ละการวนซ้ำดังนั้นกรณีที่แย่ที่สุดควรใช้การซ้ำ ...log 2 N log 3 N &lt; log 2 NNNNlog2Nlog2⁡N\log_2 Nlog3N&lt;log2Nlog3⁡N&lt;log2⁡N\log_3 N < \log_2 N ดูเหมือนว่าการค้นหาแบบไตรภาคเร็วกว่าแล้วทำไมเราถึงใช้การค้นหาแบบไบนารี่?

3
ความซับซ้อนของอัลกอริทึมเป็นแบบจำลองสำหรับภาษาที่ใช้งานได้อย่างไร
ความซับซ้อนของอัลกอริทึมได้รับการออกแบบให้ไม่ขึ้นกับรายละเอียดในระดับที่ต่ำกว่า แต่ขึ้นอยู่กับโมเดลที่จำเป็นเช่นการเข้าถึงอาร์เรย์และการแก้ไขโหนดในทรีใช้เวลา O (1) นี่ไม่ใช่กรณีในภาษาที่ใช้งานได้จริง รายการ Haskell ใช้เวลาเชิงเส้นในการเข้าถึง การแก้ไขโหนดในทรีเกี่ยวข้องกับการสร้างสำเนาใหม่ของทรี ควรมีแบบจำลองทางเลือกของความซับซ้อนของอัลกอริทึมสำหรับภาษาที่ใช้งานได้หรือไม่?

2
เหตุใดบันทึกใน big-O ของการค้นหาแบบไบนารีจึงไม่ได้เป็นฐาน 2
ฉันยังใหม่กับการเข้าใจอัลกอริทึมวิทยาศาสตร์คอมพิวเตอร์ ฉันเข้าใจกระบวนการค้นหาแบบไบนารี แต่ฉันมีความเข้าใจผิดเล็กน้อยเกี่ยวกับประสิทธิภาพ ในขนาดขององค์ประกอบมันจะใช้เวลาโดยเฉลี่ยnขั้นตอนในการค้นหาองค์ประกอบเฉพาะ การฐาน 2 ลอการิทึมของอัตราผลตอบแทนที่ทั้งสองฝ่ายเข้าสู่ระบบ2 ( s ) = n ดังนั้นจะไม่ค่าเฉลี่ยของจำนวนขั้นตอนสำหรับการค้นหาแบบทวิภาคจะเข้าสู่ระบบ2 ( s ) ?s = 2ns=2ns = 2^nnnnเข้าสู่ระบบ2( s ) = nlog2⁡(s)=n\log_2(s) = nเข้าสู่ระบบ2( s )log2⁡(s)\log_2(s) บทความนี้วิกิพีเดียในการค้นหาแบบทวิภาคกล่าวว่าผลการดำเนินงานเฉลี่ย ) ทำไมเป็นเช่นนี้ ทำไมไม่ได้หมายเลขนี้เข้าสู่ระบบ2 ( n ) ?O ( บันทึกn )O(log⁡n)O(\log n)เข้าสู่ระบบ2( n )log2⁡(n)\log_2(n)

3
ฮาร์ดแวร์ / การนำไปใช้จะมีผลต่อความซับซ้อนของเวลา / พื้นที่ของอัลกอริทึมหรือไม่
ฉันไม่ใช่นักเรียน CS ดังนั้นนี่อาจเป็นคำถามที่โง่ แต่โปรดอดทนกับฉัน ... ในยุคก่อนคอมพิวเตอร์เราสามารถใช้โครงสร้างข้อมูลอาเรย์กับบางอย่างเช่นอาเรย์ของลิ้นชักเท่านั้น เนื่องจากต้องระบุตำแหน่งลิ้นชักด้วยดัชนีที่สอดคล้องกันก่อนที่จะแยกค่าออกมาความซับซ้อนของเวลาในการค้นหาอาร์เรย์คือโดยสมมติว่าเป็นการค้นหาแบบไบนารีO ( l o g( n ) )O(log(n))O(log(n)) อย่างไรก็ตามการประดิษฐ์คอมพิวเตอร์สร้างความแตกต่างใหญ่ คอมพิวเตอร์สมัยใหม่สามารถอ่านจาก RAM ได้อย่างรวดเร็วจนตอนนี้เราพิจารณาความซับซ้อนของเวลาในการค้นหาอาร์เรย์เป็น (แม้จะไม่ใช่ในทางเทคนิคเพราะมันใช้เวลามากขึ้นในการย้ายรีจิสเตอร์ในระยะไกล ฯลฯ )O ( 1 )O(1)O(1) อีกตัวอย่างหนึ่งคือพจนานุกรม Python ขณะที่หนึ่งอาจได้รับการเข้าถึงความซับซ้อนในพจนานุกรมของกับป่วยเป็นลายลักษณ์อักษรมากเกินไปวิธีมายากล (หรือขันโชคร้ายคือกุญแจมีจำนวนมากของการชนกัญชา) ก็มักจะสันนิษฐานว่าเป็นO ( 1 ) ในกรณีนี้ความซับซ้อนของเวลาขึ้นอยู่กับการใช้งานตารางแฮชของพจนานุกรม Python และการใช้ฟังก์ชั่นแฮชของคีย์O(n)O(n)O(n)__hash__O(1)O(1)O(1) สิ่งนี้หมายความว่าฮาร์ดแวร์ / การนำไปใช้นั้นมีผลต่อความซับซ้อนของเวลาของอัลกอริทึมหรือไม่? (ในขณะที่ทั้งสองตัวอย่างเป็นเรื่องเกี่ยวกับโครงสร้างข้อมูลแทนที่จะเป็นอัลกอริธึม แต่ตัวหลังถูกสร้างขึ้นในอดีตและฉันไม่เคยได้ยินเรื่องความซับซ้อนของเวลาในโครงสร้างข้อมูลดังนั้นฉันจึงใช้คำว่า "อัลกอริทึม" ที่นี่) สำหรับฉันแล้วอัลกอริธึมเป็นนามธรรมและแนวคิดซึ่งคุณสมบัติเช่นความซับซ้อนของเวลา / พื้นที่ไม่ควรได้รับผลกระทบจากการใช้งานในลักษณะที่เฉพาะเจาะจงหรือไม่

2
เหตุใด C ประเภทโมฆะจึงไม่คล้ายกับประเภทที่ว่าง / ด้านล่าง
Wikipedia ตลอดจนแหล่งข้อมูลอื่น ๆ ที่ฉันได้พบรายการvoidประเภทC เป็นหน่วยประเภทซึ่งตรงข้ามกับประเภทที่ว่างเปล่า ฉันพบว่ามันสับสนเพราะฉันคิดว่าvoidเหมาะกับนิยามของประเภทที่ว่าง / ล่าง ไม่มีค่านิยมใด ๆ อยู่voidเท่าที่ฉันจะบอกได้ ฟังก์ชั่นที่มีประเภทคืนค่าเป็นโมฆะระบุว่าฟังก์ชั่นจะไม่ส่งคืนสิ่งใดดังนั้นจึงสามารถทำงานได้เพียงผลข้างเคียงเท่านั้น ตัวชี้ชนิดvoid*เป็นชนิดย่อยของชนิดตัวชี้อื่นทั้งหมด นอกจากนี้การแปลงไปยังและจากvoid*ใน C นั้นเป็นนัย ผมไม่แน่ใจว่าถ้าจุดสุดท้ายมีบุญใด ๆ ที่เป็นข้อโต้แย้งสำหรับvoidการเป็นประเภทที่ว่างเปล่าเป็นมากหรือน้อยเป็นกรณีพิเศษที่มีความสัมพันธ์ไม่มากที่จะvoid*void ในทางกลับกันvoidตัวมันเองไม่ใช่ประเภทย่อยของประเภทอื่นทั้งหมดซึ่งเท่าที่ฉันสามารถบอกได้ว่าเป็นข้อกำหนดสำหรับประเภทที่จะเป็นประเภทด้านล่าง
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

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)

3
ฟังก์ชั่นที่มีการเติบโตช้ากว่า Ackermann ผกผันปรากฏในขอบเขตรันไทม์หรือไม่?
อัลกอริธึมที่ซับซ้อนบางอย่าง ( ยูเนี่ยน - พบ ) มีฟังก์ชัน Ackermann ผกผันเกือบคงที่ที่ปรากฏในความซับซ้อนของเวลาแบบอะซิมโทติคและเป็นเวลาที่เลวร้ายที่สุดกรณีที่เหมาะสมที่สุดถ้าเทอม Ackermann ผกผันเกือบคงที่ มีตัวอย่างของอัลกอริธึมที่ทราบพร้อมเวลาทำงานที่เกี่ยวข้องกับฟังก์ชันที่เติบโตช้ากว่า Invermann หรือไม่ (เช่นผู้บุกรุกฟังก์ชันที่ไม่เทียบเท่า Ackermann ภายใต้พหุนามหรือเอกซ์โปเนนเชียล ฯลฯ ) ที่ให้เวลากรณีเลวร้ายที่สุด ซับซ้อนในการแก้ปัญหาพื้นฐานหรือไม่

2
จะอธิบายอัลกอริทึมพิสูจน์และวิเคราะห์ได้อย่างไร
ก่อนอ่านศิลปะการเขียนโปรแกรมคอมพิวเตอร์ (TAOCP)ฉันไม่ได้พิจารณาคำถามเหล่านี้อย่างลึกซึ้ง ฉันจะใช้รหัสเทียมเพื่ออธิบายอัลกอริทึมเข้าใจพวกเขาและประเมินเวลาทำงานเฉพาะเกี่ยวกับคำสั่งของการเติบโต TAOCPอย่างทั่วถึงการเปลี่ยนแปลงความคิดของฉัน TAOCPใช้ภาษาอังกฤษผสมกับขั้นตอนและข้ามไปเพื่ออธิบายอัลกอริทึมและใช้แผนภูมิการไหลเพื่อให้เห็นอัลกอริธึมได้ง่ายขึ้น ดูเหมือนว่าจะอยู่ในระดับต่ำ แต่ฉันพบว่ามีข้อได้เปรียบบางอย่างโดยเฉพาะอย่างยิ่งกับแผนภูมิการไหลซึ่งฉันไม่สนใจมาก เราสามารถติดฉลากลูกศรแต่ละอันด้วยการยืนยันเกี่ยวกับสถานะปัจจุบันของกิจการในเวลาที่การคำนวณสำรวจลูกศรนั้นและทำการพิสูจน์อุปนัยสำหรับอัลกอริทึม ผู้เขียนพูดว่า: มันเป็นความขัดแย้งของผู้เขียนที่เราเข้าใจจริง ๆ ว่าทำไมอัลกอริธึมจึงถูกต้องเฉพาะเมื่อเราไปถึงจุดที่ความคิดของเราเติมเต็มโดยนัยในการยืนยันทั้งหมดตามที่ทำในรูปที่ 4 ฉันไม่เคยเจอเรื่องแบบนี้เลย ข้อดีอีกอย่างคือเราสามารถนับจำนวนครั้งที่ดำเนินการแต่ละขั้นตอน ง่ายต่อการตรวจสอบกับกฎข้อแรกของ Kirchhoff ฉันไม่ได้วิเคราะห์เวลาทำงานอย่างแน่นอนดังนั้นบางส่วนอาจถูกตัดออกเมื่อฉันประเมินเวลาทำงาน± 1±1\pm1 การวิเคราะห์คำสั่งของการเติบโตบางครั้งก็ไร้ประโยชน์ ตัวอย่างเช่นเราไม่สามารถแยกแยะ quicksort จาก heapsort ได้เนื่องจากทั้งหมดคือโดยที่คือจำนวนสุ่มตัวแปรคาดหวังดังนั้นเราควรวิเคราะห์ค่าคงที่พูดและE (T_2 (n)) = A_2 \ lg n + B_2n + O (\ log n)ดังนั้นเราสามารถเปรียบเทียบT_1และT_2ดีกว่า และบางครั้งเราควรเปรียบเทียบปริมาณอื่น ๆ เช่นความแปรปรวน การวิเคราะห์คำสั่งซื้อของการเจริญเติบโตของเวลาทำงานเท่านั้นไม่เพียงพอ ในฐานะที่เป็นTAOCPE X X E ( T 1 …

5
การเรียกซ้ำ Collatz ทำงานนานเท่าใด
ฉันมีรหัส Python ดังต่อไปนี้ def collatz(n): if n &lt;= 1: return True elif (n%2==0): return collatz(n/2) else: return collatz(3*n+1) เวลาทำงานของอัลกอริทึมนี้คืออะไร ลอง: ถ้าหมายถึงเวลาทำงานของฟังก์ชั่น จากนั้นฉันคิดว่าฉันมี T(n)T(n)T(n)collatz(n)⎧⎩⎨T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd{T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd\begin{cases} T(n)=1 \text{ for } n\le 1\\ T(n)=T(n/2) \text{ for } n\text{ …

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

4
เหตุใด Quickized Quicksort จึงมีค่าใช้จ่ายรันไทม์ที่แย่ที่สุดในกรณี O (n log n)
การจัดเรียงแบบด่วนแบบสุ่มเป็นส่วนขยายของการเรียงแบบด่วนซึ่งองค์ประกอบของเดือยจะถูกเลือกแบบสุ่ม สิ่งที่สามารถซับซ้อนเวลากรณีที่เลวร้ายที่สุดของอัลกอริทึมนี้ ตามที่ผมมันควรจะเป็นO(n2)O(n2)O(n^2)เป็นกรณีที่เลวร้ายที่สุดที่เกิดขึ้นเมื่อหมุนสุ่มเลือกถูกเลือกในเรียงหรือเรียงย้อนกลับการสั่งซื้อ แต่ในบางตำรา [1] [2]ความซับซ้อนของเวลากรณีที่เลวร้ายที่สุดถูกเขียนเป็นO(nlogn)O(nlog⁡n)O(n\log{n}) ถูกต้องอะไร

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

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