이 문제에 새로운 것을 기여할 수 있기를 바랍니다. 나는 모든 답변이 전체 세탁 성능을 저하시키지 않으면 서 전처리 를 수행 할 수있는 두 가지 점이 있다는 사실을 무시한다는 것을 알았 습니다.
또한 대가족에게도 많은 양말을 사용할 필요가 없습니다. 양말은 서랍에서 꺼내서 착용 한 다음 세탁하기 전에 보관할 수있는 장소 (통)에 던져집니다. 나는 bin을 LIFO-Stack이라고 말하지는 않지만, 가정하는 것이 안전하다고 말하고 싶습니다.
- 사람들은 쓰레기통의 같은 지역에 양말을 대고 던졌습니다.
- 빈은 어느 시점에서나 무작위 화되지 않으므로
- 이 빈의 상단에서 가져온 부분 집합에는 일반적으로 한 쌍의 양말이 들어 있습니다.
내가 아는 모든 세탁기는 크기가 제한되어 있기 때문에 (세탁 해야하는 양말의 수에 관계없이) 세탁기의 실제 무작위 화는 양말의 수에 관계없이 거의 포함되지 않는 작은 하위 집합을 가지고 있습니다 싱글 톤.
우리의 두 가지 전처리 단계는 "빨리 빨래 줄에 양말 넣기"와 "빨리 빨래 줄에서 양말 가져 오기"로, 깨끗하고 건조한 양말을 얻기 위해해야합니다. 세탁기와 마찬가지로 빨랫줄은 유한하며 양말을 볼 수있는 부분이 있다고 가정합니다.
put_socks_on_line ()의 알고리즘은 다음과 같습니다.
while (socks left in basket) {
take_sock();
if (cluster of similar socks is present) {
Add sock to cluster (if possible, next to the matching pair)
} else {
Hang it somewhere on the line, this is now a new cluster of similar-looking socks.
Leave enough space around this sock to add other socks later on
}
}
양말을 움직이거나 가장 잘 어울리는 것을 찾는 데 시간을 낭비하지 마십시오.이 모든 것은 O (n)에서 수행해야하며, 분류되지 않은 라인에 올려 놓아야합니다. 양말은 아직 페어링되지 않았으며, 몇 개의 유사성 클러스터 만 있습니다. 여기에 양말 세트가 제한되어있어 "좋은"클러스터를 만들 수 있습니다 (예 : 양말 세트에 검은 색 양말 만있는 경우 색상별로 클러스터링 할 수 없음)
take_socks_from_line ()의 알고리즘은 다음과 같습니다.
while(socks left on line) {
take_next_sock();
if (matching pair visible on line or in basket) {
Take it as well, pair 'em and put 'em away
} else {
put the sock in the basket
}
나머지 단계의 속도를 높이려면 다음 양말을 무작위로 선택하는 것이 아니라 각 클러스터에서 양말 후 양말을 순차적으로 가져가는 것이 현명합니다. 두 전처리 단계는 양말을 줄이나 바구니에 넣는 것보다 시간이 오래 걸리지 않습니다. 우리는 무엇이든 상관없이 세탁 성능을 크게 향상시켜야합니다.
이 후에는 해시 파티셔닝 알고리즘을 쉽게 수행 할 수 있습니다. 일반적으로 양말의 약 75 %가 이미 짝을 이루고있어 양말의 매우 작은 하위 세트로 남겨 두고이 하위 세트는 이미 (어떤) 클러스터되어 있습니다 (전처리 단계 후에 바구니에 많은 엔트로피를 도입하지 않습니다). 또 다른 것은 나머지 클러스터가 한 번에 처리하기에 충분히 작은 경향이 있으므로 전체 클러스터를 바구니에서 꺼낼 수 있다는 것입니다.
sort_remaining_clusters ()의 알고리즘은 다음과 같습니다.
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
그 후에는 양말이 몇 개 남았습니다. 이전에 페어링되지 않은 양말을 시스템에 도입하고 특별한 알고리즘없이 나머지 양말을 처리하는 곳입니다. 남은 양말은 거의 없으며 시각적으로 매우 빠르게 처리 할 수 있습니다.
남아있는 모든 양말에 대해, 나는 그들의 양말이 여전히 씻지 않은 것으로 가정하고 다음 반복을 위해 그들을 버립니다. 시간이 지남에 따라 짝을 이루지 않은 양말의 성장을 등록하면 ( "양말 누출"), 쓰레기통을 확인해야합니다. 쓰레기통이 무작위로 나올 수 있습니다 (잠자는 고양이가 있습니까?)
나는 이러한 알고리즘이 많은 가정을 취한다는 것을 알고 있습니다 : 일종의 LIFO 스택, 제한된 세탁기 및 제한된 빨랫줄 역할을하는 쓰레기통-여전히 많은 양말과 함께 작동합니다.
병렬 처리 정보 : 두 양말을 동일한 통에 넣는 한 모든 단계를 쉽게 병렬 처리 할 수 있습니다.