2011-08-15 2 views
0

고정 된 일정한 '옵션'(예 : 기술) 세트가 있다고 상상해보십시오. 모든 객체 (예 : 인간)는 옵션을 갖거나 갖지 않을 수 있습니다.비트 배열을 사용 하시겠습니까?

모든 개체에 대해 member-list-of-options를 유지 관리하고 옵션으로 채워야합니까?

OR :

인가 그것을보다 효율적으로 (빠르게) 각 비트가 각각의 옵션의 촬영 (또는 촬영되지 않음) 상태를 나타내는 bitarray를 사용하는?

가 -edited : -

더 구체적으로, 기술의 목록은 문자열 (옵션 이름), 확실히 미만 256 프로그램이 가능한 한 빨리하는 대상은 (의 벡터이다 메모리 걱정 없음).

+0

나는 정말로 당신의 질문이 좀 더 목표가되어야한다고 생각합니다. 대답은 당신이 사용하고있는 기술과 성취하기를 원하는 것 (성능/공간/메모리의 효율적인 사용? 융통성)에 따라 크게 달라집니다. –

답변

2

다소 다릅니다. 옵션 수가 적 으면 여러 개의 bool 멤버를 사용하여 옵션을 나타냅니다. 목록이 커질 경우, 두 옵션은 실행 가능한이 될 :

  • 비트 세트 (이 적절한 상징적으로 옵션을 대표하는 enum) 공간, 일정, 매우 적은 양이 소요되며, 특정 옵션이 필요지고 O (1) 시간;
  • 옵션 목록 또는 그 중 std::set 또는 unordered_set은 공간 효율성이 더 좋을 수 있지만 옵션 수가 많으면 이고 매우 작은 수가 설정 될 것으로 예상됩니다 개체 당.

확실치 않은 경우 bool 개의 무리 또는 bitset을 사용하십시오. 프로파일 링에서 저장 옵션이 부담이된다는 것을 보여줄 때에 만 동적 목록이나 표현을 고려해야합니다. 그런 다음에도 디자인을 다시 생각해보십시오.

: 256 개 미만의 옵션으로 bitset은 최대 64 바이트를 차지하며 메모리 및 예상 속도와 관련하여 모든 목록 또는 세트 표현을 확실히 능가합니다. bool 또는 심지어 unsigned char의 배열은 바이트 액세스가 일반적으로 비트 액세스보다 빠르기 때문에 여전히 더 빠를 수 있습니다. 그러나 구조를 복사하는 것이 더 느릴 것이므로 몇 가지 옵션을 시도하고 결과를 측정하십시오. YMMV.

+0

매우 도움이된다! 많이 복사하지는 않을 것이기 때문에, unsigned char. 덧붙여 말하자면, 열거 형을 언급했을 때 비트 배열의 옵션을 상징적으로 나타내려면 열거 형 요소를별로 정의하지 않는 것이 확실합니다. 식별자를 직접 입력하지 않아도됩니까? 옵션 목록 – vedran

+0

@vedran : 속성의 출처에 따라 다르지만 상징적 인 이름을 지정하는 것이 좋습니다. 손으로 입력하면 너무 많은 부담이되지만 디지털로 사용할 수는 있습니다. 나머지 프로그램 구조가 있다는 것을 인정하면 프로그램에 넣기 위해 'n'더러운 코드 생성기 (예 : 셸 스크립트)를 작성하는 것이 좋습니다. –

+0

코드 생성기 아이디어를 시도해보십시오! 감사합니다! – vedran

1

한 번의 작업으로 여러 스킬이 있는지 테스트 할 때 비트 배열을 사용하는 것이 더 빠릅니다.

옵션 목록을 사용하는 경우 한 번에 한 항목 씩 목록을 검토하여 스킬 세트가 종료되는지 확인해야합니다. 그러면 분명히 시간이 오래 걸리고 많은 비교 작업이 필요합니다.

0

일반적으로 비트 배열의 편집 속도가 빠르고 검색 속도가 빠릅니다. 필요한 공간은 수학 만 수행하면됩니다. 옵션 목록에는 동적으로 크기가 지정된 배열이 필요합니다 (이는 옵션 세트 자체에 약간의 오버 헤드가 있습니다). 그러나 많은 수의 옵션이있는 경우, (일반적으로) 소수의 옵션 만 설정하면 더 작아 질 수 있습니다.

+0

많은 언어 (특정 .NET 용 .NET 용)는 8 바이트 부 울린 (Byte)으로 비트 배열을 만듭니다 ... 거대한 공간 절약은 아닙니다.또한, 왜 비트 배열이 검색 속도가 더 빠르다고 생각하는지 궁금합니다. 비트 비교는 비용이 많이 드는 작업으로 보입니다. –

+1

나는 속도 논평에 동의하지 않는다. 비트 배열은 일반적으로 bool 구조보다 편집 속도가 느리고 검색 속도는 느립니다. 비트 배열의 요소에 액세스하려면 비트 벡터 자체와 비트와 비트에 액세스해야합니다. bool의 구조는 비트와 비트를 생략합니다. 비트 배열의 요소를 업데이트하려면 해당 요소에 액세스하고 부울 산술을 적용하여 해당 비트를 설정하거나 지우고 수정 된 요소를 저장해야합니다. bool 구조의 요소를 업데이트하면 초기 액세스와 부울 산술이 생략됩니다. –

+0

@David, 정확히 어떤 종류의 bool "구조"를 염두에 두셨습니까? – vedran