template<typename CARD>
void shuffle(CARD deck[], int card_count)
{
CARD* pool = new CARD[card_count];
CARD* pool_ptr;
CARD* pool_last = pool + card_count - 1;
int count = card_count - 1;
while(pool[count--] = count, count);
while(card_count)
{
pool_ptr = pool + rand() % card_count--;
*deck++ = *pool_ptr;
*pool_ptr = *pool_last--;
}
delete[] pool;
}
pool_end 대신 pool_last로 효율을 조금 높였다.
그러나 인자로 변수 card_count 를 받는 주제에 pool 을 만들겠다고 해버려서 동적 할당 -> 속도 시망.
뭐하러 동적 할당해요. 최신 C 표준에는 지역 변수 배열 선언 시에 상수 뿐 아니라 매개 변수의 값도 쓸 수 있는데. ㅋㄷ
내 컴팔러가 띨빡해서 미안타.
여튼, 위의 while 이랑, pool_last 구조 봐봐. 개선해줬음.
굳이 ANSI C와의 호환성을 염두에 두고 있다면 #define MAX_CAPACITY 500 같이 선언한 다음 고정된 수치로 잡아주고 쓰는 사람이 알아서 늘리라고 하면 될 듯.
ㅋㅋ 그게 젤 편함. 그럼 인자 없애야지. 아니면 템플릿 초기화로 받든징~
int count는 register int count로 바꾸면 좀 더 성능 향상이 되지 않을까요? 물론 컴파일러가 알아서 바꿔 주겠지만...
위의 while 은 사실 do ~ while 타잎의 루프을 while 로 쓴거거든.
그거 아무짝에 쓸모 없다고 보면 돼용. 요즘은 register 쓸만큼 컴팔러가 띨빡하지 않아서
ㄷㄷ 구시대의 유물이긴 하죠... 앵간한 건 Optimizer가 알아서 다 해주니...ㅋㅋㅋ
pool[0] = 0; 줄은 굳이 필요 없을 거 같네요. new []는 알아서 zero 초기화해 줌.
아니 new 자체가 zero 초기화를 자동으로 해 줘요. malloc이랑 new가 틀린 점.txt
내건 inplace 라 ㅋㄷㅋㄷ
복붙해서 그래.
ㄷㄷㄷ 저거 로직은 괜찮지 않나요? 최적화만 잘하면...
while(--count); 보다 while(count--); 가 안전하고 효율 좋은편이니까 참고.
별도의 리스트 만들어서 end를 뽑은 자리에 끼워넣고 end 하나씩 줄인다는 발상요.
로직이야 단순한거지 워낙 많이 쓰는... 내 이미지 필터들 전부 저런식. inplace 로 쓸 수 있는 경운 잘 없으니까.
난 애기들 보기 안어렵게 하려고 for 문으로 xor 스왑을 보여준거야 (정말 섞는것 같잖아?)
오히려 난 저 inplace 방식의 swap 약간 개선한걸(대입 두 번) 소켓프로그래밍의 acceptor 에 쓰고 있지. 헤헷 이쁨.
ㅋㅋㅋ 오히려 애기들 중엔 xor swap 모르는 사람들이 더 많을텐데요.
대기중인 커넥션이랑 accept 된 커넥션이랑 하나의 pool 에서 connection_count 를 경계로 분리되어 있엉.
xor swap 은 대2 이전에는 배워야 하니까 모르면 배워야지 ㅋㄷㅋㄷ
아까 저거 두개 돌려서 속도 비교해 봤는데 별차이 없음. 낄낄. (동적 할당 안해도)
_alloca 안씀?
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.