Ответы пользователя по тегу Алгоритмы
  • Интересный вопрос от Я! Как решить проблему неправильных монет?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вы в рассуждении говорите о "последовательности" выпадения. Тут нет никакой "последовательности". Монеты можно бросить все сразу или по очереди - разницы нет никакой.

    Альтернативно можно решать другую задачу. У нас кубики с пронумерованными сторнами. Первый кубик имеет три стороны (ну представим себе такой), второй - пять, третий - 7, следующий - 2*i+1. Соответственно выбросить единицу на каждом кубике мы можем с вероятностью 1/2*i+1. Нас интересует вероятность того. что после броска всех кубиков количество единиц на них будет нечетным.
    Вспомним элементарную задачу. Пусть у нас два шестигранных кубика. Как мы посчитаем вероятность того что мы получим две единицы? Количество благоприятствующих исходов к количеству возможных исходов. т.е. 1 исход из 11. Идем дальше, у нас два кубика. Какова вероятность того что мы бросим нечетное количество единиц? Это вероятность единицы на одном кубике помноженная на вероятнось "не-единицы" на другом. Т.е. 1/6 * 5/6.

    Думаю такой подсказки будет достаточно.
    Ответ написан
    Комментировать
  • Как найти все целочисленные точки отрезка?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вот похожая задача:
    Концы отрезка на плоскости имеют целочисленные координаты.
    Требуется написать программу, которая вычислит, сколько всего точек с целочисленными координатами принадлежат этому отрезку.

    В даны примеры
    (1 1) (2 2 ) -> 2
    (0 0) (-2 -2) -> 3
    (1 1) (1 10) -> 10
    Значит задача состоит в поиске целочисленных значений между двумя значениями.
    Taкже мы исключим условие целочисленности концов отрезка. Чтобы решение стало универсальнее.

    На питоне это можно сделать так:
    код
    i1 = -1.1
    i2 = 8.9
    
    input1 = int(i1)
    input2 = int(i2)
    print "==== will print for food ===="
    print "      from "+str(input1)
    print "     up to "+str(input2)
    print "============================="
    
    print [y for y in range(input1, input2+1)]
    результат

    ==== will print for food ====
    from -1
    up to 8
    ========================
    [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8]
    Ответ написан
    Комментировать
  • Алгоритм нахождения победителя (крестики нолики)?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Я бы обозначил первого игрока единицей, а второго четверкой.
    Если сумма в ряду, столбце или диагонали равна 3 - выиграл первый, если она 12 - выиграл второй.
    Ответ написан
    Комментировать
  • Есть тестовая задача, я немного подсел в алгоритмах, можете подсказать какой лучше подойдет для задачи?

    lxsmkv
    @lxsmkv
    Test automation engineer
    В "правильной" последовательности чисел сумма каждой пары чисел, если брать с головы и с хвоста, не изменяется. Чтобы добраться до того места где спутались цифры перебором понадобится N/2, и еще нужно будет выяснить какое из двух чисел неправильное например проверив его соседей

    Во второй задаче нужно разбить текст на токены
    str = "Hello I'm your String";
    String[] splited = str.split("\\s+");

    https://stackoverflow.com/questions/7899525/how-to...
    а потом пройти по массиву и выдать каждое третье слово. Вопрос еще в том, что делать со знаками препинания которые как правило прилеплены к слову. По уму их надо откинуть.
    Ответ написан
  • Как решить задачу о рюкзаке 0-1 (ее разновидность)?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Я так понимаю, что особенность Вашей задачи в том, что количество предметов должно быть именно строго равно ограничению? В стандартных задачах ограничения по количеству выбраных предметов нет.

    Перефразирую задачу:

    Допустим, у вас всего в наличии N предметов, a рюкзак должен быть укомплектован К предметами, причем К<=N. Нужно выбрать такую комплектацию, чтобы общий вес не превышал максимально допустимый и общая ценность предметов была наиболее высокой.


    Предлагаю Вам решение "в лоб":

    Создайте список всех сочетаний K над N (для комбинаторных рассчетов есть специальные библиотеки для большинства языков программирования). Для каждого сочетания рассчитайте его вес и уберите те сочетания которые превышают ограничение по весу. Оставшиееся сочетания отосортируйте по убыванию ценности и возьмите самые верхние.
    Ответ написан
    2 комментария
  • Полезно ли при обучении изобретать велосипеды?

    lxsmkv
    @lxsmkv
    Test automation engineer
    В первом случае вы как бы подглядываете в ответы, а во втором пытаетесь обдумать решение самостоятельно. Я думаю нужно мысле-мышцу тренировать, а не память. (Нет, помнить надо, но не конкретную реализацию, а что где то я это уже видел, слышал, т.е. хранить ссылки на знания)
    Ответ написан
    Комментировать
  • Зачем нужна сериализация?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Потому что сокет понимает только потоки данных, поскольку основан на протоколе tcp/ip?
    Ответ написан
    Комментировать
  • Случайное число с заданной вероятностью, какой алгоритм?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вот склепал на скорую руку:
    https://repl.it/K2UJ/2
    import random 
    
    def getrand():
      r = random.randint(1,100)
      if  r < 23:
        return 0 # 22%
      if 42 > r >= 23:
        return 1 # 19%
      if 58 > r >= 41:
        return 2 # 16%
      if 71 > r >= 57:
        return 3 # 13%
      if 81 > r >=70:
        return 4 # 10%
      if 89 > r >=80:
        return 5 # 8 % 
      if 95 > r >=88:
        return 6 # 6%
      if 99 > r >=94:
        return 7 # 4%
      if 101 > r >=98:
        return 8 # 2 %
    result = []
    rng = 1000000
    for x in range(0,rng):
      result.append(getrand())
    
    print "0 : "+str(result.count(0)/float(rng))+" ~ " +str(0.22 - result.count(0)/float(rng))
    print "1 : "+str(result.count(1)/float(rng))+" ~ " +str(0.19 - result.count(1)/float(rng))
    print "2 : "+str(result.count(2)/float(rng))+" ~ " +str(0.16 - result.count(2)/float(rng))
    print "3 : "+str(result.count(3)/float(rng))+" ~ " +str(0.13 - result.count(3)/float(rng))
    print "4 : "+str(result.count(4)/float(rng))+" ~ " +str(0.10 - result.count(4)/float(rng))
    print "5 : "+str(result.count(5)/float(rng))+" ~ " +str(0.08 - result.count(5)/float(rng))
    print "6 : "+str(result.count(6)/float(rng))+" ~ " +str(0.06 - result.count(6)/float(rng))
    print "7 : "+str(result.count(7)/float(rng))+" ~ " +str(0.04 - result.count(7)/float(rng))
    print "8 : "+str(result.count(8)/float(rng))+" ~ " +str(0.02 - result.count(8)/float(rng))
    
    freqs = [ result.count(0)/float(rng),result.count(1)/float(rng),result.count(2)/float(rng),result.count(3)/float(rng),
    result.count(4)/float(rng),result.count(5)/float(rng),result.count(6)/float(rng),result.count(7)/float(rng),result.count(8)/float(rng)]
    
    print sum(freqs)


    0 : 0.219347 ~ 0.000653
    1 : 0.190018 ~ -1.8e-05
    2 : 0.160421 ~ -0.000421
    3 : 0.129805 ~ 0.000195
    4 : 0.100175 ~ -0.000175
    5 : 0.07974 ~ 0.00026
    6 : 0.060102 ~ -0.000102
    7 : 0.040174 ~ -0.000174
    8 : 0.020218 ~ -0.000218
    1.0
    Ответ написан
    Комментировать
  • Что нужно для развития логики?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Решайте задачки по программированию. Попробуйте обучающие игры типа codecombat.com, js.checkio.org, screeps.com, codewars.com, codehunt.com ( правда тут java /c#)
    Попробуйте порешать задачки на этих интерактивных курсах: repl.it/community/classrooms/24696 repl.it/community/classrooms/26415
    и тут coderbyte.com

    Рекомендую еще книжку Самоучитель JavaScript (Дмитриева М.) Там на яваскрипте решаются серьезные алгоритмические задачи.

    Учебник по логике вам мало чем поможет, так же как и учебник по физкультуре мало поможет научиться подтягиваться на турнике по 20 раз.
    Ответ написан
    Комментировать
  • Создание робота-паука для сбора данных - где искать информацию?

    lxsmkv
    @lxsmkv
    Test automation engineer
    само это занятие называется web scraping или web harvesting, по этой теме инфы очень много в интернете.
    Ответ написан
    Комментировать
  • Чем можно протестировать работу поискового движка на корректность выдаваемых им результатов?

    lxsmkv
    @lxsmkv
    Test automation engineer
    зависит от требований которые закладывались в систему поиска.
    - толерантность к опечаткам - подмена символа или нескольких в строке
    - одинаковый ответ при одинаковом запросе.
    - реакция на длинный запрос (пытается ли она найти пересечения)
    - взять два ключевых слова в одной и обратной последовательности (я ввожу "sony apple" и "apple sony" но система выводит только продукты apple, наверно так не должно быть)
    - порог соответствия, что результаты ниже определенного требованиями порога не выводятся. (пишу "пленка" выводятся только 10-15 результатов и далеко не все продукты содержащие слово "пленка" - наверное так не должно быть)
    - как реагирует алгоритм если в базе очень мало записей? А если очень много записей с очень высокой схожестью?

    Чем тестировать ? У вас есть api, берите jmeter шлите через аpi запросы и проверяйте ответы.
    Или не jmeter a другой интрумент для тестирования web api. в конце концов pycurl или python + curl вариантов достаточно. Первоочередная сложность не в инструменте а в определении требований к системе поиска.

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

    Или возьмите студента-тестировщика он вам быстрее найдет все серьезные недочеты если вам критичен скорый выход на рынок. А автоматизацию подтянете по ходу дела.
    Ответ написан
    Комментировать
  • Как склеить одномерние массиви в двумерний?

    lxsmkv
    @lxsmkv
    Test automation engineer
    public class Main{
      public static void main(String args[]){
        int ar1 []  = {1,2,3,4,5};
        int ar2 []  = {6,7,8,9,0};
        int arr [][] = {ar1, ar2};
        System.out.println(arr[0][1]);
        System.out.println(arr[1][2]);
        try{
        System.out.println(arr[2][0]);
        }
        catch (IndexOutOfBoundsException e){
          System.out.println(e + " -> Index doesnt exist");
        }
      }
    }


    вывод:
    2
    8
    java.lang.ArrayIndexOutOfBoundsException: 2 -> Index doesnt exist
    Ответ написан
    Комментировать
  • Как подсчитать количество звезд на ночном небе?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вы переводите трехмерную информацию в двумерную, это ведет к потере информации. Отсюда проистекают дальнейшие "трудности". Понятно что количество звезд в кадре вы посчитать не сможете, а сможете лишь посчитать количество точек - проекций лучей звезд на двумерную плоскость. Понятно что, для того чтобы получить хоть какой-то результат нужно прибегать к методам статистической оценки.

    Я бы построил график который для каждой смежной закрашеной области показывал бы ее величину, например количество точек входящих в смежную область. Для данного изображения получится сначала медленно поднимающаяся (много маленьких точек разного размера) и потом резко уходящая вверх кривая (большая область. Так можно будет выявить диапазон допустимых значений для размера звезды, на этом расстоянии. Т.е правую часть графика вы отсечете. Все остальное будут "наверное звезды".

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

    Говоря в общем:
    Если человек не в состоянии решить аналитическую задачу, то компьютер не поможет. В данном случае человек не сможет толком сказать сколько звезд на этом двухцветном снимке. Он прибегнет как какой то эвристике. Вот эту эвристику и нужно заложить в алгоритм.
    Ответ написан
    1 комментарий
  • Какая функция растёт быстрее?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Нужно выяснить значение производной какой из них для любых значений n будет больше.
    Производная функции ведь и есть функция прироста значения функции.
    К алгоритмам прямого отношения не имеет, чистая алгебра.
    www.wolframalpha.com/input/?i=plot+n%5E(log(n)),+n%5E2
    функции пересекаются в точке n~=7,39 до этого значения n^2 растет быстрее, а после - n^log(n)
    Ответ написан
    Комментировать
  • Как научиться реализовывать алгоритмы?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Те же сорсы стандартных библиотек Java читать. Разбирать строчка по строчке и думать почему так.
    Ответ написан
    Комментировать
  • Как правильно генерировать псевдослучайные числа?

    lxsmkv
    @lxsmkv
    Test automation engineer
    возьмите последовательность чисел от 0 до n, возьмите за шаг любое простое число p > n/2, и вынимайте из последовательности каждое число за номером p по кругу.
    Но и тут последовательности. А вам я так понял нужно чтобы оно "создавалось" а не выбиралось.
    Хоря, что плохого в выбирании, ведь карты из неотосортированной колоды тоже выбирают, и ничего, такой выбор считается случайным. A так на основании системного времени. Или белого шума радиочастоты. Или из сервиса на random.org. Если ваш алгоритм будет проходить тест diehard - отпишитесь, всем будет интересно ;)
    Ответ написан
    Комментировать
  • Вторая по счету книга по алгоритмам и структурам данных?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Michael T. Goodrich, Roberto Tamassia "Data Structures and Algorithms in Python"
    у них же есть такая же книга по Java.
    Ответ написан
    Комментировать
  • Можно ли использовать оператор в ветвлении как параметр или аттрибут?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Сделайте стурктуру данных, которая будет хранить левое значение, оператор как строку, и правое значение
    в ней метод evaluate типа
    if operator.equals("<=") 
    return  leftval <= rightval
    .. и т.д.

    так чтобы вместо
    if (map.get(ID).getValue < value)
    вызывать что-то вроде
    if (ExpressionMap.getEntryByID(ID).evaluate())

    но не буду настаивать на верности такого подхода :)
    Ответ написан
    1 комментарий
  • Есть хороший алгоритм или класс для генерации доменных имен?

    lxsmkv
    @lxsmkv
    Test automation engineer
    вы соединяйте нормальные слова, причем желательно частоупотребимые. css+school water+school media+school.
    css+temple water+temple media+temple. css+bucket, water+bucket, media+bucket.
    если вы хотите домены из одного слова,и не ломать язык, напишите правила которые будут соединять слоги в благозвучной последовательности. например если первый слог mir то второй не должен начинаться на r. Не должно идти три согласных подряд и пр.
    Ответ написан
    Комментировать