Краткое изложение злоупотреблений во время интервью в заголовке

Redis PHP
  • Рукописный код, тема 1:
    /*
    * 有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,
    * 接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。
    * 现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。
    *
    *
    * 最先想到的是爆破的思路:从最后一个人被分配的房间开始往前递推,每个房间减一个人,直到某个房间人数减为0,但是并不是最优解法。。。
    * 面试完想到了另一种解法是找到分配后各个房间人数的最小值便是起始的i号房间。最小人数就是重新分配的轮次数。
    * */
    function findRoom($n, $x, $room)
    {
        $min = min($room);
        $index = function ($i) use($n) {
                return $i >= 0?$i % $n:$i % $n + $n;
        };
        //从最后分配房间回退到前一轮的i号房间
        for ($i = $x - 1, $d = 0;$min != $room[$index($i)]; $i --, $d ++ ) {
                $room[$index($i)] -= $min + 1;
        }
        //i号房间原人数
        $room[$index($i)] = $min * $n + $d;
        if ($index($i) != $x) {
                //恢复其它房间人数
                for ($i = $i - 1; $index($i) != $x; $i --) {
                        $room[$index($i)] -= $min;
                }
                $room[$index($i)] -= $min;
        }
        var_dump($room);
    }
  • Рукописный код, тема 2

    /*
    * 打印二叉树从左视角看到节点
    * 给定一颗普通二叉树,请输出二叉树左视角能看到的节点
    * 例如,普通二叉树
    *                  1
    *               /       \
    *             2          3
    *          /    \      /     \
    *         4      5    6       7
    *                            /
    *                          8
    * 从左边看,输出能看到的 1,2,4,8 这四个节点。
    * 使用层序遍历,从右到左,然后将最左侧放入结果集中
    * */
    class Node{
        public $val, $left, $right;
        public function __construct($val)
        {
                $this->val = $val;
        }
    }
    function leftView($root)
    {
        $stack = [];
        $stack[] = $root;
        $ret = [];
        while (!empty($stack)) {
                foreach ($stack as $eachNode) {
                    $leftNode = array_shift($stack);
                    if (!empty($leftNode->right)) {
                            $stack[] = $leftNode->right;
                    }
                    if (!empty($leftNode->left)) {
                            $stack[] = $leftNode->left;
                    }
                }
                $ret[] = $leftNode->val;
        }
        var_dump($ret);
    }
    • Преимущества и недостатки Redis?
      • Вышеупомянутые два алгоритма в основном не делали этого, что привело к краху большого состояния ума, поэтому ответ был не очень хорошим, преимущество окружено несколькими функциями и структурами данных Redis и сценариями приложений, настойчивостью, Sentinel, чтобы проиллюстрировать кластер, недостатки просто говорят, что это не может быть полностью отказоустойчивость и восстановление, внимательно запишите следующее, чтобы узнать.
      • преимущество:
        1. Данные хранятся в памяти, скорость чтения и записи очень высока, а однопоточная структура используется для предотвращения проблем и потребления, которые могут возникнуть из-за многопоточной конкуренции.
        2. Богатые типы данных, пять основных типов данных и множество полезных расширенных типов данных, таких как растровое изображение, HyperLogLog, публикация-подписка, GEO и т. д.
        3. Многофункциональный, с истечением срока действия ключа, простыми транзакциями, управлением Lua-скриптами, Pipeline и другими функциями.
        4. Данные могут быть сохранены, и сохранение данных может быть выполнено двумя способами: RDB и AOF.
        5. Обеспечивает репликацию master-slave и может использовать кластеры и сигнальные устройства для создания высокодоступной распределенной архитектуры.
      • недостаток:
        1. Не имеет автоматической отказоустойчивости и восстановления.
        2. Ведущее устройство отключено, и данные, не синхронизированные с подчиненным устройством, не могут быть восстановлены после простоя.
        3. Репликация master-slave принимает полную репликацию.Если файл моментального снимка слишком велик, это сильно повлияет на сервисные возможности кластера.
        4. Сложно поддерживать онлайн-экспансию.
  • Состояние взаимоблокировки:

    1. взаимоисключающий запрос
    2. неотъемлемый
    3. циклическое ожидание
    4. просьба сохранить
  • Разница между процессом и потоком:

    • Процесс — это основная единица владения ресурсами, а поток — это основная единица планирования и диспетчеризации ЦП.
    • В программе есть хотя бы один процесс, а в процессе есть хотя бы один поток.
    • Процесс имеет независимый блок памяти в программе выполнения, и несколько потоков совместно используют память, что значительно повышает эффективность работы программы.
    • Процессы имеют независимые адресные пространства, после сбоя процесса это не повлияет на другие процессы в защищенном режиме, а потоки — это просто разные пути выполнения в процессе. Потоки имеют свои стеки и локальные переменные, но между потоками нет отдельного адресного пространства.Смерть одного потока равносильна смерти всего процесса.Поэтому многопроцессные программы более надежны, чем многопоточные программы, но при переключении процессов стоимость ресурсов больше, а эффективность ниже.
  • Если объем данных составляет 50 М, а сетевая задержка составляет 50 мс, учитывая только протокол TCP, оцените время, необходимое для отправки этих данных из Пекина в Шэньчжэнь.
    • Выслушав меня....растерялся. . Дальше я могу только дергать за весь процесс отправки TCP данных от клиента к серверу, принимающему и обрабатывающему их.Чувствую, что интервьюер тоже очень недоволен.
    • Лично я чувствую, что контрольная точка этой проблемы заключается в том, что данные будут сегментированы при передаче TCP, а максимальная длина каждого сегмента ограничена, минус длина заголовка TCP — это длина данных, которые могут быть отправлены для каждый отрезок, а потом он просчитывается, но в это время менталитет сломался из-за проблемы с алгоритмом, и времени на раздумья нет.
    • Я кстати тоже запросил волну ответов. Долго думал, так и не понял. Заранее спасибо.  …