O (mn) ถือว่าการเติบโตแบบ "เชิงเส้น" หรือ "กำลังสอง" หรือไม่?


24

ถ้าฉันมีฟังก์ชั่นบางตัวที่ความซับซ้อนของเวลาคือ O ( mn ) โดยที่mและnเป็นขนาดของอินพุตทั้งสองเราจะเรียกความซับซ้อนของเวลาว่า "เป็นเส้นตรง" (เนื่องจากเป็นเชิงเส้นทั้งในmและn ) หรือ "กำลังสอง" ( เนื่องจากเป็นผลิตภัณฑ์ที่มีสองขนาด) หรืออย่างอื่น?

ฉันรู้สึกว่าเรียกว่า "เป็นเส้นตรง" ทำให้สับสนเพราะ O (m + n) เป็นเส้นตรง แต่เร็วกว่ามาก แต่ฉันรู้สึกว่าเรียกมันว่า "กำลังสอง" นั้นก็แปลกเพราะมันเป็นเส้นตรงในตัวแปรแต่ละตัว


7
มันเป็นสิ่งสำคัญที่จะพูดเชิงเส้นในสิ่งที่ ตัวอย่างเช่นหากเรามีกราฟที่มี edge และn vertices O ( m + n )เป็นเส้นตรงในจำนวนขอบ แต่ (อาจเกิดขึ้นได้) กำลังสองในจำนวนจุดยอด mnO(m+n)
กราฟิลส์

3
ฉันคิดว่าความคิดเห็นของราฟาเอลเป็นจุด "เชิงเส้น" ต้องใช้สัมพันธ์กับบางสิ่งบางอย่างบ่อยครั้งขนาดของอินพุต หากคุณกำลัง transposing เมทริกซ์O ( n )คือ "เส้นตรง" ตั้งแต่การป้อนข้อมูลที่มีขนาดO ( n ) หากคุณกำลังค้นหาสตริงอักขระnในสตริงอักขระm , O ( m n )ไม่ใช่เชิงเส้น --- O ( m + n )จะเป็น m×nO(mn)O(mn)nmO(mn)O(m+n)
SamM

3
ฉันเห็นด้วยกับความคิดเห็นของ @ Raphael ด้วย แต่ในเวลาเดียวกันมันก็ไม่ใช่เรื่องแปลกที่จะได้ยินคนพูดว่าเวลาที่ซับซ้อนคือ "เชิงเส้น" โดยไม่พูดถึงสิ่งที่เกี่ยวข้อง และในบางกรณีมันไม่สำคัญเช่น O (m + n) เป็นแบบเชิงเส้นสัมพันธ์กับอินพุตทั้งหมดดังนั้นฉันจะไม่คิดว่าการเรียกมันเป็นเชิงเส้นสองครั้งเหมือนที่ SamM ทำขึ้น แต่นั่นทำให้เกิดคำถามว่าอะไรจะทำให้ O (mn) ไม่ตรง?
Mehrdad

3
@ Mehrdad: ฉันคิดว่าพื้นฐานคือ "ในขนาดอินพุตสมมติว่าการป้อนข้อมูลถูกเข้ารหัสเป็นสตริงไบนารี (บนเทปเครื่องทัวริง)" ขนาดอินพุตนี้เป็นฟังก์ชันของและmเอง SamM ให้ตัวอย่างที่ดี nm
กราฟิลส์

1
ดูเพิ่มเติมpeople.cis.ksu.edu/~rhowell/asymptotic.pdfบนสัญกรณ์รถม้าสี่ล้อในหลายตัวแปร
Jonas Kölker

คำตอบ:


18

ในวิชาคณิตศาสตร์ฟังก์ชันเช่นนี้เรียกว่าฟังก์ชันหลายเส้น แต่นักวิทยาศาสตร์คอมพิวเตอร์อาจไม่รู้คำศัพท์นี้โดยทั่วไป ฟังก์ชั่นนี้ไม่ควรเรียกว่าเป็นเส้นตรงไม่ว่าจะเป็นคณิตศาสตร์หรือวิทยาศาสตร์คอมพิวเตอร์เว้นแต่ว่าคุณสามารถพิจารณาหนึ่งในและnอย่างคงที่mn


อะไรทำให้การพิจารณาหนึ่งในและnเป็นค่าคงที่ที่เหมาะสม? mn
2768

11

หากต้องการอธิบายให้ชัดเจนเกี่ยวกับการอภิปรายในความคิดเห็นมันเป็นสิ่งสำคัญที่คุณวัดการเติบโตเมื่อเทียบกับ

ดังที่ @Kaveh กล่าวไว้ไม่ได้เป็นเส้นตรงทั้งสองในเวลาเดียวกัน แต่เป็นเส้นตรงถ้าหนึ่งคงที่และอีกเติบโตO(mn)

ในทางกลับกันน่าจะถือว่าเป็นเส้นตรง โดยสังหรณ์ใจถ้าmเป็นสองเท่าหรือถ้าnเป็นสองเท่าหรือแม้ว่าทั้งคู่กับmและn เป็นสองเท่าm + nจะไม่สามารถมากกว่าสองเท่าได้ นี่ไม่ใช่ความจริงของm n ; ถ้าmและnทั้งคู่m nเพิ่มขึ้น 4 นี่คือเหตุผลว่าทำไมในบริบทจำนวนมากเวลาทำงานนี้จึงถูกพิจารณาว่าเป็นกำลังสอง ฉันยกตัวอย่างสิ่งนี้ด้วยการจับคู่สตริงในวรรคสองO(m+n)mnmnm+nmnmnmn

แต่โดยปกติเมื่อคุณใช้สัญลักษณ์ Big- คุณจะใช้มันในการอ้างอิงถึงบางสิ่งโดยเฉพาะ เนื่องจากเราเป็นนักทฤษฎีส่วนใหญ่โดยทั่วไปแล้วขนาดของอินพุตกับปัญหาO

ตัวอย่างเช่นลองเพิ่มเมทริกซ์ เพิ่มสองเมทริกซ์ใช้เวลาO ( n )เวลา แต่องค์ประกอบของอินพุตของเราแต่ละครั้งจะถูกสัมผัสเพียงครั้งเดียวดังนั้นจึงมักจะเรียกว่าเชิงเส้น กล่าวอีกนัยหนึ่งอินพุตของเรามีขนาดO ( m n )ดังนั้นเวลาทำงานของO ( m n )จึงเป็นเชิงเส้นตรงตามขนาดของอินพุตm×nO(mn)O(mn)O(mn)

ตอนนี้เรามาดูการจับคู่สตริง - คือเราจะได้รับสตริงของขนาดและสตริงที่มีขนาดnและเราต้องการที่จะดูว่ามีการเกิดขึ้นของสตริงที่มีขนาดเล็กกว่าในสตริงที่ใหญ่กว่า เราสามารถตรวจสอบได้อย่างไร้เดียงสาในเวลาO ( m n ) ; โดยทั่วไปจะได้รับการพิจารณาเป็นกำลังสอง ทำไม? หากเมตรและnสามารถเป็นอะไรก็ได้ชุดม. = n จากนั้นเวลาในการทำงานของเราคือO ( ม. 2 )และการป้อนข้อมูลของเรามีขนาด2เมตรmnO(mn)mnm=nO(m2)2m

ในทางกลับกันถ้าเราใช้ราบินคาร์พ-ขั้นตอนวิธีการที่เราได้รับ (โดยเฉลี่ย) เวลา อินพุตของเราประกอบด้วยทั้งสองสตริงดังนั้นอินพุตของเรามีขนาดO ( m + n )เช่นกัน ดังนั้นโดยทั่วไปจะเรียกว่าเชิงเส้นO(m+n)O(m+n)

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


8

หากคุณมีการวัดเวลาการทำงานในแล้วO ( n )คือไม่ได้ฟังก์ชั่นเชิงเส้น( ม. , n ) หากไม่มีความสัมพันธ์ระหว่างmและnฟังก์ชั่นนี้จะเพิ่มขึ้นเป็นสองเท่าโดยทั่วไป(m,n)O(mn)(m,n)mn

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


3

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


2
อาจไม่มีตัวแปรที่โดดเด่นตัวอย่างเช่นหากคุณมีจำนวนโหนดและขอบ
ราฟาเอล

0

L={w1#w2|wi(Σ{#}),}fmin{|w1|,|w2|}f(|w|)w=w1#w2LO(|w1||w2|)LO(f(|w|)(|w|f(|w|))=O(f(|w|)|w|f(|w|)2)=O(f(|w|)|w|)

O(nlogn)

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