n * log n และ n / log n เทียบกับเวลาที่ใช้พหุนาม


14

ผมเข้าใจว่าจะเร็วกว่าΘ ( n log n )และช้ากว่าΘ ( n / log n ) อะไรคือสิ่งที่ยากสำหรับผมที่จะเข้าใจวิธีการที่จริงเปรียบเทียบΘ ( n log n )และΘ ( n / log n )กับΘ ( n )ที่0 < < 1Θ(n)Θ(nlogn)Θ(n/logn)Θ(nlogn)Θ(n/logn)Θ(nf)0<f<1

ตัวอย่างเช่นวิธีที่เราจะตัดสินใจเทียบกับΘ ( n 2 / 3 )หรือΘ ( n 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

ฉันต้องการมีทิศทางต่อการดำเนินการในกรณีเช่นนี้ ขอบคุณ.

คำตอบ:


3

หากคุณวาดกราฟสองสามกราฟคุณจะมีรูปร่างที่ดี Wolfram Alpha เป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการตรวจสอบประเภทนี้:

สมการ

กราฟ

สร้างโดยลิงค์นี้ โปรดสังเกตว่าในกราฟ log (x) เป็นลอการิทึมธรรมชาติซึ่งเป็นเหตุผลที่สมการของกราฟหนึ่งดูตลกเล็กน้อย



นอกเหนือจากการยอมรับกราฟิลส์แล้วรูปภาพนี้ยังให้แนวคิดที่ดีกว่าการเลือกช่วงที่กว้างขึ้นทำให้ฟังก์ชั่นที่สองหายไปซึ่งอาจทำให้เกิดความสับสน
phant0m

9

เป็นสิ่งที่ตรงกันข้ามของ 2 n เช่นเดียวกับที่ 2 nเติบโตเร็วกว่าพหุนามใด ๆ n kโดยไม่คำนึงว่าขนาดใหญ่ของ kคือเท่าใดก็ตาม log nจะเติบโตช้ากว่าฟังก์ชันพหุนามใด ๆ n kโดยไม่คำนึงว่าขนาดเล็กเป็นศูนย์บวก kคือเท่าใดlogn2n2nnkklognnkk

n/lognnkk<1n/lognn/n1k

n1k>lognnn/logn>nkk<1n


3

สำหรับอัลกอริธึมหลายครั้งบางครั้งมันก็เกิดขึ้นว่าค่าคงที่แตกต่างกันทำให้หนึ่งหรืออื่นเร็วหรือช้าลงสำหรับขนาดข้อมูลที่เล็กลงและไม่ได้รับคำสั่งจากความซับซ้อนของอัลกอริธึม

ต้องบอกว่าถ้าเราพิจารณาขนาดข้อมูลที่ใหญ่เป็นพิเศษเช่น ซึ่งหนึ่งในที่สุดก็ชนะแล้วO(n^f)จะเร็วกว่าสำหรับO(n/log n)0 < f < 1

ส่วนใหญ่ของความซับซ้อนอัลกอริทึมคือการกำหนดอัลกอริทึมที่เร็วที่สุดดังนั้นการรู้ว่าO(n^f)เร็วกว่าO(n/log n)สำหรับ0 < f < 1มักจะเพียงพอ

กฎทั่วไปคือคูณ (หรือหาร) โดยlog nในที่สุดจะมีเพียงเล็กน้อยเมื่อเทียบกับการคูณ (หรือหาร) โดยสำหรับการใด ๆn^ff > 0

เพื่อแสดงให้เห็นชัดเจนยิ่งขึ้นให้เราพิจารณาว่าจะเกิดอะไรขึ้นเมื่อ n เพิ่มขึ้น

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

แจ้งให้ทราบล่วงหน้าซึ่งลดลงอย่างรวดเร็วมากขึ้น? มันคือn^fคอลัมน์

แม้ว่าจะfอยู่ใกล้กับ 1 มากขึ้นn^fคอลัมน์ก็จะเริ่มช้าลง แต่เมื่อ n เป็นสองเท่าอัตราการเปลี่ยนแปลงของตัวส่วนจะเพิ่มขึ้นในขณะที่ตัวส่วนของn/log nคอลัมน์จะเปลี่ยนในอัตราคงที่

ให้เราพล็อตกรณีเฉพาะบนกราฟ

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ที่มา: Wolfram Alpha

ฉันเลือกแบบO(n^k)ที่kค่อนข้างใกล้ถึง 1 (ที่0.9) ฉันยังเลือกค่าคงที่เพื่อเริ่มO(n^k)ช้าลง แต่แจ้งให้ทราบว่าในที่สุดก็ "ชนะ" O(n/log n)ในที่สุดและใช้เวลาน้อยกว่า


แล้ว n / log n

นั่นเป็นความผิดพลาดเล็กน้อยนั่นคือสิ่งที่ฉันต้องการในตอนแรก อย่างไรก็ตามฉันได้เพิ่มกราฟที่เหมาะสมยิ่งขึ้นซึ่งแสดงให้เห็นว่าn^kเร็วขึ้นถึงแม้ว่าค่าคงที่จะถูกเลือกเช่นนั้นจะช้าลงในตอนแรก

3

nfnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

เมื่อเปรียบเทียบเวลาที่ใช้งานจะเป็นประโยชน์เมื่อเปรียบเทียบโดยใช้ค่าใหญ่ของ n สำหรับฉันสิ่งนี้จะช่วยสร้างสัญชาตญาณว่าฟังก์ชั่นใดจะช้ากว่ากัน

ในกรณีของคุณให้คิดถึง n = 10 ^ 10 และ a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

ดังนั้น O (n ^ a) เร็วกว่า O (n / logn) เมื่อ 0 <a <1 ฉันใช้เพียงหนึ่งค่าอย่างไรก็ตามคุณสามารถใช้หลายค่าเพื่อสร้างสัญชาตญาณเกี่ยวกับฟังก์ชัน


1
อย่าเขียนO(10^9)แต่ประเด็นหลักเกี่ยวกับการลองใช้ตัวเลขเพื่อสร้างสัญชาตญาณนั้นถูกต้อง

ล้มเหลว. สิ่งนี้ไม่ถูกต้อง คุณแทนที่ค่าคงที่ n เดียวซึ่งอาจมีอคติ ถ้าฉันเลือกค่าคงที่ต่างกันฉันสามารถทำให้อัลกอริทึมใด ๆ ดูดีขึ้นได้ สัญลักษณ์บิ๊กโอถูกใช้เพื่อสร้างแนวโน้มในสิ่งที่จะเร็วขึ้นในระยะยาว ในการทำเช่นนี้คุณจะต้องสามารถแสดงให้เห็นว่ามันเร็วกว่าสำหรับ n ขนาดใหญ่แม้ว่ามันจะช้ากว่าเมื่อ n มีขนาดเล็กลง

ขอบคุณ เพิ่มค่าหลายค่าในส่วนและพิจารณาตัวเลขที่ใหญ่กว่า

ควรสังเกตว่าเนื่องจาก f (a)> g (a) สำหรับค่าคงที่ a ไม่จำเป็นต้องหมายความว่า O (f (x))> O (g (x)) สิ่งนี้มีประโยชน์ในการสร้างสัญชาตญาณ แต่ไม่เพียงพอที่จะสร้างหลักฐานที่เข้มงวด ในการแสดงว่าความสัมพันธ์นี้มีอยู่คุณต้องแสดงให้เห็นว่าสิ่งนี้เป็นจริงสำหรับ n ทั้งหมดที่มีขนาดใหญ่ เช่นเดียวกันคุณต้องแสดงให้เห็นว่าเป็นจริงสำหรับพหุนามทั้งหมดที่มีค่าเป็นบวก <1

1

fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

นำไปใช้กับตัวอย่างของคุณ:

O(n/logn)(1,1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

คุณสามารถพูดได้ว่า: พลังแห่ง n ครองอำนาจของบันทึกซึ่งครองอำนาจของบันทึก

ที่มา: คณิตศาสตร์คอนกรีตหน้า 441

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