더미에서 양말을 효율적으로 페어링하려면 어떻게해야합니까?


3911

어제 나는 깨끗한 세탁물에서 양말을 페어링하고 있었고 내가하는 방식이 그렇게 효율적이지 않다는 것을 알았습니다. 나는 순진한 검색을하고있었습니다. 양말 하나를 골라서 짝을 찾기 위해 더미를 "추적"했습니다. 이 N / 2 * 4 / N = N 이상 반복 요구 (2) 평균 / 8 양말.

컴퓨터 과학자로서 내가 할 수있는 일을 생각하고 있었습니까? 물론 (크기 / 색상 / ...에 따라) 정렬은 O (NlogN) 솔루션을 달성하기 위해 떠 올랐습니다.

내 양말을 복제 할 수 없기 때문에 해싱 또는 다른 비 현장 솔루션은 옵션이 아닙니다 (가능한 경우 좋을 수도 있지만).

따라서 문제는 기본적으로 다음과 같습니다.

요소를 n포함하는 양말 한 켤레가 주어지면 2n(각 양말마다 정확히 한 쌍의 짝이 있다고 가정) 최대 로그 공간까지 효율적으로 묶는 가장 좋은 방법은 무엇입니까? (필요하다면 그 정도의 정보를 기억할 수 있다고 생각합니다.)

다음과 같은 측면을 다루는 답변에 감사드립니다.

  • 수많은 양말에 대한 일반적인 이론적 솔루션.
  • 양말의 실제 개수는 그렇게 크지 않습니다. 배우자를 믿지 않으며 30 쌍 이상이 있습니다. (그리고 내 양말과 양말을 구별하는 것은 상당히 쉽습니다. 이것도 사용할 수 있습니까?)
  • 요소 구별 문제 와 동등 합니까?

448
비둘기 구멍 원리를 사용하여 세탁물 더미에서 정확히 하나를 연결합니다. 나는 양말 (빨강, 파랑 및 녹색)의 3 가지 색상과 각 색상의 2 쌍이 있습니다. 나는 매번 4 개의 양말을 집어 들고 항상 짝을 만들어 일을합니다.
Srinivas

59
또 다른 비둘기 구멍 원리 : n / 2 +1 양말의 하위 집합을 취하는 경우이 하위 집합에 적어도 한 쌍이 있어야합니다 .
wildplasser

40
좋은 질문입니다! 관련 문제에 대한 내 기사에 관심이있을 수 있습니다. 이것은 관련 양말 두 개를 더미에서 꺼낼 가능성에 대한 토론입니다. blogs.msdn.com/b/ericlippert/archive/2010/03/22/…
Eric Lippert

335
아이를 낳아서 waitpid부모님이 양말을 직접 분류하지 않습니까?
Mxyk

137
나는 흰 무릎 높이 양말만을 소유 하여이 문제를 해결했습니다. 그들은 모두 일치합니다. 나는 단순히 더미에서 두 양말을 무작위로 잡을 수 있었고 일치 할 것입니다. 양말을 페어링하지 않음으로써 문제를 더 단순화합니다. 양말 양말이있어서 양말을 모두 꽂지 않고 넣을 수 있습니다. 나는 매일 아침 서랍에서 무작위로 2 개를 gra습니다. 나는 그것을 O (0)으로 단순화했습니다. 그보다 더 간단한 것은 없습니다. :)
Lee

답변:


2448

정렬 솔루션이 제안되었지만 정렬이 너무 많습니다 . 주문이 필요하지 않습니다. 우리는 평등 그룹 만 있으면됩니다 .

따라서 해싱 이면 충분하고 빠릅니다.

  1. 양말의 각 색상에 대해 더미를 형성하십시오 . 입력 바구니에있는 모든 양말을 반복 하여 색상 더미에 분배 하십시오 .
  2. 각 파일을 반복하고 다른 메트릭 (예 : 패턴)으로 두 번째 파일 세트로 분배
  3. 시각적으로 즉시 처리 할 수있는 매우 작은 더미 에 모든 양말을 뿌릴 때 까지이 체계를 반복적으로 적용 하십시오.

이러한 종류의 재귀 해시 분할은 실제로 대규모 데이터 집합에 대한 조인 또는 해시 집계를 해시해야 할 때 SQL Server 에서 수행됩니다 . 빌드 입력 스트림을 독립된 많은 파티션으로 분배합니다. 이 체계는 임의의 양의 데이터와 여러 CPU로 선형 확장됩니다.

각 버킷이 매우 빠르게 처리 될 수있을만큼 충분한 버킷제공 하는 배포 키 (해시 키)를 찾을 수있는 경우 재귀 분할이 필요하지 않습니다 . 불행히도 양말에는 그런 성질이 없다고 생각합니다.

각 양말에 "PairID"라는 정수가 있으면 PairID % 10(마지막 숫자) 에 따라 10 개의 버킷으로 쉽게 배포 할 수 있습니다 .

내가 생각할 수있는 가장 실제 파티션은 사각형의 더미를 만드는 것입니다 . 한 차원은 색상이고 다른 차원은 패턴입니다. 왜 직사각형입니까? 우리는 파일에 O (1) 랜덤 액세스가 필요하기 때문입니다. (3D 직육면체 도 작동하지만 그다지 실용적이지 않습니다.)


최신 정보:

무엇에 대한 병렬 처리 ? 여러 사람이 양말을 더 빨리 맞출 수 있습니까?

  1. 가장 간단한 병렬화 전략은 여러 명의 작업자가 입력 바구니에서 가져 와서 양말을 더미에 놓는 것입니다. 이것은 너무 커집니다. 100 명이 10 개의 더미를 놓고 싸우는 것을 상상해보십시오. 동기화 비용 (수동 충돌 및 인적 커뮤니케이션으로 인한 피해) 은 효율성과 속도 향상을 파괴합니다 ( Universal Scalability Law ! 참조). 교착 상태 가 발생하기 습니까? 아니요, 각 작업자는 한 번에 하나의 파일에만 액세스하면됩니다. "잠금"이 하나만 있으면 교착 상태가 될 수 없습니다. 사람이 더미에 대한 접근을 조정하는 방법에 따라 라이브 록 이 가능할 수 있습니다. 그들은 단지 임의의 백 오프를 사용할 수 있습니다네트워크 카드와 같이 물리적 수준에서 네트워크 카드에 독점적으로 액세스 할 수있는 카드를 결정하기 위해이를 수행합니다. 그것이 작동하는 경우 NIC가 , 그것은 인간을 위해 일뿐만 아니라합니다.
  2. 각 작업자가 자신의 더미를 가지고 있다면 거의 무한정으로 확장됩니다 . 그런 다음 작업자는 입력 바구니에서 큰 양말 덩어리를 가져갈 수 있으며 (드물게하는 것처럼 아주 적은 경합) 양말을 분배 할 때 동기화 할 필요가 없습니다 (스레드 로컬 더미가 있기 때문에). 결국, 모든 노동자들은 말뚝 집합을 결합해야합니다. 작업자가 집계 트리를 구성하면 O (로그 (작업 자당 * 작업 자당 파일 수))로 수행 할 수 있다고 생각합니다 .

[정보] 어떤 요소 구별 성 문제 ? 기사에서 알 수 있듯이 요소 구별 문제는에서 해결할 수 있습니다 O(N). (또한이 양말 문제에 대해 동일 O(N)인간이 계산에 나쁜 이유만으로 당신은 단지 하나의 유통 단계 (I 여러 단계를 제안해야하는 경우 - 한 단계는 당신이에 배포 할 경우 충분하다 md5(color, length, pattern, ...), 즉 완벽한 해시 모든 속성의)).

분명히 하나보다 빠를 수 없으므로 최적의 하한에O(N) 도달했습니다 .

출력이 정확히 동일하지는 않지만 (한 경우 부울입니다. 다른 경우에는 양말 쌍), 점근 적 복잡성은 동일합니다.


72
이것이 바로 내가하는 일입니다! 나는 양말의 개통 스타일에 따라 말뚝을 만든다 (나는 흰색 만있다).
Scott Chamberlain

29
나는 양말로 이것을 시도했지만 (쉽게 30 쌍 이상을 얻었습니다) 남자는 빠릅니다. 내가 찾은 한 가지 문제는 충분한 해시 알고리즘을 가질 수 없을 때 (패턴이없는 흰색 양말이 많이 있습니다) 어려워집니다. 이 경우 최적의 방법은 무엇입니까?
Nothings1

56
웹 서버의 성능이 좋지 않은 경우 해시 충돌 공격이 어떤 느낌일까요? 흰 양말은 어떤 특성으로 구별 할 수 있습니까? 배포 할 수있는 것이 있어야합니다. 그렇지 않으면, 당신은 임의로 쌍을 형성 할 수 있습니다.
usr

37
이것은 기수 정렬이며, 정답입니다. @MarkPeters 룩업 테이블이 필요하지 않다고 생각합니다. 양말을 통한 단일 선형 패스는 양말을 숫자 벡터로 변환하여 "양말 세그먼트"를 버킷에 간단하게 매핑 할 수 있습니다. 양말을 끈으로 벡터에 묶을 수 있으므로 끝에 다른 선형 패스가 필요하지 않습니다.
Pointy

49
내가 대학에 간 사람은 실제로 PairID를 가졌습니다. 실로 1, 2, 3, 4 번 양말로 각 양말에 꿰매 었습니다.
Ryan Lundy

579

인간 두뇌의 구조는 현대의 CPU와 완전히 다르기 때문에이 질문은 실질적인 의미가 없습니다.

인간은 "일치하는 쌍 찾기"가 너무 크지 않은 세트에 대해 하나의 작업이 될 수 있다는 사실을 사용하여 CPU 알고리즘을 이길 수 있습니다.

내 알고리즘 :

spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}

적어도 이것이 실제 생활에서 사용하는 것이므로 매우 효율적입니다. 단점은 평평한 표면이 필요하지만 일반적으로 풍부하다는 것입니다.


228
양말의 수가 증가함에 따라 인간의 SIMD는 CPU보다 나아지지 않습니다.
Lie Ryan

25
가장 좋은 대답은 IMO입니다. 컴퓨터 알고리즘에 대한 일상적인 문제를 줄이는 것이 재미 있고 영리하며 (SO에 적합하지만) ~ 60 양말만큼 작은 세트에 사람의 눈 / 뇌의 해상도를 사용하는 것이 훨씬 더 합리적입니다.
drug_user841417

13
@LieRyan 양말이 균일하게 분포되면 생일 역설로 인해 양말이 충분히 작은 양말 세트를 발견하게됩니다 (색상을 임의의 정밀도로 구별 할 수없는 한). 인간 컬러 매칭 알고리즘이지만 퍼지는 단계.
Thomas

13
@ dpc.ucore.info 아니요, 다른 짠 커프 패턴, 커프 길이, 전체 길이 및 검은 색 음영이 있기 때문에 (아내가 아마도 마지막으로 나를 해칠 것입니다).
Christian

199
양말의 개수가 짝수 인 경우가 더 낫습니다. 그렇지 않으면 오랫동안 양말을 접을 것입니다.
Patrick James McDougle

258

사례 1 : 모든 양말은 동일합니다 (실제로 제가하는 일입니다).

쌍을 만들기 위해 둘 중 하나를 선택하십시오. 일정한 시간.

사례 2 : 일정한 조합 (소유권, 색상, 크기, 질감 등)이 있습니다.

기수 정렬을 사용하십시오 . 비교가 필요하지 않기 때문에 이것은 단지 선형 시간입니다.

사례 3 : 조합 수는 미리 알려져 있지 않습니다 (일반 사례).

양말 두 개가 짝을 이루는 지 비교하기 위해 비교를해야합니다. O(n log n)비교 기반 정렬 알고리즘 중 하나를 선택하십시오 .

그러나 양말의 수가 상대적으로 적은 (일정한) 실제 생활에서는 이러한 이론적으로 최적의 알고리즘이 제대로 작동하지 않습니다. 이론적으로 2 차 시간이 필요한 순차 검색보다 시간이 더 걸릴 수 있습니다.


8
> 순차 검색보다 시간이 오래 걸릴 수 있으며 이론상 2 차 시간이 필요합니다. 그래, 내가이 일을 싫어하는 이유, 어쩌면 나는 모든 양말을 버리고 사례 1부터 시작해야한다.
Nils

57
모든 동일한 양말을 갖는 단점은 다른 속도로 노화되는 경향이 있다는 것입니다. 그래서 당신은 여전히 ​​그들이 얼마나 착용했는지에 따라 일치 시키려고 노력합니다. (패턴으로 단순히 일치시키는 것보다 어렵습니다)
SDC

118
"페어링을 쉽게하기 때문에"60 쌍의 동일한 양말을 갖는 문제는 사람들이 컴퓨터로 작업하는 인상을 준다는 것입니다.
Steve Ives

13
사례 1 은 쌍을 함께 접는 등의 작업이 관련된 일정 시간이 아닙니다. 이 경우, 상수가 가장 작은 선형 시간입니다 (증거는 독자의 연습으로 남습니다). 켤레와 양말로 가득 찬 양동이를 접는 데는 시간이 걸리지 않습니다. 그러나 선형으로 확장됩니다. Amdahl의 법칙에 따르면 오버 헤드를 무시하고 속도가 무제한입니다. Gustafson의 법칙에 따르면 오버 헤드를 무시하고 충분한 근로자 (독자 운동으로 남은 금액)가 주어지면 한 쌍을 접는 데 필요한만큼의 쌍을 접을 수 있습니다.
acelent

7
@PauloMadeira 분류는 일정한 시간입니다-당신은 단지 더미를 가지고 서랍에 넣습니다. 이 경우 유일한 조작은 실제로 양말을 발에 대는 것입니다. 양말 착용의 지연된 실행으로 인해 공간이 약간 희생 될 수 있습니다 (접지되지 않은 양말의 소비 공간이 접힌 것보다 큼). 나는 이것이 가치가 있다고 주장한다. 나는 보통 아내와 함께이 주장을 잃는다.
트래비스

157

비 알고리즘 대답이지만 내가 할 때 "효율적"입니다.

  • 1 단계) 기존 양말을 모두 버립니다.

  • 2 단계) Walmart 로 이동하여 10-n 개의 흰색 패킷과 m 개의 검은 패킷으로 구입하십시오. 일상 생활에서 다른 색상이 필요하지 않습니다.

그러나 때때로, 나는 이것을 다시해야합니다 (양말 양말, 손상된 양말 등), 나는 아주 좋은 양말을 너무 자주 버리는 것을 싫어합니다. 다른 접근법.

알고리즘 답변 :

당신이하고있는 것처럼 두 번째 양말 묶음에 양말을 하나만 그리는 것보다 순진한 검색에서 일치하는 양말을 찾을 확률은 매우 낮습니다.

  • 따라서 5 개를 무작위로 집어 들고 모양이나 길이를 외우십시오.

왜 다섯? 일반적으로 인간은 작업 메모리에서 5 ~ 7 개의 서로 다른 요소를 기억하고 있습니다. RPN 스택 과 같은 약간의 요소입니다. 5는 안전한 기본값입니다.

  • 2n-5 스택에서 하나를 선택하십시오.

  • 이제 당신이 그린 5 개 안에서 일치하는 것을 찾으십시오 (시각적 패턴 일치-사람은 작은 스택으로 잘합니다).

  • 더미에서 양말을 무작위로 뽑아 5 + 1 양말과 비교하십시오. 스택이 커지면 성능이 저하되지만 확률은 높아집니다. 훨씬 더 빨리.

일치하는 확률이 50 % 일 때 얼마나 많은 샘플을 그려야하는지 계산하려면 공식을 적어 두십시오. IIRC는 초 지오메트리 법칙입니다.

나는 매일 아침 그렇게하고 거의 3 개 이상의 무승부를 필요로하지 않는다. 그러나 나는 모양의 흰색 양말 n과 비슷한 쌍 (약 10 개, 잃어버린 것을주고 받음)을 m가지고있다. 이제 주식의 스택 크기를 추정 할 수 있습니다 :-)

BTW , 나는 한 쌍이 필요할 때마다 모든 양말을 분류하는 데 드는 거래 비용의 합계가 한 번만하고 양말을 묶는 것보다 훨씬 적다는 것을 알았습니다. 양말을 묶을 필요가 없기 때문에 Just-in-Time이 더 잘 작동하며, 한계 수익도 줄어들고 있습니다. 양말을 맞추기 위해 시간을 잃어 버립니다).


25
'비 알고리즘'답변에 대한 찬성. 이것은 내가하는 일이며 훌륭하게 작동합니다. 세탁 양말을 다시 넣고 아침에 서랍 앞에서 당겨 양말 양말을 '회전'하면 교체 문제는 문제가되지 않습니다. 모든 양말은 고르게 착용합니다. 하나의 마모를 알아 차리기 시작했을 때, 나는 양말의 전체 클래스를 완전히 대체하기 위해 쇼핑 목록을 작성했습니다. 오래된 양말의 경우, 영업권에 최고 20 %를 제공하고 (식품 주머니에 묶여서 다시 섞이지 않도록) 나머지 부분을 던집니다. 양말을 낭비하지 않습니다.이 시점에서 80 %는 6 개월 남았습니다.
FastAl

2
BTW (1) 양말을 묶으면 신축성있는 양말을 신축 상태로 보관할 수 있으며 훨씬 빨리 실패합니다. 당신이 가지고있는 독특한 양말의 종류를 제한하면 바인딩이 묶이지 않습니다. (2) 독특한 양말을 제한하는 단점은 특정 패션 문제가있는 사람들에게는이 방법이 부적절 할 수 있다는 것입니다.
FastAl

3
나는 "비 알고리즘"답변을 게시하기 위해 여기에 왔습니다. 진정한 컴퓨터 과학과 마찬가지로 대부분의 사람들은 데이터와 그 구조에 충분히주의를 기울이지 않습니다.
bkconrad

나는 매일 아침이 알고리즘을 사용하고 매력처럼 작동합니다! 또한, 나중에 버리기 위해 닳아 버린 양말을 다른 더미에 넣었습니다.
Donatas Olsevičius

3
«n 개의 흰색 패킷과 m 개의 검은 패킷. 일상 생활에서 다른 색상이 필요 없음»쉬운 양말 선택을위한 좋은 표준 규칙은 실제로 바지 색상이나 벨트 색상과 일치해야한다는 것입니다. 이러한 이유로 가장 일반적으로 사용되는 색상은 검은 색, 파란색, 회색 및 일부 갈색 일 것입니다. 많은 흰 양말이 필요하다고 믿기가 어렵습니다.
Andrea Lazzarotto

106

내가하는 것은 첫 양말을 집어 내려 놓는 것입니다 (세탁 그릇의 가장자리에). 그런 다음 다른 양말을 들고 첫 양말과 같은지 확인합니다. 그렇다면 둘 다 제거합니다. 그렇지 않은 경우 첫 양말 옆에 내려 놓습니다. 그런 다음 세 번째 양말을 집어 들고 첫 번째 양말과 비교하십시오 (아직 거기있는 경우). 기타.

양말을 "제거"하는 것이 옵션이라고 가정하면이 방법은 어레이에서 쉽게 구현할 수 있습니다. 실제로, 양말을 "제거"할 필요조차 없습니다. 양말을 정렬 할 필요가 없다면 (아래 참조) 양말을 옮기고 모든 양말이 배열로 배열 된 배열로 끝낼 수 있습니다.

양말의 유일한 연산이 평등을 비교하는 것이라고 가정하면,이 알고리즘은 기본적으로 여전히 n 2 알고리즘이지만 평균 사례에 대해서는 알지 못합니다 (절대로 계산하는 법을 배우지 못했습니다).

물론 정렬은 효율성을 향상 시키며, 특히 두 양말 사이에 양말을 쉽게 "삽입"할 수있는 실제 생활에서 향상됩니다. 계산에서 트리를 통해 동일한 결과를 얻을 수 있지만 추가 공간입니다. 물론 NlogN으로 돌아갑니다 (또는 정렬 기준에 따라 동일하지만 동일한 쌍이 아닌 여러 양말이있는 경우).

그 외에는 아무 것도 생각할 수 없지만이 방법은 실제 생활에서는 꽤 효율적인 것 같습니다. :)


7
이것은 또한 내가하는 일입니다 (단순히 공백을 남기면 인서트도 O (1)입니다).하지만 이론적으로 많은 수의 양말로 확장 성이 떨어집니다.
Mooing Duck

15
이론적으로 많은 종류의 양말로 는 비늘이 잘 나지 않음
Steven Lu

@StevenLu-내가 말했듯이-정렬 여부에 따라 n * n 또는 nLogn입니다. 따라서 정렬 알고리즘만큼 확장 성이 떨어집니다. 더 빨리 원한다면 번호를 매기고 기수 정렬을 사용하십시오.
Vilx-

이것은 기본적으로 일치하지만 발견되지 않은 양말을 해시 기반 조회에 저장합니다. 이상적인 해시를 사용하면 O (n)이지만 해시가 퇴화되기 시작하는 양말이 충분히 저장되면 그에 따라 복잡해집니다.
Jon Hanna

3
다른 양말 두 개 사이에 양말을 삽입하면 양말을 짝 짓는 목표에 어떤 가치가 있습니까? 양말의 카디널리티는 없습니다. : -x
JoeBrockhaus

60

이것은 잘못된 질문입니다. 올바른 질문은 왜 양말을 분류하는 데 시간을 보내고 있습니까? 선택한 X 통화 단위의 자유 시간을 소중하게 생각할 때 연간 비용은 얼마입니까?

그리고보다 더 자주는 아니지만, 이것은 단지 아니다 모든 그것의, 자유 시간 아침 당신이 침대에서 지출하거나 커피를 마시거나 조금 일찍 떠나 트래픽에서 잡은되지 할 수있는 자유 시간.

한 걸음 물러서서 문제를 해결하는 것이 좋습니다.

그리고 방법이 있습니다!

당신이 좋아하는 양말을 찾으십시오. 다양한 조명 조건에서의 색상, 전반적인 품질 및 내구성, 다양한 기후 조건에서의 편안함 및 냄새 흡수 등 모든 관련 기능을 고려하십시오. 또한 중요한 점은 보관시 탄성을 잃지 않아야하므로 천연 직물이 좋고 플라스틱 포장재로 제공해야한다는 것입니다.

왼쪽 발 양말과 오른쪽 발 양말 사이에 차이가 없다면 더 좋지만 중요하지는 않습니다. 양말이 좌우 대칭 인 경우 쌍을 찾는 것은 O (1) 연산이고 양말을 정렬하는 것은 대략 O (M) 연산입니다. 여기서 M은 집안의 장소 수이며 양말로 흩어진 곳은 이상적입니다. 작은 상수.

왼쪽과 오른쪽 양말이 다른 멋진 페어를 선택한 경우 왼쪽과 오른쪽 발 버킷에 전체 버킷 정렬을 수행하면 O (N + M)을 사용합니다. 여기서 N은 양말 수이고 M은 위와 같습니다. 다른 사람이 첫 번째 쌍을 찾는 평균 반복에 대한 공식을 제공 할 수 있지만 블라인드 검색을 사용하는 쌍을 찾는 최악의 경우는 N / 2 + 1이며 합리적인 N의 경우 천문학적으로는 거의 불가능합니다. 이는 고급 이미지를 사용하여 가속화 할 수 있습니다 Mk1 Eyeball을 사용 하여 분류되지 않은 양말 더미를 스캔 할 때 인식 알고리즘 및 휴리스틱 .

따라서 O (1) 양말 페어링 효율을 달성하기위한 알고리즘은 다음과 같습니다 (대칭 양말 가정).

  1. 남은 평생 동안 필요한 양말 한 켤레를 추정하거나 양말을 다시 착용 할 필요없이 은퇴하고 따뜻한 기후로 이동할 때까지 추정해야합니다. 당신이 어릴 경우, 우리 모두가 집에 양말 분류 로봇을 갖기까지 걸리는 시간을 추정 할 수 있으며, 모든 문제는 관련이 없습니다.

  2. 선택한 양말을 대량으로 주문할 수있는 방법과 비용, 배송 방법을 알아야합니다.

  3. 양말을 주문하십시오!

  4. 오래된 양말을 제거하십시오.

대안적인 3 단계는 수년에 걸쳐 한 번에 몇 쌍의 같은 양의 싼 양말을 구입하는 비용을 비교하고 양말을 분류하는 비용을 추가하는 것을 포함하지만 내 말을 들어보십시오. 대량 구매는 더 저렴합니다! 또한 스토리지의 양말은 주가 인플레이션 율에 따라 가치가 상승하므로 많은 투자에서 얻을 수있는 것 이상입니다. 그런 다음 스토리지 비용이 다시 발생하지만 양말은 옷장의 상단 선반에 많은 공간을 차지하지 않습니다.

문제 해결됨. 따라서 새 양말을 구입하고, 오래된 양말을 버리고 기부하고, 평생 동안 매일 돈과 시간을 절약하고 있다는 것을 알고 행복하게 살 수 있습니다.


양말의 수명 (75 년 가정) (매월 4 쌍을 배출한다고 가정하면 3600 쌍으로 가정)은 총 1 1/2 입방 야드의 새 양말이 20 입방 인치를 차지한다고 가정합니다. 그것은 엄청난 양의 공간입니다. 그들이 대략 입방체 상자에 당신에게 그것을 전달한다고 가정하면, 상자는 약 3 피트 4 인치가됩니다.
AJMansfield

2
@AJMansfield 유효한 우려. 그러나 나는 당신의 숫자 중 일부에 동의하지 않습니다. 나는 단지 40 년 (25 ... 65)의 시간을 가졌습니다 (부모 / 기숙사 등에서 생활하지 않고 은퇴하는 시간은 위를 참조하십시오). 또한 한 쌍은 원래 포장에서 0.5 x 4 x 6 인치와 더 비슷하다고 생각합니다. 이 숫자는 공간 여유 시간을 상당히 줄입니다!
hyde

4 단계는 불필요하게 낭비입니다 -1.
Dan Bechard

2
AJMansfield의 측정으로 혼란 스러울 수있는 다른 사람들을위한 안내, 다음과 같은 메트릭스 변환 :»새 양말 한 켤레가 총 1.14m³를 차지합니다 (새 양말 한 켤레가 327cm³를 가정 할 경우). 그것은 엄청난 양의 공간입니다. 그들이 대략 입방체 상자에 담아 상자를 배달한다고 가정하면 상자는 약 1.04m가됩니다.«
Joey

호기심에 근거한 질문은 어떻게 "잘못된 질문"이 될 수 있습니까? 클래식 StackOverflow ...
Timmmmm

52

이론적으로 제한은 O (n)입니다. 왜냐하면 각 양말을 만져야하기 때문입니다 (일부는 이미 짝을 이루지 않는 한).

기수 정렬을 사용 하여 O (n)을 얻을 수 있습니다 . 버킷의 일부 속성 만 선택하면됩니다.

  1. 먼저 당신은 (그녀의, 광산)을 선택할 수 있습니다-그것들을 2 개의 더미로 나누고,
  2. 그런 다음 색상을 사용하십시오 (예 : 색상 이름을 기준으로 알파벳 순서대로 정렬 가능)-색상별로 말뚝으로 나눕니다 (같은 양말에있는 모든 양말에 대해 1 단계부터 초기 순서를 유지해야 함),
  3. 양말 길이
  4. 그런 다음 질감, ....

제한된 수의 속성을 선택할 수 있지만 각 쌍을 고유하게 식별 할 수있는 충분한 속성을 선택할 수있는 경우 k가 제한되는 것으로 간주 될 수있는 경우 O (n) 인 O (k * n)에서 수행해야합니다.


3
양말은 종종 4 팩 이상으로 제공되며 저렴하기 때문에 구별하기가 어렵습니다. 이를 극복하기 위해 아내는 내가 사는 새 양말 한 켤레에 작은 자국을 꿰맨 다. 마크는 각 쌍마다 다른 색상이거나 색상이 부족한 경우 다른 모양입니다. 이 접근 방식을 사용하면 제한된 속성 세트가 필요하지 않습니다. 각 쌍마다 고유 번호를 꿰매십시오. :) 추가 포인트는 이진수를 사용하십시오.
Vilx-

29
@ Vilx- 왜?!? 그들이 구별 할 수있는 요점이 아닌가?
flup

2
@ flup-요점은 더 큰 번들로 판매하는 것입니다. :) 나에게 이것은 쌍으로 착용하는 데 도움이됩니다. 그렇지 않으면 3 개의 매우 닳은 양말과 1 개의 새로운 양말로 끝날 수 있습니다. 멍청 해
Vilx-

13
O (n)의 계산에 동의하지 않습니다. $ k $ 란 무엇입니까? $ k $는 속성의 수입니다. 나는 $ k $가 $ O (log n) $라고 주장 할 것이다. 왜냐하면 각 쌍을 고유하게 식별하기에 충분해야하기 때문이다. 2 쌍 (흑백)이 있으면 색상 ($ k = 1, n = 2 $)으로 충분합니다. 한 쌍의 검은 색인 경우 짧습니다. 검은 색 한 쌍의 긴; 한 쌍의 흰색, 짧음; 그리고 한 쌍의 흰색, 길다-$ k = 2, n = 4 $. 그런 다음 $ k $를 제한하면 $ n $도 동시에 제한됩니다. 만약 우리가 $ n $를 제한한다면, 주문 계산은 더 이상 의미가 없습니다.
emory

3
@ emory, 나는 당신이 $물건을 코드처럼 보이게하기 위해 캐릭터가 아닌 백틱을 찾고 있다고 생각합니다 .
Xymostech

33

실용적인 해결책으로 :

  1. 쉽게 구별 할 수있는 양말 더미를 빠르게 만듭니다. (색상으로 말해)
  2. 모든 더미를 퀵 정렬하고 양말 길이를 사용하여 비교하십시오. 인간은 최악의 경우를 피하기 위해 파티션에 사용할 양말을 상당히 빨리 결정할 수 있습니다. (여러 양말을 동시에 볼 수 있으므로 이점을 활용하십시오!)
  3. 스팟 페어와 페어링 할 수없는 양말을 즉시 찾을 수있는 임계 값에 도달하면 파일 정렬을 중지하십시오.

8 개의 색상과 평균 분포를 가진 1000 개의 양말을 사용하는 경우 c * n 시간에 각 125 개의 양말 더미를 4 개 만들 수 있습니다. 5 개의 양말 임계 값을 사용하면 모든 더미를 6 개의 런으로 분류 할 수 있습니다. (오른쪽 더미에 양말을 던지기 위해 2 초를 세면 4 시간 미만의 시간이 걸립니다.)

양말 60 개, 색상 3 개, 양말 2 종 (귀하 / 부인) 만 있다면 10 개의 양말 더미를 한 번에 정렬 할 수 있습니다 (임계 값 = 5). (2 초를 세는 데 2 ​​분이 걸립니다).

초기 버킷 정렬은 n 양말을 c*n시간 에 따라 k 버킷으로 나누므로 작업 만하면되기 때문에 프로세스 속도가 빨라집니다 c*n*log(k). (임계 값을 고려하지 않음). 전부 그래서 당신에 대해 어떻게 n*c*(1 + log(k))C는 더미에 양말을 던질 수있는 시간입니다 작업.

이 방법은 c*x*n + O(1)대략 모든 방법에 비해 유리할 것 log(k) < x - 1입니다.


컴퓨터 과학에서 이것은 도움이 될 수 있습니다. 우리는 n 가지 의 컬렉션 , 그것들의 순서 (길이) 및 동등성 관계 (예 : 양말의 색상과 같은 추가 정보)를 가지고 있습니다. 동등성 관계를 통해 우리는 원본 컬렉션의 파티션을 만들 수 있으며 모든 동등성 클래스에서 우리의 순서는 여전히 유지됩니다. 사물 을 등가 클래스에 매핑하는 것은 O (1)에서 수행 할 수 있으므로 각 항목을 클래스에 할당하는 데 O (n) 만 필요합니다. 이제 추가 정보를 사용했으며 모든 클래스를 정렬하기 위해 어떤 방식 으로든 진행할 수 있습니다. 장점은 데이터 세트가 이미 상당히 작다는 것입니다.

텍스처에있는 모든 파일 파티션 내에서 길이에 따라 정렬하는 것보다 여러 등가 관계가있는 경우-> 색상 파일을 만드는 방법도 중첩 될 수 있습니다. 크기가 약 2 개 이상인 파티션을 만드는 등가 관계는 정렬 속도를 향상 시키며 (파일에 직접 양말을 할당 할 수있는 경우) 정렬은 작은 데이터 세트에서 매우 빠르게 수행 될 수 있습니다.


3
인간 최적화 : 나는 인간으로서, 2 단계에서, 양말을 대략 오름차순으로 내린 다음, 정렬 될 때까지 더 세밀하고 세밀하게 (쉘 정렬과 같이) 반복해야한다고 주장합니다. 이것은 비교 스왑 기반 접근법보다 인간 (시각적 추정)에 훨씬 빠릅니다.
AndrewC

28

잘못된 문제를 해결하려고합니다.

해결 방법 1 : 더러운 양말을 세탁 바구니에 넣을 때마다 작은 매듭으로 묶으십시오. 이렇게하면 세탁 후에 정렬 할 필요가 없습니다. Mongo 데이터베이스에 색인을 등록하는 것처럼 생각하십시오. 향후 약간의 CPU 절약을 위해 약간의 노력이 필요합니다.

해결책 2 : 겨울이면 양말을 신지 않아도됩니다. 우리는 프로그래머입니다. 그것이 작동하는 한 아무도 알 필요가 없습니다.

해결책 3 : 일을 전파하십시오. UI를 차단하지 않고 복잡한 CPU 프로세스를 비동기식으로 수행하려고합니다. 그 양말 더미를 가지고 가방에 넣습니다. 필요할 때만 쌍을 찾으십시오. 그렇게하면 작업량이 눈에 띄게 줄어 듭니다.

도움이 되었기를 바랍니다!


5
양말 (또는 어떤 옷)을 매듭에 묶으면 세탁기가 빨래를하는 능력이 줄어들고 묶는 것이 훨씬 어려워집니다. 해결 방법 2는 업무 상태가 길어질수록 유지 보수를 더 어렵게 만듭니다. 6 개월 후, 반바지와 운동화 한 켤레로 착용하기 위해 두 개의 검은 발목 양말이 필요할 때, 6 개월 동안 어떤 작업을 하든지 같은 상태 (더러운 / 깨끗한, 비슷한 마모)에서 그 쌍을 찾을 가능성이 훨씬 적습니다. 솔루션 3은 덜 "비동기"이고 더 직설적 인 "게으른"입니다. 필요할 때 정확히 필요한 최소한의 작업을 수행하십시오.
KeithS

제목 : Re : 해결 방법 2 : 사람들이 :) 내 Birks에서 그들을 볼 수 있기 때문에이 일치하는 양말을 착용하고 있지 않다 알
밥 프롭 스트

@BobProbst 네,하지만 동료 프로그래머들도 Birks와 비교할 수없는 양말을 착용하게 될 것입니다.
프란체스코 파사

27

이 질문은 실제로 매우 철학적입니다. 핵심은 문제를 해결하는 사람들의 힘 (뇌의 "웨어웨어")이 알고리즘으로 달성 할 수있는 것과 동등한 지에 관한 것입니다.

양말 정렬을위한 확실한 알고리즘은 다음과 같습니다.

Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N

이제이 문제의 컴퓨터 과학은 모든 단계에 관한 것입니다.

  1. "s가 n의 양말 t와 쌍을 이룬다면". 지금까지 본 것을 얼마나 빨리 "기억"할 수 있습니까?
  2. "t를 N에서 제거"및 "s를 N에 추가" 지금까지 본 것을 추적하는 데 얼마나 비쌉니까?

인간은이를 위해 다양한 전략을 사용할 것입니다. 휴먼 메모리 저장된 값의 기능 세트가 해당 값 자체와 쌍을 이루는 해시 테이블과 같이 연관성 이 있습니다. 예를 들어, "빨간 차"라는 개념은 사람이 기억할 수있는 모든 빨간 차에 매핑됩니다. 완벽한 메모리를 가진 사람에게는 완벽한 매핑이 있습니다. 대부분의 사람들은 이와 관련하여 불완전합니다. 연관 맵의 용량이 제한되어 있습니다. 매핑이 희미 해질 수 있습니다 다양한 상황에서 존재하지 않거나 (한 맥주가 너무 많음) 오류 ( "그녀의 이름은 네티가 아니라 베티 였지만")로 기록되거나 진실이 바뀌 었다는 사실을 발견하더라도 덮어 쓰지 않습니다 ( "아빠의 차" "오렌지 파이어 버드"가 실제로 레드 카마로와 거래되었다는 것을 알고

양말의 경우 완벽한 리콜이란 양말을 보면 s항상 t충분한 정보 (다리미판에있는 위치)를 포함 하여 형제의 기억을 t일정 시간 내에 찾을 수 있음을 의미합니다. 사진 메모리가있는 사람은 일정한 시간에 1과 2를 동시에 달성합니다.

완벽한 기억력을 갖추지 못한 사람은 추적 할 수있는 기능 (크기 (파파, 엄마, 아기), 색 (녹색, 붉은 등), 패턴 (아가일, 일반 등)에 따라 몇 가지 상식 등가 클래스를 사용할 수 있습니다. 스타일, 푸티 지, 무릎 높이 등. 따라서 다리미판은 카테고리별로 섹션으로 나뉩니다. 이것은 일반적으로 범주가 메모리에 의해 일정한 시간에 위치하도록 허용하지만 범주 "버킷"을 통한 선형 검색이 필요합니다.

전혀 기억이나 상상력이없는 사람 (죄송합니다)은 양말을 한 더미에 보관하고 전체 더미를 선형 적으로 검색합니다.

깔끔한 괴물은 누군가가 제안한대로 쌍에 숫자 레이블을 사용할 수 있습니다. 이것은 전체 순서의 문을 열어 주므로 인간은 이진 검색, 트리, 해시 등 CPU와 동일한 알고리즘을 사용할 수 있습니다.

따라서 "최상의"알고리즘은이를 실행하는웨어웨어 / 하드웨어 / 소프트웨어의 품질과 쌍에 총 질서를 부과함으로써 "치트"하려는 의지에 달려 있습니다. 확실히 "최상의" 메타- 알고리즘은 세계 최고의 양말 분류기를 고용하는 것입니다. 일정한 시간 조회, 삽입, 1-1 연관 메모리에서 거대한 N 세트의 양말 속성 세트를 획득하고 빠르게 저장할 수있는 사람 또는 기계 삭제하십시오. 이와 같은 사람과 기계를 모두 조달 할 수 있습니다. 하나가 있으면 모든 양말을 N 쌍의 O (N) 시간에 페어링 할 수 있습니다. 이것이 최적입니다. 총 주문 태그를 사용하면 표준 해싱을 사용하여 사람 또는 하드웨어 컴퓨터에서 동일한 결과를 얻을 수 있습니다.


그래, 그것은 여전히 ​​아주 좋지만 더 낫습니다 ...이 질문은 그것에 관한 것이 아닙니다. Church-Turing 논문의 정확한지 여부와 상관없이 인간과 컴퓨터는 양말을 분류 할 수 있습니다. (실제로, 유한 한 실체 인 인간은 튜링 머신보다 계산 능력이 훨씬 낮습니다. 컴퓨터에서도 마찬가지이지만 그 한계는 다릅니다.)
Jim Balter

동의하지 않습니다. 물론 현재의 컴퓨터는 TM이 아니라 본질적으로 막대한 DFA (modulo i / o difference)입니다. 그러나 우리 몸과 같은 모든 아날로그 장치는 무한 테이프를 에뮬레이트 할 수 있습니다. 우리는 아직 우리 마음이 계산하는 방식에 대한 유용한 특성을 가지고 있지 않습니다.
유전자

인간의 뇌에는 무한한 분해능도없고 그렇게 할 수 없기 때문에 인간이나 다른 물리적 장치를위한 무한 테이프는 없습니다. 또한 신경 과학을 배우는 데 도움이 될 것입니다. 어쨌든, 주입하려는 당신의 욕구에 관계없이 여기에는 깊은 철학적 질문이 없었습니다. 그러나 당신이 무엇을 믿어야하는지 ...이 논쟁의 장소는 아니며 이전에 너무 많은 시간을 보냈습니다. 그러나 나는 TM과 동등한 것으로 생각하는 가장 간단한 문제 (우리 모두)를 간신히 해결할 수있는 사람들이 항상 즐겁습니다.
짐 발터

22

비용 : 양말 이동-> 높음, 양말 찾기 / 검색-> 소형

우리가 원하는 것은 이동 횟수를 줄이고 검색 횟수를 보완하는 것입니다. 또한 Homo Sapiens의 다중 스레드 환경을 활용하여 Descision Cache에 더 많은 것을 보유 할 수 있습니다.

X = 당신, Y = 배우자

모든 양말 더미 A에서 :

양말 두 개를 골라, 해당하는 X 양말을 X 라인에, Y 양말을 Y 라인에 다음 위치에 놓습니다.

A가 비워 질 때까지하십시오.

각 라인 X 및 Y

  1. 줄에서 첫 번째 양말을 골라 해당 양말을 찾을 때까지 줄을 따라 검색하십시오.

  2. 완성 된 양말 라인에 넣으십시오.

  3. 선택 사항 회선을 검색 중이고 현재보고있는 양말이 이전 양말과 동일하지만 양말에 대해 2 단계를 수행하십시오.

선택적으로 1 단계를 수행하려면 캐싱 메모리가 충분히 크기 때문에 두 라인 대신 두 라인의 양말을 선택합니다. 어느 양말이 현재 관찰중인 라인의 양말과 일치하는지 빠르게 식별 할 수 있습니다. 팔이 3 개가 될만큼 운이 좋으면 대상의 기억이 충분히 크다면 양말 3 개를 동시에 파싱 할 수 있습니다.

X와 Y가 모두 비워 질 때까지하십시오.

끝난

그러나 이것은 선택 정렬과 유사성이 복잡하기 때문에 I / O (이동 양말) 및 검색 (삭스 라인 검색)의 속도로 인해 걸리는 시간이 훨씬 짧습니다.


22

다음은 비교 기반 모델에서 Omega (n log n) 하한입니다. (유일한 유효한 작업은 두 양말을 비교하는 것입니다.)

2n 양말이 이런 식으로 배열되어 있다는 것을 알고 있다고 가정 하십시오.

p 1 p 2 p 3 ... p n p f (1) p f (2) ... p f (n)

여기서 f는 집합 {1,2, ..., n}의 알 수없는 순열입니다. 이것을 아는 것은 문제를 더 어렵게 만들 수 없습니다. n이 있습니다! 가능한 출력 (전반과 후반의 일치), 즉 log (n!) = Omega (n log n) 비교가 필요합니다. 이것은 정렬하여 얻을 수 있습니다.

요소 구별 문제에 대한 연결에 관심이 있기 때문에 출력이 2 진 예 / 아니오이므로 요소 구별에 대해 바인딩 된 Omega (n log n)을 증명하는 것이 더 어렵습니다. 여기서 출력은 일치해야하며 가능한 출력 수는 적절한 범위를 확보하기에 충분합니다. 그러나 요소의 구별과 관련된 변형이 있습니다. 2n 양말이 제공되고 그들이 독특한 쌍을 가질 수 있는지 궁금해한다고 가정하십시오. (a 1 , a 2 , ..., a n )을 (a 1 , a 1 , a 2 , a 2 , ..., a n , a n ) 로 보내면 ED를 줄일 수 있습니다 . (유명하게도, ED의 경도 증명은 토폴로지를 통해 매우 흥미 롭습니다..)

평등 테스트 만 허용하면 원래 문제에 대해 Omega (n 2 ) 가 있어야한다고 생각합니다 . 내 직감은 : 테스트 후 가장자리를 추가하는 그래프를 고려하고 그래프가 조밀하지 않으면 출력이 고유하게 결정되지 않는다고 주장하십시오.


19

이것은 양말의 p 쌍 ( n = 2p 개별 양말)에 대해 실제로 실제로하는 방법입니다 .

  • 더미에서 양말을 무작위로 잡습니다.
  • 첫 번째 양말의 경우 또는 이전에 선택한 모든 양말이 쌍을 이루는 경우 양말을 앞쪽에있는 짝을 이루지 않은 양말의 "배열"의 첫 번째 "슬롯"에 넣으십시오.
  • 하나 이상의 짝을 이루지 않은 양말을 선택한 경우 어레이의 모든 짝을 이루지 않은 양말에 대해 현재 양말을 확인하십시오.
    • 어레이를 구성 할 때 양말을 일반 클래스 또는 유형 (흰색 / 검정색, 발목 / 승무원, 운동 / 드레스)으로 분리하고 "드릴 다운"을 사용하여 유사 항목 만 비교할 수 있습니다.
    • 허용되는 일치하는 것을 찾으면 두 양말을 모아 어레이에서 제거하십시오.
    • 그렇지 않으면 현재 양말을 어레이의 첫 번째 열린 슬롯에 넣습니다.
  • 모든 양말마다 반복하십시오.

이 체계의 최악의 시나리오는 모든 양말 쌍이 정확히 일치해야하기에 충분히 다르고 선택한 첫 번째 n / 2 양말이 모두 다르다는 것입니다. 이것은 당신입니다 O (N 2 ) 시나리오, 그리고 그건 매우 가능성. 양말 t 의 고유 한 유형의 수가 p = n / 2 쌍의 수보다 적고 , 각 유형의 양말이 유사하게 (일반적으로 마모 관련 용어로) 해당 유형의 양말이 다른, 나는 위의 추론으로 다음, 당신이 이제까지 비교해야합니다 양말의 최대 번호는 t가 , 그 후에 다음 사람은 당신이 끌어 의지를짝을 이루지 않은 양말 중 하나와 일치시킵니다. 이 시나리오는 평균 양말 서랍에서 최악의 경우보다 훨씬 가능성이 높으며 최악의 경우 복잡도를 보통 t << n 인 O (n * t)로 줄 입니다.


1
이것은 아마도 내 정신 과정에 매우 가깝습니다. 사전 정렬 최적화 계층이 추가되었습니다. 내 운동 양말은 백인으로 씻고 내 드레스 양말은 색상으로 씻는다. 이것은 두 개의 세탁물을 함께 버리지 않는 한 양말은 이미 유형별로 그룹화되어 있음을 의미합니다. 흰색 하중은 실제로 빠르지 만 (많은 동일한 양말) 드레스 양말은 더 오래 걸립니다. 다른 핵심 팁-정렬을 위해 더 많은 사용 가능한 메모리를 만드십시오 (모든 양말을 먼저 접어 제거하고 페어링 알고리즘을 실행하십시오)
orh

17

실제 접근 방식 :

가능한 빨리 분류되지 않은 파일에서 양말을 한 번에 하나씩 제거하고 앞에있는 더미에 두십시오. 말뚝은 모든 공간이 같은 방향을 향하도록 공간 효율적으로 배치되어야한다. 파일 수는 쉽게 도달 할 수있는 거리에 따라 제한됩니다. 양말을 놓을 더미의 선택은 양말과 같은 양말 더미에 양말을 씌워서 가능한 한 빨리해야합니다. 가끔 발생하는 제 1 종 (속하지 않은 말뚝에 양말을 두는 것) 또는 제 2 종 (양말과 같은 기존 말뚝이있을 때 자신의 말뚝에 양말을 두는 것) 오류는 용인 될 수 있습니다. 가장 중요한 고려 사항은 속도입니다 .

모든 양말이 말뚝에 쌓이면 신속하게 쌍 양말 말뚝을 통해 페어를 만들어 제거합니다 (이것은 서랍으로 향합니다). 말뚝에 일치하지 않는 양말이있는 경우, 가능한 한 빠른 속도로 구속 된 말뚝으로 다시 쌓아 놓으십시오. 모든 멀티 양말 더미가 처리되면 유형 II 오류로 인해 페어링되지 않은 나머지 페어링 가능한 양말을 일치시킵니다. 우와, 다 끝났어요. 양말이 많고 더러워 질 때까지 씻지 마세요. 또 다른 실용적인 참고 사항 : 나는 탄성 특성을 이용하여 양말 한 켤레 중 하나의 상단을 다른 양말보다 아래로 뒤집습니다.


15

귀하의 질문에서 세탁에 대한 실제 경험이 많지 않다는 것이 분명합니다 :). 적은 수의 페어링 할 수없는 양말과 잘 작동하는 알고리즘이 필요합니다.

지금까지의 답변은 인간의 패턴 인식 기능을 잘 활용하지 못합니다. Set 게임은이 작업을 잘 수행하는 방법에 대한 실마리를 제공합니다. 모든 양말을 2 차원 공간에두면 잘 인식하고 손으로 쉽게 닿을 수 있습니다. 약 120 * 80 cm 정도의 영역으로 제한됩니다. 거기에서 인식하는 쌍을 선택하고 제거하십시오. 여유 공간에 여분의 양말을 넣고 반복하십시오. 쉽게 알아볼 수있는 양말 (작은 아이들이 떠오를 것)을 가진 사람들을 씻는 경우 먼저 양말을 선택하여 기수를 분류 할 수 있습니다. 이 알고리즘은 단일 양말의 수가 적은 경우에만 잘 작동합니다


그것이 보통 내가하는 방법입니다. 매번 나머지 양말을 반복하는 것보다 훨씬 잘 작동합니다.
yu_ominae

좋은 접근 방식이며 실제 CS 문제에도 적용될 수 있다고 생각합니다. 그러한 사례 (문제를 해결하기 위해 비슷한 접근법을 사용할 수있는 CS 문제)의 예를 추가해 주시겠습니까? 또한이 솔루션은 어떻게 수백만 양말에 맞게 확장됩니까?
amit jan

나는 이것이 기본적으로 다른 답변 인 stackoverflow.com/a/14423956 과 1 월 20 일과 동일하다고 생각합니다 . 둘 다 +1입니다. 휴먼 비전 시스템은 매우 유사합니다.
Will Ness

15

첫 번째 양말을 집어 테이블에 놓으십시오. 이제 다른 양말을 고르십시오. 처음 선택한 것과 일치하면 첫 번째 위에 놓습니다. 그렇지 않은 경우 첫 번째 테이블과 약간 떨어진 테이블에 놓으십시오. 세 번째 양말을 선택하십시오. 이전 두 가지 중 하나와 일치하면 그 위에 놓거나 세 번째에서 조금 떨어진 곳에 배치하십시오. 양말을 모두들 때까지 반복하십시오.


1
이것은 유일하게 유효한 답변입니다. 다른 모든 사람들은 비슷한 양말을 구별하는 데 가장 많은 시간을 소비한다는 사실을 무시합니다.
entonio

재미를 위해 나는 작은 파이썬 프로그램에 양말을 쌓아 올리는이 방법을 썼습니다. gist.github.com/justinfay/53b574cf0a492f6795ef
Justin Fay

12

말뚝에서 양말을 페어링하는 것이 얼마나 효율적인지 말하려면 튜링이나 랜덤 액세스 머신에 의해 페어링이 수행되지 않기 때문에 머신을 먼저 정의해야합니다. 알고리즘 분석.

기계

기계는 인간이라는 실제 세계 요소의 추상화입니다. 한 쌍의 눈을 통해 환경에서 읽을 수 있습니다. 우리의 기계 모델은 2 개의 팔을 사용하여 환경을 조작 할 수 있습니다. 논리 및 산술 연산은 우리의 뇌를 사용하여 계산됩니다 (희망적으로 ;-)).

또한 이러한 계측기로 수행 할 수있는 원자 연산의 고유 런타임을 고려해야합니다. 물리적 제약으로 인해 팔이나 눈으로 수행되는 작업은 시간이 일정하지 않습니다. 우리는 팔로 끝없이 큰 양말 더미를 움직일 수없고 끝없이 큰 양말 더미에서 맨 위 양말을 볼 수 없기 때문입니다.

그러나 기계 물리학은 우리에게도 장점을 제공합니다. 우리는 팔로 최대 하나의 양말을 움직이는 것으로 제한되지 않습니다. 한 번에 전체 몇 개를 옮길 수 있습니다.

따라서 이전 분석에 따라 다음 작업을 내림차순으로 사용해야합니다.

  • 논리 및 산술 연산
  • 환경 판독
  • 환경 수정

또한 사람들은 양말이 매우 제한되어 있다는 사실을 활용할 수 있습니다. 따라서 환경 수정에는 더미의 모든 양말이 포함될 수 있습니다.

알고리즘

여기 내 제안이 있습니다.

  1. 더미의 모든 양말을 바닥에 펼칩니다.
  2. 바닥에 양말을 보면서 쌍을 찾으십시오.
  3. 쌍을 만들 수 없을 때까지 2부터 반복하십시오.
  4. 바닥에 양말이 없을 때까지 1부터 반복하십시오.

양말을 바닥에 뿌릴 때 일부 양말이 다른 양말을 숨길 수 있기 때문에 작업 4가 필요합니다. 알고리즘 분석은 다음과 같습니다.

분석

알고리즘은 높은 확률로 종료됩니다. 이것은 단계 번호 2에서 양말 쌍을 찾을 수 없기 때문입니다.

n쌍의 양말 쌍에 대한 다음 런타임 분석의 경우 , 양말의 적어도 절반이 2n1 단계 후에 숨겨지지 않은 것으로 가정합니다 . 따라서 평균적으로 n/2쌍 을 찾을 수 있습니다 . 이것은 루프가 단계 4가 실행 된 O(log n)시간 임을 의미합니다 . 2 단계가 실행 O(n^2)됩니다. 따라서 결론을 내릴 수 있습니다.

  • 알고리즘에는 O(ln n + n)환경 수정이 포함 됩니다 (1 단계 O(ln n)+ 바닥에서 모든 양말 쌍 선택)
  • 알고리즘은 O(n^2)2 단계에서 환경을 읽습니다.
  • 알고리즘은 O(n^2)2 단계에서 양말을 다른 양말과 비교하기위한 논리 및 산술 연산을 포함합니다.

우리는 총 런타임 복잡성이 그래서 및 환경 읽기 및 환경 쓰기 작업에 대한 요인 양말의 합리적인 금액을 각각이다. 논리 및 산술 연산의 비용은 생략됩니다. 왜냐하면 2 개의 양말이 동일한 쌍에 속하는지 여부를 결정하기 위해서는 일정한 양의 논리 및 산술 연산이 필요하다고 가정하기 때문입니다. 모든 시나리오에서 가능한 것은 아닙니다.O(r*n^2 + w*(ln n + n))rw



@WillNess Yep, 좀 더 설명
SpaceTrucker

12
List<Sock> UnSearchedSocks = getAllSocks();
List<Sock> UnMatchedSocks = new list<Sock>();
List<PairOfSocks> PairedSocks = new list<PairOfSocks>();

foreach (Sock newSock in UnsearchedSocks)
{
  Sock MatchedSock = null;
  foreach(Sock UnmatchedSock in UnmatchedSocks)
  {
    if (UnmatchedSock.isPairOf(newSock))
    {
      MatchedSock = UnmatchedSock;
      break;
    }
  }
  if (MatchedSock != null)
  {
    UnmatchedSocks.remove(MatchedSock);
    PairedSocks.Add(new PairOfSocks(MatchedSock, NewSock));
  }
  else
  {
    UnmatchedSocks.Add(NewSock);
  }
}

12

나는 더 적은 운영, 적은 시간 소비를 약속하지 않는 다른 솔루션을 찾았지만, 일련의 양말 쌍에서 적은 시간 소비를 제공하는 충분한 휴리스틱이 될 수 있는지 확인해야합니다.

전제 조건 : 동일한 양말이 있다는 보장은 없습니다. 색상이 같다고해서 크기 나 패턴이 같은 것은 아닙니다. 양말은 무작위로 섞입니다. 홀수의 양말이있을 수 있습니다 (일부는 누락되어 있습니다. 얼마나 많은지 알 수 없습니다). 변수 "인덱스"를 기억하고 0으로 설정하십시오.

결과 는 하나 또는 두 개의 더미를 갖게됩니다 : 1. "일치"및 2. "누락"

휴리스틱 :

  1. 가장 독특한 양말을 찾으십시오.
  2. 일치하는 것을 찾으십시오.
  3. 일치하는 것이 없으면 "누락 된"더미에 놓으십시오.
  4. 가장 독특한 양말이 더 이상 없을 때까지 1부터 반복하십시오.
  5. 양말이 6 개 미만이면 11로 가십시오.
  6. 맹목적으로 모든 양말을 이웃과 묶습니다 (포장하지 마십시오)
  7. 일치하는 모든 쌍을 찾아서 포장 한 다음 묶은 쌍을 "일치 한"파일로 이동합니다. 일치하는 항목이없는 경우 "인덱스"를 1 씩 증가시킵니다.
  8. "index"가 2보다 크면 (양말의 수가 많을수록 맹목적으로 짝을 지을 기회가 적기 때문에 양말 수에 따라 값이 달라질 수 있음) 11로 이동하십시오.
  9. 나머지를 섞으십시오
  10. 1로 이동
  11. "인덱스"를 잊어 버려
  12. 양말을 선택
  13. 쌍 찾기
  14. 양말을위한 쌍이 없다면, "누락 된"말뚝으로 옮기십시오.
  15. 일치하는 것이 발견되면 쌍을 포장하고 "일치 한"파일로 옮깁니다.
  16. 여전히 양말이 하나 더 있으면 12 개로갑니다.
  17. 하나만 남은 경우 14로 이동
  18. 미소 만족 :)

또한, 양말을 제거하는 것처럼 손상된 양말도 검사 할 수 있습니다. 2와 3 사이, 13과 14 사이에 삽입 할 수 있습니다.

나는 경험이나 수정에 대해 듣고 싶습니다.


이것을 쓴 후에는 매번 사용합니다. 그것은 내가 좀 더 효율적이되는 데 도움이되었고 지금은 지루하지 않습니다.
Sasa

11

양말을 정렬 할 때 근사 기수 정렬 을 수행하여 동일한 색상 / 패턴 유형의 다른 양말 근처에 양말을 떨어 뜨립니다. 양말을 떨어 뜨리려고하는 위치에서 / 가까운 곳에서 정확히 일치하는 것을 볼 수있는 경우를 제외하고는 그 시점에서 쌍을 추출합니다.

거의 모든 다른 알고리즘 ( usr의 최고 점수 답변 포함 )을 정렬 한 다음 제거합니다. 인간으로서 한 번에 고려되는 양말의 수를 최소화하는 것이 좋습니다.

나는 이것을함으로써 :

  1. 독특한 양말을 고르기 (무엇보다 먼저 내 눈을 사로 잡는 것).
  2. 더미와 양말의 유사성에 따라 양말을 당겨서 개념적 위치에서 기수 정렬을 시작합니다.
  3. 새 양말을 현재 더미 가까이에두고 거리를두고 거리를 두십시오. 양말이 동일하기 때문에 양말을 다른 양말 위에 놓는 것을 발견하면 거기에 쌍을 형성하고 제거하십시오. 이는 향후 비교시 정확한 장소를 찾는 데 더 적은 노력이 필요함을 의미합니다.

이것은 O (1) 시간에 퍼지 매치하는 인간 능력을 활용하는데, 이는 컴퓨팅 장치에서 해시 맵을 설정하는 것과 다소 동일합니다.

독특한 양말을 먼저 잡아 당김으로써 덜 독특한 기능부터 시작하여 "확대"할 수있는 공간을 남겨 둡니다.

형광색, 줄무늬가있는 양말 및 3 쌍의 긴 양말을 제거한 후에는 대부분 흰색 양말을 착용 한 정도에 따라 분류 될 수 있습니다.

어떤 시점에서 양말의 차이는 다른 사람들이 그 차이를 느끼지 못할 정도로 작기 때문에 더 이상 일치하는 노력이 필요하지 않습니다.


10

양말을 집어 올릴 때마다 한 곳에 두십시오. 그런 다음 픽업 한 양말이 첫 번째 양말과 일치하지 않으면 첫 번째 양말 옆에 설정하십시오. 그렇다면 쌍이 있습니다. 이 방법으로 얼마나 많은 조합이 있는지는 중요하지 않으며, 양말마다 선택할 수있는 두 가지 가능성이 있습니다. 이미 양말 배열에 일치하거나 일치하지 않습니다. 배열의 장소에 추가하십시오.

이것은 양말이 일치함에 따라 양말이 제거되기 때문에 배열에 양말이 거의 없을 것임을 의미합니다.


이것은 내가하는 일입니다 ... O (n)
Pykler

2
@Pykler-가장 좋은 경우 O (n)이고 가장 나쁜 경우 O (n * n)입니다.
Vilx-

2
당신이 나를 위해 O (1) 내가 본 이전과 일치를위한 대기에 배치했다고 양말에 맞게 당신이 이미 본 모든 양말의 당신의 마음에 완전히 고유 한 해시를 생성 할 수 있다고 가정 그게 해시
Pykler

10

크기가 'N'인 해시 테이블을 고려하십시오.

정규 분포를 가정하면 하나의 버킷에 하나의 양말이 매핑 된 것으로 예상되는 '삽입'수는 NlogN입니다 (즉, 모든 버킷이 가득 참).

나는 이것을 다른 퍼즐의 일부로 도출했지만 잘못되었다는 것이 기쁠 것입니다. 여기에 내 블로그 기사가 있습니다.

'N'은 가지고있는 독특한 색상의 수 / 양말 패턴의 대략적인 상한에 해당하십시오.

충돌 (일명 : 성냥)이 발생하면 양말을 제거하십시오. 다음 NlogN 양말 배치로 동일한 실험을 반복하십시오. 그것의 장점은 인간의 마음이 작동하는 방식으로 NlogN 병렬 비교 (충돌 해결)를 할 수 있다는 것입니다. :-)


10

실제 구조이든 유사한 데이터 구조 든 양말은 쌍으로 제공됩니다.

가장 간단한 대답은 쌍을 분리하기 전에 왼쪽 및 오른쪽 양말에 대한 포인터가 포함 된 쌍의 단일 데이터 구조를 초기화해야하므로 양말을 직접 또는 쌍을 통해 참조 할 수 있습니다. 양말은 파트너에 대한 포인터를 포함하도록 확장 될 수도 있습니다.

이를 통해 추상화 계층으로 문제를 해결하여 모든 계산 쌍 문제를 해결할 수 있습니다.

양말 짝짓기의 실제 문제에 동일한 아이디어를 적용하면 명백한 대답은 양말이 짝을 이루지 않도록하는 것입니다. 양말은 한 쌍으로 제공되며 서랍에 한 쌍으로 (아마 함께 묶어) 쌍으로 착용됩니다. 그러나 페어링을 해제 할 수있는 시점은 세탁기에 있으므로 양말이 함께 머무르고 효율적으로 세척 할 수있는 물리적 메커니즘 만 있으면됩니다.

두 가지 물리적 가능성이 있습니다.

각 양말에 대한 포인터를 유지하는 '쌍'개체의 경우 양말을 함께 보관하는 데 사용할 천 가방을 가질 수 있습니다. 이것은 엄청난 오버 헤드처럼 보입니다.

그러나 각 양말마다 다른 양말을 참조하기 위해 다음과 같은 깔끔한 해결책이 있습니다. 포퍼 (또는 미국인 경우 '스냅 버튼')는 다음과 같습니다.

http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html

그런 다음 양말을 벗고 세탁 바구니에 넣은 직후 양말을 꽂아 놓고 '쌍'개념의 물리적 추상화와 양말을 페어링 해야하는 문제를 제거했습니다.


이미 페어링 된 데이터로 처리하는 것이 쉬우므로 질문에 대답하지 않습니다. 문제는 데이터가 미완료 상태이고 페어링하려는 경우 수행 할 작업입니다.
아 미트

8

"이동"작업이 상당히 비싸고 "비교"작업이 저렴하고 어쨌든 전체 세트를 원래 스토리지보다 검색 속도가 훨씬 빠른 버퍼로 이동해야하는 경우 정렬을 필수 항목으로 통합하기 만하면됩니다. 움직임.

건조 과정에 걸이하는 과정을 통합하면 산들 바람이됩니다. 어쨌든 각 양말을 집어 들고 걸어 (이동) 문자열의 특정 장소에 매달아 놓는 데 비용이 들지 않습니다. 이제 전체 버퍼 (문자열)를 강제로 검색하지 않기 위해 양말을 색상 / 음영으로 배치하기로 선택했습니다. 더 어두운 왼쪽, 더 밝은 오른쪽, 더 화려한 앞 등. 각 양말을 걸기 전에 일치하는 양말이 이미있는 경우 "오른쪽 부근"을 봅니다. 이렇게하면 "스캔"이 2-3 개의 다른 양말로 제한됩니다. , 나는 바로 옆에 다른 것을 걸었다. 그런 다음 건조 할 때 끈에서 제거하면서 쌍으로 굴립니다.

이제 이것은 최고 답변에서 제안한 "색상으로 말뚝 만들기"와 다를 것 같지는 않지만 먼저 별개의 말뚝을 선택하지 않고 범위를 선택하여 "보라색"이 "빨간색"또는 "파란색"파일로 분류되는 데 아무런 문제가 없습니다. 그냥 사이에 있습니다. 그리고 두 가지 작업을 통합 (건조 및 정렬)하면 정렬하는 동안 정렬 오버 헤드가 별도 정렬의 10 %와 같습니다.


이 방법에는 두 가지 다른 장점이 있습니다. 줄 건조는 회전식 건조기보다 양말 IME를 훨씬 적게 잃어 버리고 정렬 과정을 세탁소의 나머지 부분까지 확장 할 수 있습니다. 선을 비우고 비우고 곧장 보관소로 가져갑니다. 또한 두 번의 낮은 노력 패스로 작동하여 옷을 올리고 다시 쓰러 뜨립니다.
cphlewis

8

지금 바로 양말 페어링을 마쳤으며 최선의 방법은 다음과 같습니다.

  • 양말 중 하나를 선택하여 버립니다 (해당 쌍의 '버킷'생성)
  • 다음 항목이 이전 항목의 쌍인 경우 기존 버킷에 넣고 그렇지 않으면 새 버킷을 만듭니다.

최악의 경우 n / 2 개의 다른 버킷이 있으며 현재 양말의 쌍을 포함하는 버킷에 대한 n-2 결정이 있음을 의미합니다. 분명히,이 알고리즘은 몇 쌍만 있으면 잘 작동합니다. 나는 12 쌍으로 해냈습니다.

그것은 과학적이지는 않지만 잘 작동합니다 :)


새 양말을 뽑을 때마다 각 버킷을 반복해야하기 때문에 이것은 여전히 ​​O (n ^ 2) 알고리즘입니다. 그러나, 같은 배치 내에서 구입 심지어 양말 효과적으로 쌍의 고유 (또는 단일 고유)을 렌더링 약간의 차이를 가지고 있다는 사실을 고려, 더 좋은 방법은 어쨌든 없다
Semisonic

동의하지만 내 알고리즘은 인간이 페어링을하고 있다고 가정합니다. 따라서 일치하는 버킷을 검색 할 때 일종의 캐시가 있으므로 버킷을 반복 할 필요가 없습니다. 페어링하는 동안 내 머리 에이 캐싱 메커니즘에 대해 어떤 종류의 데이터 구조가 구축되어 있는지 확실하지 않습니다.
maestro

8

내 솔루션은 공식적으로 O(n)"추가"공간이 필요하므로 요구 사항과 정확히 일치하지 않습니다 . 그러나 내 조건을 고려하면 실제 응용 프로그램에서 매우 효율적입니다. 따라서 재미있을 것 같아요.

다른 작업과 결합

필자의 경우 특별한 조건은 건조기를 사용하지 않고 일반 천 건조기에 천을 걸어 두는 것입니다. 매달린 천에는 O(n)작업이 필요하지만 ( 여기서는 항상 빈 포장 문제를 고려 합니다) 특성상 문제는 선형 "추가"공간이 필요합니다. 버킷에서 새 양말을 가져갈 때 이미 걸려있는 경우 쌍 옆에 걸 으려고합니다. 새 쌍의 양말이라면 옆에 약간의 공간이 생깁니다.

Oracle Machine이 더 좋습니다 ;-)

일치하는 양말이 이미 어딘가에 있는지 확인하려면 추가 작업이 필요 하며 컴퓨터 O(n^2)1/2대한 계수가있는 솔루션 을 렌더링 합니다. 그러나이 경우 "인간적 요인"은 실제로 이점입니다. O(1)이미 걸린 양말이 이미 있으면 (거의 인식 할 수없는 뇌 내 캐싱이 관련되어 있음) 매우 신속하게 (거의 ) 식별 할 수 있습니다. Oracle Machine 에서와 같이 제한된 "oracle" ;-) 우리는 일부 경우 디지털 머신에 비해 이러한 장점을 가지고 있습니다. ;-)

거의 다 가져라 O(n)!

따라서 양말 연결 문제와 천 걸기 문제 연결 O(n)"추가 공간"이 무료로 제공 O(n)되며 제 시간 에 해결책 이 있습니다. 간단한 걸기 천보다 약간 더 많은 작업이 필요하며 즉시 완전한 쌍에 접근 할 수 있습니다. 아주 나쁜 월요일 아침에도 양말 ... ;-)


8

이 문제에 새로운 것을 기여할 수 있기를 바랍니다. 나는 모든 답변이 전체 세탁 성능을 저하시키지 않으면 서 전처리 를 수행 할 수있는 두 가지 점이 있다는 사실을 무시한다는 것을 알았 습니다.

또한 대가족에게도 많은 양말을 사용할 필요가 없습니다. 양말은 서랍에서 꺼내서 착용 한 다음 세탁하기 전에 보관할 수있는 장소 (통)에 던져집니다. 나는 bin을 LIFO-Stack이라고 말하지는 않지만, 가정하는 것이 안전하다고 말하고 싶습니다.

  1. 사람들은 쓰레기통의 같은 지역에 양말을 대고 던졌습니다.
  2. 빈은 어느 시점에서나 무작위 화되지 않으므로
  3. 이 빈의 상단에서 가져온 부분 집합에는 일반적으로 한 쌍의 양말이 들어 있습니다.

내가 아는 모든 세탁기는 크기가 제한되어 있기 때문에 (세탁 해야하는 양말의 수에 관계없이) 세탁기의 실제 무작위 화는 양말의 수에 관계없이 거의 포함되지 않는 작은 하위 집합을 가지고 있습니다 싱글 톤.

우리의 두 가지 전처리 단계는 "빨리 빨래 줄에 양말 넣기"와 "빨리 빨래 줄에서 양말 가져 오기"로, 깨끗하고 건조한 양말을 얻기 위해해야합니다. 세탁기와 마찬가지로 빨랫줄은 유한하며 양말을 볼 수있는 부분이 있다고 가정합니다.

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 스택, 제한된 세탁기 및 제한된 빨랫줄 역할을하는 쓰레기통-여전히 많은 양말과 함께 작동합니다.

병렬 처리 정보 : 두 양말을 동일한 통에 넣는 한 모든 단계를 쉽게 병렬 처리 할 수 ​​있습니다.


양말은 일부 데이터베이스에서 임의의 객체를 페어링 할 때만 사용됩니다.
아 미트

1
알았습니다, 당신이 저자라는 것을 보지 못했습니다. 일반적인 솔루션을 원한다면 실제로 그렇게 말했을 것입니다. 어쨌든, 일반적인 솔루션을 생각해 내지 않는 한, 정보를 고려하는 데 아무런 문제가 없습니다. 솔루션의 재사용 성을 포기하면 성능이 상당히 향상 될 수 있습니다. 이 경우 유스 케이스와 사용 가능한 데이터베이스를 전체적으로 고려하는 것이 유리합니다. 그러나 귀하의 특별한 질문에 대한이 특별한 답변은 크기가 다른 검은 양말과 같이 비슷한 모양의 양말에 문제가 있으므로 어떤 경우에는 적용되지 않습니다.
Philipp Flenker

1
또한 데이터베이스에서 임의의 객체 쌍에 대한 질문을했기 때문에 2k 이상 공짜를 얻지 못했습니다. 양말의 본질 (데이터가 아니라 복제 할 수 없음)로 인해 질문을 구체적으로 제한 한 경우에도 양말을 배우자의 양말과 쉽게 구별 할 수 있다는 사실을 사용하는 것이 좋습니다. 양말에 대해 질문을한다면 데이터베이스에 대한 답변을 기대하지 마십시오 ;-)
Philipp Flenker

1
몇 가지 가정이 있습니다 : 정상적인 세탁 마 샤니, 정상적인 빨랫줄 및 두 양말을 동시에 쓰레기통에 넣는다는 사실은 대부분의 경우 양말이 같은 기계에 있다는 것을 의미합니다. 따라서 남은 양말은 작습니다. 그러나 데이터베이스에 임의의 객체를 저장하는 것에 대한 답변을 정말로 원했기 때문에 내 솔루션에 대해 더 논의하는 것이 정말 유용합니까?
Philipp Flenker

1
내가 말했듯이, 나는 다른 사람들이 대답 한 요소 구별 문제를 제외하고 당신이 요청한 모든 것을 다룬 것이라고 생각합니다. 나는 여기에 돈을 쓰려고 노력하지는 않지만이 답변에 많은 노력을 기울여 왔으며, 이제 당신은 몇 가지 답변을 통해 원래 질문에 대답하지 않았다고 주장하면서 약간 실망했습니다. . 왜 당신은 전체 스레드를 그냥 내버려 두지 않습니까? 요청한 지 2 년이 지난 지금도 여전히 흥미로운 내용입니까?
Philipp Flenker 16:15에

8

O (1) 시간이 걸리는 프로세스로의 노력을 줄이기 위해 간단한 단계를 수행했습니다.

입력을 두 가지 유형의 양말 (레크리에이션 용 흰색 양말, 검은 색 양말 용 양말) 중 하나로 줄임으로써, 내가 가지고있는 두 양말 중 어느 양말 만 결정하면됩니다. (기술적으로는 결코 함께 씻지 않기 때문에 공정을 O (0) 시간으로 줄였습니다.)

바람직한 양말을 찾고 기존 양말의 필요성을 없애기 위해 충분한 수량으로 구매하려면 약간의 사전 노력이 필요합니다. 검은 색 양말이 필요하기 전에이 작업을 수행 한 결과 노력이 최소화되었지만 마일리지가 다를 수 있습니다.

이러한 선구자 적 노력은 매우 인기 있고 효과적인 코드에서 여러 번 나타났습니다. 예를 들어 # DEFINE'ing pi to some decimals (다른 예제는 있지만 지금은 마음에 듭니다).


7

패턴을 해시로 사용하여 일치하지 않는 양말에 사용될 해시 테이블을 만듭니다. 양말을 하나씩 반복합니다. 양말이 해시 테이블에서 패턴과 일치하는 경우 양말을 테이블에서 꺼내고 쌍을 만드십시오. 양말이 일치하지 않으면 테이블에 넣으십시오.


질문에 구체적으로 언급 된 것처럼 제자리에하지 않는 방법은 무엇입니까?
아 미트

7

n 쌍의 양말 을 정렬하는 문제 는 O (n) 입니다. 세탁물 바구니 에 버리기 전에 왼쪽을 오른쪽으로 꿰십시오. 그것들을 꺼내면 실을 자르고 각 쌍을 서랍에 넣습니다-n 쌍에 대해 2 개의 작업이므로 O (n).

이제 다음 질문은 당신이 세탁을하고 아내가 그녀를하는 것입니다. 그것은 완전히 다른 문제 영역에서 발생하는 문제 입니다. :)


이것은 양말이 은유 인 질문에 대답하지 않습니다.
amit

문제는 짝을 이루지 않아도되는 방법이 아니라 짝을 이루지 않은 더미에서 양말을 페어링하는 방법이었습니다.
amit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.