Circular queue (ហៅម្យ៉ាងទៀតថា ring buffer) រក្សាទុក queue ក្នុង array ដែលមានទំហំថេរ ប៉ុន្តែចាត់ទុក array នោះជារង្វង់មូល៖ នៅពេល rear រំកិលហួសចន្លោះចុងក្រោយ វានឹងវិលត្រឡប់ទៅកាន់ចន្លោះ 0 វិញ។ Visualizer នេះគូរបង្ហាញ buffer ពីររបៀប ជារង្វង់ 8 ចន្លោះ និងជា array ផ្ទាល់ពីក្រោម ជាមួយ front និង rear pointers នៅលើទាំងពីរ។
Enqueue, dequeue និង peek ត្រូវបានបង្ហាញជាគំនូរជីវចលរួមជាមួយការគណនា modulo ដូចជា rear = (7 + 1) mod 8 = 0។ កម្មវិធីរាប់ទំហំ (size counter) ជួយសម្គាល់រវាង queue ពេញ និងទទេ ឱ្យដាច់ពីគ្នា។ គ្រប់ប្រតិបត្តិការទាំងអស់ដំណើរការក្នុងកម្រិត O(1) ហើយគ្មានចន្លោះណាត្រូវខាតបង់ឡើយ។
របៀបប្រើឧបករណ៍ កម្មវិធីបង្ហាញ Circular Queue
- វាយតម្លៃរួចចុច Enqueue; ចុច Dequeue ឬ Peek ដើម្បីអានពីខាងមុខ។
- មើលស្លាក front និង rear រំកិលជុំវិញរង្វង់ និងតាមបណ្តោយ array។
- បន្តអនុវត្តរហូតដល់ rear វិលជុំពីសន្ទស្សន៍ 7 ត្រឡប់មកសន្ទស្សន៍ 0 វិញ។
- បំពេញឱ្យគ្រប់ទាំង 8 ចន្លោះដើម្បីមើលការត្រួតពិនិត្យភាពពេញ រួចដកទិន្នន័យចេញឱ្យទទេវិញ។
ហេតុអ្វីប្រើ កម្មវិធីបង្ហាញ Circular Queue របស់ ToolOrca
- ទិដ្ឋភាពជារង្វង់ និងជា array ទន្ទឹមគ្នា
- Front និង rear pointers វិលជុំវិញ
- បង្ហាញការគណនា modulo សម្រាប់រាល់ការផ្លាស់ទី
- Size counter ដើម្បីបែងចែករវាងពេញ និងទទេ
- បន្លិច Pseudocode សម្រាប់ជំហាននីមួយៗ
- កូដជា C++, Java, Python និង JavaScript
ដំណើរការរបស់ circular queue
Queue រក្សាតួលេខបី៖ front (សន្ទស្សន៍តម្លៃដំបូង), rear (សន្ទស្សន៍តម្លៃចុងក្រោយ) និង size។ ដើម្បី enqueue សូមរំកិល rear មួយជំហានជាមួយ rear = (rear + 1) mod N ហើយសរសេរតម្លៃនៅទីនោះ។ ដើម្បី dequeue សូមអាន a[front] ហើយរំកិល front = (front + 1) mod N។ mod N នេះហើយដែលធ្វើឱ្យសន្ទស្សន៍វិលជុំវិញ។
នៅពេល front និង rear ចង្អុលទៅចន្លោះតែមួយ queue អាចមានតម្លៃមួយ ឬអាចពេញទាំងស្រុងបន្ទាប់ពីវិលជុំ ដូច្នេះអ្នកត្រូវការព័ត៌មានបន្ថែម។ ដំណោះស្រាយទូទៅពីរគឺ ការប្រើ size counter (ប្រើនៅទីនេះ) ឬទុកចន្លោះទំនេរមួយជានិច្ច ដូច្នេះ queue ពេញនៅពេល (rear + 1) mod N = front។
កន្លែងដែលគេប្រើ ring buffer
Ring buffers ត្រូវបានប្រើនៅគ្រប់ទីកន្លែងដែលមានលំហូរទិន្នន័យចូលក្នុងអត្រាថេរ ហើយអង្គចងចាំមិនត្រូវកើនឡើង៖ audio និង video buffers, network packet queues, keyboard buffers, ការកត់ត្រាព្រឹត្តិការណ៍ N ចុងក្រោយ, និង producer-consumer queues រវាង threads។ ArrayDeque របស់ Java និង collections.deque របស់ Python ត្រូវបានបង្កើតឡើងផ្អែកលើគំនិតស្រដៀងគ្នានេះ។
Visualizer ទាំងអស់នៅលើគេហទំព័រនេះដំណើរការក្នុងកម្មវិធីរុករករបស់អ្នក ជាមួយប៊ូតុងបញ្ជាដូចគ្នា៖ Play, Pause, Step forward, Step back និងគ្រាប់រំកិលល្បឿន។ អ្នកក៏អាចអូសគ្រាប់រំកិលទីតាំងដើម្បីផ្លោះទៅជំហានណាមួយ ឬចុចលើផ្ទាំងគំនូររួចប្រើ Space bar និងគ្រាប់ចុចព្រួញ។
សំណួរដែលសួរញឹកញាប់
តើ circular queue គឺជាអ្វី?
ជា queue ដែលរក្សាទុកក្នុង array ទំហំថេរដែលក្បាលកន្ទុយភ្ជាប់គ្នា ដូច្នេះនៅពេល rear ដល់ចន្លោះចុងក្រោយ វានឹងបន្តនៅចន្លោះ 0 ឡើងវិញ។ វាជួយកាត់បន្ថយការខ្ជះខ្ជាយទំហំដែលកើតមានក្នុង array queue ធម្មតា។
តើត្រូវរំកិល rear pointer ក្នុង circular queue យ៉ាងដូចម្តេច?
rear = (rear + 1) mod capacity។ ជាមួយទំហំផ្ទុក 8 ចន្លោះ rear នឹងរំកិលពី 5, 6, 7, 0, 1 ជាដើម។
តើអ្នកដឹងដោយរបៀបណាថា circular queue ពេញ?
ប្រើ size counter ហើយពិនិត្យមើល size = capacity ឬទុកចន្លោះទំនេរមួយចោលរួចពិនិត្យ (rear + 1) mod capacity = front។
តើ time complexity នៃ circular queue គឺជាអ្វី?
Enqueue, dequeue, peek ព្រមទាំងការពិនិត្យពេញ និងទទេ សុទ្ធតែជា O(1)។