រំលងទៅមាតិកា

កម្មវិធីបង្ហាញ Circular Queue

Ring buffer ប្រើប្រាស់ឡើងវិញគ្រប់ចន្លោះ៖ មើល front និង rear វិលជុំវិញជាមួយ (index + 1) mod capacity។

Size: 0 Capacity: 8 front: 0 rear: −1

A circular queue reuses the array: when rear reaches the end it wraps around to index 0 with (index + 1) mod capacity.

Step 1 of 1

// Ring buffer: front = 0, rear = N − 1, size = 0 at the startenqueue(x):  if size = N: error "queue full"  rear = (rear + 1) mod N  a[rear] = x; size = size + 1dequeue():  if size = 0: error "queue empty"  x = a[front]  front = (front + 1) mod N; size = size − 1; return xpeek(): return a[front]
Circular queue operations
OperationTime
EnqueueO(1)
DequeueO(1)
PeekO(1)
Is full / is emptyO(1) with a size counter
SpaceO(N), every slot reused

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

  1. វាយតម្លៃរួចចុច Enqueue; ចុច Dequeue ឬ Peek ដើម្បីអានពីខាងមុខ។
  2. មើលស្លាក front និង rear រំកិលជុំវិញរង្វង់ និងតាមបណ្តោយ array។
  3. បន្តអនុវត្តរហូតដល់ rear វិលជុំពីសន្ទស្សន៍ 7 ត្រឡប់មកសន្ទស្សន៍ 0 វិញ។
  4. បំពេញឱ្យគ្រប់ទាំង 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)។