Это коллекция из более чем 26 000 заметок по информатике.

искусственный интеллект Java Linux Шаблоны проектирования

Организовано сердцем машины, автор: Чжэн Юнчуань, участие: Сыюань.

Это учебная записка с более чем 26 000 коллекций и 7 000 разветвлений. Недавно Чжэн Юнчуань из Университета Сунь Ятсена разработал проект «Подготовка учебных заметок к осеннему набору», который содержит много необходимых знаний и учебных пособий по информатике. Этот проект показывает, что вы должны знать о компьютерных науках от основных алгоритмов сортировки до концепций программирования.Этот проект также очень полезен для разработчиков машинного обучения и вводных читателей, таких как системы Linux, объектно-ориентированное программирование, инструменты Git и читаемость кода. Эти заметки составлены автором на основе его понимания различных книг и записи важных знаний.

адрес проекта:GitHub.com/CY C2018/int…Основное содержание проекта можно разделить на 9 частей, в которых алгоритм знакомит с базовым стеком и очередью, поиском объединения, сортировкой и поиском и т. д. Операционная система знакомит с современными компьютерными системами и системами Linux. Другие, такие как объектно-ориентированное программирование, которое представляет шаблоны проектирования и основные идеи, Git, самая совершенная в мире распределенная система управления версиями, а также Java и методы программирования.

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

алгоритм

  • Меч относится к предложению решения (каталог оформлен по второму изданию оригинальной книги)
  • Решение проблемы Leetcode (составлена ​​общая классификация и обобщены идеи решения проблем каждого типа задач классификации)
  • Алгоритм (в основном обратитесь к книге алгоритмов Роберта Седжвика для реализации, исходный код и тестовый код можно получить в другом репозитории)

Операционная система

  • Компьютерные операционные системы (см. Современные операционные системы, Расширенное программирование в среде Unix, Глубокое понимание компьютерных систем)
  • Linux (см. Частную кухню Linux от Brother Bird)

Интернет

  • Компьютерная сеть (см. компьютерную сеть Се Сижэня, метод компьютерной сети сверху вниз, подробное объяснение TCP/IP)
  • HTTP (обратитесь к графическому HTTP, а также к онлайн-документам, таким как MDN, Wikipedia и т. д.)
  • Сокет (см. Сетевое программирование Unix)

объектно-ориентированный

  • Шаблоны проектирования (см. Шаблоны проектирования Head First, Шаблоны проектирования. Основа повторно используемого объектно-ориентированного программного обеспечения и реализует 23 шаблона проектирования Гофа)
  • Объектно-ориентированное мышление (включая три принципа (наследование, инкапсуляция, полиморфизм), диаграммы классов, принципы проектирования)

база данных

  • Принципы системы баз данных (см. Принципы системы баз данных)
  • SQL (см. SQL, который вы должны знать)
  • Решение проблем с базой данных Leetcode (записи решений проблем с базой данных на Leetcode)
  • MySQL (см. Высокопроизводительный MySQL)
  • Redis (см. дизайн и реализацию Redis, бой Redis)

Java

  • Основы Java (см. «Эффективная Java», «Идеи программирования на Java», а некоторый контент относится к официальным документам и StackOverflow)
  • Виртуальная машина Java (подробнее см. в разделе Общие сведения о виртуальной машине Java)
  • Параллелизм Java (обратитесь к идеям программирования Java, глубокому пониманию виртуальной машины Java)
  • Контейнер Java (включая анализ исходного кода контейнера)
  • Ввод/вывод Java (включая принципы и примеры NIO)

распределенный

  • Консистенция (CAP, BASE, Paxos, Raft)
  • Распределенный анализ проблем (распределенные транзакции, распределенные блокировки, распределенные сеансы, балансировка нагрузки)

инструмент

  • Git (некоторые варианты использования и концепции Git)
  • Регулярные выражения (см. Регулярные выражения, которые необходимо знать)

Практика кодирования

  • Рефакторинг (см. Рефакторинг для улучшения дизайна существующего кода)
  • Читаемость кода (см. Искусство написания читаемого кода)
  • Рекомендации по стилю кода (Рекомендации по стилю кода для проектов Google с открытым исходным кодом)

объектно-ориентированное мышление

Конкретно, например, в основную идею объектно-ориентированного подхода автор вводит три характеристики инкапсуляции, наследования и полиморфизма в дополнение к диаграммам классов и принципам проектирования. Вот три основные объектно-ориентированные функции, разработанные в исходном проекте.Для получения дополнительной информации, пожалуйста, проверьте исходный проект GitHub.

Объектно-ориентированное программирование очень важно в процессе реализации идей и даже систем.Используем ли мы TensorFlow или PyTorch для построения моделей, нам нужно больше или меньше использовать классы и методы. Если мы понимаем три характеристики объектной ориентации и используем классы и методы для построения моделей, они могут сделать наш код машинного обучения более красивым и очаровательным.

упаковка

Используйте абстрактные типы данных, чтобы инкапсулировать данные и операции на основе данных вместе, чтобы сформировать неделимую независимую сущность. Данные защищены в рамках абстрактного типа данных, внутренние детали максимально скрыты, и только некоторые внешние интерфейсы зарезервированы для связи с внешним миром. Пользователю не нужно знать внутренние детали объекта, но он может получить доступ к объекту через интерфейс, предоставляемый объектом.

преимущество:

  • Уменьшенная связь: может быть независимо разработана, протестирована, оптимизирована, использована, понята и изменена.
  • Уменьшить нагрузку на техническое обслуживание: программистам будет легче понять его, и его можно отлаживать, не затрагивая другие модули.
  • Эффективная настройка производительности: профилирование можно использовать для определения того, какие модули влияют на производительность системы.
  • Улучшение возможности повторного использования программного обеспечения
  • Снижение риска создания больших систем: эти отдельные модули могут быть доступны, даже если вся система недоступна.

Следующий класс Person инкапсулирует такие атрибуты, как имя, пол, возраст и т. д. Внешний мир может получить только атрибут имени и атрибут пола объекта Person с помощью метода get(), но не может получить атрибут возраста, но атрибут возраста может использоваться методом work().

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

public class Person {
    private String name;
    private int gender;
    private int age;

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender == 0 ? "man" : "woman";
    }

    public void work() {
        if (18 <= age && age <= 50) {
            System.out.println(name + " is working very hard!");
        } else {
            System.out.println(name + " can't work any more!");
        }
    }
}


наследовать

Наследование реализует отношение IS-A. Например, Cat и Animal являются отношениями IS-A, поэтому Cat может наследовать от Animal, чтобы получить нечастные свойства и методы Animal.

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

Animal animal = new Cat();

Наследование должно следовать принципу замещения Лискова, а объекты подкласса должны иметь возможность заменять все объекты суперкласса.


полиморфизм

Полиморфизм делится на полиморфизм времени компиляции и полиморфизм времени выполнения. Полиморфизм времени компиляции в основном относится к перегрузке методов, а полиморфизм времени выполнения относится к конкретному типу, на который указывает ссылка на объект, определенная в программе, которая определяется во время выполнения.

Полиморфизм времени выполнения имеет три условия:

  • наследовать
  • перезаписать (переписать)
  • Трансформация вверх

В приведенном ниже коде класс Instrument (Instrument) имеет два подкласса: Wind и Percussion, оба из которых переопределяют метод play() родительского класса и используют родительский класс Instrument в методе main() для ссылки на Wind и Percussion. Ударные объекты. Когда метод play() вызывается для ссылки на инструмент, выполняется метод play() класса фактического объекта, на который ссылаются, а не метод класса инструмента.

public class Instrument {
    public void play() {
        System.out.println("Instument is playing...");
    }
}

public class Wind extends Instrument {
    public void play() {
        System.out.println("Wind is playing...");
    }
}

public class Percussion extends Instrument {
    public void play() {
        System.out.println("Percussion is playing...");
    }
}

public class Music {
    public static void main(String[] args) {
        List<Instrument> instruments = new ArrayList<>();
        instruments.add(new Wind());
        instruments.add(new Percussion());
        for(Instrument instrument : instruments) {
            instrument.play();
        }
    }
}