Страницы: 1
RSS
Пересечение множеств
 
имеется табличка, содержащая 2 столбца, в каждом из которых есть 300 хэшей. Где-то 40% - 60% значений совпадают. Все оставшиеся не имеют пары во втором столбце. Итак вопрос, как можно подсчитать пересечение множеств конкретно для данной таблицы и получить реальные статистические данные о кол-ве совпадающих и не совпадающих хэшей???  
 
P.S. возможен макрос, но тогда помогите с телом макроса)))
 
Можно для чайников а кто такой хэш... Да и файлик желательно.. с виду простая задача на сравнение данных.
 
Для расчета можно использовать функции, СЧЕТЕСЛИ, СУММЕСЛИ, СУММ в сочетании с МУМНОЖ, ЧАСТОТА.  
Пример приложите с указанием, что и как посчитать.
 
Где-то тут готовый код от слэна должен быть - делал он такое на массивах и коллекциях...  
Сперва из одного массива в коллекцию, потом проверяем второй массив по этой коллекции - получаем совпадающие, отсутствующие и те, которые есть только в первом массиве. Вроде так.
 
Тут алгоритм http://www.planetaexcel.ru/forum.php?thread_id=20100 <BR>Тут код (коды) http://www.planetaexcel.ru/forum.php?thread_id=18627&page_forum=3&allnum_forum=74
 
формула массива  
=СУММ(1-ЕНД(ПОИСКПОЗ(диапазон1;диапазон2;0)))  
посчитает, сколько чисел из диапазона1 находится в диапазоне2
 
Проверяю формулу - ей нужны массивы уникальных значений. Т.е. точнее один уникальный - в котором считаем. Тот, из которого считаем - может быть с повторами. Вот такая вот несправедливость :)
 
{quote}{login=Hugo}{date=03.02.2011 11:45}{thema=}{post}Проверяю формулу - ей нужны массивы уникальных значений. Т.е. точнее один уникальный - в котором считаем. Тот, из которого считаем - может быть с повторами. Вот такая вот несправедливость :){/post}{/quote}  
Игорь, можно извратится и обойти это ограничение, подсчитать сколько повторяющихся значений в одном диапазоне совпадает с повторяющимися зачениями во втором.  
Но т.к. ТС молчит, остается догадываться, что же все таки нужно.
 
Что-то вроде. Алгоритм немного отличается от слэнова - тут один словарь. Поэтому в двух массивах выгружаются все записи, попадающие под условие, а в третьем только уникальные.  
Но если списки изначально уникальные, то во всех массивах будут уникальные.  
 
Option Explicit  
 
Sub FindValues()  
 
Dim a, aa, b, bb, bbb, i&, ii&, iii&, dic As Object, x  
 
'a = Range("a1:a20")  
a = Range([A1], Range("A" & Rows.Count).End(IIf(Len(Range("A" & Rows.Count)), xlDown, xlUp)))
'b = Range("b1:b20")  
b = Range([B1], Range("B" & Rows.Count).End(IIf(Len(Range("B" & Rows.Count)), xlDown, xlUp)))
 
ReDim aa(1 To UBound(a), 1 To 1)  
ReDim bb(1 To UBound(b), 1 To 1)  
ReDim bbb(1 To UBound(b), 1 To 1)  
 
Set dic = CreateObject("Scripting.Dictionary")  
 
For Each x In a  
If dic.exists(CStr(x)) Then  
Else  
dic.Add CStr(x), 0  
End If  
Next  
 
For Each x In b  
If dic.exists(CStr(x)) Then  
dic.Item(CStr(x)) = 1 'признак, что есть в b()  
iii = iii + 1  
bbb(iii, 1) = x 'массив тех, кто из b() есть в a()  
Else  
ii = ii + 1  
bb(ii, 1) = x 'массив тех, кого из b() нет в а()  
End If  
Next  
 
For Each x In dic  
If dic.Item(x) = 0 Then  
i = i + 1  
aa(i, 1) = x 'массив тех, кого из a() нет в b()  
End If  
Next  
 
[d1] = "из B есть в A: " & iii
[d2].Resize(iii, UBound(bbb, 2)).Value = bbb 'выгружаем результат
[e1] = "из B нет в A: " & ii
[e2].Resize(ii, UBound(bb, 2)).Value = bb 'выгружаем результат
[f1] = "из A нет в B (уникальные): " & i
[f2].Resize(i, UBound(a, 2)).Value = aa 'выгружаем результат
 
End Sub
 
Если в коде изменить 3 буквы на одну (dic->a), то и в третьем столбце будут выгружаться все значения, а не только уникальные:  
 
For Each x In a  
If dic.Item(x) = 0 Then  
i = i + 1  
aa(i, 1) = x 'массив тех, кого из a() нет в b()  
End If  
Next
 
Поправка - если сверять массив a(), то тогда нужно добавить CStr():  
If dic.Item(CStr(x)) = 0 Then
Страницы: 1
Читают тему
Наверх