JavaRush /Блоги Java /Random-TG /Алгоритмҳои ҳаяҷоновар ё муқаддимаи бедард ба алгоритмҳо
Viacheslav
Сатҳи

Алгоритмҳои ҳаяҷоновар ё муқаддимаи бедард ба алгоритмҳо

Дар гурӯҳ нашр шудааст
Баррасии китоби "Алгоритмҳои Грокинг". Каме андешаи шахсӣ, чанд мисол. Ман умедворам, ки ин барраси ба шумо дар фаҳмидани он, ки оё шумо ин китобро хондан мехоҳед ё он дар рафи шумо ҷои худро намегирад, кӯмак мекунад. Огоҳӣ: Матни зиёде)

"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо

Муқаддима

Қариб ҳама ҷойҳои холии сатҳи наврас дорои талабот ба монанди "дониши сохторҳои додаҳо ва алгоритмҳо" мебошанд. Барои шахсоне, ки маълумоти махсус доранд, алгоритмҳо ба курси умумӣ дохил карда мешаванд ва набояд мушкилот дошта бошанд. Аммо чй мешавад, ки агар азхудкунй аз дигар даштхо оварда мешуд? Танҳо он чизе, ки худатон омӯхтан аст, боқӣ мемонад. Ба саволи «ки гунахкор» чавоб дорад, вале ба саволи «чй бояд кард» бояд чавоб чустучу кард. Биёед ба китобҳо назар андозем. Ва ман мехоҳам ба шумо дар бораи як чиз нақл кунам.
"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо - 1

Алгоритмҳои Grok

Дар байни хамаи асархо ман ба чунин китобе дучор шудам, ки «Алгоритмхои игвогарй». Шумо метавонед маълумоти бештарро дар ин ҷо пайдо кунед: " Китоби "Алгоритмҳои афзоиш. Дастури тасвирӣ барои барномасозон ва кунҷковон ." Ман китобро кайхо пай бурдам, вале дар озон он 680 сум буд. Қимат ё арзон - ҳар кас худаш қарор медиҳад. Ман аллакай китоби дуюми Avito-ро бо нисфи нарх мехарам. Аз ин рӯ, ман онро дар Санкт-Петербург ёфтам, харидам ва ба он ҷо рафтам. Он чизе ки ман қарор додам, ки бо шумо мубодила кунам. Бале, дар китоб codeи Java вуҷуд надорад, аммо... рамзи дигар вуҷуд дорад, аммо бештар дар ин бора баъдтар.

Муқаддима ба алгоритмҳо (тартиби интихоб)

Ҳамин тавр, дар шакли осони нақл, мо дар иҷрои худ ба навъбандии аввал мерасем. Ин навъи интихоб аст. Моҳияти он дар он аст, ки мо элементҳоро аз чап ба рост (аз 0 элемент то охирин) мегузарем ва аз байни элементҳои боқимонда калонтаринашро меҷӯем. Агар мо онро пайдо кунем, мо элементеро, ки ҳоло дар он ҳастем ва бузургтарин элементро иваз мекунем. Роҳи соддатарин барои аввалин бор фикр кардан дар бораи массив ин аст: [5, 3, 6, 2, 10]. Як пораи коғаз, қалам (роҳи соддатарин ва камхарҷ) гиред ва тасаввур кунед, ки чӣ гуна мо сарҳади чап, индекси ҷорӣ (ё сарҳади рост) ва индекси элементи минималиро дорем. Ва чӣ гуна мо бо он кор мекунем. Барои намуна:
"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо - 2
Алгоритмҳо одатан дар псевдоcode тавсиф карда мешаванд, масалан, дар Википедиа. Мо комилан псевдоcode нест, аммо дар ин бора баъдтар. Ҳоло биёед бубинем:

def selectionSort(array):
    for left in range(0, len(array)):
        minIndex = left
        for right in range (left+1, len(array)):
            if array[right] < array[minIndex]:
                minIndex = right
        if minIndex != left:
            temp = array[left]
            array[left] = array[minIndex]
            array[minIndex] = temp
    return array

print(selectionSort([5, 3, 6, 2, 10]))
Акнун биёед онро дар шакли codeи Java пешниҳод кунем:
public static void selectionSort(int[] array) {
        for (int left = 0; left < array.length; left++) {
            int minIndex = left;
            for (int right = left+1; right < array.length; right++) {
                if (array[right] < array[minIndex]) {
                    minIndex = right;
                }
            }
            if (minIndex != left) {
                int temp = array[left];
                array[left] = array[minIndex];
                array[minIndex] = temp;
            }
        }
}
Тавре ки шумо мебинед, рамз тақрибан якхела аст. Рамзи аввал як мисол аз китоб аст. Дуюм иҷрои ройгони ман дар codeи Java мебошад.

Рекурсия

Баъдан ба мо гуфта мешавад, ки чунин чизе ба монанди рекурсия вуҷуд дорад. Пеш аз хама, дар бораи дехконе, ки майдони AxB дорад. Ин майдонро ба «мураббаъхо» баробар таксим кардан лозим аст. Ва баъд аз ин алгоритми Евклид зикр мешавад. Он чизе, ки ба ман маъқул нест, он аст, ки онҳо барои навиштани codeи он кӯшиш накарданд. Аммо алгоритми Евклид содда ва самаранок аст:
"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо - 3
Рости гап, ман дар китоб баъзе тафсилотро аз даст додам, масалан дар ин видео: “ Информатика. Назарияи алгоритмҳо. Алгоритми Евклид ». Масалан, агар a аз b камтар бошад, пас дар даврони аввал b ва a ҷойҳоро иваз мекунанд ва дафъаи дуюм калонтар ба хурдтар тақсим мешаванд. Аз ин рӯ, тартиби баҳсҳо муҳим нест. Чун маъмулӣ, аввал мо метавонем алгоритмро дар як варақ "эҳсос кунем":
"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо - 4
Акнун биёед codeро бубинем:

def euclidean(a, b):
    if a == 0 : return b
    if b == 0 : return a
    return euclidean (b, a % b)
Биёед ҳамон codeро дар Java нависед. Агар хоҳед, мо метавонем компилятори онлайнро истифода барем :
public static int euclid(int a, int b) {
        if (a == 0) return b;
        if (b == 0) return a;
        return euclid(b, a%b);
}
Факториал низ дар аввали китоб зикр шудааст. Факториали адади n (n!) ҳосor ададҳои аз 1 то n мебошад. Чаро ин корро мекунед? Дар ин ҷо як барномаи амалӣ вуҷуд дорад. Агар мо n an object дошта бошем (масалан, n шаҳр), пас мо метавонем аз онҳо n ададро созем! Комбинатхо. Шумо метавонед дар бораи рекурсия бештар дар ин ҷо бихонед: " Рекурсия. Вазифаҳои омӯзишӣ ." Муқоисаи равишҳои такрорӣ ва рекурсивӣ: « Рекурсия ».

Навъи зуд

Навъи зуд як алгоритми хеле ҷолиб аст. Дар китоб ба у чандон ахамият намедиханд. Гузашта аз ин, рамз танҳо барои ҳолати бадбахттарин, вақте ки элементи аввал интихоб карда мешавад, дода мешавад. Аммо, шояд барои шиносоии аввал ин мисолро дар хотир доштан осонтар бошад. Ва беҳтар аст, ки як навъи зуди бад нависед, аз он ки тамоман нанависед. Инак як мисол аз китоб:

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
    return quicksort(less) + [pivot] + quicksort(greater)
Дар ин ҷо ҳама чиз хеле оддӣ аст. Агар мо массиви аз 0 ё 1 элемент дошта бошем, зарурати ҷудо кардани он нест. Агар он калонтар бошад, мо элементи якуми массивро мегирем ва онро "унсури чархзананда" мешуморем. Мо 2 массиви нав эҷод мекунем - яке аз унсурҳои калонтар аз pivot ва дуюм дорои унсурҳои хурдтар аст. Ва мо ба таври рекурсивӣ такрор мекунем. Варианти беҳтарин нест, аммо боз ҳам беҳтар ба ёд овард. Биёед ин алгоритмро дар Java татбиқ кунем, аммо дурусттар. Дар ин бора мавод аз баррасии " Компьютер дар JavaScript: Quicksort " ба мо кӯмак мекунад . Ва пеш аз навиштани code, биёед бори дигар алгоритмро "эҳсос кунем" -ро кашем: Аввалан, биёед бори дигар дар варақи коғаз кашем, то алгоритмро фаҳмем:
"Алгоритмҳои ғамхорӣ" ё муқаддимаи бедард ба алгоритмҳо - 5
Ба назари ман, яке аз лахзахои хавфноктарин халли масъалахо мебошад. Аз ин рӯ, мо татбиқро дар якчанд қадамҳои хурд иҷро хоҳем кард:
  • Мо бояд элементҳоро дар массив иваз карда тавонем:

    private static void swap(int[] array, int firstIndex, int secondIndex) {
            int temp = array[firstIndex];
            array[firstIndex] = array[secondIndex];
            array[secondIndex] = temp;
    }

  • Ба мо усуле лозим аст, ки массивро дар фосилаи муайяншуда ба 3 қисм тақсим мекунад


    private static int partition(int[] array, int left, int right) {
            int pivot = array[(right + left) / 2];
            while (left <= right) {
                while (array[left] < pivot) {
                    left++;
                }
                while (array[right] > pivot) {
                    right--;
                }
                if (left <= right) {
                    swap(array, left, right);
                    left++;
                    right--;
                }
            }
            return left;
    }

    Тафсилот дар истиноди боло. Хулоса, мо курсори чапро ба ҳаракат меорем, то он даме, ки элемент аз гардиш камтар шавад. Ба ҳамин монанд, курсори ростро аз тарафи дигар ҳаракат кунед. Ва мо иваз мекунем, агар курсорҳо мувофиқат накунанд. Мо то он даме, ки курсорҳо ба ҳам наздик шаванд, идома медиҳем. Мо индексеро бармегардонем, ки коркарди минбаъдаро ба 2 қисм тақсим мекунад.

  • Ҷудокунӣ вуҷуд дорад, ба мо худи ҷудокунӣ лозим аст:

    public static void quickSort(int[] array, int left, int right) {
            int index = 0;
            if (array.length > 1) {
                index = partition(array, left, right);
                if (left < index - 1) {
                    quickSort(array, left, index - 1);
                }
                if (index < right) {
                    quickSort(array, index, right);
                }
            }
    }

    Яъне, агар массив камаш аз ду элемент иборат бошад, он гох онхоро аллакай мураттаб кардан мумкин аст. Аввалан, мо тамоми массивро ба ду қисм тақсим мекунем, унсурҳои хурдтар аз пивот ва элементҳои калонтар. Сипас барои ҳар як қисмҳои натиҷавӣ амалҳои шабеҳро иҷро мекунем.

    Ва барои санҷиш:

    public static void main(String []args){
            int[] array = {8,9,3,7,6,7,1};
            quickSort(array, 0, array.length-1);
            System.out.println(Arrays.toString(array));
    }
Дар китоб гуфта мешавад, ки ин алгоритм ба алгоритмҳои ба истилоҳ "Тақсим ва ғалаба" тааллуқ дорад, вақте маҷмӯи додаҳои коркардшуда ҳар дафъа ба нисфи тақсим карда мешавад. Мушкorи алгоритм: O(nLogn)
"Алгоритмҳои ғамхор" ё муқаддимаи бедард ба алгоритмҳо - 6
Чизи бад (яъне он чизе, ки ба ман маъқул набуд) он аст, ки дар китоб навъҳои якҷоякунӣ ҳангоми гузариш зикр шудааст, аммо ягон мисол ё рамз пешниҳод намекунад. Тафсилоти бештарро дар ин ҷо пайдо кардан мумкин аст: " Информатика. Алгоритмҳои ҷустуҷӯ ва ҷудокунӣ: Ҷудокунии якҷоя ". Аз ин ру, барои мураттабият худамон ин корро кунем. Худи алгоритм, албатта, табиатан содда ва содда аст:
public static void mergeSort(int[] source, int left, int right) {
    if ((right - left) > 1) {
        int middle = (right + left) / 2;
        mergeSort(source, left, middle);
        mergeSort(source, middle + 1, right);
    }
    merge(source, left, right);
}
Мо миёнаро муайян мекунем ва массивро ба ду тақсим мекунем. Барои ҳар як нисфи мо ҳамин тавр мекунем ва ғайра. Ҳолати қатъ ё ҳолати асосӣ - мо бояд зиёда аз як элемент дошта бошем, зеро мо наметавонем як элементро ба ду тақсим кунем. Акнун ба мо лозим аст, ки якҷояшавӣ, яъне якҷоякунӣ татбиқ кунем:
public static void merge(int[] array, int from, int to) {
    int middle = ((from + to) / 2) + 1;
    int left = from;
    int right = middle;
    int cursor = 0;

    int[] tmp = new int[to - from + 1];
    while (left < middle || right <= to) {
        if (left >= middle) {
            tmp[cursor] = array[right];
            System.out.println("Остаток справа: " + array[right]);
            right++;
        } else if (right > to) {
            tmp[cursor] = array[left];
            System.out.println("Остаток слева: " + array[left]);
            left++;
        } else if (array[left] <= array[right]) {
            tmp[cursor] = array[left];
            System.out.println("Слева меньше: " + array[left]);
            left++;
        } else if (array[right] < array[left]) {
            tmp[cursor] = array[right];
            System.out.println("Справа меньше: " + array[right]);
            right++;
        }
        cursor++;
    }
    System.arraycopy(tmp, 0, array, from, tmp.length);
}
Дар ин ҷо бисёр шарҳ додан лозим нест. Аз номи тағирёбандаҳо printlnҳама чиз равшан аст. Хуб, барои тафтиш:
int array[] = {1, 7, 3, 6, 7, 9, 8, 4};
mergeSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));

Ҷадвалҳои хэш

Китоб инчунин ба ҷадвалҳои ҳаш дахл дорад. Ба шумо лозим нест, ки онро худатон амалӣ кунед ва моҳияти ҷадвалҳои ҳаш хеле содда аст. Дар ниҳоят, Java инчунин татбиқи ҷадвалҳои hash, java.util.HashTable дорад. Агар мо ба дастгоҳи HashTable нигоҳ кунем, мебинем, ки массиви Entry дар дохor он зиндагӣ мекунад. Вуруд сабтест, ки омезиши Калид - Арзиш аст. HashTable дорои initialCapacity - яъне андозаи ибтидоӣ мебошад. Ва loadFactor - омor сарборӣ. Пешфарз 0,75 аст. Ин рақам ба шумо мегӯяд, ки дар кадом сарбории массив (шумораи элементҳо/шумораи умумӣ) андоза бояд зиёд карда шавад. Дар Java он 2 баробар меафзояд. Дар китоб тавзеҳ медиҳад, ки ҷадвалҳои ҳаш ҷадвалҳои ҳаш номида мешаванд, зеро дар асоси функсияи hash, ячейкаи массив (сабад), ки дар он Entry. Шумо инчунин метавонед дар ин ҷо маълумоти бештар гиред: Сохторҳои маълумот дар тасвирҳо. HashMap ва LinkedHashMap . Шумо инчунин метавонед онро дар китобҳо хонед. Масалан, дар ин ҷо: " Асосҳои HashTable "

Графикҳо, Ҷустуҷӯи аввал (ҷустуҷӯи роҳи кӯтоҳтарин)

Эҳтимол яке аз мавзӯъҳои ҷолибтарин графикҳост. Ва дар ин чо, бояд гуфт, ки китоб ба онхо диккати калон медихад. Шояд барои ҳамин хондани ин китоб меарзад. Ҳарчанд, шояд, онро каме равшантар баён кардан мумкин буд)) Аммо, мо Интернет дорем ва ба ғайр аз китоб, шумо метавонед ин рӯйхати навозишро дар назария барои "онҳое, ки бори аввал дар бораи графикҳо мешунаванд, бубинед . » Хуб, табиист, ки дар ибтидои китоб алгоритми ҷустуҷӯи фарох, ки breadth-first-searchбо номи BFS низ маълум аст, дода мешавад. Дар китоб диаграммаи зерин мавҷуд аст:
«Грокаем алгоритмы» or безболезненное введение в алгоритмы - 7
Дар китоб гуфта мешавад, ки навбат ба мо кумак мекунад. Ғайр аз он, мо метавонем элементҳоро ба охир илова кунем ва навбатро аз аввал коркард кунем. Чунин навбатҳоро ба забони англисӣ навбатҳои дутарафа ё Deque меноманд. Дар китоб истифодаи сохтори додаҳо - ҷадвали hash пешниҳод карда мешавад. Барои муқоиса кардани ном ва ҳамсояҳо. Бо қуллаҳои рақамгузорӣ, шумо метавонед танҳо массивро истифода баред. Ин захираи қуллаҳо «Рӯйхати қуллаҳои ҳамсоя» номида мешавад, ки дар китоб зикр нашудааст. Ин барои онҳо минус аст. Биёед инро дар Java татбиқ кунем:
private Map<String, String[]> getGraph() {
    Map<String, String[]> map = new HashMap<>();
    map.put("you", new String[]{"alice", "bob", "claire"});
    map.put("bob", new String[]{"anuj", "peggy"});
    map.put("alice", new String[]{"peggy"});
    map.put("claire", new String[]{"thom", "jonny"});
    map.put("annuj", null);
    map.put("peggy", null);
    map.put("thom", null);
    map.put("johny", null);
    return map;
}
Ҳоло худи ҷустуҷӯ, ки дар ин маълумот сохта шудааст:
private String search() {
    Map<String, String[]> graph = getGraph();
    Set<String> searched = new HashSet<>();
    Deque<String> searchQue = new ArrayDeque<>();
    searchQue.add("you");
    while (!searchQue.isEmpty()) {
        String person = searchQue.pollFirst();
        System.out.println(person);
        if (personIsSeller(person)) {
            return person;
        } else {
            String[] friends = graph.get(person);
            if (friends == null) continue;
            for (String friend : friends) {
                if (friend != null && !searched.contains(friend)) {
                    searchQue.addLast(friend);
                }
            }
        }
    }
    return null;
}
Тавре ки шумо мебинед, ҳеҷ чиз мураккаб нест. Агар шумо онро бо рамзи китоб муқоиса кунед, он тақрибан якхела аст.

Графикҳо, алгоритми Дийкстра

Пас аз фаҳмидани BFS, муаллифи китоб моро даъват мекунад, ки алгоритми Daysktra ва графикҳои вазншударо фаҳмем. Барои ҳалли ин диаграммаи зерин пешниҳод карда мешавад:
«Грокаем алгоритмы» or безболезненное введение в алгоритмы - 8
Аввалан, мо бояд фаҳмем, ки чӣ гуна графикҳои худро муаррифӣ кунем. Мо метавонем онро ҳамчун матритса муаррифӣ кунем. Мақола дар бораи Ҳабре ба мо дар ин ҷо кӯмак хоҳад кард: алгоритми Дижкстра. Ҷустуҷӯи масирҳои оптималӣ дар график . Биёед матритсаи ҳамсояро истифода барем:
public Integer[][] getGraphMatrix(int size) {
    Integer[][] matrix = new Integer[size][size];
    matrix[0][1] = 6;
    matrix[0][2] = 2;
    matrix[2][1] = 3;
    matrix[1][3] = 1;
    matrix[2][3] = 5;
    return matrix;
}
Ва акнун худи мантиқ:
@Test
public void dijkstra() {
    Integer[][] graph = getGraphMatrix();           // Данные графа
    Integer[] costs = new Integer[graph.length];    // Стоимость перехода
    Integer[] parents = new Integer[graph.length];  // Родительский узел
    BitSet visited = new BitSet(graph.length);      // "Ферма" маркеров посещённости

    Integer w = 0;
    do {
        System.out.println("-> Рассматриваем вершину: " + w);
        Integer min = null;
        for (int i = 0; i < graph.length; i++) {    // Обрабатываем каждую дугу
            if (graph[w][i] == null) continue;      // Дуги нет - идём дальше
            if (min == null || (!visited.get(i) && graph[w][min] > graph[w][i])) {
                min = i;
            }
            if (costs[i] == null || costs[i] > costs[w] + graph[w][i]) {
                System.out.print("Меням вес с " + costs[i]);
                costs[i] = (costs[w] != null ? costs[w] : 0) + graph[w][i];
                System.out.println(" на " + costs[i] + " для вершины " + i);
                parents[i] = w;
            }
        }
        System.out.println("Вершина с минимальным весом: " + min);
        visited.set(w);
        w = min;
    } while (w != null);

    System.out.println(Arrays.toString(costs));
    printPath(parents, 3);
}

public void printPath(Integer[] parents, int target) {
    Integer parent = target;
    do {
        System.out.print(parent + " <- ");
        parent = parents[parent];
    } while (parent != null);
}
Китоб онро хеле зина ба зина тақсим мекунад. Агар шумо мақолаеро дар бораи Habré дар Интернет илова кунед + ба code нигаред, шумо метавонед онро дар хотир доред. Ман таҳлor қадам ба қадамро каме печида ёфтам. Аммо барои табиати қадам ба қадам ин як плюс аст. Умуман, хуб, гарчанде ки метавонист беҳтар бошад)

Алгоритмҳои хасис

Бахши навбатӣ ба "алгоритмҳои хасис" бахшида шудааст. Ин бахш ҷолиб аст, зеро он маҷмӯи (java.util.Set) -ро истифода мебарад. Дар охир мо метавонем бубинем, ки чаро он лозим аст. Мо рӯйхати давлатҳоро ҳамчун вуруд истифода мебарем:
Set<String> statesNeeded = new HashSet();
statesNeeded.addAll(Arrays.asList("mt", "wa", "or", "id", "nv", "ut", "ca", "az" ));
Ва инчунин рӯйхати радиостансияҳое, ки баъзе аз ин давлатҳоро фаро мегиранд:
Map<String, Set<String>> stations = new HashMap<>();
stations.put("kone", new HashSet(Arrays.asList("id", "nv", "ut")));
stations.put("ktwo", new HashSet(Arrays.asList("wa", "id", "mt")));
stations.put("kthree", new HashSet(Arrays.asList("or", "nv", "ca")));
stations.put("kfour", new HashSet(Arrays.asList("nv", "ut")));
stations.put("kfive", new HashSet(Arrays.asList("ca", "az")));
Дар китоб худи алгоритм ишора ва тавзеҳ медиҳад:
Set<String> finalStations = new HashSet();
while (!statesNeeded.isEmpty()) {
    String bestStation = null;
    Set<String> statesCovered = new HashSet();
    for (String station: stations.keySet()) {
        Set covered = new HashSet(statesNeeded);
        covered.retainAll(stations.get(station));
        if (covered.size() > statesCovered.size()) {
           bestStation = station;
           statesCovered = covered;
        }
    }
    statesNeeded.removeAll(statesCovered);
    finalStations.add(bestStation);
}
System.out.println(finalStations);

Барномасозии динамикӣ

Дар китоб инчунин мушкилоте тасвир шудааст, ки ба онҳо равиш бо номи "барномасозии динамикӣ" татбиқ мешавад. Вазифа дода мешавад:
«Грокаем алгоритмы» or безболезненное введение в алгоритмы - 9
Мо як халтаи 4 фунт дорем. Шумо бояд ашёҳои фоидаоварро барои вазни додашуда пайдо кунед. Аввалан, биёед рӯйхати ашёро тартиб диҳем:
List<Thing> things = new ArrayList<>();
things.add(new Thing("guitar", 1, 1500));
things.add(new Thing("tape recorder", 4, 3000));
things.add(new Thing("notebook", 3, 2000));
Акнун худи алгоритм:
int bagSize = 4;
int cell[][] = new int[things.size()][bagSize];
// Заполняем первую строку без условий
for (int i = 0; i < bagSize; i++) {
    cell[0][i] = things.get(0).cost;
}
// Заполняем оставшиеся
for (int i = 1; i < cell.length; i++) {
    for (int j = 0; j < cell[i].length; j++) {
        // Если вещь не влезает - берём прошлый максимум
        if (things.get(i).weight > j+1) {
            cell[i][j] = cell[i - 1][j];
        } else {
            // Иначе текущая стоимость + предыдущий максимум оставшегося размера
            cell[i][j] = things.get(i).cost;
            if (j + 1 - things.get(i).weight > 0) {
                cell[i][j] += cell[i-1][j + 1 - things.get(i).weight];
            }
        }
    }
}
System.out.println(Arrays.deepToString(cell));
Инчунин вазифаи ҷолиб барои ёфтани калимаҳои ба ҳам монанд вуҷуд дорад. Ҷолиб аст, ҳамин тавр не? Тафсилоти бештар дар ин ҷо: LongestCommonSubsequence.java

Ҷустуҷӯи ҳамсояҳои наздиктарин

Дар китоб инчунин дар бораи алгоритми k-наздиктарин ҳамсояҳо хеле равшан сухан меравад:
«Грокаем алгоритмы» or безболезненное введение в алгоритмы - 10
Ва формулаи ҳисоб дода мешавад:
«Грокаем алгоритмы» or безболезненное введение в алгоритмы - 11

Хатти поён

Китоб бо бахши ҷолиби "Оянда чӣ мешавад?", ки шарҳи зуди алгоритмҳои ҷолибро пешкаш мекунад, ба итмом мерасад. Дар ин ҷо тавсифи мухтасари маънои дарахтон ва алгоритмҳои дигар аст. Дар маҷмӯъ, китоб ба ман маъқул шуд. Он набояд ҳамчун як навъ маълумоти ҳамаҷониба ҷиддӣ қабул карда шавад. Шумо бояд худатон ҷустуҷӯ кунед ва фаҳмед. Аммо ҳамчун маълумоти муқаддимавӣ барои таваҷҷуҳ ва додани идеяи ибтидоӣ, ин хеле хуб аст. Бале, рамзи китоб бо Python навишта шудааст. Ҳамин тавр, ҳамаи мисолҳои дар боло овардашуда тартиб дода мешаванд) Ман умедворам, ки ин барраси ба шумо кӯмак мекунад, ки дар бораи он, ки китоб чиро дар бар мегирад ва оё он арзиш дорад, харид кунед.

Илова бар ин

Шумо инчунин метавонед захираҳои зеринро дар ин мавзӯъ санҷед:
  1. EdX - Муқаддима ба барномасозии Java: Сохторҳои асосӣ ва алгоритмҳои додаҳо
  2. LinkedIn - Муқаддима ба сохторҳои додаҳо ва алгоритмҳо дар Java (пулакӣ)
  3. 27 сайт бо муаммоҳо барои такмил додани малакаҳои барномасозии шумо
  4. Java CodingBat
  5. Вазифаҳо барои барномасозон, ҷавобҳо ба вазифаҳои мураккабии гуногун
#Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION