Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
Цитата
Я не совсем понял задачу
Является ли решением, если к строке 11110 мы добавим строку 01111, в данном случае соберется ли строка?
Да, конечно!
Почитал на Вики про задачу о ранце, впечатлён, даже не знал о существовании оной.
Изменено: kugeod - 14.10.2013 16:17:45
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
anvg
В силу своей тупости не понимаю работу алгоритма. И у меня на 31ом цикле i идет переполнение переменной vMult. То есть работать с большими матрицами никак?
Слэн
Объясните смысл считать колво единиц в строке? Потом добирать не получиться, т.к. строки могут содержать единицы в тех же столбцах, которые уже заполнены единицами.
Изменено: kugeod - 12.10.2013 17:43:56
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
ваш алгоритм я к сожаоению не осилил..т.к. познания мои в VBA не велики, а комментов минимум
Нет не ошибся, моим алгоритмом 26000 делает минут за 45 (правда скомпилированным на VB в екзешник) Теории вероятностей, мысли моего товарища по работе в бумаге так сказать..
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
Т.к. я пытаюсь понять смысл сказанного в десять раз дольше уважаемых гуру, я пока возьму паузу, но от темы не отказываюсь. Столбцов бывает максимум около 30000, соответственно как и строк. В большинстве случаев это квадратная матрица.
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
Я пока распутываю клубы тем. Закрыли мою, открыл Слэн, я ее увидел уже после вас...Я ваше решение пока смотрю, как только пойму что к чему, отпишусь
Михаил, на самом деле я пока ничего не понял :( Можете прокомментировать?
Изменено: kugeod - 11.10.2013 18:53:38
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
Михаил, матрицу свою я сократил, возможно это не лучший пример, т.к. я её обрезал, чтоб влезть в 100 кб, матрица у меня бывает занимает около 400мб памяти, и очень хочется понять, есть ли алгоритм более эффективный чем я выложил. Можно в принципе накатать по быстрому макрос, который бы делал эту матрицу из нулей и единиц...
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
Её закрыли а вопросы остались, это не повтор, это продолжение  :)  

з.ы.Слэн помог и выделил её в другю тему. Писали почти в одно время я не заметил создания его темы. Прошу оставить эту, вопрос для меня важный, хочу найти эффективный алгоритм решения задачи, пока только разговоры
Изменено: kugeod - 11.10.2013 18:11:15
Есть двумерный массив из нулей и единиц., Найти минимальное количество строк, которые бы образовали строку только из единиц.
 
сравниваю первую строку со всеми строками.
Но скорее это не правильно, т.к. нужно найти минимально количество строк удовлетворяющих условию.
Смысл собрать строку из одних единиц, взяв минимальное число строк из массива.

Накатал такой цикл, может подскажите что-нить побыстрее(поумнее) чем это:

Код
Do
k = k + 1 
max = 0 'введем переменную для учета максимального количества закрытия единицами нулей
For i = 1 To UBound(massiv1, 1)
    Perekritie = 0
        For j = 1 To UBound(massiv1, 1)
                If PoleSovpaden(1, j) = 0And PoleSovpaden(i, j) = 1 Then Perekritie = Perekritie + 1
        Next j
        PerekritieM(i) = Perekritie 'запоминаем сумму перекрытий i-ой строки
        If PerekritieM(i) > max Then
           max = PerekritieM(i)
           n = i ' переменная для номера строки имеющего максимальное совпадение с первой строкой.
        If max = Pred_Max Then Exit For 'если достигнуто предыдущее число совпадений то нет смысла дальше вести цикл
        Else
        End If
Next i
 Pred_Max = max 'запоминание предыдущего максимального числа совпадений
 If max = 0 Then Exit Do ' - сформировалась строка из единиц, либо больше нечем заменять..
 ReDim Preserve NStroki(k)
 NStroki(k) = n

MsgBox "колво совпадений: " & max & "  Номер строки: " & n & "  Строка по счету - " & k
zamena = 0 'количество замен будет равно количеству максимальных перекрытий.....,
For i = 1 To UBound(massiv1, 1)
    If PoleSovpaden(1, i) = 0 And PoleSovpaden(n, i) = 1 Then
    PoleSovpaden(1, i) = 1 ' меняем НУЛИ на ЕДИНИЦЫ в ИСХОДНИКЕ, меняем ИСХОДНИК до тех пор пока он не будет весь из ЕДИНИЦ
    zamena = zamena + 1  ' достигнуто  (число max), то нет смысла дальше продолжать цикл
    End If
    If zamena = max Then Exit For
Next i
Loop

Заранее спасибо.
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
Сорри, я плохо посмотрел, думал задвоились строки..В первом случае семь, во втором 9, в последнем 8
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
Можете сделать любой массив сами, из чисел 1 2 3 , повторяющихся в любом порядке, к примеру 2000 тыс строк на 12 колонок. Его и надо "посчитать". Рассчитать наиболее эффективно по времени
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
О как  :)  
Сложно для меня.
Ну во первых у меня толком эта штука не работает vIn = ActiveSheet.UsedRange.Value, определят неправильно. Оставил свою.
А вообще в глобальном плане узнать границы я использую функцию:
Код
Private Function last_row_column(iRow, iClm) As Integer
      If Cells(1, 1) = "" Or Cells(1, 1) = 0 Then
      iRow = 0 And iClm = 0
      Exit Function
      Else
      iRow = Columns.End(xlDown).Row
      iClm = Rows.End(xlToRight).Column
    End If
End Function

Во вторых я так и не понял смысла массива Comps() As CompType, точнее я вообще не понял что это, можно подробнее? Там когда идет Case 1: vComps(i).v1 = vComps(i).v1 + 1 вдвойне непонятно становится.
PS/ Да, в ячейках могут быть только 1 2 3. Почему результат то на выходе у меня и у anvg разный? Если глянуть на булин массив, они разные в итоге то.... - ГОНЮ, одинаковые они.
Изменено: kugeod - 04.10.2013 19:23:40
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
Ну, в итоге самый быстрый пока такой алгоритм:
Код
Private Sub CommandButton1_Click()
Dim M1(), p&, i&, j&, y&, Sovpadenie&
Dim MSovpaden() As Boolean
Dim tv As Single
cat = 10 ' задаем число совпадений, может быть любое
M1 = [A1].CurrentRegion.Value
ReDim MSovpaden(UBound(M1), UBound(M1)) As Boolean
tv = Timer
MaxN = UBound(M1) - cat
For i = 1 To UBound(M1)
    For p = i + 1 To UBound(M1)
    Sovpadenie = 0
    n = 0
            For j = 1 To UBound(M1, 2)
                If M1(i, j) = M1(p, j) Then Sovpadenie = Sovpadenie + 1 Else n = n + 1
            Next j
    If n > MaxN Then Exit For
    If Sovpadenie >= cat Then MSovpaden(i, p) = True ' условие формирования массива совпадений
    Next p
Next i
'Worksheets(2).[A1].Resize(UBound(MSovpaden), UBound(MSovpaden)).Value = Application.Transpose(MSovpaden)
MsgBox Timer - tv
End Sub



Да, и не в обиду, почему-то у MCH на выходе результат не такой как у меня!

Но может всё-таки еще чтонить придумать, при обработке 20 000 строк, каждые 10 сек не лишние  :)
Изменено: kugeod - 04.10.2013 01:01:28
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
Спасибо Всем!
Была у меня мысль добавить For p = i + 1 To UBound(M1) - чтобы не сравнивать опять второй с первым, потом третий с первым и вторым и т.д.
Но вот мысли добавить переменную, которая бы считала количество НЕсовпадений я что-то не додумал.

Интересно, можно ли еще быстрее  :)

P/S при 3000 строк у MSH алгоритм "отстает" ровно на 0,2 сек, но в целом время больше чем в 2 раза ниже чем у меня изначально.
Изменено: kugeod - 04.10.2013 00:23:50
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
Ну хоть напишите, что по другому никак, чтоб я не мучился :)
Сравнить числовой массив сам с собой., и получить на выходе "массив совпадений"
 
3 2 1 1 2 3 3 3 1 1
2 3 3 1 2 3 3 3 1 1
1 2 1 1 1 2 3 3 1 1
2 3 1 3 1 2 3 3 1 1
3 2 3 3 1 2 3 3 1 1
1 2 3 3 1 3 2 3 1 1
3 3 3 3 3 3 2 3 1 1
3 3 1 1 3 2 2 3 1 1
3 2 1 1 2 3 1 1 1 1
1 3 3 3 2 3 1 1 1 1
3 3 3 1 1 2 1 1 1 1
..........................................................................

Есть массив чисел. Надо его сравнить самим с собой построчно, каждую строку с каждой, и на основании сравнения получить массив сравнений, он всегда разный в зависимости от категории совпадения.

Собственно вопрос. Есть ли более прогрессивное(быстрое) сравнение ??
Бывает что массив состоит из 10 000 строк, и сравнивает он таким образом каждую строку с каждой минут 6.

P.S. Пример из 250 строк, т.к. больше в 2003 не лезет. Выгрузка в общем в итоге и не нужна, так для наглядности.
пример в файле.
Сбор однотипной информации с разных листов одной книги.
 
to Hugo, не хотел обидеть, просто мне тупенькому он показался понятнее :)
Сбор однотипной информации с разных листов одной книги.
 
to RAN. Я в восторге! Спасибо Вам большое. Куда пиво слать :) ?
Сбор однотипной информации с разных листов одной книги.
 
Цитата
мотя
Вам нужен свод по "Наименованию операции" или просто по списку работников?

Мне в итоге нужно просто список пофамильно и сумма их заработка. Операции и другая инфа мне не нужна, мне просто собрать всех работников и сумму их заработка.
Сбор однотипной информации с разных листов одной книги.
 
Спасибо, сейчас попробую понять и применить. Я никогда не использовал scripting.dictionary...
Сбор однотипной информации с разных листов одной книги.
 
Файл наряда для лучшего понимания. Смысл, собрать на отдельном листе в любом формате, список фамилий из нарядов и сумм по всем нарядам напротив фамилии.
Изменено: kugeod - 01.10.2013 21:32:38
Сбор однотипной информации с разных листов одной книги.
 
Здравствуйте.
Помогите с вопросом. Не знаю стоит ли выкладывать ексель для примера. Попробую так объяснить.
Есть в одной книге много листов. В каждом листе однотипный наряд на работы. В каждом наряде на работы встречаются фамилии рабочего и его заработанная плата.
Сижу полдня, вспоминаю VBA, но как говорил наш препод "период полураспада знаний 2 недели, 2 недели не позанимался - половину забыл". Года три назад думаю сделал бы сам, не спрашивая никого, но к сожалению своему отупел.
Хочу макросом собрать в 1 массив все листы.

Код
Dim sh As Worksheet
Dim mas1() As Variant 
Dim mas2() As Variant 
For Each sh In ThisWorkbook.Worksheets
 j=1   
      For i = 1 To 130 '130 навскидку потому что не знаю до конца сколько у меня рабочих на листе.
        p = sh.Cells(i + 13, 6) - фамилии начинаются с 14 строки, и присутствую НЕ В КАЖДОЙ строке.
   If p = 0 Or p = "" Or  Then  GoTo 10 'ускорить таким образом хотел, чтоб сразу на след клетку если пусто
      Else

       mas2(j, 1) = sh.Cells(i + 13, 6)'формируется массив с фамилией... 
            mas2(j, 2) = sh.Cells(i + 13, 9)' ..и суммой
End If
o = o + 1
10    Next i


дальше вот встрял, и первое встрял потому что массиве mas2 уже могут быть 2 и более строк с одной и той же фамилией, т.к. в наряде она может быть в нескольких местах. И надо бы сразу после обработки первого листа сравнить массив сам с собой и если есть повторяющиеся строки в первом измерении массива, то объединить их в одну и сложить второе их измерение(сумму).
Подскажите что-нибудь по этому поводу. Я так вижу создать какой-то массивИтог, в который бы я складывал резалты после каждого обработанного листа. Но что-то ничего не выходит. Заранее спс.
Страницы: 1
Наверх