“ O (1) access time” หมายถึงอะไร


127

ฉันเคยเห็นคำว่า "O (1) access time" นี้เคยหมายถึง "อย่างรวดเร็ว" แต่ฉันไม่เข้าใจความหมาย คำอื่น ๆ ที่ฉันเห็นในบริบทเดียวกันคือ "O (n) access time" ใครช่วยอธิบายง่ายๆว่าคำศัพท์เหล่านี้หมายถึงอะไร

ดูสิ่งนี้ด้วย


สิ่งนี้อาจช่วยได้: stackoverflow.com/questions/471199/…
Mehrdad Afshari

คำตอบ:


161

คุณจะต้องการอ่านลำดับความซับซ้อน

http://en.wikipedia.org/wiki/Big_O_notation

กล่าวโดยย่อ O (1) หมายความว่าต้องใช้เวลาคงที่เช่น 14 นาโนวินาทีหรือสามนาทีไม่ว่าข้อมูลในชุดจะมีจำนวนเท่าใดก็ตาม

O (n) หมายถึงต้องใช้เวลาเป็นเส้นตรงกับขนาดของชุดดังนั้นชุดขนาดสองเท่าจะใช้เวลาสองเท่า คุณอาจไม่ต้องการใส่วัตถุเป็นล้านชิ้นลงในสิ่งเหล่านี้


66
เพื่อเป็นการอวดดีไม่ได้หมายความว่ารันไทม์ (หรือจำนวนการดำเนินการ ฯลฯ ) จะคงที่ หมายความว่ามีค่าคงที่ที่รันไทม์ (หรือจำนวนการดำเนินการ ฯลฯ ) ถูกล้อมรอบด้านบนด้วยค่าคงที่ ยังคงอาจจะแปรปรวนขนาดใหญ่ในรันไทม์: เช่นเป็นint main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; } O(1)
สัน

ข้อมูลเชิงลึกที่ยอดเยี่ยม @jason!
Chris Ruskai

35

โดยพื้นฐานแล้วหมายความว่าต้องใช้เวลาเท่ากันในการค้นหามูลค่าในคอลเลกชันของคุณไม่ว่าคุณจะมีสินค้าจำนวนน้อยในคอลเลกชันของคุณหรือจำนวนมาก (ภายในข้อ จำกัด ของฮาร์ดแวร์ของคุณ)

O (n) หมายความว่าเวลาที่ใช้ในการค้นหารายการนั้นเป็นสัดส่วนกับจำนวนรายการในคอลเลกชัน

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

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


21

ทุกคำตอบที่ตอบในคำถามนี้จะบอกคุณว่าค่าO(1)เฉลี่ยของเวลาคงที่ (ไม่ว่าจะเกิดอะไรขึ้นกับการวัดอาจเป็นรันไทม์จำนวนการดำเนินการ ฯลฯ ) สิ่งนี้ไม่ถูกต้อง

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

int firstElement(int *a, int n) {
    return a[0];
}

แต่ฟังก์ชันนี้O(1)เกินไป:

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

รันไทม์ที่นี่มีขอบเขตเหนือ 1 ปี แต่เวลาส่วนใหญ่รันไทม์จะอยู่ในลำดับนาโนวินาที

หากต้องการกล่าวว่ารันไทม์O(n)หมายความว่ามีค่าคงcที่ซึ่งรันไทม์ถูกล้อมรอบด้านบนโดยc * nที่nวัดขนาดของอินพุต ตัวอย่างเช่นการค้นหาจำนวนครั้งที่เกิดขึ้นของจำนวนเต็มที่เฉพาะในอาร์เรย์ของnจำนวนเต็มที่ไม่เรียงลำดับโดยอัลกอริทึมต่อไปนี้คือO(n):

int count(int *a, int n, int item) {
    int c = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] == item) c++;
    }
    return c;
}

เนื่องจากเราต้องวนซ้ำผ่านอาร์เรย์เพื่อตรวจสอบองค์ประกอบทีละรายการ


19

O (1) หมายถึงเวลาในการเข้าถึงบางสิ่งไม่ขึ้นอยู่กับจำนวนรายการในคอลเลกชัน

O (N) หมายถึงเวลาในการเข้าถึงรายการเป็นสัดส่วนกับจำนวน (N) ของรายการในคอลเลกชัน


14

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


9

เรียกว่าสัญกรณ์ Big Oและอธิบายเวลาค้นหาอัลกอริทึมต่างๆ

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


แทนที่ "เวลาค้นหา" ด้วย "เวลาทำงานที่เลวร้ายที่สุด" แล้วฉันก็อยู่กับคุณ
Jason Punyon

2
@Seb: ฉันคิดว่ามันเป็นแค่การเรียกชื่อผิดในส่วนของเขาโดยเฉพาะเพราะ OP ถามเกี่ยวกับเวลาในการเข้าถึง
jkeys

6

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

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


4

"Big O notation" เป็นวิธีแสดงความเร็วของอัลกอริทึม nคือจำนวนข้อมูลที่อัลกอริทึมทำงานด้วย O(1)หมายความว่าไม่ว่าข้อมูลจะมากแค่ไหนก็จะดำเนินการในเวลาคงที่ O(n)หมายความว่าเป็นสัดส่วนกับจำนวนข้อมูล


3

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

Wikipedia อาจช่วยได้เช่นกัน: http://en.wikipedia.org/wiki/Computational_complexity_theory


3

วิธีที่ง่ายที่สุดในการแยกความแตกต่างของ O (1) และ O (n) คือการเปรียบเทียบอาร์เรย์และรายการ

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

สำหรับรายการคุณจะต้องวนลูปเสมอไม่ว่าคุณจะรู้จักดัชนีหรือไม่ก็ตาม


ฉันกำลังมองหาตัวอย่างของ O (1) และมีเพียงคำตอบนี้เท่านั้นที่มีคำอธิบาย
neelmeg

3

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

อย่างไรก็ตามด้วย O (n) หากใช้เวลา 5 นาทีในการดาวน์โหลดภาพยนตร์หนึ่งเรื่องจะใช้เวลาประมาณ 50 นาทีในการดาวน์โหลดภาพยนตร์ 10 เรื่อง ดังนั้นเวลาจึงไม่คงที่หรือเป็นสัดส่วนกับจำนวนภาพยนตร์ที่คุณกำลังดาวน์โหลด


1

หมายความว่าเวลาในการเข้าถึงคงที่ ไม่ว่าคุณจะเข้าถึงจาก 100 หรือ 100,000 ระเบียนเวลาในการดึงข้อมูลจะเท่ากัน

ในทางตรงกันข้ามเวลาในการเข้าถึง O (n) จะบ่งชี้ว่าเวลาในการดึงข้อมูลนั้นแปรผันตรงกับจำนวนบันทึกที่คุณเข้าถึง


1

หมายความว่าการเข้าถึงใช้เวลาคงที่กล่าวคือไม่ขึ้นอยู่กับขนาดของชุดข้อมูล O (n) หมายความว่าการเข้าถึงจะขึ้นอยู่กับขนาดของชุดข้อมูลเชิงเส้น

O เรียกอีกอย่างว่า big-O


1

บทนำสู่อัลกอริทึม: Second Edition โดย Cormen, Leiserson, Rivest & Stein กล่าวในหน้า 44 ว่า

เนื่องจากค่าคงที่เป็นพหุนามดีกรี 0 เราจึงสามารถแสดงฟังก์ชันคงที่เป็น Theta (n ^ 0) หรือ Theta (1) ได้ อย่างไรก็ตามสัญกรณ์หลังนี้เป็นการละเมิดเล็กน้อยเนื่องจากยังไม่ชัดเจนว่าตัวแปรใดมีแนวโน้มที่จะไม่มีที่สิ้นสุด เรามักจะใช้สัญกรณ์ Theta (1) เพื่อหมายถึงค่าคงที่หรือฟังก์ชันคงที่เมื่อเทียบกับตัวแปรบางตัว ... เราแสดงโดย O (g (n)) ... ชุดของฟังก์ชัน f (n) ซึ่งมีค่าคงที่เป็นบวก c และ n0 เช่นนั้น 0 <= f (n) <= c * g (n) สำหรับ n> = n0 ทั้งหมด ... โปรดสังเกตว่า f (n) = Theta (g (n)) หมายถึง f (n) = O (g (n)) เนื่องจากสัญกรณ์ Theta นั้นแข็งแกร่งกว่าสัญกรณ์ O

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


-2

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

ในขณะที่ O (n) ขึ้นอยู่กับขนาดของ n


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

-3

ตามมุมมองของฉัน

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


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