diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\345\255\246\344\274\232\344\275\277\347\224\250\345\221\275\344\273\244\345\270\256\345\212\251.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\345\255\246\344\274\232\344\275\277\347\224\250\345\221\275\344\273\244\345\270\256\345\212\251.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\345\270\270\347\224\250\345\221\275\344\273\244\346\200\273\347\273\223.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\345\270\270\347\224\250\345\221\275\344\273\244\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\344\273\266\345\217\212\347\233\256\345\275\225\347\256\241\347\220\206.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\344\273\266\345\217\212\347\233\256\345\275\225\347\256\241\347\220\206.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\344\273\266\346\235\203\351\231\220\344\270\216\345\261\236\346\200\247.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\344\273\266\346\235\203\351\231\220\344\270\216\345\261\236\346\200\247.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\346\234\254\345\244\204\347\220\206\345\221\275\344\273\244.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\207\346\234\254\345\244\204\347\220\206\345\221\275\344\273\244.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\260\346\211\213\345\277\205\345\244\207\345\221\275\344\273\244.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\226\260\346\211\213\345\277\205\345\244\207\345\221\275\344\273\244.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213cpu\343\200\201\345\206\205\345\255\230\345\222\214\347\216\257\345\242\203\347\255\211\344\277\241\346\201\257.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213cpu\343\200\201\345\206\205\345\255\230\345\222\214\347\216\257\345\242\203\347\255\211\344\277\241\346\201\257.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213\345\222\214\350\256\276\347\275\256\347\216\257\345\242\203\345\217\230\351\207\217.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213\345\222\214\350\256\276\347\275\256\347\216\257\345\242\203\345\217\230\351\207\217.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213\350\277\233\347\250\213\345\221\275\344\273\244ps\345\222\214top.md" "b/1-computer_basics/Linux\347\263\273\347\273\237/Linux\345\237\272\347\241\200-\346\237\245\347\234\213\350\277\233\347\250\213\345\221\275\344\273\244ps\345\222\214top.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/0.3605952030126039.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/0.3605952030126039.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/06b2a08b-152d-4553-b17a-7c0e3bb9ccea.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/06b2a08b-152d-4553-b17a-7c0e3bb9ccea.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/0ac7fde7-15c9-44e4-9bbf-dc22f48a0360.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/0ac7fde7-15c9-44e4-9bbf-dc22f48a0360.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/0f1d4c73-962e-4f86-ac84-83d629539f00.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/0f1d4c73-962e-4f86-ac84-83d629539f00.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/20c9770d-41d5-4880-9b43-335934bebccd.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/20c9770d-41d5-4880-9b43-335934bebccd.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/22ce3092-92be-4333-ac84-38f7ab7f2730.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/22ce3092-92be-4333-ac84-38f7ab7f2730.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/285954fe-e25e-4957-baee-29c1cacff6d9.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/285954fe-e25e-4957-baee-29c1cacff6d9.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/2c00f3a1-eb00-4665-b0ed-c8dd415e227a.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/2c00f3a1-eb00-4665-b0ed-c8dd415e227a.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/375869b7-c94c-4893-b291-9abe6b22356a.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/375869b7-c94c-4893-b291-9abe6b22356a.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/4ab2b6b3-a1cd-4e9e-8f76-fc6d59b1a557.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/4ab2b6b3-a1cd-4e9e-8f76-fc6d59b1a557.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/60434a88-d703-43b8-88c5-ea61dfc4f793.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/60434a88-d703-43b8-88c5-ea61dfc4f793.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/6c34e412-890f-4565-8424-998517fb44b2.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/6c34e412-890f-4565-8424-998517fb44b2.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/74dede33-9491-4a06-8bee-aa789daed0df.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/74dede33-9491-4a06-8bee-aa789daed0df.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/78316e49-97f8-41cf-a9d9-b8f7e2ce024d.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/78316e49-97f8-41cf-a9d9-b8f7e2ce024d.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/7fdb5e4a-dbd3-4bc0-ac38-e3db32a40438.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/7fdb5e4a-dbd3-4bc0-ac38-e3db32a40438.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/a1561fd2-f491-4aaf-9a09-c1aa71b1e148.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/a1561fd2-f491-4aaf-9a09-c1aa71b1e148.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/b3e99fdb-ebac-467e-861f-5c034fc7881c.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/b3e99fdb-ebac-467e-861f-5c034fc7881c.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/b7d1fdca-5ae0-4d88-8e0d-00dedeb439b6.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/b7d1fdca-5ae0-4d88-8e0d-00dedeb439b6.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/c62f2296-e82d-4d3c-bb6f-07c1d581fe6b.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/c62f2296-e82d-4d3c-bb6f-07c1d581fe6b.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/cfce666e-0390-441b-bf87-baffb21aa628.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/cfce666e-0390-441b-bf87-baffb21aa628.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/eeb259ca-1f6b-4066-a59e-dec2d8c3f41b.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/eeb259ca-1f6b-4066-a59e-dec2d8c3f41b.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/f1d7359b-92b4-4074-84d4-0a381aaf4d1b.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/f1d7359b-92b4-4074-84d4-0a381aaf4d1b.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/f53e407f-3f8b-4e93-b0de-f84a6f4c9882.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/f53e407f-3f8b-4e93-b0de-f84a6f4c9882.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/fe9c61ae-8f3a-4e13-9285-1a7c84927fa1.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/fe9c61ae-8f3a-4e13-9285-1a7c84927fa1.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/Linux\347\263\273\347\273\237/images/feaa2c13-1cdf-46e1-948c-535f4c51a9bd.png" "b/1-computer_basics/Linux\347\263\273\347\273\237/images/feaa2c13-1cdf-46e1-948c-535f4c51a9bd.png" old mode 100644 new mode 100755 diff --git a/1-computer_basics/README.md b/1-computer_basics/README.md old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/--PPoOxo2HA8iiV2CMHdheiPHqZcVdjfTNthDnsP7fA.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/--PPoOxo2HA8iiV2CMHdheiPHqZcVdjfTNthDnsP7fA.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/0OjCdS_0w64dJv3wcJrcn2xHhZq6sc3xNLVqOR2BAIA.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/0OjCdS_0w64dJv3wcJrcn2xHhZq6sc3xNLVqOR2BAIA.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/0aML0CYNT05z5GVXBUco2zBDD62MoNzr3Jj_FDly8fg.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/0aML0CYNT05z5GVXBUco2zBDD62MoNzr3Jj_FDly8fg.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/2VWtPSaNVKroazokJ2j_HoJ4cCBOz3Xz3Yddlv0nh_U.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/2VWtPSaNVKroazokJ2j_HoJ4cCBOz3Xz3Yddlv0nh_U.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/33y4SmPfYDRqPwjBUedJJXuuxhwT3Me9eJ15zEHO1LQ.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/33y4SmPfYDRqPwjBUedJJXuuxhwT3Me9eJ15zEHO1LQ.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/4q85EDFxENMJTUnhcQydhZR73dgCwmC-YCm8qgzRTiw.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/4q85EDFxENMJTUnhcQydhZR73dgCwmC-YCm8qgzRTiw.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/5kUNCag6pjUpDjf8l64j0yLLtWY8y06CCLQoVlVs7s0.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/5kUNCag6pjUpDjf8l64j0yLLtWY8y06CCLQoVlVs7s0.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/899dlOzwfvOmBpzyX5VUJ2CGNJp-t115-mGKJkNwqDg.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/899dlOzwfvOmBpzyX5VUJ2CGNJp-t115-mGKJkNwqDg.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/AkNj9Ck9ql43MdAiTXagNpHEmRBcRBdVLaEjNou_okU.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/AkNj9Ck9ql43MdAiTXagNpHEmRBcRBdVLaEjNou_okU.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/BYrY1-ffeSExzLuOP-qeIIVMoclFpCROwtIhv6NCY-s.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/BYrY1-ffeSExzLuOP-qeIIVMoclFpCROwtIhv6NCY-s.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/CNLtOP_LRbWvOvz83RuknMO2cFOCFDQX76sHKRMIerA.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/CNLtOP_LRbWvOvz83RuknMO2cFOCFDQX76sHKRMIerA.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/F8ISuUEs_e2MjSGeLoI0MMJ_MkF1-l97H9dFGHPp2Js.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/F8ISuUEs_e2MjSGeLoI0MMJ_MkF1-l97H9dFGHPp2Js.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/FRLfh6XYdUC9IMcIg0eqAmWP1HEZgVHtCVg5n_wyKO0.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/FRLfh6XYdUC9IMcIg0eqAmWP1HEZgVHtCVg5n_wyKO0.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/FzYI4mQOCdRMTOobIqSzNX4DG6cUhxD50092K-v1sNU.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/FzYI4mQOCdRMTOobIqSzNX4DG6cUhxD50092K-v1sNU.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/ImONa4Ylt2sGRON7xzuR4GPLsH0eNnPp2DdynYWZJwY.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/ImONa4Ylt2sGRON7xzuR4GPLsH0eNnPp2DdynYWZJwY.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/K6PjfUTdwF9IUo79rJ-29LTz7siBHlx7hpfBPPisRbY.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/K6PjfUTdwF9IUo79rJ-29LTz7siBHlx7hpfBPPisRbY.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/KtBlfW18psEh0gDwf8E-uncsC0rDzh0Q9N-QDvp8cc8.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/KtBlfW18psEh0gDwf8E-uncsC0rDzh0Q9N-QDvp8cc8.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/M8pGEmsRv5XkQscrjour5-1xZnOag3Ar9Jav9wMTdW0.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/M8pGEmsRv5XkQscrjour5-1xZnOag3Ar9Jav9wMTdW0.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/Mo5N1s1-WvO3ejtcXUw5ofMQTYhldNXr4IoIweyERuE.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/Mo5N1s1-WvO3ejtcXUw5ofMQTYhldNXr4IoIweyERuE.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/OqeuQi8kL1BP46nwSbcKdJ0mqtEvna5Wi-55r5F-q1Y.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/OqeuQi8kL1BP46nwSbcKdJ0mqtEvna5Wi-55r5F-q1Y.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/PMxiwceVcvQ8THubjichY3PkaA4WqwpGK4yh-jL24n8.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/PMxiwceVcvQ8THubjichY3PkaA4WqwpGK4yh-jL24n8.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/QSQYzFHHj7WPK5uGgWAQdgAaelr3AbiRG3hxWMKHrJs.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/QSQYzFHHj7WPK5uGgWAQdgAaelr3AbiRG3hxWMKHrJs.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/QVeSGeljjdm5GXeZgEAnborO2yK8uLFSNQxpXWkm4NY.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/QVeSGeljjdm5GXeZgEAnborO2yK8uLFSNQxpXWkm4NY.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/TpNXGmzm8PkOUDCgf5Zyyac0QuLMa-O1tL4DQ0TuE-g.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/TpNXGmzm8PkOUDCgf5Zyyac0QuLMa-O1tL4DQ0TuE-g.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/WRpsNl_ap3Nm68Gug5LN4nByXA4yQ5hZRRuzKXGVipo.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/WRpsNl_ap3Nm68Gug5LN4nByXA4yQ5hZRRuzKXGVipo.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/Zlw0SByXxHNCHycSo-Eg66b7nLQ1LJfjUWdkvIdnu7o.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/Zlw0SByXxHNCHycSo-Eg66b7nLQ1LJfjUWdkvIdnu7o.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/awQ9HQwF_e_cXZkesyt85CAVtwPbALZTncgEobBiO4E.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/awQ9HQwF_e_cXZkesyt85CAVtwPbALZTncgEobBiO4E.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/du15XqDyxT2wKlQmZyDKTIbP51mCrm3AHOUVdkJWhkc.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/du15XqDyxT2wKlQmZyDKTIbP51mCrm3AHOUVdkJWhkc.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/gFzfKRqy4vYGCPctO0JWKh4W0c-PxkEz0aJUYsg0gws.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/gFzfKRqy4vYGCPctO0JWKh4W0c-PxkEz0aJUYsg0gws.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/iWjyenH48I7GpLDjQAqc2yVQhT-7F5H2W8YBbErI86c.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/iWjyenH48I7GpLDjQAqc2yVQhT-7F5H2W8YBbErI86c.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/jNMMhByUJX6mgnQXa06ieKCNof94Uh4cExDepVFSI3Q.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/jNMMhByUJX6mgnQXa06ieKCNof94Uh4cExDepVFSI3Q.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/lqkdYI5dn7Z3w_AmOnNU_gZDM6HjOYVQRzK_g3ae8EQ.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/lqkdYI5dn7Z3w_AmOnNU_gZDM6HjOYVQRzK_g3ae8EQ.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/mSOUx9Uu2iF_pkpzqSBv2B9xc_WRW5O57imc650fmyA.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/mSOUx9Uu2iF_pkpzqSBv2B9xc_WRW5O57imc650fmyA.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/mUJJs9almEPtVReVTMkTpLWDnrPPkiAGN5lcJ7ok94k.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/mUJJs9almEPtVReVTMkTpLWDnrPPkiAGN5lcJ7ok94k.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/qnsVUQQ249XWv70KXYUBmTdLYPGd6iQub56NJ-d9fUM.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/qnsVUQQ249XWv70KXYUBmTdLYPGd6iQub56NJ-d9fUM.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/t18gr2bkMba5q2g5z9rRrjWcjBARJ_la_zU8Z2VX06M.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/t18gr2bkMba5q2g5z9rRrjWcjBARJ_la_zU8Z2VX06M.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/t7jsbVVmMRGIsiXX6IzRg339QPyKOXbA0aQBfXzG5Q8.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/t7jsbVVmMRGIsiXX6IzRg339QPyKOXbA0aQBfXzG5Q8.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/wJpUN8D2GNjAICfQftGbUvXOux5B-KNrmz4KQi-chhE.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/wJpUN8D2GNjAICfQftGbUvXOux5B-KNrmz4KQi-chhE.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/wRKt5-V8DGMNjVgX5p_xz8TRlqncKRkVZkiYK6IUsXs.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/wRKt5-V8DGMNjVgX5p_xz8TRlqncKRkVZkiYK6IUsXs.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/yPe9VIy0F1qNvzMcBmQILriZUcc4c-fz4GrYm0hjiQE.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/yPe9VIy0F1qNvzMcBmQILriZUcc4c-fz4GrYm0hjiQE.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/ymZPakWiwkFaKtCt9yb5GwYbw2cl2kt66aKr1pSVoQ8.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/ymZPakWiwkFaKtCt9yb5GwYbw2cl2kt66aKr1pSVoQ8.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/yy0TyW1D5tbPw6VbHTwCtjhoRKzWeqvBA3nD9dneR6A.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/yy0TyW1D5tbPw6VbHTwCtjhoRKzWeqvBA3nD9dneR6A.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/z8jUtZpnGYEQ9Yr9KYe9tdhg4bOdqhNci4cD2onpecc.png" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/images/z8jUtZpnGYEQ9Yr9KYe9tdhg4bOdqhNci4cD2onpecc.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2541\347\253\240\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237\346\274\253\346\270\270\347\254\224\350\256\260.md" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2541\347\253\240\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237\346\274\253\346\270\270\347\254\224\350\256\260.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2542\347\253\240\344\277\241\346\201\257\347\232\204\350\241\250\347\244\272\345\222\214\345\244\204\347\220\206\347\254\224\350\256\260.md" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2542\347\253\240\344\277\241\346\201\257\347\232\204\350\241\250\347\244\272\345\222\214\345\244\204\347\220\206\347\254\224\350\256\260.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2543\347\253\240\347\250\213\345\272\217\347\232\204\346\234\272\345\231\250\347\272\247\350\241\250\347\244\272\347\254\224\350\256\260.md" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\346\267\261\345\205\245\347\220\206\350\247\243\350\256\241\347\256\227\346\234\272\347\263\273\347\273\237-\347\254\2543\347\253\240\347\250\213\345\272\217\347\232\204\346\234\272\345\231\250\347\272\247\350\241\250\347\244\272\347\254\224\350\256\260.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/1-computer_basics/\346\223\215\344\275\234\347\263\273\347\273\237/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\347\237\245\350\257\206.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/Docker\345\237\272\347\241\200\345\222\214\345\270\270\347\224\250\345\221\275\344\273\244.md" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/Docker\345\237\272\347\241\200\345\222\214\345\270\270\347\224\250\345\221\275\344\273\244.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/git\345\270\270\347\224\250\345\221\275\344\273\244\346\200\273\347\273\223.md" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/git\345\270\270\347\224\250\345\221\275\344\273\244\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/17e735cb-eb5d-482a-a364-2be3b3aef3c5.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/17e735cb-eb5d-482a-a364-2be3b3aef3c5.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/4d420e56-98da-4c25-a9bc-07b4fc7bbad3.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/4d420e56-98da-4c25-a9bc-07b4fc7bbad3.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/WGJjEZDqVJJZkZNi1MkYFXOaFrKh1UoKu8Cw-gfrl10.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/WGJjEZDqVJJZkZNi1MkYFXOaFrKh1UoKu8Cw-gfrl10.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/fc92417a-079c-4bb9-8d34-0fb3a68eb096.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/fc92417a-079c-4bb9-8d34-0fb3a68eb096.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/g7BbKHcsuGPKLEZlVUd0GxL7zhyJzGdZ9L-nmTcJneY.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/g7BbKHcsuGPKLEZlVUd0GxL7zhyJzGdZ9L-nmTcJneY.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/mmocr_install_success.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/mmocr_install_success.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/oIxx0rBoZiuqRQc86gpaF5z8otXeCRzQe23Nabds-6E.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/oIxx0rBoZiuqRQc86gpaF5z8otXeCRzQe23Nabds-6E.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/update_pip_download_source.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/update_pip_download_source.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/vwSKapCUchQN_oQ7_vdLOiZZZKB6nLe0E3wKWLEY4tc.png" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/images/vwSKapCUchQN_oQ7_vdLOiZZZKB6nLe0E3wKWLEY4tc.png" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/ubuntu16.04\345\256\211\350\243\205mmdetection\345\272\223.md" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/ubuntu16.04\345\256\211\350\243\205mmdetection\345\272\223.md" old mode 100644 new mode 100755 diff --git "a/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/\347\250\213\345\272\217\347\274\226\350\257\221\345\267\245\345\205\267\345\237\272\347\241\200.md" "b/1-computer_basics/\346\225\210\347\216\207\345\267\245\345\205\267/\347\250\213\345\272\217\347\274\226\350\257\221\345\267\245\345\205\267\345\237\272\347\241\200.md" old mode 100644 new mode 100755 diff --git a/2-programming_language/README.md b/2-programming_language/README.md old mode 100644 new mode 100755 diff --git "a/2-programming_language/cpp/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223.md" "b/2-programming_language/cpp/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/cpp/c++\345\237\272\346\234\254\347\274\226\347\250\213\351\242\230\346\261\207\346\200\273.md" "b/2-programming_language/cpp/c++\345\237\272\346\234\254\347\274\226\347\250\213\351\242\230\346\261\207\346\200\273.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/python3/Python\346\225\260\346\215\256\345\210\206\346\236\220-pandas\345\272\223\345\205\245\351\227\250.md" "b/2-programming_language/python3/Python\346\225\260\346\215\256\345\210\206\346\236\220-pandas\345\272\223\345\205\245\351\227\250.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/python3/python3\347\274\226\347\250\213\346\200\273\347\273\223.md" "b/2-programming_language/python3/python3\347\274\226\347\250\213\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/python3/python\345\233\276\345\203\217\345\244\204\347\220\206-\350\257\273\345\217\226\345\233\276\345\203\217\346\226\271\345\274\217\346\200\273\347\273\223.md" "b/2-programming_language/python3/python\345\233\276\345\203\217\345\244\204\347\220\206-\350\257\273\345\217\226\345\233\276\345\203\217\346\226\271\345\274\217\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/python3/python\346\225\260\346\215\256\345\210\206\346\236\220-\345\240\206\345\217\240\346\225\260\347\273\204\345\207\275\346\225\260\346\200\273\347\273\223.md" "b/2-programming_language/python3/python\346\225\260\346\215\256\345\210\206\346\236\220-\345\240\206\345\217\240\346\225\260\347\273\204\345\207\275\346\225\260\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/2-programming_language/shell/Shell\350\257\255\346\263\225\345\237\272\347\241\200.md" "b/2-programming_language/shell/Shell\350\257\255\346\263\225\345\237\272\347\241\200.md" old mode 100644 new mode 100755 diff --git a/3-data_structure-algorithm/README.md b/3-data_structure-algorithm/README.md deleted file mode 100644 index 0bd11682..00000000 --- a/3-data_structure-algorithm/README.md +++ /dev/null @@ -1,63 +0,0 @@ -## 前言 - -本知识点内容都是[《数据结构与算法之美》](https://time.geekbang.org/column/intro/126) 的学习笔记,与专栏的一些区别在于: - -+ 笔记都是浓缩的知识,语言更为简洁; -+ 代码都是基于 `C++` 编写,与专栏的 `JAVA` 代码有所区别; -+ 每个知识点附带对应 `leetcode` 练习题,部分可直接运行代码; -+ 部分知识点有个人总结和思考. - -总之,这份学习笔记,是属于我个人学习专栏之后做的知识记录,比较初学者适合一开始不想学习大块头的数据结构和算法知识,想要快速语言学习相关知识,或者想要利用 `C++` 实现文章代码时,可作参考作用。 - -## 目录 - -### 1,常见数据结构 - -- [数组](array/数组.md) -- [链表](linked_list/链表.md) -- [字符串](string/字符串解题模板.md) -- [栈](stack_queue_heap/栈-先进后出.md) -- [队列](stack_queue_heap/队列-先进先出.md) -- [跳表](skip_list/跳表.md) -- 散列表 - - [散列表上](hash_table/散列表(上)-理论.md) - - [散列表中](hash_table/散列表(中)-实战.md) - - [散列表下](hash_table/散列表(下)-散列表和链表的组合.md) - - [哈希算法](hash_table/哈希算法.md) -- 二叉树 - - [二叉树遍历](tree/二叉树(上)-二叉树遍历.md) - - [二叉查找树](tree/二叉树(下)-二叉查找树.md) - - [红黑树](tree/红黑树(上)-基础.md) - -- 图 - - [图的表示](map/图的表示.md) - - [广度和深度优先搜索](map/广度和深度优先搜索.md) - -> 数组和链表都是最基础的物理结构,栈和队列是抽象的逻辑结构;二叉树、散列表、图等结构底层都是基于数组、链表的为适应特定场景开发的。 - -### 2,算法 - -- [递归](recursion/递归-需要满足三个条件.md) -- [二分查找](binary_search/二分查找.md) -- [排序](sort/排序.md) -- [贪心算法](greedy/贪心算法.md) -- [分治算法](divide_and_conquer/分治算法.md) -- [回溯算法](backtracking/回溯算法.md) -- 动态规划算法 - - [初始动态规划](dp/初识动态规划.md) - - [动态规划理论](dp/动态规划理论.md) - - [动态规划实战](dp/动态规划实战.md) - -### 3,剑指offer题解 - -- [剑指offer题解-C++代码解题](./剑指offer题解c++版.md) - -### 4,算法图解学习笔记 - -- [算法图解学习笔记](./算法图解笔记.md) - -## 三,参考资料 - -+ 《数据结构与算法之美》 -+ 《剑指 offer》 -+ 《leetcode 题解》 diff --git a/3-data_structure-algorithm/array/29-PrintMatrix.cpp b/3-data_structure-algorithm/array/29-PrintMatrix.cpp deleted file mode 100644 index f33b1fa9..00000000 --- a/3-data_structure-algorithm/array/29-PrintMatrix.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// 剑指offer 题29:顺时针打印矩阵 -// 按顺时针的方向,从外到里打印矩阵的值。 -// 下图的矩阵打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 -// 解题思路:从左到右,从上到下,检查一次是否遍历完,从右到左,从下到上 - -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - vector printMatrix(vector > matrix) { - // left to right, top to bottom - if(matrix.empty()) return {}; - vector res; - int l = 0, r = matrix[0].size()-1, t = 0, b = matrix.size()-1; - int nums = (r+1) * (b+1); - while(res.size() != nums){ - for(int i=l; i<=r; i++) // 从左往右遍历:行索引不变,列索引增加 - res.push_back(matrix[t][i]); - t++; - for(int j=t; j<=b; j++) // 从上到下遍历:列索引不变,行索引增加 - res.push_back(matrix[j][r]); - r--; - // 检查一次是否遍历完 - if(res.size() == nums) break; - for(int m=r; m>=l; m--) // 从右往左遍历:行索引不变,列索引减少 - res.push_back(matrix[b][m]); - b--; - for(int n=b; n>=t; n--) // 从下往上遍历:列索引不变,行索引减少 - res.push_back(matrix[n][l]); - l++; - } - return res; - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/array/3-DuplicationInArray.cpp b/3-data_structure-algorithm/array/3-DuplicationInArray.cpp deleted file mode 100644 index ef05b9f6..00000000 --- a/3-data_structure-algorithm/array/3-DuplicationInArray.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// 剑指offer面试题3(一):找出数组中重复的数字 -// 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了, -// 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, -// 那么对应的输出是重复的数字2或者3。 - -/* -// 方法一:直接排序,然后遍历,思路很简单但是执行起来比较麻烦 -// 方法二:哈希表,就是找另一个数组,把nums的元素一个一个放进去,放进去之前判断里面有没有,如果里面已经有了那就遇到重复元素,结束。 -// 贼麻烦!时间复杂度O(N2),空间O(N) -// 方法三:原地置换。思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。 -在交换过程中,如果有重复的数字发生,那么终止返回ture -*/ -#include -#include -#include -using namespace std; - -class Solution { -public: - /** - * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 - * @param numbers int整型vector - * @return int整型 - */ - // 哈希表法 - int duplicate(vector& numbers) { - // write code here - multiset set1; - for(auto i: numbers){ - set1.insert(i); - if (set1.count(i) > 1) - return i; - } - return -1; - } - // 原地置换法 - int findRepeatNumber(vector& numbers) { - int n = numbers.size(); - for(int i=0; i -#include -#include - -using namespace std; - -vector> init_matrix(int mm, int nn){ - /*初始化指定行和列的二维矩阵 - */ - int random_integer; - - vector> matrix(mm, vector(nn,0)); // 根据初始化二维数组大小为 mm*nn,所有元素为0 - cout << "The size of init matrix is " << "(" << matrix.size() << ", " << matrix[0].size() << ")" << std::endl; - for (int i=0; i < matrix.size();i++) - { - for(int j=0;j < matrix[i].size();j++) - { - random_integer = rand() % 128; - matrix[i][j] = random_integer; // 利用下标给二维数组赋值 - // matrix[i].push_back(random_integer); // 利用push_back给vactor添加元素 - } - } - return matrix; -} - -void print_matrix(vector> matrix){ - /*打印二维向量(矩阵)的元素 - */ - cout << "The size of matrix is" << "(" << matrix.size() << ", " << matrix[0].size() << ")" << std::endl; - //迭代器遍历 - for(auto iter=matrix.cbegin();iter != matrix.cend(); ++iter) - { - for(int i = 0;i<(*iter).size();i++){ - cout << (*iter)[i] << " "; - } - cout << std::endl; - } - cout << "print success" << endl; -} - -bool Find(int target, vector> matrix){ - if(matrix.size() == 0) - return false; - int rows = matrix.size(); - int cols = (*matrix.begin()).size(); - int r = 0, c = cols -1; // 从右上角开始 - while(r<=rows-1 && c >>0){ - if(target == matrix[r][c]) - return true; - else if(target > matrix[r][c]) - r++; - else - c--; - } - return false; -} -int main(){ - vector> A; - A = init_matrix(10,5); - print_matrix(A); - bool flag = Find(54, A); - cout << flag; -} - diff --git a/3-data_structure-algorithm/array/5-ReplaceSpace.cpp b/3-data_structure-algorithm/array/5-ReplaceSpace.cpp deleted file mode 100644 index 505de4d3..00000000 --- a/3-data_structure-algorithm/array/5-ReplaceSpace.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// 剑指 offer 面试题5:替换空格, 将一个字符串中的空格替换成 "%20"。 -// 题解:双指针法: p2 指针指向扩容之后的string 最后一位,p1指向原指针最后一位,遍历指针, -// 如果 p1 遇到空格,就将 p2 向前移动三次并赋值为'%20',没有,则将p1字符赋值给p2字符。 - -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - string replaceSpace(string s) { - int count = 0, len = s.size(); - for(char& c:s){ - if(c == ' ') count++; - } - s.resize(len + 2*count); - cout << count; - for(int i = len-1, j=s.size()-1; i -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - char firstUniqChar(string s) { - unordered_map dic; - for(char c:s){ - dic[c] = dic.find(c) == dic.end(); - } - for(char c:s){ - if(dic[c] == true) - return c; - } - return ' '; - } - - char FirstNotRepeatingChar(string s) { - unordered_map dic; - for(char c:s){ - dic[c] = dic.find(c) == dic.end(); - } - for(int i=0; i -# include -# include -# include - -using namespace std; - -class Solution { -public: // 逐位相加法,使用加法模板 - vector addToArrayForm(vector& num, int k) { - int sum = 0; - int carry = 0; - int n = num.size()-1; - vector res; - while(n >=0 || k != 0){ - int remainder = k % 10; // k 的当前位 - if(n>=0) sum = num[n] + remainder + carry; - else sum = remainder + carry; - carry = sum / 10; // 进位计算 - sum %= 10; // 当前位计算 - res.push_back(sum); - k /= 10; - n -= 1; - } - if(carry != 0) res.push_back(carry); // 判断是否还有进位 - - reverse(res.begin(), res.end()); // 反转数组 - return res; - } -}; diff --git "a/3-data_structure-algorithm/array/\346\225\260\347\273\204.md" "b/3-data_structure-algorithm/array/\346\225\260\347\273\204.md" deleted file mode 100644 index 3443031d..00000000 --- "a/3-data_structure-algorithm/array/\346\225\260\347\273\204.md" +++ /dev/null @@ -1,29 +0,0 @@ -### 一,如何实现随机访问? - -数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。数组的两个特点是: - -+ **线性表** -+ 连续的内存空间和相同类型的数据(**随机访问**) - -计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址: - -```cpp -a[i]_address = base_address + i * data_type_size -// 如果数组从 1 开始计数 -a[k]_address = base_address + (k-1)*type_size -``` - -> 数组从 `1` 开始编号,是因为根据寻址公式,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。 - -注意:数组支持随机访问,根据下标随机访问的时间复杂度为 $O(1)$,但找的时间复杂度并不为 $O(1)$。,毕竟即便是排好序的数组,用二分查找,时间复杂度也是 $O(logn)$。 - -> 这点很多博客没有注明。 - -### 二,低效的“插入”和“删除” - -假设数组的长度为 n,现在,如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来,给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一位。平均情况时间复杂度为 $(1+2+...n)/n=O(n)$。 - -### 三,容器能否完全替代数组? - -`C++`、`JAVA` 等语言都提供了类似数组的容器类,比如 `C++` `STL` 中的 `vector`。根据我的经验,一般情况下,推荐用容器开发,简单省事、代码易懂,底层和高性能开发用数组,毕竟容器的灵活性还是牺牲了一定性能的。 - diff --git a/3-data_structure-algorithm/backtracking/exe/solveNQueens.exe b/3-data_structure-algorithm/backtracking/exe/solveNQueens.exe deleted file mode 100644 index 13fabf50..00000000 Binary files a/3-data_structure-algorithm/backtracking/exe/solveNQueens.exe and /dev/null differ diff --git a/3-data_structure-algorithm/backtracking/solveNQueens.cpp b/3-data_structure-algorithm/backtracking/solveNQueens.cpp deleted file mode 100644 index 1117d5e6..00000000 --- a/3-data_structure-algorithm/backtracking/solveNQueens.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include -#include -#include - -using namespace std; - -vector> ret; -void printQueens2(vector result); -void printQueens(vector> result); - -// leetcode N皇后-回溯解法 -class Solution { -private: - vector> result; - void backtracking(int n, int row, vector& chessboard){ - if(row == n) { - result.push_back(chessboard); - return; - } - for(int column=0; column < n; column++){ - if (isOK(row, column, n, chessboard)){ - chessboard[row][column] = 'Q'; // 放置皇后 - backtracking(n, row+1, chessboard); - chessboard[row][column] = '.'; // 回溯,撤销处理结果 - } - } - } - // 判断 row 行 column 列放置皇后是否合适 - bool isOK(int row, int column, int n, vector& chessboard){ - - int leftup = column - 1; int rightup = column + 1; // 左上角和右上角 - - for(int i = row-1; i>=0; i--){ // 逐行网上考察每一行 - // 判断第 i 行的 column 列是否有棋子 - if(chessboard[i][column] == 'Q') { - return false; - } - // 考察左上对角线:判断第i行leftup列是否有棋子 - if(leftup >=0 ){ - if(chessboard[i][leftup] == 'Q') return false; - } - // 考察左上对角线:判断第i行rightup列是否有棋子 - if(rightup < n){ - if(chessboard[i][rightup] == 'Q') return false; - } - --leftup; - ++rightup; - } - return true; - } - -public: - vector> solveNQueens(int n) { - result.clear(); - std::vector chessboard(n, std::string(n, '.')); - - backtracking(n, 0, chessboard); - return result; - } -}; - -void printQueens(vector> result){ - for(int i = 0; i < result.size(); ++i){ - for(int j = 0; j < result[0].size();++j){ - cout << result[i][j] << "\n"; - } - cout << "The " << i+1 << " solution of chessboard" << "\n"; - } -} - -void printQueens2(vector result){ - for(int i = 0; i < result.size(); ++i){ - cout << result[i] << "\n" << "\n"; - } -} - -int main(){ - - Solution solve_nqueens; - auto ret = solve_nqueens.solveNQueens(4); - printQueens(ret); -} diff --git "a/3-data_structure-algorithm/backtracking/\345\233\236\346\272\257\347\256\227\346\263\225.md" "b/3-data_structure-algorithm/backtracking/\345\233\236\346\272\257\347\256\227\346\263\225.md" deleted file mode 100644 index 7f01faa8..00000000 --- "a/3-data_structure-algorithm/backtracking/\345\233\236\346\272\257\347\256\227\346\263\225.md" +++ /dev/null @@ -1,293 +0,0 @@ -### 一,如何理解回溯算法 - -深度优先搜索算法利用的就是回溯算法思想,但它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。 - -除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、`0-1` 背包、图的着色、旅行商问题、全排列等等。 - -**回溯的处理思想,有点类似枚举搜索**。暴力枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。 - -**回溯算法的模板**代码总结如下: - -```cpp -void backtracking(参数) { - if (终止条件) { - 存放结果; - return; - } - for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { - 处理节点; - backtracking(路径,选择列表); // 递归 - 回溯,撤销处理结果 - } -} -``` - -### 二,回溯算法的经典应用 - -#### [2.1,八皇后问题](https://leetcode-cn.com/problems/n-queens/) - -有一个 `8x8` 的棋盘,希望往里放 `8` 个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。 - -**解决思路**:可以把这个问题划分成 `8` 个阶段,依次将 `8` 个棋子放到第一行、第二行、第三行……第八行,每一行都有 8 中放法(8 列)。在放置的过程中,我们不停地检查当前放法,是否满足要求。如果满足,则跳到下一行继续放置棋子;如果不满足,那就再换一种放法,继续尝试。这里用的是回溯思想,而回溯算法也非常适合用递归代码实现。 - -```cpp -// N 皇后问题 leetcode 51 https://leetcode-cn.com/problems/n-queens/ -class Solution { -private: - vector> result; - void backtracking(int n, int row, vector& chessboard){ - if(row == n) { - result.push_back(chessboard); - return; - } - for(int column=0; column < n; column++){ // 每一行都有8中放法 - if (isOK(row, column, n, chessboard)){ - chessboard[row][column] = 'Q'; // 放置皇后 - backtracking(n, row+1, chessboard); - chessboard[row][column] = '.'; // 回溯,撤销处理结果 - } - } - } - // 判断 row 行 column 列放置皇后是否合适 - bool isOK(int row, int column, int n, vector& chessboard){ - - int leftup = column - 1; int rightup = column + 1; // 左上角和右上角 - - for(int i = row-1; i>=0; i--){ // 逐行网上考察每一行 - // 判断第 i 行的 column 列是否有棋子 - if(chessboard[i][column] == 'Q') { - return false; - } - // 考察左上对角线:判断第i行leftup列是否有棋子 - if(leftup >=0 ){ - if(chessboard[i][leftup] == 'Q') return false; - } - // 考察左上对角线:判断第i行rightup列是否有棋子 - if(rightup < n){ - if(chessboard[i][rightup] == 'Q') return false; - } - --leftup; - ++rightup; - } - return true; - } - -public: - vector> solveNQueens(int n) { - result.clear(); - std::vector chessboard(n, std::string(n, '.')); - - backtracking(n, 0, chessboard); - return result; - } -}; -``` - -#### 2.2,0-1 背包问题 - -`0-1` 背包是非常经典的算法问题。`0-1` 背包问题有很多变体,这里介绍一种比较基础的。我们有一个背包,背包总的承载重量是 `W` `kg`。现在我们有 `n` 个物品,**每个物品的重量不等,并且不可分割**,即对于每个物品来说,都有两种选择,装进背包或者不装进背包,对于 n 个物品来说,总的装法就有 2^n 种。 - -我们现在期望选择几件物品,装载到背包中。在不超过背包所能装载重量 W 的前提下,如何让背包中物品的总重量最大? - -**`0-1` 背包问题为什么不能用贪心算法求解?** - -因为不可分割,所以无法判断当前情况下,哪种物品对期望值贡献更大,即不存在当前最优的选择,所以就无法使用贪心算法了。 - -`0-1` 背包问题的高效解法是**动态规划**算法,但也可用没那么高效的**回溯**方法求解。我们可以把物品依次排列,整个问题就分解为了 `n` 个阶段,每个阶段对应一个物品怎么选择。先对第一个物品进行处理,选择装进去或者不装进去,然后再递归地处理剩下的物品。 - -```cpp -int maxW = 0; - -// cw 表示当前装进背包的物品的重量和,w 表示背包承载的重量 -// items 表示物体的重量数组,n 表示总的物品个数, i 表示考察到第 i 个物品 -int f(int i, int cw, vector items, int n, int w){ - // 递归结束条件:cw == w 表示背包已经装满,i==n 表示考察完所有物品 - if(cw == w || i == n){ - if(cw > maxW) maxW = cw; - return; - } - f(i+1, cw, items, n, w); // 不装 - // 剪枝过程,当装入的物品重量大于背包的重量,就不继续执行 - if(cw+items[i] <= w){ - f(i+1, cw+items[i], items, n, w); // 装 - } -} -``` - -要理解 `0-1` 背包问题回溯解法的关键在于:**对于一个物品而言,只有两种情况,不装入背包和装入背包两种情况**。对应的就是 `f(i+1, cw, items, n, w)` 和 `f(i+1, cw + items[i], items, n, w)` 两个函数。 - -#### 2.3,通配符匹配 - -假设正则表达式中只包含 `“*”` 和 `“?”` 这两种通配符,并且对这两个通配符的语义稍微做些改变,其中,`“*”` 匹配任意多个(大于等于 `0` 个)任意字符,`“?”` 匹配零个或者一个任意字符。基于以上背景假设,如何用回溯算法,判断一个给定的文本,是否和给定的正则表达式匹配? - -如果遇到特殊字符的时候,我们就有多种处理方式了,也就是所谓的岔路口,比如 `“*”` 有多种匹配方案,可以匹配任意个文本串中的字符,我们就先随意的选择一种匹配方案,然后继续考察剩下的字符。如果中途发现无法继续匹配下去了,我们就回到这个岔路口,重新选择一种匹配方案,然后再继续匹配剩下的字符。 - -```cpp -// 暴力递归 --> 记忆化 --> DP --> 状态压缩DP; - -class Solution{ -private: - bool matched = false; - - void backtracking(int ti, int pj, string text, string pattern){ - if (matched) return; - - if(pj == pattern.size()){ // 正则表达式到末尾了 - if(ti == text.size()) - matched = true; - return; - } - // *匹配任意个字符 - if(pattern[pj] == '*'){ - for(int k=0; k< text.size()-ti;k++) - backtracking(ti+k, pj+1, text, pattern); - } - // ?匹配0个或者1个字符 - else if(pattern[pj] == '?'){ - backtracking(ti, pj+1, text, pattern); - backtracking(ti+1, pj+1, text, pattern); - } - // 纯字符匹配才行 - else if(ti < pattern.size() && pattern[pj] == text[ti]) { - backtracking(ti+1, pj+1, text, pattern); - } - } -public: - bool isMatch(string text, string pattern){ - matched = false; - backtracking(0, 0, text, pattern); - return matched; - } -}; -``` - -#### 2.4,leetcode 正则表达式匹配 - -在 `leetcode` 也有变形题([leetcode10:正则表达式匹配](https://leetcode-cn.com/problems/regular-expression-matching/))如下: - -> 其他变形题:[leetcode44-通配符匹配](https://leetcode-cn.com/problems/wildcard-matching/) - -给你一个字符串 `s` 和一个字符规律 `p`,请你来实现一个支持 `'.'` 和 `'*'` 的正则表达式匹配。 - -+ '.' 匹配任意单个字符 -+ '*' 匹配零个或多个前面的那一个元素 - -所谓匹配,是要涵盖整个字符串 `s` 的,而不是部分字符串。 - -**方法一:回溯**(分阶段分情况讨论,暴力搜索和剪枝) - -**首先**,考虑特俗字符只有 `'.'` 的情况。这种情况会很简单:我们只需要从左到右依次判断 s[i] 和 `p[i]` 是否匹配。 - -```python -def isMatch(self,s:str, p:str) -> bool: - """字符串 s 和字符规律 p""" - if not p: return not s # 边界条件 - - first_match = s and p[0] in {s[0],'.'} # 比较第一个字符是否匹配 - - return first_match and self.isMatch(s[1:], p[1:]) -``` - -**最后**,考虑有 `’*'` 的情况,它会出现在 `p[1]` 的位置,匹配过程中会出现两种情况: - -+ 星号代表匹配 `0` 个前面的元素。如 `'##'` 和 `a*##`,这时我们直接忽略 `p` 的 `a*`,比较 `##` 和 `##`,也就是**继续递归比较 `s` 和 `p[i + 2:]`**; -+ 星号代表匹配一个或多个前面的元素。如 `aaab` 和 `a*b`,这时我们将忽略 `s` 的第一个元素,比较 `aab` 和 `a*b`,也就是**继续递归比较 `s[i + 1:]` 和 `p`**。(这里默认要检查 `s[0]` 和 `p[0]` 是否相等)。 - -`Python3` 代码如下: - -```python -class Solution: - def isMatch(self, s: str, p: str) -> bool: - if not p: return not s - first_match = bool(s and p[0] in {s[0],'.'}) # 比较第一个字符是否匹配 - - if len(p) >=2 and p[1] == '*': - # * 匹配前面一个字符 0 次或者多次 - return self.isMatch(s, p[2:]) or first_match and self.isMatch(s[1:], p) - else: - return first_match and self.isMatch(s[1:], p[1:]) -``` - -`C++` 代码如下: - -```cpp -// letcode10 正则表达式匹配 -#include -#include -using namespace std; - -class Solution{ -public: - bool isMatch(string s, string p){ - // 如果正则串 p 为空字符串,s 也为空,则匹配成功 - if(p.empty()) return (s.empty()); - // 判断 s 和 p 的首字符是否匹配,注意要先判断 s 不为空 - bool match = (!s.empty()) && (s[0] == p[0] || p[0] == '.'); - // 如果p的第一个元素的下一个元素是 *,则分别对两种情况进行判断 - if(p.size() >= 2 && p[1] == '*'){ - // * 匹配前面一个字符 0 次或者多次 - return isMatch(s, p.substr(2)) || (match && isMatch(s.substr(1), p)); - } - else{ // 单个匹配 - return match && isMatch(s.substr(1), p.substr(1)); - } - - } -}; -``` - -直接递归时间复杂度太大(指数级),可以把之前的递归过程记录下来,用空间换时间。**记忆化递归**的 `C++` 代码如下: - -```cpp -class Solution{ -public: - bool isMatch(string s, string p){ - unordered_map memo; - return backtracking(s, 0, p, 0, memo); - } - - bool backtracking(string s, int i, string p, int j, unordered_map & memo){ - // # 检查 s[i] 是否能被匹配,注意要先判断 s 不为空 - bool match = (i < s.size()) && (s[i] == p[j] || p[j] == '.'); - - if(j >= p.size()) return i >= s.size(); // p 和 s 同时遍历完 - - int key = i * (p.size() + 1) + j; // 哈希键 - if (memo.find(key) != memo.end()) // 这个状态之前经历过,可以返回结果 - return memo[key]; - - else if (i == s.size() && j == p.size()) // 如果s和p同时用完,匹配成功 - return memo[key] = true; - - else if((p.size()-j) >= 2 && p[j+1] == '*'){ - // * 匹配前面一个字符 0 次或者多次 - if(backtracking(s, i, p, j+2, memo) || match && backtracking(s, i+1, p, j, memo)) - return memo[key] = true; - } - else { // 单个匹配 - if(match && backtracking(s, i+1, p, j+1, memo)) - return memo[key] = true; - } - return memo[key] = false; // 没辙了,匹配失败 - } -}; -``` - -**方法二:动态规划法** - -- [ ] 算法思路 -- [ ] 代码 - -### 三,总结 - -回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。 - -尽管回溯算法的原理非常简单,但是却可以解决很多问题,比如我们开头提到的深度优先搜索、八皇后、`0-1` 背包问题、图的着色、旅行商问题、数独、全排列、正则表达式匹配等等。 - -> 回溯算法能解决的问题,基本用动态规划也能解决,其时间复杂度更低,空间复杂度更高,用空间换时间。 - -### 参考资料 - -+ [leetcode 8皇后问题题解](https://leetcode-cn.com/problems/eight-queens-lcci/solution/ba-huang-hou-hui-su-suan-fa-jing-dian-ti-mu-xiang-/) -+ [回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想](https://time.geekbang.org/column/article/74287) -+ [腐烂的橘子题解-回溯和动态规划](https://leetcode-cn.com/problems/regular-expression-matching/solution/hui-su-he-dong-tai-gui-hua-by-ml-zimingmeng/) \ No newline at end of file diff --git a/3-data_structure-algorithm/binary_search/11-MinNumberInRotateArray.cpp b/3-data_structure-algorithm/binary_search/11-MinNumberInRotateArray.cpp deleted file mode 100644 index 88735990..00000000 --- a/3-data_structure-algorithm/binary_search/11-MinNumberInRotateArray.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// 剑指 offer 11: 旋转数组中的最小数字 https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/ -// 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 -// 例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 - diff --git a/3-data_structure-algorithm/binary_search/49-NthUglyNumber.cpp b/3-data_structure-algorithm/binary_search/49-NthUglyNumber.cpp deleted file mode 100644 index 6248d03f..00000000 --- a/3-data_structure-algorithm/binary_search/49-NthUglyNumber.cpp +++ /dev/null @@ -1,3 +0,0 @@ -// 剑指 offer 49: 丑数 https://leetcode-cn.com/problems/chou-shu-lcof/ -// 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 -// 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 \ No newline at end of file diff --git a/3-data_structure-algorithm/binary_search/53-GetNumberOfK.cpp b/3-data_structure-algorithm/binary_search/53-GetNumberOfK.cpp deleted file mode 100644 index ecd8386c..00000000 --- a/3-data_structure-algorithm/binary_search/53-GetNumberOfK.cpp +++ /dev/null @@ -1 +0,0 @@ -// 剑指 offer 53:数字在排序数组中出现的次数 diff --git a/3-data_structure-algorithm/binary_search/MySqrt.cpp b/3-data_structure-algorithm/binary_search/MySqrt.cpp deleted file mode 100644 index cd06a71b..00000000 --- a/3-data_structure-algorithm/binary_search/MySqrt.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// leetcode69. x 的平方根 - -// 实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。 -// 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 -// 解题方法一:二分查找 - -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - int mySqrt(int x) { - int low = 0, high = x, ret = -1; - while (low <= high) { - int mid = low + (high - low) / 2; - if ((long long)mid * mid <= x) { - ret = mid; - low = mid + 1; - } - else { - high = mid - 1; - } - } - return ret; - } - - double mySqrt2(int x, int k) { - double low = 0, high = x; - double precision = pow(0.1, k); - - while (low <= high) { - double mid = low + (high - low) / 2.0; - if (abs(mid * mid - x) <= precision) { - return mid; - } - else if (mid * mid > x) high = mid; - else if(mid*mid < x) low = mid; - } - - return -1; - } -}; - - -int main() { - Solution s1; - cout << s1.mySqrt(11) << endl; // 3 - cout << s1.mySqrt2(11, 6) << endl; // 3.31662 - return 0; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/binary_search/binary_search.cpp b/3-data_structure-algorithm/binary_search/binary_search.cpp deleted file mode 100644 index e69de29b..00000000 diff --git "a/3-data_structure-algorithm/binary_search/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/3-data_structure-algorithm/binary_search/\344\272\214\345\210\206\346\237\245\346\211\276.md" deleted file mode 100644 index 69cd49a6..00000000 --- "a/3-data_structure-algorithm/binary_search/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ /dev/null @@ -1,192 +0,0 @@ -### 一,简单的二分查找算法 - -二分查找(`Binary Search`)算法是一种针对**有序且不含重复数据集合**的查找算法,时间复杂度为 $O(logn)$ ,二分查找虽然性能比较优秀,但应用场景也比较有限。 - -因为底层依赖于数组这种结构,所以不适合数据量大的情况。再次,对于较小规模的数据查找,二分查找的优势并不明显,一般直接使用顺序遍历就可以了。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。 - -如果数据使用链表存储,二分查找的时间复杂就会变得很高,变成了 $O(n)$。 - -简单的二分查找算法的 `C++` 代码如下: - -```cpp -// 非递归实现 -int BinarySearch(int a[], int n, int value){ - int low = 0, high = n-1; - int mid = (low+high)/2; - while( low <= high){ - // mid = low+(high-low)/2; mid = low+((high-low)>>1) - mid = (low+high)/2; - - if( a[mid] == value ){ - return mid; - } - else if (value < a[mid]){ - high = mid - 1; - } - else { - low = mid + 1; - } - } - return -1; -} -``` - -注意:二分查找算法的核心是在于**利用二分思想,每次都与区间的中间数据比对大小,缩小查找区间的范围**。二分查找算法除了用上面的循环实现,实际上还可以用**递归**实现。简单二分查找算法的递归代码如下: - -```cpp - -int BinarySearch(int a[], int low, int high, int value){ - if (low > high) return -1; - int mid = low + ((high - low) >> 1); - if a[mid] = value return mid; - else if (a[mid] > value) return BinarySearch(a, low, mid-1, value); - else return BinarySearch(a, mid + 1, high, value); -} -``` - -### 二,二分查找算法的变形 - -`4` 种常见的二分查找变形问题: - -1. 查找第一个值等于给定值的元素; -2. 查找最后一个值等于给定值的元素; -3. 查找第一个值大于等于给定值的元素; -4. 查找最后一个值小于等于给定值的元素; - -其实以上四个问题都针对的是**有序数据集合中存在重复的数据**的情况 -> 因为是有序数组,所以这个重复的隐含线索是连续重复数据。 - -#### 2.1,变体一:查找第一个值等于给定值的元素 - -根据前文实现的简单二分查找代码,我们知道 `a[mid]` 跟要查找的 `value` 的大小关系有三种情况:大于、小于、等于。对于 `a[mid]>value` 的情况,我们需要更新 `high= mid-1`;对于 `a[mid]> 1); - if(a[mid] > value){ - high = mid - 1; - } - else if(a[mid] < value){ - low = mid + 1 ; - } - else{ - if(mid == 0 || a[mid - 1] != value) return mid; - else high = mid -1; - } - } - return -1; -} -``` - -#### 2.2,变体二:查找最后一个值等于给定值的元素 - -这个问题和上个问题类似,只需在上面代码基础上,稍作修改即可。 - -```cpp -int BinarySearch(int a[], int n, int value){ - int low = 0, high = n-1; - while(low <= high){ - int mid = low + ((high - low) >> 1); - if(a[mid] > value){ - high = mid - 1; - } - else if(a[mid] < value){ - low = mid + 1 ; - } - else{ - if(mid == n-1 || a[mid + 1] != value) return mid; - else low = mid + 1; // 更新 low=mid+1,因为要找的元素肯定出现在[mid+1, high]之间 - } - } - return -1; -} -``` - -#### 2.3,变体三:查找第一个大于等于给定值的元素 - -实际上,实现的思路跟前面的那两种变形问题的实现思路是类似的,但是代码写起来甚至更简洁,因为考虑的情况要少一种了,a[mid] > value 和 a[mid] = value 可以放在一个 `if` 分支里面,分支里面的处理语句和前面代码类似。 - -```cpp -int BinarySearch(int a[], int n, int value){ - int low = 0, high = n-1; - while(low <= high){ - int mid = low + ((high - low) >> 1); - if(a[mid] >= value){ - if(mid == 0 || a[mid - 1] < value) return mid; - else high = mid -1; - } - else { - low = mid + 1 ; - } - } - return -1; -``` - -如果 a[mid] 小于要查找的值 value,那要查找的值肯定在[mid+1, high]之间,所以,我们更新 low=mid+1。 - -对于 a[mid]大于等于给定值 value 的情况,我们要先看下这个 a[mid]是不是我们要找的第一个值大于等于给定值的元素。如果 a[mid]前面已经没有元素,或者前面一个元素小于要查找的值 value,那 a[mid]就是我们要找的元素。这段逻辑对应的代码是第 `7` 行。 - -如果 a[mid-1]也大于等于要查找的值 value,那说明要查找的元素在[low, mid-1]之间,所以,我们将 high 更新为 mid-1。 - -#### 2.4,变体四:查找最后一个小于等于给定值的元素 - -有了前面的基础,这个问题的代码就可以直接写出来了,复制上文代码,修改第 7、8 行即可。 - -```cpp -int BinarySearch(int a[], int n, int value){ - int low = 0, high = n-1; - while(low <= high){ - int mid = low + ((high - low) >> 1); - if(a[mid] > value){ - high = mid - 1; - } - else { - if(mid == high || a[mid + 1] > value) return mid; - else low = mid + 1; - } - } - return -1; -``` - -### 三,总结 - -二分查找的核心思想理解起来非常简单,有点类似分治思想。即每次都通过跟区间中的中间元素对比,将待查找的区间缩小为一半,直到找到要查找的元素,或者区间被缩小为 `0`。其代码有三个容易出错的地方:循环退出条件、`mid` 的取值,`low` 和 `high` 的更新。 - -凡是用二分查找能解决的,绝大部分我们更倾向于用散列表或者二叉查找树。即便是二分查找在内存使用上更节省,但是毕竟内存如此紧缺的情况并不多。二分查找**更适合用在“近似”查找问题**,在这类问题上,二分查找的优势更加明显。 - -### 四,二分查找算法解题模板 - -二分查找模板1 - -将区间 [l, r] 划分成 [l, mid] 和 [mid+1, r] 时,其更新操作是 r = mid 或 l = mid + 1;,计算 mid 时不需要加1. - -```cpp -int bsearch_1(int l, int r){ - while (l < r){ - int mid = (l + r) >> 1; // (l + r)/2 向下取整 - if(check(mid)) r = mid; - else l = mid + 1; - } - return l; -} -``` - -二分查找模板2 - -将区间 [l, r] 划分成 [l, mid-1] 和 [mid, r] 时,其更新操作是 r = mid - 1 或 l = mid;,为了防止死循环,计算 mid 时需要加1. - -```cpp -int bsearch_1(int l, int r){ - while (l < r){ - int mid = (l + r + 1) >> 1; // (l + r)/2 向上取整 - if(check(mid)) l = mid; - else r = mid - 1; - } - return l; -} -``` diff --git "a/3-data_structure-algorithm/divide_and_conquer/\345\210\206\346\262\273\347\256\227\346\263\225.md" "b/3-data_structure-algorithm/divide_and_conquer/\345\210\206\346\262\273\347\256\227\346\263\225.md" deleted file mode 100644 index 206e3e80..00000000 --- "a/3-data_structure-algorithm/divide_and_conquer/\345\210\206\346\262\273\347\256\227\346\263\225.md" +++ /dev/null @@ -1,80 +0,0 @@ -### 一,如何理解分治算法 - -分治算法(`divide and conquer`)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 `n` 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 - -分治和递归的区别:**分治算法是一种处理问题的思想,递归是一种编程技巧**。 - -分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作: - -+ 分解:将原问题分解成一系列子问题; -+ 解决:递归地求解各个子问题,若子问题足够小,则直接求解; -+ 合并:将子问题的结果合并成原问题。 - -分治算法能解决的问题,一般需要满足下面这几个条件: - -+ 原问题与分解成的小问题具有相同的模式; -+ 原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别; -+ 具有分解终止条件,也就是说,当问题足够小时,可以直接求解; -+ 可以将子问题合并成原问题,而这个合并操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果了。 - -### 二,分治算法案例 - -假设我们有 `n` 个数据,我们期望数据从小到大排列,那完全有序的数据的有序度就是 `n(n-1)/2`,逆序度等于 `0`;相反,倒序排列的数据的有序度就是 `0`,逆序度是 `n(n-1)/2`。 - -除了这两种极端情况外,**如何编程求出一组数据的有序对个数或者逆序对个数呢**? - -使用归并排序算法可以解决这个问题。归并排序中有一个非常关键的操作,就是将两个有序的小数组,合并成一个有序的数组。在每次合并操作中,我们都计算逆序对个数,把这些计算出来的逆序对个数求和,就是整个数组的逆序对个数了。`C++` 代码如下: - -```cpp - -int num = 0; // 全局变量或者成员变量 - -void mergeSortCounting(int A[], int p, int r){ - if(p>=r) return; - int q = (p+r)/2; - mergeSortCounting(A, p, q); - mergeSortCounting(A, q+1, r); - merge(A, p, q, r); -} - -void merge(int[] A, int p, int q, int r) { - // 两个游标 i 和 j,分别指向 A[p...q]和 A[q+1...r]的第一个元素。 - int i = p, j = q+1, k = 0; - int[] tmp = new int[r-p+1]; - while (i<=q && j<=r) { - if (A[i] <= A[j]) { - tmp[k++] = A[i++]; - } - else { - // 若当前的A[i] > A[j],则A[i++]必然大于A[j] - num += (q-i+1); // 统计p-q之间,比 A[j] 大的元素个数 - tmp[k++] = A[j++]; - } - } - - // 将剩余的数据拷贝到临时数组 tmp - while (i <= q) { - tmp[k++] = A[i++]; - } - while (j <= r) { - tmp[k++] = A[j++]; - } - - for (i = 0; i <= r-p; ++i) { // 从 tmp 拷贝回 A - A[p+i] = tmp[i]; - } -} - -``` - -其他两道比较经典的问题: - -+ 二维平面上有 `n` 个点,如何快速计算出两个距离最近的点对? -+ 有两个 $n*n$ 的矩阵 `A`,`B`,如何快速求解两个矩阵的乘积 `C=A*B`? - - -分治算法用四个字概括就是“分而治之”,将原问题划分成 `n` 个规模较小而结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治算法的思想还是非常简单、好理解。 - -### 参考资料 - -[分治算法:谈一谈大规模计算框架MapReduce中的分治思想](https://time.geekbang.org/column/article/73503) \ No newline at end of file diff --git a/3-data_structure-algorithm/dp/0_1-knapsack.cpp b/3-data_structure-algorithm/dp/0_1-knapsack.cpp deleted file mode 100644 index 1ee124b5..00000000 --- a/3-data_structure-algorithm/dp/0_1-knapsack.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// 0-1 背包问题的动态规划解法 -#include -#include -#include - -using namespace std; - -int maxW = 0; -int weight[6] = {2,2,4,6,3}; // 物品重量 -int n = 5; // 物品个数 -int w = 9; // 背包承受的最大重量 -bool mem[5][10]; // 备忘录,默认值false - -// 记忆化递归算法实现 -class SolutionBacktracking{ -public: - void f(int i, int cw){ // i 表示放第 i 个物品,cw 表示当前装进背包的物品的重量和 - if (cw == w || i == n) { // cw==w表示装满了,i==n表示物品都考察完了 - if(cw > maxW) maxW = cw; - return; - } - if(mem[i][cw]) return; // 重复状态 - mem[i][cw] = true; // 记录状态 - - f(i+1, cw); // 不放第 i 个物品 - if(cw+weight[i] <= w) - f(i+1, cw+weight[i]); // 放第 i 个物品 - } -}; - - -class SolutionDP1{ -public: - // weight:物品重量,n:物品个数,w:背包可承载重量 - int knapsack1(int weight[], int n, int w){ - vector >states(n, vector(w+1, false)); - states[0][0] = true; // 第一个物品不放进背包 - if(weight[0] <= w) states[0][weight[0]] = true; // 第一个物品放进背包 - // 动态规划-分阶段 - for(int i=1; i0; i--){ - if(states[n-1][i]) return i; - } - return 0; - } -}; - -class SolutionDP2{ -public: - // weight:物品重量,n:物品个数,w:背包可承载重量 - int knapsack2(int weight[], int n, int w){ - // bool states[w+1]; - vector states(w+1, false); - - states[0] = true; // 第一个物品不放进背包 - if(weight[0] < w) states[weight[0]] = true; // 第一个物品放进背包 - - // 动态规划-分阶段 - for(int i=1; i=0; j--) { // 第 i 个物品放进背包 - if(states[j]) states[j+weight[i]] = true; - } - } - - // 在最后一层变量找到最接近 w 的重量并输出结果 - for(int i=w;i>0;i--){ - if(states[i]) return i; - } - return 0; - } -}; - -int main(){ - SolutionBacktracking knspsack; // 创建背包类对象 - knspsack.f(0, 0); - // The max weight of items is 9 - cout << "The max weight of items is "<< maxW << endl; - - SolutionDP2 knspsack2; - int maxW2 = knspsack2.knapsack2(weight, n, w); - cout << "The max weight of items is "<< maxW2 << endl; - - SolutionDP1 knspsack1; - int maxW1 = knspsack1.knapsack1(weight, n, w); - cout << "The max weight of items is "<< maxW1 << endl; - return 0; -} - diff --git a/3-data_structure-algorithm/dp/10-2-numWays.cpp b/3-data_structure-algorithm/dp/10-2-numWays.cpp deleted file mode 100644 index 87cef00b..00000000 --- a/3-data_structure-algorithm/dp/10-2-numWays.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// 剑指 Offer 10- II. 青蛙跳台阶问题 - - - -# include -# include -# include -# include -# include - -using namespace std; - -class Solution { -private: - static const int mod = 1e9 + 7; -public: - // 动态规划法 - int numWays(int n) { - int dp[n+1]; - if( n == 0 || n == 1) return 1; - dp[0] = 1; - dp[1] = 1; - for(int i=2; i<=n; i++){ - dp[i] = (dp[i-1] + dp[i-2]) % mod; - } - return dp[n]; - } - // 递归法 - int numWays2(int n) { - if(n == 1) return 1; - if(n == 2) return 2; - return numWays2(n-1) + numWays2(n-2); - } -}; - -int main() { - - Solution s1; - int num = s1.numWays(7); - cout << num << endl; // 21 - return 0; -} diff --git a/3-data_structure-algorithm/dp/42-MaxSubArray.cpp b/3-data_structure-algorithm/dp/42-MaxSubArray.cpp deleted file mode 100644 index 3f204928..00000000 --- a/3-data_structure-algorithm/dp/42-MaxSubArray.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// 剑指 offer 42: 连续子数组的最大和。https://leetcode-cn.com/problems/maximum-subarray/ -// 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 - -/* 求解动态规划问题的 4 个步骤: -1,确定状态 -2,找到转移公式 -3,确定初始条件以及边界条件 -4,计算结果。 -*/ - -#include -#include -#include - -using namespace std; - -class Solution { -public: - //1, 动态规划算法 - int maxSubArray2(vector& nums) { - int* dp = new int[nums.size()]; - dp[0] = nums[0]; - int maxSum = dp[0]; - for(int i=1; i < nums.size(); i++){ - dp[i] = max(dp[i-1], 0) + nums[i]; - maxSum = max(dp[i], maxSum); - } - return maxSum; - } - //1, 动态规划,优化空间 - int maxSubArray(vector& nums) { - int sum = nums[0]; - int maxSum = nums[0]; - for(int i=1; i < nums.size(); i++){ - sum = max(sum, 0) + nums[i]; - maxSum = max(sum, maxSum); - } - return maxSum; - } -}; - -int main() { - vector nums = {-2,1,-3,4,-1,2,1,-5,4}; - Solution s1; - int maxSum = s1.maxSubArray(nums); - cout << maxSum << endl; - return 0; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/dp/47-maxValue.cpp b/3-data_structure-algorithm/dp/47-maxValue.cpp deleted file mode 100644 index bc41422d..00000000 --- a/3-data_structure-algorithm/dp/47-maxValue.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// 剑指 Offer 47. 礼物的最大价值 - -class Solution { // 状态转移方程法 -private: - int minDist(int i, int j, vector >& matrix, vector >& mem) { // 调用minDist(n-1, n-1); - if (i == 0 && j == 0) return matrix[0][0]; - if (mem[i][j] > 0) return mem[i][j]; - - int minUp = -10000; - if (i - 1 >= 0) minUp = minDist(i - 1, j, matrix, mem); - int minLeft = -10000; - if (j - 1 >= 0) minLeft = minDist(i, j - 1, matrix, mem); - int currMinDist = matrix[i][j] + std::max(minUp, minLeft); - - mem[i][j] = currMinDist; - - return currMinDist; - } -public: - int maxValue(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > mem(m, vector(n, -1)); - - return minDist(m - 1, n - 1, grid, mem); - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/dp/48-lengthOfLongestSubstring.cpp b/3-data_structure-algorithm/dp/48-lengthOfLongestSubstring.cpp deleted file mode 100644 index 016bd663..00000000 --- a/3-data_structure-algorithm/dp/48-lengthOfLongestSubstring.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// 剑指 Offer 48. 最长不含重复字符的子字符串 https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ - -#include - -using namespace std; - -class Solution { -public: - // 动态规划+线性遍历 - int lengthOfLongestSubstring(string s) { - int res=0, tmp = 0, i=0; - for(int j=0; j < s.size(); j++){ - i = j-1; - while(i>=0 && s[i] != s[j]) i-= 1; - if(tmp < j-i) tmp += 1; - else tmp = j - i; - res = max(res, tmp); - } - return res; - } -}; - diff --git a/3-data_structure-algorithm/dp/66-ConstructMultiplyArr.cpp b/3-data_structure-algorithm/dp/66-ConstructMultiplyArr.cpp deleted file mode 100644 index 2c1ab1df..00000000 --- a/3-data_structure-algorithm/dp/66-ConstructMultiplyArr.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// 剑指 offer 66: 构建乘积数组 https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/ -// 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, -// 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 - diff --git a/3-data_structure-algorithm/dp/exe/0_1-knapsack.exe b/3-data_structure-algorithm/dp/exe/0_1-knapsack.exe deleted file mode 100644 index 05063e22..00000000 Binary files a/3-data_structure-algorithm/dp/exe/0_1-knapsack.exe and /dev/null differ diff --git a/3-data_structure-algorithm/dp/exe/minPathSum.exe b/3-data_structure-algorithm/dp/exe/minPathSum.exe deleted file mode 100644 index ede047c0..00000000 Binary files a/3-data_structure-algorithm/dp/exe/minPathSum.exe and /dev/null differ diff --git a/3-data_structure-algorithm/dp/minPathSum.cpp b/3-data_structure-algorithm/dp/minPathSum.cpp deleted file mode 100644 index 80ea126d..00000000 --- a/3-data_structure-algorithm/dp/minPathSum.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// leetcode 64 -// 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 -// 说明:每次只能向下或者向右移动一步。 - -#include -#include -#include -#include - -using namespace std; - -// 回溯法:会超出时间限制 -class Solution { -private: - int minDist = 10000; - void minDistBT(vector>& grid, int i, int j, int dist, int m, int n) { - if (i == 0 && j == 0) dist = grid[0][0]; - if (i == m-1 && j == n-1) { - if (dist < minDist) minDist = dist; - return; - } - if (i < m-1) { - minDistBT(grid, i + 1, j, dist + grid[i+1][j], m, n); // 向右走 - } - if (j < n-1) { - minDistBT(grid, i, j + 1, dist + grid[i][j+1], m, n); // 向下走 - } - } - -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - int dist = 0; - minDistBT(grid, 0, 0, dist, m, n); - return minDist; - } -}; - -// 动态规划:状态转移表法 -class Solution2 { -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > states(m, vector(n, 0)); - // 第一个阶段初始化 - int sum = 0; - for (int i = 0; i < n; i++) { // 初始化 states 的第一行数据 - sum += grid[0][i]; - states[0][i] = sum; - } - sum = 0; - for (int j = 0; j < m; j++) { // 初始化 states 的第一列数据 - sum += grid[j][0]; - states[j][0] = sum; - } - - // 分阶段求解,下层状态的值是基于上一层状态来的 - for (int i = 1; i < m; i++) { - for (int j = 1; j < n; j++) { - states[i][j] = std::min(states[i - 1][j] + grid[i][j], states[i][j - 1] + grid[i][j]); - } - } - return states[m - 1][n - 1]; - } -}; - -// 记忆化递归 -class Solution3 { -private: - int minDist(int i, int j, vector >& matrix, vector >& mem) { // 调用minDist(n-1, n-1); - if (i == 0 && j == 0) return matrix[0][0]; - if (mem[i][j] > 0) return mem[i][j]; - - int minUp = 10000; - if (i - 1 >= 0) minUp = minDist(i - 1, j, matrix, mem); - int minLeft = 10000; - if (j - 1 >= 0) minLeft = minDist(i, j - 1, matrix, mem); - int currMinDist = matrix[i][j] + std::min(minUp, minLeft); - - mem[i][j] = currMinDist; - - return currMinDist; - } -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > mem(m, vector(n, -1)); - - return minDist(m - 1, n - 1, grid, mem); - } -}; - -void print_matrix(vector> matrix) { - /*打印二维向量(矩阵)的元素 - */ - cout << "The size of matrix is" << "(" << matrix.size() << ", " << matrix[0].size() << ")" << std::endl; - //迭代器遍历 - // vector>::iterator iter; - for (auto iter = matrix.cbegin(); iter != matrix.cend(); ++iter) - { - for (int i = 0; i < (*iter).size(); i++) { - cout << (*iter)[i] << " "; - } - cout << std::endl; - } - // cout << "print success" << endl; -} - -int main() { - vector> grid = { {1,2,3},{4,5,6}}; - print_matrix(grid); - Solution3 minDist; - int minDistance = minDist.minPathSum(grid); - cout << "Min distance is " << minDistance << endl; -} diff --git "a/3-data_structure-algorithm/dp/\345\210\235\350\257\206\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/3-data_structure-algorithm/dp/\345\210\235\350\257\206\345\212\250\346\200\201\350\247\204\345\210\222.md" deleted file mode 100644 index c4a6b1ec..00000000 --- "a/3-data_structure-algorithm/dp/\345\210\235\350\257\206\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ /dev/null @@ -1,223 +0,0 @@ -### 一,动态规划概念 - -动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。 - -它和递归一样都非常难学,主要学习难点在于求解问题的过程不太符合人类常规的思维方式。 - -#### 二,0-1 背包问题 - -对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? - -关于这个 `0-1` 背包问题,上一节学习了回溯的解决方法,也就是穷举搜索所有可能的装法(时间复杂度指数级),然后找出满足条件的最大值。有没有什么规律,可以有效降低时间复杂度呢? - -**1,回溯法的求解过程:** - -直接看代码,规律是不好的,画个求解过程图(递归树)会好看些。假设背包的最大承载重量是 `9`,有 `5` 个不同的物品,每个物品的重量分别是 `2,2,4,6,3`。求解过程的递归树如下图所示。 - -![求解过程的递归树](../../data/images/recursion_tree.png) - -递归树中的每个节点表示一种状态,我们用`(i, cw)`来表示。其中,`i` 表示将要决策第几个物品是否装入背包,`cw` 表示当前背包中物品的总重量。比如,`(2,2)` 表示我们将要决策第 `2` 个物品是否装入背包,在决策前,背包中物品的总重量是 `2`。这里使用回溯算法,从递归树中可以发现其中有些子问题的求解是重复的,且时间复杂度是指数级的。 - -**使用”备忘录”(记忆化递归)的解决方式**,记录已经计算好的 `f(i, cw)`,当再次计算到重复的 `f(i, cw)` 的时候,可以直接从备忘录中取出来用,就不用再递归计算了,这样就可以避免冗余计算。 - -```cpp -int maxW = 0; -int weight[6] = {2,2,4,6,3}; // 物品重量 -int n = 5; // 物品个数 -int w = 9; // 背包承受的最大重量 -bool mem[5][10]; // 备忘录,默认值false - -// 记忆化递归算法实现 -class SolutionBacktracking{ -public: - void f(int i, int cw){ // i 表示放第 i 个物品,cw 表示当前装进背包的物品的重量和 - if (cw == w || i == n) { // cw==w表示装满了,i==n表示物品都考察完了 - if(cw > maxW) maxW = cw; - return; - } - if(mem[i][cw]) return; // 重复状态 - mem[i][cw] = true; // 记录状态 - - f(i+1, cw); // 不放第 i 个物品 - if(cw+weight[i] <= w) - f(i+1, cw+weight[i]); // 放第 i 个物品 - } -}; -``` - -这里依然是基于回溯算法实现的,但是采用了**记忆化递归**的方法,时间复杂度和空间复杂度都是 $O(n*(w+1))$,$n$ 为物品个数,$w$ 表示背包承受的最大重量。 - -**2,动态规划求解过程如下**: - -把整个求解过程分为 `n` 个阶段,每个阶段会决策一个物品是否放到背包中。每个物品决策(放入或者不放入背包)完之后,背包中的物品的重量会有多种情况,也就是说,会达到多种不同的状态,对应到递归树中,就是有很多不同的节点。 - -我们**把每一层重复的状态(节点)合并,只记录不同的状态,然后基于上一层的状态集合,来推导下一层的状态集合**。我们可以通过合并每一层重复的状态,这样就保证每一层不同状态的个数都不会超过 `w` 个(w 表示背包的承载重量),也就是例子中的 `9`。于是,我们就成功避免了每层状态个数的指数级增长。动态规划方法的计算过程如下图: - -![动态规划计算过程1](../../data/images/dp1.png) - -![动态规划计算过程2](../../data/images/dp2.png) - -我们用一个二维数组 `states[n][w+1]`,来记录每层可以达到的不同状态。`0-1` 背包问题的动态规划解法的 `C++` 代码如下: - -```cpp -class SolutionDP1{ -public: - // weight:物品重量,n:物品个数,w:背包可承载重量 - int knapsack1(int weight[], int n, int w){ - vector >states(n, vector(w+1, false)); - // 初始化 states 第一个阶段的状态 - states[0][0] = true; // 第一个物品不放进背包 - if(weight[0] <= w) states[0][weight[0]] = true; // 第一个物品放进背包 - // 动态规划-分阶段 - for(int i=1; i0; i--){ - if(states[n-1][i]) return i; - } - return 0; - } -}; -``` - -这就是一种用动态规划解决问题的思路。我们把问题分解为多个阶段,每个阶段对应一个决策。我们记录每一个阶段可达的状态集合(去掉重复的),然后通过当前阶段的状态集合,来推导下一个阶段的状态集合,动态地往前推进。这也是动态规划这个名字的由来,你可以自己体会一下 - -> 首先,可以分解为多阶段,其次,状态去重,最后当前阶段可以利用上一个阶段来获取。这是动态规划的关键。 - -我们知道回溯算法解决这个问题的时间复杂度是 $O(2^n)$、指数级,那动态规划解决方案的时间复杂度是多少呢?来分析一下,这个代码的时间复杂度非常好分析,耗时最多的部分就是代码中的两层 `for` 循环,所以时间复杂度是 $O(n*w)$。$n$ 表示物品个数,$w$ 表示背包可以承载的总重量。 - -虽然动态规划的时间效率较高,但是空间复杂度为 $O(n*w)$,对空间消耗比较大。我们可以考虑用一个大小为 $w+1$ 的一维数组代替二维数组,减少内存消耗。代码如下: - -```cpp -class SolutionDP2{ -public: - // weight:物品重量,n:物品个数,w:背包可承载重量 - int knapsack2(int weight[], int n, int w){ - vector states(w+1, false); - // int *states=new int [m+1]; // 动态分配,数组长度为 m - states[0] = true; // 第一个物品不放进背包 - if(weight[0] < w) states[weight[0]] = true; // 第一个物品放进背包 - - // 动态规划-分阶段 - for(int i=1; i=0; j--) { // 第 i 个物品放进背包 - if(states[j]) states[j+weight[i]] = true; - } - } - - // 在最后一层变量找到最接近 w 的重量并输出结果 - for(int i=w;i>0;i--){ - if(states[i]) return i; - } - return 0; - } -}; -``` - -程序分析:遍历每个物品,将该物品放入背包时,在不超过最大重量的前提下,再遍历查看之前的放入记录,将之前可能出现的重量的和当前物品的重量相加再记录下来,等所有方案都尝试过后,可能出现的背包重量也都被记录下来了,最后,从中选择一个最大值返回。 - -### 三,0-1 背包问题升级版 - -前面讲的背包问题,只涉及背包重量和物品重量。现在引入物品价值这一变量。对于一组不同重量、不同价值、不可分割的物品,我们选择将某些物品装入背包,在满足背包最大重量限制的前提下,背包中可装入物品的总价值最大是多少呢? - -1,这个问题依旧可以先用回溯算法来解决,代码如下: - -```cpp -// 0-1 背包问题升级版的回溯解法 -int maxV = 0; // 结果放到maxV中 -int weight[] = {2,2,4,6,3}; // 物品的重量 -int value[] = {3,4,8,9,6}; // 物品的价值 -int n = 5; // 物品个数 -int w = 9; // 背包承受的最大重量 - -class Solution{ -public: - void f(int i, int cw, int cv) { // 调用f(0, 0, 0) - if (cw == w || i == n) { // cw==w表示装满了,i==n表示物品都考察完了 - if(cv > maxV) maxV = cv; - return; - } - if(cv > maxV) maxV = cv; - f(i+1, cw, cv); // 不放第 i 个物品 - if(cw+weight[i] <= w) f(i+1, cw+weight[i], cv+value[i]) // 放第 i 个物品 - } -}; -``` - -2,使用动态规划解决这个问题更高效。把整个求解过程分为 $n$ 个阶段,每个阶段会决策一个物品是否放到背包中。每个阶段决策完之后,背包中的物品的总重量以及总价值,会有多种情况,也就是会达到多种不同的状态。我们用一个二维数组 `states[n][w+1]`,来记录每层可以达到的不同状态。 - -```cpp -class SolutionDP3{ - int knapsack3(int weight[], int value[], int n, int w) { - vector > states(n, vector(w+1, -1)); - states[0][0] = 0; // 不放入第 0 个物品 - if(weight[0] < w) states[0][weight[0]] = value[0]; // 放入第 0 个物品 - - for(int i=1; i states[i][j+weight[i]]) - states[i][j+weight[i]] = v; - } - } - - int maxV = -1; - for(int j = w; j>=0; j--){ - if(states[n-1][j] > maxV) maxV = states[n-1][j]; - } - - return maxV; - } -} -``` - -代码的时间复杂度是 $O(n\cdot w)$,空间复杂度也是 $O(n\cdot w)$。 - -### 四,总结 - -大部分动态规划能解决的问题,都可以通过回溯算法来解决,只不过回溯算法解决起来效率比较低,时间复杂度是指数级的。动态规划算法,在执行效率方面,要高很多。尽管执行效率提高了,但是动态规划的空间复杂度也提高了,所以,很多时候,我们会说,动态规划是一种空间换时间的算法思想。 - -### 五,练习题 - -#### 5.1,leetcode322 零钱兑换 - -给你一个整数数组 `coins` ,表示不同面额的硬币;以及一个整数 `amount` ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 `-1` 。 - -你可以认为每种硬币的数量是无限的。 - -动态规划解法的 `C++` 代码如下: - -```cpp -class Solution { -public: - int coinChange(vector& coins, int amount) { - int Max = amount + 1; - vector dp(amount + 1, Max); - dp[0] = 0; - for (int i = 1; i <= amount; ++i) { - for (int j = 0; j < (int)coins.size(); ++j) { - if (coins[j] <= i) { - dp[i] = min(dp[i], dp[i - coins[j]] + 1); - } - } - } - return dp[amount] > amount ? -1 : dp[amount]; - } -}; -``` - -### 参考资料 - -[初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?](https://time.geekbang.org/column/article/74788) - diff --git "a/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\345\256\236\346\210\230.md" "b/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\345\256\236\346\210\230.md" deleted file mode 100644 index 153f9d3f..00000000 --- "a/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\345\256\236\346\210\230.md" +++ /dev/null @@ -1,5 +0,0 @@ -> 动态规划实战:如何实现搜索引擎中的拼写纠错功能? - -### 一,如何量化两个字符串的相似度? - -前面学习 `Trie` 树,我们知道利用 `Trie` 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。 \ No newline at end of file diff --git "a/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272.md" "b/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272.md" deleted file mode 100644 index 16a422db..00000000 --- "a/3-data_structure-algorithm/dp/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272.md" +++ /dev/null @@ -1,194 +0,0 @@ -- [一,“一个模型三个特征”理论讲解](#一一个模型三个特征理论讲解) - - [1. 最优子结构](#1-最优子结构) - - [2. 无后效性](#2-无后效性) - - [3. 重复子问题](#3-重复子问题) - - [4. “一个模型三个特征”实例剖析](#4-一个模型三个特征实例剖析) -- [二,两种动态规划解题思路总结](#二两种动态规划解题思路总结) - - [1. 状态转移表法](#1-状态转移表法) - - [2. 状态转移方程法](#2-状态转移方程法) -- [三,四种算法比较分析](#三四种算法比较分析) -- [四,内容总结](#四内容总结) - - [练习题](#练习题) -- [参考资料](#参考资料) - - -> 学习目标:彻底搞懂最优子结构、无后效性和重复子问题。什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算法思想又有什么区别和联系? - -## 一,“一个模型三个特征”理论讲解 - -一个模型指的是适合用动态规划算法解决的问题的模型,这个模型也被定义为“多阶段决策最优解模型”。具体解释如下: - -一般是用动态规划来解决**最优**问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应着一组状态。然后我们寻找一组**决策序列**,经过这组决策序列,能够产生最终期望求解的最优值。 - -### 1. 最优子结构 - -最优子结构指的是,问题的最优解包含子问题的最优解。反过来说就是,我们可以通过子问题的最优解,推导出问题的最优解。把最优子结构,对应到前面定义的动态规划问题模型上,就是**后面阶段的状态可以通过前面阶段的状态推导出来**。 - -### 2. 无后效性 - -无后效性有两层含义,第一层含义是,在推导后面阶段的状态的时候,我们只关心前面阶段的状态值,不关心这个状态是怎么一步一步推导出来的。第二层含义是,某阶段状态一旦确定,就不受之后阶段的决策影响。无后效性是一个非常“宽松”的要求。只要满足前面提到的动态规划问题模型,其实基本上都会满足无后效性。 - -### 3. 重复子问题 - -不同的决策序列,到达某个相同的阶段时,可能会产生重复的状态。 - -### 4. “一个模型三个特征”实例剖析 - -结合一个具体的动态规划问题更能详细理解上述理论,**示例问题描述如下**: - -假设我们有一个 `n` 乘以 `n` 的矩阵 `w[n][n]`。矩阵存储的都是正整数。棋子起始位置在左上角,终止位置在右下角。我们将棋子从左上角移动到右下角。每次只能向右或者向下移动一位。从左上角到右下角,会有很多不同的路径可以走。我们把每条路径经过的数字加起来看作路径的长度。那从左上角移动到右下角的最短路径长度是多少呢? - -![“一个模型三个特征”实例剖](../../data/images/pieces.png) - -`min_dist(i, j)` 可以通过 `min_dist(i, j-1)` 和 `min_dist(i-1, j)` 两个状态推导出来,所以这个问题符合“最优子结构”。 - -```cpp -min_dist(i, j) = min(min_dist(i-1,j), min_dist(i, j-1)) -``` - -## 二,两种动态规划解题思路总结 - -知道了如何鉴别一个问题是否可以用动态规划来解决,接下来就是总结动态规划解决问题的一般思路。解决动态规划问题,一般有两种思路。分别叫作:状态转移表法和状态转移方程法。 - -### 1. 状态转移表法 - -**一般能用动态规划解决的问题,都可以使用回溯算法的暴力搜索解决**。所以,当我们拿到问题的时候,我们可以先用简单的回溯算法解决,然后定义状态,每个状态表示一个节点,然后对应画出递归树。从递归树中,我们很容易可以看出来,是否存在重复子问题,以及重复子问题是如何产生的。以此来寻找规律,看是否能用动态规划解决。 - -找到重复子问题之后,接下来,我们有两种处理思路,第一种是直接用回溯加“备忘录”的方法,来避免重复子问题。从执行效率上来讲,这跟动态规划的解决思路没有差别。第二种是使用动态规划的解决方法,**状态转移表法**。 - -我们先画出一个状态表。状态表一般都是二维的,所以你可以把它想象成二维数组。其中,每个状态包含三个变量,行、列、数组值。我们根据决策的先后过程,从前往后,根据递推关系,分阶段填充状态表中的每个状态。最后,我们将这个递推填表的过程,翻译成代码,就是动态规划代码了。 -> 适合状态是二维的情况,再多维的话就不适合了,毕竟人脑不适合处理高维度的问题。 - -起点到终点,有很多种不同的走法,回溯算法比较适合无重复又不遗漏地穷举出所有走法,从而对比找出一个最短走法。 - -1,**回溯**解法的 `C++` 代码如下: - -```cpp -// leetcode64. 最小路径和. 回溯法-会超出时间限制 -class Solution { -private: - int minDist = 10000; - void minDistBT(vector>& grid, int i, int j, int dist, int m, int n) { - if (i == 0 && j == 0) dist = grid[0][0]; - if (i == m-1 && j == n-1) { - if (dist < minDist) minDist = dist; - return; - } - if (i < m-1) { - minDistBT(grid, i + 1, j, dist + grid[i+1][j], m, n); // 向右走 - } - if (j < n-1) { - minDistBT(grid, i, j + 1, dist + grid[i][j+1], m, n); // 向下走 - } - } -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - int dist = 0; - minDistBT(grid, 0, 0, dist, m, n); - return minDist; - } -}; -``` - -有了回溯代码之后,接下来,自然要画出递归树,以此来寻找重复子问题。在递归树中,一个状态(也就是一个节点)包含三个变量 `(i, j, dist)`,其中 `i`,`j` 分别表示行和列,`dist` 表示从起点到达 `(i, j)` 的路径长度。从图中,可以看出,尽管 `(i, j, dist)` 不存在重复,但是 `(i, j)` 重复的有很多。对于 `(i, j)` 重复的节点,我们只需要选择 `dist` 最小的节点,继续递归求解,其他节点就可以舍弃了。 - -![最小问题的递归树](../../data/images/recursion_tree2.jpg) - -2,**动态规划**解法的 `C++` 代码如下: - -```cpp -// 对应 leetcode64. 最小路径和 -class Solution { // 动态规划:状态转移表法 -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > states(m, vector(n, 0)); - // 第一个阶段初始化 - int sum = 0; - for(int i=0; i >& matrix, vector >& mem) { // 调用minDist(n-1, n-1); - if (i == 0 && j == 0) return matrix[0][0]; - if (mem[i][j] > 0) return mem[i][j]; - - int minUp = 10000; - if (i - 1 >= 0) minUp = minDist(i - 1, j, matrix, mem); - int minLeft = 10000; - if (j - 1 >= 0) minLeft = minDist(i, j - 1, matrix, mem); - int currMinDist = matrix[i][j] + std::min(minUp, minLeft); - - mem[i][j] = currMinDist; - - return currMinDist; - } -public: - int minPathSum(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > mem(m, vector(n, -1)); - - return minDist(m - 1, n - 1, grid, mem); - } -}; -``` - -![leetcode64 动态规划解法代码提交记录](../../data/images/leetcode64_commit2.png) - -## 三,四种算法比较分析 - -如果将这四种算法思想分一下类,那贪心、回溯、动态规划可以归为一类,而分治单独可以作为一类,因为它跟其他三个都不大一样。为什么这么说呢?因为前三个算法解决问题的模型,都可以抽象成**多阶段决策最优解**模型,而分治算法解决的问题尽管大部分也是最优解问题,但是,大部分都不能抽象成多阶段决策模型。 - -尽管动态规划比回溯算法高效,但是,并不是所有问题,都可以用动态规划来解决。能用动态规划解决的问题,需要满足三个特征,最优子结构、无后效性和重复子问题。在重复子问题这一点上,动态规划和分治算法的区分非常明显。分治算法要求分割成的子问题,不能有重复子问题,而动态规划正好相反,动态规划之所以高效,就是因为回溯算法实现中存在大量的重复子问题。 - -贪心算法实际上是动态规划算法的一种特殊情况。它解决问题起来更加高效,代码实现也更加简洁。不过,它可以解决的问题也更加有限。它能解决的问题需要满足三个条件,最优子结构、无后效性和贪心选择性(这里我们不怎么强调重复子问题)。其中,最优子结构、无后效性跟动态规划中的无异。“贪心选择性”的意思是,通过局部最优的选择,能产生全局的最优选择。每一个阶段,我们都选择当前看起来最优的决策,所有阶段的决策完成之后,最终由这些局部最优解构成全局最优解。 - -## 四,内容总结 - -什么样的问题适合用动态规划解决?这些问题可以总结概括为“一个模型三个特征”。其中,“一个模型”指的是,问题可以抽象成分阶段决策最优解模型。“三个特征”指的是最优子结构、无后效性和重复子问题。 - -哪两种动态规划的解题思路?它们分别是状态转移表法和状态转移方程法。其中,状态转移表法解题思路大致可以概括为,**回溯算法实现 - 定义状态 - 画递归树 - 找重复子问题 - 画状态转移表 - 根据递推关系填表 - 将填表过程翻译成代码**。状态转移方程法的大致思路可以概括为,**找最优子结构 - 写状态转移方程 - 将状态转移方程翻译成代码**。 - -### 练习题 - -假设我们有几种不同币值的硬币 v1,v2,……,vn(单位是元)。如果我们要支付 w 元,求最少需要多少个硬币。比如,我们有 3 种不同的硬币,1 元、3 元、5 元,我们要支付 9 元,最少需要 3 个硬币(3 个 3 元的硬币)。 - -## 参考资料 - -[动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题](https://time.geekbang.org/column/article/75702) diff --git a/3-data_structure-algorithm/greedy/leetcode63-maxProfit.cpp b/3-data_structure-algorithm/greedy/leetcode63-maxProfit.cpp deleted file mode 100644 index 5f49805e..00000000 --- a/3-data_structure-algorithm/greedy/leetcode63-maxProfit.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// 剑指offer 63. 股票的最大利润 - -// 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? - -/* -解题思路: - -1,贪心法: -假设每天的股价都是最低价,每天都计算股票卖出去后的利润。一次 for 循环,时间复杂度:O(n) -2,暴力法: -两次 for 循环,时间复杂度 O(n^2) -*/ - -# include -# include -# include -# include -# include - -using namespace std; - -class Solution { -public: - int maxProfit(vector& prices) { - // 贪心算法:一次遍历 - int inf = 1e9; // 表示“无穷大” - int minprice = inf, maxprofit = 0; - for(int price: prices){ - maxprofit = max(maxprofit, (price-minprice)); // 假设每天都是最低价 - minprice = min(minprice, price); - } - return maxprofit; - } -}; - -int main(){ - vector prices = {7,1,5,3,6,4}; - Solution s1; - int max_profit = s1.maxProfit(prices); - cout << max_profit << endl; - return 0; -} \ No newline at end of file diff --git "a/3-data_structure-algorithm/greedy/\350\264\252\345\277\203\347\256\227\346\263\225.md" "b/3-data_structure-algorithm/greedy/\350\264\252\345\277\203\347\256\227\346\263\225.md" deleted file mode 100644 index 76a9abe7..00000000 --- "a/3-data_structure-algorithm/greedy/\350\264\252\345\277\203\347\256\227\346\263\225.md" +++ /dev/null @@ -1,43 +0,0 @@ -### 前言 - -到目前为止学了数组、链表两类物理数据结构,和栈、队列两类线性逻辑结构,以及树(二叉树、二叉查找树、红黑树)、图非线性数据结构,以及基于这些数据结构的二分查找、`DFS/BFS`、递归、排序等算法。 - -接下来会学习贪心、分治、回溯、动态规划这 `4` 个算法思想,这类算法思想都有原理容易理解,但是很难掌握和灵活应用的特点。 - -### 一,如何理解贪心算法 - -贪心算法(英语:`greedy algorithm`),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 - -贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。 - -贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。 - -**贪心算法解决问题的步骤**: - -第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。 - -第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。 - -第三步,我们举几个例子看下贪心算法产生的结果是否是最优的。 - -### 二,贪心算法实例 - -1,分糖果 - -有 m 个糖果和 n 个孩子。我们现在要把糖果分给这些孩子吃,但是糖果少,孩子多(m `hash(key)` 中的 `key` 可以是字符串、数字、对象等,但其底层都是二进制串。 - -对应的哈希算法的特点如下: - -1. 不可逆,即通过密文无法反推生成明文。 -2. 原始字符串不一样,得到的哈希结果不一样。 -3. 冲突的概率要很小。 -4. 执行效率要高,理论上来说执行时间越长的冲突概率越小。 - -## 二,哈希算法的应用场景 - -**1,安全加密**。 - -最常用于加密的哈希算法是 `MD5`(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 `SHA`(Secure Hash Algorithm,安全散列算法)。 - -对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 - -对于第二点要求,实际上,不管是什么哈希算法,我们只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的。为什么这么说呢?依据是基于组合数学中一个非常基础的理论:**鸽巢原理**(也叫抽屉原理)。鸽巢原理: 槽是固定的,数据是无限的(不定的),冲突是有概率存在的。 - -**2,唯一标识**。 - -用在图片上的情况比较多,如果同一张图片上传多次,会通过哈希算法对图片的二进制内容进行计算,以计算结果为标识一张图片是否已经上传过。如果一张图片过大,可以采用部分二进制,比如开头 `100K`,中间 `100K` ,最后 `100K` 相加进行哈希算法来保证一定的执行效率。 - -**3,文件完整性校验**。 - -比如迅雷等 `p2p` 下载器,从不同主机下载文件分片最终在本地合成一个文件。种子文件里面一般存储了各个文件分片的哈希结果,下载完成后通过本地计算各个分片的哈希再跟种子里面存储的核实来确保文件分片没有被恶意更改过。 - -**4,散列函数**。 - -在散列表中需要的哈希算法,一般对执行效率要求高,对是否冲突要求比较低,因为散列表通常都会有冲突的解决方式,比如开放寻址法跟链表法。 - -**5,负载均衡**。 - -何谓一个会话粘滞(session sticky)的负载均衡算法?**即在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上**。 - -通过哈希算法,对客户端 `IP` 地址或者会话 `ID` 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。 这样,我们就可以把同一个 `IP` 过来的所有请求,都路由到同一个后端服务器上。 - -**6,数据分片**。 - -哈希算法用于数据分片的一个例子是统计“搜索关键字”出现的次数。 - -假如有一个 `1T` 的日志文件,这里面记录了用户的搜索关键词,如果想要快速统计出每个关键词被搜索的次数,解决方案是什么? - -**分析问题**:1,`1T` 的日志文件很大,内存中基本不可能放下这么多数据;2,数据很多,`1` 台机器处理速度会很慢。 - -**解题思路**:参考 `Map-Reduce` 原理。先对数据进行切片,然后使用多台机器并行处理。 - -**解题方案**:使用 `n` 台机器进行数据处理,首先从日志文件中顺序依次读取每个关键字,并用哈希函数计算得到哈希值,并跟 `n` 取模,取模得到的值就是对应的机器编号,这样**哈希值相同的关键字就被分配到同一台机器上进行处理**。 - -最后每台机器分配统计关键字出现的次数,然后合并在一起就是最终的结果。 - -从上可以看出,针对这种海量数据的处理问题,我们可以采用多机分布式处理。借助这种分片的思路,可以突破单机内存、CPU 等资源的限制。 - -**7,分布式存储**。 - -负载均衡、数据分片、分布式存储,这三个应用都跟分布式系统有关,也就是说哈希算法是可以解决这些分布式系统问题。 - -现在互联网面对的都是海量的数据、海量的用户。我们为了提高数据的读取、写入能力,一般都采用分布式的方式来存储数据,比如分布式缓存。我们有海量的数据需要缓存,所以一个缓存机器肯定是不够的。于是,我们就需要将数据分布在多台机器上。 - -**该如何决定将哪个数据放到哪个机器上呢**?我们可以借用前面数据分片的思想,即通过哈希算法对数据取哈希值,然后对机器个数取模,这个最终值就是应该存储的缓存机器编号。 - -但是这会产生一个问题,就是当数据增多的情况下,机器要扩容,增加机器数量,原来的 `n` 假设是 `10`,现在变成了 `20`,这样按照之前的方法所有的数据都要**重新计算哈希值,然后重新搬移到正确的机器上**。这样就相当于,缓存中的数据一下子就都失效了。所有的数据请求都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压垮数据库。 - -所以,我们需要一种方法,使得在新加入一个机器后,并不需要做大量的数据搬移。 - -这就是**一致性哈希算法**。假设我们有 $k$ 个机器,数据的哈希值的范围是$[0, MAX]$,我们将整个范围划分成 $m$ 个小区间($m$ 远大于 $k$),那么每个机器就负责 $m/k$ 个小区间。当有新机器加入的时候,我们就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用全部重新哈希、搬移数据,也保持了各个机器上数据数量的均衡。 - -## 总结 - -在负载均衡应用中,利用哈希算法替代映射表,可以实现一个会话粘滞的负载均衡策略。在数据分片应用中,通过哈希算法对处理的海量数据进行分片,多机分布式处理,可以突破单机资源的限制。在分布式存储应用中,利用一致性哈希算法,可以解决缓存等分布式系统的扩容、缩容导致数据大量搬移的难题。 - -## 参考资料 - -[《数据结构与算法之美-王争》-哈希算法(下):哈希算法在分布式系统中有哪些应用?](https://time.geekbang.org/column/article/67388) \ No newline at end of file diff --git "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\212)-\347\220\206\350\256\272.md" "b/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\212)-\347\220\206\350\256\272.md" deleted file mode 100644 index 34dbd907..00000000 --- "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\212)-\347\220\206\350\256\272.md" +++ /dev/null @@ -1,91 +0,0 @@ -### 一,散列表理解 - -散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”,**散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,基于数组演化而来。** - -**散列表**是通过散列函数将“关键字”(键 `key`)映射为数组下标,并将数据存储在数组下标对应的位置中。当我们按照“关键字”(键)查询元素时,我们再用**同样的散列函数**,将“关键字”(键 `key`)转化数组下标,从对应的数组下标的位置取数据(“散列值” `Hash` 值)。 -> Hash 函数计算所得到的 Hash 值本质是一个索引(数组下标),并不代表索引下所存储的数据。 - -映射过程如下图所示: - -![散列值的映射过程](../../data/images/dict.png) - -因此,我们可以使用散列函数和数组创建散列表( hash -table) 的数据结构。散列表是我们学习的第一种包含额外逻辑的数据结构。**数组和链表都是被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置**。 - -一般不需要我们自己实现散列表结构,任一优秀的语言都提供了散列表实现。比如 `Python` 提供的散列表实现为字典,你可使用函数`dict()` 来创建散列表。`C++` 中的关联容器 `map` 或者 `set` 。`map` 使用如下: - -```cpp -map word_count; -``` - -### 二,散列函数 - -散列函数,顾名思义,它是一个函数。我们可以把它定义成 `hash(key)`,其中 `key` 表示元素的键值,`hash(key)` 的值表示经过散列函数计算得到的散列值。 - -散列函数设计的三个基本要求: - -1. 散列函数计算得到的散列值是一个非负整数(如 `uint` 类型。数组下标是从 `0` 开始的,所以散列函数生成的散列值也要是非负整数。); -2. 如果 key1 = key2,那 hash(key1) == hash(key2); -3. 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)(**如果相等,则发生散列冲突/哈希冲突**)。 - -第三个要求看起来合情合理,但是在真实情况下,要想找到一个不同的 `key` 对应的散列值都不一样的散列函数,几乎是不可能的。即便像业界著名的 `MD5、SHA、CRC` 等哈希算法,也无法完全避免这种**散列冲突**。而且,因为数组的存储空间有限,也会加大散列冲突(即即存在多个 `key` 指向同一个索引。)的概率。 - -### 三,散列冲突 - -**再好的散列函数也无法避免散列冲突**。那究竟该如何解决散列冲突问题呢?我们常用的散列冲突解决方法有两类,**开放寻址法**(open addressing)和**链表法**(chaining)。 - -#### 3.1,开放寻址法 - -**开放寻址法**的核心思想是,**如果出现了散列冲突,我们就重新探测一个空闲位置,将其插入**。空闲位置探测的方法有 `3` 种,第一个比较简单的探测方法是**线性探测**(`Linear Probing`),其概念如下: - -当我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,直到找到为止。 - -**在开放寻址+线性探测的散列表中查找元素**: - -首先通过散列函数求出要查找元素的键值(关键字)对应的散列值,然后比较数组中下标为散列值的元素和要查找的元素。如果相等,则说明就是我们要查找的元素;否则就顺序向后依次查找。注意这里的查找和以前的查找不一样,因为存在散列冲突的情况,所以必须遍历到数组中的空闲位置,还没有找到的情况下查找才会结束。 - -key(元素)->hash value(数组下标) - -> 由于使用的线性探测,如果目标元素出现散列冲突(即数组下标为散列值的元素(`key`)可能和被查找元素(`key`)不同),则一定会被存储在散列值的下一个空闲位置。所以查找过程中如果碰到空闲位置则目标元素不存在。 - -![线性探测](../../data/images/Hash_collision.png) - -线性探测法其实存在很大问题。当散列表中插入的数据越来越多时,散列冲突发生的可能性就会越来越大,空闲位置会越来越少,线性探测的时间就会越来越久。极端情况下,我们可能需要探测整个散列表,所以**最坏情况下的时间复杂度为 O(n)**。同理,在删除和查找时,也有可能会线性探测整张散列表,才能找到要查找或者删除的数据。 - -对于开放寻址冲突解决方法,除了线性探测方法之外,还有另外两种比较经典的探测方法,二次探测(`Quadratic probing`)和双重散列(`Double hashing`)。 - -所谓**二次探测**,跟线性探测很像,线性探测每次探测的步长是 `1`,那它探测的下标序列就是 hash(key)+0,hash(key)+1,hash(key)+2……而二次探测探测的步长就变成了原来的“二次方”,也就是说,它探测的下标序列就是 hash(key)+0,hash(key)+1^2,hash(key)+2^2…… - -所谓**双重散列**,意思就是不仅要使用一个散列函数。我们使用一组散列函数 hash1(key),hash2(key),hash3(key)……我们先用第一个散列函数,如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置。 - -不管采用哪种探测方法,当散列表中空闲位置不多的时候,散列冲突的概率就会大大提高。为了尽可能保证散列表的操作效率,一般情况下,我们会尽可能保证散列表中有一定比例的空闲槽位。我们用装载因子(`load factor`)来表示空位的多少。装载因子的计算公式是: - -```shell -散列表的装载因子 = 填入表中的元素个数/散列表的长度 -``` - -**装载因子越大,说明空闲位置越少,冲突越多,散列表的性能会下降**。 - -#### 3.2,链表法 - -链表法是一种更加常用的散列冲突解决办法,相比开放寻址法,它要简单很多。链表法定义:将所有散列值(哈希值)相同的 `Key` 通过链表存储,`key` 按顺序插入到链表中。 - -如下图,在散列表中,每个“桶(`bucket`)”或者“槽(`slot`)”会对应一条链表,所有散列值相同的元素我们都放到相同槽位对应的链表中。 - -![链表法](../../data/images/slot.png) - -当插入的时候,我们只需要通过散列函数计算出对应的散列槽位,将其插入到对应链表中即可,所以插入的时间复杂度是 $O(1)$。当查找、删除一个元素时,我们同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除。 - -查找或删除操作的时间复杂度跟链表的长度 $k$ 成正比,也就是 $O(k)$。对于散列比较均匀的散列函数来说,理论上讲,$k=n/m$,其中 $n$ 表示散列中数据的个数,$m$ 表示散列表中“槽”的个数。 - -### 总结 - -散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是**散列函数设计**和**散列冲突解决**。散列冲突有两种常用的解决方法,开放寻址法和链表法。散列函数设计的好坏决定了散列冲突的概率,也就决定散列表的性能。 - -### 散列表实战问题 - -![散列表实战问题](../../data/images/散列表实战问题.png) - -### 参考资料 - -[数据结构和算法之美-散列表(上)](https://time.geekbang.org/column/article/64233) \ No newline at end of file diff --git "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\213)-\346\225\243\345\210\227\350\241\250\345\222\214\351\223\276\350\241\250\347\232\204\347\273\204\345\220\210.md" "b/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\213)-\346\225\243\345\210\227\350\241\250\345\222\214\351\223\276\350\241\250\347\232\204\347\273\204\345\220\210.md" deleted file mode 100644 index 41e5200c..00000000 --- "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\213)-\346\225\243\345\210\227\350\241\250\345\222\214\351\223\276\350\241\250\347\232\204\347\273\204\345\220\210.md" +++ /dev/null @@ -1,89 +0,0 @@ -### 一,概述 - -散列表和链表这两种数据结构经常被放到一起使用。比如 `Redis` 的有序集合不仅使用了跳表,还用了散列表。再比如 `Java` 语言中的 `LinkedHashMap` 容器,也用到了散列表和链表两种数据结构。 - -### 二,LRU 缓冲淘汰算法 - -缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如硬件中的缓存: `cpu` 缓存,而 `cpu` 缓存又可以分为一级缓存(`L1 Cache`),二级缓存(`L2 Cache`),三级缓存(`L3 Cache`)。 软件中的缓存: 数据库缓存,数据库本身产品就自带缓存,`redis` 也可以作为数据库缓存。浏览器缓存,就是我们常说的 `Cookie`,本质上就是一个文件。 - -> 在计算机系统中,`CPU` 高速缓存(英语:`CPU Cache`)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于 `CPU`寄存器。其容量远小于内存,但速度却可以接近处理器的频率。 - -缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要**缓存淘汰策略**来决定。常见的策略有三种:先进先出策略 `FIFO`(`First In,First Out`)、最少使用策略 `LFU`(`Least Frequently Used`)、最近最少使用策略 `LRU`(`Least Recently Used`)。 - -#### 2.1,基于链表实现 LRU 缓存淘汰算法 - -算法思路: - -首先维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。 - -1,如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。 - -2,如果此数据没有在缓存链表中,又可以分为两种情况: - + 如果此时缓存未满,则将此结点直接插入到链表的头部; - + 如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。 - -到此为止,我们就用链表实现了一个 LRU 缓存。 - -#### 2.2,基于链表和散列表的组合实现 LRU - -假设我们需要维护一个按照访问时间从大到小有序排列的链表结构。因为缓存大小有限,当缓存空间不够,需要淘汰一个数据的时候,我们就直接将链表头部的结点删除。 - -当要缓存某个数据的时候,先在链表中查找这个数据。如果没有找到,则直接将数据放到链表的尾部;如果找到了,我们就把它移动到链表的尾部。因为查找数据需要遍历链表,所以单纯用链表实现的 LRU 缓存淘汰算法的时间复杂很高,是 O(n)。 - -一个缓存(`cache`)系统主要包含下面这几个操作: - -+ 往缓存中添加一个数据; -+ 从缓存中删除一个数据; -+ 在缓存中查找一个数据。 - -这三个操作都要涉及“查找”操作,如果单纯地采用链表的话,时间复杂度只能是 $O(n)$。如果我们将散列表和链表两种数据结构组合使用,可以将这三个操作的时间复杂度都降低到 $O(1)$。具体的结构如下图: - -![链表和散列表的结合](../../data/images/linked_list+hash_table.png) - -这里使用双向链表存储数据,与之前的双向链表不同,链表中的每个结点除了存储数据(`data`)、前驱指针(`prev`)、后继指针(`next`)之外,还新增了一个特殊的字段 `hnext`。 - -这里的散列表是通过链表法解决散列冲突的,所以从逻辑上讲每个结点会在两条链中(**但实际物理上还是只有一个双向链表**)。一个链是双向链表,另一个链是散列表中的拉链,拉链就是指散列表 `hash` 冲突所维护的那个单链表。 - -这里双向链表的 `prev` 和 `next` 指针是纵向指针,`hnext` 是横向指针,`hnexh` 指针维护的是散列表解决冲突的单链表,`prev` 和 `next` 指针的双链表维护的是数据缓存的时间线,决策对节点的淘汰和增加。 - -> 举例分析:第一个槽位(`slot`)的最后一个节点应该是在添加时发现有散列冲突,且属于第一个槽位,所以用 `hnext` 指针和第一个槽位的第一个节点相连,然后又因为时间上是最后一个插入的节点,所以和第五个槽位的最后一个节点通过 `pre`、`next` 相连在一起。综上,通过图中的 `pre`、`next` 指针连接顺序(浅色线),我们可以明显得出节点的时间顺序,通过 `hnext` 指针(黑色线)可以知道节点在哪个槽中。 - -在散列表和链表组合的存储结构中实现 `LRU`,查找和删除一个数据的时间复杂度都是 $O(1)$。 - -> 在散列表中查找一个元素时,这个元素就是散列表定义中的 `key`,通过散列函数 `hash(key)` 得到散列值,从而找到对应数组下标,即找到对应的槽位(`slot`),最后遍历槽位对应的链表。 - -添加数据到缓存的操作会稍微有点麻烦,我们需要先看这个数据是否已经在缓存中。如果已经在其中,需要将其移动到双向链表的尾部;如果不在其中,还要看缓存有没有满。如果满了,则将双向链表头部的结点删除,然后再将数据放到链表的尾部;如果没有满,就直接将数据放到链表的尾部。 - -这整个过程涉及的查找操作都可以通过散列表来完成。其他的操作,比如删除头结点、链表尾部插入数据等,都可以在 $O(1)$ 的时间复杂度内完成。所以,这三个操作的时间复杂度都是 $O(1)$。至此,我们就通过散列表和双向链表的组合使用,实现了一个高效的、支持 `LRU` 缓存淘汰算法的缓存系统原型。 - -### 三,Redis 有序集合 - -在有序集合中,每个成员对象有两个重要的属性,`key`(键值)和 `score`(分值)。我们不仅会通过 `score` 来查找数据,还会通过 `key` 来查找数据。 - -细化一下 `Redis` 有序集合的操作,如下: - -+ 添加一个成员对象; -+ 按照键值来删除一个成员对象; -+ 按照键值来查找一个成员对象; -+ 按照分值区间查找数据,比如查找积分在[100, 356]之间的成员对象; -+ 按照分值从小到大排序成员变量; - -如果我们仅仅按照分值将成员对象组织成跳表的结构,那按照键值来删除、查询成员对象就会很慢,解决方法与 `LRU` 缓存淘汰算法的解决方法类似。**我们可以再按照键值构建一个散列表**,这样按照 `key` 来删除、查找一个成员对象的时间复杂度就变成了 $O(1)$。同时,借助跳表结构,其他操作也非常高效。 - -### 四,Java LinkedHashMap - -`LinkedHashMap` 使用三列表和链表组合实现,可以按照插入顺序遍历数据、支持按照访问顺序来遍历数据。 - -实际上,`LinkedHashMap` 是通过双向链表和散列表这两种数据结构组合实现的。`LinkedHashMap` 中的 `“Linked”` 实际上是指的是双向链表,并非指用链表法解决散列冲突。 - -`Python` 中的 `OrderedDict` 也有这个特性,`Key` 会按照插入的顺序排列,不是 `Key` 本身排序。注意,使用 `dict` 时,`Key` 是无序的。 - -### 五,为什么散列表经常和链表结构一起使用 - -散列表这种数据结构虽然支持非常高效的数据插入、删除、查找操作,但是散列表中的数据都是通过散列函数打乱之后无规律存储的。也就说,它无法支持按照某种顺序快速地遍历数据。如果希望按照顺序遍历散列表中的数据,那我们需要将散列表中的数据拷贝到数组中,然后排序,再遍历。 - -但是散列表是动态数据结构,不停地有数据的插入、删除,所以每当我们希望按顺序遍历散列表中的数据的时候,都需要先排序,那这样效率势必会很低。为了解决这个问题,所以我们将散列表和链表(或者跳表)结合在一起使用,**提高顺序遍历散列表中数据的效率**。 - -### 参考资料 - -+ [CPU缓存-维基百科](https://zh.wikipedia.org/wiki/CPU%E7%BC%93%E5%AD%98) \ No newline at end of file diff --git "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\255)-\345\256\236\346\210\230.md" "b/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\255)-\345\256\236\346\210\230.md" deleted file mode 100644 index 8f409924..00000000 --- "a/3-data_structure-algorithm/hash_table/\346\225\243\345\210\227\350\241\250(\344\270\255)-\345\256\236\346\210\230.md" +++ /dev/null @@ -1,86 +0,0 @@ -### 一,散列表的查找元素问题 - -散列表的查询效率并不能笼统地说成是 $O(1)$。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。 - -### 二,如何设计一个哈希函数? - -**散列函数设计的好坏,决定了散列表冲突的概率大小,也直接决定了散列表的性能**。那什么才是好的散列函数呢? - -首先,散列函数的设计不能太复杂。过于复杂的散列函数,势必会消耗很多计算时间,也就间接地影响到散列表的性能。其次,散列函数生成的值要尽可能随机并且均匀分布,这样才能避免或者最小化散列冲突,而且即便出现冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽内数据特别多的情况。 - -常见的散列函数的设计方法有**直接寻址法、平方取中法、折叠法、随机数法**等。 - -### 三,装载因子过大了怎么办? - -装载因子越大,说明散列表中元素越多,空闲位置越少,发生散列冲突的概率就越大。不仅插入数据的过程要多次寻址或者拉很长的链,查找的过程也会因此变得很慢。 - -我们知道数组、栈和队列可以进行动态扩容,同样地,针对散列表,当装载因子过大时,我们也可以进行动态扩容,重新申请一个更大的散列表,将数据搬移到这个新散列表中。 - -针对数组的扩容,数据搬移操作比较简单。但是,针对散列表的扩容,数据搬移操作要复杂很多。因为散列表的大小变了,数据的存储位置也变了,**所以我们需要通过散列函数重新计算每个数据的存储位置**。 - -下图例子中。在原来的散列表中,`21` 这个元素原来存储在下标为 `0` 的位置,搬移到新的散列表中,存储在下标为 `7` 的位置。 - -![哈希表的动态扩容](../../data/images/哈希表的动态扩容.png) - -插入一个数据,最好情况下,不需要扩容,最好时间复杂度是 $O(1)$。最坏情况下,散列表装载因子过高,启动扩容,我们需要重新申请内存空间,重新计算哈希位置,并且搬移数据,所以时间复杂度是 $O(n)$。用摊还分析法,均摊情况下,时间复杂度接近最好情况,就是 $O(1)$。 - -### 四,如何避免低效的扩容? - -为了解决一次性扩容耗时过多的情况,我们可以将扩容操作穿插在插入操作的过程中,分批完成。 - -当装载因子触达阈值之后,我们只申请新空间,但并不将老的数据搬移到新散列表中。当有新数据要插入时,我们将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。每次插入一个数据到散列表,我们都重复上面的过程。经过多次插入操作之后,老的散列表中的数据就一点一点全部搬移到新散列表中了。这样没有了集中的一次性数据搬移,插入操作就都变得很快了。 - -![均摊插入](../../data/images/均摊插入.png) - -通过这样均摊的方法,将一次性扩容的代价,均摊到多次插入操作中,就避免了一次性扩容耗时过多的情况。这种实现方式,任何情况下,插入一个数据的时间复杂度都是 O(1)。 - -### 五,如何选择冲突解决方法? - -上一章的学习我们知道,有两种解决散列冲突的方法:开放地址法和链表法,两种方法各有优劣和不同的适用场景。 - -**1,开放寻址法** - -开放寻址法不像链表法,需要拉很多链表。散列表中的数据都存储在数组中,可以有效地利用 CPU 缓存加快查询速度。 - -用开放寻址法解决冲突的散列表,删除数据的时候比较麻烦,需要特殊标记已经删除掉的数据。而且,在开放寻址法中,所有的数据都存储在一个数组中,比起链表法来说,冲突的代价更高。所以,使用开放寻址法解决冲突的散列表,装载因子的上限不能太大。这也导致这种方法比链表法更浪费内存空间。 - -总结一下,**当数据量比较小、装载因子小的时候,适合采用开放寻址法。这也是 `Java` 中的 `ThreadLocalMap` 使用开放寻址法解决散列冲突的原因。** - -**2,链表法** - -首先,链表法对内存的利用率比开放寻址法要高。因为链表结点可以在需要的时候再创建,并不需要像开放寻址法那样事先申请好。这一点也是链表优于数组的地方。 - -链表法比起开放寻址法,对大装载因子的容忍度更高。开放寻址法只能适用装载因子小于 `1` 的情况。接近 `1` 时,就可能会有大量的散列冲突,导致大量的探测、再散列等,性能会下降很多。但是对于链表法来说,只要散列函数的值随机均匀,即便装载因子变成 `10`,也就是链表的长度变长了而已,虽然查找效率有所下降,但是比起顺序查找还是快很多。 - -链表因为要存储指针,所以对于比较小的对象的存储,是比较消耗内存的,还有可能会让内存的消耗翻倍。而且,因为链表中的结点是零散分布在内存中的,不是连续的,所以对 CPU 缓存是不友好的,这方面对于执行效率也有一定的影响。 - -然,如果我们存储的是大对象,也就是说要存储的对象的大小远远大于一个指针的大小(4 个字节或者 8 个字节),那链表中指针的内存消耗在大对象面前就可以忽略了。 - -总结一下,**基于链表的散列冲突处理方法比较适合存储大对象、大数据量的散列表,而且,比起开放寻址法,它更加灵活,支持更多的优化策略,比如用红黑树代替链表**。 - -### 六,工业级散列表的特性和实现方法 - -**1,何为一个工业级的散列表?** - -工业级的散列表应该具有哪些特性?结合已经学习过的散列知识,应该满足几点要求: - -+ 支持快速地查询、插入、删除操作; -+ 内存占用合理,不能浪费过多的内存空间; -+ 性能稳定,极端情况下,散列表的性能也不会退化到无法接受的情况。 - -**2,如何实现这样一个散列表呢?** - -根据前面讲到的知识,可以从这三个方面来考虑设计思路: - -+ 设计一个合适的**散列函数**; -+ 定义装载因子阈值,并且设计**动态扩容策略**; -+ 选择合适的**散列冲突解决方法**。 - -### 总结 - -关于散列函数的设计,我们要尽可能让**散列后的值随机且均匀分布**,这样会尽可能地减少散列冲突,即便冲突之后,分配到每个槽内的数据也比较均匀。除此之外,散列函数的设计也不能太复杂,太复杂就会太耗时间,也会影响散列表的性能。 - -关于散列冲突解决方法的选择,**大部分情况下,链表法更加普适**。而且,我们还可以通过将链表法中的链表改造成其他动态查找数据结构,比如红黑树,来避免散列表时间复杂度退化成 O(n),抵御散列碰撞攻击。但是,对于小规模数据、装载因子不高的散列表,比较适合用开放寻址法。 - -对于动态散列表来说,不管我们如何设计散列函数,选择什么样的散列冲突解决方法。随着数据的不断增加,散列表总会出现装载因子过高的情况。这个时候,我们就需要启动动态扩容。 - diff --git a/3-data_structure-algorithm/linked_list/18.1-deleteNode.cpp b/3-data_structure-algorithm/linked_list/18.1-deleteNode.cpp deleted file mode 100644 index ca6c91c4..00000000 --- a/3-data_structure-algorithm/linked_list/18.1-deleteNode.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// 剑指 Offer 18. 删除链表的节点 -// 题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。 - -/*解题思路: -1. 定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。 -2. 修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。 -*/ - -# include -# include -# include -# include - -using namespace std; - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; - -class Solution { -public: - ListNode* deleteNode(ListNode* head, int val) { - if(head->val == val) return head -> next; - ListNode* pre = head; ListNode* cur = head->next; - while(cur != nullptr && cur->val != val) { - pre = cur; - cur = cur->next; - } - pre->next = cur->next; - return head; - } -}; diff --git a/3-data_structure-algorithm/linked_list/18.2-deleteDuplication.cpp b/3-data_structure-algorithm/linked_list/18.2-deleteDuplication.cpp deleted file mode 100644 index 24b5796e..00000000 --- a/3-data_structure-algorithm/linked_list/18.2-deleteDuplication.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// 剑指 Offer 18.2 删除链表中重复的节点 -// 题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 -// 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 - -/*解题思路: -迭代解法 -*/ - -# include -# include -# include -# include - -using namespace std; - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; - -class Solution { -public: - ListNode* deleteDuplication(ListNode* head) { - ListNode *vhead = new ListNode(-1); - vhead->next = head; - ListNode* pre = vhead,*cur = head; - while(cur){ - if(cur->next && cur->val==cur->next->val){ - cur = cur->next; - while(cur->next && cur->val == cur->next->val){ - cur = cur->next; - } - cur = cur -> next; - pre->next = cur; - } - else{ - pre = cur; - cur = cur->next; - } - } - return vhead->next; - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/linked_list/22-getKthFromEnd.cpp b/3-data_structure-algorithm/linked_list/22-getKthFromEnd.cpp deleted file mode 100644 index 46c97103..00000000 --- a/3-data_structure-algorithm/linked_list/22-getKthFromEnd.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// 剑指 Offer 22. 链表中倒数第k个节点 - -/*解题思路 -双指针法。不用统计链表长度。前指针 former 先向前走 k 步。 -*/ -# include -# include -# include -# include - -using namespace std; - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; - -class Solution { -public: - ListNode* getKthFromEnd(ListNode* head, int k) { - ListNode* former = head; - ListNode* latter = head; - for(int i=0;inext; - } - while(former != NULL){ - former = former->next; - latter = latter->next; - } - return latter; - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/linked_list/23-EntryNodeOfLoop.cpp b/3-data_structure-algorithm/linked_list/23-EntryNodeOfLoop.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/3-data_structure-algorithm/linked_list/24-ReverseList.cpp b/3-data_structure-algorithm/linked_list/24-ReverseList.cpp deleted file mode 100644 index ec5119de..00000000 --- a/3-data_structure-algorithm/linked_list/24-ReverseList.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// 剑指 offer 24: 反转一个单链表。https://leetcode-cn.com/problems/reverse-linked-list/ - -# include -# include -# include -# include - -using namespace std; - -struct ListNode { - int val; - struct ListNode *next; - ListNode(int x) : - val(x), next(NULL) { - } -}; - -class Solution { -public: // 迭代法 - ListNode* reverseList(ListNode* head) { - // 判断链表为空或长度为1的情况 - if(head == nullptr || head->next == nullptr){ - return head; - } - ListNode* pre = nullptr; // 当前节点的前一个节点 - ListNode* next = nullptr; // 当前节点的下一个节点 - while( head != nullptr){ - next = head->next; // 记录当前节点的下一个节点位置; - head->next = pre; // 让当前节点指向前一个节点位置,完成反转 - pre = head; // pre 往右走 - head = next;// 当前节点往右继续走 - } - return pre; - } -}; - -class Solution { -public: // 迭代法 - ListNode* reverseList(ListNode* head) { - ListNode* pre = nullptr, *cur = head; - while(cur != nullptr){ - ListNode *temp = cur -> next; // 暂存后继节点 cur.next - cur->next = pre; // 修改 next 引用指向 - pre = cur; - cur = temp; - } - return pre; - } -}; - diff --git a/3-data_structure-algorithm/linked_list/52-GetIntersectionNode.cpp b/3-data_structure-algorithm/linked_list/52-GetIntersectionNode.cpp deleted file mode 100644 index 13dc76e2..00000000 --- a/3-data_structure-algorithm/linked_list/52-GetIntersectionNode.cpp +++ /dev/null @@ -1,2 +0,0 @@ -// 剑指 offer 52: 两个链表的第一个公共节点 https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/ -// 输入两个链表,找出它们的第一个公共节点。 \ No newline at end of file diff --git a/3-data_structure-algorithm/linked_list/6-PrintLinkedList.cpp b/3-data_structure-algorithm/linked_list/6-PrintLinkedList.cpp deleted file mode 100644 index a625daef..00000000 --- a/3-data_structure-algorithm/linked_list/6-PrintLinkedList.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// 剑指 offer 6: 从尾到头打印单链表 https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ -// 题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 - -/* -解题思路1:使用栈的思想(Python 用 list 模拟栈, pop 弹出栈头元素) -// 栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中,最后出栈的顺序即为逆序。 -// > 和 C 语言不同,C++ 的结构体可以有构造函数! -*/ - -# include -# include -# include -# include - -using namespace std; - -class Solution{ -public: - vector reversePrint(ListNode* head) { - stack values; // 创建一个不包含任何元素的 stack 适配器,并采用默认的 deque 基础容器: - vector result; - while (head != nullptr){ - values.push(head->val); - head = head->next; - } - while(!values.empty()){ - result.push_back(values.top()); - values.pop(); - } - return result; - } -}; - -/* -* 打印一维向量(矩阵)的元素 -*/ -void print_vector(vector arr){ - cout << "The size of marray is " << arr.size() << std::endl; - // 迭代器遍历 - // vector>::iterator iter; - for(auto iter=arr.cbegin();iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - cout << std::endl; - } - // cout << "print success" << endl; -} - -// Definition for singly-linked list. -struct ListNode { - double val; - ListNode *next; - // 构造函数,使用初始化列表初始化字段,构造函数可以像常规函数一样, - // 使用默认形参来定义,而为结点的后继指针提供一个默认的 nullptr 形参是很常见的。 - ListNode(int x): val(x), next(nullptr) {} -}; - -// 创建元素个数为 n 的单链表 -ListNode* createLinkedList(int n){ - ListNode* head = new ListNode(0); - ListNode* cur = head; - for (int i = 1; i < n; i++){ - int val = i * 2; - cur->next = new ListNode(val); - cur = cur->next; - } - - return head; - -} - -int main(){ - ListNode* head = createLinkedList(10); - Solution s1; - vector ret = s1.reversePrint(head); - print_vector(ret); -} - - diff --git a/3-data_structure-algorithm/linked_list/exe/6-PrintLinkedList.exe b/3-data_structure-algorithm/linked_list/exe/6-PrintLinkedList.exe deleted file mode 100644 index dd7c99eb..00000000 Binary files a/3-data_structure-algorithm/linked_list/exe/6-PrintLinkedList.exe and /dev/null differ diff --git a/3-data_structure-algorithm/linked_list/leetcode160-getIntersectionNode.cpp b/3-data_structure-algorithm/linked_list/leetcode160-getIntersectionNode.cpp deleted file mode 100644 index 898825ca..00000000 --- a/3-data_structure-algorithm/linked_list/leetcode160-getIntersectionNode.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// leetcode 160. 相交链表 https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ -/* -### 解题思路 - -**双指针法**: -设节点指针 A 指向头节点 headA, 节点指针 B 指向头节点 headB -1. A 先遍历完链表 headA,然后遍历 headB; -2. B 先遍历完链表 headB,然后遍历 headA; - -只要有公共节点,总路程数,或者说 A 经过的节点数和 B 经过的节点数是一样的, -如果没有公共节点,只有当 A 和 B都变成了 nullptr的时候,两者最终走的路程才是一样的。 -然后只需比较 A和 B是否相等,相等的那个位置即为公共节点,因为此使,两者走的步数开始相等了。 - -``` -### 复杂度分析: -- 时间复杂度:O(n) -- 空间复杂度:O(1) -*/ - - -class Solution { -public: - // 双指针法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode* A = headA; - ListNode* B = headB; - while(A != B){ - if(A != nullptr) A = A->next; - else A = headB; - if (B != nullptr) B = B->next; - else B = headA; - } - return A; - } - // 哈希表法,哈希表中存储链表节点指针 - ListNode *getIntersectionNode2(ListNode *headA, ListNode *headB) { - unordered_set visited; - ListNode* temp = headA; - while(temp != nullptr){ - visited.insert(temp); - temp = temp -> next; - } - temp = headB; - while(temp != nullptr){ - // count 方法判断哈希表中是否存在 temp 关键字 - if(visited.count(temp)) return temp; - else temp = temp -> next; - } - return nullptr; - } - // vector 法,vector 中元素为链表节点指针 - ListNode *getIntersectionNode3(ListNode *headA, ListNode *headB) { - vector visited; - ListNode* temp = headA; - while(temp != nullptr){ - visited.push_back(temp); - temp = temp -> next; - } - temp = headB; - while(temp != nullptr){ - // find 函数查找 vector 中是否存在 temp 元素 - if(visited.end() != find(visited.begin(), visited.end(), temp)) return temp; - else temp = temp -> next; - } - return nullptr; - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/linked_list/leetcode24-swapPairs.cpp b/3-data_structure-algorithm/linked_list/leetcode24-swapPairs.cpp deleted file mode 100644 index 8ca6326b..00000000 --- a/3-data_structure-algorithm/linked_list/leetcode24-swapPairs.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// leetcode 24. 两两交换链表中的节点 - -// 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 -// 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 - -/* -解题思路: -1,迭代法:关键是高清如何交换两个相邻节点,然后迭代交换即可。 - -复杂度分析: -- 时间复杂度:O(n) -- 空间复杂度:O(1) -*/ - -# include -# include -# include -# include - -using namespace std; - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; - -class Solution { -public: - ListNode* swapPairs(ListNode* head) { - if(head == nullptr) return nullptr; - else if(head->next == nullptr) return head; - ListNode* temp = new ListNode(-1); - temp ->next = head; - ListNode* pre = temp; - while(pre->next != nullptr && pre->next->next != nullptr) { - - ListNode* cur = pre->next; - ListNode* next = pre->next->next; - - pre->next = cur->next; - cur->next = next->next; - next->next = cur; - pre = cur; - } - return temp->next; - } -}; diff --git a/3-data_structure-algorithm/linked_list/leetcode61-rotateRight.cpp b/3-data_structure-algorithm/linked_list/leetcode61-rotateRight.cpp deleted file mode 100644 index 4747ea8e..00000000 --- a/3-data_structure-algorithm/linked_list/leetcode61-rotateRight.cpp +++ /dev/null @@ -1,38 +0,0 @@ -//leetcode 61. 旋转链表 -/* -解题思路: -将原来的链表首尾相连变成环,然后找倒数第 k 个点作为新的表头,即原来的表头向右移动 (n-1)-(k%n) 次后断开。 -*/ - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode() : val(0), next(nullptr) {} - ListNode(int x) : val(x), next(nullptr) {} - ListNode(int x, ListNode *next) : val(x), next(next) {} -}; - -class Solution { -public: - ListNode* rotateRight(ListNode* head, int k) { - if (k == 0 || head == nullptr || head->next == nullptr) { - return head; - } - ListNode* cur = head; - int n = 1; - while(cur -> next != nullptr){ - cur = cur -> next; - n += 1; - } - cur -> next = head; // 将链表首尾相连变成环 - cur = head; - int move = (n-1)-(k % n); - while(move--){ - cur = cur -> next; - } - ListNode* ret = cur -> next; - cur -> next = nullptr; // cur 向右移动 move 次后,断掉连接 - return ret; - } -}; \ No newline at end of file diff --git "a/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250.md" "b/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250.md" deleted file mode 100644 index 5a6d59c0..00000000 --- "a/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250.md" +++ /dev/null @@ -1,52 +0,0 @@ -### 一,单链表结构定义 - -> C/C++ 数组:一组具有相同类型数据的集合。结构体:不同类型数据的集合。 -```cpp -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; -``` - -### 二,写链表代码的技巧 - -#### 2.1,技巧一:理解指针或引用的含义 - -指针:指针存放某个对象地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。 - -#### 2.2,警惕指针丢失和内存泄露 - -+ 插入节点时,一定要注意操作是顺序; -+ 删除链表时,也一定要记住手动释放内存空间。 - -#### 2.3,利用哨兵简化实现难度 - -针对链表的插入、删除操作,需要对插入第一个节点和删除最后一个节点的情况进行特殊处理。`head = null` 表示链表中没有节点,`head` 表示头节点,指向链表中的第一个节点。 - -引入哨兵节点,哨兵节点不管链表是否空,`head` 指针都会已知指向哨兵节点。有哨兵节点的链表叫作**带头链表**,反之则是**不带头链表**。 - -利用哨兵简化编程难度的技巧再插入排序、归并排序、动态规划等代码中都有用到。 - -#### 2.4,重点留意边界处理条件 - -写链表代码一定要检查以下情况下,代码逻辑能否正常工作。 - -+ 链表为空; -+ 链表只有一个节点; -+ 代码处理头节点和尾节点 - -#### 2.5,举例画图,辅助思考 - -处了举例画图辅助我们思考问题之外,剩下最关键的就是多写多练、熟能生巧。 `5` 个常见链表操作如下: - -+ 单链表反转 -+ 链表中环的检测 -+ 两个有序链表的合并 -+ 删除链表倒数第 `n` 个节点 -+ 求链表的中间节点 - -### 参考资料 - -[链表(下):如何轻松写出正确的链表代码?](https://time.geekbang.org/column/article/41149) diff --git "a/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250\351\242\230\346\200\273\347\273\223.md" "b/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250\351\242\230\346\200\273\347\273\223.md" deleted file mode 100644 index c868ef99..00000000 --- "a/3-data_structure-algorithm/linked_list/\351\223\276\350\241\250\351\242\230\346\200\273\347\273\223.md" +++ /dev/null @@ -1,307 +0,0 @@ -### 前言:链表中环的分析 - -![链表的环分析](../../data/images/circle.png) - -对于链表**环**的问题,潜在的一个结论是从快慢指针的相遇点到环的入口节点 `B` 的距离和头节点到环的入口节点 `B` 的距离是相等的,即 $AB = CB$。具体证明可以通过以下两种方法分析: - -先设两个指针:快指针 `fast`(比慢指针多走一步)和慢指针 `slow`,链表有环的前提下,它们必然相遇,假设相遇于节点 `C`。因为 `fast` 每次都比 `slow` 多走一步,所以从头节点出发到第一次相遇,`fast` 指针走过的路程是 `slow` 指针的两倍。`slow` 走过的路程为 `ABC`,`fast` 指针走过的路程为`ABCBC`,即可得 $2ABC = ABCBC$,所以 $CBC = ABC$,从而推断出 $CB = AB$。 - -### 一,链表中环的入口节点 - -1,**快慢指针法**。 - -1. 初始化:快指针 `fast` 指向头结点, 慢指针 `slow` 指向头结点 -2. 让 `fast` 一次走两步, slow 一次走一步,第一次相遇在 C 处,停止 -3. 然后让 `fast` 指向头结点,`slow` 原地不动,让后 `fast`,`slow` 每次走一步,当再次相遇,就是入口结点。 - -```cpp -// leetcode142,快慢指针法 -class Solution { -public: - ListNode* EntryNodeOfLoop(ListNode* pHead) { - ListNode* fast = pHead; - ListNode* slow = pHead; - if (!fast || !fast->next) return nullptr; - while( fast != slow ) { // 找到 fast 指针和 slow 指针相遇位置 - fast = fast->next->next; - slow = slow->next; - if(fast == slow ) break; - } - if (!fast || !fast->next) return nullptr; - fast = pHead; // fast 指针指向头节点,slow 指针原地不变 - while(fast != slow ) { // 两个指针重新相遇于环的入口点 - fast = fast->next; - slow = slow->next; - } - return fast; - } -}; -``` - -### 二,计算链表环的长度 - -两个指针相遇后继续移动,下次再相遇时,`slow` 走过的长度就是环的长度。 -```cpp -class Solution { -public: - ListNode* EntryNodeOfLoop(ListNode* pHead) { - ListNode* fast = pHead; - ListNode* slow = pHead; - if (!fast || !fast->next) return nullptr; - while( fast != slow ) { // 于环中第一次相遇 - fast = fast->next->next; - slow = slow->next; - if(fast == slow ) break; - } - if (!fast || !fast->next) return nullptr; - int len = 0; - while(fast != slow ) { // 于环中第二次相遇 - fast = fast->next->next; - slow = slow->next; - len++; - } - return len; - } -}; -``` - -### 三,判断链表是否有环 - -快慢指针,只要链表有环,`fast` 指针一定会和 `slow` 指针相遇( `slow == fast`),否则链表没环。 - -```cpp -class Solution { -public: - ListNode* EntryNodeOfLoop(ListNode* pHead) { - ListNode* fast = pHead; - ListNode* slow = pHead; - if (!fast || !fast->next) return nullptr; - while( slow != nullptr && fast != nullptr; fast->next != nullptr ) { - fast = fast->next->next; - slow = slow->next; - if(slow == fast) return true; // slow 相遇点位置 - } - return false; - } -}; - -``` - -### 四,[两个链表的第一个公共结点](https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/) - -剑指 offer 52. 两个链表的第一个公共节点。输入两个链表,找出它们的第一个公共节点。 - -1,**等值法**。原理是利用**两条链表在相交节点后面的部分完全相同**。 - -因为两个链表有公共部分,假设链表 `A` 的长度为 `a+c`,链表 `B` 的长度为 `b+c`,`c` 为尾部公共部分长度,可知 $a+c+b = b+c+a$。假设指针 `l1` 从 `A` 头部出发,当访问到链表尾部时让其指向 `B` 头部并向前走;同时让指针 `l2` 从 `B` 头部出发,当访问到链表尾部时让其指向 `A` 头部并前走。根据前面的公式,可以很明显得出 `l1` 指针和 `l2` 最终一定会相遇(`l1==l2`),即 `l1` 指针走了 $a+c+b$ 步,`l2` 指针走了 $b+c+a$ 步,此时,相遇点即为第一个公共节点。 - -如果不存在交点:两者会在走完 $a + c + b + c$ 之后同时变为 $null$,退出循环。 - -![FindFirstCommonNode](../../data/images/getIntersectionNode.jpg) - -```cpp -/** - * Definition for singly-linked list. - * struct ListNode { - * int val; - * ListNode *next; - * ListNode(int x) : val(x), next(NULL) {} - * }; - */ -class Solution { -public: - // 等值法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode *l1 = headA; - ListNode *l2 = headB; - if(headA == nullptr || headB == nullptr) return nullptr; - while( l1 != l2){ - if( l1 != nullptr) l1 = l1->next; - else l1 = headB; - if(l2 != nullptr) l2 = l2->next; - else l2 = headA; - } - return l1; - } -}; -``` - -+ 时间复杂度:$O(n + m)$ -+ 空间复杂度:$O(1)$ - -2,**差值法**。原理和方法 `1` 一样,即两链表相交点后面的部分完全相同。 - -分别遍历 `A` `B` 两链表,获取链表长度,并相减得差值 `d` ,然后长度大的链表先走 `d` 步,然后两链表同时走,第一个相同的节点即为第一个公共节点。 - -```cpp - -class Solution { -public: - // 差值法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode *l1 = headA; - ListNode *l2 = headB; - int len1 = 0, len2 = 0; - while(l1 != nullptr) { // 遍历链表 A,获取链表 A 长度 - l1 = l1->next; - len1++; - } - while(l2 != nullptr) { // 遍历链表 A,获取链表 A 长度 - l2 = l2->next; - len2++; - } - int d = abs(len1 - len2); - if(len1 > len2){ - while(d-- > 0) headA = headA->next; - } - else{ - while(d-- > 0) headB = headB->next; - } - while(headA != headB){ - headA = headA->next; - headB = headB->next; - } - return headA; - } -}; -``` - -+ 时间复杂度:$O(n + m)$ -+ 空间复杂度:$O(1)$ - -3,**哈希集合解法**:这是一种「从前往后」寻找的思路。 -> 前面两种解题思路其实是属于根据题目特性来构思的解题方法,现在的解题方法属于利用已学过的数据结构/算法特性来解题。 - -使用 `set` 数据结构,先对某一条链表进行遍历,同时记录下来所有的节点。然后在对第二链条进行遍历时,检查当前节点是否在 `set` 中出现过,第一个在 `set` 出现过的节点即是交点。 - -```cpp -class Solution { -public: - // set 集合解法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode *l1 = headA; - ListNode *l2 = headB; - unordered_set visited; - while(headA != nullptr){ - visited.insert(headA); - headA = headA->next; - } - while(headB != nullptr){ - // if (visited.count(temp)) - if(visited.find(headB) != visited.end()){ - return headB; - } - headB = headB->next; - } - return nullptr; - } -}; -``` - -3,**栈特性解法**:这是一种「从后往前」寻找的思路,利用了栈**先进后出**的特性。 - -```cpp - -class Solution { -public: - // 栈特性解法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode *l1 = headA; - ListNode *l2 = headB; - stack st1, st2; - while(headA != nullptr){ - st1.push(headA); - headA = headA->next; - } - while(headB != nullptr){ - st2.push(headB); - headB = headB->next; - } - ListNode* ans = nullptr; - while(!st1.empty()&&!st2.empty()&&st1.top()==st2.top()){ - ans = st1.top(); - st1.pop(); - st2.pop(); - } - return ans; - } -}; -``` - -五,[反转链表](https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/) - -1,**迭代(双指针)解法**。 - -考虑遍历链表,并在访问各节点时修改 `next` 引用指向。 - -```cpp -/** - * Definition for singly-linked list. - * struct ListNode { - * int val; - * ListNode *next; - * ListNode(int x) : val(x), next(NULL) {} - * }; - */ -class Solution { -public: // 迭代法 - ListNode* reverseList(ListNode* head) { - ListNode* pre = nullptr, *cur = head; - while(cur != nullptr){ - ListNode *temp = cur -> next; // 暂存后继节点 cur.next - cur->next = pre; // 修改 next 引用指向 - pre = cur; - cur = temp; - } - return pre; - } -}; -``` - -+ 时间复杂度:$O(n)$ -+ 空间复杂度:$O(1)$ - -### 六,[合并两个排序的链表](https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/) - -剑指offer25. 合并两个排序的链表。输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 - -```cpp -/** - * Definition for singly-linked list. - * struct ListNode { - * int val; - * ListNode *next; - * ListNode(int x) : val(x), next(NULL) {} - * }; - */ -class Solution { -public: - ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { - ListNode* dummy = new ListNode(0); - ListNode* pre = dummy; - while(l1 != nullptr && l2 != nullptr){ - if(l1->val < l2->val){ - pre->next = l1; - pre = pre->next; - l1 = l1->next; - } - else{ - pre->next = l2; - pre = pre->next; - l2 = l2->next; - } - } - // 就像归并排序一样最后要把没合并完的直接链接进来 - if(l1) pre->next = l1; - if(l2) pre->next = l2; - - return dummy->next; - } -}; -``` - -### 七,[复杂链表的复制](https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/) - -剑指 Offer 35. 复杂链表的复制 - -请实现 `copyRandomList` 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 `next` 指针指向下一个节点,还有一个 `random` 指针指向链表中的任意节点或者 `null`。 diff --git "a/3-data_structure-algorithm/map/\345\233\276\347\232\204\350\241\250\347\244\272.md" "b/3-data_structure-algorithm/map/\345\233\276\347\232\204\350\241\250\347\244\272.md" deleted file mode 100644 index 874d60fd..00000000 --- "a/3-data_structure-algorithm/map/\345\233\276\347\232\204\350\241\250\347\244\272.md" +++ /dev/null @@ -1,42 +0,0 @@ -### 一,图的理解 - -图和树一样都是**非线性表数据结构**,但是更复杂。树中的元素我们称为节点,图中的元素我们叫作**顶点**(`vertex`)。图中的一个顶点可以与任意其他顶点建立连接关系,这种连接关系叫作**边**(`edge`)。有方向的图叫做“有向图”。以此类推,我们把边没有方向的图就叫做“无向图”。 - -在有向图中,我们把度分为**入度**(In-degree)和**出度**(Out-degree)。顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。通过方向可以用来表示微博的粉丝量和关注量,入度表示有多少粉丝,出度表示关注了多少人。 - -每条边都有一个权重(`weight`)的无向图叫作**带权无向图**(`weighted graph`),通过这个权重可以用来表示QQ好友间的亲密度。 - -### 二,邻接矩阵存储方法 - -图最直观的一种存储方法就是,**邻接矩阵**(`Adjacency Matrix`)。 - -邻接矩阵的底层依赖一个二维数组。对于无向图来说,如果顶点 `i` 与顶点 `j` 之间有边,我们就将 `A[i][j]` 和 `A[j][i]` 标记为 `1`;对于有向图来说,如果顶点 `i` 到顶点 `j` 之间,有一条箭头从顶点 `i` 指向顶点 `j` 的边,那我们就将 `A[i][j]` 标记为 `1`。同理,如果有一条箭头从顶点 `j` 指向顶点 `i` 的边,我们就将 `A[j][i]` 标记为 `1`。对于带权图,数组中就存储相应的权重。 - -![邻接矩阵](../../data/images/Adjacency_Matrix.png) - -邻接矩阵存储图虽然存储方式简单、也方便计算,但是在一些情况下会造成空间的浪费。 - -如果用邻接矩阵存储无向图会造成存储空间的浪费,因为对于无向图来说,如果 `A[i][j]` 等于 1,那 `A[j][i]` 也肯定等于 1。实际上,我们只需要存储一个就可以了。也就是说,无向图的二维数组中,如果我们将其用对角线划分为上下两部分,那我们只需要利用上面或者下面这样一半的空间就足够了,另外一半白白浪费掉了。 - -还有,如果我们存储的是稀疏图(`Sparse Matrix`),也就是说,顶点很多,但每个顶点的边并不多,那邻接矩阵的存储方法就更加浪费空间了。 -> 如果有 `n` 个顶点,所需构建的二维矩阵就是 `n*n`,如果每个顶点的边不是很多,就是造成矩阵的很多元素都是 `0`,从而导致存储空间的浪费。 - -### 三,邻接表存储方法 - -针对上面邻接矩阵比较浪费内存空间的问题,我们来看另外一种图的存储方法,邻接表(`Adjacency List`)。 - -邻接表的存储关系如下图所示。 - -![邻接表存储方法](../../data/images/Adjacency_List.png) - -图中画的是一个有向图的邻接表存储方式,每个顶点对应的链表里面,存储的是指向的顶点。 - -邻接表的本质是用时间换空间,邻接矩阵存储起来比较浪费空间,但是使用起来比较节省时间。相反,邻接表存储起来比较节省空间,但是使用起来就比较耗时间。 - -就像图中的例子,如果我们要确定,是否存在一条从顶点 `2` 到顶点 `4` 的边,那我们就要遍历顶点 `2` 对应的那条链表,看链表中是否存在顶点 `4`。而且,**链表的存储方式对缓存不友好**。所以,比起邻接矩阵的存储方式,在邻接表中查询两个顶点之间的关系就没那么高效了。 - -邻接表结构长得像散列表,因此也可对邻接表进行改进升级。我们可以将邻接表中的链表改成平衡二叉查找树。实际开发中,我们可以选择用红黑树。这样,我们就可以更加快速地查找两个顶点之间是否存在边了。当然,这里的二叉查找树可以换成其他动态数据结构,比如跳表、散列表等。除此之外,我们还可以将链表改成有序动态数组,可以通过二分查找的方法来快速定位两个顶点之间否是存在边。 - -### 总结 - -邻接矩阵存储方法的缺点是比较浪费空间,但是优点是查询效率高,而且方便矩阵运算。邻接表存储方法中每个顶点都对应一个链表,存储与其相连接的其他顶点。尽管邻接表的存储方式比较节省存储空间,但链表不方便查找,所以查询效率没有邻接矩阵存储方式高。针对这个问题,邻接表还有改进升级版,即将链表换成更加高效的动态数据结构,比如平衡二叉查找树、跳表、散列表等。 \ No newline at end of file diff --git "a/3-data_structure-algorithm/map/\345\271\277\345\272\246\345\222\214\346\267\261\345\272\246\344\274\230\345\205\210\346\220\234\347\264\242.md" "b/3-data_structure-algorithm/map/\345\271\277\345\272\246\345\222\214\346\267\261\345\272\246\344\274\230\345\205\210\346\220\234\347\264\242.md" deleted file mode 100644 index efedb6af..00000000 --- "a/3-data_structure-algorithm/map/\345\271\277\345\272\246\345\222\214\346\267\261\345\272\246\344\274\230\345\205\210\346\220\234\347\264\242.md" +++ /dev/null @@ -1,124 +0,0 @@ -### 一,什么是搜索算法 - -算法是基于特定数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。 - -> 树是图的一种特例(连通无环的图就是树)。 - -图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,两种最简单、最“暴力”的深度优先、广度优先搜索,还有 `A*`、`IDA*` 等启发式搜索算法。深度优先搜索算法和广度优先搜索算法,既可以用在无向图,也可以用在有向图上。 - -图(采用邻接表存储)的 `C++` 代码实现如下: - -```cpp - -#include -// 无向图结构的定义 -class Graph{ -private: - int v; // 顶点个数 - list adj() // 存储的邻接表 -public: - // 构造函数定义 - Graph(int v){ - adj = new List(v); - for (int i = 0; i < v; i++){ - adj[i] = new list (); - } - } - // 无向图一条边存储 2 次 - void addEdge(int s, int t){ - adj[s].push_back(t); - adj[t].push_back(s); - } -} -``` - -### 二,广度优先搜索(BFS) - -广度优先搜索(Breadth-First-Search),我们平常都简称 `BFS`。直观地讲,它其实就是一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。 - -求图中起始顶点 `s` 到终止顶点 `t` 的最短路径,可使用 `bfs` 算法,代码如下: - -```cpp -#include -using namespace std; -void bfs(int s, int t){ - if( s==t ) return; - bool visited[v]; // 用来记录已经访问过的顶点, v 表示顶点个数 - queue queue; // 一个队列,用来存储已经被访问、但相连的顶点还没有被访问的顶点。 - queue.push_back(s); // 添加起始顶点 - vector prev(v, -1); // prev 用来记录搜索路径, prev[w]存储的是,顶点 w 是从哪个前驱顶点遍历过来的。 - while(queue.size() != 0){ - int w = queue.pop(); - for(int i= 0; i -# include -# include -# include -# include - -using namespace std; -// 剑指 offer 10-1. 斐波那契数列 - -class Solution { -private: - static const int mod = 1e9 + 7; - int m = 101; - vector vec = vector(101, -1); // c++11 之后,类 private成员初始化方式 -public: - // 1,直接递归会超出时间限制,需要使用记忆化递归 - constexpr int fib(int n) { - if (n == 0) return 0; - if (n == 1 || n == 2) return 1; - - if (vec[n] != -1) return vec[n]; - vec[n] = (fib(n - 1) + fib(n - 2)) % mod; - - return vec[n]; - } - // 2,迭代求解 - int fib(int n) { - int arr[101]; - arr[0] = 0; - arr[1] = 1; - arr[2] = 1; - for (int i = 2; i < n; i++) { - arr[i+1] = (arr[i ] + arr[i - 1]) % mod; - } - return arr[n]; - } -}; - -int main() { - - Solution s1; - int num = s1.fib(10); - cout << num << endl; - return 0; -} \ No newline at end of file diff --git "a/3-data_structure-algorithm/recursion/\351\200\222\345\275\222-\351\234\200\350\246\201\346\273\241\350\266\263\344\270\211\344\270\252\346\235\241\344\273\266.md" "b/3-data_structure-algorithm/recursion/\351\200\222\345\275\222-\351\234\200\350\246\201\346\273\241\350\266\263\344\270\211\344\270\252\346\235\241\344\273\266.md" deleted file mode 100644 index e39c38c6..00000000 --- "a/3-data_structure-algorithm/recursion/\351\200\222\345\275\222-\351\234\200\350\246\201\346\273\241\350\266\263\344\270\211\344\270\252\346\235\241\344\273\266.md" +++ /dev/null @@ -1,75 +0,0 @@ -### 一,概述 - -递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 `DFS` 深度优先搜索、前中后序二叉树遍历等。 - -去的过程叫“递”,回来的过程叫“归”。基本上所有的递归问题都可以用递推公式来表示。 - -递归需要满足的**三个条件**: - -1. 一个问题的解可以分解为几个子问题的解; -2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样; -3. 存在递归终止条件。 - -### 二,常见的递归问题 - -- [斐波那契数列](https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/):递推公式:f(n) = f(n-1) + f(n-2) -- [跳台阶问题](https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/):递推公式:f(n) = f(n-1) + f(n-2) - -斐波那契数列问题的”记忆化递归“实现代码如下: - -```cpp -// 1,直接递归会超出时间限制,需要使用记忆化递归 -int fib(int n) { - if (n == 0) return 0; - if (n == 1 || n == 2) return 1; - - if (vec[n] != -1) return vec[n]; - vec[n] = (fib(n - 1) + fib(n - 2)) % mod; - - return vec[n]; -} -``` - -### 二,如何编写递归代码 - -递归问题的层层调用分析是不符合人类直觉的,因此没必要用人脑去分解递归代码的每个步骤,正确的做法是,**遇到递归问题就拆分问题并抽象成递归公式**,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。 - -### 三,递归代码要警惕堆栈溢出 - -递归代码涉及到函数调用,函数调用会使用栈来保存临时变量。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。 - -通过在代码中限制递归调用的最大深度的方式一定程度上可以解决堆栈溢出的问题。伪代码如下: - -```cpp - -// 全局变量,表示递归的深度。 -int depth = 0; - -int f(int n) { - ++depth; - if (depth > 1000) throw exception; - - if (n == 1) return 1; - return f(n-1) + 1; -} -``` - -但这种做法并不能完全解决问题,因为最大允许的递归深度跟当前线程剩余的栈空间大小有关,事先无法计算。如果实时计算,代码过于复杂,就会影响代码的可读性。所以,如果最大深度比较小,比如 10、50,就可以用这种方法,否则这种方法并不是很实用。 - -### 四,递归代码要警惕重复计算 - -为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的 $f(k)$。当递归调用到 $f(k)$ 时,先看下是否已经求解过了。如果是,则直接从散列表中取值返回,不需要重复计算。 - -这种”递归+备忘录(记忆化递归)“的方法相比简单的递归,可以减少时间复杂度,本质是用空间换时间。 - -### 五,总结 - -**递归是一种非常高效、简洁的编码技巧**。只要是满足“三个条件”的问题就可以通过递归代码来解决。 - -**但是递归代码也比较难写、难理解**。编写递归代码的关键就是不要把自己绕进去,正确姿势是写出递推公式,找出终止条件,然后再翻译成递归代码。 - -递归代码虽然简洁高效,但是,递归代码也有很多弊端。比如,堆栈溢出、重复计算、函数调用耗时多、空间复杂度高等,所以,在编写递归代码的时候,一定要控制好这些副作用。 - -### 参考资料 - -《数据结构与算法之美》-递归 diff --git "a/3-data_structure-algorithm/skip_list/\350\267\263\350\241\250.md" "b/3-data_structure-algorithm/skip_list/\350\267\263\350\241\250.md" deleted file mode 100644 index a3ae9d5c..00000000 --- "a/3-data_structure-algorithm/skip_list/\350\267\263\350\241\250.md" +++ /dev/null @@ -1,47 +0,0 @@ -### 一,如何理解跳表 - -简单说跳表(`Skip list`)就是链表的“二分查找”。`redis` 的有序集合用的就是跳表算法。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(`Red-black tree`)。 - -如下图所示,这种链表加多级索引的结构,就是跳表。从图中我们可以看出,原来没有索引的时候,查找 `62` 需要遍历 `62` 个结点,现在只需要遍历 `11` 个结点,速度是不是提高了很多?所以,当链表的长度 `n` 比较大时,比如 `1000、10000` 的时候,在构建索引之后,查找效率的提升就会非常明显。 - -![skip_list](../../data/images/skip_list.png) - -如果包含原始链表这一层,整个跳表的高度就是 $log2n$。我们在跳表中查询某个数据的时候,如果每一层都要遍历 $m$ 个结点,那在跳表中查询一个数据的时间复杂度就是 $O(m*logn)$。这里的 $m$ 为 $3$。为什么是 3 呢?解释如下。 - -假设我们要查找的数据是 x,在第 k 级索引中,我们遍历到 y 结点之后,发现 x 大于 y,小于后面的结点 z,所以我们通过 y 的 down 指针,从第 k 级索引下降到第 k-1 级索引。在第 k-1 级索引中,`y` 和 `z` 之间只有 `3` 个结点(包含 `y` 和 `z`),所以,我们在 K-1 级索引中最多只需要遍历 3 个结点,依次类推,每一级索引都最多只需要遍历 3 个结点。 - -![skip_list](../../data/images/skip_list2.png) - -通过上面的分析,我们得到 m=3,所以在跳表中查询任意数据的时间复杂度就是 $O(logn)$。 - -### 二,跳表的空间复杂度 - -比起单纯的单链表,跳表需要存储多级索引,肯定要消耗更多的存储空间。 - -跳表的空间复杂度分析并不难,假设原始链表大小为 n,那第一级索引大约有 n/2 个结点,第二级索引大约有 n/4 个结点,以此类推,每上升一级就减少一半,直到剩下 2 个结点。如果我们把每层索引的结点数写出来,就是一个等比数列。 - -这几级索引的结点总和就是 n/2+n/4+n/8…+8+4+2=n-2。所以,跳表的空间复杂度是 $O(n)$。也就是说,如果将包含 n 个结点的单链表构造成跳表,我们需要额外再用接近 n 个结点的存储空间。 - -在软件开发中,我们不必太在意索引占用的额外空间。在讲数据结构和算法时,我们习惯性地把要处理的数据看成整数,但是在实际的软件开发中,原始链表中存储的有可能是很大的对象,而索引结点只需要存储关键值和几个指针,并不需要存储对象,所以当对象比索引结点大很多时,那索引占用的额外空间就可以忽略了。 - -### 三,高效的动态插入和删除 - -前问叙述了跳表的结构定义和查找数据,实际上,跳表这个动态数据结构,**不仅支持查找操作,还支持动态的插入、删除操作,而且插入、删除操作的时间复杂度也是 $O(logn)$**。 - -在单链表中,一旦定位好要插入的位置,插入结点的时间复杂度是很低的,就是 $O(1)$。但是,这里为了保证原始链表中数据的有序性,我们需要先找到要插入的位置,这个查找操作就会比较耗时。 - -对于纯粹的单链表,需要遍历每个结点,来找到插入的位置。但是,对于跳表来说,我们讲过查找某个结点的时间复杂度是 $O(logn)$,所以这里查找某个数据应该插入的位置,方法也是类似的,时间复杂度也是 $O(logn)$。 - -### 四,跳表索引动态更新 - -当我们不停地往跳表中插入数据时,如果我们不更新索引,就有可能出现某 2 个索引结点之间数据非常多的情况。极端情况下,跳表还会退化成单链表。 - -### 五,总结 - -跳表使用空间换时间的设计思路,通过构建多级索引来提高查询的效率,实现了**基于链表的“二分查找”**。跳表是一种动态数据结构,支持快速地插入、删除、查找操作,时间复杂度都是 $O(logn)$。跳表的空间复杂度是 $O(n)$。不过,跳表的实现非常灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗。虽然跳表的代码实现并不简单,但是作为一种动态数据结构,比起红黑树来说,实现要简单多了。所以很多时候,我们为了代码的简单、易读,比起红黑树,我们更倾向用跳表。 - -### 参考资料 - -+ [数据结构与算法之美-跳表](https://time.geekbang.org/column/article/42896) -+ [跳表(SkipList)设计与实现 -](https://leetcode-cn.com/circle/article/gRlksy/) \ No newline at end of file diff --git a/3-data_structure-algorithm/sort/InsertSort.cpp b/3-data_structure-algorithm/sort/InsertSort.cpp deleted file mode 100644 index ade077cc..00000000 --- a/3-data_structure-algorithm/sort/InsertSort.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -using namespace std; - -void InsertSort(int a[], int n) -{ - for (int j = 1; j < n; j++) - { - int key = a[j]; // 待排序第一个元素 - int i = j - 1; // 代表已经排过序的元素最后一个索引数 - while (i >= 0 && key < a[i]) - { - // 从后向前逐个比较已经排序过数组,如果比它小,则把后者用前者代替, - // 其实说白了就是数组逐个后移动一位,为找到合适的位置时候便于Key的插入 - a[i + 1] = a[i]; - i--; - } - a[i + 1] = key; // 找到合适的位置了,赋值,在i索引的后面设置key值。 - } -} - -void SelectSort(int a[], int n){ - for(int i=0; i 总结:如果数组有 `n` 个元素,最坏情况下,需要进行 `n` 次冒泡操作。 - -基础的冒泡排序算法的 `C++` 代码如下: - -```cpp -// 将数据从小到大排序 -void bubbleSort(int array[], int n){ - if (n<=1) return; - for(int i=0; i a[j+1]){ - temp = array[j] - a[j] = a[j+1]; - a[j+1] = temp; - } - } - } -} -``` - -实际上,以上的冒泡排序算法还可以优化,当某次冒泡操作已经不再进行数据交换时,说明数组已经达到有序,就不需要再继续执行后续的冒泡操作了。优化后的代码如下: - -```cpp -// 将数据从小到大排序 -void bubbleSort(int array[], int n){ - if (n<=1) return; - for(int i=0; i a[j+1]){ - temp = array[j] - a[j] = a[j+1]; - a[j+1] = temp; - flag = True; // 表示本次冒泡操作存在数据交换 - } - } - if(!flag) break; // 没有数据交换,提交退出 - } -} -``` - -**冒泡排序的特点**: - -1. 冒泡过程只涉及相邻元素的交换,只需要常量级的临时空间,故空间复杂度为 $O(1)$,是**原地排序算法**。 -2. 当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以是**稳定排序算法**。 -3. 最坏情况和平均时间复杂度都为 $O(n^2)$,最好时间复杂度是 $O(n)$。 - -### 二,插入排序(Insertion Sort) - -1. 插入排序算法将数组中的数据分为两个区间:已排序区间和未排序区间。最初始的已排序区间只有一个元素,就是数组的第一个元素。 -2. 插入排序算法的核心思想就是取未排序区间的一个元素,在已排序区间中找到一个合适的位置插入,并保证已排序区间数据一直有序。 -3. 重复这个过程,直到未排序区间元素为空,则算法结束。 - -插入排序和冒泡排序一样,也包含两种操作,一种是**元素的比较**,一种是**元素的移动**。 -当我们需要将一个数据 `a` 插入到已排序区间时,需要拿 `a` 与已排序区间的元素依次比较大小,找到合适的插入位置。找到插入点之后,我们还需要将插入点之后的元素顺序往后移动一位,这样才能腾出位置给元素 `a` 插入。 - -插入排序的 `C++` 代码实现如下: - -```cpp -void InsertSort(int a[], int n){ - if (n <= 1) return; - for (int i = 1; i < n; i++) // 未排序区间范围 - { - - key = a[i]; // 待排序第一个元素 - int j = i - 1; // 已排序区间末尾元素 - // 从尾到头查找插入点方法 - while(key < a[j] && j >= 0){ // 元素比较 - a[j+1] = a[j]; // 数据向后移动一位 - j--; - } - a[j+1] = key; // 插入数据 - } -} -``` - -插入排序的特点: - -1. 插入排序并不需要额外存储空间,空间复杂度是 $O(1)$,所以插入排序也是一个原地排序算法。 -2. 在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样就可以保持原有的前后顺序不变,所以插入排序是稳定的排序算法。 -3. 最坏情况和平均时间复杂度都为 $O(n^2)$,最好时间复杂度是 $O(n)$。 - -### 三,选择排序(Selection Sort) - -选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。 - -选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 $O(n^2)$,是原地排序算法,且是**不稳定的排序算法**。 - -选择排序的 `C++` 代码实现如下: - -```cpp -void SelectSort(int a[], int n){ - for(int i=0; i= r 不用再继续分解,即区间数组元素为 1 -``` - -归并排序的伪代码如下: - -```cpp -merge_sort(A, n){ - merge_sort_c(A, 0, n-1) -} -merge_sort_c(A, p, r){ - // 递归终止条件 - if (p>=r) then return - // 取 p、r 中间的位置为 q - q = (p+r)/2 - // 分治递归 - merge_sort_c(A[p, q], p, q) - merge_sort_c(A[q+1, r], q+1, r) - // 将A[p...q]和A[q+1...r]合并为A[p...r] - merge(A[p...r], A[p...q], A[q+1...r]) -} - -``` - -#### 4.1,归并排序性能分析 - -1,归并排序是一个**稳定的排序算法**。分析:伪代码中 `merge_sort_c()` 函数只是分解问题并没有涉及移动元素和比较大小,真正的元素比较和数据移动在 `merge()` 函数部分。在合并过程中保证值相同的元素合并前后的顺序不变,归并排序排序就是一个稳定的排序算法。 - -2,归并排序的执行效率与要排序的原始数组的有序程度无关,所以其时间复杂度是非常稳定的,不管是最好情况、最坏情况,还是平均情况,**时间复杂度都是 $O(nlogn)$**。分析:不仅递归求解的问题可以写成递推公式,递归代码的时间复杂度也可以写成递推公式: - -$$T(n) = 2*T(n/2) + n; \;n>1$$ - -$$\begin{aligned} -T(n) &= 2*T(n/2) + n \\ - &= 2*(2*T(n/4) + n/2) + n = 4*T(n/4) + 2*n \\ - &= 4*(2*T(n/8) + n/4) + 2*n = 8*T(n/8) + 3*n \\ - &= 8*(2*T(n/16) + n/8) + 3*n = 16*T(n/16) + 4*n \\ - &...... \\ - &= 2^k * T(n/2^k) + k * n \\ - &...... -\end{aligned}$$ - -一步步分解推导可得 $T(n)= 2^k *T(n/2^k) + k* n$ 。当 $T(n/2^k)=T(1)$ 时,也就是 $n/2^k=1$,我们得到 $k=log2n$ 。我们将 $k$ 值代入上面的公式,得到 $T(n)=Cn+nlog2n$ 。如果我们用大 O 标记法来表示的话,$T(n)$ 就等于 $O(nlogn)$。所以归并排序的时间复杂度是 $O(nlogn)$。 - -3,**空间复杂度是 O(n)**。分析:递归代码的空间复杂度并不能像时间复杂度那样累加。尽管算法的每次合并操作都需要申请额外的内存空间,但在合并完成之后,临时开辟的内存空间就被释放掉了。在任意时刻,CPU 只会有一个函数在执行,也就只会有一个临时的内存空间在使用。临时内存空间最大也不会超过 n 个数据的大小,所以空间复杂度是 $O(n)$。 - -### 五,快速排序(Quicksort) - -快排的思想是这样的:如果要排序数组中下标从 `p` 到 `r` 之间的一组数据,我们选择 `p` 到 `r` 之间的任意一个数据作为 `pivot`(**分区点**)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 `p` 到 `q-1` 之间都是小于 `pivot` 的,中间是 `pivot`,后面的 `q+1` 到 `r` 之间是大于 `pivot` 的。 - -根据分治、递归的处理思想,我们可以用**递归**排序下标从 `p` 到 `q-1` 之间的数据和下标从 `q+1` 到 `r` 之间的数据,直到区间缩小为 `1`,就说明所有的数据都有序了。 - -递推公式如下: - -```shell -递推公式: -quick_sort(p,r) = quick_sort(p, q-1) + quick_sort(q, r) -终止条件: -p >= r -``` - -### 归并排序和快速排序总结 - -归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。理解归并排序的重点是理解递推公式和 `merge()` 合并函数。同理,理解快排的重点也是理解递推公式,还有 `partition()` 分区函数。 - -除了以上 `5` 种排序算法,还有 `3` 种时间复杂度是 $O(n)$ 的**线性排序**算法:桶排序、计数排序、基数排序。这八种排序算法性能总结如下图: - -![排序算法总结](../../data/images/sort2.png) - -### 参考资料 - -+ [排序(上):为什么插入排序比冒泡排序更受欢迎?](https://time.geekbang.org/column/article/41802) -+ [排序(下):如何用快排思想在O(n)内查找第K大元素?](https://time.geekbang.org/column/article/41913) \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/30-MinStack.cpp b/3-data_structure-algorithm/stack_queue_heap/30-MinStack.cpp deleted file mode 100644 index c2f03cae..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/30-MinStack.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include -#include -#include - -/* -// 剑指offer30: 包含 min 函数的栈 -// 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中, -// 调用 min、push 及 pop 的时间复杂度都是 O(1)。 -*/ - -using namespace std; - -class MinStack { // 利用辅助栈 - -private: - stack stack1; - stack stack2; -public: - /** initialize your data structure here. */ - MinStack() { - - } - void push(int x) { - stack1.push(x); - if (stack2.empty()) { - stack2.push(x); - } - else { - if (x < stack2.top()) { - stack2.push(x); - } - else { - stack2.push(stack2.top()); - } - } - - } - void pop() { - stack1.pop(); - stack2.pop(); - } - - int top() { - return stack1.top(); - } - - int min() { - return stack2.top(); - } -}; - -/** - * Your MinStack object will be instantiated and called as such: - * MinStack* obj = new MinStack(); - * obj->push(x); - * obj->pop(); - * int param_3 = obj->top(); - * int param_4 = obj->min(); - */ - -int main() { - cout << "hello world" << endl; - return 0; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/31-ValidateStackSequences.cpp b/3-data_structure-algorithm/stack_queue_heap/31-ValidateStackSequences.cpp deleted file mode 100644 index dd0993cd..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/31-ValidateStackSequences.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// 剑指 offer31: 栈的压入、弹出序列 -/* -输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 -例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列, -但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 -*/ - -#include -#include -#include -#include -#include - -using namespace std; - -// 剑指offer31: 栈的压入、弹出序列 -class Solution { // 辅助栈解法,时间超过 77.62%,空间超过 74.84% -public: - bool validateStackSequences(vector& pushed, vector& popped) { - int k = 0; - stack st; - for(int i=0; i // 默认定义最大堆 -// priority_queue, greater >p; // 定义最小堆 - -// 1,数组原地排序法:对原数组从小到大排序后取出前 k 个数即可。时间复杂度:O(nlog n),空间复杂度:O(log n)。 -// 2,使用最大堆结构:时间复杂度:O(nlongk), 插入容量为k的大根堆时间复杂度为O(longk), 一共遍历n个元素;空间复杂度:O(k)。 -// 3, 快速排序算法:TODO. - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - // // stl 自带的 sort() 排序算法 - vector getLeastNumbers1(vector& arr, int k) { - vector ret(k, 0); - sort(arr.begin(), arr.end()); - for(int i=0;i getLeastNumbers2(vector& arr, int k) { - vector vec(k,0); - if(k==0) - return vec; - priority_queue heap; // 大顶堆,堆顶为最大值 - for(int i=0;i<(int)arr.size();i++){ - if(i arr[i]){ // 使用大顶堆来维护最小堆 - heap.pop(); - heap.push(arr[i]); - } - } - } - for(int i=0;i getLeastNumbers(vector& arr, int k) { - vector vec(k,0); - if(k==0) - return vec; - priority_queue, greater > heap; // 小顶堆,堆顶为最小值 - priority_queue heap2; // 大顶堆,堆顶为最大值 - for(int i=0;i<(int)arr.size();i++){ - heap.push(arr[i]); - } - for(int i=0;i arr) { - cout << "The size of array is " << arr.size() << endl; - // 迭代器遍历 - // vector>::iterator iter; - for (auto iter = arr.cbegin(); iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - } - // cout << "print success" << endl; -} - -int main(){ - vector arr = {2, 19, 9, 7,11,15}; - int k = 3; - Solution solution; - auto ret = solution.getLeastNumbers(arr, k); - print_vector(ret); // [2, 7, 11] -} \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/41.1-MedianFinder.cpp b/3-data_structure-algorithm/stack_queue_heap/41.1-MedianFinder.cpp deleted file mode 100644 index 498152b8..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/41.1-MedianFinder.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// 剑指 offer 面试题41.1:数据流中的中位数, 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。。 -// 例如,[2,3,4] 的中位数是 3;[2,3] 的中位数是 (2 + 3) / 2 = 2.5 -// 解题思路: - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -// 剑指 Offer 41. 数据流中的中位数 -class MedianFinder { // 大根堆+小根堆 解法,时间超过 99..38%,空间超过 18.07% -private: - // 从左到右,数据依次从大到小 - priority_queue right; // 大顶堆,堆顶为最大值 - priority_queue, greater > left; // 小顶堆,堆顶为最小值 -public: - /** initialize your data structure here. */ - MedianFinder() { - - } - - void addNum(int num) { - // 插入数据要始终保持两个堆处于平衡状态,即较大数在左边,较小数在右边 - // 两个堆元素个数不超过 1 - if(left.size() == right.size()){ - right.push(num); - left.push(right.top()); // 保证左边堆插入的元素始终是右边堆的最大值 - right.pop(); // 删除堆顶元素 - } - else{ - left.push(num); - right.push(left.top()); - left.pop(); - } - } - - double findMedian() { - if(left.size() == right.size()) return (left.top() + right.top())*0.5; - else return left.top()*1.0; - } -}; - -/** - * Your MedianFinder object will be instantiated and called as such: - * MedianFinder* obj = new MedianFinder(); - * obj->addNum(num); - * double param_2 = obj->findMedian(); - */ - -int main(){ - cout << "hello world" << endl; - return 0; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/41.2-FirstAppearingOnce.cpp b/3-data_structure-algorithm/stack_queue_heap/41.2-FirstAppearingOnce.cpp deleted file mode 100644 index 91dc418f..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/41.2-FirstAppearingOnce.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// 剑指 offer 面试题41.2:字符流中第一个不重复的字符 -// 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。 -// 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 - -// 解题思路:对于“重复问题”,惯性思维应该想到哈希或者set。对于“字符串问题”,大多会用到哈希。 -// 因此一结合,应该可以想到,判断一个字符是否重复,可以选择用哈希,在c++中,可以选择用 unordered_map。 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -class Solution -{ -public: - //Insert one char from stringstream - queue q; - unordered_map mp; - void Insert(char ch) - { - // 如果是第一次出现,则添加到队列中 - if (mp.find(ch) == mp.end()) { - q.push(ch); - } - // 不管是不是第一次出现,都进行计数 - ++mp[ch]; - } - // return the first appearence once char in current stringstream - char FirstAppearingOnce() - { - while (!q.empty()) { - char ch = q.front(); - // 拿出头部,如果是第一次出现,则返回 - if (mp[ch] == 1) { - return ch; - } - // 不是第一次出现,则弹出,然后继续判断下一个头部 - else { - q.pop(); - } - } - return '#'; - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/59-MaxSlidingWindow.cpp b/3-data_structure-algorithm/stack_queue_heap/59-MaxSlidingWindow.cpp deleted file mode 100644 index e06539d6..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/59-MaxSlidingWindow.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// 剑指 offer 面试题59: 滑动窗口的最大值 -// 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 -/*解题思路: -方法一:对于每个滑动窗口,可以使用 O(k) 的时间遍历其中的每一个元素,找出其中的最大值。 -对于长度为 n 的数组 nums 而言,窗口的数量为 n-k+1,算法的时间复杂度为 O((n-k+1)*k)=O(n*k)。 -方法二:维护单调递减的双端队列! -如果发现队尾元素小于要加入的元素,则将队尾元素出队,直到队尾元素大于新元素时,再让新元素入队,从而维护一个单调递减的队列。 -*/ - -#include -#include -#include -#include -#include - -using namespace std; - -class MyQueue { //单调队列(从大到小) -public: - deque que; // 使用deque来实现单调队列 - void pop(int value) { - if (!que.empty() && value == que.front()) { - que.pop_front(); - } - } - void push(int value) { - while (!que.empty() && value > que.back()) { - que.pop_back(); - } - que.push_back(value); - - } - int front() { - return que.front(); - } -}; - - -// 剑指 Offer 59 - I. 滑动窗口的最大值 -class Solution { -public: - // 简单方法:遍历滑动窗口找最大值,合理选择区间 - vector maxSlidingWindow(vector& nums, int k) { - vector ret; - if (nums.size() == 0 && k == 0) return ret; - for (int i = 0; i <= nums.size() - k; i++) { - int maxNum = nums[i]; - for (int j = i; j < (i + k); j++) { - if (nums[j] > maxNum) - maxNum = nums[j]; - } - ret.push_back(maxNum); - } - return ret; - } - // 维护一个单调队列,队头是最大值 - vector maxSlidingWindow2(vector& nums, int k) { - vector ret; - deque window; // 创建双端队列 - // 先将第一个窗口的值按照规则入队 - for (int i = 0; i < k; i++) { - while (!window.empty() && window.back() < nums[i]) { - window.pop_back(); - } - window.push_back(nums[i]); - } - ret.push_back(window.front()); - - for (int j = k; j < nums.size(); j++) { - if (nums[j - k] == window.front()) window.pop_front(); // 模拟滑动窗口的移动 - while (!window.empty() && window.back() <= nums[j]) { - window.pop_back(); - } - window.push_back(nums[j]); - ret.push_back(window.front()); - } - return ret; - } -}; - -/* -* 打印一维向量(矩阵)的元素 -*/ -void print_vector(vector arr) { - cout << "The size of array is " << arr.size() << endl; - // 迭代器遍历 - // vector>::iterator iter; - for (auto iter = arr.cbegin(); iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - } - // cout << "print success" << endl; -} - -int main() { - Solution s1; - vector nums = { 1, 3, -1, -3, 5, 3, 6, 7 }; - int maxNum = *max_element(nums.begin(), nums.end()); - - int k = 3; - auto ret = s1.maxSlidingWindow2(nums, k); - print_vector(ret); -} \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/59.2-MaxQueue.cpp b/3-data_structure-algorithm/stack_queue_heap/59.2-MaxQueue.cpp deleted file mode 100644 index 3f3d07e0..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/59.2-MaxQueue.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include -#include -#include -/* -// 剑指offer30: 队列的最大值 -// 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 -// 若队列为空,pop_front 和 max_value 需要返回 -1 - -// 解题思路:定义一个单调递减的辅助队列(双端队列) -*/ - -using namespace std; - -class MaxQueue { -private: - queue que1; - deque que2; // 辅助队列,头部位置存放最大值值 -public: - MaxQueue() { - - } - int max_value() { - if(que1.empty()) - return -1; - return que2.front(); - } - void push_back(int value) { - // 维护单调递减队列 - while(!que2.empty() && que2.back() < value){ - que2.pop_back(); // 移除队尾元素直到队尾元素大于新添加元素 - } - - que2.push_back(value); - que1.push(value); - } - int pop_front() { - if(que1.empty()) return -1; - else{ - int ans = que1.front(); - if( ans == que2.front()) que2.pop_front(); - que1.pop(); - return ans; - } - } -}; - -/** - * Your MaxQueue object will be instantiated and called as such: - * MaxQueue* obj = new MaxQueue(); - * int param_1 = obj->max_value(); - * obj->push_back(value); - * int param_3 = obj->pop_front(); - */ \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/9-CQueue.cpp b/3-data_structure-algorithm/stack_queue_heap/9-CQueue.cpp deleted file mode 100644 index 074f0fc1..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/9-CQueue.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// 剑指 offer 面试题9:用两个栈实现队列, 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 -// in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。 -// 当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的, -// 先进入的元素先退出,这就是队列的顺序。 - -#include -#include -#include -#include -#include - -using namespace std; - -class Solution -{ -public: - void push(int node) { - stack1.push(node); - } - int pop() { - int res; - if(stack2.empty()){ - while(!stack1.empty()){ - int temp = stack1.top(); - stack1.pop(); - stack2.push(temp); - } - } - res = stack2.top(); - stack2.pop(); - return res; - } - -private: - stack stack1; - stack stack2; -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/leetcode1381-CustomStack.cpp b/3-data_structure-algorithm/stack_queue_heap/leetcode1381-CustomStack.cpp deleted file mode 100644 index 93eb2d42..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/leetcode1381-CustomStack.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// leetcode1381. 设计一个支持增量操作的栈 - -class CustomStack { -public: - CustomStack(int maxSize) { - - } - - void push(int x) { - - } - - int pop() { - - } - - void increment(int k, int val) { - - } -}; - -/** - * Your CustomStack object will be instantiated and called as such: - * CustomStack* obj = new CustomStack(maxSize); - * obj->push(x); - * int param_2 = obj->pop(); - * obj->increment(k,val); - */ \ No newline at end of file diff --git a/3-data_structure-algorithm/stack_queue_heap/leetcode768-maxChunksToSorted.cpp b/3-data_structure-algorithm/stack_queue_heap/leetcode768-maxChunksToSorted.cpp deleted file mode 100644 index b9e49cf1..00000000 --- a/3-data_structure-algorithm/stack_queue_heap/leetcode768-maxChunksToSorted.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// leetcode 768. 最多能完成排序的块 II - -/* -这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为 2000,其中的元素最大为 10**8。 -arr 是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。 -之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块? -*/ - -/* -解题思路 -1,辅助栈法:栈中存放每个块内元素的最大值,栈的 size() 即为最多分块数。 - -题中隐含结论: -- 下一个分块中的所有数字都会大于等于上一个分块中的所有数字,即后面块中的最小值也大于前面块中最大值。 -- 只有分的块内部可以排序,块与块之间的相对位置是不能变的。 -- 直观上就是找到从左到右开始不减少(增加或者不变)的地方并分块。 -- 要后面有较小值,那么前面大于它的都应该在一个块里面。 - -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(1) - -*/ - -# include -# include -# include -# include -# include - -using namespace std; - -class Solution { -public: - int maxChunksToSorted(vector& arr) { - stack ret; // 创建单调栈 - // 单调栈中只保留每个分块的最大值 - for (int i = 0; i < arr.size(); i++) { - // 遇到一个比栈顶小的元素,而前面的块不应该有比 arr[i] 小的 - // 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 arr[i] 小的值都需要 pop 出来 - if (!ret.empty() && arr[i] < ret.top()) { - int temp = ret.top(); - // 维持栈的单调递增 - while (!ret.empty() && arr[i] < ret.top()) { - ret.pop(); - } - ret.push(temp); - } - else { - ret.push(arr[i]); - } - } - int m = ret.size(); - return m; - } -}; - -int main() { - vector v1 = { 2,1,3,4,4}; - Solution s; - auto n = s.maxChunksToSorted(v1); - cout << n; - return 0; -} \ No newline at end of file diff --git "a/3-data_structure-algorithm/stack_queue_heap/\346\240\210-\345\205\210\350\277\233\345\220\216\345\207\272.md" "b/3-data_structure-algorithm/stack_queue_heap/\346\240\210-\345\205\210\350\277\233\345\220\216\345\207\272.md" deleted file mode 100644 index 82def9ed..00000000 --- "a/3-data_structure-algorithm/stack_queue_heap/\346\240\210-\345\205\210\350\277\233\345\220\216\345\207\272.md" +++ /dev/null @@ -1,46 +0,0 @@ -## 一,概述 - -栈和队列都是一种"操作受限"的线性表(逻辑结构),只允许在一端插入和删除数据;**栈的特性是先进后出,队列是先进先出**。在项目中当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时应当首选"栈"这种数据结构。 - -栈的实现有多种方式,可以用数组也可以用链表实现。基于数组实现的栈的`C++`代码如下: - -```cpp -class ArrayStack{ -private: - int items[]; // 定义一个数组 - int count; // 栈中元素个数 - int n; // 栈的大小 - -public: - // 构造函数,利用数组初始化栈,栈的大小为 n - ArrayStack(int n) { - this.items = new int[n]; - this.n = n; - this.count = 0; - } - // 入栈操作 - bool push(int item){ - if(count == n) return False; - // 将插入的元素 item 放在下标为 count 的位置,并且 count 加一 - items[count] = item; - ++count; - return True; - } - // 出栈操作 - bool pop(){ - if(count==0) return null; - // 返回下标为 count-1 的数组元素,并且栈中元素减一 - int temp = items[count-1]; - --count; - return temp; - } -} -``` - -## 二,单调栈 - -单调栈模板题解法:[单调栈解题模板秒杀八道题](https://lucifer.ren/blog/2020/11/03/monotone-stack/) - -### 参考资料 - -《数据结构与算法之美》-栈 diff --git "a/3-data_structure-algorithm/stack_queue_heap/\351\230\237\345\210\227-\345\205\210\350\277\233\345\205\210\345\207\272.md" "b/3-data_structure-algorithm/stack_queue_heap/\351\230\237\345\210\227-\345\205\210\350\277\233\345\205\210\345\207\272.md" deleted file mode 100644 index 3029c706..00000000 --- "a/3-data_structure-algorithm/stack_queue_heap/\351\230\237\345\210\227-\345\205\210\350\277\233\345\205\210\345\207\272.md" +++ /dev/null @@ -1,116 +0,0 @@ -### 一,概述 - -队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。 - -### 二,顺序队列和链式队列 - -队列和栈一样,也是一种抽象的数据结构,操作上具有“先进先出”的特性,队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。基于数组实现的顺序队列的`C++`代码如下: - -```cpp -// 用数组实现的队列 -class ArrayQueue(){ - // 数组:items,数组大小:n -private: - int n = 20; - int head = 0; // 队头下标 - int tail = 0; // 队尾下标 - -public: - // 带参数的构造函数:申请一个大小为 capacity 的数组 - ArrayQueue(int capacity){ - // items = new int[capacity]; - vector items(capacity); - n = capacity; - } - // 入队 - bool enqueue(int item){ - if(tail == n) return False; - items[tail] = item; - ++tail; - return True; - } - // 时间复杂度为O(1)的入队操作 - bool enqueue2(int item){ - // tail == n,表示队列末尾没有空间了 - if(tail == n){ - // tail == n && head == 0,表示整个队列都占满了 - if(head == 0) return False; - // 数据搬移 - for(i=head; i items(capacity); - n = capacity; - } - // 入队函数 - bool enqueue(int item){ - // 队列满了 - if((tail+1)%n = head) return False; - items[tail] = item; - tail = (tail + 1) % n - } - // 出队函数 - int dequeue(){ - // // 如果head == tail 表示队列为空 - if(head == tail) return null; - int ret = items[head]; - head = (head + 1) % n; - return ret; - } -} -``` - -### 四,阻塞队列和并发队列 - -1. 阻塞队列就是入队、出队操作都可以阻塞,简单来说就是队列为空时,队首取数据会被阻塞,队列为满时,队尾插入数据会被阻塞,直到队列有空闲数据才允许在队尾插入数据。**使用阻塞队列结构可以轻松实现“消费者-生产者模型”**。 -2. 并发队列就是队列的操作多线程安全。最简单直接的实现方式是直接在 `enqueue()、dequeue()` 方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作。实际上,基于数组的循环队列,利用 `CAS` 原子操作,可以实现非常高效的并发队列。这也是循环队列比链式队列应用更加广泛的原因。 - -### 参考资料 - -《数据结构与算法之美》-队列 diff --git a/3-data_structure-algorithm/string/1805-numDifferentIntegers.cpp b/3-data_structure-algorithm/string/1805-numDifferentIntegers.cpp deleted file mode 100644 index e03dba70..00000000 --- a/3-data_structure-algorithm/string/1805-numDifferentIntegers.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// leetcode 1805. 字符串中不同整数的数目 - -// 给你一个字符串 word ,该字符串由数字和小写英文字母组成。 - -// 请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123  34 8  34" 。 -// 注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。 -// 返回对 word 完成替换后形成的不同整数的数目。 -// 只有当两个整数的 不含前导零的十进制表示不同,才认为这两个整数也不同。 - - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - int numDifferentIntegers(string word) { - set s; - word += 'a'; - string temp; // 临时字符串 - for(char ch:word){ - // 如果遇到字母且临时字符串非空,就把它加入集合并重置临时字符串 - if(isalpha(ch)){ - if(!temp.empty()){ - s.insert(temp); - temp.clear(); - } - } - else{ - if(temp == "0") temp.clear(); // "001" 和 "1" 是等值的 - temp += ch; - } - } - return s.size(); - } -}; - -int main() { - string word = "the423df34fds23"; - Solution solution; - auto ret = solution.numDifferentIntegers(word); - cout << ret << endl; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/string/1816-truncateSentence.cpp b/3-data_structure-algorithm/string/1816-truncateSentence.cpp deleted file mode 100644 index 75174272..00000000 --- a/3-data_structure-algorithm/string/1816-truncateSentence.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// leetcode 1816 截断句子 -// 句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。 -// 给你一个句子 s​​​​​​ 和一个整数 k​​​​​​ ,请你将 s​​ 截断 ​,​​​使截断后的句子仅含 前 k​​​​​​ 个单词。返回 截断 s​​​​​​ 后得到的句子。 - -// leetcode 557. 反转字符串中的单词 III -// 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - string truncateSentence(string s, int k) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - res.push_back(temp); - temp.clear(); - } - else{ - temp += ch; - } - } - s.clear(); - for(int i=0; i< k;i++){ - s += res[i] + ' '; - } - s.pop_back(); - return s; - } -}; - -int main() { - string s = "the sky is blue";int k=3; - Solution solution; - auto ret = solution.truncateSentence(s, 3); - cout << ret << endl; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/string/557-reverseWords.cpp b/3-data_structure-algorithm/string/557-reverseWords.cpp deleted file mode 100644 index cfbcc754..00000000 --- a/3-data_structure-algorithm/string/557-reverseWords.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// leetcode 557. 反转字符串中的单词 III -// 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - string reverseWords(string s) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - if(!temp.empty()){ - res.push_back(temp); - temp.clear(); - } - } - else{ - temp += ch; - } - } - s.clear(); - for(string &str: res){ - reverse(str.begin(), str.end()); - s += str + ' '; - } - s.pop_back(); - return s; - } -}; - -int main() { - string s = "the sky is blue"; - Solution solution; - auto ret = solution.reverseWords(s); - cout << ret << endl; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/string/58-lengthOfLastWord.cpp b/3-data_structure-algorithm/string/58-lengthOfLastWord.cpp deleted file mode 100644 index 74d06e8b..00000000 --- a/3-data_structure-algorithm/string/58-lengthOfLastWord.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// leetcode58. 最后一个单词的长度 -// 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。 -// 单词:是指仅由字母组成、不包含任何空格字符的最大子字符串。 - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - int lengthOfLastWord(string s) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - if(!temp.empty()){ - res.push_back(temp); - temp.clear(); - } - } - else{ - temp += ch; - } - } - string last_word = res.back(); // 数组最后一个元素 - return last_word.size(); - } -}; - -int main() { - string s = "the sky is blue"; - Solution solution; - auto ret = solution.lengthOfLastWord(s); - cout << ret << endl; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/string/leetcode394-decodeString.cpp b/3-data_structure-algorithm/string/leetcode394-decodeString.cpp deleted file mode 100644 index 560a2d17..00000000 --- a/3-data_structure-algorithm/string/leetcode394-decodeString.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// leetcode 394. 字符串解码 - -/* -解题思路:本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。 -参考:https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/ -复杂度分析: - -- 时间复杂度 O(N): s; -- 空间复杂度 O(N):辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。 -*/ -# include -# include -# include -# include -# include -#include -# include - -using namespace std; - -class Solution { -public: - - string decodeString(string s) { - stack> s1; - string res = ""; - int num = 0; - for (int i = 0; i < s.size(); i++) { - if (s[i] >= '0' && s[i] <= '9') { - num *= 10; - num += (s[i] - '0'); - } - else if (s[i] == '[') { - s1.push(make_pair(res, num)); - num = 0; - res = ""; - } - else if (s[i] == ']') { - auto cur_num = s1.top().second; - auto latest_res = s1.top().first; - s1.pop(); - for (int j = 0; j < cur_num; j++) latest_res = latest_res + res; // res 加 n 次 - res = latest_res; - } - else { - res += s[i]; - } - } - return res; - } -}; - -int main(){ - string s = "3[a]2[bc]"; - Solution solution; - auto res = solution.decodeString(s); - cout << res << endl; - return 0; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/string/leetcode821-shortestToChar.cpp b/3-data_structure-algorithm/string/leetcode821-shortestToChar.cpp deleted file mode 100644 index c00c44bd..00000000 --- a/3-data_structure-algorithm/string/leetcode821-shortestToChar.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// leetcode821. 字符的最短距离 -// 给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。 - -// 返回一个整数数组 answer ,其中 answer.length == s.length -// 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 - -// 两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。 - -/* -解题思路: -1,两次遍历 -从左向右遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 i - prev。 -从右想做遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 prev - i。 -2,哈希表法 -- 获取 s 中所有目标字符 c 的位置,并提前存储在数组 c_indexs 中。 -- 遍历字符串 s 中的每个字符,如果和 c 不相等,就到 c_indexs 中找距离当前位置最近的下标。 -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(1) -*/ - -# include -# include -# include -# include -# include - -using namespace std; - -/* -* 打印一维向量(矩阵)的元素 -*/ -void print_vector(vector arr) { - cout << "The size of marray is " << arr.size() << std::endl; - // 迭代器遍历 - // vector>::iterator iter; - for (auto iter = arr.cbegin(); iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - - } - cout << std::endl; - // cout << "print success" << endl; -} - -class Solution { -public: // 1,两次遍历法 - vector shortestToChar(string s, char c) { - vector ret; - int prev = -10000; - int distance = 0; - for (int i = 0; i < s.size(); i++) { - if (s[i] == c) prev = i; - distance = i - prev; - ret.push_back(distance); - } - prev = 10000; - for (int i = s.size() - 1; i >= 0; i--) { - if (s[i] == c) prev = i; - distance = prev - i; - ret[i] = min(ret[i], distance); - } - return ret; - } - // 解法2:空间换时间,时间复杂度 O(n*k) - vector shortestToChar2(string s, char c) { - int n = s.size(); - vector c_indexs; - // Initialize a vector of size n with default value 0. - vector ret(n, 0); - - for (int i = 0; i < n; i++) { - if (s[i] == c) c_indexs.push_back(i); - } - - for (int i = 0; i < n; i++) { - int distance = 10000; - if (s[i] == c) ret[i] = 0; - else { - for (int j = 0; j < c_indexs.size(); j++) { - int temp = abs(c_indexs[j] - i); - if (temp < distance) distance = temp; - } - ret[i] = distance; - } - - } - return ret; - } -}; - -int main() { - string s = "loveleetcode"; - char c = 'e'; - Solution solution; - auto ret = solution.shortestToChar2(s, c); - print_vector(ret); -} \ No newline at end of file diff --git "a/3-data_structure-algorithm/string/\345\255\227\347\254\246\344\270\262\350\247\243\351\242\230\346\250\241\346\235\277.md" "b/3-data_structure-algorithm/string/\345\255\227\347\254\246\344\270\262\350\247\243\351\242\230\346\250\241\346\235\277.md" deleted file mode 100644 index 17149e4c..00000000 --- "a/3-data_structure-algorithm/string/\345\255\227\347\254\246\344\270\262\350\247\243\351\242\230\346\250\241\346\235\277.md" +++ /dev/null @@ -1,45 +0,0 @@ -### 模板代码 - -**字符串处理**这类题目可以分为两类,一类是有前置或者后置空格的,另一类是没有前置和后置空格的。 -1、如果有前后置空格,那么必须判断临时字符串非空才能输出,否则会输出空串。模板如下: - -```cpp -// 模板代码 -s += " "; //这里在最后一个字符位置加上空格,这样最后一个字符串就不会遗漏 -string temp = ""; //临时字符串 -vector res; //存放字符串的数组 -for (char ch : s) //遍历字符句子 -{ - if (ch == ' ') //遇到空格 - { - if (!temp.empty()) //临时字符串非空 - { - res.push_back(temp); - temp.clear(); //清空临时字符串 - } - } - else - temp += ch; -} -``` - -2、没有前后置的空格不需要判断空串。模板如下: - -```cpp -s += " "; -string temp = ""; -vector res; -for (char ch : s) -{ - if (ch == ' ') - { - res.push_back(temp); - temp.clear(); - } - else - temp += ch; -} -``` - -### 参考资料 -[作者:eh-xing-qing](https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/yi-ge-mo-ban-shua-bian-suo-you-zi-fu-chu-x6vh/) diff --git a/3-data_structure-algorithm/tree/55.1-MaxDepth.cpp b/3-data_structure-algorithm/tree/55.1-MaxDepth.cpp deleted file mode 100644 index 1a80949e..00000000 --- a/3-data_structure-algorithm/tree/55.1-MaxDepth.cpp +++ /dev/null @@ -1,2 +0,0 @@ -// 剑指offer 55.1 二叉树的深度: https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ -// 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。 \ No newline at end of file diff --git a/3-data_structure-algorithm/tree/55.2-IsBalanced.cpp b/3-data_structure-algorithm/tree/55.2-IsBalanced.cpp deleted file mode 100644 index e250b4d7..00000000 --- a/3-data_structure-algorithm/tree/55.2-IsBalanced.cpp +++ /dev/null @@ -1,3 +0,0 @@ -// 剑指 offer 55.2: 平衡二叉树 https://leetcode-cn.com/problems/balanced-binary-tree/ -// 给定一个二叉树,判断它是否是高度平衡的二叉树。 - diff --git a/3-data_structure-algorithm/tree/7-buildTree.cpp b/3-data_structure-algorithm/tree/7-buildTree.cpp deleted file mode 100644 index 6fa35cf8..00000000 --- a/3-data_structure-algorithm/tree/7-buildTree.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// 剑指offer07. 重建二叉树 -/* -输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 -解题思路: -1,递归法 -+ 中序遍历的结果可以获取左右子树的元素个数; -+ 前序遍历结果可以获取树的根节点 node 的值。 -*/ - -#include -#include -#include -#include -#include - -using namespace std; - -// Definition for a binary tree node. -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode(int x) : val(x), left(NULL), right(NULL) {} - }; - - -class Solution { -public: - TreeNode* buildTree(vector& preorder, vector& inorder) { - // 哈希表 dic 存储中序遍历的值与索引的映射 - for(int i=0; i index; - TreeNode* recur(vector& preorder, int root, int left, int right){ - if (left > right) return nullptr; - int i = index[preorder[left]]; // 获取中序遍历中根节点值的索引 - TreeNode* node = new TreeNode(preorder[left]); - node->left = recur(preorder, root+1, left, i-1); - node->right = recur(preorder, root+i-left+1, i+1, right); - - return node; - - } -}; \ No newline at end of file diff --git a/3-data_structure-algorithm/tree/binary_search_tree.cpp b/3-data_structure-algorithm/tree/binary_search_tree.cpp deleted file mode 100644 index e0099113..00000000 --- a/3-data_structure-algorithm/tree/binary_search_tree.cpp +++ /dev/null @@ -1,286 +0,0 @@ -// leetcode 700 二叉搜索树中的搜索 -// 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 -// 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 - -#include - -using namespace std; - -typedef int DataType; - -struct treeNode -{ - DataType data; - treeNode *left = nullptr; - treeNode *right = nullptr; -}; - -class binarySearchTree -{ -private: - treeNode *root; - int num; // tree node numbers -public: - binarySearchTree() : num(0) - { - root = new treeNode; - root->left = nullptr; - root->right = nullptr; - } - - bool find(DataType it, treeNode *root) - { - if (nullptr == root) - return false; - if (it == root->data) { - return true; - } else if (it > root->data) { - return find(it, root->right); - } else { - return find(it, root->left); - } - } - - bool find_data(DataType it) - { - return find(it, root); - /* - treeNode* p = root; - while (p != nullptr) - { - if (it < p->data)p = p->left; - else if (it>p->data)p = p->right; - else return true; - } - return false; - */ - } - - DataType get_max() - { - if (nullptr == root) - return NULL; - treeNode *tmp = root; - while (tmp->right != nullptr) { - tmp = tmp->right; - } - return tmp->data; - } - - DataType get_min() - { - if (nullptr == root) - return NULL; - treeNode *tmp = root; - while (tmp->left != nullptr) { - tmp = tmp->left; - } - return tmp->data; - } - - void insert_data(DataType it) - // 利用二分查找的思想,借助树的结构使用递归 - { - if (0 == num) { - root->data = it; - num++; - return; - } - treeNode *p = root; - while (p != nullptr) { - if (it < p->data) { - if (nullptr == p->left) { - p->left = new treeNode; - p->left->data = it; - num++; - return; - } - p = p->left; - } else { - if (nullptr == p->right) { - p->right = new treeNode; - p->right->data = it; - num++; - return; - } - p = p->right; - } - } - } - - DataType get_prenode(DataType it) - { - if (nullptr == root) - return NULL; - if (it == root->data) - return NULL; - treeNode *p = root; - treeNode *pp = nullptr; - while (p != nullptr) { - if (p->data < it) { - pp = p; // label parent root - p = p->right; - - } else if (p->data > it) { - pp = p; // label parent root - p = p->left; - } else { - - break; - } - } - return ((nullptr == p) ? NULL : pp->data); - } - - DataType get_postnode(DataType it) - { - if (nullptr == root) - return -1; - treeNode *p = root; - while (p != nullptr) { - if (p->data < it) { - p = p->right; - } else if (p->data > it) { - p = p->left; - } else { - break; - } - } - if (nullptr == p) { - return -1; - } else if (p->left != nullptr) { - return p->left->data; - } else if (p->right != nullptr) { - return p->right->data; - } else { - return NULL; - } - } - - void mid_order(treeNode *rt) - { - if (nullptr == rt) - return; - mid_order(rt->left); - cout << rt->data << '\t'; - mid_order(rt->right); - } - - void order() - { - if (nullptr == root) - return; - return mid_order(root); - } - - int get_high(treeNode *rt) - { - int lhigh = 0; - int rhigh = 0; - if (nullptr == rt) - return 0; - lhigh = get_high(rt->left); - rhigh = get_high(rt->right); - return ((lhigh > rhigh) ? (lhigh + 1) : (rhigh + 1)); - } - - int high() - { - if (nullptr == root) - return 1; - return get_high(root); - } - - void delet(DataType it) - { - if (NULL == root) - return; - treeNode *p = root; - treeNode *pp = NULL; //pp记录的是p的父节点 - while (p != NULL && p->data != it) { - pp = p; - if (it > p->data) - p = p->right; - else - p = p->left; - } - if (p == NULL) - return; //没有找到 - //删除的节点有两个子节点 - if (p->left != NULL && p->right != NULL) { - treeNode *minP = p->right; - treeNode *minPP = p; //记录P的父节点 - while (minP->left != NULL) //寻找右子树最小节点 - { - minPP = minP; - minP = minP->left; - } - // 注意这里,非常巧妙的办法。只是换值。“换汤不换药” - // 用后继节点替换到要删除节点的位置。 然后就变成删除后继节点的问题了。为了逻辑统一 代码书写简洁。我们把后继节点赋给了p - p->data = minP->data; //将minP的值替换到p中 - //将p换到叶节点上,使用叶节点方法进行删除, 而且最小节点肯定没有左节点,叶节点删除方法参见后面的代码。 - p = minP; - pp = minPP; - } - - //删除节点是叶节点或者是仅有一个节点 - treeNode *child; - if (p->left != NULL) - child = p->left; - else if (p->right != NULL) - child = p->right; - else - child = NULL; - - if (NULL == pp) - root = child; //删除的是根节点 - else if (p == pp->left) - pp->left = child; - else - pp->right = child; - } -}; - -int main() -{ - binarySearchTree my_tree; - - // must input in the order of layers - my_tree.insert_data(33); - my_tree.insert_data(16); - my_tree.insert_data(50); - my_tree.insert_data(13); - my_tree.insert_data(18); - my_tree.insert_data(34); - my_tree.insert_data(58); - my_tree.insert_data(15); - my_tree.insert_data(17); - my_tree.insert_data(25); - my_tree.insert_data(51); - my_tree.insert_data(66); - my_tree.insert_data(19); - my_tree.insert_data(27); - my_tree.insert_data(55); - - if (my_tree.find_data(25)) { - cout << "找到了数字25" << endl; - } else { - cout << "没有找到数字25" << endl; - } - my_tree.delet(13); - my_tree.delet(18); - my_tree.delet(55); - cout << "Max: " << my_tree.get_max() << endl; - cout << "Min: " << my_tree.get_min() << endl; - cout << "pre node of 17 is " << my_tree.get_prenode(17) << endl; - cout << "pre node of 51 is " << my_tree.get_prenode(51) << endl; - cout << "pre node of 33 is " << my_tree.get_prenode(33) << endl; - - cout << "post node of 19 is " << my_tree.get_postnode(19) << endl; - cout << "post node of 25 is " << my_tree.get_postnode(25) << endl; - cout << "post node of 58 is " << my_tree.get_postnode(58) << endl; - cout << "post node of 58 is " << my_tree.get_postnode(51) << endl; - my_tree.order(); - cout << "high of tree is " << my_tree.high() << endl; - return 0; -} diff --git a/3-data_structure-algorithm/tree/binary_tree_traverse.cpp b/3-data_structure-algorithm/tree/binary_tree_traverse.cpp deleted file mode 100644 index 8566525c..00000000 --- a/3-data_structure-algorithm/tree/binary_tree_traverse.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include - -using namespace std; - - -// Definition for a binary tree node. -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode() : val(0), left(nullptr), right(nullptr) {} - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} -}; - -class Solution { -public: - // 前序遍历 - void preOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - ret.push_back(root->val); - preOrder(root->left, ret); - preOrder(root->right, ret); - } - // 中序遍历 - void inOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - inOrder(root->left, ret); - ret.push_back(root->val); - inOrder(root->right, ret); - } - // 后续遍历 - void postOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - postOrder(root->left, ret); - postOrder(root->right, ret); - ret.push_back(root->val); - } - - vector preorderTraversal(TreeNode* root) { - vector res; - preOrder(root, res); - return res; - } - vector inOrderTraversal(TreeNode* root) { - vector res; - inOrder(root, res); - return res; - } - vector postOrderTraversal(TreeNode* root) { - vector res; - postOrder(root, res); - return res; - } -}; diff --git a/3-data_structure-algorithm/tree/exe/binary_search_tree.exe b/3-data_structure-algorithm/tree/exe/binary_search_tree.exe deleted file mode 100644 index da7b1c58..00000000 Binary files a/3-data_structure-algorithm/tree/exe/binary_search_tree.exe and /dev/null differ diff --git a/3-data_structure-algorithm/tree/leetcode109-sortedListToBST.cpp b/3-data_structure-algorithm/tree/leetcode109-sortedListToBST.cpp deleted file mode 100644 index 757364a0..00000000 --- a/3-data_structure-algorithm/tree/leetcode109-sortedListToBST.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// leetcode109. 有序链表转换二叉搜索树 https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree -// 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 -// 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 - -/* -解题思路: -1,将单调递增链表转化为数组,然后分治递归 -2,快慢指针找链表的中间节点,然后递归 -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(n) -*/ - -# include -# include -# include -# include -# include - -using namespace std; - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode() : val(0), next(nullptr) {} - ListNode(int x) : val(x), next(nullptr) {} - ListNode(int x, ListNode *next) : val(x), next(next) {} -}; - -// Definition for a binary tree node. -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode() : val(0), left(nullptr), right(nullptr) {} - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} -}; - -class Solution { -public: - // 分治递归 - TreeNode* sortedListToBST(ListNode* head) { - vector vec; - for(auto it = head; it!=nullptr ; it=it->next ){ - vec.push_back( it->val ); - } - return recur(vec, 0, vec.size()-1); - } - - TreeNode* recur(vector &arr, int left, int right){ - if(left > right) return nullptr; - int mid = right + (left-right)/2; // 数组中间位置的索引 - TreeNode* node = new TreeNode(arr[mid]); - node -> left = recur(arr, left, mid - 1); - node -> right = recur(arr, mid + 1, right); - - return node; - } -}; \ No newline at end of file diff --git "a/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\212)-\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.md" "b/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\212)-\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.md" deleted file mode 100644 index 33156e4b..00000000 --- "a/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\212)-\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.md" +++ /dev/null @@ -1,116 +0,0 @@ -### 一,什么是二叉树 - -二叉树的定义可以先通过下图有一个直观了解。 - -![二叉树图示](../../data/images/binary_tree.png) - -在计算机科学中,二叉树(英语:`Binary tree`)是每个节点最多只有两个分支(即不存在分支度大于 `2` 的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。 - -这个图里面,有两个比较特殊的二叉树,分别是编号 `2` 和编号 `3` 这两个。 - -其中,编号 `2` 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫做**满二叉树**。 - -编号 `3` 的二叉树中,叶子节点都在最底下两层,**最后一层的叶子节点都靠左排列**,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫做**完全二叉树**。 - -### 二,二叉树的存储 - -**完全二叉树之所以这样定义是和二叉树的存储有关的。** - -二叉树的存储有两种方法,一种是基于指针或者引用的二叉链式存储法,一种是基于数组的顺序存储法。 - -链式存储法比较直观,每个节点有三个字段,其中一个存储数据,另外两个是指向左右子节点的指针。我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。如下图所示: - -![链式存储法](../../data/images/binary_tree2.png) - -顺序存储法,假设把根节点存储在数组下标为 `i = 1` 的位置,则左子节点存储在下标为 `2*i=2` 的位置,右子节点在 `2*i+1=3` 的位置。如下图所示: - -![顺序存储法](../../data/images/binary_tree_define.png) - -从顺序存储法定义可知,假设是非完全二叉树,则会浪费部分空间,`2*i` 位置没有元素,被浪费了。所以,如果某棵二叉树是一棵完全二叉树,那用数组存储无疑是最节省内存的一种方式。因为数组的存储方式并不需要像链式存储法那样,要存储额外的左右子节点的指针。 - -### 三,二叉树的遍历 - -将二叉树所有节点打印出来的过程称为二叉树的遍历。二叉树的遍历方式有 `4` 种,前、中、后、层序遍历。**其中,前、中、后序,表示的是节点与它的左右子树节点遍历打印的先后顺序**。 - -+ 前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。 -+ 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。 -+ 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。 - -![二叉树的遍历](../../data/images/binary_tree_traverse.png) - -实际上,二叉树的前、中、后序遍历都是一个递归过程,如中序遍历,就是先递归的打印左子树,再打印根节点,最后递归的打印右子树。递归公式如下: - -``` - -前序遍历的递推公式: -preOrder(r) = print r->preOrder(r->left)->preOrder(r->right) - -中序遍历的递推公式: -inOrder(r) = inOrder(r->left)->print r->inOrder(r->right) - -后序遍历的递推公式: -postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r -``` - -二叉树前序遍历的顺序为: - -+ 先遍历根节点; -+ 随后递归地遍历左子树; -+ 最后递归地遍历右子树。 - -二叉树中序遍历的顺序为: - -+ 先递归地遍历左子树; -+ 随后遍历根节点; -+ 最后递归地遍历右子树。 - -在「递归」地遍历某个子树的过程中,我们也是将这颗子树看成一颗全新的树,按照上述的顺序进行遍历。挖掘「前序遍历」和「中序遍历」的性质,我们就可以得出本题的做法。 - -二叉树的前、中、后续遍历的递归实现代码如下: -> 二叉树的后续遍历 leetcode 链接在 [leetcode145](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/)。 - -```cpp -// Definition for a binary tree node. -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode() : val(0), left(nullptr), right(nullptr) {} - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} -}; - -class Solution { -public: - // 前序遍历,遍历结果存储在 vector 中 - void preOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - ret.push_back(root->val); - preOrder(root->left, ret); - preOrder(root->right, ret); - } - // 中序遍历 - void inOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - inOrder(root->left, ret); - ret.push_back(root->val); - inOrder(root->right, ret); - } - // 后续遍历 - void postOrder(TreeNode* root, vector &ret){ - if(root == nullptr) return ; - postOrder(root->left, ret); - postOrder(root->right, ret); - ret.push_back(root->val); - } -}; -``` - -每个节点最多会被访问两次,所以遍历操作的时间复杂度,跟节点的个数 $n$ 成正比,也就是说二叉树遍历的时间复杂度是 $O(n)$。 -> `2` 次具体指的是,一次是获取该节点的左子节点对象,另一次是获取该节点的右子节点对象。 - -### 总结 - -二叉树的每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树中,有两种比较特殊的树,分别是满二叉树和完全二叉树。满二叉树又是完全二叉树的一种特殊情况。 - -二叉树既可以用链式存储,也可以用数组顺序存储。数组顺序存储的方式比较适合完全二叉树,其他类型的二叉树用数组存储会比较浪费存储空间。除此之外,二叉树里非常重要的操作就是前、中、后序遍历操作,遍历的时间复杂度是 $O(n)$,你需要理解并能用递归代码来实现。 \ No newline at end of file diff --git "a/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\213)-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\213)-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" deleted file mode 100644 index fbdba805..00000000 --- "a/3-data_structure-algorithm/tree/\344\272\214\345\217\211\346\240\221(\344\270\213)-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ /dev/null @@ -1,204 +0,0 @@ -### 一,什么是二叉查找树 - -二叉查找树(`Binary Search Tree`)是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。 - -二叉查找树最大的特点就是,支持**动态数据集合**的快速插入、删除、查找操作。 - -二叉查找树的定义是,**在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值**。结构如下图所示: - -![二叉搜索树](../../data/images/binary_search_tree.png) - -#### 1.1,二叉查找树的查找操作 - -查找的数据等于根节点则返回;小于根节点则在左子树中递归查找;大于根节点则在右子树中递归查找。 - -二叉树的根节点定义如下: - -```cpp -// Definition for a binary tree node-> -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode() : val(0), left(nullptr), right(nullptr) {} - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} -}; -``` - -二叉搜索树中的搜索的 `C++` 代码如下: - -```cpp -class Solution { -public: - TreeNode* searchBST(TreeNode* root, int val) { - if(root == NULL || root->val==val) return root; - if(root->val < val) return searchBST(root->right, val); - if(root->val > val) return searchBST(root->left, val); - return NULL; - } -}; -``` - -#### 1.2,二叉查找树的插入操作 - -二叉查找树的插入过程有点类似查找操作。新插入的数据一般都是在叶子节点上,所以我们只需要从根节点开始,依次比较要插入的数据和节点的大小关系。 - -```cpp -class Solution { -public: - TreeNode* insertIntoBST(TreeNode* root, int val) { - if (root == nullptr){ - return new TreeNode(val); - } - TreeNode* pos = root; - while(pos!=nullptr){ - if(val < pos->val){ - if(pos->left == nullptr){ - pos->left = new TreeNode(val); - return; - } - else{ - pos = pos->left; - } - } - else{ - if(pos->right == nullptr){ - pos->right = new TreeNode(val); - return; - } - else{ - pos = pos->right; - } - } - } - return root; - } -}; -``` - -#### 1.2,二叉查找树的删除操作 - -针对要删除节点的子节点个数的不同,有以下五种情况: - -+ 第一种情况:没找到删除的节点,遍历到空节点直接返回了 -+ 找到删除的节点 - + 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回 `NULL` 为根节点 - + 第三种情况:要删除的节点不是叶子节点,且没有右节点但是有左节点。使用它的前驱节点值进行替代,然后再递归的向下删除前驱节点。 - + 第四种情况:要删除的节点不是叶子节点且拥有右节点,则该节点可以由该节点的后继节点值进行替代,然后可以从后继节点的位置递归向下操作以删除后继节点。 - + 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。 - -+ `Successor` 代表的是中序遍历序列的下一个节点。即比当前节点大的最小节点,简称**后继节点**。 先取当前节点的右节点,然后一直取该节点的左节点,直到左节点为空,则最后指向的节点为后继节点 **(右子树的最小节点)**。 -+ `Predecessor` 代表的是中序遍历序列的前一个节点。即比当前节点小的最大节点,简称**前驱节点**。先取当前节点的左节点,然后取该节点的右节点,直到右节点为空,则最后指向的节点为前驱节点 **(左子树的最大节点)**。 - -**1,递归代码如下**: - -```cpp -// 对应 leetcode450,leetcode运行结果有问题! - -class Solution { -public: - // 返回节点的后继节点值 - int successor(TreeNode* root){ - root = root->right; - while(root->left != nullptr) root = root->left; - return root->val; - } - // 返回节点的前驱节点值 - int predecessor(TreeNode* root){ - root = root->left; - while(root->right != nullptr) root = root->right; - return root->val; - } - TreeNode* deleteNode(TreeNode* root, int key){ - if (root == nullptr) return nullptr; - if(key > root->val) root->right = deleteNode(root->right, key); - else if(key < root->val ) root->left = deleteNode(root->left, key); - else{ // 找到了待删除节点, delete the current node - // 左右子树都没有节点 - if(root->left == nullptr && root->right == nullptr) root = nullptr; - // 只有左子树有节点 - else if(root->left != nullptr ){ - root->val = predecessor(root); - root->left = deleteNode(root->left, root->val); - } - // 只有右子树有节点或者左右子树都有节点 - else{ - root->val = successor(root); - root->right = deleteNode(root->right, root->val); - } - } - return root; - } -}; -``` - -**2,非递归代码如下**: - -```cpp -// 对应 leetcode450,leetcode运行结果有问题! - -class Solution{ -public: - TreeNode* deleteNode(TreeNode* root, int key){ - TreeNode* p = root; // 指向要删除的节点,初始化为根节点 - TreeNode* pp = nullptr; // pp 指向 p 的父节点 - // 根据 key 值查找待删除的节点及其父节点 - while(pp != nullptr && p->val != key){ - pp = p; - if(key > p->val) p = p->right; - else p = p->left; - } - if (pp == nullptr) return nullptr; // 没有找到待删除节点 - // 1, 要删除的节点有两个子节点 - if (p->left != nullptr && p->right != nullptr){ // 查找右子树的最小节点 - TreeNode* minP = p->right; - TreeNode* minPP = p; // minPP 是 minP 的父节点 - while(minP->left != nullptr){ - minPP = minP; - minP = minP->left; - } - // 右子树最小节点的值替换到待删除节点上,然后只要删除 minP 节点(无子节点或者只有一个右子节点 )即可 - p->val = minP->val; - p = minP; - pp = minPP; - } - TreeNode* child; // p 的字节点 - - // 2,要删除的节点有一个子节点或者没有子节点 - if (p->left != nullptr ) child = p->left; // 有左节点 - else if(p->right != nullptr) child = p->right; // 有右节点 - else child = nullptr; // 没有子节点 - - // 真正的删除节点操作 - if(pp == nullptr) root = child; // 删除的是根节点 - else if(pp->left == p) pp->left = child; - else pp->right = child; - - return root; - } -}; -``` - -二叉查找树除了查找、插入、删除操作,还支持快速地查找最大节点和最小节点、前驱节点和后继节点操作。同时,二叉查找树的中序遍历输出的是有序数据序列,时间复杂度为 $O(n)$。 - -### 二,支持重复数据的二叉查找树 - -和散列表一样,二叉查找树节点中也可以存储包含很多字段的对象,针对节点存在重复数据的情况,有两种方法: - -+ 通过链表和支持动态扩容的数组等数据结构,把值相同的数据都存储在同一个节点上。 -+ 每个节点仍然只存储一个数据。在查找插入位置的过程中,如果碰到一个节点的值,与要插入数据的值相同,我们就将这个要插入的数据放到这个节点的右子树,也就是说,把这个新插入的数据当作大于这个节点的值来处理。 - -### 三,二叉查找树的时间复杂度分析 - -二叉查找树的形态各式各样,查找、插入、删除操作的时间复杂度也各不一样,如下图第一种二叉查找树的根节点左右子树极度不平衡,查找的时间复杂度变成了 $O(n)$。 - -![根节点左右子树极度不平衡](../../data/images/bst.png) - -### 总结 - -在二叉查找树中,查找、插入、删除等很多操作的时间复杂度都跟树的高度成正比。两个极端情况的时间复杂度分别是 $O(n)$ 和 $O(logn)$,分别对应二叉树退化成**链表**的情况和**完全二叉树**。为了避免时间复杂度的退化,针对二叉查找树,又设计了一种更加复杂的树-平衡二叉查找树,时间复杂度可以做到稳定的 $O(logn)$。 - -### 参考资料 - -[《数据结构与算法之美》-二叉树基础(下)](https://time.geekbang.org/column/article/68334) \ No newline at end of file diff --git "a/3-data_structure-algorithm/tree/\347\272\242\351\273\221\346\240\221(\344\270\212)-\345\237\272\347\241\200.md" "b/3-data_structure-algorithm/tree/\347\272\242\351\273\221\346\240\221(\344\270\212)-\345\237\272\347\241\200.md" deleted file mode 100644 index 23744cd5..00000000 --- "a/3-data_structure-algorithm/tree/\347\272\242\351\273\221\346\240\221(\344\270\212)-\345\237\272\347\241\200.md" +++ /dev/null @@ -1,56 +0,0 @@ -### 一,什么是“平衡二叉查找树” - -平衡二叉树定义:二叉树中忍一一个节点的左右子树的高度相差不能大于 `1`。 - -![平衡二叉树实例](../../data/images/avl.png) - -平衡二叉查找树不仅满足平衡二叉树的定义,也满足二叉查找树的定义,最先被发明的平衡二叉查找树是 `AVL` 树。 - -> `AVL` 树(`Adelson-Velsky and Landis Tree`)是计算机科学中最早被发明的自平衡二叉查找树。在 `AVL` 树中,任一节点对应的两棵子树的最大高度差为 `1`,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 $O(\log {n})$。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。 - -但是很多平衡二叉查找树其实并没有严格符合上面的定义(树中任意一个节点的左右子树的高度相差不能大于 `1`),比红黑树,**它从根节点到各个叶子节点的最长路径,有可能会比最短路径大一倍**。 - -平衡二叉查找树的发明,是为了解决普通二叉查找树在频繁的插入、删除等动态更新后,出现时间复杂度退化的问题。 - -> 这里“平衡”可以通俗理解为,让整棵树左右看起来对称,从而“平衡”,左右子树高度差不多。 - -### 二,如何定义一颗红黑树 - -平衡二叉查找树其实有很多种,但是我们一般听到的基本都是红黑树。红黑树的英文是`“Red-Black Tree”`,简称 `R-B Tree`。它是一种不严格的平衡二叉查找树。 - -顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求: - -+ 根节点是黑色的; -+ 每个叶子节点都是黑色的空节点(`NIL`),也就是说,叶子节点不存储数据; -+ 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; -+ 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点; - -![红黑树实例](../../data/images/rb_tree.png) - -### 三,为什么说红黑树是“近似平衡”的? - -二叉查找树很多操作的性能都和树的高度成正比,一颗极其平衡的二叉树(满二叉树或完全二叉树)的高度大约是 $log_2{n}$,要证明红黑树是近似平衡的,只要推导出红黑树的高度近似 $log_2{n}$。 - -**首先,将红色节点从红黑树中去掉,分析单纯包含黑色节点的红黑树高度**。 - -红色节点删除后,有些节点就没有父节点了,它们会直接拿这些节点的祖父节点(父节点的父节点)作为父节点。所以,之前的二叉树就变成了四叉树。 - -前面红黑树的定义里有这么一条:从任意节点到可达的叶子节点的每个路径包含相同数目的黑色节点。我们从四叉树中取出某些节点,放到叶节点位置,四叉树就变成了完全二叉树。所以,仅包含黑色节点的四叉树的高度,比包含相同节点个数的完全二叉树的高度还要小。 - -完全二叉树的高度近似 $log_2{n}$,这里的四叉“黑树”的高度要低于完全二叉树,所以去掉红色节点的“黑树”的高度也不会超过 $log_2{n}$。 - -**最后,知道了只包含黑色节点的“黑树”的高度后,再分析吧红色节点加回去后的树高度**。 - -在红黑树中,红色节点不能相邻,也就是说,有一个红色节点就要至少有一个黑色节点,将它跟其他红色节点隔开。红黑树中包含最多黑色节点的路径不会超过 $log_2{n}$,所以加入红色节点之后,最长路径不会超过 $2log_2{n}$,也就是说,红黑树的高度近似 $2log_2{n}$。 - -所以,红黑树的高度只比高度平衡的 AVL 树的高度($log_2{n}$)仅仅大了一倍,在性能上,下降得并不多。这样推导出来的结果不够精确,实际上红黑树的性能更好。 - -### 内容总结 - -红黑树是一种平衡二叉查找树。它是为了解决普通二叉查找树在数据更新的过程中,复杂度退化的问题而产生的。红黑树的高度近似 $log_2{n}$,所以它是近似平衡,插入、删除、查找操作的时间复杂度都是 $O(logn)$。 - -因为红黑树是一种性能非常稳定的二叉查找树,所以,在工程中,但凡是用到动态插入、删除、查找数据的场景,都可以用到它。不过,它实现起来比较复杂,如果自己写代码实现,难度会有些高,这个时候,其实更倾向**用跳表来替代它**。 - -### 参考资料 - -[《数据结构与算法之美》-红黑树(上)](https://time.geekbang.org/column/article/68638) \ No newline at end of file diff --git a/3-data_structure-algorithm/two_pointers/57.1-twoSum.cpp b/3-data_structure-algorithm/two_pointers/57.1-twoSum.cpp deleted file mode 100644 index 9ead281f..00000000 --- a/3-data_structure-algorithm/two_pointers/57.1-twoSum.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// 剑指 Offer 57. 和为s的两个数字。 -// 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 -// 解题思路:1,双指针法。 - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - // 双指针法,时间复杂度O(n) - vector twoSum(vector& nums, int target) { - vector ret; - int i = 0, j = nums.size()-1; - while(i nums[j]) i += 1; - else if(target-nums[i] < nums[j]) j -= 1; - else{ - ret.push_back(nums[i]); - ret.push_back(nums[j]); - break; - } - } - return ret; - } - // 两个 for 循环暴力遍历法,时间会超过 -}; - -/* -* 打印一维向量(矩阵)的元素 -*/ -void print_vector(vector arr) { - cout << "The size of array is " << arr.size() << endl; - // 迭代器遍历 - // vector>::iterator iter; - for (auto iter = arr.cbegin(); iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - } - // cout << "print success" << endl; -} - -int main(){ - vector input = {2,7,11,15}; - int target = 9; - Solution solution; - auto ret = solution.twoSum(input, target); - print_vector(ret); // [2, 7] -} \ No newline at end of file diff --git a/3-data_structure-algorithm/two_pointers/57.2-findContinuousSequence.cpp b/3-data_structure-algorithm/two_pointers/57.2-findContinuousSequence.cpp deleted file mode 100644 index bd3a3e14..00000000 --- a/3-data_structure-algorithm/two_pointers/57.2-findContinuousSequence.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// 剑指 Offer 57 - II. 和为s的连续正数序列 -// 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 -// 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 - - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -class Solution { -public: - // 暴力遍历法 - vector> findContinuousSequence(int target) { - vector> m; - for(int i = 1; i < target; i++){ - vector v; - int sum = 0; - for(int j=i;j> findContinuousSequence(int target) { - vector> m; vector v; - int sum = 0, i=1, j=1; - int limit = (target-1)/2; - while(i <= limit){ - if(sum < target){ // 右边界向右移动 - sum += j; - j++; - } - else if(sum > target){ // 左边界向右移动 - sum -= i; - i++; - } - else{ - for(int k=i; k arr) { - cout << "The size of array is " << arr.size() << endl; - // 迭代器遍历 - // vector>::iterator iter; - for (auto iter = arr.cbegin(); iter != arr.cend(); ++iter) - { - cout << (*iter) << " "; - } - // cout << "print success" << endl; -} - -void print_matrix(vector> matrix){ - /*打印二维向量(矩阵)的元素 - */ - cout << "The size of matrix is" << "(" << matrix.size() << ", " << matrix[0].size() << ")" << std::endl; - //迭代器遍历 - for(auto iter=matrix.cbegin();iter != matrix.cend(); ++iter) - { - for(int i = 0;i<(*iter).size();i++){ - cout << (*iter)[i] << " "; - } - cout << std::endl; - } - cout << "print success" << endl; -} - -int main(){ - int target = 9; - Solution solution; - auto ret = solution.findContinuousSequence(target); - print_matrix(ret); // -} \ No newline at end of file diff --git a/3-data_structure-algorithm/two_pointers/58.2-reverseLeftWords.cpp b/3-data_structure-algorithm/two_pointers/58.2-reverseLeftWords.cpp deleted file mode 100644 index d009bcc7..00000000 --- a/3-data_structure-algorithm/two_pointers/58.2-reverseLeftWords.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// 剑指 Offer 58 - II. 左旋转字符串 - -// 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。 -// 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - - -class Solution { -public: - // 字符串切片1,时间和空间复杂度都为O(n) - string reverseLeftWords2(string s, int n) { - if (s.empty()) return s; - auto s1 = s.substr(n); - for(int i=0; i -#include -#include -#include -#include -#include -#include - -using namespace std; -class Solution { -public: - string reverseWords(string s) { - vector ret; - string temp = ""; // 存放临时字符串 - s += ' '; - for (char c : s) { - if (c == ' ') { - if (!temp.empty()) { - ret.push_back(temp); - temp.clear(); - } - } - else { - temp += c; - } - } - reverse(ret.begin(), ret.end()); - string words = ""; - for (auto word : ret) { - words += word + " "; - } - words.pop_back(); - return words; - } -}; - -int main() { - string s = "the sky is blue"; - Solution solution; - auto ret = solution.reverseWords(s); - cout << ret << endl; -} \ No newline at end of file diff --git a/3-data_structure-algorithm/two_pointers/README.md b/3-data_structure-algorithm/two_pointers/README.md deleted file mode 100644 index 2f665370..00000000 --- a/3-data_structure-algorithm/two_pointers/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### 双指针算法 - -双指针从广义上来说,是指用两个变量在线性结构上遍历而解决的问题。狭义上说, - -+ 对于数组,指两个变量在数组上相向移动解决的问题; -+ 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。 - -双指针算法是基于暴力解法的优化。 - -### 一些思考 - -感觉和栈、队列和堆有关的题目,如果有必要定义一个数据结构,那么则最好是单调的,比如单调递减队列。 \ No newline at end of file diff --git "a/3-data_structure-algorithm/\345\211\221\346\214\207offer\351\242\230\350\247\243c++\347\211\210.md" "b/3-data_structure-algorithm/\345\211\221\346\214\207offer\351\242\230\350\247\243c++\347\211\210.md" deleted file mode 100644 index b751229a..00000000 --- "a/3-data_structure-algorithm/\345\211\221\346\214\207offer\351\242\230\350\247\243c++\347\211\210.md" +++ /dev/null @@ -1,2512 +0,0 @@ -- [前言](#前言) -- [一,常见数据结构](#一常见数据结构) - - [1,数组](#1数组) - - [3-找出数组中重复的数字](#3-找出数组中重复的数字) - - [4-二维数组中的查找](#4-二维数组中的查找) - - [5-替换空格](#5-替换空格) - - [29-顺时针打印矩阵](#29-顺时针打印矩阵) - - [leetcode 989-数组形式的整数加法](#leetcode-989-数组形式的整数加法) - - [leetcode26-删除有序数组中的重复项](#leetcode26-删除有序数组中的重复项) - - [leetcode35-搜索插入位置](#leetcode35-搜索插入位置) - - [2,链表](#2链表) - - [6-从尾到头打印单链表](#6-从尾到头打印单链表) - - [18.1-删除链表的节点](#181-删除链表的节点) - - [18.2 删除链表中重复的节点](#182-删除链表中重复的节点) - - [22-链表中倒数第k个节点](#22-链表中倒数第k个节点) - - [23-链表中环的入口结点](#23-链表中环的入口结点) - - [24-反转一个单链表](#24-反转一个单链表) - - [52-两个链表的第一个公共节点](#52-两个链表的第一个公共节点) - - [leetcode 61-旋转链表](#leetcode-61-旋转链表) - - [leetcode 24-两两交换链表中的节点](#leetcode-24-两两交换链表中的节点) - - [leetcode876-链表的中间节点](#leetcode876-链表的中间节点) - - [3,栈队列堆](#3栈队列堆) - - [9-用两个栈实现队列](#9-用两个栈实现队列) - - [30-包含 min 函数的栈](#30-包含-min-函数的栈) - - [31-栈的压入、弹出序列](#31-栈的压入弹出序列) - - [40-最小的 K 个数](#40-最小的-k-个数) - - [41.1-数据流中的中位数](#411-数据流中的中位数) - - [41.2-字符流中第一个不重复的字符](#412-字符流中第一个不重复的字符) - - [59-滑动窗口的最大值](#59-滑动窗口的最大值) - - [59.2-队列的最大值](#592-队列的最大值) - - [leetcode 768-最多能完成排序的块 II](#leetcode-768-最多能完成排序的块-ii) - - [leetcode 215. 数组中的第K个最大元素](#leetcode-215-数组中的第k个最大元素) - - [4,字符串](#4字符串) - - [leetcode 58-最后一个单词的长度](#leetcode-58-最后一个单词的长度) - - [leetcode 557-反转字符串中的单词 III](#leetcode-557-反转字符串中的单词-iii) - - [leetcode 1805-字符串中不同整数的数目](#leetcode-1805-字符串中不同整数的数目) - - [leetcode 1816-截断句子](#leetcode-1816-截断句子) - - [leetcode 394-字符串解码](#leetcode-394-字符串解码) - - [leetcode 821-字符的最短距离](#leetcode-821-字符的最短距离) - - [5,哈希表](#5哈希表) - - [50-第一个只出现一次的字符位置](#50-第一个只出现一次的字符位置) - - [leetcode 146-LRU 缓存机制](#leetcode-146-lru-缓存机制) - - [leetcode 30-串联所有单词的子串](#leetcode-30-串联所有单词的子串) - - [leetcode](#leetcode) - - [6,二叉树](#6二叉树) - - [07-重建二叉树](#07-重建二叉树) - - [leetcode 104-二叉树的最大深度](#leetcode-104-二叉树的最大深度) - - [55.2-平衡二叉树](#552-平衡二叉树) - - [leetcode 109-有序链表转换二叉搜索树](#leetcode-109-有序链表转换二叉搜索树) - - [7,图](#7图) -- [二,算法](#二算法) - - [1,递归](#1递归) - - [10-1. 斐波那契数列](#10-1-斐波那契数列) - - [2,二分查找](#2二分查找) - - [3,排序](#3排序) - - [4,贪心](#4贪心) - - [63-股票的最大利润](#63-股票的最大利润) - - [5,分治](#5分治) - - [6,回溯](#6回溯) - - [7,动态规划](#7动态规划) - - [10.2-青蛙跳台阶问题](#102-青蛙跳台阶问题) - - [42-连续子数组的最大和](#42-连续子数组的最大和) - - [47-礼物的最大价值](#47-礼物的最大价值) - - [48-最长不含重复字符的子字符串](#48-最长不含重复字符的子字符串) - - [66-构建乘积数组](#66-构建乘积数组) - -## 前言 - -本文是作者对《剑指 offer》书籍试题的补充,并给出了较为详细算法题解和 `C++` 代码实践。离线 `pdf` 版本最近更新时间为 `2021-10-9`,最新版本请参考`Github` [在线文档](https://github.com/HarleysZhang/cv_note/blob/master/3-data_structure-algorithm/%E5%89%91%E6%8C%87offer%E9%A2%98%E8%A7%A3c%2B%2B%E7%89%88.md?spm=a2c6h.12873639.article-detail.71.6dd34c58DnHzLp&file=%E5%89%91%E6%8C%87offer%E9%A2%98%E8%A7%A3c%2B%2B%E7%89%88.md)。 - -## 一,常见数据结构 - -### 1,数组 - -#### 3-找出数组中重复的数字 - -[剑指 Offer 03. 数组中重复的数字](https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/) - -在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 - -**解题方法**: - -1. 直接排序,然后遍历,思路很简单但是执行起来比较麻烦 -2. 哈希表,就是找另一个数组,把 nums 的元素一个一个放进去,放进去之前判断里面有没有,如果里面已经有了那就遇到重复元素,结束。 -3. 原地置换。思路是重头扫描数组,遇到下标为 i 的数字如果不是 i 的话(假设为m), 那么我们就拿与下标 m 的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回 ture。 - -示例 1: -```bash -输入: -[2, 3, 1, 0, 2, 5, 3] -输出:2 或 3 -``` - -限制: - -$2 <= n <= 100000$ - -**C++代码**: - -```cpp -class Solution { -private: - void swap(int &a, int &b) - { - int temp = a; - a = b; - b = temp; - } -public: - /** - * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 - * @param numbers int整型vector - * @return int整型 - */ - // 哈希表法 - int duplicate(vector& numbers) { - // write code here - multiset set1; - for(auto i: numbers){ - set1.insert(i); - if (set1.count(i) > 1) - return i; - } - return -1; - } - // 原地置换法 - int findRepeatNumber(vector& numbers) { - int n = numbers.size(); - for(int i=0; i>& matrix, int target) { - if(matrix.size() == 0) - return false; - int rows = matrix.size(); - int cols = (*matrix.begin()).size(); - int r = 0, c = cols -1; // 从右上角开始 - while(r<=rows-1 && c >= 0){ - if(target == matrix[r][c]) - return true; - else if(target > matrix[r][c]) - r++; - else - c--; - } - return false; - } -}; -``` - -#### 5-替换空格 - -[剑指 offer 05. 替换空格](https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof) - -请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 - -示例 1: -```shell -输入:s = "We are happy." -输出:"We%20are%20happy." -``` - -限制:`0 <= s 的长度 <= 10000` - -**解题方法**: -题解:双指针法: p2 指针指向扩容之后的 string 最后一位,p1 指向原指针最后一位,遍历指针,如果 p1 遇到空格,就将 p2 向前移动三次并赋值为'%20',没有,则将 p1 字符赋值给 p2 字符。 - -**C++代码**: - -```cpp - -class Solution { -public: - string replaceSpace(string s) { - int count = 0, len = s.size(); - for(char& c:s){ - if(c == ' ') count++; - } - s.resize(len + 2*count); - cout << count; - for(int i = len-1, j=s.size()-1; i printMatrix(vector > matrix) { - // left to right, top to bottom - if(matrix.empty()) return {}; - vector res; - int l = 0, r = matrix[0].size()-1, t = 0, b = matrix.size()-1; - int nums = (r+1) * (b+1); - while(res.size() != nums){ - for(int i=l; i<=r; i++) // 从左往右遍历:行索引不变,列索引增加 - res.push_back(matrix[t][i]); - t++; - for(int j=t; j<=b; j++) // 从上到下遍历:列索引不变,行索引增加 - res.push_back(matrix[j][r]); - r--; - // 检查一次是否遍历完 - if(res.size() == nums) break; - for(int m=r; m>=l; m--) // 从右往左遍历:行索引不变,列索引减少 - res.push_back(matrix[b][m]); - b--; - for(int n=b; n>=t; n--) // 从下往上遍历:列索引不变,行索引减少 - res.push_back(matrix[n][l]); - l++; - } - return res; - } -}; -``` - -#### leetcode 989-数组形式的整数加法 - -[leetcode 989-数组形式的整数加法](https://leetcode-cn.com/problems/add-to-array-form-of-integer) - -对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。 - -给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。 - -示例 1: -```shell -输入:A = [1,2,0,0], K = 34 -输出:[1,2,3,4] -解释:1200 + 34 = 1234 -``` -示例 2: -```shell -输入:A = [2,7,4], K = 181 -输出:[4,5,5] -解释:274 + 181 = 455 -``` - -限制: - -1. 1 <= A.length <= 10000 -2. 0 <= A[i] <= 9 -3. 0 <= K <= 10000 -4. 如果 A.length > 1,那么 A[0] != 0 - -**解题方法**: - -两数相加形式的题目,可用以下加法公式[模板](https://leetcode-cn.com/problems/add-to-array-form-of-integer/solution/989-ji-zhu-zhe-ge-jia-fa-mo-ban-miao-sha-8y9r/)。 - -```shell -当前位 = (A 的当前位 + B 的当前位 + 进位carry) % 10 - -while ( A 没完 || B 没完) - A 的当前位 - B 的当前位 - - 和 = A 的当前位 + B 的当前位 + 进位carry - - 当前位 = 和 % 10; - 进位 = 和 / 10; - -判断是否还有进位 -``` - -复杂度分析: -- 时间复杂度: $O(n)$ -- 空间复杂度: $O(n)$ - -**C++代码**: - -```cpp - -class Solution { -public: // 逐位相加法,使用加法模板 - vector addToArrayForm(vector& num, int k) { - int sum = 0; - int carry = 0; - int n = num.size()-1; - vector res; - while(n >=0 || k != 0){ - int remainder = k % 10; // k 的当前位 - if(n>=0) sum = num[n] + remainder + carry; - else sum = remainder + carry; - carry = sum / 10; // 进位计算 - sum %= 10; // 当前位计算 - res.push_back(sum); - k /= 10; - n -= 1; - } - if(carry != 0) res.push_back(carry); // 判断是否还有进位 - - reverse(res.begin(), res.end()); // 反转数组 - return res; - } -}; -``` - -#### leetcode26-删除有序数组中的重复项 - -[leetcode26-删除有序数组中的重复项](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/) - -给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。 - -不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 - -**解题思路**: - -双指针: - -1. 一个读指针、一个写指针遍历数组; -2. 遇到重复的元素,读指针继续前进,写指针不做操作; -3. 遇到不同的元素,写指针前进一步,并写入那个元素。 - -```cpp -class Solution { -public: - // 双指针法 - int removeDuplicates(vector& nums) { - if (nums.empty()) return 0; - int r=0, w = 0; - // int n = nums.size(); // 数组长度 - while(r < nums.size()){ - if(nums[r] != nums[w]){ - w++; - nums[w] = nums[r]; - } - r += 1; - } - return w+1; - } - int removeDuplicates2(vector& nums) { - if (nums.empty()) return 0; - int duplicatedNum = nums[0]; - int j=0; - for(int i=1;i& nums, int target) { - int low = 0, high = nums.size()-1; - while( low <= high){ - int mid = low+(high-low)/2; //mid = low+((high-low)>>1) - // int mid = (low+high)/2; - if( nums[mid] == target ) return mid; - else if (target < nums[mid]) high = mid - 1; - else low = mid + 1; - } - return low; - } -}; -``` - -### 2,链表 - -#### 6-从尾到头打印单链表 - -[剑指 offer 6: 从尾到头打印单链表](https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/) - -输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 - -示例 1: -```shell -输入:head = [1,3,2] -输出:[2,3,1] -``` - -限制:`0 <= 链表长度 <= 10000` - -**解题方法**: - -使用栈的思想(Python 用 list 模拟栈, pop 弹出栈头元素),栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中,最后出栈的顺序即为逆序。注意和 C 语言不同,C++ 的结构体可以有构造函数! - -**C++代码**: - -```cpp -class Solution{ -public: - vector reversePrint(ListNode* head) { - stack values; // 创建一个不包含任何元素的 stack 适配器,并采用默认的 deque 基础容器: - vector result; - while (head != nullptr){ - values.push(head->val); - head = head->next; - } - while(!values.empty()){ - result.push_back(values.top()); - values.pop(); - } - return result; - } -}; -``` - -#### 18.1-删除链表的节点 - -[剑指 Offer 18.1 删除链表的节点](https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/) - -给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。(注意:此题对比原题有改动) - -示例 1: -```shell -输入: head = [4,5,1,9], val = 5 -输出: [4,1,9] -解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. -``` -示例 2: -```shell -输入: head = [4,5,1,9], val = 1 -输出: [4,5,9] -解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. -``` - -说明: -- 题目保证链表中节点的值互不相同 -- 若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点 - -**解题思路**: - -1. 定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。 -2. 修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。 - -**C++代码**: - -```cpp -class Solution { -public: - ListNode* deleteNode(ListNode* head, int val) { - if(head->val == val) return head -> next; - ListNode* pre = head; ListNode* cur = head->next; - while(cur != nullptr && cur->val != val) { - pre = cur; - cur = cur->next; - } - pre->next = cur->next; - return head; - } -}; -``` - -#### 18.2 删除链表中重复的节点 - -[剑指 Offer 18.2 删除链表中重复的节点]() - -题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 - -**解题方法:** - -迭代解法 - -**C++代码**: - -```cpp -class Solution { -public: - ListNode* deleteDuplication(ListNode* head) { - ListNode *vhead = new ListNode(-1); - vhead->next = head; - ListNode* pre = vhead,*cur = head; - while(cur){ - if(cur->next && cur->val==cur->next->val){ - cur = cur->next; - while(cur->next && cur->val == cur->next->val){ - cur = cur->next; - } - cur = cur -> next; - pre->next = cur; - } - else{ - pre = cur; - cur = cur->next; - } - } - return vhead->next; - } -}; -``` - -#### 22-链表中倒数第k个节点 - -[剑指 Offer 22. 链表中倒数第k个节点](https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof) - -输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 - -例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。 - -示例: - -```shell -给定一个链表: 1->2->3->4->5, 和 k = 2. -返回链表 4->5. -``` - -**解题方法:** - -双指针法。不用统计链表长度。前指针 former 先向前走 k 步。 - -**C++代码**: - -```cpp - -// Definition for singly-linked list. -struct ListNode { - int val; - ListNode *next; - ListNode(int x) : val(x), next(NULL) {} -}; - -class Solution { -public: - ListNode* getKthFromEnd(ListNode* head, int k) { - ListNode* former = head; - ListNode* latter = head; - for(int i=0;inext; - } - while(former != NULL){ - former = former->next; - latter = latter->next; - } - return latter; - } -}; -``` - -#### 23-链表中环的入口结点 - -[链表中环的入口结点](https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github) - -给一个长度为 n 的链表,若其中包含环,请找出该链表的环的入口结点,否则,返回 null。 - -- 输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表 -- 返回值描述:返回链表的环的入口结点即可。而我们后台程序会打印这个节点 - -示例1: - -```shell -输入:{1,2},{3,4,5} -返回值:3 -说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3 -``` - -**解题思路:** - -**采用双指针解法**,一快一慢指针。快指针每次跑两个element,慢指针每次跑一个。如果存在一个圈,总有一天,快指针是能追上慢指针的。 - -**C++代码**: - -```cpp -class Solution { -public: - ListNode* EntryNodeOfLoop(ListNode* pHead) { - ListNode* fast = pHead; - ListNode* slow = pHead; - - while( fast && fast->next) { // 找到 fast 指针和 slow 指针相遇位置 - fast = fast->next->next; - slow = slow->next; - if(fast == slow ) break; - } - if (!fast || !fast->next) return nullptr; - fast = pHead; // fast 指针指向头节点,slow 指针原地不变 - while(fast != slow ) { // 两个指针重新相遇于环的入口点 - fast = fast->next; - slow = slow->next; - } - return fast; - } -}; -``` - -#### 24-反转一个单链表 - -[剑指 offer 24: 反转一个单链表](https://leetcode-cn.com/problems/reverse-linked-list/) - -给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 - -示例1: -```shell -输入:head = [1,2,3,4,5] -输出:[5,4,3,2,1] -``` - -**解题思路:** - -双指针迭代法。 - -**C++代码**: - -```cpp -class Solution { -public: // 双指针迭代法 - ListNode* reverseList(ListNode* head) { - // 判断链表为空或长度为1的情况 - if(head == nullptr || head->next == nullptr){ - return head; - } - ListNode* pre = nullptr; // 当前节点的前一个节点 - ListNode* next = nullptr; // 当前节点的下一个节点 - while( head != nullptr){ - next = head->next; // 记录当前节点的下一个节点位置; - head->next = pre; // 让当前节点指向前一个节点位置,完成反转 - pre = head; // pre 往右走 - head = next;// 当前节点往右继续走 - } - return pre; - } -}; -``` - -#### 52-两个链表的第一个公共节点 - -[剑指 offer 52: 两个链表的第一个公共节点](https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/) - -输入两个链表,找出它们的第一个公共节点。 - -**解题方法**: - -1,**双指针法**:设节点指针 A 指向头节点 headA, 节点指针 B 指向头节点 headB。 - -1. A 先遍历完链表 headA,然后遍历 headB; -2. B 先遍历完链表 headB,然后遍历 headA; - -只要有公共节点,总路程数,或者说 A 经过的节点数和 B 经过的节点数是一样的, -如果没有公共节点,只有当 A 和 B都变成了 nullptr的时候,两者最终走的路程才是一样的。 -然后只需比较 A和 B是否相等,相等的那个位置即为公共节点,因为此使,两者走的步数开始相等了。 - -2,**栈特性解法**。两个链表从公共结点开始后面都是一样的,顺着链表从后向前查找,很容易就能查找到链表的公共结点(第一个不相同的结点的下一个结点即所求);而从后向前的特性自然联想到栈。 - -3,**哈希表法**。 - -复杂度分析: - -- 时间复杂度:O(n) -- 空间复杂度:O(1) - -**C++代码**: - -```cpp -class Solution { -public: - // 双指针法 - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - ListNode* A = headA; - ListNode* B = headB; - while(A != B){ - if(A != nullptr) A = A->next; - else A = headB; - if (B != nullptr) B = B->next; - else B = headA; - } - return A; - } - // 哈希表法,哈希表中存储链表节点指针 - ListNode *getIntersectionNode2(ListNode *headA, ListNode *headB) { - unordered_set visited; - ListNode* temp = headA; - while(temp != nullptr){ - visited.insert(temp); - temp = temp -> next; - } - temp = headB; - while(temp != nullptr){ - // count 方法判断哈希表中是否存在 temp 关键字 - if(visited.count(temp)) return temp; - else temp = temp -> next; - } - return nullptr; - } - // vector 法,vector 中元素为链表节点指针 - ListNode *getIntersectionNode3(ListNode *headA, ListNode *headB) { - vector visited; - ListNode* temp = headA; - while(temp != nullptr){ - visited.push_back(temp); - temp = temp -> next; - } - temp = headB; - while(temp != nullptr){ - // find 函数查找 vector 中是否存在 temp 元素 - if(visited.end() != find(visited.begin(), visited.end(), temp)) return temp; - else temp = temp -> next; - } - return nullptr; - } - // 栈特性解法 - ListNode *getIntersectionNode4(ListNode *headA, ListNode *headB) { - ListNode *l1 = headA; - ListNode *l2 = headB; - stack st1, st2; - while(headA != nullptr){ - st1.push(headA); - headA = headA->next; - } - while(headB != nullptr){ - st2.push(headB); - headB = headB->next; - } - ListNode* ans = nullptr; - while(!st1.empty()&&!st2.empty()&&st1.top()==st2.top()){ - ans = st1.top(); - st1.pop(); - st2.pop(); - } - return ans; - } -}; -``` - -#### leetcode 61-旋转链表 - -[leetcode 61-旋转链表](https://leetcode-cn.com/problems/rotate-list/) - -给你一个链表的头节点 head,旋转链表,将链表每个节点向右移动 k 个位置。 - -示例1 - -```shell -输入:head = [1,2,3,4,5], k = 2 -输出:[4,5,1,2,3] -``` - -**解题思路:** - -将原来的链表首尾相连变成环,然后找倒数第 k 个点作为新的表头,即原来的表头向右移动 (n-1)-(k%n) 次后断开。 - -**C++代码**: - -```cpp -class Solution { -public: - ListNode* rotateRight(ListNode* head, int k) { - if (k == 0 || head == nullptr || head->next == nullptr) { - return head; - } - ListNode* cur = head; - int n = 1; - while(cur -> next != nullptr){ - cur = cur -> next; - n += 1; - } - cur -> next = head; // 将链表首尾相连变成环 - cur = head; - int move = (n-1)-(k % n); - while(move--){ - cur = cur -> next; - } - ListNode* ret = cur -> next; - cur -> next = nullptr; // cur 向右移动 move 次后,断掉连接 - return ret; - } -}; -``` -#### leetcode 24-两两交换链表中的节点 - -[leetcode 24. 两两交换链表中的节点](https://leetcode-cn.com/problems/swap-nodes-in-pairs/) - -给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 - -**解题思路:** - -1,迭代法:关键是高清如何交换两个相邻节点,然后迭代交换即可。 - -复杂度分析: - -- 时间复杂度:O(n) -- 空间复杂度:O(1) - -**C++代码**: - -```cpp -class Solution { -public: - ListNode* swapPairs(ListNode* head) { - if(head == nullptr) return nullptr; - else if(head->next == nullptr) return head; - ListNode* temp = new ListNode(-1); - temp ->next = head; - ListNode* pre = temp; - while(pre->next != nullptr && pre->next->next != nullptr) { - - ListNode* cur = pre->next; - ListNode* next = pre->next->next; - - pre->next = cur->next; - cur->next = next->next; - next->next = cur; - pre = cur; - } - return temp->next; - } -}; -``` - -#### leetcode876-链表的中间节点 - -[leetcode 876. 链表的中间结点](https://leetcode-cn.com/problems/middle-of-the-linked-list/) - -给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 - -**解题方法:** - -1. 数组法。 -2. **快慢指针法**:用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。值得注意的是,**快指针可以前进的前提是当前快指针和当前快指针的下一个节点非空**。 - -```cpp -class Solution { -public: - ListNode* middleNode(ListNode* head) { - ListNode* slow = head; - ListNode* fast = head; - while(fast && fast->next){ - slow = slow->next; - fast = fast->next->next; - } - return slow; - } -}; -``` - -### 3,栈队列堆 - -#### 9-用两个栈实现队列 - -[剑指 offer 面试题9](https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/) - -用两个栈实现队列, 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 - -**解题思路**: - -- in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。 -- 当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。 - -**C++代码**: - -```cpp -class Solution -{ -public: - void push(int node) { - stack1.push(node); - } - int pop() { - int res; - if(stack2.empty()){ - while(!stack1.empty()){ - int temp = stack1.top(); - stack1.pop(); - stack2.push(temp); - } - } - res = stack2.top(); - stack2.pop(); - return res; - } - -private: - stack stack1; - stack stack2; -}; -``` - -#### 30-包含 min 函数的栈 - -[30-包含 min 函数的栈](https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/) - -定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 - -**解题思路:** - -- 数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。 -- 辅助栈 B : 栈 B 中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 B 的栈顶元素即可。 - -**C++代码**: - -```cpp -class MinStack { // 利用辅助栈 -private: - stack stack1; - stack stack2; -public: - /** initialize your data structure here. */ - MinStack() { - - } - void push(int x) { - stack1.push(x); - if (stack2.empty()) { - stack2.push(x); - } - else { - if (x < stack2.top()) { - stack2.push(x); - } - else { - stack2.push(stack2.top()); - } - } - } - void pop() { - stack1.pop(); - stack2.pop(); - } - - int top() { - return stack1.top(); - } - - int min() { - return stack2.top(); - } -}; -``` - -#### 31-栈的压入、弹出序列 - -[31-栈的压入、弹出序列](https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof) - -输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 `{1,2,3,4,5}` 是某栈的压栈序列,序列 `{4,5,3,2,1}` 是该压栈序列对应的一个弹出序列,但 `{4,3,5,1,2}` 就不可能是该压栈序列的弹出序列。 - -示例 1: -```shell -输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] -输出:true -解释:我们可以按以下顺序执行: -push(1), push(2), push(3), push(4), pop() -> 4, -push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1 -``` - -示例 2: -```shell -输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] -输出:false -解释:1 不能在 2 之前弹出。 -``` - -提示: -1. 0 <= pushed.length == popped.length <= 1000 -2. 0 <= pushed[i], popped[i] < 1000 -3. pushed 是 popped 的排列。 - -**解题思路:** - -**C++代码实现**: - -```cpp -// 剑指offer31: 栈的压入、弹出序列 -class Solution { // 辅助栈解法,时间超过 77.62%,空间超过 74.84% -public: - bool validateStackSequences(vector& pushed, vector& popped) { - int k = 0; - stack st; - for(int i=0; i // 默认定义最大堆 -// priority_queue, greater >p; // 定义最小堆 - -class Solution { -public: - // // stl 自带的 sort() 排序算法 - vector getLeastNumbers1(vector& arr, int k) { - vector ret(k, 0); - sort(arr.begin(), arr.end()); - for(int i=0;i getLeastNumbers2(vector& arr, int k) { - vector vec(k,0); - if(k==0) - return vec; - priority_queue heap; // 大顶堆,堆顶为最大值 - for(int i=0;i<(int)arr.size();i++){ - if(i arr[i]){ // 使用大顶堆来维护最小堆 - heap.pop(); - heap.push(arr[i]); - } - } - } - for(int i=0;i getLeastNumbers(vector& arr, int k) { - vector vec(k,0); - if(k==0) - return vec; - priority_queue, greater > heap; // 小顶堆,堆顶为最小值 - priority_queue heap2; // 大顶堆,堆顶为最大值 - for(int i=0;i<(int)arr.size();i++){ - heap.push(arr[i]); - } - for(int i=0;i right; // 大顶堆,堆顶为最大值 - priority_queue, greater > left; // 小顶堆,堆顶为最小值 - -public: - /** initialize your data structure here. */ - MedianFinder() { - - } - void addNum(int num) { - // 插入数据要始终保持两个堆处于平衡状态,即较大数在左边,较小数在右边 - // 两个堆元素个数不超过 1 - if(left.size() == right.size()){ - right.push(num); - left.push(right.top()); // 保证左边堆插入的元素始终是右边堆的最大值 - right.pop(); // 删除堆顶元素 - } - else{ - left.push(num); - right.push(left.top()); - left.pop(); - } - } - double findMedian() { - if(left.size() == right.size()) return (left.top() + right.top())*0.5; - else return left.top()*1.0; - } -}; -``` - -#### 41.2-字符流中第一个不重复的字符 - -[41.2-字符流中第一个不重复的字符](https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/) - -请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数 -> string caseout = ""; -1.读入测试用例字符串 casein -2.如果对应语言有 Init()函数的话,执行 Init() 函数 -3.循环遍历字符串里的每一个字符ch { -Insert(ch); -caseout += FirstAppearingOnce() -} -> 4. 输出 caseout,进行比较 - -返回值描述: - -如果当前字符流没有存在出现一次的字符,返回 `#` 字符。 - -**解题思路**(参考牛客网题解): - -1. 对于“重复问题”,惯性思维应该想到哈希或者set。对于“字符串问题”,大多会用到哈希。因此一结合,应该可以想到,判断一个字符是否重复,可以选择用哈希,在 `c++` 中,可以选择用 `unordered_map`。 -2. 对于字符流,源源不断的往池子中添加字符,然后还要返回第一个满足什么条件的字符,显然设计到了“顺序”,也就是先来的先服务,这种先进先出的数据结构不就是队列嘛。因此,这里可以用队列 `queue`。 - -**算法过程**如下: - -1. 初始化一个哈希表 `unordered_map mp` 和队列 `queue q`。 -2. 对于 `void Insert(char ch)` 字符插入函数的实现,当且仅当 `ch` 是第一次出现,则将 `ch` 添加到队列中;同时,不管 `ch` 是不是第一次出现,都需要在 `mp` 中更新一下字符的出现次数,方便后续判断字符是否是第一次出现。 -3. 对于 `char FirstAppearingOnce()` 函数,通过哈希表 `mp` 判断队列 `q` 的头部元素的出现次数,如果是 `1` 则返回对应字符 `ch`;如果不是 `1`,则队列 `pop()` 弹出头部元素继续判断下一个字符。 - -```cpp -class Solution -{ -public: - //Insert one char from stringstream - queue q; - unordered_map mp; - void Insert(char ch) - { - // 如果是第一次出现,则添加到队列中 - if (mp.find(ch) == mp.end()) { - q.push(ch); - } - // 不管是不是第一次出现,都进行计数 - ++mp[ch]; - } - // return the first appearence once char in current stringstream - char FirstAppearingOnce() - { - while (!q.empty()) { - char ch = q.front(); - // 拿出头部,如果是第一次出现,则返回 - if (mp[ch] == 1) { - return ch; - } - // 不是第一次出现,则弹出,然后继续判断下一个头部 - else { - q.pop(); - } - } - return '#'; - } -}; -``` - -#### 59-滑动窗口的最大值 - -[剑指offer 59-滑动窗口的最大值](https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/) - -给定一个数组 `nums` 和滑动窗口的大小 `k`,请找出所有滑动窗口里的最大值。 - -示例: - -```shell -输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 -输出: [3,3,5,5,6,7] -解释: - - 滑动窗口的位置 最大值 ---------------- ----- -[1 3 -1] -3 5 3 6 7 3 - 1 [3 -1 -3] 5 3 6 7 3 - 1 3 [-1 -3 5] 3 6 7 5 - 1 3 -1 [-3 5 3] 6 7 5 - 1 3 -1 -3 [5 3 6] 7 6 - 1 3 -1 -3 5 [3 6 7] 7 -``` - -**解题方法:** - -1. 对于每个滑动窗口,可以使用 O(k) 的时间遍历其中的每一个元素,找出其中的最大值。对于长度为 n 的数组 nums 而言,窗口的数量为 n-k+1,算法的时间复杂度为 $O((n-k+1)\ast k)=O(n\ast k)$。 -2. 维护单调递减的双端队列!如果发现队尾元素小于要加入的元素,则将队尾元素出队,直到队尾元素大于新元素时,再让新元素入队,从而维护一个单调递减的队列。 - -**C++代码**: - -```cpp -class Solution { -public: - // 简单方法:遍历滑动窗口找最大值,合理选择区间,时间超出限制 - vector maxSlidingWindow2(vector& nums, int k) { - vector ret; - if (nums.size() == 0 && k == 0) return ret; - for (int i = 0; i <= nums.size() - k; i++) { - int maxNum = nums[i]; - for (int j = i; j < (i + k); j++) { - if (nums[j] > maxNum) - maxNum = nums[j]; - } - ret.push_back(maxNum); - } - return ret; - } - // 维护一个单调队列,队头是最大值 - vector maxSlidingWindow(vector& nums, int k) { - vector ret; - deque window; // 创建双端队列,单调递减的队列 - // 先将第一个窗口的值按照规则入队 - for (int i = 0; i < k; i++) { - while (!window.empty() && window.back() < nums[i]) { - window.pop_back(); - } - window.push_back(nums[i]); - } - ret.push_back(window.front()); - // 模拟滑动窗口的移动 - for (int j = k; j < nums.size(); j++) { - if (nums[j - k] == window.front()) window.pop_front(); // 移动后窗口的前一个元素等于队头元素 - while (!window.empty() && window.back() < nums[j]) { - window.pop_back(); - } - window.push_back(nums[j]); - ret.push_back(window.front()); - } - return ret; - } -}; -``` - -#### 59.2-队列的最大值 - -[剑指offer 59.2-队列的最大值](https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof) - -请定义一个队列并实现函数 `max_value` 得到队列里的最大值,要求函数 `max_value`、`push_back` 和 `pop_front` 的均摊时间复杂度都是 $O(1)$。 - -若队列为空,`pop_front` 和 `max_value` 需要返回 `-1`。 - -示例 1: - -```shell -输入: -["MaxQueue","push_back","push_back","max_value","pop_front","max_value"] -[[],[1],[2],[],[],[]] -输出: [null,null,null,2,1,2] -``` - -**解题思路:** - -定义一个单调递减的辅助队列(双端队列) - -**C++代码实现**: - -```cpp -class MaxQueue { -private: - queue que1; - deque que2; // 辅助队列,头部位置存放最大值值 -public: - MaxQueue() { - - } - int max_value() { - if(que1.empty()) - return -1; - return que2.front(); - } - void push_back(int value) { - // 维护单调递减队列 - while(!que2.empty() && que2.back() < value){ - que2.pop_back(); // 移除队尾元素直到队尾元素大于新添加元素 - } - - que2.push_back(value); - que1.push(value); - } - int pop_front() { - if(que1.empty()) return -1; - else{ - int ans = que1.front(); - if( ans == que2.front()) que2.pop_front(); - que1.pop(); - return ans; - } - } -}; - -/** - * Your MaxQueue object will be instantiated and called as such: - * MaxQueue* obj = new MaxQueue(); - * int param_1 = obj->max_value(); - * obj->push_back(value); - * int param_3 = obj->pop_front(); - */ -``` - -#### leetcode 768-最多能完成排序的块 II - -[leetcode 768-最多能完成排序的块 II](https://leetcode-cn.com/problems/max-chunks-to-make-sorted-ii/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china) - -这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为 2000,其中的元素最大为 10**8。 - -`arr` 是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块? - -示例 1: -```shell -输入: arr = [5,4,3,2,1] -输出: 1 -解释: -将数组分成2块或者更多块,都无法得到所需的结果。 -例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。 -``` -**解题思路:** - -1,辅助栈法:栈中存放每个块内元素的最大值,栈的 size() 即为最多分块数。 - -题中隐含结论: -- 下一个分块中的所有数字都会大于等于上一个分块中的所有数字,即后面块中的最小值也大于前面块中最大值。 -- 只有分的块内部可以排序,块与块之间的相对位置是不能变的。 -- 直观上就是找到从左到右开始不减少(增加或者不变)的地方并分块。 -- 要后面有较小值,那么前面大于它的都应该在一个块里面。 - -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(1) - -**C++代码**: - -```cpp -class Solution { -public: - int maxChunksToSorted(vector& arr) { - stack ret; // 创建单调栈 - // 单调栈中只保留每个分块的最大值 - for (int i = 0; i < arr.size(); i++) { - // 遇到一个比栈顶小的元素,而前面的块不应该有比 arr[i] 小的 - // 而栈中每一个元素都是一个块,并且栈的存的是块的最大值,因此栈中比 arr[i] 小的值都需要 pop 出来 - if (!ret.empty() && arr[i] < ret.top()) { - int temp = ret.top(); - // 维持栈的单调递增 - while (!ret.empty() && arr[i] < ret.top()) { - ret.pop(); - } - ret.push(temp); - } - else { - ret.push(arr[i]); - } - } - int m = ret.size(); - return m; - } -}; -``` - -#### leetcode 215. 数组中的第K个最大元素 - -[leetcode 215. 数组中的第K个最大元素](https://leetcode-cn.com/problems/kth-largest-element-in-an-array/) - -给定整数数组 `nums` 和整数 $k$,请返回数组中第 $k$ 个最大的元素。 - -请注意,你需要找的是数组排序后的第 $k$ 个最大的元素,而不是第 $k$ 个不同的元素。 - -**解题思路**:小顶堆维护大顶堆的方法 - -维护一个有 k 个元素的最小堆: - -- 如果当前堆不满,直接添加; -- 堆满的时候,如果新读到的数大于堆顶元素,则将堆顶元素弹出,同时将新读到的数放入最小堆中(堆会自己调整内部结构)。 - -**复杂度分析**: -- 时间复杂度:$O(nlogk)$ -- 空间复杂度:$O(k)$ - -```cpp -class Solution { -public: - // 小顶堆维护大顶堆的方法,时间复杂度 O(n logk) - int findKthLargest(vector& nums, int k) { - vector vec(k,0); - // priority_queue heap; // 大顶堆,堆顶为最大值 - priority_queue, greater > heap; // 小顶堆,堆顶为最小值 - - for(int i=0; i < nums.size();i++){ - if(i < k){ // 创建一个大小为 k 的最小堆 - heap.push(nums[i]); - } - else{ - if(heap.top() < nums[i]){ - heap.pop(); - heap.push(nums[i]); - } - } - } - int ret = heap.top(); - return ret; - } -}; -``` - -### 4,字符串 - -#### leetcode 58-最后一个单词的长度 - -[leetcode 58-最后一个单词的长度](https://leetcode-cn.com/problems/length-of-last-word/solution/leetcode58ti-jie-ti-si-lu-by-litao/) - -给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词:是指仅由字母组成、不包含任何空格字符的最大子字符串。 - -**C++代码**: - -```cpp -class Solution { -public: - int lengthOfLastWord(string s) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - if(!temp.empty()){ - res.push_back(temp); - temp.clear(); - } - } - else{ - temp += ch; - } - } - string last_word = res.back(); // 数组最后一个元素 - return last_word.size(); - } -}; -``` - -#### leetcode 557-反转字符串中的单词 III - -[leetcode 557. 反转字符串中的单词 III](https://leetcode-cn.com/problems/reverse-words-in-a-string-iii) - -给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 - -示例: -```shell -输入:"Let's take LeetCode contest" -输出:"s'teL ekat edoCteeL tsetnoc" -``` - -**提示**:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。 - -**C++代码**: - -```cpp -class Solution { -public: - string reverseWords(string s) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - if(!temp.empty()){ - res.push_back(temp); - temp.clear(); - } - } - else{ - temp += ch; - } - } - s.clear(); - for(string &str: res){ - reverse(str.begin(), str.end()); - s += str + ' '; - } - s.pop_back(); - return s; - } -}; -``` - -#### leetcode 1805-字符串中不同整数的数目 - -[leetcode 1805-字符串中不同整数的数目](ttps://leetcode-cn.com/problems/number-of-different-integers-in-a-string/) - -给你一个字符串 `word` ,该字符串由数字和小写英文字母组成。 - -请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123  34 8  34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。 - -返回对 word 完成替换后形成的 不同 整数的数目。只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。 - -示例 1: -```shell -输入:word = "a123bc34d8ef34" -输出:3 -解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。 -``` - -**C++代码**: - -```cpp - -class Solution { -public: - int numDifferentIntegers(string word) { - set s; - word += 'a'; - string temp; // 临时字符串 - for(char ch:word){ - // 如果遇到字母且临时字符串非空,就把它加入集合并重置临时字符串 - if(isalpha(ch)){ - if(!temp.empty()){ - s.insert(temp); - temp.clear(); - } - } - else{ - if(temp == "0") temp.clear(); // "001" 和 "1" 是等值的 - temp += ch; - } - } - return s.size(); - } -}; -``` - -#### leetcode 1816-截断句子 - -[leetcode 1816-截断句子](https://leetcode-cn.com/problems/truncate-sentence) - -句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。 - -例如,"Hello World"、"HELLO" 和 "hello world hello world" 都是句子。给你一个句子 s​​​​​​ 和一个整数 k​​​​​​ ,请你将 s​​ 截断 ​,​​​使截断后的句子仅含 前 k​​​​​​ 个单词。返回 截断 s​​​​​​ 后得到的句子。 - -示例 1: -```shell -输入:s = "Hello how are you Contestant", k = 4 -输出:"Hello how are you" -解释: -s 中的单词为 ["Hello", "how" "are", "you", "Contestant"] -前 4 个单词为 ["Hello", "how", "are", "you"] -因此,应当返回 "Hello how are you" -``` - -**C++代码**: - -```cpp - -class Solution { -public: - string truncateSentence(string s, int k) { - s += ' '; - vector res; // 存放字符串的数组 - string temp; // 临时字符串 - for(char ch:s){ - if(ch == ' '){ - res.push_back(temp); - temp.clear(); - } - else{ - temp += ch; - } - } - s.clear(); - for(int i=0; i< k;i++){ - s += res[i] + ' '; - } - s.pop_back(); - return s; - } -}; -``` - -#### leetcode 394-字符串解码 - -[leetcode 394. 字符串解码](https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/) - -给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 - -你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 - -示例 1: -```shell -输入:s = "3[a]2[bc]" -输出:"aaabcbc" -``` - -**解题思路**: - -本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。 - -复杂度分析: - -- 时间复杂度 O(N): s; -- 空间复杂度 O(N):辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。 - -**C++代码**: - -```cpp -class Solution { -public: - string decodeString(string s) { - stack> s1; - string res = ""; - int num = 0; - for (int i = 0; i < s.size(); i++) { - if (s[i] >= '0' && s[i] <= '9') { - num *= 10; - num += (s[i] - '0'); - } - else if (s[i] == '[') { - s1.push(make_pair(res, num)); - num = 0; - res = ""; - } - else if (s[i] == ']') { - auto cur_num = s1.top().second; - auto latest_res = s1.top().first; - s1.pop(); - for (int j = 0; j < cur_num; j++) latest_res = latest_res + res; // res 加 n 次 - res = latest_res; - } - else { - res += s[i]; - } - } - return res; - } -}; -``` - -#### leetcode 821-字符的最短距离 - -[leetcode 821-字符的最短距离](https://leetcode-cn.com/problems/shortest-distance-to-a-character/) - -给你一个字符串 `s` 和一个字符 `c` ,且 `c` 是 `s` 中出现过的字符。 - -返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 - -两个下标 $i$ 和 $j$ 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。 - -示例 1: -```shell -输入:s = "loveleetcode", c = "e" -输出:[3,2,1,0,1,0,0,1,2,2,1,0] -解释:字符 'e' 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。 -距下标 0 最近的 'e' 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。 -距下标 1 最近的 'e' 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。 -对于下标 4 ,出现在下标 3 和下标 5 处的 'e' 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。 -距下标 8 最近的 'e' 出现在下标 6 ,所以距离为 abs(8 - 6) = 2 -``` - -**解题方法:** - -1,两次遍历 - -- 从左向右遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 i - prev。 -- 从右想做遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 prev - i。 - -2,哈希表法 - -- 获取 s 中所有目标字符 c 的位置,并提前存储在数组 c_indexs 中。 -- 遍历字符串 s 中的每个字符,如果和 c 不相等,就到 c_indexs 中找距离当前位置最近的下标。 - -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(1) - -**C++代码**: - -```cpp -class Solution { -public: // 1,两次遍历法 - vector shortestToChar(string s, char c) { - vector ret; - int prev = -10000; - int distance = 0; - for (int i = 0; i < s.size(); i++) { - if (s[i] == c) prev = i; - distance = i - prev; - ret.push_back(distance); - } - prev = 10000; - for (int i = s.size() - 1; i >= 0; i--) { - if (s[i] == c) prev = i; - distance = prev - i; - ret[i] = min(ret[i], distance); - } - return ret; - } - // 解法2:空间换时间,时间复杂度 O(n*k) - vector shortestToChar2(string s, char c) { - int n = s.size(); - vector c_indexs; - // Initialize a vector of size n with default value 0. - vector ret(n, 0); - - for (int i = 0; i < n; i++) { - if (s[i] == c) c_indexs.push_back(i); - } - - for (int i = 0; i < n; i++) { - int distance = 10000; - if (s[i] == c) ret[i] = 0; - else { - for (int j = 0; j < c_indexs.size(); j++) { - int temp = abs(c_indexs[j] - i); - if (temp < distance) distance = temp; - } - ret[i] = distance; - } - - } - return ret; - } -}; -``` - -### 5,哈希表 - -#### 50-第一个只出现一次的字符位置 - -[剑指offer 题50. 第一个只出现一次的字符位置](https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof) - -在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 - -示例 1: -```shell -输入:s = "abaccdeff" -输出:'b' -``` - -示例 2: -```shell -输入:s = "" -输出:' ' -``` - -限制:`0 <= s 的长度 <= 50000` - -**解题方法**: - -哈希表法。map:基于红黑树,元素有序存储; unordered_map:基于散列表,元素无序存储 - -**C++代码**: - -```cpp -class Solution { -public: - char firstUniqChar(string s) { - unordered_map dic; - for(char c:s){ - dic[c] = dic.find(c) == dic.end(); - } - for(char c:s){ - if(dic[c] == true) - return c; - } - return ' '; - } - - char FirstNotRepeatingChar(string s) { - unordered_map dic; - for(char c:s){ - dic[c] = dic.find(c) == dic.end(); - } - for(int i=0; i cache; - int n; -public: - LRUCache(int capacity) { - n = capacity; - // head、tail 双链表的头尾节点 - head = new Node(-1, -1), tail = new Node(-1, -1); - head -> right = tail; - tail -> left = head; - } - - int get(int key) { - if(!cache.count(key)) return -1; - Node* p = cache[key]; // 通过哈希表定位 key 对应的键值 p - removeNode(p); - addToHead(p); - return p->val; - } - - void put(int key, int value) { - if(cache.count(key)){ - Node* p = cache[key]; - p -> val = value; // 定位双向链表的节点 p,并更新 val - removeNode(p); - addToHead(p); - } - else{ - if(cache.size() == n){ - auto p = tail->left; - removeNode(p); - cache.erase(p->key); // 更新哈希表 - delete p; - } - auto p = new Node(key, value); - addToHead(p); - cache[key] = p; - } - } - void removeNode(Node* p){ // 移除指定节点 p - p->left->right = p->right; - p->right->left = p->left; - } - - void addToHead(Node* p){ // 插入到头节点 L 之后 - p->right = head->right; - p->left = head; - head->right->left = p; - head->right = p; - } -}; - -/** - * Your LRUCache object will be instantiated and called as such: - * LRUCache* obj = new LRUCache(capacity); - * int param_1 = obj->get(key); - * obj->put(key,value); - */ -``` - -#### leetcode 30-串联所有单词的子串 - -[leetcode 30. 串联所有单词的子串](https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/) - -给定一个字符串 `s` 和一些 长度相同 的单词 `words`。找出 `s` 中恰好可以由 `words` 中所有单词串联形成的子串的起始位置。 - -注意子串要与 `words` 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 `words` 中单词串联的顺序。 - -示例 1: -```shell -输入:s = "barfoothefoobarman", words = ["foo","bar"] -输出:[0,9] -解释: -从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。 -输出的顺序不重要, [9,0] 也是有效答案。 -``` - -**解题思路**:**滑动窗口 + 哈希表**。滑动窗口的大小为 $k*len$。 - -1. 从 `words` 出发,考虑 `words` 所有单词排列生成的字符串 `X`,通过字符串匹配查看 `X` 在 `s` 中的出现位置,但是 `X` 的可能情况有 $k!$ 种,$k$ 为 `words` 中单词的个数,明显超时! -2. 从 `s` 串出发,遍历 `s` 串中所有长度为 (words[0].length * words.length) 的子串 `Y`,并判断 `Y` 是否可以由 `words` 数组构造生成。 - -**代码步骤**:首先构建 words 单词出现次数的哈表表,然后滑动窗口移动的时候,每次获取 `len` 长度的子串,**并判断这个子串是否在 words 中**,并构建子串出现次数的哈希表,同时要求子串出现的次数不能大于原来 words 中单词出现的次数。 - -时间复杂度:$O((n-k* len)* k)$,$n$ 是字符串 `s` 的长度,$k$ 是 `words` 中单词的个数,`len` 是每个单词的长度。 - ->这道 hard 题目居然被我做出来了!代码第二次修改参考了西法的剪枝代码,之前自己用嵌套 if 判断实在太傻了。 - -```cpp -class Solution { -public: - vector findSubstring(string s, vector& words) { - unordered_map freq; - // 计算字符串数组中每个单词出现的频率 - for(auto s1: words){ - freq[s1]++; - } - - vector ret; - int len = words[0].size(); - - for(int i=0; i< s.size()-len*words.size()+1; i++){ - int pos = i; - int num = 1; - unordered_map freq2; - while(num <= words.size()){ - auto target = s.substr(pos, len); - - if(freq.count(target) == 0) break; // 剪枝 - freq2[target]++; // 滑动窗口中子串出现次数+1 - if(freq2[target] > freq[target]) break; // 剪枝 - - pos += len; - num++; - } - if(num-1 == words.size()) ret.push_back(i); - } - return ret; - } -}; -``` - -#### leetcode - -**解题方法**: - -根据同余定理,只要求前缀和 $p[i]$ 和 $p[j]$ 模数 $k$ 同余出现的次数。 - -1. **前缀和**:使用公式 $pre[i]=pre[i−1]+nums[i]$ 得到每一位前缀和的值,从而通过前缀和进行相应的计算和解题。 -2. **同余定理**:给定一个正整数 $m$,如果两个整数 $a$ 和 $b$ 满足 $a-b$ 能够被 $m$ 整除,即 $(a-b)/m$ 得到一个整数,那么就称整数 $a$ 与 $b$ 对模 $m$ 同余,记作 a≡b(mod m)。对模 $m$ 同余是整数的一个等价关系。 - -```cpp -class Solution { -public: - int subarraysDivByK(vector& nums, int k) { - // 哈希表初始化,record[0] = 1 - unordered_map record = {{0, 1}}; - int sum = 0, ans = 0; - for (int elem: nums) { - sum += elem; - // 注意 C++ 取模的特殊性,当被除数为负数时取模结果为负数,需要纠正 - int modulus = (sum % k + k) % k; - // 边遍历边计算答案 - if (record.count(modulus)) { - ans += record[modulus]; - } - ++record[modulus]; - } - return ans; - } -}; -``` - -### 6,二叉树 - -#### 07-重建二叉树 - -[剑指 Offer 07-重建二叉树](https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/) - -输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 - -示例1: - -```shell -Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] -Output: [3,9,20,null,null,15,7] -``` - -**解题方法:** - -1,递归法 -+ 中序遍历的结果可以获取左右子树的元素个数; -+ 前序遍历结果可以获取树的根节点 node 的值。 - -**C++代码**: -```cpp -class Solution { -public: - TreeNode* buildTree(vector& preorder, vector& inorder) { - // 哈希表 dic 存储中序遍历的值与索引的映射 - for(int i=0; i index; - TreeNode* recur(vector& preorder, int root, int left, int right){ - if (left > right) return nullptr; - int i = index[preorder[left]]; // 获取中序遍历中根节点值的索引 - TreeNode* node = new TreeNode(preorder[left]); - node->left = recur(preorder, root+1, left, i-1); - node->right = recur(preorder, root+i-left+1, i+1, right); - - return node; - - } -}; -``` - -#### leetcode 104-二叉树的最大深度 - -[104-二叉树的最大深度](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) - -给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 - -**说明**: 叶子节点是指没有子节点的节点。 - -示例: -```shell -给定二叉树 [3,9,20,null,null,15,7], - - 3 - / \ - 9 20 - / \ - 15 7 -返回它的最大深度 3 。 -``` - -#### 55.2-平衡二叉树 - -[55.2-平衡二叉树](https://leetcode-cn.com/problems/balanced-binary-tree/) - -给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为: - -一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 `1`。 - -#### leetcode 109-有序链表转换二叉搜索树 - -[leetcode109. 有序链表转换二叉搜索树](https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree) - -给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 - -本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 `1`。 - -示例: -```shell -给定的有序链表: [-10, -3, 0, 5, 9], - -一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: - - 0 - / \ - -3 9 - / / - -10 5 -``` - -**解题方法:** - -1,将单调递增链表转化为数组,然后分治递归。 -2,快慢指针找链表的中间节点,然后递归。 - -复杂度分析: -- 时间复杂度: O(n) -- 空间复杂度: O(n) - -**C++代码**: - -```cpp -class Solution { -public: - // 分治递归 - TreeNode* sortedListToBST(ListNode* head) { - vector vec; - for(auto it = head; it!=nullptr ; it=it->next ){ - vec.push_back( it->val ); - } - return recur(vec, 0, vec.size()-1); - } - - TreeNode* recur(vector &arr, int left, int right){ - if(left > right) return nullptr; - int mid = right + (left-right)/2; // 数组中间位置的索引 - TreeNode* node = new TreeNode(arr[mid]); - node -> left = recur(arr, left, mid - 1); - node -> right = recur(arr, mid + 1, right); - - return node; - } -}; -``` - -### 7,图 - -## 二,算法 - -### 1,递归 - -#### 10-1. 斐波那契数列 - -[10-1. 斐波那契数列](https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/) - -写一个函数,输入 $n$,求斐波那契(Fibonacci)数列的第 $n$ 项(即 $F(n)$)。斐波那契数列的定义如下: -```shell -F(0) = 0,   F(1) = 1 -F(n) = F(n - 1) + F(n - 2), 其中 n > 1. -``` - -斐波那契数列由 `0` 和 `1` 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 `1e9+7(1000000007)`,如计算初始结果为:`1000000008`,请返回 `1` - -**解题方法**: - -1,记忆化递归 -2,迭代法 - -**C++代码**: -```cpp -// 剑指 offer 10-1. 斐波那契数列 -class Solution { -private: - static const int mod = 1e9 + 7; - int m = 101; - vector vec = vector(101, -1); // c++11 之后,类 private成员初始化方式 -public: - // 1,直接递归会超出时间限制,需要使用记忆化递归 - constexpr int fib(int n) { - if (n == 0) return 0; - if (n == 1 || n == 2) return 1; - - if (vec[n] != -1) return vec[n]; - vec[n] = (fib(n - 1) + fib(n - 2)) % mod; - - return vec[n]; - } - // 2,迭代求解 - int fib(int n) { - int arr[101]; - arr[0] = 0; - arr[1] = 1; - arr[2] = 1; - for (int i = 2; i < n; i++) { - arr[i+1] = (arr[i ] + arr[i - 1]) % mod; - } - return arr[n]; - } -}; -``` - -### 2,二分查找 - -### 3,排序 - -### 4,贪心 - -#### 63-股票的最大利润 - -[63-股票的最大利润](https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/) - -假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? - -示例 1: -```shell -输入: [7,1,5,3,6,4] -输出: 5 -解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 - 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 -``` - -**解题方法:** - -1,贪心法:假设每天的股价都是最低价,每天都计算股票卖出去后的利润。一次 for 循环,时间复杂度:$O(n)$ -2,暴力法:两次 `for` 循环,时间复杂度 $O(n^2)$ - -**C++代码**: - -```cpp -# include -# include -# include - -using namespace std; - -class Solution { -public: - int maxProfit(vector& prices) { - // 贪心算法:一次遍历 - int inf = 1e9; // 表示“无穷大” - int minprice = inf, maxprofit = 0; - for(int price: prices){ - maxprofit = max(maxprofit, (price-minprice)); // 假设每天都是最低价 - minprice = min(minprice, price); - } - return maxprofit; - } -}; - -int main(){ - vector prices = {7,1,5,3,6,4}; - Solution s1; - int max_profit = s1.maxProfit(prices); - cout << max_profit << endl; - return 0; -} -``` - -### 5,分治 - -### 6,回溯 - -### 7,动态规划 - -#### 10.2-青蛙跳台阶问题 - -[剑指offer 10.2-青蛙跳台阶问题](https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/) - -一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 - -答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 - -**解题方法:** - -1,动态规划法:以斐波那契数列性质 $f(n + 1) = f(n) + f(n - 1)$ 为转移方程。 - -+ 状态定义: 设 $dp$ 为一维数组,其中 $dp[i]$ 的值代表斐波那契数列第 $i$ 个数字 。 -+ 转移方程: $dp[i + 1] = dp[i] + dp[i - 1]$ ,即对应数列定义 $f(n + 1) = f(n) + f(n - 1)$; -+ 初始状态: $dp[0] = 1, dp[1] = 1$,即初始化前两个数字; -+ 返回值: $dp[n]$,即斐波那契数列的第 $n$ 个数字。 - -**C++代码**: - -```cpp -class Solution { -private: - static const int mod = 1e9 + 7; -public: - // 动态规划法 - int numWays(int n) { - int dp[n+1]; - if( n == 0 || n == 1) return 1; - dp[0] = 1; - dp[1] = 1; - for(int i=2; i<=n; i++){ - dp[i] = (dp[i-1] + dp[i-2]) % mod; - } - return dp[n]; - } - // 递归法 - int numWays2(int n) { - if(n == 1) return 1; - if(n == 2) return 2; - return numWays2(n-1) + numWays2(n-2); - } -}; -``` - -#### 42-连续子数组的最大和 - -[剑指offer 42-连续子数组的最大和](https://leetcode-cn.com/problems/maximum-subarray/) - -给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。  - -示例 1: -```shell -输入:nums = [-2,1,-3,4,-1,2,1,-5,4] -输出:6 -解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 -``` - -**解题思路**: - -动态规划法。 - -**C++代码**: -```cpp -class Solution { -public: - //1, 动态规划算法 - int maxSubArray2(vector& nums) { - int* dp = new int[nums.size()]; - dp[0] = nums[0]; - int maxSum = dp[0]; - for(int i=1; i < nums.size(); i++){ - dp[i] = max(dp[i-1], 0) + nums[i]; - maxSum = max(dp[i], maxSum); - } - return maxSum; - } - //1, 动态规划,优化空间 - int maxSubArray(vector& nums) { - int sum = nums[0]; - int maxSum = nums[0]; - for(int i=1; i < nums.size(); i++){ - sum = max(sum, 0) + nums[i]; - maxSum = max(sum, maxSum); - } - return maxSum; - } -}; -``` - -#### 47-礼物的最大价值 - -[剑指offer 47-礼物的最大价值](https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/) - -在一个 $m\ast n$ 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? - -示例 1: -```shell -输入: -[ -  [1,3,1], -  [1,5,1], -  [4,2,1] -] -输出: 12 -解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物 -``` - -**解题方法:** - -动态规划-状态转移方程法。 - -**C++代码**: - -```cpp -class Solution { // 状态转移方程法 -private: - int minDist(int i, int j, vector >& matrix, vector >& mem) { // 调用minDist(n-1, n-1); - if (i == 0 && j == 0) return matrix[0][0]; - if (mem[i][j] > 0) return mem[i][j]; - - int minUp = -10000; - if (i - 1 >= 0) minUp = minDist(i - 1, j, matrix, mem); - int minLeft = -10000; - if (j - 1 >= 0) minLeft = minDist(i, j - 1, matrix, mem); - int currMinDist = matrix[i][j] + std::max(minUp, minLeft); - - mem[i][j] = currMinDist; - - return currMinDist; - } -public: - int maxValue(vector>& grid) { - int m = grid.size(); - int n = grid[0].size(); - vector > mem(m, vector(n, -1)); - - return minDist(m - 1, n - 1, grid, mem); - } -}; -``` - -#### 48-最长不含重复字符的子字符串 - -[剑指offer 42-最长不含重复字符的子字符串](https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/) - -请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 - -示例 1: -```shell -输入: "abcabcbb" -输出: 3 -解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 -``` - -**解题思路**: - -1. 动态规划。参考[这里](https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/solution/mian-shi-ti-48-zui-chang-bu-han-zhong-fu-zi-fu-d-9/)。 -2. 滑动窗口法 + 哈希表结构。 - -**C++代码**: - -```cpp -class Solution { -public: - // 动态规划+线性遍历 - int lengthOfLongestSubstring(string s) { - int res=0, tmp = 0, i=0; - for(int j=0; j < s.size(); j++){ - i = j-1; - while(i>=0 && s[i] != s[j]) i-= 1; - if(tmp < j-i) tmp += 1; - else tmp = j - i; - res = max(res, tmp); - } - return res; - } - // 滑动窗口法 + 哈希表保存字符出现的位置 - int lengthOfLongestSubstring2(string s) { - unordered_map seen; - int maxLength = 0, l = 0; - for(int r=0; r 0) { - int last_pos = seen[s[r]]; - // 位置判断不可少,重复字符的位置必须是在滑动窗口内! - if(last_pos >= l) l = last_pos + 1; // last_pos <= r - } - maxLength = max(maxLength, r-l+1); - seen[s[r]] = r; - } - return maxLength; - } -}; -``` - -#### 66-构建乘积数组 - -[剑指offer 66-构建乘积数组](https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/) - -给定一个数组 $A[0,1,…,n-1]$,请构建一个数组 $B[0,1,…,n-1]$,其中 $B[i]$ 的值是数组 $A$ 中除了下标 $i$ 以外的元素的积, 即 $B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]$。不能使用除法。 diff --git "a/3-data_structure-algorithm/\347\256\227\346\263\225\345\233\276\350\247\243\347\254\224\350\256\260.md" "b/3-data_structure-algorithm/\347\256\227\346\263\225\345\233\276\350\247\243\347\254\224\350\256\260.md" deleted file mode 100644 index 92906f67..00000000 --- "a/3-data_structure-algorithm/\347\256\227\346\263\225\345\233\276\350\247\243\347\254\224\350\256\260.md" +++ /dev/null @@ -1,624 +0,0 @@ -- [前言知识](#前言知识) -- [第一章,算法简介](#第一章算法简介) - - [1.2,二分法查找元素](#12二分法查找元素) - - [1.2.1,特殊的二分查找](#121特殊的二分查找) -- [第二章,选择排序](#第二章选择排序) - - [2.1,内存工作原理](#21内存工作原理) - - [2.2.1,链表](#221链表) - - [2.2.2,数组](#222数组) - - [2.2.3,术语](#223术语) - - [2.3,选择排序](#23选择排序) - - [2.4,小结](#24小结) -- [第三章,递归](#第三章递归) - - [3.2,基线条件和递归条件](#32基线条件和递归条件) - - [3.3,栈](#33栈) - - [3.3.1,调用栈](#331调用栈) - - [3.3.2,递归调用栈](#332递归调用栈) - - [3.4,小结](#34小结) -- [第四章,快速排序](#第四章快速排序) - - [4.1,分而治之](#41分而治之) - - [4.2 快速排序](#42-快速排序) - - [4.3 再谈大O表示法](#43-再谈大o表示法) - - [4.4,小结](#44小结) -- [第五章,散列表](#第五章散列表) - - [5.3,冲突](#53冲突) - - [5.4,性能](#54性能) - - [5.5,小结](#55小结) -- [第六章,广度优先搜索](#第六章广度优先搜索) - - [6.1,图是什么](#61图是什么) - - [6.2,广度优先搜索](#62广度优先搜索) - - [6.3,栈与队列](#63栈与队列) - - [6.4,代码实现图结构](#64代码实现图结构) - - [6.4.1 运行时间](#641-运行时间) -- [第七章,迪克斯特拉算法](#第七章迪克斯特拉算法) - - [7.1,使用迪克斯特拉算法](#71使用迪克斯特拉算法) - - [7.2,术语](#72术语) - - [7.3,负权边](#73负权边) - - [7.4,编程实现狄克斯特拉算法](#74编程实现狄克斯特拉算法) - - [7.5,小结](#75小结) -- [第八章,贪婪(贪心)算法](#第八章贪婪贪心算法) - - [8.1,教室调度问题](#81教室调度问题) - - [8.2,背包问题](#82背包问题) - - [8.3,集合覆盖问题](#83集合覆盖问题) - - [8.3.1,近似算法](#831近似算法) - - [8.4,NP 完全问题](#84np-完全问题) - - [8.4.1,如何识别NP完全问题](#841如何识别np完全问题) - - [8.5,小结](#85小结) -- [第九章,动态规划](#第九章动态规划) - - [9.1,概念](#91概念) - - [9.2,背包问题](#92背包问题) - - [9.3,最长公共子串](#93最长公共子串) -- [第十章,K最近邻算法](#第十章k最近邻算法) -- [第十一章 接下来如何做](#第十一章接下来如何做) -- [参考资料](#参考资料) - -## 前言知识 - -> [十大经典排序算法动画与解析,看我就够了!(配代码完全版)](https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg) - -10 大排序算法时间复杂度及空间复杂度如下图: - -![10大排序算法时间复杂度及空间复杂度](../data/images/排序算法时间复杂度.jpg) - -## 第一章,算法简介 - -### 1.2,二分法查找元素 - -二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回 `null`,使用`二分查找`时,每次猜测的是中间的数字,从而将余下的数字排除一半。(**仅仅当列表是有序的时候,二分查找才管用**) - -一般而言,对于包含n个元素的列表查找某个元素,使用二分法最多需要 $log_{2}n$ 步(**时间复杂度为 $log_{2}n$ **),简单查找最多需要 `n` 步。大 O 表示法指出了算法最糟糕情况下的运行时间。二分法实例代码如下: - -```python -def binary_search(list, item): - low = 0 - high = len(list)-1 - while low <= high: - mid = (low + high) // 2 - if list[mid] == item: - return mid - elif list[mid] > item: - high = mid - 1 - else: - low = mid + 1 - return None - - -if __name__ == "__main__": - print(binary_search([1,2,3,4,6,7], 3)) # 输出 2 -``` - -#### 1.2.1,特殊的二分查找 - -有序数组中的**目标出现多次**,利用二分查找返回在最左边出现的目标值或者是最右边出现的目标值,实例代码如下: - -```python -def binary_search2(arr, target, flag="left"): - if not arr: - return None - left = 0 - right = len(arr) - 1 - while left <= right: - mid = left + (right - left) // 2 # 防止数据过大溢出? - if arr[mid] < target: - left = mid + 1 - elif arr[mid] > target: - right = mid -1 - else: - if flag == "left": - if mid > 0 and arr[mid-1] == target: - right = mid -1 # 不断向最左边逼近 - else: - return mid - elif flag == "right": - if mid + 1 < len(arr) and arr[mid + 1] == target: - left = mid + 1 # 不断向最右边逼近 - else: - return mid - return None - - -if __name__ == "__main__": - print(binary_search2([1,1,1,3,3,3,4], 3, "left")) # 查找最左边出现的目标值, 输出3 - print(binary_search2([1,1,1,3,3,3,4,4,4], 3, "right")) # 查找最右边出现的目标值, 输出5 -``` - -## 第二章,选择排序 - -### 2.1,内存工作原理 - -在计算机中,存储多项数据时,有两种基本方式-数组和链表。但它们并非适用于所有情形。 - -#### 2.2.1,链表 - -链表中的元素可存储在内存的任何地方。 -链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。链表结构直观显示如下图所示: - -![2.1链表示意图](../data/images/2.1链表.png) - -链表的优势在插入元素方面,那数组的优势又是什么呢? - -#### 2.2.2,数组 - -需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。**在链表中,元素并非靠在一起的**,你无法迅速计算出第五个元素的内存 地址,而必须先访问第一个元素以获取第二个元素的地址,再访问第二个元素以获取第三个元素 的地址,以此类推,直到访问第五个元素。 - -#### 2.2.3,术语 - -数组的元素带编号,编号从 **0** 而不是 1 开始,几乎所有的编程语言都从0开始对数组元素进行编号,比如C/C++的数组结构和Python的列表结构。 -元素的位置称为索引。下面是常见数组和链表操作的运行时间. - -### 2.3,选择排序 - -**选择排序时间复杂度$O(n^{2})$** - -```python -def findSmallest(arr): - smallest = arr[0] # 存储最小的值 - smallest_index = 0 # 存储最小元素的索引 - for i in range(1, len(arr)): - if arr[i] < smallest: - smallest_index = i - smallest = arr[i] - return smallest -# 选择排序法对数组进行排序 -def selectionSort(arr): - newArr = [] - for i in range(len(arr)): - smallest = findSmallest(arr) - arr.remove(smallest) - newArr.append(smallest) - return newArr -# 实例应用 -print(selectionSort([5, 3, 6, 100])) # [3, 5, 6, 100] -``` - -### 2.4,小结 - -+ 计算机内存犹如一大堆抽屉。 -+ 需要存储多个元素时,可使用数组或链表。 -+ 数组的元素都在一起。 -+ 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。 -+ 数组的读取速度很快。 -+ 链表的插入和删除速度很快. -+ 在同一个数组中,所有元素的类型都必须相同(都为int、 double等)。 - -## 第三章,递归 - -学习如何将问题分成基线条件和递归条件,学习如何使用递归算法,递归算法直观上更好理解,步骤简单。 - -### 3.2,基线条件和递归条件 - -编写递归函数时,必须告诉它何时停止,因此,每个递归函数有两个部分:**基线条件(base case)和递归条件(recursive case)**。递归条件指的是函数调用自己,而基线条件则 指的是函数不再调用自己,从而避免形成无限循环。 - -### 3.3,栈 - -栈的定义:栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。 -调用栈(call stack) - -### 3.3.1,调用栈 - -计算机在内部使用被称为调用栈的栈。**调用另一个函数时,当前函数暂停 并处于未完成状态**。该函数的所有变量的值都还在内存中。栈顶的方框指出了当前执行 到了什么地方。 - -#### 3.3.2,递归调用栈 -栈在递归中扮演着重要角色。使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调 用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。在这种情况 下,你有两种选择。 - -+ 重新编写代码 -+ 使用尾递归 - -### 3.4,小结 - -+ 递归值的是调用自己的函数 -+ 每个递归函数都有两个条件:基线条件和递归条件 -+ 栈有两种操作:压如和弹出 -+ 所有函数调用都进入调用栈 -+ 调用栈可能很长,这将占用大量内存 - -## 第四章,快速排序 - -快速排序使用分而治之的策略,分而治之是我们学习的第一种通用的问题解决办法。 -**分而治之**(divide and conquer,D&C)-一种著名的递归式问题解决办法。 - -### 4.1,分而治之 - -D&C算法是递归的。使用D&C解决问题的过程包括两个步骤: - -+ 找出基线条件,这种条件必须尽可能简单。 -+ 不断将问题分解(或者说缩小规模),直到符合基线条件。 - -D&C并非可直接用于解决问题的算法,而是一种解决问题的思路。 - -### 4.2 快速排序 - -C语言标准库中的函数qsort实现的就是快速排序。快速排序也是用了D&C思想。 -对数组进行快速排序,步骤如下: - -1. 随机选择一个基准值; -2. 将数组分成两个子数组:小于基准值的元素和大于基准值额元素; -3. 对这两个子数组进行排序。 - -**在平均情况下,快速排序时间复杂度$O(nlogn)$**。快速排序代码如下: - -```python -def quicksort(array): - if len(array) < 2: - # 基线条件:为空或只包含一个元素的数组是“有序”的 - return array - else: - # 递归条件 - pivot = array[0] - less = [x for x in array[1:] if x <= pivot] - greater = [x for x in array[1:] if x > pivot] - return quicksort(less) + [pivot] + quicksort(greater) -print(quicksort([4, 90, 0, 2, 17, 79, 12])) # [0, 2, 4, 12, 17, 79, 90] -``` - -上面的代码空间复杂度很大,真正的快排是原地排序,空间复杂度为O(1),代码如下: - -```python -# _*_ coding:utf-8 _*_ - -def quick_sort(L): - return q_sort(L, 0, len(L)-1) - -def q_sort(L, left, right): - if left < right: - pivot = Partition(L, left, right) - q_sort(L, left, pivot-1) - q_sort(L, pivot+1, right) - - return L - -def Partition(L, left, right): - pivotkey = L[left] - - while left < right: - while left < right and L[right] >= pivotkey: - right -= 1 - L[left] = L[right] - while left < right and L[left] <= pivotkey: - left += 1 - L[right] = L[left] # 遇到比基准大的数, 则覆盖在之前尾部指针的位置 - L[left] = pivotkey - return left - - -if __name__ == "__main__": - L = [5, 9, 1, 1, 11, 6, 7, 2, 4] - print(quick_sort(L)) -``` - -### 4.3 再谈大O表示法 - -快速排序的独特之处在于,其速度取决于选择的基准值。在讨论快速排序的运行时间前,我 们再来看看最常见的大O运行时间。 - -![4.3 再谈大O表示法](../data/images/4.3再谈大O表示法.png) - -+ **选择排序**,其运行时间为 $O(n^2)$,速度非常慢。 -+ 还有一种名为**合并排序**(merge sort)的排序算法,其运行时间为 $O(nlogn)$,比选择排序快得多! -+ **快速排序**的情况比较棘手,在最糟情况下,其运行时间为 $O(n^2)$。与选择排序一样慢!但这是最糟情况。**在平均情况下,快速排序的运行时间为 $O(nlogn)$。** - -由对数的换底公式,$log_a n$ 和 $log_b n$ 只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作$O(log n)$,**而不论对数的底是多少,是对数时间算法的标准记法**。 - -### 4.4,小结 - -+ D&C将问题逐步分解。使用D&C处理列表时,基线条件很可能是空数组或只包含一个元 素的数组。 -+ 实现快速排序时,请随机地选择用作基准值的元素。**快速排序的平均运行时间为O(n log n)**。 -+ 大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。 -+ 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时, O(log n)的速度比O(n) 快得多。 - -## 第五章,散列表 - -数组和链表结构可以用以查找,栈不行。**散列表也叫哈希表(Hash table),散列表有些类似 Python 中的字典 `dict` 结构**。散列表可用以: - -+ 模拟映射关系; -+ 防止重复; -+ 缓冲/记住数据,以免服务器再通过处理来生成它们。 - -### 5.3,冲突 - -给两个键分配的位置相同,这被称为冲突(collision)。处理冲突最简单的办法就是:如果两个键映射到了同一个位置,就在这个位置存储一个链表。 - -### 5.4,性能 - -散列表,数组,链表的查找、插入删除元素的时间复杂度,如下表所示: - -![散列表查找、插入删除元素操作时间复杂度分析](../data/images/5.4性能.png) - -在平均情况下,散列表的查找(获取给定索引处的值)速度与数组一样快,而插入和删除速 度与链表一样快,因此它兼具两者的优点!但在最糟情况下,散列表的各种操作的速度都很慢。 因此,在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。而要避免冲突,需要有: - -+ 较低的填装因子; -+ 良好的散列函数。 - -### 5.5,小结 - -散列表是一种功能强大的数据结构,其操作速度快,还能让你以不同的方式建立数据模型。 你可能很快会发现自己经常在使用它。 - -+ 你可以结合散列函数和数组来创建散列表。 -+ 冲突很糟糕,你应使用可以最大限度减少冲突的散列函数。 -+ 散列表的查找、插入和删除速度都非常快。 -+ 散列表适合用于模拟映射关系。 -+ 一旦填装因子超过0.7,就该调整散列表的长度。 -+ 散列表可用于缓存数据(例如,在Web服务器上)。 -+ 散列表非常适合用于防止重复。 - -## 第六章,广度优先搜索 - -图算法:广度优先搜索(breadth-first search, **BFS**)算法 -广度优先搜索让你能够找出两样东西之间的最短距离,不过最短距离的含义有很多!使用广度优先搜索可以: - -+ 编写国际跳棋AI,计算最少走多少步就可获胜; -+ 编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将 READED改为READER需要编辑一个地方; -+ 根据你的人际关系网络找到关系最近的医生。 - -解决最短路径问题的算法被称为**广度有限算法**,一般步骤为: - -1. 使用图来建立问题模型。 -2. 使用广度优先搜索解决问题。 - -### 6.1,图是什么 - -图由节点(`node`)和边(`edge`)组成。 - -### 6.2,广度优先搜索 - -在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。 - -### 6.3,栈与队列 - -+ **栈**:后进先出(Last In First Out,`LIFO`)的数据结构 -+ **队列**:先进先出(First In First Out,`FIFO`)的数据结构,支持入队和出对操作。 - -### 6.4,代码实现图结构 - -图中每个节点都与相邻节点相连,**散列表**结构可以表示这种关系。 -图分为有向图(directed graph)和无向图(undirected graph),有向图关系是单向的,无向图没有箭头,直接相连的节点互为邻居。对从自己出发有指向他人的箭头,则有邻居。 - -### 6.4.1 运行时间 - -如果你在你的整个人际关系网中搜索芒果销售商,就意味着你将沿每条边前行(记住,边是从一个人到另一个人的箭头或连接),因此运行时间至少为 $O(边数)$。你还使用了一个队列,其中包含要检查的每个人。将一个人添加到队列需要的时间是固定的,即为 $O(1)$,因此对每个人都这样做需要的总时间为 $O(人数)$。所以,广度优先搜索的运行时间为 $O(人数 + 边数)$,这通常写作 $O(V + E)$,其中 $V$ 为顶点( vertice)数, $E$ 为边数。 - -## 第七章,迪克斯特拉算法 - -### 7.1,使用迪克斯特拉算法 - -迪克斯特拉算法能够找出加权图中前往X的最短路径。对于寻找耗时最少的路径,迪克斯特拉算法包含4个步骤: - -1. 找出“最便宜”的节点,即可在最短时间内到达的节点。 -2. 更新该节点的邻居的开销,其含义将稍后介绍。 -3. 重复这个过程,直到对图中的每个节点都这样做了。 -4. 计算最终路径。 - -每个节点都有开销。开销指的是从起点前往该节点需要多长时间。 - -### 7.2,术语 - -+ 带权重的图称为加权图( weighted graph),不带权重的图称为非加权图( unweighted graph)。 -+ 要计算非加权图中的最短路径,可使用广度优先搜索。要计算加权图中的最短路径,可使用狄克斯特拉算法。 -+ 在无向图中,每条边都是一个环。狄克斯特拉算法只适用于有向无环图( directed acyclic graph,`DAG`)。 - -图可能有环,所谓环,是指由一个节点出发,走一圈后可以又回到原节点,如下图所示: - -![环示意图](../data/images/7.2环示意图.png) - -### 7.3,负权边 - -因此, **不能将狄克斯特拉算法用于包含负权边的图**。在包含负权边的图中,要找出最短路径,可使用另一种算法——贝尔曼福德算法(`Bellman-Ford algorithm`)。 - -### 7.4,编程实现狄克斯特拉算法 - -以下图为例,编程实现耗时最短的路径。 - -![图算法问题](../data/images/7.4图算法问题.png) - -代码如下: - -```python -# 为了实现带权图,可使用散列表,散列表用Python字典实现 -graph = {} -# 存储起始节点邻居和前往邻居的开销 -graph['start'] = {} -graph["start"]["a"] = 6 -graph["start"]["b"] = 2 -print(graph["start"].keys()) -# 添加其他节点及其邻居 -graph["a"] = {} -graph["a"]["fin"] = 1 - -graph["b"] = {} -graph["b"]["a"] = 3 -graph["b"]["fin"] = 5 - -# 终点没有任何邻居 -graph['fin'] = {} - -# 创建存储每个节点开销的开销表 -infinity = float("inf") -costs = {} -costs["a"] = 6 -costs["b"] = 2 -costs["fin"] = infinity - -# 创建存储父节点的散列表 -parents = {} -parents["a"] = "start" -parents["b"] = "start" -parents["fin"] = None -# 创建一个数组,用于记录处理过的节点 -processed = [] - -# 找出开销最低的节点 -def find_lowest_cost_node(costs): - lowest_cost = float("inf") - lowest_cost_node = None - for node in costs: - cost = costs[node] - if cost < lowest_cost and node not in processed: - lowest_cost = cost - lowest_cost_node = node - return lowest_cost_node - -# 在未处理的节点中找出开销最小的节点 -node = find_lowest_cost_node(costs) -while node is not None: - cost = costs[node] - neighbors = graph[node] - # 遍历当前节点的邻居 - for n in neighbors.keys(): - new_cost = cost + neighbors[n] - # 如果当前节点前往该邻居更近,就更新该邻居的开销, 同时将该邻居的父节点设置为当前节点 - if costs[n] > new_cost: - costs[n] = new_cost - parents[n] = node - # 将当前节点标记为处理过 - processed.append(node) - # 找出接下来要处理的节点,并循环 - node = find_lowest_cost_node(costs) - -print("Cost from the start to each node:") -print(costs) -``` - -### 7.5,小结 - -+ 广度优先搜索用于在非加权图中查找最短路径。 -+ 狄克斯特拉算法用于在加权图中查找最短路径。 -+ 仅当权重为正时狄克斯特拉算法才管用。 -+ 如果图中包含负权边,请使用贝尔曼福德算法。 - -## 第八章,贪婪(贪心)算法 - -贪婪算法思想很简单:每步都采取最优的做法,专业术语说,就是每步都选择局部最优解,最终得到的就是全局最优解。 - -### 8.1,教室调度问题 - -根据给定课表,尽可能将更多的课程安排在某间教室。解决办法:贪婪算法可找到最优解。 - -### 8.2,背包问题 - -背包重量有限,根据策略使得装入背包的物品价值最高。 -在这里, 贪婪策略显然不能获得最优解,但非常接近。在有些情况下,完美是优秀的敌人。有时候,你只需找到一个能够大致解决问题的算法,此时贪婪算法正好可派上用场,因为它们实现起来很容易,得到的结果又与正确结果相当接近。 - -### 8.3,集合覆盖问题 - -每个广播台都覆盖特定区域的州,找出覆盖全美50个州的最小广播集合。 -贪婪算法解决这个问题,当广播台数量过多,算法所耗费的时间将激增。 - -#### 8.3.1,近似算法 - -集合覆盖问题举例:每个广播台都覆盖特定区域的州,找出覆盖全美50个州的最小广播集合。贪婪算法可以解决这个问题,当广播台数量过多,算法所耗费的时间将激增。 - -1. 选出这样一个广播台,即它**覆盖了最多的未覆盖州**。即便这个广播台覆盖了一些已覆盖的州,也没有关系。 -2. 重复第一步,直到覆盖了所有的州。 - -这是一种近似算法( approximation algorithm) 。在获得精确解需要的时间太长时,可使用近似算法。判断近似算法优劣的标准如下: - -+ 速度有多快; -+ 得到的近似解与最优解的接近程度。 - -**代码实例:** - -```python -""" -准备工作 -""" -# 创建一个列表,包含要覆盖的州 -states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]) -# 广播台清单 -stations = {} -stations["kone"] = set(["id", "nv", "ut"]) -stations["ktwo"] = set(["wa", "id", "mt"]) -stations["kthree"] = set(["or", "nv", "ca"]) -stations["kfour"] = set(["nv", "ut"]) -stations["kfive"] = set(["ca", "az"]) -# 定义一个集合存储最终选择的广播台 -final_stations = set() -""" -计算答案 -""" -best_station = None -while states_needed: - best_station = None - states_covered = set() - for station, states in stations.items(): - covered = states_needed & states - if len(covered) > len(states_covered): - best_station = station - states_covered = covered - states_needed -= states_covered - final_stations.add(best_station) -print(final_stations) -``` - -程序输出如下: -> {'kone', 'ktwo', 'kthree', 'kfive'} - -贪心算法的实质是每次选出当前的最优解,不管整体,是基于一定假设下的最优解。 - -### 8.4,NP 完全问题 - -旅行商问题和集合覆盖问题有一些共同之处:**你需要计算所有的解,并从中选出最小/最短的那个**。这两个问题都属于NP完全问题。NP完全问题的简单定义是,以难解著称的问题,如**旅行商问题和集合覆盖**问题。很多非常聪明的人都认为,根本不可能编写出可快速解决这些问题的算法。 - -#### 8.4.1,如何识别NP完全问题 - -`NP` 完全问题无处不在!如果能够判断出要解决的问题属于 `NP` 完全问题就好了,这样就不用 去寻找完美的解决方案,而是使用近似算法即可。但要判断问题是不是NP完全问题很难,易于解决的问题和 `NP` 完全问题的差别通常很小。 - -但如果要找出经由指定几个点的的最短路径,就是旅行商问题——`NP完全问题`。简言之,没办法判断问题是不是 `NP` 完全问题,但还是有一些蛛丝马迹可循的。 - -+ 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。 -+ 涉及“所有组合”的问题通常是NP完全问题。 -+ 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。 -+ 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。 -+ 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。 -+ 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。 - -### 8.5,小结 - -+ 贪婪算法寻找局部最优解,企图以这种方式获得全局最优解。 -+ 对于NP完全问题,还没有找到快速解决方案。 -+ 面临NP完全问题时,最佳的做法是使用近似算法。 -+ 贪婪算法易于实现、运行速度快,是不错的近似算法。 - -## 第九章,动态规划 -### 9.1,概念 - -**动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决**。在学习动态规划之前需要明确掌握几个重要概念,如下: - -+ **阶段**:对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。 -+ **状态**:状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。 -+ **决策**:决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。 -+ **策略**:由所有阶段的决策组成的决策序列称为全过程策略,简称策略。 -+ **最优策略**:在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。 -+ **状态转移方程**:状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。 - -### 9.2,背包问题 -学习动态规划,这是一种解决棘手问题的方法,**它将问题分成小问题**,并先着手解决这些小问题,每个动态规划问题都是从一个网格入手,背包问题的网格如下: - -![9.2背包问题网格图](../data/images/9.2-背包问题.jpg) - -**工作原理**:`动态规划先解决子问题,再逐步解决大问题`。从背包问题的网格计算入手,可明白为何计算小背包可装入的商品的最大价值。余下了空间时,你可根据这些子问题的答案来确定余下的空间可装入哪些商品。计算每个单元格的价值时,使用的公式都相同。 这个公式如下: - -![背包问题公式图](../data/images/9.2-背包问题公示图.png) - -**网格的行顺序发生变化时,最终答案没有变化**。各行的排列顺序对最终结果无关紧要。 - -动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题。 **但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用**。 这意味着使用动态规划算 法解决不了去巴黎玩的问题。 - -### 9.3,最长公共子串 - -通过动态规划问题,得到以下启示: - -+ 动态规划可帮助你在给定约束条件下找到最优解在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品。 -+ 在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。 -要设计出动态规划解决方案可能很难,这正是本节要介绍的。下面是一些通用的小贴士: -+ 每种动态规划解决方案都涉及网格。 -+ 单元格中的值通常就是你要优化的值。在前面的背包问题中,单元格的值为商品的价值。 -+ 每个单元格都是一个子问题,因此你应考虑如何将问题分成子问题,这有助于你找出网格的坐标轴。 - -## 第十章,K最近邻算法 - -待更新。 - -## 第十一章 接下来如何做 -待更新。 -## 参考资料 - -《算法图解》 diff --git a/4-machine_learning/README.md b/3-machine_learning/README.md old mode 100644 new mode 100755 similarity index 100% rename from 4-machine_learning/README.md rename to 3-machine_learning/README.md diff --git a/4-machine_learning/k-means.py b/3-machine_learning/k-means.py old mode 100644 new mode 100755 similarity index 100% rename from 4-machine_learning/k-means.py rename to 3-machine_learning/k-means.py diff --git "a/4-machine_learning/\343\200\212\346\234\272\345\231\250\345\255\246\344\271\240\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/3-machine_learning/\343\200\212\346\234\272\345\231\250\345\255\246\344\271\240\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "4-machine_learning/\343\200\212\346\234\272\345\231\250\345\255\246\344\271\240\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" rename to "3-machine_learning/\343\200\212\346\234\272\345\231\250\345\255\246\344\271\240\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" diff --git "a/4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\205\245\351\227\250\346\200\273\347\273\223.md" "b/3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\205\245\351\227\250\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\205\245\351\227\250\346\200\273\347\273\223.md" rename to "3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\205\245\351\227\250\346\200\273\347\273\223.md" diff --git "a/4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\345\216\237\347\220\206.md" "b/3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\345\216\237\347\220\206.md" old mode 100644 new mode 100755 similarity index 100% rename from "4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\345\216\237\347\220\206.md" rename to "3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\345\216\237\347\220\206.md" diff --git "a/4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\346\246\202\345\277\265\346\200\273\347\273\223.md" "b/3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\346\246\202\345\277\265\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\346\246\202\345\277\265\346\200\273\347\273\223.md" rename to "3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\346\234\254\346\246\202\345\277\265\346\200\273\347\273\223.md" diff --git "a/4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\347\273\217\345\205\270\347\256\227\346\263\225\346\200\273\347\273\223.md" "b/3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\347\273\217\345\205\270\347\256\227\346\263\225\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "4-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\347\273\217\345\205\270\347\256\227\346\263\225\346\200\273\347\273\223.md" rename to "3-machine_learning/\346\234\272\345\231\250\345\255\246\344\271\240\347\273\217\345\205\270\347\256\227\346\263\225\346\200\273\347\273\223.md" diff --git a/5-deep_learning/README.md b/4-deep_learning/README.md old mode 100644 new mode 100755 similarity index 100% rename from 5-deep_learning/README.md rename to 4-deep_learning/README.md diff --git "a/5-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-tensor\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/4-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-tensor\346\225\260\346\215\256\347\273\223\346\236\204.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-tensor\346\225\260\346\215\256\347\273\223\346\236\204.md" rename to "4-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-tensor\346\225\260\346\215\256\347\273\223\346\236\204.md" diff --git "a/5-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-\345\274\240\351\207\217\345\237\272\346\234\254\346\223\215\344\275\234.md" "b/4-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-\345\274\240\351\207\217\345\237\272\346\234\254\346\223\215\344\275\234.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-\345\274\240\351\207\217\345\237\272\346\234\254\346\223\215\344\275\234.md" rename to "4-deep_learning/ml-dl-\346\241\206\346\236\266\347\254\224\350\256\260/Pytorch\345\237\272\347\241\200-\345\274\240\351\207\217\345\237\272\346\234\254\346\223\215\344\275\234.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\345\217\215\345\220\221\344\274\240\346\222\255\344\270\216\346\242\257\345\272\246\344\270\213\351\231\215\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\345\217\215\345\220\221\344\274\240\346\222\255\344\270\216\346\242\257\345\272\246\344\270\213\351\231\215\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\345\217\215\345\220\221\344\274\240\346\222\255\344\270\216\346\242\257\345\272\246\344\270\213\351\231\215\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\345\217\215\345\220\221\344\274\240\346\222\255\344\270\216\346\242\257\345\272\246\344\270\213\351\231\215\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\344\274\230\345\214\226\347\256\227\346\263\225\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\344\274\230\345\214\226\347\256\227\346\263\225\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\344\274\230\345\214\226\347\256\227\346\263\225\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\344\274\230\345\214\226\347\256\227\346\263\225\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\345\217\202\346\225\260\345\210\235\345\247\213\345\214\226\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\345\217\202\346\225\260\345\210\235\345\247\213\345\214\226\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\345\217\202\346\225\260\345\210\235\345\247\213\345\214\226\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\345\217\202\346\225\260\345\210\235\345\247\213\345\214\226\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\346\215\237\345\244\261\345\207\275\346\225\260\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\346\215\237\345\244\261\345\207\275\346\225\260\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\346\215\237\345\244\261\345\207\275\346\225\260\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200-\346\215\237\345\244\261\345\207\275\346\225\260\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-BN\345\261\202\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-BN\345\261\202\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-BN\345\261\202\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-BN\345\261\202\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\345\215\267\347\247\257\345\261\202\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\345\215\267\347\247\257\345\261\202\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\345\215\267\347\247\257\345\261\202\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\345\215\267\347\247\257\345\261\202\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\346\277\200\346\264\273\345\207\275\346\225\260\350\257\246\350\247\243.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\346\277\200\346\264\273\345\207\275\346\225\260\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\346\277\200\346\264\273\345\207\275\346\225\260\350\257\246\350\247\243.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\245\236\347\273\217\347\275\221\347\273\234\345\237\272\347\241\200\351\203\250\344\273\266-\346\277\200\346\264\273\345\207\275\346\225\260\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200\346\200\273\347\273\223.md" "b/4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200\346\200\273\347\273\223.md" rename to "4-deep_learning/\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200\346\200\273\347\273\223.md" diff --git "a/5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/DenseNet\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/DenseNet\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/DenseNet\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/DenseNet\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNetv2\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNetv2\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNetv2\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNetv2\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNet\347\275\221\347\273\234\350\257\246\350\247\243.md" "b/4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNet\347\275\221\347\273\234\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNet\347\275\221\347\273\234\350\257\246\350\247\243.md" rename to "4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/ResNet\347\275\221\347\273\234\350\257\246\350\247\243.md" diff --git "a/5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/densenet.py" "b/4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/densenet.py" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/densenet.py" rename to "4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/densenet.py" diff --git "a/5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/\347\273\217\345\205\270backbone\346\200\273\347\273\223.md" "b/4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/\347\273\217\345\205\270backbone\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "5-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/\347\273\217\345\205\270backbone\346\200\273\347\273\223.md" rename to "4-deep_learning/\347\273\217\345\205\270backbone\350\257\246\350\247\243/\347\273\217\345\205\270backbone\346\200\273\347\273\223.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/0-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\345\237\272\347\241\200.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/0-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\345\237\272\347\241\200.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/0-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\345\237\272\347\241\200.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/0-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\345\237\272\347\241\200.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/1-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\350\257\204\344\273\267\346\240\207\345\207\206-AP\344\270\216mAP.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/1-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\350\257\204\344\273\267\346\240\207\345\207\206-AP\344\270\216mAP.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/1-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\350\257\204\344\273\267\346\240\207\345\207\206-AP\344\270\216mAP.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/1-\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\350\257\204\344\273\267\346\240\207\345\207\206-AP\344\270\216mAP.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/2-Faster-RCNN\347\275\221\347\273\234\350\257\246\350\247\243.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/2-Faster-RCNN\347\275\221\347\273\234\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/2-Faster-RCNN\347\275\221\347\273\234\350\257\246\350\247\243.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/2-Faster-RCNN\347\275\221\347\273\234\350\257\246\350\247\243.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/3-FPN\347\275\221\347\273\234\350\257\246\350\247\243.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/3-FPN\347\275\221\347\273\234\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/3-FPN\347\275\221\347\273\234\350\257\246\350\247\243.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/3-FPN\347\275\221\347\273\234\350\257\246\350\247\243.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/4-Mask-RCNN\350\257\246\350\247\243.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/4-Mask-RCNN\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/4-Mask-RCNN\350\257\246\350\247\243.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/4-Mask-RCNN\350\257\246\350\247\243.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/5-Cascade-RCNN\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/5-Cascade-RCNN\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/5-Cascade-RCNN\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/5-Cascade-RCNN\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/6-RetinaNet\347\275\221\347\273\234\350\257\246\350\247\243.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/6-RetinaNet\347\275\221\347\273\234\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/6-RetinaNet\347\275\221\347\273\234\350\257\246\350\247\243.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/6-RetinaNet\347\275\221\347\273\234\350\257\246\350\247\243.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/7-YOLOv1-v5\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/7-YOLOv1-v5\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/7-YOLOv1-v5\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/7-YOLOv1-v5\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/8-Scaled-YOLOv4\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/8-Scaled-YOLOv4\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/8-Scaled-YOLOv4\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/8-Scaled-YOLOv4\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/encoder.py" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/encoder.py" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/encoder.py" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/encoder.py" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/model.py" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/model.py" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/model.py" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/simple_yolov2/model.py" diff --git "a/6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/yolov3_pytorch/darknet.py" "b/5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/yolov3_pytorch/darknet.py" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/yolov3_pytorch/darknet.py" rename to "5-computer_vision/2D\347\233\256\346\240\207\346\243\200\346\265\213/yolov3_pytorch/darknet.py" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/3D\350\247\206\350\247\211\347\256\227\346\263\225\345\210\235\345\255\246\346\246\202\350\277\260.md" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/3D\350\247\206\350\247\211\347\256\227\346\263\225\345\210\235\345\255\246\346\246\202\350\277\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/3D\350\247\206\350\247\211\347\256\227\346\263\225\345\210\235\345\255\246\346\246\202\350\277\260.md" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/3D\350\247\206\350\247\211\347\256\227\346\263\225\345\210\235\345\255\246\346\246\202\350\277\260.md" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-C4C_ZobpoY4ZxyqJ1wukVuzmtdQhQBz-HIoOvs0RGA.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-C4C_ZobpoY4ZxyqJ1wukVuzmtdQhQBz-HIoOvs0RGA.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-C4C_ZobpoY4ZxyqJ1wukVuzmtdQhQBz-HIoOvs0RGA.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-C4C_ZobpoY4ZxyqJ1wukVuzmtdQhQBz-HIoOvs0RGA.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-pmmwckHPeNaLaysLDujqcFl5NHZB6vVD67sBKhxNOQ.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-pmmwckHPeNaLaysLDujqcFl5NHZB6vVD67sBKhxNOQ.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-pmmwckHPeNaLaysLDujqcFl5NHZB6vVD67sBKhxNOQ.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/-pmmwckHPeNaLaysLDujqcFl5NHZB6vVD67sBKhxNOQ.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/2Hffp2Ah2aZCSjzTo7lZwi3pPaZ9MVB4szvGHwGUzxM.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/2Hffp2Ah2aZCSjzTo7lZwi3pPaZ9MVB4szvGHwGUzxM.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/2Hffp2Ah2aZCSjzTo7lZwi3pPaZ9MVB4szvGHwGUzxM.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/2Hffp2Ah2aZCSjzTo7lZwi3pPaZ9MVB4szvGHwGUzxM.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/5zz0t-vreeXLIjFuy3d0_DlB0gCBxn1zXlFUBcZxt_E.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/5zz0t-vreeXLIjFuy3d0_DlB0gCBxn1zXlFUBcZxt_E.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/5zz0t-vreeXLIjFuy3d0_DlB0gCBxn1zXlFUBcZxt_E.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/5zz0t-vreeXLIjFuy3d0_DlB0gCBxn1zXlFUBcZxt_E.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/8Ob5nzMaiIRZLVVECyi3oN-Z8XhfYzhAKhG5Xqc9Smk.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/8Ob5nzMaiIRZLVVECyi3oN-Z8XhfYzhAKhG5Xqc9Smk.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/8Ob5nzMaiIRZLVVECyi3oN-Z8XhfYzhAKhG5Xqc9Smk.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/8Ob5nzMaiIRZLVVECyi3oN-Z8XhfYzhAKhG5Xqc9Smk.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/F3eNAz6AKUBO5cQ2RPsJ3_Kvo-HpyCySzXutI_F5DOI.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/F3eNAz6AKUBO5cQ2RPsJ3_Kvo-HpyCySzXutI_F5DOI.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/F3eNAz6AKUBO5cQ2RPsJ3_Kvo-HpyCySzXutI_F5DOI.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/F3eNAz6AKUBO5cQ2RPsJ3_Kvo-HpyCySzXutI_F5DOI.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/GykkMJgoGhjNvzwm2yXnO262mGfO624uLKCkm80HIhU.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/GykkMJgoGhjNvzwm2yXnO262mGfO624uLKCkm80HIhU.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/GykkMJgoGhjNvzwm2yXnO262mGfO624uLKCkm80HIhU.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/GykkMJgoGhjNvzwm2yXnO262mGfO624uLKCkm80HIhU.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/J0OEbxtK5vPs73_KRBIRLbSue5Zu1VBkYCCZkN0zOSc.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/J0OEbxtK5vPs73_KRBIRLbSue5Zu1VBkYCCZkN0zOSc.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/J0OEbxtK5vPs73_KRBIRLbSue5Zu1VBkYCCZkN0zOSc.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/J0OEbxtK5vPs73_KRBIRLbSue5Zu1VBkYCCZkN0zOSc.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/LSBZuVhPc0_WdPBECTyX4HzdLCwxnXPY1YhRXK4hnu4.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/LSBZuVhPc0_WdPBECTyX4HzdLCwxnXPY1YhRXK4hnu4.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/LSBZuVhPc0_WdPBECTyX4HzdLCwxnXPY1YhRXK4hnu4.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/LSBZuVhPc0_WdPBECTyX4HzdLCwxnXPY1YhRXK4hnu4.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MVQ8XL6Habr26Nuq2pj3Jw2CuQeFU4D1EXkYZXGHFtM.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MVQ8XL6Habr26Nuq2pj3Jw2CuQeFU4D1EXkYZXGHFtM.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MVQ8XL6Habr26Nuq2pj3Jw2CuQeFU4D1EXkYZXGHFtM.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MVQ8XL6Habr26Nuq2pj3Jw2CuQeFU4D1EXkYZXGHFtM.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MaUac0nlYgvUgZVwIIp2B2Rn8kWpZpu1GXg1iP6nWBc.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MaUac0nlYgvUgZVwIIp2B2Rn8kWpZpu1GXg1iP6nWBc.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MaUac0nlYgvUgZVwIIp2B2Rn8kWpZpu1GXg1iP6nWBc.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MaUac0nlYgvUgZVwIIp2B2Rn8kWpZpu1GXg1iP6nWBc.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Mbb7-DFRD07EXmSOt8zoHyZ_bVtyPHRCkduDmGkUscA.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Mbb7-DFRD07EXmSOt8zoHyZ_bVtyPHRCkduDmGkUscA.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Mbb7-DFRD07EXmSOt8zoHyZ_bVtyPHRCkduDmGkUscA.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Mbb7-DFRD07EXmSOt8zoHyZ_bVtyPHRCkduDmGkUscA.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MvoWKwHhlo7R0Dmd7WMCCYAHSFhP93_1Pq4QPndaRxY.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MvoWKwHhlo7R0Dmd7WMCCYAHSFhP93_1Pq4QPndaRxY.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MvoWKwHhlo7R0Dmd7WMCCYAHSFhP93_1Pq4QPndaRxY.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/MvoWKwHhlo7R0Dmd7WMCCYAHSFhP93_1Pq4QPndaRxY.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Pdm7Tzj8dFVqucN8eY6ndAejR3PnsKJ3b3U0NYQy5uA.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Pdm7Tzj8dFVqucN8eY6ndAejR3PnsKJ3b3U0NYQy5uA.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Pdm7Tzj8dFVqucN8eY6ndAejR3PnsKJ3b3U0NYQy5uA.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/Pdm7Tzj8dFVqucN8eY6ndAejR3PnsKJ3b3U0NYQy5uA.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/W_MckQUPiPJQ1OgT9WF6IGExgZXz4ZSL5VppicOUfC4.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/W_MckQUPiPJQ1OgT9WF6IGExgZXz4ZSL5VppicOUfC4.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/W_MckQUPiPJQ1OgT9WF6IGExgZXz4ZSL5VppicOUfC4.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/W_MckQUPiPJQ1OgT9WF6IGExgZXz4ZSL5VppicOUfC4.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/b-KHrP8Z5byufrC3B4PHVrhsgdMiVhaUJ0tqKY59Lyk.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/b-KHrP8Z5byufrC3B4PHVrhsgdMiVhaUJ0tqKY59Lyk.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/b-KHrP8Z5byufrC3B4PHVrhsgdMiVhaUJ0tqKY59Lyk.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/b-KHrP8Z5byufrC3B4PHVrhsgdMiVhaUJ0tqKY59Lyk.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/dIFCzrqGsBuUHpjsPHHuTxo9qKmLudmIMx0U_FONin8.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/dIFCzrqGsBuUHpjsPHHuTxo9qKmLudmIMx0U_FONin8.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/dIFCzrqGsBuUHpjsPHHuTxo9qKmLudmIMx0U_FONin8.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/dIFCzrqGsBuUHpjsPHHuTxo9qKmLudmIMx0U_FONin8.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hB00c5gyeCh7We3LQFhAPh_IYp_R98Z08Oc5NhRxpr0.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hB00c5gyeCh7We3LQFhAPh_IYp_R98Z08Oc5NhRxpr0.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hB00c5gyeCh7We3LQFhAPh_IYp_R98Z08Oc5NhRxpr0.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hB00c5gyeCh7We3LQFhAPh_IYp_R98Z08Oc5NhRxpr0.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hHM7RRXZ8Jzce9fjABlruEhYDLwutHNOtc6zsMUIDCE.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hHM7RRXZ8Jzce9fjABlruEhYDLwutHNOtc6zsMUIDCE.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hHM7RRXZ8Jzce9fjABlruEhYDLwutHNOtc6zsMUIDCE.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/hHM7RRXZ8Jzce9fjABlruEhYDLwutHNOtc6zsMUIDCE.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/od05t0HHEArHqmf5MAOoz_IKMoc7otdHf3oHXicv5cc.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/od05t0HHEArHqmf5MAOoz_IKMoc7otdHf3oHXicv5cc.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/od05t0HHEArHqmf5MAOoz_IKMoc7otdHf3oHXicv5cc.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/od05t0HHEArHqmf5MAOoz_IKMoc7otdHf3oHXicv5cc.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/rBXnIbC9qHXn-qf_UTwhpYQLxFxXpGqWtAU1f-neY5g.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/rBXnIbC9qHXn-qf_UTwhpYQLxFxXpGqWtAU1f-neY5g.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/rBXnIbC9qHXn-qf_UTwhpYQLxFxXpGqWtAU1f-neY5g.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/rBXnIbC9qHXn-qf_UTwhpYQLxFxXpGqWtAU1f-neY5g.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/skVDD0wo9TdzMWwEoTzz0i9-ojaVHx_b43uCRbt_mOg.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/skVDD0wo9TdzMWwEoTzz0i9-ojaVHx_b43uCRbt_mOg.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/skVDD0wo9TdzMWwEoTzz0i9-ojaVHx_b43uCRbt_mOg.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/skVDD0wo9TdzMWwEoTzz0i9-ojaVHx_b43uCRbt_mOg.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/zxnT-RzBEc6SF6_lNSuZMRN0ZoKcBZBIx5XCXUzyRuI.png" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/zxnT-RzBEc6SF6_lNSuZMRN0ZoKcBZBIx5XCXUzyRuI.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/zxnT-RzBEc6SF6_lNSuZMRN0ZoKcBZBIx5XCXUzyRuI.png" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/images/zxnT-RzBEc6SF6_lNSuZMRN0ZoKcBZBIx5XCXUzyRuI.png" diff --git "a/6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/\345\215\225\347\233\2563D\347\233\256\346\240\207\346\243\200\346\265\213\347\273\274\350\277\260.md" "b/5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/\345\215\225\347\233\2563D\347\233\256\346\240\207\346\243\200\346\265\213\347\273\274\350\277\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/\345\215\225\347\233\2563D\347\233\256\346\240\207\346\243\200\346\265\213\347\273\274\350\277\260.md" rename to "5-computer_vision/3D\350\247\206\350\247\211\347\256\227\346\263\225/\345\215\225\347\233\2563D\347\233\256\346\240\207\346\243\200\346\265\213\347\273\274\350\277\260.md" diff --git a/6-computer_vision/README.md b/5-computer_vision/README.md old mode 100644 new mode 100755 similarity index 100% rename from 6-computer_vision/README.md rename to 5-computer_vision/README.md diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/Halcon\345\277\253\351\200\237\345\205\245\351\227\250.md" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/Halcon\345\277\253\351\200\237\345\205\245\351\227\250.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/Halcon\345\277\253\351\200\237\345\205\245\351\227\250.md" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/Halcon\345\277\253\351\200\237\345\205\245\351\227\250.md" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/2Z2fsCtvc8KFMdb3QiEaP8xpffXncnZa6D80X-1LxBU.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/2Z2fsCtvc8KFMdb3QiEaP8xpffXncnZa6D80X-1LxBU.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/2Z2fsCtvc8KFMdb3QiEaP8xpffXncnZa6D80X-1LxBU.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/2Z2fsCtvc8KFMdb3QiEaP8xpffXncnZa6D80X-1LxBU.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/60JeE1RsfI7dZkNAbWOsNPfBCFnfYjEyPVzBhdu9608.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/60JeE1RsfI7dZkNAbWOsNPfBCFnfYjEyPVzBhdu9608.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/60JeE1RsfI7dZkNAbWOsNPfBCFnfYjEyPVzBhdu9608.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/60JeE1RsfI7dZkNAbWOsNPfBCFnfYjEyPVzBhdu9608.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/VNgcDM4MGpl71dUvQxivi2Y_ew3fTs8YfBEaW5HBhOc.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/VNgcDM4MGpl71dUvQxivi2Y_ew3fTs8YfBEaW5HBhOc.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/VNgcDM4MGpl71dUvQxivi2Y_ew3fTs8YfBEaW5HBhOc.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/VNgcDM4MGpl71dUvQxivi2Y_ew3fTs8YfBEaW5HBhOc.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/Y4dbFB2uVmDG4RDZR43QV9rf_RvGU9F7OkZeTdNx2W8.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/Y4dbFB2uVmDG4RDZR43QV9rf_RvGU9F7OkZeTdNx2W8.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/Y4dbFB2uVmDG4RDZR43QV9rf_RvGU9F7OkZeTdNx2W8.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/Y4dbFB2uVmDG4RDZR43QV9rf_RvGU9F7OkZeTdNx2W8.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/halcon_all_technology.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/halcon_all_technology.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/halcon_all_technology.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/halcon_all_technology.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/iNZX2hXuI-15Wpl8vgptbQt68uvNW4XKZib0ill5smc.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/iNZX2hXuI-15Wpl8vgptbQt68uvNW4XKZib0ill5smc.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/iNZX2hXuI-15Wpl8vgptbQt68uvNW4XKZib0ill5smc.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/iNZX2hXuI-15Wpl8vgptbQt68uvNW4XKZib0ill5smc.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/is7S4w_iEzSLet8Nrrf5N1Xmqsmqg6-4zcjZq4XQwXY.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/is7S4w_iEzSLet8Nrrf5N1Xmqsmqg6-4zcjZq4XQwXY.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/is7S4w_iEzSLet8Nrrf5N1Xmqsmqg6-4zcjZq4XQwXY.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/is7S4w_iEzSLet8Nrrf5N1Xmqsmqg6-4zcjZq4XQwXY.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/vjTTNDFp8mu84iqX4nFsNR2lz73yBCzhIrd1Q_rpwoU.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/vjTTNDFp8mu84iqX4nFsNR2lz73yBCzhIrd1Q_rpwoU.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/vjTTNDFp8mu84iqX4nFsNR2lz73yBCzhIrd1Q_rpwoU.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/vjTTNDFp8mu84iqX4nFsNR2lz73yBCzhIrd1Q_rpwoU.png" diff --git "a/6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/y71JYj6lZWGd_w1M_qYUBCCmE_F5_qwDPbJCVMpi2w8.png" "b/5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/y71JYj6lZWGd_w1M_qYUBCCmE_F5_qwDPbJCVMpi2w8.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/y71JYj6lZWGd_w1M_qYUBCCmE_F5_qwDPbJCVMpi2w8.png" rename to "5-computer_vision/\345\267\245\344\270\232\350\247\206\350\247\211/images/y71JYj6lZWGd_w1M_qYUBCCmE_F5_qwDPbJCVMpi2w8.png" diff --git "a/6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/OpenCV3\345\237\272\346\234\254\345\207\275\346\225\260\346\200\273\347\273\223.md" "b/5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/OpenCV3\345\237\272\346\234\254\345\207\275\346\225\260\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/OpenCV3\345\237\272\346\234\254\345\207\275\346\225\260\346\200\273\347\273\223.md" rename to "5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/OpenCV3\345\237\272\346\234\254\345\207\275\346\225\260\346\200\273\347\273\223.md" diff --git "a/6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\343\200\212\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\343\200\212\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\343\200\212\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" rename to "5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\343\200\212\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\343\200\213\345\255\246\344\271\240\347\254\224\350\256\260.md" diff --git "a/6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\345\237\272\347\241\200\346\200\273\347\273\223.md" "b/5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\345\237\272\347\241\200\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\345\237\272\347\241\200\346\200\273\347\273\223.md" rename to "5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\345\237\272\347\241\200\346\200\273\347\273\223.md" diff --git "a/6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200.md" "b/5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200.md" rename to "5-computer_vision/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200.md" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/GitHub\350\275\246\347\211\214\346\243\200\346\265\213\350\257\206\345\210\253\351\241\271\347\233\256\350\260\203\347\240\224.md" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/GitHub\350\275\246\347\211\214\346\243\200\346\265\213\350\257\206\345\210\253\351\241\271\347\233\256\350\260\203\347\240\224.md" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/GitHub\350\275\246\347\211\214\346\243\200\346\265\213\350\257\206\345\210\253\351\241\271\347\233\256\350\260\203\347\240\224.md" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/GitHub\350\275\246\347\211\214\346\243\200\346\265\213\350\257\206\345\210\253\351\241\271\347\233\256\350\260\203\347\240\224.md" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/draw_heart.py" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/draw_heart.py" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/draw_heart.py" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/draw_heart.py" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/3P3kdiqVB-vK7HB8rDzzO6709vwzReZNyoSC6zkFcsI.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/3P3kdiqVB-vK7HB8rDzzO6709vwzReZNyoSC6zkFcsI.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/3P3kdiqVB-vK7HB8rDzzO6709vwzReZNyoSC6zkFcsI.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/3P3kdiqVB-vK7HB8rDzzO6709vwzReZNyoSC6zkFcsI.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/APLu0--q-6TzQiYWoTi67xdCSegS4ttYvNmGrjTM-dg.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/APLu0--q-6TzQiYWoTi67xdCSegS4ttYvNmGrjTM-dg.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/APLu0--q-6TzQiYWoTi67xdCSegS4ttYvNmGrjTM-dg.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/APLu0--q-6TzQiYWoTi67xdCSegS4ttYvNmGrjTM-dg.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/I7wWb2r4ISku4rQVXocPVqqZUKoFK_xfUiNi-TlTWps.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/I7wWb2r4ISku4rQVXocPVqqZUKoFK_xfUiNi-TlTWps.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/I7wWb2r4ISku4rQVXocPVqqZUKoFK_xfUiNi-TlTWps.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/I7wWb2r4ISku4rQVXocPVqqZUKoFK_xfUiNi-TlTWps.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/IzWv2M5byDYrFjfEn72D3utamQBOt1VEH6QKXrtIVT0.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/IzWv2M5byDYrFjfEn72D3utamQBOt1VEH6QKXrtIVT0.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/IzWv2M5byDYrFjfEn72D3utamQBOt1VEH6QKXrtIVT0.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/IzWv2M5byDYrFjfEn72D3utamQBOt1VEH6QKXrtIVT0.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VIQbFB89OddugypQOgLcDnKc1WHBMZYTWYnLRHfS8Ww.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VIQbFB89OddugypQOgLcDnKc1WHBMZYTWYnLRHfS8Ww.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VIQbFB89OddugypQOgLcDnKc1WHBMZYTWYnLRHfS8Ww.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VIQbFB89OddugypQOgLcDnKc1WHBMZYTWYnLRHfS8Ww.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VLz6rWrCqeKwwam3nmUrkqLVNpz41UuCMyKCoEOGo0I.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VLz6rWrCqeKwwam3nmUrkqLVNpz41UuCMyKCoEOGo0I.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VLz6rWrCqeKwwam3nmUrkqLVNpz41UuCMyKCoEOGo0I.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VLz6rWrCqeKwwam3nmUrkqLVNpz41UuCMyKCoEOGo0I.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VWygFsrxKEcxjMz0FyHDDDzZHbSTo6ld_OPQUL1bi7c.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VWygFsrxKEcxjMz0FyHDDDzZHbSTo6ld_OPQUL1bi7c.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VWygFsrxKEcxjMz0FyHDDDzZHbSTo6ld_OPQUL1bi7c.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/VWygFsrxKEcxjMz0FyHDDDzZHbSTo6ld_OPQUL1bi7c.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/cQqnGpGROhQlijX3y0O49gKC2FDCB4Fi74ohbpqLM0I.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/cQqnGpGROhQlijX3y0O49gKC2FDCB4Fi74ohbpqLM0I.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/cQqnGpGROhQlijX3y0O49gKC2FDCB4Fi74ohbpqLM0I.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/cQqnGpGROhQlijX3y0O49gKC2FDCB4Fi74ohbpqLM0I.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/ezd3183AJ2p-qmagngS6xuRh0DhRr9-JNx28hfzMvAk.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/ezd3183AJ2p-qmagngS6xuRh0DhRr9-JNx28hfzMvAk.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/ezd3183AJ2p-qmagngS6xuRh0DhRr9-JNx28hfzMvAk.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/ezd3183AJ2p-qmagngS6xuRh0DhRr9-JNx28hfzMvAk.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/hriCBh_8tKR3wZoZYlH2xzW-_mBkBg_qYS4LcqbK1pI.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/hriCBh_8tKR3wZoZYlH2xzW-_mBkBg_qYS4LcqbK1pI.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/hriCBh_8tKR3wZoZYlH2xzW-_mBkBg_qYS4LcqbK1pI.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/hriCBh_8tKR3wZoZYlH2xzW-_mBkBg_qYS4LcqbK1pI.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/pUyi-ZkKb2cjGwAvKW7-BlTlvXVP-PhZn6NX7QKZYVY.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/pUyi-ZkKb2cjGwAvKW7-BlTlvXVP-PhZn6NX7QKZYVY.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/pUyi-ZkKb2cjGwAvKW7-BlTlvXVP-PhZn6NX7QKZYVY.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/pUyi-ZkKb2cjGwAvKW7-BlTlvXVP-PhZn6NX7QKZYVY.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/sJ4KbMutjDf06BoNGTowQ9PlDBOtGDOubH0F2v6oVRY.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/sJ4KbMutjDf06BoNGTowQ9PlDBOtGDOubH0F2v6oVRY.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/sJ4KbMutjDf06BoNGTowQ9PlDBOtGDOubH0F2v6oVRY.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/sJ4KbMutjDf06BoNGTowQ9PlDBOtGDOubH0F2v6oVRY.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/wwDzK1eodp-sPMQ9tuh5Jx3f4NwyM0SiHDkszRmSpPw.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/wwDzK1eodp-sPMQ9tuh5Jx3f4NwyM0SiHDkszRmSpPw.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/wwDzK1eodp-sPMQ9tuh5Jx3f4NwyM0SiHDkszRmSpPw.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/wwDzK1eodp-sPMQ9tuh5Jx3f4NwyM0SiHDkszRmSpPw.png" diff --git "a/6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/xrKKcLUfs9MQMInqyI_6Sa-YuihZHWtR7JIMbyB8uJU.png" "b/5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/xrKKcLUfs9MQMInqyI_6Sa-YuihZHWtR7JIMbyB8uJU.png" old mode 100644 new mode 100755 similarity index 100% rename from "6-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/xrKKcLUfs9MQMInqyI_6Sa-YuihZHWtR7JIMbyB8uJU.png" rename to "5-computer_vision/\351\241\271\347\233\256\345\256\236\350\267\265/images/xrKKcLUfs9MQMInqyI_6Sa-YuihZHWtR7JIMbyB8uJU.png" diff --git a/7-model_compression/README.md b/6-model_compression/README.md old mode 100644 new mode 100755 similarity index 100% rename from 7-model_compression/README.md rename to 6-model_compression/README.md diff --git "a/7-model_compression/\345\215\267\347\247\257\347\275\221\347\273\234\345\216\213\347\274\251\346\226\271\346\263\225\346\200\273\347\273\223.md" "b/6-model_compression/\345\215\267\347\247\257\347\275\221\347\273\234\345\216\213\347\274\251\346\226\271\346\263\225\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\345\215\267\347\247\257\347\275\221\347\273\234\345\216\213\347\274\251\346\226\271\346\263\225\346\200\273\347\273\223.md" rename to "6-model_compression/\345\215\267\347\247\257\347\275\221\347\273\234\345\216\213\347\274\251\346\226\271\346\263\225\346\200\273\347\273\223.md" diff --git "a/7-model_compression/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226\345\237\272\347\241\200.md" "b/6-model_compression/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226\345\237\272\347\241\200.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226\345\237\272\347\241\200.md" rename to "6-model_compression/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226/\347\245\236\347\273\217\347\275\221\347\273\234\351\207\217\345\214\226\345\237\272\347\241\200.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/CSPNet\350\256\272\346\226\207\350\257\246\350\247\243.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/CSPNet\350\256\272\346\226\207\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/CSPNet\350\256\272\346\226\207\350\257\246\350\247\243.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/CSPNet\350\256\272\346\226\207\350\257\246\350\247\243.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/MobileNetv1\350\256\272\346\226\207\350\257\246\350\247\243.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/MobileNetv1\350\256\272\346\226\207\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/MobileNetv1\350\256\272\346\226\207\350\257\246\350\247\243.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/MobileNetv1\350\256\272\346\226\207\350\257\246\350\247\243.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/RepVGG\350\256\272\346\226\207\350\257\246\350\247\243.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/RepVGG\350\256\272\346\226\207\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/RepVGG\350\256\272\346\226\207\350\257\246\350\247\243.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/RepVGG\350\256\272\346\226\207\350\257\246\350\247\243.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/ShuffleNetv2\350\256\272\346\226\207\350\257\246\350\247\243.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/ShuffleNetv2\350\256\272\346\226\207\350\257\246\350\247\243.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/ShuffleNetv2\350\256\272\346\226\207\350\257\246\350\247\243.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/ShuffleNetv2\350\256\272\346\226\207\350\257\246\350\247\243.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/VoVNet\350\256\272\346\226\207\350\247\243\350\257\273.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/VoVNet\350\256\272\346\226\207\350\247\243\350\257\273.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/VoVNet\350\256\272\346\226\207\350\247\243\350\257\273.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/VoVNet\350\256\272\346\226\207\350\247\243\350\257\273.md" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/vovnet.py" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/vovnet.py" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/vovnet.py" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/vovnet.py" diff --git "a/7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/\350\275\273\351\207\217\347\272\247\346\250\241\345\236\213\350\256\276\350\256\241\344\270\216\351\203\250\347\275\262\346\200\273\347\273\223.md" "b/6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/\350\275\273\351\207\217\347\272\247\346\250\241\345\236\213\350\256\276\350\256\241\344\270\216\351\203\250\347\275\262\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "7-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/\350\275\273\351\207\217\347\272\247\346\250\241\345\236\213\350\256\276\350\256\241\344\270\216\351\203\250\347\275\262\346\200\273\347\273\223.md" rename to "6-model_compression/\350\275\273\351\207\217\347\272\247\347\275\221\347\273\234\350\256\272\346\226\207\350\247\243\346\236\220/\350\275\273\351\207\217\347\272\247\346\250\241\345\236\213\350\256\276\350\256\241\344\270\216\351\203\250\347\275\262\346\200\273\347\273\223.md" diff --git "a/8-high-performance_computing/0-\345\244\204\347\220\206\345\231\250\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/7-high-performance_computing/0-\345\244\204\347\220\206\345\231\250\345\237\272\347\241\200\347\237\245\350\257\206.md" old mode 100644 new mode 100755 similarity index 100% rename from "8-high-performance_computing/0-\345\244\204\347\220\206\345\231\250\345\237\272\347\241\200\347\237\245\350\257\206.md" rename to "7-high-performance_computing/0-\345\244\204\347\220\206\345\231\250\345\237\272\347\241\200\347\237\245\350\257\206.md" diff --git "a/8-high-performance_computing/1-\345\215\267\347\247\257\347\256\227\346\263\225\347\232\204\344\274\230\345\214\226.md" "b/7-high-performance_computing/1-\345\215\267\347\247\257\347\256\227\346\263\225\347\232\204\344\274\230\345\214\226.md" old mode 100644 new mode 100755 similarity index 100% rename from "8-high-performance_computing/1-\345\215\267\347\247\257\347\256\227\346\263\225\347\232\204\344\274\230\345\214\226.md" rename to "7-high-performance_computing/1-\345\215\267\347\247\257\347\256\227\346\263\225\347\232\204\344\274\230\345\214\226.md" diff --git "a/8-high-performance_computing/2-\346\250\241\345\236\213\347\274\226\350\257\221\344\274\230\345\214\226.md" "b/7-high-performance_computing/2-\346\250\241\345\236\213\347\274\226\350\257\221\344\274\230\345\214\226.md" old mode 100644 new mode 100755 similarity index 100% rename from "8-high-performance_computing/2-\346\250\241\345\236\213\347\274\226\350\257\221\344\274\230\345\214\226.md" rename to "7-high-performance_computing/2-\346\250\241\345\236\213\347\274\226\350\257\221\344\274\230\345\214\226.md" diff --git a/8-high-performance_computing/README.md b/7-high-performance_computing/README.md old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/README.md rename to 7-high-performance_computing/README.md diff --git a/8-high-performance_computing/images/50ede7f0-9d94-4d16-8c61-0438f39b3900.png b/7-high-performance_computing/images/50ede7f0-9d94-4d16-8c61-0438f39b3900.png old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/images/50ede7f0-9d94-4d16-8c61-0438f39b3900.png rename to 7-high-performance_computing/images/50ede7f0-9d94-4d16-8c61-0438f39b3900.png diff --git a/8-high-performance_computing/images/5bf8b57e-8a78-4de8-8499-7fc9960af1f0.png b/7-high-performance_computing/images/5bf8b57e-8a78-4de8-8499-7fc9960af1f0.png old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/images/5bf8b57e-8a78-4de8-8499-7fc9960af1f0.png rename to 7-high-performance_computing/images/5bf8b57e-8a78-4de8-8499-7fc9960af1f0.png diff --git a/8-high-performance_computing/images/7ef2efa9-1119-4c4d-9bc8-bb006ef6eaf6.png b/7-high-performance_computing/images/7ef2efa9-1119-4c4d-9bc8-bb006ef6eaf6.png old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/images/7ef2efa9-1119-4c4d-9bc8-bb006ef6eaf6.png rename to 7-high-performance_computing/images/7ef2efa9-1119-4c4d-9bc8-bb006ef6eaf6.png diff --git a/8-high-performance_computing/images/ac614b82-a91a-4803-901e-30dc58399cf8.png b/7-high-performance_computing/images/ac614b82-a91a-4803-901e-30dc58399cf8.png old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/images/ac614b82-a91a-4803-901e-30dc58399cf8.png rename to 7-high-performance_computing/images/ac614b82-a91a-4803-901e-30dc58399cf8.png diff --git a/8-high-performance_computing/images/fa36902b-ad65-44ea-9fd3-9464fd0fd83c.png b/7-high-performance_computing/images/fa36902b-ad65-44ea-9fd3-9464fd0fd83c.png old mode 100644 new mode 100755 similarity index 100% rename from 8-high-performance_computing/images/fa36902b-ad65-44ea-9fd3-9464fd0fd83c.png rename to 7-high-performance_computing/images/fa36902b-ad65-44ea-9fd3-9464fd0fd83c.png diff --git "a/8-high-performance_computing/\351\200\232\347\224\250\347\237\251\351\230\265\344\271\230\347\256\227\346\263\225\344\273\216\345\205\245\351\227\250\345\210\260\345\256\236\350\267\265.md" "b/7-high-performance_computing/\351\200\232\347\224\250\347\237\251\351\230\265\344\271\230\347\256\227\346\263\225\344\273\216\345\205\245\351\227\250\345\210\260\345\256\236\350\267\265.md" old mode 100644 new mode 100755 similarity index 100% rename from "8-high-performance_computing/\351\200\232\347\224\250\347\237\251\351\230\265\344\271\230\347\256\227\346\263\225\344\273\216\345\205\245\351\227\250\345\210\260\345\256\236\350\267\265.md" rename to "7-high-performance_computing/\351\200\232\347\224\250\347\237\251\351\230\265\344\271\230\347\256\227\346\263\225\344\273\216\345\205\245\351\227\250\345\210\260\345\256\236\350\267\265.md" diff --git a/9-model_deploy/README.md b/8-model_deploy/README.md old mode 100644 new mode 100755 similarity index 100% rename from 9-model_deploy/README.md rename to 8-model_deploy/README.md diff --git "a/9-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/ONNX\346\250\241\345\236\213\345\210\206\346\236\220\344\270\216\344\275\277\347\224\250.md" "b/8-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/ONNX\346\250\241\345\236\213\345\210\206\346\236\220\344\270\216\344\275\277\347\224\250.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/ONNX\346\250\241\345\236\213\345\210\206\346\236\220\344\270\216\344\275\277\347\224\250.md" rename to "8-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/ONNX\346\250\241\345\236\213\345\210\206\346\236\220\344\270\216\344\275\277\347\224\250.md" diff --git "a/9-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/TensorRT\345\237\272\347\241\200\347\254\224\350\256\260.md" "b/8-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/TensorRT\345\237\272\347\241\200\347\254\224\350\256\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/TensorRT\345\237\272\347\241\200\347\254\224\350\256\260.md" rename to "8-model_deploy/\346\216\250\347\220\206\346\241\206\346\236\266/TensorRT\345\237\272\347\241\200\347\254\224\350\256\260.md" diff --git "a/9-model_deploy/\346\250\241\345\236\213\345\216\213\347\274\251\351\203\250\347\275\262\346\246\202\350\277\260.md" "b/8-model_deploy/\346\250\241\345\236\213\345\216\213\347\274\251\351\203\250\347\275\262\346\246\202\350\277\260.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\346\250\241\345\236\213\345\216\213\347\274\251\351\203\250\347\275\262\346\246\202\350\277\260.md" rename to "8-model_deploy/\346\250\241\345\236\213\345\216\213\347\274\251\351\203\250\347\275\262\346\246\202\350\277\260.md" diff --git "a/9-model_deploy/\346\250\241\345\236\213\346\235\277\347\253\257\346\216\250\347\220\206.md" "b/8-model_deploy/\346\250\241\345\236\213\346\235\277\347\253\257\346\216\250\347\220\206.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\346\250\241\345\236\213\346\235\277\347\253\257\346\216\250\347\220\206.md" rename to "8-model_deploy/\346\250\241\345\236\213\346\235\277\347\253\257\346\216\250\347\220\206.md" diff --git "a/9-model_deploy/\346\250\241\345\236\213\350\275\254\346\215\242\346\200\273\347\273\223.md" "b/8-model_deploy/\346\250\241\345\236\213\350\275\254\346\215\242\346\200\273\347\273\223.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\346\250\241\345\236\213\350\275\254\346\215\242\346\200\273\347\273\223.md" rename to "8-model_deploy/\346\250\241\345\236\213\350\275\254\346\215\242\346\200\273\347\273\223.md" diff --git "a/9-model_deploy/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/8-model_deploy/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" old mode 100644 new mode 100755 similarity index 100% rename from "9-model_deploy/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" rename to "8-model_deploy/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/SUMMARY.md b/SUMMARY.md old mode 100644 new mode 100755 diff --git a/book.json b/book.json old mode 100644 new mode 100755 diff --git "a/cv\347\256\227\346\263\225\345\267\245\347\250\213\345\270\210\346\210\220\351\225\277\350\267\257\347\272\277.md" "b/cv\347\256\227\346\263\225\345\267\245\347\250\213\345\270\210\346\210\220\351\225\277\350\267\257\347\272\277.md" old mode 100644 new mode 100755 diff --git a/data/article_cover/Backtracking_algorithm.png b/data/article_cover/Backtracking_algorithm.png old mode 100644 new mode 100755 diff --git a/data/article_cover/Divide_and_Conquer_GeeksforGeeks.png b/data/article_cover/Divide_and_Conquer_GeeksforGeeks.png old mode 100644 new mode 100755 diff --git a/data/article_cover/Neural_Network_in_Deep_Learning.png b/data/article_cover/Neural_Network_in_Deep_Learning.png old mode 100644 new mode 100755 diff --git a/data/article_cover/alipay.png b/data/article_cover/alipay.png old mode 100644 new mode 100755 diff --git a/data/article_cover/dp.jpeg b/data/article_cover/dp.jpeg old mode 100644 new mode 100755 diff --git a/data/article_cover/neural_network_flops.png b/data/article_cover/neural_network_flops.png old mode 100644 new mode 100755 diff --git a/data/article_cover/nms.png b/data/article_cover/nms.png old mode 100644 new mode 100755 diff --git a/data/article_cover/qrcode_258.jpg b/data/article_cover/qrcode_258.jpg old mode 100644 new mode 100755 diff --git a/data/article_cover/qrcode_430.jpg b/data/article_cover/qrcode_430.jpg old mode 100644 new mode 100755 diff --git a/data/article_cover/wechat.png b/data/article_cover/wechat.png old mode 100644 new mode 100755 diff --git "a/data/article_cover/\350\264\252\345\277\203\347\256\227\346\263\225.png" "b/data/article_cover/\350\264\252\345\277\203\347\256\227\346\263\225.png" old mode 100644 new mode 100755 diff --git a/data/code/pytorch_note.py b/data/code/pytorch_note.py old mode 100644 new mode 100755 diff --git a/data/icons/Home-on-Zhihu.svg b/data/icons/Home-on-Zhihu.svg old mode 100644 new mode 100755 diff --git a/data/images/10-fold_cross_validation.png b/data/images/10-fold_cross_validation.png old mode 100644 new mode 100755 diff --git "a/data/images/11\347\202\271\350\256\241\347\256\227AP\345\205\254\345\274\217.png" "b/data/images/11\347\202\271\350\256\241\347\256\227AP\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/2.1\351\223\276\350\241\250.png" "b/data/images/2.1\351\223\276\350\241\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/2\344\270\2523_3\345\215\267\347\247\257\345\261\202.png" "b/data/images/2\344\270\2523_3\345\215\267\347\247\257\345\261\202.png" old mode 100644 new mode 100755 diff --git "a/data/images/4.3\345\206\215\350\260\210\345\244\247O\350\241\250\347\244\272\346\263\225.png" "b/data/images/4.3\345\206\215\350\260\210\345\244\247O\350\241\250\347\244\272\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/5.4\346\200\247\350\203\275.png" "b/data/images/5.4\346\200\247\350\203\275.png" old mode 100644 new mode 100755 diff --git "a/data/images/7.2\347\216\257\347\244\272\346\204\217\345\233\276.png" "b/data/images/7.2\347\216\257\347\244\272\346\204\217\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/7.4\345\233\276\347\256\227\346\263\225\351\227\256\351\242\230.png" "b/data/images/7.4\345\233\276\347\256\227\346\263\225\351\227\256\351\242\230.png" old mode 100644 new mode 100755 diff --git "a/data/images/9.2-\350\203\214\345\214\205\351\227\256\351\242\230.jpg" "b/data/images/9.2-\350\203\214\345\214\205\351\227\256\351\242\230.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/9.2-\350\203\214\345\214\205\351\227\256\351\242\230\345\205\254\347\244\272\345\233\276.png" "b/data/images/9.2-\350\203\214\345\214\205\351\227\256\351\242\230\345\205\254\347\244\272\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/Adjacency_List.png b/data/images/Adjacency_List.png old mode 100644 new mode 100755 diff --git a/data/images/Adjacency_Matrix.png b/data/images/Adjacency_Matrix.png old mode 100644 new mode 100755 diff --git "a/data/images/C++ Primer\345\255\246\344\271\240\347\254\224\350\256\260.png" "b/data/images/C++ Primer\345\255\246\344\271\240\347\254\224\350\256\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/Bc07opCOaRwoXfaL6Q9x3FcilncZyWqh1xunhUb_NNI.png" "b/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/Bc07opCOaRwoXfaL6Q9x3FcilncZyWqh1xunhUb_NNI.png" old mode 100644 new mode 100755 diff --git "a/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/aynStdgXKbMQypwFBrSinqCBacMOMzKB4O5ZfxmRVR8.png" "b/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/aynStdgXKbMQypwFBrSinqCBacMOMzKB4O5ZfxmRVR8.png" old mode 100644 new mode 100755 diff --git "a/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/b0QrXV9457SwR4CamDMD103u3Fka0b0JRO2qknTYtqo.png" "b/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/b0QrXV9457SwR4CamDMD103u3Fka0b0JRO2qknTYtqo.png" old mode 100644 new mode 100755 diff --git "a/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/f5ZI3_vc4AHIDauujjkxUdE6vhYYdwRmDp31hVZsuk0.png" "b/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/f5ZI3_vc4AHIDauujjkxUdE6vhYYdwRmDp31hVZsuk0.png" old mode 100644 new mode 100755 diff --git "a/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/ml59Jk5gnJije7fLRPKilgjgH-Txur8rfcHx4OWf9vA.png" "b/data/images/C++\346\227\245\346\234\237\345\222\214\346\227\266\351\227\264\347\274\226\347\250\213\346\200\273\347\273\223/ml59Jk5gnJije7fLRPKilgjgH-Txur8rfcHx4OWf9vA.png" old mode 100644 new mode 100755 diff --git "a/data/images/CPU/RISC\346\234\272\345\231\250\347\232\204\344\272\224\345\261\202\346\265\201\346\260\264\347\272\277.png" "b/data/images/CPU/RISC\346\234\272\345\231\250\347\232\204\344\272\224\345\261\202\346\265\201\346\260\264\347\272\277.png" old mode 100644 new mode 100755 diff --git "a/data/images/CPU/\344\270\200\350\210\254\347\232\204\345\233\233\345\261\202\346\265\201\346\260\264\347\272\277\346\236\266\346\236\204.png" "b/data/images/CPU/\344\270\200\350\210\254\347\232\204\345\233\233\345\261\202\346\265\201\346\260\264\347\272\277\346\236\266\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/CPU/\345\271\266\345\217\221\344\270\216\345\271\266\350\241\214\347\232\204\351\200\232\344\277\227\347\220\206\350\247\243.png" "b/data/images/CPU/\345\271\266\345\217\221\344\270\216\345\271\266\350\241\214\347\232\204\351\200\232\344\277\227\347\220\206\350\247\243.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/DenseNet\345\222\214CSPDenseNet\347\273\223\346\236\204\345\233\276.png" "b/data/images/CSPNet/DenseNet\345\222\214CSPDenseNet\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/DenseNet\347\232\204\345\257\206\351\233\206\345\261\202\346\235\203\351\207\215\346\233\264\346\226\260\345\205\254\345\274\217.png" "b/data/images/CSPNet/DenseNet\347\232\204\345\257\206\351\233\206\345\261\202\346\235\203\351\207\215\346\233\264\346\226\260\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/EFM\344\270\212\347\232\204\346\266\210\350\236\215\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/CSPNet/EFM\344\270\212\347\232\204\346\266\210\350\236\215\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/FPN-GFM-EFM\347\273\223\346\236\204\345\233\276.png" "b/data/images/CSPNet/FPN-GFM-EFM\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/CSPNet/Figure3.png b/data/images/CSPNet/Figure3.png old mode 100644 new mode 100755 diff --git a/data/images/CSPNet/Figure5.png b/data/images/CSPNet/Figure5.png old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/\344\270\215\345\220\214Transition-layer\347\232\204\345\257\271\346\257\224\345\256\236\351\252\214.png" "b/data/images/CSPNet/\344\270\215\345\220\214Transition-layer\347\232\204\345\257\271\346\257\224\345\256\236\351\252\214.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/\345\222\214\345\210\206\347\261\273backbone\347\273\223\345\220\210\345\220\216\347\232\204\346\225\210\346\236\234.png" "b/data/images/CSPNet/\345\222\214\345\210\206\347\261\273backbone\347\273\223\345\220\210\345\220\216\347\232\204\346\225\210\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/CSPNet/\345\222\214\347\233\256\346\240\207\346\243\200\346\265\213\347\275\221\347\273\234\347\273\223\345\220\210\345\220\216\347\232\204\346\225\210\346\236\234.png" "b/data/images/CSPNet/\345\222\214\347\233\256\346\240\207\346\243\200\346\265\213\347\275\221\347\273\234\347\273\223\345\220\210\345\220\216\347\232\204\346\225\210\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/CV\347\256\227\346\263\225\345\267\245\347\250\213\345\270\210\345\272\224\346\216\214\346\217\241\347\237\245\350\257\206\347\202\271.png" "b/data/images/CV\347\256\227\346\263\225\345\267\245\347\250\213\345\270\210\345\272\224\346\216\214\346\217\241\347\237\245\350\257\206\347\202\271.png" old mode 100644 new mode 100755 diff --git "a/data/images/FPN/4\347\247\215\351\207\221\345\255\227\345\241\224\347\273\223\346\236\204.jpg" "b/data/images/FPN/4\347\247\215\351\207\221\345\255\227\345\241\224\347\273\223\346\236\204.jpg" old mode 100644 new mode 100755 diff --git a/data/images/FPN/Figure2.png b/data/images/FPN/Figure2.png old mode 100644 new mode 100755 diff --git "a/data/images/FPN/fpn\347\273\223\346\236\204\347\244\272\346\204\217\345\233\276.jpg" "b/data/images/FPN/fpn\347\273\223\346\236\204\347\244\272\346\204\217\345\233\276.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/FPN/resnet\347\273\223\346\236\204\345\217\202\346\225\260\345\233\276.png" "b/data/images/FPN/resnet\347\273\223\346\236\204\345\217\202\346\225\260\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/FPN/\345\257\271\346\257\224\350\257\225\351\252\214.png" "b/data/images/FPN/\345\257\271\346\257\224\350\257\225\351\252\214.png" old mode 100644 new mode 100755 diff --git a/data/images/FindFirstCommonNode.png b/data/images/FindFirstCommonNode.png old mode 100644 new mode 100755 diff --git "a/data/images/GPU/4x4\347\237\251\351\230\265\344\271\230\346\263\225\344\270\2163\347\273\264\350\256\241\347\256\227\345\215\225\345\205\203.jpg" "b/data/images/GPU/4x4\347\237\251\351\230\265\344\271\230\346\263\225\344\270\2163\347\273\264\350\256\241\347\256\227\345\215\225\345\205\203.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/HOG\347\211\271\345\276\201\346\243\200\346\265\213\346\255\245\351\252\244.jpg" "b/data/images/HOG\347\211\271\345\276\201\346\243\200\346\265\213\346\255\245\351\252\244.jpg" old mode 100644 new mode 100755 diff --git a/data/images/Hash_collision.png b/data/images/Hash_collision.png old mode 100644 new mode 100755 diff --git "a/data/images/IOU\350\256\241\347\256\227\345\205\254\345\274\217.png" "b/data/images/IOU\350\256\241\347\256\227\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/NMS\350\277\207\347\250\213.png" "b/data/images/NMS\350\277\207\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/N\347\273\264\347\251\272\351\227\264\346\255\243\345\244\252\345\210\206\345\270\203\346\226\271\347\250\213.png" "b/data/images/N\347\273\264\347\251\272\351\227\264\346\255\243\345\244\252\345\210\206\345\270\203\346\226\271\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/PATH\347\216\257\345\242\203.png" "b/data/images/PATH\347\216\257\345\242\203.png" old mode 100644 new mode 100755 diff --git "a/data/images/PR\346\233\262\347\272\277\345\233\276.jpeg" "b/data/images/PR\346\233\262\347\272\277\345\233\276.jpeg" old mode 100644 new mode 100755 diff --git a/data/images/README.md b/data/images/README.md old mode 100644 new mode 100755 diff --git "a/data/images/ROI_Align\350\276\223\345\205\245\350\276\223\345\207\272\345\217\212\346\223\215\344\275\234\350\277\207\347\250\213\345\233\276.png" "b/data/images/ROI_Align\350\276\223\345\205\245\350\276\223\345\207\272\345\217\212\346\223\215\344\275\234\350\277\207\347\250\213\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/RepVGG/Figure2.png b/data/images/RepVGG/Figure2.png old mode 100644 new mode 100755 diff --git a/data/images/RepVGG/resnet18_parameter.png b/data/images/RepVGG/resnet18_parameter.png old mode 100644 new mode 100755 diff --git "a/data/images/RepVGG/\345\233\2762.png" "b/data/images/RepVGG/\345\233\2762.png" old mode 100644 new mode 100755 diff --git "a/data/images/RepVGG/\345\233\2764.png" "b/data/images/RepVGG/\345\233\2764.png" old mode 100644 new mode 100755 diff --git "a/data/images/RepVGG/\346\216\250\347\220\206\351\230\266\346\256\265\345\215\267\347\247\257\345\261\202\350\236\215\345\220\210.png" "b/data/images/RepVGG/\346\216\250\347\220\206\351\230\266\346\256\265\345\215\267\347\247\257\345\261\202\350\236\215\345\220\210.png" old mode 100644 new mode 100755 diff --git "a/data/images/ResNeXt/ResNeXt\345\222\214Resnet\347\232\204block\345\257\271\346\257\224\345\233\276.png" "b/data/images/ResNeXt/ResNeXt\345\222\214Resnet\347\232\204block\345\257\271\346\257\224\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/ResNeXt/ResNeXt\345\222\214Resnet\347\232\204\346\250\241\345\236\213\347\273\223\346\236\204\345\217\202\346\225\260\345\257\271\346\257\224\345\233\276.png" "b/data/images/ResNeXt/ResNeXt\345\222\214Resnet\347\232\204\346\250\241\345\236\213\347\273\223\346\236\204\345\217\202\346\225\260\345\257\271\346\257\224\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/TensorRT/TensorRT\345\267\245\344\275\234\346\265\201\347\250\213.jpg" "b/data/images/TensorRT/TensorRT\345\267\245\344\275\234\346\265\201\347\250\213.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/TensorRT/\350\256\255\347\273\203\345\222\214\346\216\250\347\220\206.jpg" "b/data/images/TensorRT/\350\256\255\347\273\203\345\222\214\346\216\250\347\220\206.jpg" old mode 100644 new mode 100755 diff --git a/data/images/VoVNet/Figure1.png b/data/images/VoVNet/Figure1.png old mode 100644 new mode 100755 diff --git a/data/images/VoVNet/Figure2-middle-bottom.png b/data/images/VoVNet/Figure2-middle-bottom.png old mode 100644 new mode 100755 diff --git a/data/images/VoVNet/Figure2.png b/data/images/VoVNet/Figure2.png old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/GPU\350\203\275\350\200\227\350\256\241\347\256\227\345\205\254\345\274\217.png" "b/data/images/VoVNet/GPU\350\203\275\350\200\227\350\256\241\347\256\227\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/GPU\350\256\241\347\256\227\346\225\210\347\216\207\345\257\271\346\257\224\345\256\236\351\252\214.png" "b/data/images/VoVNet/GPU\350\256\241\347\256\227\346\225\210\347\216\207\345\257\271\346\257\224\345\256\236\351\252\214.png" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/OSA\345\222\214\345\257\206\351\233\206\350\277\236\346\216\245.png" "b/data/images/VoVNet/OSA\345\222\214\345\257\206\351\233\206\350\277\236\346\216\245.png" old mode 100644 new mode 100755 diff --git a/data/images/VoVNet/Table4.png b/data/images/VoVNet/Table4.png old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/VOVNet-27\345\211\2152\344\270\252stage.jpg" "b/data/images/VoVNet/VOVNet-27\345\211\2152\344\270\252stage.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/VoVNet\347\275\221\347\273\234\347\273\223\346\236\204\346\246\202\350\247\210.png" "b/data/images/VoVNet/VoVNet\347\275\221\347\273\234\347\273\223\346\236\204\346\246\202\350\247\210.png" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/bottleneck\351\252\214\350\257\201\345\256\236\351\252\214.png" "b/data/images/VoVNet/bottleneck\351\252\214\350\257\201\345\256\236\351\252\214.png" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/mask-rcnn\344\270\212\347\232\204\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/VoVNet/mask-rcnn\344\270\212\347\232\204\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/VoVNet/\345\257\271\346\257\224\345\256\236\351\252\214.png" "b/data/images/VoVNet/\345\257\271\346\257\224\345\256\236\351\252\214.png" old mode 100644 new mode 100755 diff --git "a/data/images/activation_function copy/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\260.png" "b/data/images/activation_function copy/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/activation_function copy/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\2602.png" "b/data/images/activation_function copy/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\2602.png" old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/activation_function_summary.png b/data/images/activation_function copy/activation_function_summary.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/neuron.png b/data/images/activation_function copy/neuron.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/relu_and_gradient_curve.png b/data/images/activation_function copy/relu_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/relu_and_gradient_curve2.png b/data/images/activation_function copy/relu_and_gradient_curve2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/relu_more.png b/data/images/activation_function copy/relu_more.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/sigmoid_and_gradient_curve.png b/data/images/activation_function copy/sigmoid_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/sigmoid_and_gradient_curve2.png b/data/images/activation_function copy/sigmoid_and_gradient_curve2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/sigmoid_and_tanh_gradient_curve.png b/data/images/activation_function copy/sigmoid_and_tanh_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/sigmoid_tanh_curve.png b/data/images/activation_function copy/sigmoid_tanh_curve.png old mode 100644 new mode 100755 diff --git "a/data/images/activation_function copy/sigmoid\345\207\275\346\225\260\345\222\214tanh\345\207\275\346\225\260.png" "b/data/images/activation_function copy/sigmoid\345\207\275\346\225\260\345\222\214tanh\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/swish_of_different_beta.png b/data/images/activation_function copy/swish_of_different_beta.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/swish_of_different_beta2.png b/data/images/activation_function copy/swish_of_different_beta2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/tanh_and_gradient.png b/data/images/activation_function copy/tanh_and_gradient.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/tanh_and_gradient_curve.png b/data/images/activation_function copy/tanh_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function copy/three_regression_loss.png b/data/images/activation_function copy/three_regression_loss.png old mode 100644 new mode 100755 diff --git "a/data/images/activation_function copy/\345\205\270\345\236\213\347\232\204\347\245\236\347\273\217\345\205\203\346\236\266\346\236\204.png" "b/data/images/activation_function copy/\345\205\270\345\236\213\347\232\204\347\245\236\347\273\217\345\205\203\346\236\266\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/activation_function/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\260.png" "b/data/images/activation_function/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/activation_function/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\2602.png" "b/data/images/activation_function/Logistic\345\207\275\346\225\260\345\222\214Tanh\345\207\275\346\225\2602.png" old mode 100644 new mode 100755 diff --git a/data/images/activation_function/activation_function_summary.png b/data/images/activation_function/activation_function_summary.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/neuron.png b/data/images/activation_function/neuron.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/relu_and_gradient_curve.png b/data/images/activation_function/relu_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/relu_and_gradient_curve2.png b/data/images/activation_function/relu_and_gradient_curve2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/relu_more.png b/data/images/activation_function/relu_more.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/sigmoid_and_gradient_curve.png b/data/images/activation_function/sigmoid_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/sigmoid_and_gradient_curve2.png b/data/images/activation_function/sigmoid_and_gradient_curve2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/sigmoid_and_tanh_gradient_curve.png b/data/images/activation_function/sigmoid_and_tanh_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/sigmoid_tanh_curve.png b/data/images/activation_function/sigmoid_tanh_curve.png old mode 100644 new mode 100755 diff --git "a/data/images/activation_function/sigmoid\345\207\275\346\225\260\345\222\214tanh\345\207\275\346\225\260.png" "b/data/images/activation_function/sigmoid\345\207\275\346\225\260\345\222\214tanh\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git a/data/images/activation_function/swish_of_different_beta.png b/data/images/activation_function/swish_of_different_beta.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/swish_of_different_beta2.png b/data/images/activation_function/swish_of_different_beta2.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/tanh_and_gradient.png b/data/images/activation_function/tanh_and_gradient.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/tanh_and_gradient_curve.png b/data/images/activation_function/tanh_and_gradient_curve.png old mode 100644 new mode 100755 diff --git a/data/images/activation_function/three_regression_loss.png b/data/images/activation_function/three_regression_loss.png old mode 100644 new mode 100755 diff --git "a/data/images/activation_function/\345\205\270\345\236\213\347\232\204\347\245\236\347\273\217\345\205\203\346\236\266\346\236\204.png" "b/data/images/activation_function/\345\205\270\345\236\213\347\232\204\347\245\236\347\273\217\345\205\203\346\236\266\346\236\204.png" old mode 100644 new mode 100755 diff --git a/data/images/array/linear_table.webp b/data/images/array/linear_table.webp new file mode 100644 index 00000000..9a136c62 Binary files /dev/null and b/data/images/array/linear_table.webp differ diff --git a/data/images/array/nonlinear_table.png b/data/images/array/nonlinear_table.png new file mode 100644 index 00000000..dc947239 Binary files /dev/null and b/data/images/array/nonlinear_table.png differ diff --git a/data/images/avl.png b/data/images/avl.png old mode 100644 new mode 100755 diff --git "a/data/images/backbone/3\347\247\215DenseNet\347\273\223\346\236\204\347\224\273\346\263\225.png" "b/data/images/backbone/3\347\247\215DenseNet\347\273\223\346\236\204\347\224\273\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/backbone/Figure3\345\207\240\347\247\215\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204CSP.png" "b/data/images/backbone/Figure3\345\207\240\347\247\215\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204CSP.png" old mode 100644 new mode 100755 diff --git "a/data/images/backbone/Inception\346\250\241\345\235\227.jpg" "b/data/images/backbone/Inception\346\250\241\345\235\227.jpg" old mode 100644 new mode 100755 diff --git a/data/images/backbone/VGG.png b/data/images/backbone/VGG.png old mode 100644 new mode 100755 diff --git a/data/images/backbone/VoVNet.png b/data/images/backbone/VoVNet.png old mode 100644 new mode 100755 diff --git a/data/images/backbone/VoVNetv2.png b/data/images/backbone/VoVNetv2.png old mode 100644 new mode 100755 diff --git a/data/images/backbone/darknet53.png b/data/images/backbone/darknet53.png old mode 100644 new mode 100755 diff --git "a/data/images/backbone/densenet-block\347\273\223\346\236\204\345\233\276.png" "b/data/images/backbone/densenet-block\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/backbone/inceptionv3onc--oview.png b/data/images/backbone/inceptionv3onc--oview.png old mode 100644 new mode 100755 diff --git a/data/images/backbone/resnet.png b/data/images/backbone/resnet.png old mode 100644 new mode 100755 diff --git "a/data/images/backbone/resnet\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" "b/data/images/backbone/resnet\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/backbone/resnext\347\232\204\345\215\267\347\247\257block\345\222\214resnet\347\232\204\345\257\271\346\257\224\345\233\276.png" "b/data/images/backbone/resnext\347\232\204\345\215\267\347\247\257block\345\222\214resnet\347\232\204\345\257\271\346\257\224\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/backbone/resnext\347\232\204\347\273\223\346\236\204\345\217\202\346\225\260\345\222\214resnet\347\232\204\345\257\271\346\257\224\345\233\276.png" "b/data/images/backbone/resnext\347\232\204\347\273\223\346\236\204\345\217\202\346\225\260\345\222\214resnet\347\232\204\345\257\271\346\257\224\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/backbone/\345\220\204\347\247\215VoVNet\347\273\223\346\236\204.png" "b/data/images/backbone/\345\220\204\347\247\215VoVNet\347\273\223\346\236\204.png" old mode 100644 new mode 100755 diff --git a/data/images/binary_search_tree.png b/data/images/binary_search_tree.png old mode 100644 new mode 100755 diff --git a/data/images/binary_tree.png b/data/images/binary_tree.png old mode 100644 new mode 100755 diff --git a/data/images/binary_tree2.png b/data/images/binary_tree2.png old mode 100644 new mode 100755 diff --git a/data/images/binary_tree_define.png b/data/images/binary_tree_define.png old mode 100644 new mode 100755 diff --git a/data/images/binary_tree_traverse.png b/data/images/binary_tree_traverse.png old mode 100644 new mode 100755 diff --git a/data/images/bn/Figure_4.png b/data/images/bn/Figure_4.png old mode 100644 new mode 100755 diff --git a/data/images/bn/Normal_Distribution.png b/data/images/bn/Normal_Distribution.png old mode 100644 new mode 100755 diff --git a/data/images/bn/algorithm2.png b/data/images/bn/algorithm2.png old mode 100644 new mode 100755 diff --git a/data/images/bn/bn_algorithm.png b/data/images/bn/bn_algorithm.png old mode 100644 new mode 100755 diff --git a/data/images/bn/bn_fp.png b/data/images/bn/bn_fp.png old mode 100644 new mode 100755 diff --git a/data/images/bn/bn_fp_shape.png b/data/images/bn/bn_fp_shape.png old mode 100644 new mode 100755 diff --git a/data/images/bn/normal-distribution-curve-1.png b/data/images/bn/normal-distribution-curve-1.png old mode 100644 new mode 100755 diff --git a/data/images/bn/normal_distribution_curve.png b/data/images/bn/normal_distribution_curve.png old mode 100644 new mode 100755 diff --git a/data/images/bn/normal_distribution_curve2.png b/data/images/bn/normal_distribution_curve2.png old mode 100644 new mode 100755 diff --git a/data/images/bp/Direction_Derivative_Definition.png b/data/images/bp/Direction_Derivative_Definition.png old mode 100644 new mode 100755 diff --git a/data/images/bp/Directional_Derivative_Visual.png b/data/images/bp/Directional_Derivative_Visual.png old mode 100644 new mode 100755 diff --git a/data/images/bp/Tangent_function_animation.gif b/data/images/bp/Tangent_function_animation.gif old mode 100644 new mode 100755 diff --git a/data/images/bp/curve_slope.png b/data/images/bp/curve_slope.png old mode 100644 new mode 100755 diff --git a/data/images/bp/demo.png b/data/images/bp/demo.png old mode 100644 new mode 100755 diff --git a/data/images/bp/different_lr_loss.png b/data/images/bp/different_lr_loss.png old mode 100644 new mode 100755 diff --git a/data/images/bp/gd_concept.png b/data/images/bp/gd_concept.png old mode 100644 new mode 100755 diff --git a/data/images/bp/gd_double_variable1.png b/data/images/bp/gd_double_variable1.png old mode 100644 new mode 100755 diff --git a/data/images/bp/gd_double_variable2.png b/data/images/bp/gd_double_variable2.png old mode 100644 new mode 100755 diff --git a/data/images/bp/grad_compute.png b/data/images/bp/grad_compute.png old mode 100644 new mode 100755 diff --git "a/data/images/bp/\347\275\221\347\273\234\347\273\223\346\236\204\344\270\216\345\211\215\345\220\221\350\256\241\347\256\227\345\233\276.png" "b/data/images/bp/\347\275\221\347\273\234\347\273\223\346\236\204\344\270\216\345\211\215\345\220\221\350\256\241\347\256\227\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/bst.png b/data/images/bst.png old mode 100644 new mode 100755 diff --git a/data/images/cascade-rcnn/Figure1.png b/data/images/cascade-rcnn/Figure1.png old mode 100644 new mode 100755 diff --git a/data/images/cascade-rcnn/Figure2.png b/data/images/cascade-rcnn/Figure2.png old mode 100644 new mode 100755 diff --git "a/data/images/cascade-rcnn/cascade_rcnn\345\222\214\345\205\266\344\273\226\346\241\206\346\236\266\347\232\204\347\275\221\347\273\234\347\273\223\346\236\204\347\256\200\347\225\245\345\233\276.png" "b/data/images/cascade-rcnn/cascade_rcnn\345\222\214\345\205\266\344\273\226\346\241\206\346\236\266\347\232\204\347\275\221\347\273\234\347\273\223\346\236\204\347\256\200\347\225\245\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/cascade-rcnn/\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/cascade-rcnn/\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/cascade-rcnn/\346\217\220\345\215\207IOU\351\230\210\345\200\274\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.png" "b/data/images/cascade-rcnn/\346\217\220\345\215\207IOU\351\230\210\345\200\274\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.png" old mode 100644 new mode 100755 diff --git "a/data/images/cascade-rcnn/\346\217\220\351\253\230IoU\351\230\210\345\200\274\347\232\204\345\275\261\345\223\215.png" "b/data/images/cascade-rcnn/\346\217\220\351\253\230IoU\351\230\210\345\200\274\347\232\204\345\275\261\345\223\215.png" old mode 100644 new mode 100755 diff --git a/data/images/circle.png b/data/images/circle.png old mode 100644 new mode 100755 diff --git a/data/images/conv/Example-of-Convolutional-layer.png b/data/images/conv/Example-of-Convolutional-layer.png old mode 100644 new mode 100755 diff --git a/data/images/conv/cnn_demo1.jpeg b/data/images/conv/cnn_demo1.jpeg old mode 100644 new mode 100755 diff --git a/data/images/conv/cnn_explainer.png b/data/images/conv/cnn_explainer.png old mode 100644 new mode 100755 diff --git a/data/images/conv/cnn_structure.png b/data/images/conv/cnn_structure.png old mode 100644 new mode 100755 diff --git a/data/images/conv/conv3d.png b/data/images/conv/conv3d.png old mode 100644 new mode 100755 diff --git a/data/images/conv/conv_dynamic_visual.gif b/data/images/conv/conv_dynamic_visual.gif old mode 100644 new mode 100755 diff --git a/data/images/conv/conv_visual.gif b/data/images/conv/conv_visual.gif old mode 100644 new mode 100755 diff --git a/data/images/conv/dw_conv.png b/data/images/conv/dw_conv.png old mode 100644 new mode 100755 diff --git a/data/images/conv/ful_conv.png b/data/images/conv/ful_conv.png old mode 100644 new mode 100755 diff --git a/data/images/conv/ful_conv2.png b/data/images/conv/ful_conv2.png old mode 100644 new mode 100755 diff --git a/data/images/conv/ful_conv3.png b/data/images/conv/ful_conv3.png old mode 100644 new mode 100755 diff --git a/data/images/conv/ful_conv_compare.png b/data/images/conv/ful_conv_compare.png old mode 100644 new mode 100755 diff --git a/data/images/conv/image1.png b/data/images/conv/image1.png old mode 100644 new mode 100755 diff --git a/data/images/conv/maxpool.gif b/data/images/conv/maxpool.gif old mode 100644 new mode 100755 diff --git a/data/images/conv/pool_cal.png b/data/images/conv/pool_cal.png old mode 100644 new mode 100755 diff --git a/data/images/conv/pool_cal2.png b/data/images/conv/pool_cal2.png old mode 100644 new mode 100755 diff --git "a/data/images/cpuz-\346\237\245\350\257\242cpu\344\277\241\346\201\257.png" "b/data/images/cpuz-\346\237\245\350\257\242cpu\344\277\241\346\201\257.png" old mode 100644 new mode 100755 diff --git "a/data/images/cpu\344\277\241\346\201\257\345\222\214Cache\345\244\247\345\260\217.png" "b/data/images/cpu\344\277\241\346\201\257\345\222\214Cache\345\244\247\345\260\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/cv2.imread\345\207\275\346\225\260.png" "b/data/images/cv2.imread\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/cv_learn/SNPE\345\274\200\345\217\221\346\265\201\347\250\213.png" "b/data/images/cv_learn/SNPE\345\274\200\345\217\221\346\265\201\347\250\213.png" old mode 100644 new mode 100755 diff --git a/data/images/cv_learn/deci_modelzoo.png b/data/images/cv_learn/deci_modelzoo.png old mode 100644 new mode 100755 diff --git a/data/images/cv_learn/math_basic_ml_dl.png b/data/images/cv_learn/math_basic_ml_dl.png old mode 100644 new mode 100755 diff --git a/data/images/cv_learn/way_of_learning.png b/data/images/cv_learn/way_of_learning.png old mode 100644 new mode 100755 diff --git "a/data/images/cv_learn/\350\213\261\344\274\237\350\276\276\346\236\266\346\236\204\345\217\221\345\261\225\345\217\262\346\210\252\346\255\242\345\210\2602020\345\271\264.png" "b/data/images/cv_learn/\350\213\261\344\274\237\350\276\276\346\236\266\346\236\204\345\217\221\345\261\225\345\217\262\346\210\252\346\255\242\345\210\2602020\345\271\264.png" old mode 100644 new mode 100755 diff --git "a/data/images/densenet/3\347\247\215DenseNet\347\273\223\346\236\204\347\224\273\346\263\225.png" "b/data/images/densenet/3\347\247\215DenseNet\347\273\223\346\236\204\347\224\273\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/densenet/densenet-block\347\273\223\346\236\204\345\233\276.png" "b/data/images/densenet/densenet-block\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/densenet/densenet\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/densenet/densenet\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/densenet/densenet\347\263\273\345\210\227\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" "b/data/images/densenet/densenet\347\263\273\345\210\227\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/densenet/densenet\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" "b/data/images/densenet/densenet\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/dict.png b/data/images/dict.png old mode 100644 new mode 100755 diff --git a/data/images/dl/courgette.log b/data/images/dl/courgette.log old mode 100644 new mode 100755 diff --git "a/data/images/dl/sigmoid\345\207\275\346\225\260\347\244\272\346\204\217\345\233\276.png" "b/data/images/dl/sigmoid\345\207\275\346\225\260\347\244\272\346\204\217\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/dl/\345\233\2765-2\344\270\211\344\270\252\346\250\241\345\236\213\346\213\237\345\220\210\344\272\214\346\254\241\345\207\275\346\225\260.png" "b/data/images/dl/\345\233\2765-2\344\270\211\344\270\252\346\250\241\345\236\213\346\213\237\345\220\210\344\272\214\346\254\241\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/dl/\345\233\2765.1-\344\270\200\344\270\252\347\272\277\346\200\247\345\233\236\345\275\222\347\232\204\344\276\213\345\255\220.png" "b/data/images/dl/\345\233\2765.1-\344\270\200\344\270\252\347\272\277\346\200\247\345\233\236\345\275\222\347\232\204\344\276\213\345\255\220.png" old mode 100644 new mode 100755 diff --git "a/data/images/dl/\346\235\241\344\273\266\346\246\202\347\216\207\347\232\204\351\223\276\345\274\217\346\263\225\345\210\231.png" "b/data/images/dl/\346\235\241\344\273\266\346\246\202\347\216\207\347\232\204\351\223\276\345\274\217\346\263\225\345\210\231.png" old mode 100644 new mode 100755 diff --git "a/data/images/dl/\351\253\230\346\226\257\345\210\206\345\270\203.png" "b/data/images/dl/\351\253\230\346\226\257\345\210\206\345\270\203.png" old mode 100644 new mode 100755 diff --git a/data/images/docker/-rnbIRGlVItC7zPytjVm_D-ReUsB5Jf9cP9S-e2atNA.png b/data/images/docker/-rnbIRGlVItC7zPytjVm_D-ReUsB5Jf9cP9S-e2atNA.png old mode 100644 new mode 100755 diff --git a/data/images/docker/DN6phxbTI-qJqDunkIdOgz6Gte1a--lUTVsIW5s8HZo.png b/data/images/docker/DN6phxbTI-qJqDunkIdOgz6Gte1a--lUTVsIW5s8HZo.png old mode 100644 new mode 100755 diff --git a/data/images/docker/EJgGulpCOPeBpHrsbzfdNrTuBYAKCaQGoLitWluROl8.png b/data/images/docker/EJgGulpCOPeBpHrsbzfdNrTuBYAKCaQGoLitWluROl8.png old mode 100644 new mode 100755 diff --git a/data/images/docker/ExVYsbQl5Uatb6Rk4h_PevAXETxUgb60O9fP1kYrsY0.png b/data/images/docker/ExVYsbQl5Uatb6Rk4h_PevAXETxUgb60O9fP1kYrsY0.png old mode 100644 new mode 100755 diff --git a/data/images/docker/GDJbbeZyUtoedXnjm5MNMOIKgdgoa6cqcnSo-FT7fP8.png b/data/images/docker/GDJbbeZyUtoedXnjm5MNMOIKgdgoa6cqcnSo-FT7fP8.png old mode 100644 new mode 100755 diff --git a/data/images/docker/L-xDvVjAV1tWJ6Gk6kr-hDXF-AwaxhIXYZEF2FDqzW0.png b/data/images/docker/L-xDvVjAV1tWJ6Gk6kr-hDXF-AwaxhIXYZEF2FDqzW0.png old mode 100644 new mode 100755 diff --git a/data/images/docker/OtA6evJeq4h1M5R-t_8pCiV41eII-K9lIsoBCa4qbBo.png b/data/images/docker/OtA6evJeq4h1M5R-t_8pCiV41eII-K9lIsoBCa4qbBo.png old mode 100644 new mode 100755 diff --git a/data/images/docker/Q2A9wZz1qY_yUxPzB7z6nVmcgAEz1T56qZt785MCIP0.png b/data/images/docker/Q2A9wZz1qY_yUxPzB7z6nVmcgAEz1T56qZt785MCIP0.png old mode 100644 new mode 100755 diff --git a/data/images/docker/VDaqCzSPqTxG2F5pY6Z3l7nWOUm1mcsufhAug8gNadA.png b/data/images/docker/VDaqCzSPqTxG2F5pY6Z3l7nWOUm1mcsufhAug8gNadA.png old mode 100644 new mode 100755 diff --git a/data/images/dp1.png b/data/images/dp1.png old mode 100644 new mode 100755 diff --git a/data/images/dp2.png b/data/images/dp2.png old mode 100644 new mode 100755 diff --git a/data/images/dropout.png b/data/images/dropout.png old mode 100644 new mode 100755 diff --git a/data/images/dropout_test.png b/data/images/dropout_test.png old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/A4000_specifications.png b/data/images/efficient_model/A4000_specifications.png old mode 100644 new mode 100755 diff --git "a/data/images/efficient_model/COVID-19\344\270\264\345\272\212\347\256\241\347\220\206 \345\212\250\346\200\201\346\214\207\345\257\274\346\226\207\344\273\266.pdf" "b/data/images/efficient_model/COVID-19\344\270\264\345\272\212\347\256\241\347\220\206 \345\212\250\346\200\201\346\214\207\345\257\274\346\226\207\344\273\266.pdf" old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/figure.png b/data/images/efficient_model/figure.png old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/gpu-devotes-more-transistors-to-data-processing.png b/data/images/efficient_model/gpu-devotes-more-transistors-to-data-processing.png old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/gpu_architecture.png b/data/images/efficient_model/gpu_architecture.png old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/gpu_architecture.webp b/data/images/efficient_model/gpu_architecture.webp old mode 100644 new mode 100755 diff --git a/data/images/efficient_model/model_perf.png b/data/images/efficient_model/model_perf.png old mode 100644 new mode 100755 diff --git "a/data/images/efficient_model/\347\226\227\346\263\225\344\270\2162019\345\206\240\347\212\266\347\227\205\346\257\222\347\227\205 \345\212\250\346\200\201\346\214\207\345\215\227.pdf" "b/data/images/efficient_model/\347\226\227\346\263\225\344\270\2162019\345\206\240\347\212\266\347\227\205\346\257\222\347\227\205 \345\212\250\346\200\201\346\214\207\345\215\227.pdf" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/Faster-rcnn\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" "b/data/images/faster-rcnn/Faster-rcnn\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/faster-rcnn/ROI-Align.png b/data/images/faster-rcnn/ROI-Align.png old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/ROI-Head\347\273\223\346\236\204\345\233\276.png" "b/data/images/faster-rcnn/ROI-Head\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/RPN\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" "b/data/images/faster-rcnn/RPN\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/anchor\347\244\272\344\276\213.png" "b/data/images/faster-rcnn/anchor\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/faster-rcnn\347\275\221\347\273\234\350\257\246\347\273\206\347\273\223\346\236\204\345\233\276.png" "b/data/images/faster-rcnn/faster-rcnn\347\275\221\347\273\234\350\257\246\347\273\206\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/faster-rcnn\350\277\236\346\216\245\345\233\276.jpg" "b/data/images/faster-rcnn/faster-rcnn\350\277\236\346\216\245\345\233\276.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/faster-rcnn/rpn\347\232\204loss\350\256\241\347\256\227\345\205\254\345\274\217.jpg" "b/data/images/faster-rcnn/rpn\347\232\204loss\350\256\241\347\256\227\345\205\254\345\274\217.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/flops/Roof-line\345\210\222\345\210\206\345\207\272\347\232\204\344\270\244\344\270\252\347\223\266\351\242\210\345\214\272\345\237\237.png" "b/data/images/flops/Roof-line\345\210\222\345\210\206\345\207\272\347\232\204\344\270\244\344\270\252\347\223\266\351\242\210\345\214\272\345\237\237.png" old mode 100644 new mode 100755 diff --git a/data/images/flops/conv_dynamic_visual.gif b/data/images/flops/conv_dynamic_visual.gif old mode 100644 new mode 100755 diff --git a/data/images/flops/roof-line.jpg b/data/images/flops/roof-line.jpg old mode 100644 new mode 100755 diff --git a/data/images/flops/thop_summary.png b/data/images/flops/thop_summary.png old mode 100644 new mode 100755 diff --git a/data/images/gemm-4x4-vectorize.jpeg b/data/images/gemm-4x4-vectorize.jpeg old mode 100644 new mode 100755 diff --git a/data/images/getIntersectionNode.jpg b/data/images/getIntersectionNode.jpg old mode 100644 new mode 100755 diff --git "a/data/images/gpu_programming/GPU\347\250\213\345\272\217\347\232\204\346\265\201\347\250\213.png" "b/data/images/gpu_programming/GPU\347\250\213\345\272\217\347\232\204\346\265\201\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/gpu_programming/\350\213\261\344\274\237\350\276\276gpu\346\236\266\346\236\204\345\217\221\345\261\225\345\217\262.png" "b/data/images/gpu_programming/\350\213\261\344\274\237\350\276\276gpu\346\236\266\346\236\204\345\217\221\345\261\225\345\217\262.png" old mode 100644 new mode 100755 diff --git a/data/images/heap_stack.png b/data/images/heap_stack.png old mode 100644 new mode 100755 diff --git "a/data/images/hr\344\272\244\346\265\201.jpg" "b/data/images/hr\344\272\244\346\265\201.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/iou\344\273\243\347\240\201\350\276\223\345\207\272\347\273\223\346\236\234.png" "b/data/images/iou\344\273\243\347\240\201\350\276\223\345\207\272\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git a/data/images/k-means.png b/data/images/k-means.png old mode 100644 new mode 100755 diff --git a/data/images/leetcode64_commit.png b/data/images/leetcode64_commit.png old mode 100644 new mode 100755 diff --git a/data/images/leetcode64_commit2.png b/data/images/leetcode64_commit2.png old mode 100644 new mode 100755 diff --git a/data/images/linked_list+hash_table.png b/data/images/linked_list+hash_table.png old mode 100644 new mode 100755 diff --git a/data/images/linked_list/single_linked_list.png b/data/images/linked_list/single_linked_list.png new file mode 100644 index 00000000..8177a1d3 Binary files /dev/null and b/data/images/linked_list/single_linked_list.png differ diff --git a/data/images/loss/define_loss.png b/data/images/loss/define_loss.png old mode 100644 new mode 100755 diff --git a/data/images/loss/loss_for_regression.png b/data/images/loss/loss_for_regression.png old mode 100644 new mode 100755 diff --git a/data/images/loss/softmax_process.png b/data/images/loss/softmax_process.png old mode 100644 new mode 100755 diff --git "a/data/images/loss/\344\272\214\345\210\206\347\261\273\344\272\244\345\217\211\347\206\265\346\215\237\345\244\261\345\207\275\346\225\260\345\233\276.png" "b/data/images/loss/\344\272\214\345\210\206\347\261\273\344\272\244\345\217\211\347\206\265\346\215\237\345\244\261\345\207\275\346\225\260\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/mask-rcnn/1fea46c9-d824-4833-9d71-9ba98683fe5c.jpg b/data/images/mask-rcnn/1fea46c9-d824-4833-9d71-9ba98683fe5c.jpg old mode 100644 new mode 100755 diff --git "a/data/images/mask-rcnn/mask-rcnn\347\275\221\347\273\234\347\273\223\346\236\204.png" "b/data/images/mask-rcnn/mask-rcnn\347\275\221\347\273\234\347\273\223\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/mask-rcnn/\345\257\271\346\257\224\350\257\225\351\252\214\347\273\223\346\236\234.png" "b/data/images/mask-rcnn/\345\257\271\346\257\224\350\257\225\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/BP\347\256\227\346\263\225\346\265\201\347\250\213.png" "b/data/images/ml/BP\347\256\227\346\263\225\346\265\201\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/BP\347\275\221\347\273\234.png" "b/data/images/ml/BP\347\275\221\347\273\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/MP\347\245\236\347\273\217\345\205\203\346\250\241\345\236\213.png" "b/data/images/ml/MP\347\245\236\347\273\217\345\205\203\346\250\241\345\236\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/PR\346\233\262\347\272\277.png" "b/data/images/ml/PR\346\233\262\347\272\277.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/ROC\346\233\262\347\272\277.png" "b/data/images/ml/ROC\346\233\262\347\272\277.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/v_ih\346\242\257\345\272\246\347\232\204\350\257\246\347\273\206\346\216\250\345\257\274\345\205\254\345\274\217.png" "b/data/images/ml/v_ih\346\242\257\345\272\246\347\232\204\350\257\246\347\273\206\346\216\250\345\257\274\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\345\244\232\345\261\202\345\211\215\351\246\210\347\245\236\347\273\217\347\275\221\347\273\234.png" "b/data/images/ml/\345\244\232\345\261\202\345\211\215\351\246\210\347\245\236\347\273\217\347\275\221\347\273\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\345\261\200\351\203\250\346\234\200\345\260\217\344\270\216\345\205\250\345\261\200\346\234\200\345\260\217.png" "b/data/images/ml/\345\261\200\351\203\250\346\234\200\345\260\217\344\270\216\345\205\250\345\261\200\346\234\200\345\260\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\346\204\237\347\237\245\346\234\272.png" "b/data/images/ml/\346\204\237\347\237\245\346\234\272.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\346\226\271\345\267\256\350\277\220\347\256\227\346\200\247\350\264\250.png" "b/data/images/ml/\346\226\271\345\267\256\350\277\220\347\256\227\346\200\247\350\264\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\346\234\237\346\234\233\346\200\247\350\264\250.png" "b/data/images/ml/\346\234\237\346\234\233\346\200\247\350\264\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml/\346\263\233\345\214\226\350\257\257\345\267\256\344\270\216\345\201\217\345\267\256\346\226\271\345\267\256\347\232\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.png" "b/data/images/ml/\346\263\233\345\214\226\350\257\257\345\267\256\344\270\216\345\201\217\345\267\256\346\226\271\345\267\256\347\232\204\345\205\263\347\263\273\347\244\272\346\204\217\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/ml_algorithm/euclidean_distance_formula.png b/data/images/ml_algorithm/euclidean_distance_formula.png old mode 100644 new mode 100755 diff --git a/data/images/ml_algorithm/knn_visual.png b/data/images/ml_algorithm/knn_visual.png old mode 100644 new mode 100755 diff --git a/data/images/ml_basc_principle/capacity.png b/data/images/ml_basc_principle/capacity.png old mode 100644 new mode 100755 diff --git a/data/images/ml_basc_principle/k-fold.png b/data/images/ml_basc_principle/k-fold.png old mode 100644 new mode 100755 diff --git a/data/images/ml_basc_principle/sgd.png b/data/images/ml_basc_principle/sgd.png old mode 100644 new mode 100755 diff --git a/data/images/ml_basc_principle/sgd2.png b/data/images/ml_basc_principle/sgd2.png old mode 100644 new mode 100755 diff --git "a/data/images/ml_basc_principle/\345\233\2765-2\344\270\211\344\270\252\346\250\241\345\236\213\346\213\237\345\220\210\344\272\214\346\254\241\345\207\275\346\225\260.png" "b/data/images/ml_basc_principle/\345\233\2765-2\344\270\211\344\270\252\346\250\241\345\236\213\346\213\237\345\220\210\344\272\214\346\254\241\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml_basc_principle/\345\233\2765-3model_capacity.png" "b/data/images/ml_basc_principle/\345\233\2765-3model_capacity.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml_basc_principle/\345\233\2765-6.png" "b/data/images/ml_basc_principle/\345\233\2765-6.png" old mode 100644 new mode 100755 diff --git "a/data/images/ml_basc_principle/\345\233\2765.1-\344\270\200\344\270\252\347\272\277\346\200\247\345\233\236\345\275\222\347\232\204\344\276\213\345\255\220.png" "b/data/images/ml_basc_principle/\345\233\2765.1-\344\270\200\344\270\252\347\272\277\346\200\247\345\233\236\345\275\222\347\232\204\344\276\213\345\255\220.png" old mode 100644 new mode 100755 diff --git a/data/images/ml_basic/3_machine_learing_tasks.png b/data/images/ml_basic/3_machine_learing_tasks.png old mode 100644 new mode 100755 diff --git a/data/images/ml_basic/mse.png b/data/images/ml_basic/mse.png old mode 100644 new mode 100755 diff --git a/data/images/ml_concept/Graphical_illustration_of_bias_variance.png b/data/images/ml_concept/Graphical_illustration_of_bias_variance.png old mode 100644 new mode 100755 diff --git a/data/images/ml_concept/model_capacity_bias_varience.png b/data/images/ml_concept/model_capacity_bias_varience.png old mode 100644 new mode 100755 diff --git a/data/images/ml_concept/model_capacity_under_over_fitting.png b/data/images/ml_concept/model_capacity_under_over_fitting.png old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/3x3\347\232\204\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257Block\347\273\223\346\236\204.png" "b/data/images/mobilenetv1/3x3\347\232\204\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257Block\347\273\223\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/Convolution\345\234\250CPU\344\270\216DSP\347\232\204\350\241\214\344\270\272\345\267\256\345\274\202.png" "b/data/images/mobilenetv1/Convolution\345\234\250CPU\344\270\216DSP\347\232\204\350\241\214\344\270\272\345\267\256\345\274\202.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/DW\345\215\267\347\247\257\350\256\241\347\256\227\346\255\245\351\252\244.jpg" "b/data/images/mobilenetv1/DW\345\215\267\347\247\257\350\256\241\347\256\227\346\255\245\351\252\244.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/PW\345\215\267\347\247\257\350\277\207\347\250\213.jpg" "b/data/images/mobilenetv1/PW\345\215\267\347\247\257\350\277\207\347\250\213.jpg" old mode 100644 new mode 100755 diff --git a/data/images/mobilenetv1/Xception.png b/data/images/mobilenetv1/Xception.png old mode 100644 new mode 100755 diff --git a/data/images/mobilenetv1/conv3d.png b/data/images/mobilenetv1/conv3d.png old mode 100644 new mode 100755 diff --git a/data/images/mobilenetv1/dw_conv.png b/data/images/mobilenetv1/dw_conv.png old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257.png" "b/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257\350\277\207\347\250\2131.png" "b/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257\350\277\207\347\250\2131.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257\350\277\207\347\250\2132.png" "b/data/images/mobilenetv1/\345\210\206\347\273\204\345\215\267\347\247\257\350\277\207\347\250\2132.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\346\240\207\345\207\206\345\215\267\347\247\257\350\277\207\347\250\213.png" "b/data/images/mobilenetv1/\346\240\207\345\207\206\345\215\267\347\247\257\350\277\207\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257block\347\232\204onnx\346\250\241\345\236\213\347\273\223\346\236\204\345\233\276.png" "b/data/images/mobilenetv1/\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257block\347\232\204onnx\346\250\241\345\236\213\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257\347\232\204\350\256\241\347\256\227\346\255\245\351\252\244.png" "b/data/images/mobilenetv1/\346\267\261\345\272\246\345\217\257\345\210\206\347\246\273\345\215\267\347\247\257\347\232\204\350\256\241\347\256\227\346\255\245\351\252\244.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\346\273\244\346\263\242\345\231\250\345\260\272\345\257\270.png" "b/data/images/mobilenetv1/\346\273\244\346\263\242\345\231\250\345\260\272\345\257\270.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\350\241\2501.png" "b/data/images/mobilenetv1/\350\241\2501.png" old mode 100644 new mode 100755 diff --git "a/data/images/mobilenetv1/\350\241\2502.png" "b/data/images/mobilenetv1/\350\241\2502.png" old mode 100644 new mode 100755 diff --git "a/data/images/opencv/opencv\345\233\276\345\203\217\347\237\251\351\230\265\347\232\204\345\255\230\345\202\250\346\240\274\345\274\217.png" "b/data/images/opencv/opencv\345\233\276\345\203\217\347\237\251\351\230\265\347\232\204\345\255\230\345\202\250\346\240\274\345\274\217.png" old mode 100644 new mode 100755 diff --git a/data/images/optimizers/10_optimizers.png b/data/images/optimizers/10_optimizers.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/adam_algorithm.png b/data/images/optimizers/adam_algorithm.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/momentum_algorithm.png b/data/images/optimizers/momentum_algorithm.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/momentum_algorithm_update.png b/data/images/optimizers/momentum_algorithm_update.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/op_momentum_train_loss_log.png b/data/images/optimizers/op_momentum_train_loss_log.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/op_nag_train_loss_log.png b/data/images/optimizers/op_nag_train_loss_log.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/op_sgd_train_loss_log.png b/data/images/optimizers/op_sgd_train_loss_log.png old mode 100644 new mode 100755 diff --git a/data/images/optimizers/sgd_algorithm.png b/data/images/optimizers/sgd_algorithm.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/4GjLOFJv3__gjLkru7fU5DlPrU68R6mmI0Y6daaFPuc.png b/data/images/pandas/4GjLOFJv3__gjLkru7fU5DlPrU68R6mmI0Y6daaFPuc.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/5NqSbp4XB_LEPBOnbqRv27Ou3Of3RNL1-6zib6v9l7I.png b/data/images/pandas/5NqSbp4XB_LEPBOnbqRv27Ou3Of3RNL1-6zib6v9l7I.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/6suW8Y3Om3nd9x6b0-GdWDCssQVsltgFion2NLZv-vM.png b/data/images/pandas/6suW8Y3Om3nd9x6b0-GdWDCssQVsltgFion2NLZv-vM.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/GUFyyIupGf-1EizI7KuJBtuogx9O83eWMPZGMHWgNV0.png b/data/images/pandas/GUFyyIupGf-1EizI7KuJBtuogx9O83eWMPZGMHWgNV0.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/HdxGMf8q3VQvdnWZelz2xtTBOQYju7PxKFsJO-Azm74.png b/data/images/pandas/HdxGMf8q3VQvdnWZelz2xtTBOQYju7PxKFsJO-Azm74.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/LVh77V4fUh10o4mU5AloGJg_spSi3H1cHvrGhxg3whY.png b/data/images/pandas/LVh77V4fUh10o4mU5AloGJg_spSi3H1cHvrGhxg3whY.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/NYmjzWqZnomg7PIbJQx3KYgg3--Xb0MpCpjBKSyK4Mc.png b/data/images/pandas/NYmjzWqZnomg7PIbJQx3KYgg3--Xb0MpCpjBKSyK4Mc.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/_7XUyaBIMZVAO41Ih8BY10W21yMODIQz9SNWmFekhWQ.png b/data/images/pandas/_7XUyaBIMZVAO41Ih8BY10W21yMODIQz9SNWmFekhWQ.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/b5g2YOTWsxoPnIZxyeSOkoV3P_8nxJpXSsf2ZuLO7co.png b/data/images/pandas/b5g2YOTWsxoPnIZxyeSOkoV3P_8nxJpXSsf2ZuLO7co.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/bVlf3zi_oCdjSzgdHHfeya1rYQUMWgLPWmYUsGMXi30.png b/data/images/pandas/bVlf3zi_oCdjSzgdHHfeya1rYQUMWgLPWmYUsGMXi30.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/dHcDtD_Y6NZGCUIb_zVvp_5lJLBZaTzZTm823dlaqmg.png b/data/images/pandas/dHcDtD_Y6NZGCUIb_zVvp_5lJLBZaTzZTm823dlaqmg.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/eN7Nbjg4bMr0CpiB0C44WN_TidMdM_1_kemHxwk3XIM.png b/data/images/pandas/eN7Nbjg4bMr0CpiB0C44WN_TidMdM_1_kemHxwk3XIM.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/mehHOUu698p5GFHptdAl1TS1PZuqzwvUpJKGLHfuqEY.png b/data/images/pandas/mehHOUu698p5GFHptdAl1TS1PZuqzwvUpJKGLHfuqEY.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/pnppCnVHQV3YWboi44iaDHOgOzdAUpnnYFV8EwAnodU.png b/data/images/pandas/pnppCnVHQV3YWboi44iaDHOgOzdAUpnnYFV8EwAnodU.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/vybZ_9BZL19pm3PW54JMxn_OtrnSB_ibDYHVYiH3l98.png b/data/images/pandas/vybZ_9BZL19pm3PW54JMxn_OtrnSB_ibDYHVYiH3l98.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/yw-a9Kc_vSLq0X6TLKUBbT9dve1ihpi437Izvu_L8oM.png b/data/images/pandas/yw-a9Kc_vSLq0X6TLKUBbT9dve1ihpi437Izvu_L8oM.png old mode 100644 new mode 100755 diff --git a/data/images/pandas/zjIofANE2EH8FbL8t5R2ivTG3ieIx3DrA1ufwfTJKG4.png b/data/images/pandas/zjIofANE2EH8FbL8t5R2ivTG3ieIx3DrA1ufwfTJKG4.png old mode 100644 new mode 100755 diff --git a/data/images/parameter_init/init_msra_relu.png b/data/images/parameter_init/init_msra_relu.png old mode 100644 new mode 100755 diff --git a/data/images/parameter_init/init_normal_sigmoid.png b/data/images/parameter_init/init_normal_sigmoid.png old mode 100644 new mode 100755 diff --git a/data/images/parameter_init/init_xavier_relu.png b/data/images/parameter_init/init_xavier_relu.png old mode 100644 new mode 100755 diff --git a/data/images/parameter_init/init_xavier_sigmoid.png b/data/images/parameter_init/init_xavier_sigmoid.png old mode 100644 new mode 100755 diff --git a/data/images/parameter_init/parameter_init_summary.png b/data/images/parameter_init/parameter_init_summary.png old mode 100644 new mode 100755 diff --git a/data/images/pieces.png b/data/images/pieces.png old mode 100644 new mode 100755 diff --git a/data/images/python_read_images/En5A4Xt4naL49ocumGSh2pHXKBMxqoud1KVL7blZAmw.png b/data/images/python_read_images/En5A4Xt4naL49ocumGSh2pHXKBMxqoud1KVL7blZAmw.png old mode 100644 new mode 100755 diff --git a/data/images/python_read_images/WYCTaeuwXi9ICkRMdEn3K0jvGsddfmr415rW0Wl_UCk.png b/data/images/python_read_images/WYCTaeuwXi9ICkRMdEn3K0jvGsddfmr415rW0Wl_UCk.png old mode 100644 new mode 100755 diff --git a/data/images/python_read_images/cqyXYva-pIgE7adHMXrskm-r2h6ivTP5CQeoNWPiaH8.png b/data/images/python_read_images/cqyXYva-pIgE7adHMXrskm-r2h6ivTP5CQeoNWPiaH8.png old mode 100644 new mode 100755 diff --git a/data/images/python_read_images/zk5YgqAS7448RIT1Bmq40vrCPHLp3pKrCS-_ilrL6Yw.png b/data/images/python_read_images/zk5YgqAS7448RIT1Bmq40vrCPHLp3pKrCS-_ilrL6Yw.png old mode 100644 new mode 100755 diff --git a/data/images/pytorch/gatherandindex_select.png b/data/images/pytorch/gatherandindex_select.png old mode 100644 new mode 100755 diff --git a/data/images/pytorch_tensor.jpeg b/data/images/pytorch_tensor.jpeg old mode 100644 new mode 100755 diff --git a/data/images/pytorch_tensor_shape.png b/data/images/pytorch_tensor_shape.png old mode 100644 new mode 100755 diff --git "a/data/images/quantization/\345\257\271\347\247\260\351\207\217\345\214\226.png" "b/data/images/quantization/\345\257\271\347\247\260\351\207\217\345\214\226.png" old mode 100644 new mode 100755 diff --git "a/data/images/quantization/\351\230\210\345\200\274\351\200\211\346\213\251.png" "b/data/images/quantization/\351\230\210\345\200\274\351\200\211\346\213\251.png" old mode 100644 new mode 100755 diff --git "a/data/images/quantization/\351\235\236\345\257\271\347\247\260\351\207\217\345\214\226.png" "b/data/images/quantization/\351\235\236\345\257\271\347\247\260\351\207\217\345\214\226.png" old mode 100644 new mode 100755 diff --git a/data/images/queue/circular_queue.png b/data/images/queue/circular_queue.png new file mode 100644 index 00000000..c2041585 Binary files /dev/null and b/data/images/queue/circular_queue.png differ diff --git a/data/images/queue/queue.png b/data/images/queue/queue.png new file mode 100644 index 00000000..c093b1a1 Binary files /dev/null and b/data/images/queue/queue.png differ diff --git a/data/images/rb_tree.png b/data/images/rb_tree.png old mode 100644 new mode 100755 diff --git a/data/images/recursion_tree.png b/data/images/recursion_tree.png old mode 100644 new mode 100755 diff --git a/data/images/recursion_tree2.jpg b/data/images/recursion_tree2.jpg old mode 100644 new mode 100755 diff --git "a/data/images/relu\345\207\275\346\225\260\345\217\212\345\205\266\346\242\257\345\272\246.jpg" "b/data/images/relu\345\207\275\346\225\260\345\217\212\345\205\266\346\242\257\345\272\246.jpg" old mode 100644 new mode 100755 diff --git a/data/images/resnet/image-20230217211129945.png b/data/images/resnet/image-20230217211129945.png old mode 100644 new mode 100755 diff --git a/data/images/resnet/image-20230217211358863.png b/data/images/resnet/image-20230217211358863.png old mode 100644 new mode 100755 diff --git a/data/images/resnet/image-20230217211429369.png b/data/images/resnet/image-20230217211429369.png old mode 100644 new mode 100755 diff --git a/data/images/resnet/image-20230217212628578.png b/data/images/resnet/image-20230217212628578.png old mode 100644 new mode 100755 diff --git a/data/images/resnet/image-20230217212933666.png b/data/images/resnet/image-20230217212933666.png old mode 100644 new mode 100755 diff --git "a/data/images/resnet18\347\273\223\346\236\204\345\205\267\344\275\223\345\217\202\346\225\260\350\241\250.png" "b/data/images/resnet18\347\273\223\346\236\204\345\205\267\344\275\223\345\217\202\346\225\260\350\241\250.png" old mode 100644 new mode 100755 diff --git a/data/images/resnetv2/Figure5.png b/data/images/resnetv2/Figure5.png old mode 100644 new mode 100755 diff --git a/data/images/resnetv2/Figure6.png b/data/images/resnetv2/Figure6.png old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/resnet\345\222\214resnetv2\347\232\204\346\256\213\345\267\256\345\215\225\345\205\203\347\273\223\346\236\204\345\233\276.png" "b/data/images/resnetv2/resnet\345\222\214resnetv2\347\232\204\346\256\213\345\267\256\345\215\225\345\205\203\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204relu\346\277\200\346\264\273.png" "b/data/images/resnetv2/\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204relu\346\277\200\346\264\273.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204shortcut.png" "b/data/images/resnetv2/\344\270\215\345\220\214\345\275\242\345\274\217\347\232\204shortcut.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2721.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2721.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2722.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2722.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2723.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2723.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2724.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2724.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2725.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2725.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2726.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2726.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2727.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2727.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2728.png" "b/data/images/resnetv2/\346\256\213\345\267\256\345\215\225\345\205\203\345\205\254\345\274\217\350\241\250\347\244\2728.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\346\256\213\345\267\256\347\275\221\347\273\234\350\241\250\347\244\272\345\205\254\345\274\217\347\232\204\345\220\204\344\270\252\345\217\202\346\225\260\350\247\243\351\207\212.png" "b/data/images/resnetv2/\346\256\213\345\267\256\347\275\221\347\273\234\350\241\250\347\244\272\345\205\254\345\274\217\347\232\204\345\220\204\344\270\252\345\217\202\346\225\260\350\247\243\351\207\212.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\350\241\2502.png" "b/data/images/resnetv2/\350\241\2502.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\350\241\2503.png" "b/data/images/resnetv2/\350\241\2503.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\350\241\2504.png" "b/data/images/resnetv2/\350\241\2504.png" old mode 100644 new mode 100755 diff --git "a/data/images/resnetv2/\350\241\2505.png" "b/data/images/resnetv2/\350\241\2505.png" old mode 100644 new mode 100755 diff --git "a/data/images/retinanet/anchor\347\232\204\345\271\263\347\247\273\345\222\214\345\257\271\345\272\224.jpg" "b/data/images/retinanet/anchor\347\232\204\345\271\263\347\247\273\345\222\214\345\257\271\345\272\224.jpg" old mode 100644 new mode 100755 diff --git a/data/images/retinanet/focal-loss.png b/data/images/retinanet/focal-loss.png old mode 100644 new mode 100755 diff --git "a/data/images/retinanet/\344\270\244\347\247\215\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204.png" "b/data/images/retinanet/\344\270\244\347\247\215\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/retinanet/\347\275\221\347\273\234\346\236\266\346\236\204\345\233\276.png" "b/data/images/retinanet/\347\275\221\347\273\234\346\236\266\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git a/data/images/roi_align.png b/data/images/roi_align.png old mode 100644 new mode 100755 diff --git "a/data/images/roi_align\347\272\277\346\200\247\346\217\222\345\200\274.png" "b/data/images/roi_align\347\272\277\346\200\247\346\217\222\345\200\274.png" old mode 100644 new mode 100755 diff --git a/data/images/roi_pooling.png b/data/images/roi_pooling.png old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/CSP-YOLOv4\347\232\204neck\350\260\203\346\225\264.png" "b/data/images/scaled-yolov4/CSP-YOLOv4\347\232\204neck\350\260\203\346\225\264.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/OSA\345\222\214Dense-layer\347\232\204\350\256\241\347\256\227\345\244\215\346\235\202\345\272\246.png" "b/data/images/scaled-yolov4/OSA\345\222\214Dense-layer\347\232\204\350\256\241\347\256\227\345\244\215\346\235\202\345\272\246.png" old mode 100644 new mode 100755 diff --git a/data/images/scaled-yolov4/Table4.png b/data/images/scaled-yolov4/Table4.png old mode 100644 new mode 100755 diff --git a/data/images/scaled-yolov4/Table5.png b/data/images/scaled-yolov4/Table5.png old mode 100644 new mode 100755 diff --git a/data/images/scaled-yolov4/Table7.png b/data/images/scaled-yolov4/Table7.png old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/YOLOv4-tiny\347\232\204\350\256\241\347\256\227\345\235\227\347\273\223\346\236\204.png" "b/data/images/scaled-yolov4/YOLOv4-tiny\347\232\204\350\256\241\347\256\227\345\235\227\347\273\223\346\236\204.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/csp\345\222\214resnet\347\255\211\347\273\223\345\220\210\345\220\216FLOPs\347\232\204\345\217\230\345\214\226.png" "b/data/images/scaled-yolov4/csp\345\222\214resnet\347\255\211\347\273\223\345\220\210\345\220\216FLOPs\347\232\204\345\217\230\345\214\226.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/resnet-resnext-darknet\347\275\221\347\273\234\350\256\241\347\256\227\351\207\217\345\222\214\347\275\221\347\273\234\346\267\261\345\272\246\345\256\275\345\272\246\345\217\212\350\276\223\345\205\245\345\233\276\345\203\217\345\210\206\350\276\250\347\216\207\347\232\204\345\205\263\347\263\273.png" "b/data/images/scaled-yolov4/resnet-resnext-darknet\347\275\221\347\273\234\350\256\241\347\256\227\351\207\217\345\222\214\347\275\221\347\273\234\346\267\261\345\272\246\345\256\275\345\272\246\345\217\212\350\276\223\345\205\245\345\233\276\345\203\217\345\210\206\350\276\250\347\216\207\347\232\204\345\205\263\347\263\273.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/resnet\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" "b/data/images/scaled-yolov4/resnet\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/sacled-yolov4-large\347\211\210\346\234\254\346\250\241\345\236\213\347\273\223\346\236\204\345\233\276.png" "b/data/images/scaled-yolov4/sacled-yolov4-large\347\211\210\346\234\254\346\250\241\345\236\213\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/scaled-yolov4/\344\270\216\345\205\266\344\273\226\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\233\270\346\257\224\347\232\204\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/scaled-yolov4/\344\270\216\345\205\266\344\273\226\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\233\270\346\257\224\347\232\204\345\257\271\346\257\224\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/ARM\345\222\214GPU\347\232\204\345\205\267\344\275\223\350\277\220\350\241\214\347\216\257\345\242\203.png" "b/data/images/shufflenetv2/ARM\345\222\214GPU\347\232\204\345\205\267\344\275\223\350\277\220\350\241\214\347\216\257\345\242\203.png" old mode 100644 new mode 100755 diff --git a/data/images/shufflenetv2/SE.png b/data/images/shufflenetv2/SE.png old mode 100644 new mode 100755 diff --git a/data/images/shufflenetv2/bottleneck.png b/data/images/shufflenetv2/bottleneck.png old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\345\233\2761.png" "b/data/images/shufflenetv2/\345\233\2761.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\345\233\2762.jpg" "b/data/images/shufflenetv2/\345\233\2762.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\345\233\2763.png" "b/data/images/shufflenetv2/\345\233\2763.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\345\233\2764.png" "b/data/images/shufflenetv2/\345\233\2764.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2501.png" "b/data/images/shufflenetv2/\350\241\2501.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2502.png" "b/data/images/shufflenetv2/\350\241\2502.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2503.png" "b/data/images/shufflenetv2/\350\241\2503.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2504.png" "b/data/images/shufflenetv2/\350\241\2504.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2505.png" "b/data/images/shufflenetv2/\350\241\2505.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2506.png" "b/data/images/shufflenetv2/\350\241\2506.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2507.png" "b/data/images/shufflenetv2/\350\241\2507.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\350\241\2508.png" "b/data/images/shufflenetv2/\350\241\2508.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\351\231\204\345\275\225\345\233\2761.png" "b/data/images/shufflenetv2/\351\231\204\345\275\225\345\233\2761.png" old mode 100644 new mode 100755 diff --git "a/data/images/shufflenetv2/\351\231\204\345\275\225\345\233\2762.png" "b/data/images/shufflenetv2/\351\231\204\345\275\225\345\233\2762.png" old mode 100644 new mode 100755 diff --git "a/data/images/sigmoid\346\277\200\346\264\273\345\207\275\346\225\260.png" "b/data/images/sigmoid\346\277\200\346\264\273\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/sign(x)\345\205\254\345\274\217.png" "b/data/images/sign(x)\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git a/data/images/sign.png b/data/images/sign.png old mode 100644 new mode 100755 diff --git a/data/images/skip_list.png b/data/images/skip_list.png old mode 100644 new mode 100755 diff --git a/data/images/skip_list2.png b/data/images/skip_list2.png old mode 100644 new mode 100755 diff --git a/data/images/slot.png b/data/images/slot.png old mode 100644 new mode 100755 diff --git a/data/images/soft_nms_algorithm.png b/data/images/soft_nms_algorithm.png old mode 100644 new mode 100755 diff --git "a/data/images/softmax\345\205\254\345\274\217.png" "b/data/images/softmax\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git a/data/images/sort.png b/data/images/sort.png old mode 100644 new mode 100755 diff --git a/data/images/sort1.png b/data/images/sort1.png old mode 100644 new mode 100755 diff --git a/data/images/sort2.png b/data/images/sort2.png old mode 100644 new mode 100755 diff --git a/data/images/stack/stack.png b/data/images/stack/stack.png new file mode 100644 index 00000000..79ef2a80 Binary files /dev/null and b/data/images/stack/stack.png differ diff --git "a/data/images/tanh\345\207\275\346\225\260\345\217\212\345\205\266\346\242\257\345\272\246.png" "b/data/images/tanh\345\207\275\346\225\260\345\217\212\345\205\266\346\242\257\345\272\246.png" old mode 100644 new mode 100755 diff --git a/data/images/tensor.png b/data/images/tensor.png old mode 100644 new mode 100755 diff --git "a/data/images/tensor\345\261\236\346\200\247.png" "b/data/images/tensor\345\261\236\346\200\247.png" old mode 100644 new mode 100755 diff --git "a/data/images/tensor\346\225\260\346\215\256\347\261\273\345\236\213.png" "b/data/images/tensor\346\225\260\346\215\256\347\261\273\345\236\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/test\345\221\275\344\273\244\346\265\213\350\257\225.png" "b/data/images/test\345\221\275\344\273\244\346\265\213\350\257\225.png" old mode 100644 new mode 100755 diff --git a/data/images/tree.png b/data/images/tree.png old mode 100644 new mode 100755 diff --git a/data/images/yolo/yolo_compare_with_others.png b/data/images/yolo/yolo_compare_with_others.png old mode 100644 new mode 100755 diff --git a/data/images/yolo/yolo_figure1.png b/data/images/yolo/yolo_figure1.png old mode 100644 new mode 100755 diff --git a/data/images/yolo/yolo_figure2.png b/data/images/yolo/yolo_figure2.png old mode 100644 new mode 100755 diff --git a/data/images/yolo/yolo_figure3.png b/data/images/yolo/yolo_figure3.png old mode 100644 new mode 100755 diff --git a/data/images/yolo/yolo_loss.png b/data/images/yolo/yolo_loss.png old mode 100644 new mode 100755 diff --git "a/data/images/yolo/\350\276\223\345\207\272\345\274\240\351\207\217\350\247\243\351\207\212.png" "b/data/images/yolo/\350\276\223\345\207\272\345\274\240\351\207\217\350\247\243\351\207\212.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolo/\350\276\271\347\225\214\346\241\206\345\235\220\346\240\207\345\256\232\344\271\211.png" "b/data/images/yolo/\350\276\271\347\225\214\346\241\206\345\235\220\346\240\207\345\256\232\344\271\211.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov2/Darket19\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" "b/data/images/yolov2/Darket19\347\275\221\347\273\234\345\217\202\346\225\260\350\241\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov2/anchor\347\232\204\346\214\221\351\200\211.png" "b/data/images/yolov2/anchor\347\232\204\346\214\221\351\200\211.png" old mode 100644 new mode 100755 diff --git a/data/images/yolov2/table3.png b/data/images/yolov2/table3.png old mode 100644 new mode 100755 diff --git "a/data/images/yolov2/voc2007\346\225\260\346\215\256\351\233\206\346\265\213\350\257\225\347\273\223\346\236\234.png" "b/data/images/yolov2/voc2007\346\225\260\346\215\256\351\233\206\346\265\213\350\257\225\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov2/\345\201\217\347\247\273\351\207\217\350\256\241\347\256\227.png" "b/data/images/yolov2/\345\201\217\347\247\273\351\207\217\350\256\241\347\256\227.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov2/\346\215\237\345\244\261\345\207\275\346\225\260\350\256\241\347\256\227.jfif" "b/data/images/yolov2/\346\215\237\345\244\261\345\207\275\346\225\260\350\256\241\347\256\227.jfif" old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/YOLOv3\347\232\204\345\256\236\351\252\214\347\273\223\346\236\234\350\241\250\346\240\274.png" "b/data/images/yolov3/YOLOv3\347\232\204\345\256\236\351\252\214\347\273\223\346\236\234\350\241\250\346\240\274.png" old mode 100644 new mode 100755 diff --git a/data/images/yolov3/darknet-53.png b/data/images/yolov3/darknet-53.png old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/yolov3\345\234\250coco\346\225\260\346\215\256\351\233\206\344\270\212\346\265\213\350\257\225\347\273\223\346\236\234.png" "b/data/images/yolov3/yolov3\345\234\250coco\346\225\260\346\215\256\351\233\206\344\270\212\346\265\213\350\257\225\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/yolov3\347\232\204\346\215\237\345\244\261\345\207\275\346\225\260\350\256\241\347\256\227\345\205\254\345\274\217.jpg" "b/data/images/yolov3/yolov3\347\232\204\346\215\237\345\244\261\345\207\275\346\225\260\350\256\241\347\256\227\345\205\254\345\274\217.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/yolov3\347\273\223\346\236\204\345\233\276.png" "b/data/images/yolov3/yolov3\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/yolov3\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.jpg" "b/data/images/yolov3/yolov3\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/yolov3/\345\222\214\345\205\266\344\273\226backbone\347\232\204\346\257\224\350\276\203\347\273\223\346\236\234.png" "b/data/images/yolov3/\345\222\214\345\205\266\344\273\226backbone\347\232\204\346\257\224\350\276\203\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/COCO\346\225\260\346\215\256\351\233\206\345\260\217\344\270\255\345\244\247\347\233\256\346\240\207\345\210\206\345\270\203\346\203\205\345\206\265.jpg" "b/data/images/yolov4/COCO\346\225\260\346\215\256\351\233\206\345\260\217\344\270\255\345\244\247\347\233\256\346\240\207\345\210\206\345\270\203\346\203\205\345\206\265.jpg" old mode 100644 new mode 100755 diff --git a/data/images/yolov4/CSPDarknet53.jpg b/data/images/yolov4/CSPDarknet53.jpg old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/CSPDarknet53\345\222\214CSPResNext50\347\232\204\346\257\224\350\276\203.png" "b/data/images/yolov4/CSPDarknet53\345\222\214CSPResNext50\347\232\204\346\257\224\350\276\203.png" old mode 100644 new mode 100755 diff --git a/data/images/yolov4/CmBN.png b/data/images/yolov4/CmBN.png old mode 100644 new mode 100755 diff --git a/data/images/yolov4/FPN+PAN.jpg b/data/images/yolov4/FPN+PAN.jpg old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/Mish\345\207\275\346\225\260\346\233\262\347\272\277\345\233\276.png" "b/data/images/yolov4/Mish\345\207\275\346\225\260\346\233\262\347\272\277\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/Mish\345\222\214\345\205\266\344\273\226\344\270\200\344\272\233\346\226\271\346\263\225\345\257\271\345\210\206\347\261\273\345\231\250\347\262\276\345\272\246\347\232\204\345\275\261\345\223\215.png" "b/data/images/yolov4/Mish\345\222\214\345\205\266\344\273\226\344\270\200\344\272\233\346\226\271\346\263\225\345\257\271\345\210\206\347\261\273\345\231\250\347\262\276\345\272\246\347\232\204\345\275\261\345\223\215.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/Mosaic\346\225\260\346\215\256\345\242\236\345\274\272.jpg" "b/data/images/yolov4/Mosaic\346\225\260\346\215\256\345\242\236\345\274\272.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/Mosic\346\225\260\346\215\256\345\242\236\345\274\272\346\226\271\346\263\225.png" "b/data/images/yolov4/Mosic\346\225\260\346\215\256\345\242\236\345\274\272\346\226\271\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/YOLOv3\347\232\204neck\347\273\223\346\236\204\347\253\213\344\275\223\345\233\276.jpg" "b/data/images/yolov4/YOLOv3\347\232\204neck\347\273\223\346\236\204\347\253\213\344\275\223\345\233\276.jpg" old mode 100644 new mode 100755 diff --git a/data/images/yolov4/yolov4_2(1).png b/data/images/yolov4/yolov4_2(1).png old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/yolov4\345\222\214\345\205\266\344\273\226\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\346\257\224\350\276\203.png" "b/data/images/yolov4/yolov4\345\222\214\345\205\266\344\273\226\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\346\257\224\350\276\203.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\344\270\215\345\220\214\346\225\260\346\215\256\345\242\236\345\274\272\346\226\271\346\263\225\346\225\210\346\236\234\347\232\204\345\217\257\350\247\206\345\214\226.png" "b/data/images/yolov4/\344\270\215\345\220\214\346\225\260\346\215\256\345\242\236\345\274\272\346\226\271\346\263\225\346\225\210\346\236\234\347\232\204\345\217\257\350\247\206\345\214\226.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\344\270\215\345\220\214\346\226\271\346\263\225\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.png" "b/data/images/yolov4/\344\270\215\345\220\214\346\226\271\346\263\225\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\344\270\215\345\220\214\351\252\250\345\271\262\347\275\221\347\273\234\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215\346\257\224\350\276\203.png" "b/data/images/yolov4/\344\270\215\345\220\214\351\252\250\345\271\262\347\275\221\347\273\234\345\257\271\346\243\200\346\265\213\345\231\250\346\200\247\350\203\275\347\232\204\345\275\261\345\223\215\346\257\224\350\276\203.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\344\277\256\346\224\271\345\220\216\347\232\204SAM\345\222\214PAN.png" "b/data/images/yolov4/\344\277\256\346\224\271\345\220\216\347\232\204SAM\345\222\214PAN.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\345\216\237\345\247\213\347\232\204PAN\345\222\214YOLOv4\344\270\255\347\232\204PAN\347\232\204\344\270\215\345\220\214.png" "b/data/images/yolov4/\345\216\237\345\247\213\347\232\204PAN\345\222\214YOLOv4\344\270\255\347\232\204PAN\347\232\204\344\270\215\345\220\214.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\346\233\264\345\245\275\350\256\255\347\273\203\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\346\226\271\346\263\225.png" "b/data/images/yolov4/\346\233\264\345\245\275\350\256\255\347\273\203\347\233\256\346\240\207\346\243\200\346\265\213\346\250\241\345\236\213\347\232\204\346\226\271\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\232\204\345\220\204\344\270\252\347\273\204\346\210\220\351\203\250\345\210\206.png" "b/data/images/yolov4/\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\232\204\345\220\204\344\270\252\347\273\204\346\210\220\351\203\250\345\210\206.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov4/\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\273\223\346\236\204\345\233\276.png" "b/data/images/yolov4/\347\233\256\346\240\207\346\243\200\346\265\213\345\231\250\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov5/focus\347\273\223\346\236\204\347\244\272\344\276\213.png" "b/data/images/yolov5/focus\347\273\223\346\236\204\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov5/focus\347\273\223\346\236\204\347\244\272\344\276\213.webp" "b/data/images/yolov5/focus\347\273\223\346\236\204\347\244\272\344\276\213.webp" old mode 100644 new mode 100755 diff --git "a/data/images/yolov5/yolov5\345\256\236\351\252\214\347\273\223\346\236\234.png" "b/data/images/yolov5/yolov5\345\256\236\351\252\214\347\273\223\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/yolov5/yolov5\345\257\271\346\257\224\345\256\236\351\252\214\346\233\262\347\272\277\345\233\276.png" "b/data/images/yolov5/yolov5\345\257\271\346\257\224\345\256\236\351\252\214\346\233\262\347\272\277\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\344\270\215\345\220\214\346\250\241\347\263\212\345\215\212\345\276\204\346\225\210\346\236\234\345\233\276.jpg" "b/data/images/\344\270\215\345\220\214\346\250\241\347\263\212\345\215\212\345\276\204\346\225\210\346\236\234\345\233\276.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\344\270\255\351\227\264\347\237\251\351\230\265.png" "b/data/images/\344\270\255\351\227\264\347\237\251\351\230\265.png" old mode 100644 new mode 100755 diff --git "a/data/images/\344\270\255\351\227\264\347\237\251\351\230\265\347\232\204\347\273\204\345\220\210\345\276\227\345\210\260\347\273\223\346\236\234\347\237\251\351\230\265.png" "b/data/images/\344\270\255\351\227\264\347\237\251\351\230\265\347\232\204\347\273\204\345\220\210\345\276\227\345\210\260\347\273\223\346\236\234\347\237\251\351\230\265.png" old mode 100644 new mode 100755 diff --git "a/data/images/\344\272\214\345\200\274\345\214\226\347\256\227\346\263\225\347\262\276\345\272\246.png" "b/data/images/\344\272\214\345\200\274\345\214\226\347\256\227\346\263\225\347\262\276\345\272\246.png" old mode 100644 new mode 100755 diff --git "a/data/images/\344\272\214\347\273\264\345\215\267\347\247\257\346\223\215\344\275\234\345\212\250\346\200\201\345\233\276.gif" "b/data/images/\344\272\214\347\273\264\345\215\267\347\247\257\346\223\215\344\275\234\345\212\250\346\200\201\345\233\276.gif" old mode 100644 new mode 100755 diff --git "a/data/images/\344\272\214\347\273\264\347\251\272\351\227\264\347\232\204\346\255\243\345\244\252\345\210\206\345\270\203\346\226\271\347\250\213.png" "b/data/images/\344\272\214\347\273\264\347\251\272\351\227\264\347\232\204\346\255\243\345\244\252\345\210\206\345\270\203\346\226\271\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\344\275\277\347\224\250Dropout\347\232\204\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213.jpg" "b/data/images/\344\275\277\347\224\250Dropout\347\232\204\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\344\276\235\345\233\276\347\247\221\346\212\200-\346\240\241\346\213\233\345\206\205\346\216\250.png" "b/data/images/\344\276\235\345\233\276\347\247\221\346\212\200-\346\240\241\346\213\233\345\206\205\346\216\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\201\217\345\267\256\350\257\257\345\267\256\344\270\216\346\226\271\345\267\256.png" "b/data/images/\345\201\217\345\267\256\350\257\257\345\267\256\344\270\216\346\226\271\345\267\256.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\254\345\217\270\346\246\202\345\206\265.jpg" "b/data/images/\345\205\254\345\217\270\346\246\202\345\206\265.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\254\345\217\270\346\246\202\345\206\2651.png" "b/data/images/\345\205\254\345\217\270\346\246\202\345\206\2651.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\344\275\223\351\252\2143.png" "b/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\344\275\223\351\252\2143.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\214.jpg" "b/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\214.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\2141.png" "b/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\2141.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\2142.png" "b/data/images/\345\205\266\344\273\226\351\235\242\350\257\225\350\200\205\344\275\223\351\252\2142.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\210\206\346\262\273\347\237\251\351\230\265\347\256\227\346\263\225.png" "b/data/images/\345\210\206\346\262\273\347\237\251\351\230\265\347\256\227\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\210\206\347\261\273PR\346\233\262\347\272\277\345\233\276.png" "b/data/images/\345\210\206\347\261\273PR\346\233\262\347\272\277\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\215\267\347\247\257\345\241\253\345\205\205\346\226\271\345\274\217.png" "b/data/images/\345\215\267\347\247\257\345\241\253\345\205\205\346\226\271\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\215\267\347\247\257\350\277\207\347\250\213\345\233\276.png" "b/data/images/\345\215\267\347\247\257\350\277\207\347\250\213\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\217\202\346\225\260\351\207\217\345\214\226\344\270\216\347\240\201\346\234\254\345\276\256\350\260\203\350\277\207\347\250\213\345\233\276.png" "b/data/images/\345\217\202\346\225\260\351\207\217\345\214\226\344\270\216\347\240\201\346\234\254\345\276\256\350\260\203\350\277\207\347\250\213\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\223\210\345\270\214\350\241\250\347\232\204\345\212\250\346\200\201\346\211\251\345\256\271.png" "b/data/images/\345\223\210\345\270\214\350\241\250\347\232\204\345\212\250\346\200\201\346\211\251\345\256\271.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\235\207\346\221\212\346\217\222\345\205\245.png" "b/data/images/\345\235\207\346\221\212\346\217\222\345\205\245.png" old mode 100644 new mode 100755 diff --git "a/data/images/\345\240\206\344\270\216\346\240\210.png" "b/data/images/\345\240\206\344\270\216\346\240\210.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\204\237\345\217\227\351\207\216\347\251\272\351\227\264.jpg" "b/data/images/\346\204\237\345\217\227\351\207\216\347\251\272\351\227\264.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\216\222\345\272\217\347\256\227\346\263\225\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.jpg" "b/data/images/\346\216\222\345\272\217\347\256\227\346\263\225\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\217\222\345\200\274\350\256\241\347\256\227AP\345\205\254\345\274\217.png" "b/data/images/\346\217\222\345\200\274\350\256\241\347\256\227AP\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\217\222\345\200\274\350\256\241\347\256\227AP\347\232\204PR\346\233\262\347\272\277\345\233\276.png" "b/data/images/\346\217\222\345\200\274\350\256\241\347\256\227AP\347\232\204PR\346\233\262\347\272\277\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\243\345\210\227\350\241\250\345\256\236\346\210\230\351\227\256\351\242\230.png" "b/data/images/\346\225\243\345\210\227\350\241\250\345\256\236\346\210\230\351\227\256\351\242\230.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/0H81XJO6GYhP50aGf-FQHZkb6-bQwClofhdU7Lu2NJs.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/0H81XJO6GYhP50aGf-FQHZkb6-bQwClofhdU7Lu2NJs.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/5edQ4JyZCq1G_e-g9X4tVq7UkMvpmdEgDRu43MicH60.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/5edQ4JyZCq1G_e-g9X4tVq7UkMvpmdEgDRu43MicH60.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/6z27mYVrISoA1cWrz6m0b6WBnEYTy1Wzz0diyCiY_38.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/6z27mYVrISoA1cWrz6m0b6WBnEYTy1Wzz0diyCiY_38.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/De1j2N5zQOoKqq3t9MNyQNWqGsmiQ_d7YMMYdC3bnqA.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/De1j2N5zQOoKqq3t9MNyQNWqGsmiQ_d7YMMYdC3bnqA.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/E1wFKZwvxhU5X1Mwegn-ZsPJw11ZMaKQHbz1QOgphTs.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/E1wFKZwvxhU5X1Mwegn-ZsPJw11ZMaKQHbz1QOgphTs.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/GTqFA1EvohGD4qBLAFZ0LIQ5BvmnSHjJ9IbFWUIJY30.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/GTqFA1EvohGD4qBLAFZ0LIQ5BvmnSHjJ9IbFWUIJY30.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/H9GI41WhwnP1MX9nAZpU39IoDuL1MXvr9vgHg0ZaWro.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/H9GI41WhwnP1MX9nAZpU39IoDuL1MXvr9vgHg0ZaWro.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/HjO-Dj6PoIUijUdtb4dPIvsHrwS1iuYiVyz6W-fvWh0.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/HjO-Dj6PoIUijUdtb4dPIvsHrwS1iuYiVyz6W-fvWh0.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/Jot2qX9Wcf4zhC9KI7JrOitH_Gf9xlqehCb4nllSJEM.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/Jot2qX9Wcf4zhC9KI7JrOitH_Gf9xlqehCb4nllSJEM.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/RGB\345\275\251\350\211\262\346\250\241\345\236\213\345\205\254\345\274\217.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/RGB\345\275\251\350\211\262\346\250\241\345\236\213\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/TI7MEbJFOCNf1ibzQzCigqmo4Ci2Ov79FPLQThoTAKQ.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/TI7MEbJFOCNf1ibzQzCigqmo4Ci2Ov79FPLQThoTAKQ.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/X\345\260\204\347\272\277\346\210\220\345\203\217\345\256\236\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/X\345\260\204\347\272\277\346\210\220\345\203\217\345\256\236\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/ZO70cfCHXWRi38NrzptOeRj6W_pVwcv1w9l6wx82itc.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/ZO70cfCHXWRi38NrzptOeRj6W_pVwcv1w9l6wx82itc.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/data_structure_and_alogrithm.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/data_structure_and_alogrithm.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/fYxYGO2c8Y5toDIC_50NtkqyN2Tv6rMAtHZoBk4sOO8.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/fYxYGO2c8Y5toDIC_50NtkqyN2Tv6rMAtHZoBk4sOO8.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\270\200\344\270\252\347\256\200\345\215\225\347\232\204\345\217\257\350\247\201\346\260\264\345\215\260.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\270\200\344\270\252\347\256\200\345\215\225\347\232\204\345\217\257\350\247\201\346\260\264\345\215\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\270\215\345\220\214\345\244\247\345\260\217\346\226\271\345\275\242\346\240\270\345\210\260\344\270\255\345\277\203\347\232\204\350\267\235\347\246\273.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\270\215\345\220\214\345\244\247\345\260\217\346\226\271\345\275\242\346\240\270\345\210\260\344\270\255\345\277\203\347\232\204\350\267\235\347\246\273.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\214\347\273\264\346\273\244\346\263\242\345\231\250\346\240\270\344\270\216\345\233\276\345\203\217\350\277\233\350\241\214\345\215\267\347\247\257.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\214\347\273\264\346\273\244\346\263\242\345\231\250\346\240\270\344\270\216\345\233\276\345\203\217\350\277\233\350\241\214\345\215\267\347\247\257.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\272\347\234\274\345\211\226\346\236\220\351\235\242\347\256\200\345\233\276.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\272\347\234\274\345\211\226\346\236\220\351\235\242\347\256\200\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\272\347\234\274\350\247\202\347\234\213\344\270\200\346\243\265\346\240\221\347\232\204\345\233\276\350\247\243.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\272\272\347\234\274\350\247\202\347\234\213\344\270\200\346\243\265\346\240\221\347\232\204\345\233\276\350\247\243.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\274\275\347\216\233\345\260\204\347\272\277\345\276\227\345\210\260\347\232\204\344\272\272\344\275\223\351\252\250\351\252\274\345\233\276\347\211\207.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\274\275\347\216\233\345\260\204\347\272\277\345\276\227\345\210\260\347\232\204\344\272\272\344\275\223\351\252\250\351\252\274\345\233\276\347\211\207.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\216\351\200\232\346\273\244\346\263\242\344\273\243\347\240\201\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\216\351\200\232\346\273\244\346\263\242\344\273\243\347\240\201\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\2503x3\346\240\270\347\232\204\347\272\277\346\200\247\347\251\272\351\227\264\346\273\244\346\263\242\345\216\237\347\220\206.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\2503x3\346\240\270\347\232\204\347\272\277\346\200\247\347\251\272\351\227\264\346\273\244\346\263\242\345\216\237\347\220\206.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\344\270\215\345\220\214\347\233\222\345\274\217\346\240\270\345\257\271\345\233\276\345\203\217\350\277\233\350\241\214\344\275\216\351\200\232\346\273\244\346\263\242.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\344\270\215\345\220\214\347\233\222\345\274\217\346\240\270\345\257\271\345\233\276\345\203\217\350\277\233\350\241\214\344\275\216\351\200\232\346\273\244\346\263\242.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\346\213\211\346\231\256\346\213\211\346\226\257\347\256\227\345\255\220\351\224\220\345\214\226\345\233\276\345\203\217\347\232\204\346\226\271\346\263\225.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\346\213\211\346\231\256\346\213\211\346\226\257\347\256\227\345\255\220\351\224\220\345\214\226\345\233\276\345\203\217\347\232\204\346\226\271\346\263\225.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\346\213\211\346\231\256\346\213\211\346\226\257\351\224\220\345\214\226\345\275\251\350\211\262\345\233\276\345\203\217\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\346\213\211\346\231\256\346\213\211\346\226\257\351\224\220\345\214\226\345\275\251\350\211\262\345\233\276\345\203\217\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\347\233\264\346\226\271\345\233\276\347\273\237\350\256\241\345\242\236\345\274\272\345\261\200\351\203\250\345\233\276\345\203\217.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\344\275\277\347\224\250\347\233\264\346\226\271\345\233\276\347\273\237\350\256\241\345\242\236\345\274\272\345\261\200\351\203\250\345\233\276\345\203\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\215\253\346\230\237\345\233\276\345\203\217.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\215\253\346\230\237\345\233\276\345\203\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\220\214\346\227\266\345\257\271\346\257\224\347\232\204\344\276\213\345\255\220.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\220\214\346\227\266\345\257\271\346\257\224\347\232\204\344\276\213\345\255\220.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\233\347\247\215\347\251\272\351\227\264\345\237\237\346\273\244\346\263\242\345\231\250\345\216\237\347\220\206.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\233\347\247\215\347\251\272\351\227\264\345\237\237\346\273\244\346\263\242\345\231\250\345\216\237\347\220\206.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\345\216\213\347\274\251\346\240\274\345\274\217\345\222\214\345\256\271\345\231\250.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\345\216\213\347\274\251\346\240\274\345\274\217\345\222\214\345\256\271\345\231\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\345\217\215\350\275\254\345\256\236\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\345\217\215\350\275\254\345\256\236\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\347\272\277\346\200\247\350\277\220\347\256\227\344\270\276\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\233\276\345\203\217\347\272\277\346\200\247\350\277\220\347\256\227\344\270\276\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\237\272\346\234\254\347\232\204\347\201\260\345\272\246\345\217\230\346\215\242\345\207\275\346\225\260.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\237\272\346\234\254\347\232\204\347\201\260\345\272\246\345\217\230\346\215\242\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\257\271\346\257\224\345\272\246\346\213\211\344\274\270.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\257\271\346\257\224\345\272\246\346\213\211\344\274\270.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\257\271\346\257\224\345\272\246\346\213\211\344\274\270\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\257\271\346\257\224\345\272\246\346\213\211\344\274\270\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\261\200\351\203\250\345\233\276\345\203\217\345\242\236\345\274\272\350\277\207\347\250\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\261\200\351\203\250\345\233\276\345\203\217\345\242\236\345\274\272\350\277\207\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\261\200\351\203\250\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\261\200\351\203\250\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\271\263\346\273\221\346\240\270\347\232\204\344\276\213\345\255\220.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\271\263\346\273\221\346\240\270\347\232\204\344\276\213\345\255\220.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\275\251\350\211\262\345\233\276\345\203\217\345\271\263\346\273\221\345\205\254\345\274\217.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\275\251\350\211\262\345\233\276\345\203\217\345\271\263\346\273\221\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\275\251\350\211\262\347\251\272\351\227\264\347\232\204\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\345\275\251\350\211\262\347\251\272\351\227\264\347\232\204\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\345\272\224\347\224\250\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\345\272\224\347\224\250\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\345\272\224\347\224\250\347\244\272\344\276\2132.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\345\272\224\347\224\250\347\244\272\344\276\2132.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\346\240\270\347\237\251\351\230\265.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\213\211\346\231\256\346\213\211\346\226\257\346\240\270\347\237\251\351\230\265.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\232\204\345\237\272\346\234\254\346\255\245\351\252\244.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\232\204\345\237\272\346\234\254\346\255\245\351\252\244.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\225\260\345\255\227\345\233\276\345\203\217\350\216\267\345\217\226\347\244\272\344\276\213\345\233\276.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\225\260\345\255\227\345\233\276\345\203\217\350\216\267\345\217\226\347\244\272\344\276\213\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\226\234\347\216\207\344\270\216\345\276\256\347\247\257\345\210\206\345\255\246.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\226\234\347\216\207\344\270\216\345\276\256\347\247\257\345\210\206\345\255\246.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\233\264\350\257\246\347\273\206\347\232\204\347\224\265\347\243\201\346\263\242\350\260\261.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\233\264\350\257\246\347\273\206\347\232\204\347\224\265\347\243\201\346\263\242\350\260\261.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\242\257\345\272\246\347\256\227\345\255\220\346\240\270\347\263\273\346\225\260\347\237\251\351\230\265.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\346\242\257\345\272\246\347\256\227\345\255\220\346\240\270\347\263\273\346\225\260\347\237\251\351\230\265.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\201\260\345\272\246\345\210\206\345\261\202\345\217\230\346\215\242\345\207\275\346\225\260.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\201\260\345\272\246\345\210\206\345\261\202\345\217\230\346\215\242\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\201\260\345\272\246\347\272\247\345\210\206\345\261\202\347\232\204\345\256\236\351\231\205\345\272\224\347\224\250.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\201\260\345\272\246\347\272\247\345\210\206\345\261\202\347\232\204\345\256\236\351\231\205\345\272\224\347\224\250.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\224\265\347\243\201\346\263\242\350\260\261.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\224\265\347\243\201\346\263\242\350\260\261.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\345\220\216\347\232\204\346\225\210\346\236\234\345\233\276.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\345\220\216\347\232\204\346\225\210\346\236\234\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\211\200\347\224\250\347\232\204\345\217\230\346\215\242\345\207\275\346\225\260.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\211\200\347\224\250\347\232\204\345\217\230\346\215\242\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234\347\244\272\344\276\2132.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\345\235\207\350\241\241\345\214\226\346\225\210\346\236\234\347\244\272\344\276\2132.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\350\247\204\345\256\232\345\214\226\346\225\210\346\236\234\345\233\276.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\347\233\264\346\226\271\345\233\276\350\247\204\345\256\232\345\214\226\346\225\210\346\236\234\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\350\211\262\350\260\203\345\217\230\346\215\242\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\350\211\262\350\260\203\345\217\230\346\215\242\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\222\235\345\214\226\346\216\251\350\224\275\345\205\254\345\274\217.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\222\235\345\214\226\346\216\251\350\224\275\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\222\235\345\214\226\346\216\251\350\224\275\346\225\210\346\236\234\347\244\272\344\276\213.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\222\235\345\214\226\346\216\251\350\224\275\346\225\210\346\236\234\347\244\272\344\276\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\344\277\241\346\272\220\345\214\226\347\256\200.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\344\277\241\346\272\220\345\214\226\347\256\200.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\347\274\226\347\240\201\350\277\207\347\250\213\346\217\217\350\277\260.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\347\274\226\347\240\201\350\277\207\347\250\213\346\217\217\350\277\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\347\274\226\347\240\201\350\277\207\347\250\213\347\254\254\344\272\214\346\255\245.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\234\215\345\244\253\346\233\274\347\274\226\347\240\201\350\277\207\347\250\213\347\254\254\344\272\214\346\255\245.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\251\254\350\265\253\345\270\246\346\225\210\345\272\224\345\233\276\350\247\243.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\251\254\350\265\253\345\270\246\346\225\210\345\272\224\345\233\276\350\247\243.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\253\230\346\226\257\346\240\270\345\222\214\347\233\222\345\274\217\346\240\270\345\271\263\346\273\221\347\211\271\346\200\247\347\232\204\346\257\224\350\276\203\345\257\271\346\257\224\345\233\276.png" "b/data/images/\346\225\260\345\255\227\345\233\276\345\203\217\345\244\204\347\220\206\347\254\224\350\256\260/\351\253\230\346\226\257\346\240\270\345\222\214\347\233\222\345\274\217\346\240\270\345\271\263\346\273\221\347\211\271\346\200\247\347\232\204\346\257\224\350\276\203\345\257\271\346\257\224\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/Array_using_Pointer .jpeg" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/Array_using_Pointer .jpeg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/Stack-Queue.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/Stack-Queue.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/StringInCpp.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/StringInCpp.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/backtracking.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/backtracking.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/binarysearch.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/binarysearch.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/dfs_bfs.jpeg" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/dfs_bfs.jpeg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/divide-and-conquer-approach-in-programming-merge-sort-2f4c31d2226427d8.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/divide-and-conquer-approach-in-programming-merge-sort-2f4c31d2226427d8.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/greedy.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/greedy.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/linked_list.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/linked_list.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/recursion.jpeg" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/recursion.jpeg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/stack_in_cpp.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/stack_in_cpp.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/stack_in_cpp.webp" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/stack_in_cpp.webp" old mode 100644 new mode 100755 diff --git "a/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/\346\225\243\345\210\227\345\207\275\346\225\260.png" "b/data/images/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/\346\225\243\345\210\227\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\240\207\345\207\206\347\275\221\347\273\234\345\222\214\345\270\246\346\234\211Dropout\347\275\221\347\273\234\347\232\204\346\257\224\350\276\203.jpg" "b/data/images/\346\240\207\345\207\206\347\275\221\347\273\234\345\222\214\345\270\246\346\234\211Dropout\347\275\221\347\273\234\347\232\204\346\257\224\350\276\203.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/Roof-line\345\210\222\345\210\206\345\207\272\347\232\204\344\270\244\344\270\252\347\223\266\351\242\210\345\214\272\345\237\237.png" "b/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/Roof-line\345\210\222\345\210\206\345\207\272\347\232\204\344\270\244\344\270\252\347\223\266\351\242\210\345\214\272\345\237\237.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/roof-line.jpg" "b/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/roof-line.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/thop_summary.png" "b/data/images/\346\250\241\345\236\213\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220/thop_summary.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\215\201\345\261\202 MobileNetV1 \347\232\204\346\235\203\351\207\215\345\210\206\345\270\203.svg" "b/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\215\201\345\261\202 MobileNetV1 \347\232\204\346\235\203\351\207\215\345\210\206\345\270\203.svg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\233\276\345\215\201\345\260\206\346\265\256\347\202\271\351\207\217\345\214\226\344\270\272\345\256\232\347\202\271\346\227\266\350\260\203\346\225\264\346\234\200\345\260\217\345\200\274-\346\234\200\345\244\247\345\200\274.jpg" "b/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\233\276\345\215\201\345\260\206\346\265\256\347\202\271\351\207\217\345\214\226\344\270\272\345\256\232\347\202\271\346\227\266\350\260\203\346\225\264\346\234\200\345\260\217\345\200\274-\346\234\200\345\244\247\345\200\274.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\256\232\347\202\271\345\222\214\346\265\256\347\202\271\347\232\204\346\240\274\345\274\217\345\222\214\347\244\272\344\276\213.jpg" "b/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\345\256\232\347\202\271\345\222\214\346\265\256\347\202\271\347\232\204\346\240\274\345\274\217\345\222\214\347\244\272\344\276\213.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\351\207\217\345\214\226\346\250\241\345\236\213\347\232\204\346\216\250\347\220\206.svg" "b/data/images/\346\250\241\345\236\213\351\207\217\345\214\226/\351\207\217\345\214\226\346\250\241\345\236\213\347\232\204\346\216\250\347\220\206.svg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204\345\233\276.png" "b/data/images/\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204\345\233\2762.png" "b/data/images/\346\256\213\345\267\256\345\235\227\347\273\223\346\236\204\345\233\2762.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\267\267\346\267\206\347\237\251\351\230\265.png" "b/data/images/\346\267\267\346\267\206\347\237\251\351\230\265.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\267\273\345\212\240\344\272\206dropou\347\232\204\347\245\236\347\273\217\347\275\221\347\273\234\345\233\276.png" "b/data/images/\346\267\273\345\212\240\344\272\206dropou\347\232\204\347\245\236\347\273\217\347\275\221\347\273\234\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/relu\346\277\200\346\264\273\345\207\275\346\225\260\345\217\212\346\242\257\345\272\246\345\233\276.png" "b/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/relu\346\277\200\346\264\273\345\207\275\346\225\260\345\217\212\346\242\257\345\272\246\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/sigmoid\346\277\200\346\264\273\345\207\275\346\225\260\345\217\212\346\242\257\345\272\246\345\233\276.png" "b/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/sigmoid\346\277\200\346\264\273\345\207\275\346\225\260\345\217\212\346\242\257\345\272\246\345\233\276.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/tanh\346\277\200\346\264\273\345\207\275\346\225\260.png" "b/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/tanh\346\277\200\346\264\273\345\207\275\346\225\260.png" old mode 100644 new mode 100755 diff --git "a/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/\345\217\202\346\225\260\345\214\226relu.jpg" "b/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/\345\217\202\346\225\260\345\214\226relu.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/\347\245\236\347\273\217\345\205\203\346\250\241\345\236\213.png" "b/data/images/\346\277\200\346\264\273\345\207\275\346\225\260/\347\245\236\347\273\217\345\205\203\346\250\241\345\236\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\347\233\256\346\240\207\346\243\200\346\265\213\345\272\246\351\207\217\346\240\207\345\207\206\346\261\207\346\200\273.jpg" "b/data/images/\347\233\256\346\240\207\346\243\200\346\265\213\345\272\246\351\207\217\346\240\207\345\207\206\346\261\207\346\200\273.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\347\237\245\350\257\206\350\222\270\351\246\217\346\250\241\345\236\213\350\277\207\347\250\213.png" "b/data/images/\347\237\245\350\257\206\350\222\270\351\246\217\346\250\241\345\236\213\350\277\207\347\250\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\347\237\251\351\230\265\344\271\230\344\270\200\344\270\252\350\276\223\345\207\272\345\205\203\347\264\240\347\232\204\350\256\241\347\256\227.png" "b/data/images/\347\237\251\351\230\265\344\271\230\344\270\200\344\270\252\350\276\223\345\207\272\345\205\203\347\264\240\347\232\204\350\256\241\347\256\227.png" old mode 100644 new mode 100755 diff --git "a/data/images/\347\241\254NMS\347\256\227\346\263\225.jpg" "b/data/images/\347\241\254NMS\347\256\227\346\263\225.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\347\256\227\345\212\233\345\210\251\347\224\250\347\216\207\350\256\241\347\256\227\345\205\254\345\274\217.png" "b/data/images/\347\256\227\345\212\233\345\210\251\347\224\250\347\216\207\350\256\241\347\256\227\345\205\254\345\274\217.png" old mode 100644 new mode 100755 diff --git "a/data/images/\347\272\277\346\200\247\345\212\240\346\235\203\345\275\242\345\274\217\347\232\204\350\275\257NMS.jpg" "b/data/images/\347\272\277\346\200\247\345\212\240\346\235\203\345\275\242\345\274\217\347\232\204\350\275\257NMS.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\347\273\217\345\205\270\347\232\204CNN\346\250\241\345\236\213.png" "b/data/images/\347\273\217\345\205\270\347\232\204CNN\346\250\241\345\236\213.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\345\267\256\346\250\241\345\236\213\345\234\250\346\265\267\346\200\2353519\345\271\263\345\217\260\351\203\250\347\275\262\346\265\201\347\250\213.jpg" "b/data/images/\350\247\206\345\267\256\346\250\241\345\236\213\345\234\250\346\265\267\346\200\2353519\345\271\263\345\217\260\351\203\250\347\275\262\346\265\201\347\250\213.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/-X6f0NrOVosxjTIhMDsxi7v43Yq6BqDZ3pESu_3W0vw.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/-X6f0NrOVosxjTIhMDsxi7v43Yq6BqDZ3pESu_3W0vw.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/-jXLfV_qr2zM85N4PM96IDx1SHVeBYIi4_mt7QyposI.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/-jXLfV_qr2zM85N4PM96IDx1SHVeBYIi4_mt7QyposI.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/C1VBAUffMEOBvu2eH2Hv5e6vrZn7BWXlYq1_f_PBCHc.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/C1VBAUffMEOBvu2eH2Hv5e6vrZn7BWXlYq1_f_PBCHc.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/Dis9XHif065GCPhx0v03ey0jVHy4_M6HBZ0PiIw9fXc.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/Dis9XHif065GCPhx0v03ey0jVHy4_M6HBZ0PiIw9fXc.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/HzgxxQWKdq7WCEV0p5BwuZUi_ndWAKjlNety-jAg7Nk.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/HzgxxQWKdq7WCEV0p5BwuZUi_ndWAKjlNety-jAg7Nk.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/IK93nKGvFbaMz6z2VgUdy2SY5HXkGLkaAeMJaWvh7Fw.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/IK93nKGvFbaMz6z2VgUdy2SY5HXkGLkaAeMJaWvh7Fw.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/I\345\270\247\345\222\214P\345\270\247\347\232\204\345\244\204\347\220\206.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/I\345\270\247\345\222\214P\345\270\247\347\232\204\345\244\204\347\220\206.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/JX3nTuItuYQTirDYMNtJ7X6F323W4RJpxEhFai7NSus.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/JX3nTuItuYQTirDYMNtJ7X6F323W4RJpxEhFai7NSus.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/KHA1uyXNRhYth4zTmuTr07LbI-EJHhx7P-YNsOciTiA.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/KHA1uyXNRhYth4zTmuTr07LbI-EJHhx7P-YNsOciTiA.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/M2CqfRSBj_lRBdg3qi865_mM1iGWgo6GqF6eRPwHkd0.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/M2CqfRSBj_lRBdg3qi865_mM1iGWgo6GqF6eRPwHkd0.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/QWcQX5JHyaXT8cSps_T9IDNQlBaFEdkizVLj6PoPVKE.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/QWcQX5JHyaXT8cSps_T9IDNQlBaFEdkizVLj6PoPVKE.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/RAfLbaiYaFqhMQXVO90zp5hL1dIPriJgFMFuOVO5h_c.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/RAfLbaiYaFqhMQXVO90zp5hL1dIPriJgFMFuOVO5h_c.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/V1hLa9oiPCvkvXIhUNK3K9BYs-qtP45t1J_2CERwNzk.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/V1hLa9oiPCvkvXIhUNK3K9BYs-qtP45t1J_2CERwNzk.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/jgLT106FPhGEnBm2dW2ZuA_7_REfRxJc5EBf9TCaHJA.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/jgLT106FPhGEnBm2dW2ZuA_7_REfRxJc5EBf9TCaHJA.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/jgLT106FPhGEnBm2dW2ZuA_7_REfRxJc5EBf9TCaHJA\347\232\204\345\211\257\346\234\254.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/jgLT106FPhGEnBm2dW2ZuA_7_REfRxJc5EBf9TCaHJA\347\232\204\345\211\257\346\234\254.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/oJ9e60nLgn-OVbbx7haL8hBhnrF0YqhwqIgwsWkKYSU.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/oJ9e60nLgn-OVbbx7haL8hBhnrF0YqhwqIgwsWkKYSU.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/pY2BO3_tCwZgCcg-LKdjVgnEjBZo0aU4NCfJIu7K0G8.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/pY2BO3_tCwZgCcg-LKdjVgnEjBZo0aU4NCfJIu7K0G8.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/ppV85jK13JFn0zJHlADmfXWlz5lqcUEuYtFH2gTm4L8.png" "b/data/images/\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201\345\237\272\347\241\200/ppV85jK13JFn0zJHlADmfXWlz5lqcUEuYtFH2gTm4L8.png" old mode 100644 new mode 100755 diff --git "a/data/images/\350\256\255\347\273\203\345\222\214\346\216\250\347\220\206.jpg" "b/data/images/\350\256\255\347\273\203\345\222\214\346\216\250\347\220\206.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\351\232\276\346\230\223\346\255\243\350\264\237\346\240\267\346\234\254.jpg" "b/data/images/\351\232\276\346\230\223\346\255\243\350\264\237\346\240\267\346\234\254.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\351\242\204\346\265\213\346\250\241\345\236\213\346\227\266Dropout\347\232\204\346\223\215\344\275\234.jpg" "b/data/images/\351\242\204\346\265\213\346\250\241\345\236\213\346\227\266Dropout\347\232\204\346\223\215\344\275\234.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\351\253\230\346\226\257\345\212\240\346\235\203\345\275\242\345\274\217\347\232\204NMS.jpg" "b/data/images/\351\253\230\346\226\257\345\212\240\346\235\203\345\275\242\345\274\217\347\232\204NMS.jpg" old mode 100644 new mode 100755 diff --git "a/data/images/\351\253\230\346\226\257\346\250\241\347\263\212.jpg" "b/data/images/\351\253\230\346\226\257\346\250\241\347\263\212.jpg" old mode 100644 new mode 100755 diff --git a/data/intern_info.md b/data/intern_info.md old mode 100644 new mode 100755 diff --git a/data/qcode.png b/data/qcode.png old mode 100644 new mode 100755 diff --git "a/interview_summary/1-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272019\345\261\212\345\256\236\344\271\240\351\235\242\347\273\217.md" "b/interview_summary/1-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272019\345\261\212\345\256\236\344\271\240\351\235\242\347\273\217.md" old mode 100644 new mode 100755 diff --git "a/interview_summary/2-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272019\345\261\212\346\232\221\346\234\237\345\256\236\344\271\240\345\272\224\350\201\230\346\200\273\347\273\223.md" "b/interview_summary/2-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272019\345\261\212\346\232\221\346\234\237\345\256\236\344\271\240\345\272\224\350\201\230\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/interview_summary/3-2019\345\261\212\345\234\260\345\271\263\347\272\277\346\234\272\345\231\250\344\272\272\345\256\236\344\271\240\346\200\273\347\273\223.md" "b/interview_summary/3-2019\345\261\212\345\234\260\345\271\263\347\272\277\346\234\272\345\231\250\344\272\272\345\256\236\344\271\240\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/interview_summary/4-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272020\345\261\212\347\247\213\346\213\233\351\235\242\347\273\217.md" "b/interview_summary/4-\350\256\241\347\256\227\346\234\272\350\247\206\350\247\211\345\262\2272020\345\261\212\347\247\213\346\213\233\351\235\242\347\273\217.md" old mode 100644 new mode 100755 diff --git "a/interview_summary/5-\350\247\206\350\247\211\347\256\227\346\263\225\345\262\2272021\345\271\264\347\244\276\346\213\233\351\235\242\347\273\217.md" "b/interview_summary/5-\350\247\206\350\247\211\347\256\227\346\263\225\345\262\2272021\345\271\264\347\244\276\346\213\233\351\235\242\347\273\217.md" old mode 100644 new mode 100755 diff --git a/interview_summary/README.md b/interview_summary/README.md old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755