ฉันเคยเห็นคำว่า "O (1) access time" นี้เคยหมายถึง "อย่างรวดเร็ว" แต่ฉันไม่เข้าใจความหมาย คำอื่น ๆ ที่ฉันเห็นในบริบทเดียวกันคือ "O (n) access time" ใครช่วยอธิบายง่ายๆว่าคำศัพท์เหล่านี้หมายถึงอะไร
ดูสิ่งนี้ด้วย
ฉันเคยเห็นคำว่า "O (1) access time" นี้เคยหมายถึง "อย่างรวดเร็ว" แต่ฉันไม่เข้าใจความหมาย คำอื่น ๆ ที่ฉันเห็นในบริบทเดียวกันคือ "O (n) access time" ใครช่วยอธิบายง่ายๆว่าคำศัพท์เหล่านี้หมายถึงอะไร
ดูสิ่งนี้ด้วย
คำตอบ:
คุณจะต้องการอ่านลำดับความซับซ้อน
http://en.wikipedia.org/wiki/Big_O_notation
กล่าวโดยย่อ O (1) หมายความว่าต้องใช้เวลาคงที่เช่น 14 นาโนวินาทีหรือสามนาทีไม่ว่าข้อมูลในชุดจะมีจำนวนเท่าใดก็ตาม
O (n) หมายถึงต้องใช้เวลาเป็นเส้นตรงกับขนาดของชุดดังนั้นชุดขนาดสองเท่าจะใช้เวลาสองเท่า คุณอาจไม่ต้องการใส่วัตถุเป็นล้านชิ้นลงในสิ่งเหล่านี้
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }
O(1)
โดยพื้นฐานแล้วหมายความว่าต้องใช้เวลาเท่ากันในการค้นหามูลค่าในคอลเลกชันของคุณไม่ว่าคุณจะมีสินค้าจำนวนน้อยในคอลเลกชันของคุณหรือจำนวนมาก (ภายในข้อ จำกัด ของฮาร์ดแวร์ของคุณ)
O (n) หมายความว่าเวลาที่ใช้ในการค้นหารายการนั้นเป็นสัดส่วนกับจำนวนรายการในคอลเลกชัน
ตัวอย่างทั่วไปของสิ่งเหล่านี้คืออาร์เรย์ซึ่งสามารถเข้าถึงได้โดยตรงโดยไม่คำนึงถึงขนาดและรายการที่เชื่อมโยงซึ่งจะต้องข้ามตามลำดับตั้งแต่เริ่มต้นเพื่อเข้าถึงรายการที่กำหนด
การดำเนินการอื่น ๆ ที่มักกล่าวถึงคือการแทรก คอลเลกชันสามารถเป็น O (1) สำหรับการเข้าถึง แต่ O (n) สำหรับการแทรก ในความเป็นจริงอาร์เรย์มีลักษณะการทำงานเช่นนี้เนื่องจากการแทรกรายการที่อยู่ตรงกลางคุณจะต้องย้ายแต่ละรายการไปทางขวาโดยคัดลอกลงในช่องต่อไปนี้
ทุกคำตอบที่ตอบในคำถามนี้จะบอกคุณว่าค่า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;
}
เนื่องจากเราต้องวนซ้ำผ่านอาร์เรย์เพื่อตรวจสอบองค์ประกอบทีละรายการ
O (1) หมายถึงเวลาในการเข้าถึงบางสิ่งไม่ขึ้นอยู่กับจำนวนรายการในคอลเลกชัน
O (N) หมายถึงเวลาในการเข้าถึงรายการเป็นสัดส่วนกับจำนวน (N) ของรายการในคอลเลกชัน
O (1) ไม่ได้แปลว่า "เร็ว" หมายความว่าเวลาที่ใช้จะคงที่และไม่ได้ขึ้นอยู่กับขนาดของอินพุตไปยังฟังก์ชัน ค่าคงที่อาจเร็วหรือช้า O (n) หมายถึงเวลาที่ฟังก์ชันใช้จะเปลี่ยนไปตามสัดส่วนโดยตรงกับขนาดของอินพุตไปยังฟังก์ชันซึ่งแสดงด้วย n อีกครั้งอาจเร็วหรือช้า แต่จะช้าลงเมื่อขนาดของ n เพิ่มขึ้น
เรียกว่าสัญกรณ์ Big Oและอธิบายเวลาค้นหาอัลกอริทึมต่างๆ
O (1) หมายถึงเวลารันกรณีเลวร้ายที่สุดจะคงที่ สำหรับสถานการณ์ส่วนใหญ่หมายความว่าคุณไม่จำเป็นต้องค้นหาคอลเลกชันโดยละเอียดคุณสามารถค้นหาสิ่งที่คุณกำลังค้นหาได้ทันที
O(1)
ดำเนินการในเวลาเดียวกันเสมอโดยไม่คำนึงถึงชุดข้อมูล n ตัวอย่างของ O (1) จะเป็น ArrayList ที่เข้าถึงองค์ประกอบด้วยดัชนี
O(n)
หรือที่เรียกว่า Linear Order ประสิทธิภาพจะเพิ่มขึ้นในเชิงเส้นและตามสัดส่วนโดยตรงกับขนาดของข้อมูลอินพุต ตัวอย่างของ O (n) จะเป็นการแทรกและลบ ArrayList ในตำแหน่งสุ่ม เนื่องจากการแทรก / ลบแต่ละครั้งในตำแหน่งสุ่มจะทำให้องค์ประกอบใน ArrayList เลื่อนไปทางซ้ายขวาของอาร์เรย์ภายในเพื่อรักษาโครงสร้างเชิงเส้นโดยไม่ต้องพูดถึงการสร้างอาร์เรย์ใหม่และการคัดลอกองค์ประกอบจากเก่า ไปยังอาร์เรย์ใหม่ซึ่งใช้เวลาในการประมวลผลที่แพงจึงส่งผลเสียต่อประสิทธิภาพ
"Big O notation" เป็นวิธีแสดงความเร็วของอัลกอริทึม n
คือจำนวนข้อมูลที่อัลกอริทึมทำงานด้วย O(1)
หมายความว่าไม่ว่าข้อมูลจะมากแค่ไหนก็จะดำเนินการในเวลาคงที่ O(n)
หมายความว่าเป็นสัดส่วนกับจำนวนข้อมูล
โดยทั่วไป O (1) หมายถึงเวลาในการคำนวณของมันคือคงที่ในขณะ O (n) หมายความว่ามันจะขึ้นอยู่lineallyกับขนาดของอินพุต - คือการวนลูปผ่านอาร์เรย์มี O (n) - เพียงแค่บ่วง - เพราะมันขึ้นอยู่กับจำนวน ของรายการในขณะที่คำนวณค่าสูงสุดระหว่างตัวเลขปกติมี O (1)
Wikipedia อาจช่วยได้เช่นกัน: http://en.wikipedia.org/wiki/Computational_complexity_theory
วิธีที่ง่ายที่สุดในการแยกความแตกต่างของ O (1) และ O (n) คือการเปรียบเทียบอาร์เรย์และรายการ
สำหรับอาร์เรย์หากคุณมีค่าดัชนีที่ถูกต้องคุณสามารถเข้าถึงข้อมูลได้ทันที (หากคุณไม่ทราบดัชนีและต้องวนรอบอาร์เรย์ก็จะไม่เป็น O (1) อีกต่อไป)
สำหรับรายการคุณจะต้องวนลูปเสมอไม่ว่าคุณจะรู้จักดัชนีหรือไม่ก็ตาม
นี่คือการเปรียบเทียบง่ายๆ ลองนึกภาพว่าคุณกำลังดาวน์โหลดภาพยนตร์ออนไลน์ด้วย O (1) หากใช้เวลา 5 นาทีในการดาวน์โหลดภาพยนตร์หนึ่งเรื่องจะยังคงใช้เวลาเท่าเดิมในการดาวน์โหลดภาพยนตร์ 20 เรื่อง ดังนั้นไม่สำคัญว่าคุณจะดาวน์โหลดภาพยนตร์กี่เรื่อง แต่จะใช้เวลาเท่ากัน (5 นาที) ไม่ว่าจะเป็นภาพยนตร์หนึ่งเรื่องหรือ 20 เรื่อง ตัวอย่างปกติของการเปรียบเทียบนี้คือเมื่อคุณไปที่ไลบรารีภาพยนตร์ไม่ว่าคุณจะดูหนัง 1 เรื่องหรือ 5 เรื่องคุณก็แค่เลือกดูพร้อมกัน จึงใช้เวลาเท่ากัน
อย่างไรก็ตามด้วย O (n) หากใช้เวลา 5 นาทีในการดาวน์โหลดภาพยนตร์หนึ่งเรื่องจะใช้เวลาประมาณ 50 นาทีในการดาวน์โหลดภาพยนตร์ 10 เรื่อง ดังนั้นเวลาจึงไม่คงที่หรือเป็นสัดส่วนกับจำนวนภาพยนตร์ที่คุณกำลังดาวน์โหลด
หมายความว่าเวลาในการเข้าถึงคงที่ ไม่ว่าคุณจะเข้าถึงจาก 100 หรือ 100,000 ระเบียนเวลาในการดึงข้อมูลจะเท่ากัน
ในทางตรงกันข้ามเวลาในการเข้าถึง O (n) จะบ่งชี้ว่าเวลาในการดึงข้อมูลนั้นแปรผันตรงกับจำนวนบันทึกที่คุณเข้าถึง
หมายความว่าการเข้าถึงใช้เวลาคงที่กล่าวคือไม่ขึ้นอยู่กับขนาดของชุดข้อมูล O (n) หมายความว่าการเข้าถึงจะขึ้นอยู่กับขนาดของชุดข้อมูลเชิงเส้น
O เรียกอีกอย่างว่า big-O
บทนำสู่อัลกอริทึม: 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)
O (1) หมายถึงการเข้าถึงโดยสุ่ม ในหน่วยความจำเข้าถึงโดยสุ่มเวลาที่ใช้ในการเข้าถึงองค์ประกอบใด ๆ ในสถานที่ใด ๆ จะเท่ากัน เวลานี้อาจเป็นจำนวนเต็มก็ได้ แต่สิ่งเดียวที่ต้องจำคือเวลาที่ใช้ในการดึงข้อมูลที่ตำแหน่ง (n-1) th หรือ n จะเท่ากัน (เช่นค่าคงที่)
ในขณะที่ O (n) ขึ้นอยู่กับขนาดของ n
ตามมุมมองของฉัน
O (1) หมายถึงเวลาในการดำเนินการหนึ่งการดำเนินการหรือคำสั่งในแต่ละครั้งเป็นหนึ่งในการวิเคราะห์ความซับซ้อนของอัลกอริทึมสำหรับกรณีที่ดีที่สุด