มีอัลกอริทึม O (1 / n) หรือไม่?


335

มีอัลกอริทึม O (1 / n) หรือไม่?

หรือสิ่งอื่นใดที่น้อยกว่า O (1)


คำถามส่วนใหญ่ถือว่าคุณหมายถึง "มีอัลกอริทึมใด ๆ ที่มีความซับซ้อนของเวลา O (1 / n) หรือไม่" เราจะสมมติว่าเป็นกรณีนี้หรือไม่? Big-O (และ Big-Theta ฯลฯ ) อธิบายถึงฟังก์ชั่นไม่ใช่อัลกอริทึม (ฉันรู้ว่าไม่มีความเท่าเทียมกันระหว่างฟังก์ชั่นและอัลกอริธึม)
jyoungdev

4
นั่นคือคำจำกัดความที่เข้าใจกันโดยทั่วไปของอัลกอริทึม "O (X)" ในวิทยาศาสตร์คอมพิวเตอร์: อัลกอริทึมที่มีความซับซ้อนของเวลาคือ O (X) (สำหรับบางนิพจน์ X)
David Z

2
ฉันเคยได้ยินเรื่องนี้ในกรณีของอัลกอริทึมการจัดลำดับความสำคัญที่มีประสิทธิภาพของ I / O โดยใช้บัฟเฟอร์ทรี ในต้นไม้บัฟเฟอร์ทุกการดำเนินการใช้ O (1 / B) I / Os; โดยที่ B คือขนาดบล็อก และ I / Os ทั้งหมดสำหรับการดำเนินการnคือ O (n / B.log (ฐาน M / B) (n / B)) โดยที่ส่วนบันทึกคือความสูงของทรีบัฟเฟอร์
CODError

มีอัลกอริทึมมากมายที่มีความน่าจะเป็นข้อผิดพลาด O (1 / n) ตัวอย่างเช่นตัวกรอง Bloom พร้อมถัง O (n log n)
โทมัส Ahle

คุณไม่สามารถวางไข่ได้เร็วขึ้นด้วยการเพิ่มไก่
Wyck

คำตอบ:


310

คำถามนี้ไม่ได้โง่อย่างที่คิด อย่างน้อยในทางทฤษฎีบางสิ่งบางอย่างเช่นO (1 / n ) มีเหตุผลอย่างสมบูรณ์เมื่อเราใช้นิยามทางคณิตศาสตร์ของสัญลักษณ์Big O :

ตอนนี้คุณสามารถใช้แทนได้อย่างง่ายดายกรัม ( x ) สำหรับ 1 / x ... มันเห็นได้ชัดว่าคำนิยามดังกล่าวข้างต้นยังคงถือสำหรับบางฉ

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

def get_faster(list):
    how_long = (1 / len(list)) * 100000
    sleep(how_long)

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

แต่มีอยู่ในความเป็นจริงขั้นตอนวิธีการที่แท้จริงของโลกที่รันไทม์สามารถลด (อย่างน้อยบางส่วน) เมื่อป้อนข้อมูลมีขนาดเพิ่มขึ้น โปรดทราบว่าอัลกอริทึมเหล่านี้จะไม่แสดงพฤติกรรมขณะใช้งานด้านล่างO (1) ถึงกระนั้นพวกเขาก็น่าสนใจ ตัวอย่างเช่นใช้ขั้นตอนวิธีการค้นหาข้อความที่ง่ายมากโดยHorspool ที่นี่รันไทม์ที่คาดหวังจะลดลงตามความยาวของรูปแบบการค้นหาเพิ่มขึ้น (แต่การเพิ่มความยาวของกองหญ้าจะเพิ่มรันไทม์อีกครั้ง)


22
'บังคับโดยฮาร์ดแวร์' ยังใช้กับเครื่องทัวริง ในกรณีของ O (1 / n) จะมีขนาดอินพุตที่อัลกอริทึมไม่ควรดำเนินการใด ๆ ดังนั้นฉันจึงคิดว่า O (1 / n) ความซับซ้อนของเวลานั้นเป็นไปไม่ได้ที่จะบรรลุ
Roland Ewald

28
ใช่คุณไม่เข้าใจ สัญกรณ์ O เป็นสิ่งที่เกี่ยวกับขีด จำกัด (ทางเทคนิค Lim sup) เป็น n -> ∞ เวลาทำงานของอัลกอริทึม / โปรแกรมคือจำนวนขั้นตอนในเครื่องบางเครื่องและไม่ต่อเนื่อง - มีขอบเขตไม่ต่ำกว่าศูนย์ในเวลาที่อัลกอริทึมสามารถใช้ ("หนึ่งขั้นตอน") อาจเป็นไปได้ว่าบางโปรแกรมที่จำกัด Nมีจำนวนขั้นตอนลดลงด้วย n แต่วิธีเดียวที่อัลกอริทึมสามารถเป็น O (1 / n) หรือแน่นอน o (1) คือถ้าใช้เวลา 0 สำหรับทั้งหมดอย่างเพียงพอ ขนาดใหญ่ n - ซึ่งเป็นไปไม่ได้
ShreevatsaR

28
เราไม่เห็นด้วยว่ามีฟังก์ชั่น O (1 / n) (ในแง่คณิตศาสตร์) เห็นได้ชัดว่าพวกเขาทำ แต่การคำนวณนั้นไม่ต่อเนื่องโดยเนื้อแท้ สิ่งที่มีขอบเขตต่ำกว่าเช่นเวลาทำงานของโปรแกรมไม่ว่าจะเป็นสถาปัตยกรรม von Neumann หรือเครื่องทัวริงนามธรรมล้วนๆไม่สามารถเป็น O (1 / n) สิ่งที่เป็น O (1 / n) ไม่สามารถมีขอบเขตล่างได้เท่ากัน (ฟังก์ชั่น "sleep" ของคุณต้องถูกเรียกใช้หรือต้องตรวจสอบตัวแปร "list" - หรือต้องตรวจสอบอินพุตเทปบนเครื่องทัวริงดังนั้นเวลาที่ใช้จะเปลี่ยนเป็น n ขณะที่ε + 1 / n ซึ่งไม่ใช่ O (1 / n))
ShreevatsaR

16
ถ้า T (0) = ∞มันจะไม่หยุด ไม่มีสิ่งเช่น "T (0) = ∞ แต่ก็ยังคงหยุด" เพิ่มเติมแม้ว่าคุณจะทำงานในR∪ {∞} และกำหนด T (0) = ∞และ T (n + 1) = T (n) / 2 จากนั้น T (n) = ∞สำหรับ n ทั้งหมด ให้ฉันทำซ้ำ: ถ้าฟังก์ชันที่มีค่าไม่ต่อเนื่องคือ O (1 / n) ดังนั้นสำหรับทั้งหมดที่ใหญ่พอ n คือ 0 [พิสูจน์: T (n) = O (1 / n) หมายความว่ามีค่าคงที่ c เช่นนั้น สำหรับ n> N0, T (n) <c (1 / n) ซึ่งหมายความว่าสำหรับ n> max (N0,1 / c) ใด ๆ , T (n) <1 ซึ่งหมายถึง T (n) = 0 ไม่มีเครื่องจริงหรือนามธรรมสามารถใช้ 0 เวลา: มันมีการมองไปที่การป้อนข้อมูล นอกจากเครื่องที่ไม่ทำอะไรเลยและ T (n) = 0 สำหรับ n ทั้งหมด
ShreevatsaR

43
คุณต้องชอบคำตอบใด ๆ ที่เริ่มต้น "คำถามนี้ไม่ได้โง่อย่างที่คิด"
Telemachus

138

ใช่.

มีหนึ่งอัลกอริทึมที่แม่นยำพร้อมรันไทม์ O (1 / n) อัลกอริทึม "ว่าง"

สำหรับอัลกอริทึมที่จะเป็น O (1 / n) หมายความว่ามันดำเนินการแบบอะซิมโตติติกในขั้นตอนน้อยกว่าอัลกอริทึมที่ประกอบด้วยคำสั่งเดียว ถ้ามันดำเนินการในขั้นตอนน้อยกว่าหนึ่งขั้นตอนสำหรับ n> n0 ทั้งหมดจะต้องประกอบด้วยการเรียนการสอนที่ไม่มีเลยสำหรับ n เหล่านั้น เนื่องจากการตรวจสอบ 'ถ้า n> n0' มีค่าใช้จ่ายอย่างน้อย 1 คำสั่งจะต้องไม่มีคำสั่งสำหรับ n ทั้งหมด

สรุป: อัลกอริทึมเดียวซึ่งเป็น O (1 / n) เป็นอัลกอริทึมที่ว่างเปล่าซึ่งไม่มีคำสั่ง


2
ดังนั้นถ้ามีคนถามว่าความซับซ้อนของเวลาของอัลกอริทึมว่างเปล่าคืออะไรคุณจะตอบด้วย O (1 / n) ??? ยังไงก็เถอะฉันสงสัยว่า
phkahler

24
นี่เป็นคำตอบเดียวที่ถูกต้องในกระทู้นี้และ (แม้จะมี upvote ของฉัน) มันอยู่ที่ศูนย์โหวต เช่น StackOverflow ซึ่งคำตอบที่ "ดูถูกต้อง" จะถูกโหวตสูงกว่าคำตอบที่ถูกต้องจริง
ShreevatsaR

5
ไม่ได้คะแนน 0 เพราะไม่ถูกต้อง การแสดงค่าใหญ่โอ้ที่เกี่ยวข้องกับ N เมื่อมันเป็นอิสระจาก N ไม่ถูกต้อง ประการที่สองการรันโปรแกรมใด ๆ แม้แต่ที่เพิ่งมีอยู่ก็ใช้เวลาอย่างน้อย O (1) แม้ว่าจะไม่เป็นเช่นนั้น แต่ก็เป็น O (0) ไม่ใช่ O (1 / n)
kenj0418

32
ฟังก์ชันใด ๆ ที่เป็น O (0) ก็เช่นกัน O (1 / n) และ O (n), O (n ^ 2), O (2 ^ n) ด้วย เฮ้อ, ไม่มีใครเข้าใจคำจำกัดความง่ายๆหรือไม่? O () เป็นขอบเขตบน
ShreevatsaR

16
@ kenj0418 คุณจัดการผิดในทุกประโยค "การแสดงค่าใหญ่ - โอ้ที่เกี่ยวข้องกับ N เมื่อมันเป็นอิสระจาก N ไม่ถูกต้อง" ฟังก์ชั่นคงที่เป็นฟังก์ชั่นที่สมบูรณ์แบบ "ประการที่สองการเรียกใช้โปรแกรมใด ๆ แม้แต่อย่างเดียวที่มีอยู่ก็ต้องใช้เวลาอย่างน้อย O (1)" คำจำกัดความของความซับซ้อนไม่ได้พูดอะไรเกี่ยวกับการเรียกใช้โปรแกรมใด ๆ "มันจะเป็น O (0) ไม่ใช่ O (1 / n)" ดูความคิดเห็นของ @ ShreevatsaR
Alexey Romanov

25

คมชัดถูกต้อง O (1) เป็นประสิทธิภาพที่ดีที่สุด อย่างไรก็ตามมันไม่ได้หมายความถึงวิธีแก้ปัญหาที่รวดเร็วเพียงแค่โซลูชันเวลาที่แน่นอน

ตัวแปรที่น่าสนใจและบางทีสิ่งที่แนะนำจริงๆคือปัญหาที่ง่ายขึ้นเมื่อจำนวนประชากรเพิ่มขึ้น ฉันสามารถคิดได้ 1 ถึงแม้ว่าคำตอบที่ประดิษฐ์และลิ้น - แก้ม:

คนสองคนในชุดมีวันคล้ายวันเกิดหรือไม่ เมื่อ n เกิน 365 ให้ส่งคืนจริง แม้ว่าน้อยกว่า 365 นี่คือ O (n ln n) อาจไม่ใช่คำตอบที่ยอดเยี่ยมเนื่องจากปัญหาไม่ง่ายขึ้นอย่างช้าๆ แต่กลายเป็น O (1) สำหรับ n> 365


7
366. อย่าลืมเรื่องปีอธิกสุรทิน!
Nick Johnson

1
คุณถูก. เช่นคอมพิวเตอร์, I am บางครั้งอาจมีข้อผิดพลาดในการปัดเศษ :-)
เอเดรีย

10
+1 มีปัญหาที่ทำให้ NP เสร็จสมบูรณ์จำนวนหนึ่งที่ได้รับ "การเปลี่ยนเฟส" เมื่อ n เพิ่มขึ้นนั่นคือปัญหาเหล่านั้นจะกลายเป็นเรื่องง่ายขึ้นหรือยากขึ้นเมื่อคุณมีค่าเกินเกณฑ์ที่แน่นอนที่ n ตัวอย่างหนึ่งคือปัญหาการแบ่งพาร์ติชันตัวเลข: กำหนดชุดของจำนวนเต็มจำนวนที่ไม่ใช่ค่าลบ, แบ่งพาร์ติชันออกเป็นสองส่วนเพื่อให้ผลรวมของแต่ละส่วนเท่ากัน สิ่งนี้จะง่ายขึ้นอย่างมากที่ค่าเกณฑ์ที่แน่นอนของ n
j_random_hacker

23

มันเป็นไปไม่ได้. คำจำกัดความของ Big-O ไม่ได้มากกว่าความไม่เสมอภาค:

A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)

ในความเป็นจริงแล้ว B (n) คือค่าสูงสุดดังนั้นหากมันลดลงเมื่อ n เพิ่มการประมาณจะไม่เปลี่ยนแปลง


42
ฉันสงสัยว่าคำตอบนี้คือ "ใช่" แต่น่าเสียดายที่ฉันขาดสติปัญญาที่จะเข้าใจ
FreeSpace

12
AFAIK เงื่อนไขนี้ไม่จำเป็นต้องเป็นจริงสำหรับทุก n แต่สำหรับ n> n_0 ทั้งหมด (กล่าวคือเฉพาะเมื่อขนาดของอินพุตมีค่าถึงขีด จำกัด เฉพาะ)
Roland Ewald

30
ฉันไม่เห็นว่าคำจำกัดความ (แก้ไขได้ถูกต้อง) ขัดแย้งกับคำถามของ OP อย่างไร คำจำกัดความถือสำหรับฟังก์ชั่นโดยพลการอย่างสมบูรณ์! 1 / n เป็นฟังก์ชันที่สมเหตุสมผลอย่างสมบูรณ์สำหรับ B และอันที่จริงสมการของคุณไม่ได้ขัดแย้งกัน (เพียงแค่ทำคณิตศาสตร์) ดังนั้นไม่แม้จะมีความเห็นเป็นเอกฉันท์มากคำตอบนี้ในความเป็นจริงที่ไม่ถูกต้อง ขอโทษ
Konrad Rudolph

10
ไม่ถูกต้อง! ฉันไม่ชอบการลงคะแนน แต่คุณระบุว่าสิ่งนี้เป็นไปไม่ได้เมื่อไม่มีฉันทามติที่ชัดเจน ในทางปฏิบัติคุณถูกต้องหากคุณสร้างฟังก์ชั่นด้วย 1 / n runtime (ง่าย) ในที่สุดมันจะถึงเวลาขั้นต่ำทำให้ได้อย่างมีประสิทธิภาพเป็น O (1) อัลกอริทึมเมื่อดำเนินการ ไม่มีอะไรจะหยุดอัลกอริทึมจากการเป็น O (1 / n) บนกระดาษแม้ว่า
jheriko

3
@ Jason: ใช่แล้วตอนนี้คุณพูดแล้ว ... :) @ jheriko: ความซับซ้อนของเวลา O (1 / n) ไม่ทำงานบนกระดาษ IMHO เรากำลังอธิบายฟังก์ชันการเติบโต f (ขนาดอินพุต) = #ops สำหรับเครื่องทัวริง ถ้ามันหยุดสำหรับอินพุตที่มีความยาว n = 1 หลังจาก x ก้าวฉันจะเลือกขนาดอินพุต n >> x, คือใหญ่พอที่ถ้าอัลกอริทึมเป็นจริงใน O (1 / n) ไม่ควรดำเนินการใด ๆ เสร็จแล้ว เครื่องทัวริงควรสังเกตสิ่งนี้อย่างไร (ไม่อนุญาตให้อ่านเพียงครั้งเดียวจากเทป)
โรลันด์วาลด์

16

จากการเรียนรู้ก่อนหน้านี้เกี่ยวกับสัญกรณ์ O ใหญ่ของฉันแม้ว่าคุณต้องการ 1 ขั้นตอน (เช่นการตรวจสอบตัวแปรทำการมอบหมาย) นั่นคือ O (1)

โปรดทราบว่า O (1) เหมือนกับ O (6) เนื่องจาก "ค่าคงที่" ไม่สำคัญ นั่นเป็นเหตุผลที่เราพูดว่า O (n) เหมือนกับ O (3n)

ดังนั้นหากคุณต้องการแม้แต่ 1 ขั้นตอนนั่นคือ O (1) ... และเนื่องจากโปรแกรมของคุณต้องการอย่างน้อย 1 ขั้นตอนอัลกอริธึมที่น้อยที่สุดก็คือ O (1) ถ้าหากเราไม่ทำมันก็คือ O (0) ฉันคิดว่างั้นเหรอ? ถ้าเราทำอะไรเลยมันก็จะเป็น O (1) และนั่นเป็นขั้นต่ำสุดที่จะทำได้

(ถ้าเราเลือกที่จะไม่ทำมันอาจกลายเป็นคำถามเซนหรือเทา ... ในขอบเขตของการเขียนโปรแกรม O (1) ยังคงเป็นขั้นต่ำ)

หรือวิธีการเกี่ยวกับเรื่องนี้:

โปรแกรมเมอร์ : เจ้านายฉันพบวิธีที่จะทำในเวลา O (1)!
เจ้านาย : ไม่จำเป็นต้องทำมันเราล้มละลายในเช้านี้
โปรแกรมเมอร์ : โอ้แล้วมันจะกลายเป็น O (0)


เรื่องตลกของคุณทำให้ฉันนึกถึงบางอย่างจาก Tao of Programming: canonical.org/~kragen/tao-of-programming.html#book8 (8.3)
kenj0418

อัลกอริทึมที่ประกอบด้วยศูนย์ขั้นตอนคือ O (0) นั่นเป็นอัลกอริทึมที่ขี้เกียจมาก
nalply

8

ไม่เป็นไปไม่ได้:

ในขณะที่ n มีแนวโน้มที่จะไม่มีที่สิ้นสุดใน 1 / n ในที่สุดเราก็บรรลุ 1 / (inf) ซึ่งเป็น 0 อย่างมีประสิทธิภาพ

ดังนั้นคลาสที่มีขนาดใหญ่ของปัญหาจะเป็น O (0) ที่มีค่า n มาก แต่ใกล้เวลาคงที่ด้วยค่าต่ำ n สิ่งนี้ไม่สมเหตุสมผลเนื่องจากมีเพียงสิ่งเดียวที่สามารถทำได้เร็วกว่าเวลาที่กำหนดคือ:

void nothing() {};

และแม้กระทั่งนี้ก็พิสูจน์ได้!

ทันทีที่คุณดำเนินการคำสั่งคุณจะอยู่ในอย่างน้อย O (1) ดังนั้นไม่เราไม่สามารถมีคลาส O (1 / n) อันยิ่งใหญ่!


7

ถ้าไม่ใช้งานฟังก์ชั่นเลย (NOOP) ล่ะ? หรือใช้ค่าคงที่ นั่นนับหรือไม่


16
ยังคงเป็น O (1) รันไทม์
Konrad Rudolph

2
ใช่นั่นคือ O (1) ฉันไม่เห็นว่าใครบางคนสามารถเข้าใจสิ่งนี้ แต่ยังอ้างสิทธิ์ในคำตอบอื่นว่ามีบางสิ่งที่น้อยกว่า NO-OP เป็นไปได้
ShreevatsaR

4
ShreevatsaR: ไม่มีข้อโต้แย้งอย่างแน่นอน ดูเหมือนว่าคุณจะไม่เข้าใจว่าสัญกรณ์ O ขนาดใหญ่นั้นไม่มีอะไรเกี่ยวข้องกับเวลาที่ใช้ในฟังก์ชั่น - แต่มันอธิบายว่าเวลานั้นเปลี่ยนไปอย่างไรกับการเปลี่ยนอินพุต (เหนือค่าที่แน่นอน) ดูหัวข้อความคิดเห็นอื่น ๆ เพิ่มเติม
Konrad Rudolph

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

1
ใช่ ... อย่างที่ฉันพูดที่อื่นอัลกอริทึมใด ๆ ที่เป็น O (1 / n) ควรใช้เวลาเป็นศูนย์สำหรับอินพุตทั้งหมดดังนั้นขึ้นอยู่กับว่าคุณพิจารณาว่าอัลกอริทึม null จะใช้เวลา 0 หรือไม่นั่นคือ O (1) / n) อัลกอริทึม ดังนั้นหากคุณคิดว่า NOOP เป็น O (1) ดังนั้นจะไม่มีอัลกอริทึม O (1 / n)
ShreevatsaR

7

ฉันมักจะใช้ O (1 / n) เพื่ออธิบายความน่าจะเป็นที่เล็กลงเมื่ออินพุตมีขนาดใหญ่ขึ้น - ตัวอย่างเช่นความน่าจะเป็นที่เหรียญยุติธรรมปรากฏขึ้นที่ส่วนท้ายของ log2 (n) การพลิกคือ O (1 / n)


6
นั่นไม่ใช่สิ่งที่โอใหญ่คือแม้ว่า คุณไม่สามารถกำหนดมันใหม่เพื่อตอบคำถาม
Zifre

11
มันไม่ได้เป็นนิยามใหม่ก็ตรงความหมายของใหญ่ทุม
ShreevatsaR

10
ฉันเป็นนักวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีโดยการค้าขาย มันเป็นเรื่องของลำดับซีมโทติคของฟังก์ชั่น
Dave

4
Big O เป็นคุณสมบัติของฟังก์ชั่นจริงตามอำเภอใจ ความซับซ้อนของเวลาเป็นเพียงหนึ่งในแอพพลิเคชั่นที่เป็นไปได้ ความซับซ้อนของพื้นที่ (จำนวนหน่วยความจำใช้งานที่อัลกอริทึมใช้) เป็นอีกเรื่อง คำถามนั้นเกี่ยวกับอัลกอริทึม O (1 / n) แสดงว่าเป็นหนึ่งในนั้น (เว้นแต่จะมีอีกอันที่ใช้กับอัลกอริทึมที่ฉันไม่รู้) แอปพลิเคชันอื่น ๆ รวมถึงคำสั่งของการเติบโตของประชากรเช่นใน Conway's Life ดูเพิ่มเติมที่en.wikipedia.org/wiki/Big_O_notation
สจวร์ต

5
@Dave: คำถามไม่ได้ว่ามีฟังก์ชั่น O (1 / n) อยู่หรือไม่ซึ่งมีอยู่จริง แต่เป็นว่ามีอัลกอริทึม O (1 / n) หรือไม่ซึ่งมีข้อยกเว้นที่เป็นไปได้ของฟังก์ชัน null)
Casebash

6

O (1) หมายถึง "เวลาคงที่"

เมื่อคุณเพิ่มการออกก่อนหน้านี้ในลูป [1] คุณ (ในรูปของบิ๊กโอ) เปลี่ยนอัลกอริทึม O (1) เป็น O (n) แต่ทำให้เร็วขึ้น

เคล็ดลับโดยทั่วไปอัลกอริธึมเวลาคงที่ดีที่สุดและเป็นเส้นตรงดีกว่าแล้วก็เป็นการอธิบาย แต่สำหรับ n จำนวนเล็กน้อยอัลกอริธึมเชิงเอ็กซ์โปอาจจริงเร็วกว่า

1: สมมติความยาวรายการคงที่สำหรับตัวอย่างนี้


6

สำหรับใครก็ตามที่อ่านคำถามนี้และต้องการเข้าใจว่าบทสนทนานั้นเกี่ยวกับอะไรนี่อาจช่วยได้:

|    |constant |logarithmic |linear|  N-log-N |quadratic|  cubic  |  exponential  |
|  n |  O(1)   | O(log n)   | O(n) |O(n log n)|  O(n^2) |  O(n^3) |     O(2^n)    |
|  1 |       1 |          1 |     1|         1|        1|       1 |             2 |
|  2 |       1 |          1 |     2|         2|        4|       8 |             4 |
|  4 |       1 |          2 |     4|         8|       16|      64 |            16 |
|  8 |       1 |          3 |     8|        24|       64|     512 |           256 |
| 16 |       1 |          4 |    16|        64|      256|   4,096 |         65536 |
| 32 |       1 |          5 |    32|       160|    1,024|  32,768 | 4,294,967,296 |
| 64 |       1 |          6 |    64|       384|    4,069| 262,144 |   1.8 x 10^19 |

5

ฉันเชื่อว่าอัลกอริทึมควอนตัมสามารถทำการคำนวณหลายอย่าง "พร้อมกัน" ผ่านการทับซ้อน ...

ฉันสงสัยว่านี่เป็นคำตอบที่มีประโยชน์


นั่นจะยังคงเป็นเวลาคงที่เช่น O (1) ซึ่งหมายความว่าใช้เวลาในการรันข้อมูลขนาด n เท่ากันกับข้อมูลขนาด 1
ส.ค.

2
แต่ถ้าปัญหาเป็นเบียร์ซีด (ah. hah. ha.)
Jeff Meatball Yang

7
นั่นจะเป็นตำแหน่งที่ดีที่สุดที่จะได้รับ
Daniel Earwicker

1
อัลกอริธึมเชิงควอนตัมสามารถทำการคำนวณได้หลายอย่าง แต่คุณสามารถดึงผลลัพธ์ของการคำนวณเดียวเท่านั้นและคุณไม่สามารถเลือกผลลัพธ์ที่จะได้รับ โชคดีที่คุณยังสามารถดำเนินการเกี่ยวกับการลงทะเบียนควอนตัมเป็นทั้ง (ตัวอย่างเช่น QFT) เพื่อให้คุณ likelier มากกำลังจะหาสิ่งที่ :)
Gracenotes

2
มันอาจจะไม่ได้มีประโยชน์ แต่ก็มีความได้เปรียบของการเป็นจริงซึ่งทำให้มันดังกล่าวข้างต้นบางส่วนของมากขึ้นอย่างมากโหวตให้เป็นคำตอบ B-)
ไบรอัน Postow

4

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


2

หากโซลูชันมีอยู่ก็สามารถเตรียมและเข้าถึงได้ในเวลาคงที่ = ทันที ตัวอย่างเช่นการใช้โครงสร้างข้อมูล LIFO ถ้าคุณรู้ว่าการเรียงลำดับแบบสอบถามมีไว้เพื่อย้อนกลับ จากนั้นข้อมูลจะถูกเรียงลำดับแล้วเนื่องจากเลือกโมเดลที่เหมาะสม (LIFO)


2

ปัญหาใดจะง่ายขึ้นเมื่อประชากรเพิ่มขึ้น คำตอบเดียวคือ bittorrent ที่ความเร็วในการดาวน์โหลดเป็นฟังก์ชันผกผันของจำนวนโหนด ตรงกันข้ามกับรถซึ่งยิ่งโหลดช้าลงเครือข่ายการแชร์ไฟล์เช่นความเร็วบิตต่อวินาทีจะยิ่งเชื่อมต่อโหนดมากขึ้น


ใช่ แต่จำนวนของ bittorrent nodes นั้นเหมือนกับจำนวนตัวประมวลผลในคอมพิวเตอร์แบบขนาน "N" ในกรณีนี้จะเป็นขนาดของไฟล์ที่พยายามจะดาวน์โหลด เช่นเดียวกับที่คุณสามารถหาองค์ประกอบในอาร์เรย์ที่มีความยาว N ที่ไม่เรียงลำดับในเวลาคงที่หากคุณมีคอมพิวเตอร์ N เครื่องคุณสามารถดาวน์โหลดไฟล์ขนาด N ในเวลาคงที่หากคุณมีคอมพิวเตอร์ N เครื่องที่พยายามส่งข้อมูลถึงคุณ
Kibbee

2

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


1
ไม่แน่ใจว่าฉันเข้าใจ Log (N) น้อยกว่า N นั่นหมายความว่า Log (N) เป็นอัลกอริทึมย่อย และมีอัลกอริทึม Log (N) มากมาย ตัวอย่างหนึ่งดังกล่าวคือการหาค่าในต้นไม้ไบนารี อย่างไรก็ตามสิ่งเหล่านี้ยังคงแตกต่างจาก 1 / N เนื่องจาก Log (N) เพิ่มขึ้นเสมอในขณะที่ 1 / n เป็นฟังก์ชันที่ลดลง
Kibbee

เมื่อดูที่นิยามอัลกอริธึมเวลาเชิงเส้นย่อยคืออัลกอริทึมใด ๆ ที่เวลาเติบโตช้ากว่าขนาดเอ็นดังนั้นจึงรวมถึงอัลกอริธึมเวลาลอการิทึมซึ่งก็คือล็อก (N)
Hao Wooi Lim

2
เอ่ออัลกอริธึมเวลาเชิงเส้นย่อยสามารถให้คำตอบที่แน่นอนเช่นการค้นหาแบบไบนารีในอาร์เรย์ที่สั่งซื้อบนเครื่อง RAM
A. Rex

@A เร็กซ์: Hao Wooi Lim พูดว่า "ในปัญหาบางอย่าง"
LarsH

1

เกี่ยวกับสิ่งนี้:

void FindRandomInList(list l)
{
    while(1)
    {
        int rand = Random.next();
        if (l.contains(rand))
            return;
    }
}

เมื่อขนาดของรายการโตขึ้นรันไทม์ที่คาดหวังของโปรแกรมจะลดลง


ฉันคิดว่าคุณไม่เข้าใจความหมายของ O (n)
Markus Lausberg

ไม่ได้อยู่ในรายการ แต่ด้วย array หรือ hash โดยที่constainsO (1)
vava

ตกลงฟังก์ชั่นการสุ่มสามารถคิดว่าเป็นอาเรย์ขี้เกียจดังนั้นโดยพื้นฐานแล้วคุณค้นหาแต่ละองค์ประกอบใน "รายการสุ่มแบบลิว" และตรวจสอบว่ามันมีอยู่ในรายการอินพุตหรือไม่ ฉันคิดว่านี่แย่กว่าเชิงเส้นไม่ดีกว่า
hasen

เขามีประเด็นบางอย่างถ้าคุณสังเกตเห็นว่า int มีค่าที่ จำกัด ดังนั้นเมื่อ l ประกอบด้วย 2 <sup> 64 </sup> ค่ามันจะเกิดขึ้นทันทีตลอดทาง ซึ่งจะทำให้มันเลวร้ายยิ่งกว่า O (1) เลยล่ะค่ะ :)
vava

1

O (1 / n) ไม่น้อยกว่า O (1) ก็หมายความว่ายิ่งมีข้อมูลมากเท่าไหร่ สมมติว่าคุณได้รับอาเรย์และเติมองค์ประกอบมากถึง 10 100 เสมอถ้ามันมีค่าน้อยกว่านั้นและไม่ทำอะไรเลยถ้ามีมากขึ้น อันนี้ไม่ใช่ O (1 / n) แน่นอน แต่บางอย่างเช่น O (-n) :) สัญกรณ์ O-big ที่แย่เกินไปไม่อนุญาตให้มีค่าลบ


1
"O (1 / n) ไม่น้อยกว่า O (1)" - ถ้าฟังก์ชัน f คือ O (1 / n) ก็เป็น O (1) และใหญ่ - โอ้รู้สึกเหมือน "น้อยกว่า" ความสัมพันธ์: มันสะท้อนมันเป็นสกรรมกริยาและถ้าเรามีความสมมาตรระหว่าง f และ g ทั้งสองจะเท่ากันที่ใหญ่ - เธต้าเป็นความสัมพันธ์ที่เท่าเทียมกันของเรา ISTR "ของจริง" ความสัมพันธ์ในการสั่งซื้อที่ต้องการ <= b และ b <= a หมายถึง a = b แม้ว่าและ netcraft ^ W วิกิพีเดียยืนยัน ดังนั้นในแง่หนึ่งมันยุติธรรมที่จะบอกว่าแน่นอน O (1 / n) คือ "น้อยกว่า" O (1)
Jonas Kölker

1

ดังที่มีการชี้ให้เห็นนอกเหนือจากข้อยกเว้นที่เป็นไปได้ของฟังก์ชัน null จะไม่มีO(1/n)ฟังก์ชั่นเนื่องจากเวลาที่ใช้จะต้องเข้าใกล้ 0

แน่นอนว่ามีอัลกอริทึมบางอย่างเช่นที่กำหนดโดย Konrad ซึ่งดูเหมือนว่าพวกเขาควรจะน้อยกว่าO(1)อย่างน้อยก็ในบางแง่มุม

def get_faster(list):
    how_long = 1/len(list)
    sleep(how_long)

หากคุณต้องการตรวจสอบอัลกอริธึมเหล่านี้คุณควรกำหนดการวัดเชิงสัญลักษณ์ของคุณเองหรือความคิดเรื่องเวลา ตัวอย่างเช่นในอัลกอริทึมข้างต้นฉันสามารถอนุญาตให้ใช้การดำเนินการ "ฟรี" จำนวนหนึ่งในจำนวนครั้งที่กำหนด ในอัลกอริทึมด้านบนถ้าฉันกำหนด t 'โดยไม่รวมเวลาสำหรับทุกอย่างยกเว้นการนอนหลับดังนั้น t' = 1 / n ซึ่งก็คือ O (1 / n) อาจมีตัวอย่างที่ดีกว่านี้เนื่องจากพฤติกรรมแบบอะซิมโทติคเล็กน้อย ในความเป็นจริงฉันมั่นใจว่าคนที่อยู่ข้างนอกสามารถเกิดความรู้สึกที่ให้ผลลัพธ์ที่ไม่สำคัญ


1

ส่วนที่เหลือของคำตอบส่วนใหญ่ตีความใหญ่ -O เป็นเฉพาะเกี่ยวกับเวลาทำงานของอัลกอริทึม แต่เนื่องจากคำถามไม่ได้พูดถึงมันฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงการใช้งาน big-O อื่น ๆ ในการวิเคราะห์เชิงตัวเลขซึ่งเกี่ยวกับข้อผิดพลาด

อัลกอริทึมจำนวนมากสามารถเป็น O (h ^ p) หรือ O (n ^ {- p}) ขึ้นอยู่กับว่าคุณกำลังพูดถึงขั้นตอนขนาด (h) หรือจำนวนของแผนก (n) ตัวอย่างเช่นในวิธีของออยเลอร์คุณมองหาค่าประมาณ y (h) เนื่องจากคุณรู้ว่า y (0) และ dy / dx (อนุพันธ์ของ y) ค่าประมาณ y (h) ของคุณมีความแม่นยำมากขึ้นค่า h ที่ใกล้กว่าคือ 0 ดังนั้นเพื่อหาค่า y (x) สำหรับ x ตามอำเภอใจ x หนึ่งจะใช้ช่วงเวลา 0 ถึง x แยกออกเป็น n ส่วนและรันเมธอดของออยเลอร์ ในแต่ละจุดจะได้รับจาก y (0) ถึง y (x / n) ถึง y (2x / n) และอื่น ๆ

ดังนั้นวิธีของออยเลอร์จึงเป็นอัลกอริทึม O (h) หรือ O (1 / n) โดยที่ h ถูกตีความโดยทั่วไปว่าเป็นขนาดขั้นตอนและ n ถูกตีความเป็นจำนวนครั้งที่คุณแบ่งช่วงเวลา

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

สำหรับวิธีการของออยเลอร์ถ้าคุณใช้คะแนนลอยตัวให้ใช้ขั้นตอนและการยกเลิกเล็ก ๆ พอและคุณกำลังเพิ่มจำนวนเล็กน้อยให้เป็นจำนวนมากโดยไม่เปลี่ยนแปลงจำนวนมาก สำหรับอัลกอริทึมที่คำนวณอนุพันธ์โดยการลบจำนวนสองค่าจากฟังก์ชันที่ประเมินที่ตำแหน่งใกล้เคียงกันมากสองค่าโดยประมาณ y '(x) ด้วย (y (x + h) - y (x) / h) ในฟังก์ชัน y ที่ราบรื่น (x + h) เข้าใกล้ y (x) ส่งผลให้มีการยกเลิกขนาดใหญ่และประมาณการสำหรับอนุพันธ์ที่มีตัวเลขนัยสำคัญน้อยกว่า สิ่งนี้จะแพร่กระจายไปยังอัลกอริธึมที่คุณต้องการอนุพันธ์ (เช่นปัญหาค่าขอบเขต)


0

ตกลงฉันคิดเล็กน้อยเกี่ยวกับมันและอาจมีอัลกอริทึมที่สามารถทำตามรูปแบบทั่วไปนี้:

คุณต้องคำนวณปัญหาพนักงานขายที่เดินทางสำหรับกราฟ 1,000 โหนดอย่างไรก็ตามคุณจะได้รับรายการโหนดที่คุณไม่สามารถเยี่ยมชมได้ เมื่อรายการของโหนดที่ไม่สามารถมองเห็นได้มีขนาดใหญ่ขึ้นปัญหาจะง่ายขึ้นในการแก้ไข


4
มันแตกต่างจาก n ใน O (n) แล้ว ด้วยเคล็ดลับนี้คุณสามารถพูดได้ว่าทุกอัลกอริทึมมี O (q) โดยที่ q คือจำนวนคนที่อาศัยอยู่ในประเทศจีน
vava

2
Boyer-Moore มีลักษณะคล้ายกัน (O (n / m)) แต่นั่นไม่ใช่ "ดีกว่า O (1)" เพราะ n> = m ฉันคิดว่าสิ่งเดียวกันนี้เป็นจริงสำหรับ "TSP ที่ไม่สามารถมองเห็น" ของคุณได้
Niki

แม้ในกรณีนี้การรันไทม์ของ TSP คือ NP-Complete คุณเพียงแค่ลบโหนดออกจากกราฟและลด n อย่างมีประสิทธิภาพ
Ed James

0

ฉันเห็นอัลกอริทึมที่เป็น O (1 / n) ยอมรับกับขอบเขตบน:

คุณมีอินพุตจำนวนมากซึ่งมีการเปลี่ยนแปลงเนื่องจากสิ่งภายนอกงานประจำ (อาจเป็นเพราะฮาร์ดแวร์หรืออาจเป็นแกนกลางอื่น ๆ ในโปรเซสเซอร์ที่ทำ) และคุณต้องเลือกแบบสุ่ม แต่ใช้ได้

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

นี่เป็นกรณีที่เลวร้ายที่สุดของ infinity แต่ประสิทธิภาพของ case โดยเฉลี่ยลดลงเมื่อพื้นที่ข้อมูลเต็ม


0

ในการวิเคราะห์เชิงตัวเลขอัลกอริทึมการประมาณควรมีความซับซ้อนเชิงซีเอ็นโทติคย่อยในค่าเผื่อการประมาณ

class Function
{
    public double[] ApproximateSolution(double tolerance)
    {
        // if this isn't sub-constant on the parameter, it's rather useless
    }
}

คุณหมายถึง sub-constant หรือ sublinear จริงๆหรือ ทำไมอัลกอริธึมการประมาณควรเป็นค่าคงที่ย่อย? และนั่นหมายความว่ายังไง?
LarsH

@ LarsH ข้อผิดพลาดของอัลกอริทึมการประมาณเป็นสัดส่วนกับขนาดขั้นตอน (หรือกำลังบวกของมัน) ดังนั้นยิ่งขนาดขั้นตอนของคุณเล็กลง แต่อีกวิธีทั่วไปในการตรวจสอบปัญหาการประมาณค่าคือข้อผิดพลาดเมื่อเทียบกับจำนวนครั้งที่แบ่งช่วงเวลา จำนวนพาร์ติชันของช่วงเวลาเป็นสัดส่วนผกผันกับขนาดขั้นตอนดังนั้นข้อผิดพลาดเป็นสัดส่วนกลับกันกับกำลังบวกบางอย่างของจำนวนพาร์ติชัน - เมื่อคุณเพิ่มจำนวนพาร์ติชันข้อผิดพลาดของคุณลดลง
Andrew Lei

@AndrewLei: ว้าวคำตอบเกือบ 7 ปีต่อมา! ฉันเข้าใจคำตอบของแซมได้ดีกว่าตอนนี้ ขอบคุณสำหรับการตอบสนอง
LarsH

0

ฉันเดาน้อยกว่า O (1) เป็นไปไม่ได้ เวลาใดก็ตามที่ algo ถูกเรียกว่า O (1) แต่สำหรับ O (1 / n) วิธีการเกี่ยวกับฟังก์ชั่นด้านล่าง (ฉันรู้ว่ามีหลายสายพันธุ์ที่นำเสนอในการแก้ปัญหานี้แล้ว แต่ฉันคิดว่าพวกเขาทุกคนมีข้อบกพร่องบางอย่าง (ไม่สำคัญพวกเขาอธิบายแนวคิดได้เป็นอย่างดี) ดังนั้นนี่คือข้อโต้แย้งเพียงประการเดียว:

def 1_by_n(n, C = 10):   #n could be float. C could be any positive number
  if n <= 0.0:           #If input is actually 0, infinite loop.
    while True:
      sleep(1)           #or pass
    return               #This line is not needed and is unreachable
  delta = 0.0001
  itr = delta
  while delta < C/n:
    itr += delta

ดังนั้นเมื่อเพิ่ม n ฟังก์ชั่นจะใช้เวลาน้อยลง นอกจากนี้ยังมั่นใจได้ว่าหากอินพุตเป็น 0 จริงแล้วฟังก์ชันจะใช้เวลาตลอดไปในการส่งคืน

บางคนอาจโต้แย้งว่ามันจะถูก จำกัด ด้วยความแม่นยำของเครื่องจักร ดังนั้น sinc eit จึงมีขอบเขตบนคือ O (1) แต่เราสามารถหลีกเลี่ยงสิ่งนั้นได้เช่นกันโดยรับอินพุตของ n และ C เป็นสตริง และนอกจากนี้และการเปรียบเทียบจะทำในสตริง แนวคิดก็คือด้วยสิ่งนี้เราสามารถลดขนาดเล็กได้ตามต้องการ ดังนั้นขีด จำกัด สูงสุดของฟังก์ชั่นจะไม่ถูก จำกัด แม้ว่าเราจะไม่สนใจ n = 0

ฉันยังเชื่อว่าเราไม่สามารถพูดได้ว่าเวลาทำงานคือ O (1 / n) แต่เราควรพูดอะไรบางอย่างเช่น O (1 + 1 / n)


-1

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


ลูปของคุณต้องการการตรวจสอบที่ใช้เวลาอย่างน้อยคงที่ดังนั้นอัลกอริทึมที่ได้จึงมีความซับซ้อนอย่างน้อย O (1)
Stefan Reich

-1

ฉันไม่รู้เกี่ยวกับอัลกอริทึม แต่ความซับซ้อนน้อยกว่า O (1) ปรากฏในอัลกอริทึมแบบสุ่ม ที่จริงแล้ว o (1) (น้อย o) น้อยกว่า O (1) ความซับซ้อนแบบนี้มักจะปรากฏในอัลกอริทึมแบบสุ่ม ตัวอย่างเช่นที่คุณพูดเมื่อความน่าจะเป็นของเหตุการณ์บางอย่างมีค่าเป็น 1 / n พวกเขาจะแสดงด้วย o (1) หรือเมื่อพวกเขาต้องการบอกว่ามีบางอย่างเกิดขึ้นกับความน่าจะเป็นสูง (เช่น 1 - 1 / n) พวกเขาแสดงว่ามี 1 - o (1)


-2

หากคำตอบเหมือนกันโดยไม่คำนึงถึงข้อมูลอินพุตคุณมีอัลกอริทึม O (0)

หรือในคำอื่น ๆ - คำตอบเป็นที่รู้จักกันก่อนที่จะส่งข้อมูลเข้า - ฟังก์ชั่นสามารถเพิ่มประสิทธิภาพออก - ดังนั้น O (0)


จริงๆ? คุณยังคงต้องส่งคืนค่าดังนั้นจะยังคงเป็น O (1) หรือไม่
Joachim Sauer

7
ไม่ O (0) จะบอกเป็นนัยว่ามันใช้เวลาเป็นศูนย์สำหรับอินพุตทั้งหมด O (1) เป็นเวลาคงที่
Pete Kirkham

-2

Big-O สัญกรณ์แสดงสถานการณ์กรณีที่เลวร้ายที่สุดสำหรับอัลกอริทึมซึ่งไม่เหมือนกับเวลาใช้งานทั่วไป มันง่ายที่จะพิสูจน์ว่าอัลกอริทึม O (1 / n) เป็นอัลกอริทึม O (1) ตามคำนิยาม
O (1 / n) -> T (n) <= 1 / n, สำหรับ n> = C> 0
O (1 / n) -> T (n) <= 1 / C, ตั้งแต่ 1 / n <= 1 / C สำหรับทุก n> = C
O (1 / n) -> O (1) เนื่องจากสัญกรณ์ Big-O ละเว้นค่าคงที่ (เช่นค่าของ C ไม่สำคัญ)


ไม่: สัญกรณ์ Big O ยังใช้เพื่อพูดคุยเกี่ยวกับสถานการณ์เฉลี่ยและเวลาที่คาดหวัง (และแม้แต่กรณีที่ดีที่สุด) ที่เหลือดังนี้
Konrad Rudolph

สัญกรณ์ 'O' กำหนดขอบเขตบนแน่นอน(ในแง่ของความซับซ้อนของอัลกอริทึมนี่จะเป็นกรณีที่เลวร้ายที่สุด) Omega และ Theta ใช้เพื่อแสดงกรณีที่ดีที่สุดและโดยเฉลี่ยตามลำดับ
Roland Ewald

2
Roland: นั่นเป็นความเข้าใจผิด ขอบเขตบนไม่ใช่สิ่งเดียวกับกรณีที่เลวร้ายที่สุดทั้งสองเป็นแนวคิดอิสระ พิจารณา runtime (และค่าเฉลี่ย) ที่คาดหวังของhashtable-containsอัลกอริทึมซึ่งสามารถแสดงเป็น O (1) - และกรณีที่เลวร้ายที่สุดสามารถให้ได้อย่างแม่นยำมากเป็น Theta (n)! Omega และ Theta อาจใช้เพื่อแสดงขอบเขตอื่น ๆ แต่จะพูดอีกครั้ง : พวกเขาไม่มีอะไรเกี่ยวข้องกับค่าเฉลี่ยหรือกรณีที่ดีที่สุด
Konrad Rudolph

คอนราด: จริง ยังคง, Omega, Theata และ O มักจะนำมาใช้เพื่อแสดงขอบเขตและถ้าทุกปัจจัยการผลิตที่เป็นไปได้จะถือว่าข้าหมายถึงขอบเขตบน ฯลฯ
โรลันด์วาลด์

1
ความจริงที่ว่า O (1 / n) เป็นเซตย่อยของ O (1) เล็กน้อยและตามมาจากคำจำกัดความโดยตรง อันที่จริงถ้าฟังก์ชัน g คือ O (h) ดังนั้นฟังก์ชัน f ใด ๆ ที่เป็น O (g) ก็เป็น O (h) เช่นกัน
Tobias

-2

ไม่มีอะไรที่เล็กไปกว่าเครื่องหมาย O (1) Big-O ซึ่งหมายถึงลำดับความซับซ้อนที่ใหญ่ที่สุดสำหรับอัลกอริทึม

หากอัลกอริทึมมีรันไทม์ของ n ^ 3 + n ^ 2 + n + 5 ก็จะเป็น O (n ^ 3) พลังที่ต่ำกว่าไม่สำคัญที่นี่เพราะในขณะที่ n -> Inf, n ^ 2 จะไม่เกี่ยวข้องกับ n ^ 3

เช่นเดียวกันกับ n -> Inf, O (1 / n) จะไม่เกี่ยวข้องกับ O (1) ดังนั้น 3 + O (1 / n) จะเหมือนกับ O (1) จึงทำให้ O (1) การคำนวณที่เล็กที่สุดที่เป็นไปได้ ความซับซ้อน


-2
inline void O0Algorithm() {}

1
นั่นจะเป็นอัลกอริทึม O (1)
Lasse V. Karlsen

2
นั่นก็เช่นกัน แต่ประเด็นก็คือไม่ใช่ isn't (1) และทำไมคำตอบของฉันจึงถูกลดระดับลง? ถ้าคุณคิดว่าฉันผิดอธิบายเกี่ยวกับอะไร
สจ๊วต

ฉันถามที่อื่นว่าโดยทั่วไปคำตอบนี้ถูกต้องหรือไม่และดูเหมือนว่าจะมีข้อโต้แย้ง: stackoverflow.com/questions/3209139/ …
jyoungdev

มันเป็นแบบอินไลน์ดังนั้นคุณสามารถพิจารณาได้ O (0) อย่างไรก็ตามอัลกอริธึม O (0) ทั้งหมดนั้นเล็กน้อย (ไม่ทำอะไรเลย) ดังนั้น ... ไม่ใช่คำตอบที่น่าสนใจมาก
สเตฟาน Reich

@StefanReich จริงมันไม่ใช่คำตอบที่น่าสนใจมาก แต่มันเป็นคำตอบ
สจ๊วต

-2

นี่เป็นอัลกอริทึม O (1 / n) ที่ง่าย และมันก็ทำสิ่งที่น่าสนใจ!

function foo(list input) {
  int m;
  double output;

  m = (1/ input.size) * max_value;  
  output = 0;
  for (int i = 0; i < m; i++)
    output+= random(0,1);

  return output;
}

เป็นไปได้ O (1 / n) ตามที่อธิบายถึงวิธีการที่เอาท์พุทของฟังก์ชั่นการเปลี่ยนแปลงให้เพิ่มขนาดของการป้อนข้อมูล หากเรากำลังใช้ฟังก์ชั่น 1 / n เพื่ออธิบายจำนวนคำสั่งที่ฟังก์ชั่นดำเนินการก็ไม่จำเป็นที่ฟังก์ชันจะใช้คำสั่งเป็นศูนย์สำหรับขนาดอินพุตใด ๆ แต่เป็นสำหรับทุกขนาดอินพุตซึ่งมากกว่า n บางขีด จำกัด จำนวนคำสั่งที่ต้องการนั้นถูกล้อมรอบด้วยค่าคงที่บวกที่คูณด้วย 1 / n เนื่องจากไม่มีจำนวนจริงที่ 1 / n เป็น 0 และค่าคงที่เป็นค่าบวกดังนั้นจึงไม่มีเหตุผลว่าทำไมฟังก์ชันจึงถูก จำกัด ให้ใช้คำสั่ง 0 หรือน้อยกว่า


1
เนื่องจาก O (1 / n) จะลดลงต่ำกว่าเส้นแนวนอน = 1 และเมื่อ n ถึงอนันต์โค้ดของคุณจะยังคงดำเนินการตามขั้นตอนจำนวนที่กำหนดอัลกอริทึมนี้จึงเป็นอัลกอริทึม O (1) Big-O สัญกรณ์เป็นฟังก์ชั่นของส่วนต่าง ๆ ทั้งหมดของอัลกอริทึมและมันเลือกอันที่ใหญ่ที่สุด เนื่องจากเมธอดจะเรียกใช้คำสั่งบางคำสั่งเสมอเมื่อ n ถึงอนันต์คุณจะเหลือคำสั่งเดิมที่ดำเนินการทุกครั้งดังนั้นวิธีนั้นจึงจะทำงานในเวลาคงที่ ได้รับมันจะไม่มากเวลา แต่นั่นไม่เกี่ยวข้องกับสัญกรณ์ Big-O
Lasse V. Karlsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.