Golang'da Veri Yapısını Ayarladı


69

Google golang'ı gerçekten seviyorum, ancak bazıları standart kütüphaneden setler gibi temel bir veri yapısını bırakmış olan uygulayıcıların mantığının ne olduğunu açıklayabilir mi?


8
Dil aslında Golang, Golang değil
jozefg

92
Ama "golang" daha aranabilir
Matt

18
Daha fazla aranabilir. Googling "go set", siyah ve beyaz parçalarla ahşap tahta görüntüleri döndürür.
Doug Richardson,

Yanıtlar:


68

Bu ihmalin olası bir nedeni, kümeleri bir harita ile modellemenin gerçekten kolay olmasıdır.

Dürüst olmak gerekirse, sanırım biraz da bir gözetim, ancak Perl'e bakıldığında, hikaye tamamen aynı. Perl'de listeler ve hashtables alırsınız, Go'da diziler, dilimler ve haritalar alırsınız. Perl'de genellikle bir setle ilgili her türlü problem için bir karma tablo kullanırsınız, aynısı Go için de geçerlidir.

Örnek

Go'da ayarlanmış bir bölümü taklit etmek için bir harita tanımlarız:

set := make(map[int]bool)

Bir şey eklemek kadar kolaydır:

i := valueToAdd()
set[i] = true

Bir şeyi silmek sadece

delete(set, i)

Ve bu yapının potansiyel garipliği kolayca soyutlanabilir:

type IntSet struct {
    set map[int]bool
}

func (set *IntSet) Add(i int) bool {
    _, found := set.set[i]
    set.set[i] = true
    return !found   //False if it existed already
}

Ve sil ve al benzer şekilde tanımlanabilir, burada tam bir uygulama var . Buradaki en büyük dezavantaj, gitmenin jenerik olmaması. Bununla birlikte interface{}, bu durumda bunun sonucunu çıkarmanız gerekebilir.


3
İşte İçerik ve Boyut metotları ile biraz gözden geçirilmiş versiyonum: play.golang.org/p/tDdutH672-
Rick-777

19
Bir yerine bunun yerine map[int]boolkullanabilirsiniz map[int]struct{}. Sonuncuyu tercih ederim.
pepper_chico

20
map[int]struct{}.. struct{}0 bayt alır.
Boopathi Rajaa,

2
github.com/fatih/set haritalarım ve boş yapılara dayanarak yapılan bir uygulamam. İpliği güvenli ve basit bir api var.
Fatih Arslan,

6
İle map[int]struct{}size yapamaz if mymap["key"] {üyelik için kontrol etmek. Google, kullanılmasını önerirbool ("Bir küme uygulanabilir" ifadesini arayın).
Timmmm

3

Bunun golangsadeliğe odaklanmakla ilgisi olduğunu düşünüyorum . setgerçekten kullanışlı hale s difference, intersection, union, issubset, vb .. yöntemler. Belki de golangekip bunun bir veri yapısı için çok fazla olduğunu hissetti. Ancak, aksi takdirde @jozefg tarafından açıklandığı gibi kolayca sahip addolan containsve removekolaylıkla çoğaltılabilen bir "aptal set" map.


katılmıyorum. bir küme çoğunlukla üyelik kontrolleri ve teklik anlambilimi için kullanılır. Bir dizi uygulama bu yöntemler olmadan mükemmel bir şekilde kullanılabilir. söyleniyor, onlar da uygulamak için önemsiz.
Sedat Kapanoğlu

2

Önceki cevap, SADECE anahtarın yerleşik bir tip olması durumunda işe yarar. Önceki cevabı tamamlamak için, öğeleri kullanıcı tanımlı türlerden oluşan bir kümeyi uygulamanın bir yolu:

package math

// types

type IntPoint struct {
    X, Y int
}

// set implementation for small number of items
type IntPointSet struct {
    slice []IntPoint 
}

// functions

func (p1 IntPoint) Equals(p2 IntPoint) bool {
    return (p1.X == p2.X) && (p1.Y == p2.Y)
}

func (set *IntPointSet) Add(p IntPoint) {
    if ! set.Contains(p) {
        set.slice = append(set.slice, p)
    }
}

func (set IntPointSet) Contains(p IntPoint) bool {
  for _, v := range set.slice {
    if v.Equals(p) {
      return true
    }
  }
  return false
}

func (set IntPointSet) NumElements() int {
    return len(set.slice)
}

func NewIntPointSet() IntPointSet {
  return IntPointSet{(make([]IntPoint, 0, 10))}
}

8
"SADECE anahtar yerleşik bir tip ise işe yarar" yanlıştır . type mySet map[IntPoint]boolmükemmel çalışıyor. Bütün bunlar bir harita kullanılan anahtar tip istendiğini olduğunu o olduğunu ==ve!= . Yapı tiplerinin eşitliği iyi tanımlanmış, Equalsyönteminiz adil olmalı p1 == p2.
Dave C

1
Yapılar için eşitliğin iyi tanımlandığı doğrudur, ancak eğer yapı alanlar olarak haritalar veya dilimler içeriyorsa, değer yerine değer referansla karşılaştırılır. İstediğin bu olmayabilir.
Chaim-Leib Halbert

1
Bu çözümle ilgili biraz sorun yaşıyorum çünkü üye sayısına bakılmaksızın Containsdoğrusal zaman aMap[]alır, sabit zaman alır. Daha iyi bir çözüm, dahili olarak her üyenin içeriğini temel alan benzersiz bir anahtar oluşturur ve maptürün sağladığı sabit zamanlı sorgulamayı kullanır . Önbellek davranışını, vs. dikkate alan daha hızlı çözümler de var.
Chaim-Leib Halbert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.