Я сподіваюся, що я можу внести щось нове в цю проблему. Я помітив, що всі відповіді нехтують тим фактом, що є два моменти, за якими можна виконувати попередню обробку , не уповільнюючи загальну продуктивність прання.
Крім того, нам не потрібно вважати велику кількість шкарпеток, навіть для великих сімей. Шкарпетки виймають з шухляди і надягають, а потім їх кидають у місце (можливо, у відро), де вони залишаються, перш ніж відмити. Хоча я б не називав сказаний бін LIFO-стеком, я б сказав, що це можна припустити
- люди кидають обидва шкарпетки приблизно в одну і ту ж зону сміття,
- смітник не рандомізований в жодному пункті, і тому
- будь-яка підмножина, взята з верху цього відро, зазвичай містить обидва шкарпетки пари.
Оскільки всі пральні машини, про які я знаю, обмежені за розміром (незалежно від того, скільки шкарпеток потрібно прати), а фактична рандомізація відбувається в пральній машині, незалежно від того, скільки шкарпеток у нас є, у нас завжди є невеликі підмножини, в яких майже немає синглів.
Наші два етапи попередньої обробки - це "надягання шкарпеток на білизну" та "Знімання шкарпеток з білизни", що ми повинні зробити, щоб отримати шкарпетки, які не тільки чисті, але й сухі. Як і у пральних машинах, білизна є обмеженою, і я вважаю, що у нас є вся частина лінії, куди ми поміщаємо шкарпетки.
Ось алгоритм для 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, обмежена нормальна пральна машина та обмежена нормальна лінія одягу - але це все ще працює з дуже великою кількістю шкарпеток.
Про паралелізм: Поки ви кидаєте обидва шкарпетки в один і той же смітник, ви можете легко паралелізувати всі ці кроки.