아래 글 보고 전에 한 뻘짓 써봄
가끔 수열에서 랜덤 추출을 해야 할 경우가 있다. 그러면 보통 인덱스 범위를 잡고 random 헤더의 것을 쓰거나 rand()를 써서 인덱스로 추출하는데 C++17에서는 std::sample이 새로 추가되었다.
대충 타겟 컨테이너 시작, 타겟 끝, 추출한 원소를 넣을 곳 이터레이터나 포인터, 추출 갯수, 난수 방법을 전달하면 된다.
그러면 뽑고 싶은 갯수만큼 귀찮게 rand()를 하지 않아도 되고 인덱스가 겹칠 일도 없으니 아주 편리하다.
성능 - 10124에서 써보았다.
4일 전 제출이 sample을 쓴 코드이다 아 ㅋㅋ 아무래도 원소를 복사하는 게 시간을 잡아먹는 것 같다.
시간이 빡빡하다 싶으면 쓰지 않는 게 좋을 것 같다.
정보추 ㅋㅋ
어떤 타입으로 sample 하셨나요? 일단 primitive type 같은 경우에는 거의 똑같은 성능 나와요
https://quick-bench.com/q/OmeOczUp3E4g9Cx8w0zTow2s8us
일단 타입은 int인데 조금 구현을 바꿔도 시간초과가 나오긴 하네요. 혹시 참고 되시면 좋을 거 같아서 random써서 나온 2388ms 짜리 코드랑 시간초과 나온 구현을 링크로 달아둘게요
2388ms
http://boj.kr/bd4e8ad889234733bc60b0f76e4a7d63
TLE
http://boj.kr/0100666775f14cbaa6efd31808154221
이거 시간복잡도가 고르는 원소의 수에 비례하는게 아니라 전체 모집단의 크기에 비례해서 그러는듯...?
https://en.cppreference.com/w/cpp/algorithm/sample
Complexity
Linear
in std::distance(first,last).
그러네요. 애초에 복잡도가 다름
아 그러면 구간 크기가 최대 50만이니까 추출당 50만 조지면 큰일이 나네
https://quick-bench.com/q/shDTqHxFWqeC5DGnMAR-sTbatIc
그러네요. 구간 크기 크게 하니까 sample이 압도적으로 느립니다. 이건 C++ 커미티 애들한테 defect 제보해도 될듯 하네요.
모집단 iterator가 set처럼 랜덤 엑세스가 불가능한 컨테이너면 모집단 크기에 시간복잡도가 비례하는게 이해가 되는데, 랜덤엑세스가 되는 vector에서도 같은 시간복잡도라면 확실히 문제네요