Организовано сердцем машины, автор: Чжэн Юнчуань, участие: Сыюань.
Это учебная записка с более чем 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();
}
}
}