GithubHelp home page GithubHelp logo

homework3's Introduction

homework3

Домашняя работа для NC Java Autumn School 2021

Чураков Сергей


Отчет по 3 домашнему заданию

Списки

Рассмотрим производительность классов ArrayList, LinkedList и MyLinkedList при помощи классов ListTestClass и MyListTestClass. Запустим методы add, get, set, remove с различным числом элементов (n = 25000, 50000, 75000, 100000). Стоит отметить, что производительность методов зависит от того, работают ли они с первыми/последними элементами или элементами из середины. add у нас добавляет элементы в конец, get и set работают с каждым элементом коллекций по 1 разу, remove удаляет у нас элементы из конца списка. Например, если бы remove работал с первым/средним элементом, его производительность сильно бы упала, ведь пришлось бы каждый раз перепаковывать массив для ArrayList и ходить по элементам связанных списков.

image

Метод add в целом во всех списках работает быстро, ведь добавление элемента в конец списка имеет сложность O(1). Реализация MyLinkedList работает тут медленнее всех.

image

Метод get работает в ArrayList гораздо быстрее, чем в связанных списках, он может получить доступ к i элементу за время, практически независимое от n. Связанным спискам же нужно пройтись по всем элементам списка, лежащим между началом/концом списка и искомым элементом. Здесь почти нет разницы между реализациями LinkedList и MyLinkedList.

image

То же самое можно сказать про метод set.

image

На графике remove у ArrayList работает быстрее всех, но если бы мы делали remove из середины или начала списка, в ArrayList пришлось бы смещать все элементы между удаляемым и конечным. В связанных списках тоже бы пришлось бы проходить по всем элементам между удаляемым и начальным/конечным. remove в MyLinkedList работает быстрее, чем в LinkedList. remove в LinkedList делает дополнительные операции, чтобы помочь сборщику мусора, наверное, это и вызывает разницу в производительности.

В ArrayList быстро работают методы set и get. add и remove в ArrayList тоже работают быстро, но только потому, что мы работаем с конечным элементом. Если нам нужно часто вставлять элементы в середину/начало списка или удалять элементы из начала или конца, лучше будет воспользоваться LinkedList.

Множества

Проделаем то же самое с множествами. Рассматривать будем классы HashSet, LinkedHashSet, TreeSet. В этот раз будем тестировать методы add и remove.

image

Быстрее всех метод add работает в HashSet, LinkedHashSet работает немного медленнее, TreeSet работает всех медленнее. add в HashSet должен выполняться таким образом: вычисляем hashCode вставляемого элемента, проверяем, есть ли он в bucket (поиск по списку с малым числом элементов или по дереву, когда элементов становится много), добавляем элемент в bucket. LinkedHashSet дополнительно формирует связи между вставляемым и последним вставленным элементом, поэтому работает чуть медленнее.
TreeSet может работать только с Comparable, он представляет собой сбалансированное бинарное дерево, сложность операции add будет около log(n) + балансировка.

image

HashSet опять работает быстрее всех, remove из LinkedHashSet работает чуть медленнее, TreeSet работает медленнее всех.

Возможно, TreeSet работает на этом примере так медленно, так как вводятся упорядоченные значения, приходится часто балансировать дерево. Если нам часто приходится вставлять/удалять элементы, лучше пользоваться HashSet или LinkedHashSet, но если нужно часто выполнять поиск, TreeSet может конкурировать с HashSet и LinkedHashSet, ведь поиск в нем должен выполняться со сложностью O(log n), тогда как в HashSet производительность поиска будет зависеть от числа коллизий. Если нам важна упорядоченность элементов, использовать надо TreeSet. Если надо запоминать порядок добавления элементов, использовать надо будет LinkedHashSet.

Maps

Проделаем то же самое с Maps. Рассматривать будем классы HashMap, LinkedHashMap, TreeMap. Рассматривать будем методы put, get, replace, remove.

image

image

image

image

Тут все очень похоже на ситуацию со списками. HashMap работает быстрее всех, LinkedHashMap чуть медленнее HashMap, TreeMap медленнее всех. Множества и мапы вообще похожи друг на друга по принципу работы. Опять же, если мы часто вставляем/удаляем элементы, лучше выбрать HashMap или LinkedHashMap. Если нам часто нужен поиск по мапе, можно выбрать или HashMap, или TreeMap, если элементы в HashMap будут неравномерно размещаться по бакетам. Если нам важна упорядоченность, лучше выбрать TreeMap. Если нужно запоминать порядок добавления элементов, используем LinkedHashMap.

homework3's People

Contributors

sergeyt4444 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.