Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Melaksanakan Baris Gilir dengan Cekap dalam Go Menggunakan Slices dan Buffer Pekeliling?

Bagaimana untuk Melaksanakan Baris Gilir dengan Cekap dalam Go Menggunakan Slices dan Buffer Pekeliling?

DDD
Lepaskan: 2024-11-25 22:31:12
asal
624 orang telah melayarinya

How to Efficiently Implement a Queue in Go Using Slices and Circular Buffers?

Bagaimana untuk melaksanakan baris gilir dalam Go?

Dalam Go, perpustakaan standard tidak menyediakan bekas baris gilir terbina dalam. Artikel ini membentangkan pendekatan alternatif untuk melaksanakan baris gilir dalam Go menggunakan kepingan sebagai struktur data asas.

Membuat Baris Gilir

Untuk membuat baris gilir, anda boleh mengisytiharkan kepingan kosong:

queue := []int{}
Salin selepas log masuk

Berbaris Elemen

Untuk menambah elemen pada baris gilir, tambahkan elemen itu pada penghujung hirisan:

queue = append(queue, 6)
Salin selepas log masuk

Elemen Penyahgantian

Untuk mengalih keluar elemen daripada baris gilir, tetapkan elemen pertama hirisan kepada pembolehubah dan kemudian alih keluarnya menggunakan penghirisan:

el := queue[0]
queue = queue[1:]
Salin selepas log masuk

Pertimbangan Prestasi

Walaupun baris gilir berasaskan kepingan mudah dilaksanakan, ia mempunyai beberapa had. Setiap operasi enqueue memerlukan peruntukan semula tatasusunan yang mendasari, yang boleh menjadi tidak cekap untuk baris gilir yang besar.

Untuk mengurangkan isu ini, anda boleh menggunakan pelaksanaan penimbal bulat. Dalam penimbal bulat, elemen ditambah dan dialih keluar daripada kedudukan yang telah ditetapkan dalam penimbal, mengelakkan keperluan untuk peruntukan semula tatasusunan yang mahal.

Kod Contoh

Berikut ialah contoh pelaksanaan penimbal bulat:

package main

import (
    "fmt"
)

// Queue represents a circular buffer queue.
type Queue struct {
    buf []int
    head int
    tail int
}

// NewQueue creates a new queue with the given buffer size.
func NewQueue(size int) *Queue {
    return &Queue{make([]int, size), 0, 0}
}

// Enqueue adds an element to the queue.
func (q *Queue) Enqueue(v int) {
    q.buf[q.tail] = v
    q.tail = (q.tail + 1) % len(q.buf)
}

// Dequeue removes and returns the oldest element from the queue.
func (q *Queue) Dequeue() int {
    v := q.buf[q.head]
    q.head = (q.head + 1) % len(q.buf)
    return v
}
Salin selepas log masuk

Pelaksanaan ini memberikan prestasi yang lebih baik untuk operasi enqueue/dequeue, terutamanya dengan baris gilir yang besar.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Baris Gilir dengan Cekap dalam Go Menggunakan Slices dan Buffer Pekeliling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan