나는 세트가 필요한 "The go programming lanaguage"연습 문제 # 1.4를 풀려고합니다. 집합 유형을 만들 수 있지만 언어에 왜 포함되지 않습니까? 구아바도 시작된 Google에서 왔는데 언어 디자이너가 기본 데이터 구조에 대한 지원을 추가하지 않은 이유는 무엇입니까? 왜 당신의 사용자가 집합처럼 아주 기본적인 것에 대한 자신의 구현을 만들도록 강요합니까?
나는 세트가 필요한 "The go programming lanaguage"연습 문제 # 1.4를 풀려고합니다. 집합 유형을 만들 수 있지만 언어에 왜 포함되지 않습니까? 구아바도 시작된 Google에서 왔는데 언어 디자이너가 기본 데이터 구조에 대한 지원을 추가하지 않은 이유는 무엇입니까? 왜 당신의 사용자가 집합처럼 아주 기본적인 것에 대한 자신의 구현을 만들도록 강요합니까?
답변:
부분적으로, Go에는 제네릭이 없기 때문에 (따라서 모든 유형에 대해 하나의 세트 유형이 필요하거나 반사에 폴백하여 다소 비효율적입니다).
부분적으로, "개별 요소를 세트에 추가 / 제거"하고 "상대적으로 공간 효율적"인 경우에는 a를 사용하여 상당한 양을 얻을 수 있습니다 map[yourtype]bool
(그리고 세트의 true
모든 요소에 대해 값을 로 설정). ) 또는 공간 효율성을 높이기 위해 빈 구조체를 값으로 사용 _, present = the_setoid[key]
하고 존재 여부를 확인 하는 데 사용할 수 있습니다.
map[T]struct{}
대신을 사용할 수 있습니다 map[T]bool
.
한 가지 이유는 맵에서 세트를 생성하기가 쉽기 때문입니다.
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
노동 조합
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
교차로
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
다른 모든 집합 연산을 구현하는 것은 실제로 그렇게 어렵지 않습니다.
false
)이 적절하게 알려줍니다. 테스트를 위해 쉼표 관용구가 필요하지 않습니다.
map[int]struct{}
대신 사용 하는 것이 더 최적 bool
입니다. 나는 최근에 이것에 대한 요점을 작성했습니다 gist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80
Vatine이 쓴 것처럼 : go에는 제네릭이 없기 때문에 표준 라이브러리가 아닌 언어의 일부 여야합니다. 이를 위해 키워드 세트, 공용체, 교차점, 차이, 하위 집합 등으로 언어를 오염시켜야합니다.
다른 이유는 세트의 "올바른"구현이 무엇인지 전혀 명확하지 않기 때문입니다.
기능적 접근 방식이 있습니다.
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
이것은 모든 짝수 정수의 집합입니다. 매우 효율적인 조회 및 결합, 교차, 차이 및 하위 집합을 기능 구성으로 쉽게 수행 할 수 있습니다.
값과 관련된 무언가를 저장하기 때문에 맵에는 그 문제가 없습니다.
+
은 합집합, -
차이, *
교차, <=
하위 집합, >=
상위 집합, =
동등성, <>
부등식 및 in
멤버십 과 같은 이진 (두 인수) 연산자를 오버로드합니다 . 따라서 Go에서는 하나의 새 키워드 인 in
. 반면에 Pascal의 내장 세트는 "ordinals", 즉 특정 크기의 정수 값을 기본으로 표현하는 모든 유형에서만 작동합니다.
s[key]
(마치이 s
이었다 map[T]bool
대신) key in s
.
n % 2 == 0
무엇입니까?
또 다른 가능성은 하나 이상의 패키지 가있는 비트 세트를 사용 하거나 내장 된 빅 패키지를 사용할 수 있습니다 . 이 경우 기본적으로 개체를 인덱스로 변환하는 방법을 정의해야합니다.