Вот мой ответ. Я не проверял его против сегодняшней партии ответов.
Алгоритмы на основе пересечений - это O (N ^ 2), поскольку они проверяют каждый новый набор на все существующие, поэтому я использовал подход, который индексирует каждое число и работает на близком к O (N) (если мы принимаем, что поиск по словарю - O (1)). Затем я запустил тесты и почувствовал себя полным идиотом, потому что он работал медленнее, но при ближайшем рассмотрении оказалось, что тестовые данные заканчиваются только несколькими различными наборами результатов, поэтому квадратичные алгоритмы не имеют большой работы для делать. Протестируйте его более чем на 10-15 различных ящиков, и мой алгоритм выполняется намного быстрее. Попробуйте тестовые данные с более чем 50 отдельными ящиками, и это невероятно быстрее.
(Edit: Также была проблема с тем, как выполняется тест, но я был не прав в моем диагнозе. Я изменил свой код, чтобы работать с тем, как выполняются повторные тесты.)
def mergelists5(data):
"""Check each number in our arrays only once, merging when we find
a number we have seen before.
"""
bins = range(len(data)) # Initialize each bin[n] == n
nums = dict()
data = [set(m) for m in data ] # Convert to sets
for r, row in enumerate(data):
for num in row:
if num not in nums:
# New number: tag it with a pointer to this row's bin
nums[num] = r
continue
else:
dest = locatebin(bins, nums[num])
if dest == r:
continue # already in the same bin
if dest > r:
dest, r = r, dest # always merge into the smallest bin
data[dest].update(data[r])
data[r] = None
# Update our indices to reflect the move
bins[r] = dest
r = dest
# Filter out the empty bins
have = [ m for m in data if m ]
print len(have), "groups in result"
return have
def locatebin(bins, n):
"""
Find the bin where list n has ended up: Follow bin references until
we find a bin that has not moved.
"""
while bins[n] != n:
n = bins[n]
return n
Брошено, если экземпляр виртуальной машины Java или экземпляр ClassLoader пытается загрузить в определении класса (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и определение класса не может быть найдено.
blockquote>Вы должны использовать версию downgrade
9.0.0
вместо9.2.1
compile 'com.google.android.gms:play-services:9.0.0'
И добавить multidex
compile 'com.android.support:multidex:1.0.1'
Надеемся на эту помощь.