[{"data":1,"prerenderedAt":205303},["ShallowReactive",2],{"search":3,"reader-page:\u002Fundergraduate\u002Fnote-2e9f33f0e18d":112012,"reader-order":113842,"page:\u002Fundergraduate\u002Fnote-2e9f33f0e18d":-1},[4,252,453,587,756,796,986,1195,1400,1611,1821,2027,2238,2486,2693,2710,2926,3165,3405,3585,3761,3972,4249,4511,6382,7746,9135,10717,10953,11184,11494,11678,11912,12129,12358,12575,12826,13118,13403,13743,14544,14970,15966,16229,16466,16743,20892,21180,21473,21718,21985,22272,22706,23081,23250,23335,23380,23944,25499,25514,26781,29027,30319,32972,33371,33391,33634,35727,36095,36473,39448,41599,42731,46185,47838,48340,51066,61658,62996,65236,66633,68075,68515,71069,71835,71867,72322,72575,73935,74046,74477,75318,78164,92954,93650,96213,97300,99008,99478,101237,101251,103855,104565,105328,108083,109261,110365],{"id":5,"title":6,"assetBase":7,"author":8,"body":9,"category":232,"collection":233,"date":234,"description":235,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":240,"navigation":128,"originalPath":239,"path":241,"seo":242,"source":243,"stem":244,"tags":245,"weight":250,"__hash__":251},"content\u002Flegacy-blog\u002F1771553236692.md","45. 跳跃游戏 II","\u002Fcontent-assets\u002Flegacy-blog","aiznoyer",{"type":10,"value":11,"toc":229},"minimark",[12,30,48,68,71,86,89,106,110,113,225],[13,14,15,16,20,21,25,26,29],"p",{},"给定一个长度为 ",[17,18,19],"code",{},"n"," 的 ",[22,23,24],"strong",{},"0 索引","整数数组 ",[17,27,28],{},"nums","。初始位置在下标 0。",[13,31,32,33,36,37,40,41,43,44,47],{},"每个元素 ",[17,34,35],{},"nums[i]"," 表示从索引 ",[17,38,39],{},"i"," 向后跳转的最大长度。换句话说，如果你在索引 ",[17,42,39],{}," 处，你可以跳转到任意 ",[17,45,46],{},"(i + j)"," 处：",[49,50,51,58],"ul",{},[52,53,54,57],"li",{},[17,55,56],{},"0 \u003C= j \u003C= nums[i]"," 且",[52,59,60,61,64,65,67],{},"i + j \u003C n\n返回到达 ",[17,62,63],{},"n - 1"," 的最小跳跃次数。测试用例保证可以到达 ",[17,66,63],{},"。",[13,69,70],{},"示例 1:",[72,73,74],"blockquote",{},[13,75,76,77,81,82,85],{},"输入: nums = ",[78,79,80],"span",{},"2,3,1,1,4","\n输出: 2\n解释: 跳到最后一个位置的最小跳跃数是 2。\n从下标为 0 跳到下标为 1 的位置，跳 1 步，然后跳 3 步到达数组的最后一个位置。\n示例 2:\n输入: nums = ",[78,83,84],{},"2,3,0,1,4","\n输出: 2",[13,87,88],{},"提示:",[49,90,91,96,101],{},[52,92,93],{},[17,94,95],{},"1 \u003C= nums.length \u003C= 104",[52,97,98],{},[17,99,100],{},"0 \u003C= nums[i] \u003C= 1000",[52,102,103,104],{},"题目保证可以到达 ",[17,105,63],{},[107,108,109],"h2",{"id":109},"参考解法",[13,111,112],{},"下面保留的是原始练习仓库中的个人作答，可在右侧工作台中独立重写，再按需揭示对照。",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-python shiki shiki-themes github-dark","\nclass Solution(object):\n    def jump(self, nums):\n        # i + nums[i] >= len(nums) - 1 --> 判断能否到达\n        # 更新max时移动次数 + 1 --> i + nums[i] >= max count += 1\n        count = 0\n        cur_step = next_step = 0\n        for i in range(len(nums) - 1):\n            next_step = max(next_step, i + nums[i])\n            if i == cur_step:\n                cur_step = next_step\n                count += 1\n        return count\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n","python","",[17,121,122,130,136,142,148,154,160,166,172,178,184,190,196,202,208,214,220],{"__ignoreMap":119},[78,123,126],{"class":124,"line":125},"line",1,[78,127,129],{"emptyLinePlaceholder":128},true,"\n",[78,131,133],{"class":124,"line":132},2,[78,134,135],{},"class Solution(object):\n",[78,137,139],{"class":124,"line":138},3,[78,140,141],{},"    def jump(self, nums):\n",[78,143,145],{"class":124,"line":144},4,[78,146,147],{},"        # i + nums[i] >= len(nums) - 1 --> 判断能否到达\n",[78,149,151],{"class":124,"line":150},5,[78,152,153],{},"        # 更新max时移动次数 + 1 --> i + nums[i] >= max count += 1\n",[78,155,157],{"class":124,"line":156},6,[78,158,159],{},"        count = 0\n",[78,161,163],{"class":124,"line":162},7,[78,164,165],{},"        cur_step = next_step = 0\n",[78,167,169],{"class":124,"line":168},8,[78,170,171],{},"        for i in range(len(nums) - 1):\n",[78,173,175],{"class":124,"line":174},9,[78,176,177],{},"            next_step = max(next_step, i + nums[i])\n",[78,179,181],{"class":124,"line":180},10,[78,182,183],{},"            if i == cur_step:\n",[78,185,187],{"class":124,"line":186},11,[78,188,189],{},"                cur_step = next_step\n",[78,191,193],{"class":124,"line":192},12,[78,194,195],{},"                count += 1\n",[78,197,199],{"class":124,"line":198},13,[78,200,201],{},"        return count\n",[78,203,205],{"class":124,"line":204},14,[78,206,207],{},"        \"\"\"\n",[78,209,211],{"class":124,"line":210},15,[78,212,213],{},"        :type nums: List[int]\n",[78,215,217],{"class":124,"line":216},16,[78,218,219],{},"        :rtype: int\n",[78,221,223],{"class":124,"line":222},17,[78,224,207],{},[226,227,228],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":119,"searchDepth":144,"depth":144,"links":230},[231],{"id":109,"depth":132,"text":109},"贪心 数组 动态规划","研究生阶段","2026-02-20","给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。","中等","md","algorithm",null,{},"\u002Flegacy-blog\u002F1771553236692",{"title":6,"description":235},"legacy-blog","legacy-blog\u002F1771553236692",[246,247,248,249],"算法","贪心","数组","动态规划",0,"CctrkcgutQzWRozca6jvZbB_cUyaktzVsp4ptbaddRY",{"id":253,"title":254,"assetBase":7,"author":8,"body":255,"category":442,"collection":233,"date":234,"description":443,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":444,"navigation":128,"originalPath":239,"path":445,"seo":446,"source":243,"stem":447,"tags":448,"weight":250,"__hash__":452},"content\u002Flegacy-blog\u002F1771554340579.md","763. 划分字母区间",{"type":10,"value":256,"toc":439},[257,280,286,289,294,302,307,313,318,330,332,334,437],[13,258,259,260,263,264,267,268,271,272,275,276,279],{},"给你一个字符串 ",[17,261,262],{},"s"," 。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。例如，字符串 ",[17,265,266],{},"\"ababcc\""," 能够被分为 ",[17,269,270],{},"[\"abab\", \"cc\"]","，但类似 ",[17,273,274],{},"[\"aba\", \"bcc\"]"," 或 ",[17,277,278],{},"[\"ab\", \"ab\", \"cc\"]"," 的划分是非法的。",[13,281,282,283,285],{},"注意，划分结果需要满足：将所有划分结果按顺序连接，得到的字符串仍然是 ",[17,284,262],{}," 。",[13,287,288],{},"返回一个表示每个字符串片段的长度的列表。",[13,290,291],{},[22,292,293],{},"示例 1：",[114,295,300],{"className":296,"code":298,"language":299},[297],"language-text","输入：s = \"ababcbacadefegdehijhklij\"\n输出：[9,7,8]\n解释：\n划分结果为 \"ababcbaca\"、\"defegde\"、\"hijhklij\" 。\n每个字母最多出现在一个片段中。\n像 \"ababcbacadefegde\", \"hijhklij\" 这样的划分是错误的，因为划分的片段数较少。 \n","text",[17,301,298],{"__ignoreMap":119},[13,303,304],{},[22,305,306],{},"示例 2：",[114,308,311],{"className":309,"code":310,"language":299},[297],"输入：s = \"eccbbbbdec\"\n输出：[10]\n",[17,312,310],{"__ignoreMap":119},[13,314,315],{},[22,316,317],{},"提示：",[49,319,320,325],{},[52,321,322],{},[17,323,324],{},"1 \u003C= s.length \u003C= 500",[52,326,327,329],{},[17,328,262],{}," 仅由小写英文字母组成",[107,331,109],{"id":109},[13,333,112],{},[114,335,337],{"className":116,"code":336,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def partitionLabels(self, s):\n        \"\"\"\n        :type s: str\n        :rtype: List[int]\n        \"\"\"\n        maxIndex = dict()\n        # 记录每个字符的最后位置\n        for i in range(len(s)):\n            maxIndex[s[i]] = i\n        ans = list()\n        start = end = 0  # 当前开始和结束位置\n        # 遍历整个字符串s，寻找合适的解\n        for i in range(len(s)):\n            end = max(maxIndex[s[i]], end)\n            if i == end:  # 当 i 走到序列末尾，说明可以截断\n                ans.append(end - start + 1)\n                start = end + 1\n        return ans\n\n",[17,338,339,343,347,352,356,361,366,370,375,380,385,390,395,400,405,409,414,419,425,431],{"__ignoreMap":119},[78,340,341],{"class":124,"line":125},[78,342,129],{"emptyLinePlaceholder":128},[78,344,345],{"class":124,"line":132},[78,346,135],{},[78,348,349],{"class":124,"line":138},[78,350,351],{},"    def partitionLabels(self, s):\n",[78,353,354],{"class":124,"line":144},[78,355,207],{},[78,357,358],{"class":124,"line":150},[78,359,360],{},"        :type s: str\n",[78,362,363],{"class":124,"line":156},[78,364,365],{},"        :rtype: List[int]\n",[78,367,368],{"class":124,"line":162},[78,369,207],{},[78,371,372],{"class":124,"line":168},[78,373,374],{},"        maxIndex = dict()\n",[78,376,377],{"class":124,"line":174},[78,378,379],{},"        # 记录每个字符的最后位置\n",[78,381,382],{"class":124,"line":180},[78,383,384],{},"        for i in range(len(s)):\n",[78,386,387],{"class":124,"line":186},[78,388,389],{},"            maxIndex[s[i]] = i\n",[78,391,392],{"class":124,"line":192},[78,393,394],{},"        ans = list()\n",[78,396,397],{"class":124,"line":198},[78,398,399],{},"        start = end = 0  # 当前开始和结束位置\n",[78,401,402],{"class":124,"line":204},[78,403,404],{},"        # 遍历整个字符串s，寻找合适的解\n",[78,406,407],{"class":124,"line":210},[78,408,384],{},[78,410,411],{"class":124,"line":216},[78,412,413],{},"            end = max(maxIndex[s[i]], end)\n",[78,415,416],{"class":124,"line":222},[78,417,418],{},"            if i == end:  # 当 i 走到序列末尾，说明可以截断\n",[78,420,422],{"class":124,"line":421},18,[78,423,424],{},"                ans.append(end - start + 1)\n",[78,426,428],{"class":124,"line":427},19,[78,429,430],{},"                start = end + 1\n",[78,432,434],{"class":124,"line":433},20,[78,435,436],{},"        return ans\n",[226,438,228],{},{"title":119,"searchDepth":144,"depth":144,"links":440},[441],{"id":109,"depth":132,"text":109},"贪心 哈希表 字符串 双指针","给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。例如，字符串 \"ababcc\" 能够被分为 [\"abab\", \"cc\"]，但类似 [\"aba\", \"bcc\"] 或 [\"ab\", \"ab\", \"cc\"] 的划分是非法的。",{},"\u002Flegacy-blog\u002F1771554340579",{"title":254,"description":443},"legacy-blog\u002F1771554340579",[246,247,449,450,451],"哈希表","字符串","双指针","jq_eSfV1E-CsZXgsgo6PVUOB7CztGksD4_LFRY4g6xM",{"id":454,"title":455,"assetBase":7,"author":8,"body":456,"category":249,"collection":233,"date":234,"description":579,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":581,"navigation":128,"originalPath":239,"path":582,"seo":583,"source":243,"stem":584,"tags":585,"weight":250,"__hash__":586},"content\u002Flegacy-blog\u002F1771555016767.md","70. 爬楼梯",{"type":10,"value":457,"toc":576},[458,464,474,478,484,488,494,498,505,507,509,574],[13,459,460,461,463],{},"假设你正在爬楼梯。需要 ",[17,462,19],{}," 阶你才能到达楼顶。",[13,465,466,467,275,470,473],{},"每次你可以爬 ",[17,468,469],{},"1",[17,471,472],{},"2"," 个台阶。你有多少种不同的方法可以爬到楼顶呢？",[13,475,476],{},[22,477,293],{},[114,479,482],{"className":480,"code":481,"language":299},[297],"输入：n = 2\n输出：2\n解释：有两种方法可以爬到楼顶。\n1. 1 阶 + 1 阶\n2. 2 阶\n",[17,483,481],{"__ignoreMap":119},[13,485,486],{},[22,487,306],{},[114,489,492],{"className":490,"code":491,"language":299},[297],"输入：n = 3\n输出：3\n解释：有三种方法可以爬到楼顶。\n1. 1 阶 + 1 阶 + 1 阶\n2. 1 阶 + 2 阶\n3. 2 阶 + 1 阶\n",[17,493,491],{"__ignoreMap":119},[13,495,496],{},[22,497,317],{},[49,499,500],{},[52,501,502],{},[17,503,504],{},"1 \u003C= n \u003C= 45",[107,506,109],{"id":109},[13,508,112],{},[114,510,512],{"className":116,"code":511,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def climbStairs(self, n):\n        \"\"\"\n        :type n: int\n        :rtype: int\n        \"\"\"\n        # dp[i] = dp[i - 1] + 1 or dp[i - 2] + 2 -> dp[i] = dp[i - 1] + dp[i - 2]\n        dp = [0] * (n + 1)\n        dp[0] = 1; dp[1] = 1\n        for i in range(2, n + 1):\n            dp[i] = dp[i - 1] + dp[i - 2]\n        return dp[n]\n\n",[17,513,514,518,522,527,531,536,540,544,549,554,559,564,569],{"__ignoreMap":119},[78,515,516],{"class":124,"line":125},[78,517,129],{"emptyLinePlaceholder":128},[78,519,520],{"class":124,"line":132},[78,521,135],{},[78,523,524],{"class":124,"line":138},[78,525,526],{},"    def climbStairs(self, n):\n",[78,528,529],{"class":124,"line":144},[78,530,207],{},[78,532,533],{"class":124,"line":150},[78,534,535],{},"        :type n: int\n",[78,537,538],{"class":124,"line":156},[78,539,219],{},[78,541,542],{"class":124,"line":162},[78,543,207],{},[78,545,546],{"class":124,"line":168},[78,547,548],{},"        # dp[i] = dp[i - 1] + 1 or dp[i - 2] + 2 -> dp[i] = dp[i - 1] + dp[i - 2]\n",[78,550,551],{"class":124,"line":174},[78,552,553],{},"        dp = [0] * (n + 1)\n",[78,555,556],{"class":124,"line":180},[78,557,558],{},"        dp[0] = 1; dp[1] = 1\n",[78,560,561],{"class":124,"line":186},[78,562,563],{},"        for i in range(2, n + 1):\n",[78,565,566],{"class":124,"line":192},[78,567,568],{},"            dp[i] = dp[i - 1] + dp[i - 2]\n",[78,570,571],{"class":124,"line":198},[78,572,573],{},"        return dp[n]\n",[226,575,228],{},{"title":119,"searchDepth":144,"depth":144,"links":577},[578],{"id":109,"depth":132,"text":109},"假设你正在爬楼梯。需要 n 阶你才能到达楼顶。","简单",{},"\u002Flegacy-blog\u002F1771555016767",{"title":455,"description":579},"legacy-blog\u002F1771555016767",[246,249],"K_LG8c1BO2a23c3zkbVWnqzKtIsf4A_ooE_ZM5IEkgI",{"id":588,"title":589,"assetBase":7,"author":8,"body":590,"category":748,"collection":233,"date":234,"description":749,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":750,"navigation":128,"originalPath":239,"path":751,"seo":752,"source":243,"stem":753,"tags":754,"weight":250,"__hash__":755},"content\u002Flegacy-blog\u002F1771555602075.md","118. 杨辉三角",{"type":10,"value":591,"toc":745},[592,607,614,621,625,631,636,642,646,653,655,657,743],[13,593,594,595,601,602,606],{},"给定一个非负整数 ",[596,597,598],"em",{},[17,599,600],{},"numRows","，生成「杨辉三角」的前 ",[596,603,604],{},[17,605,600],{}," 行。",[13,608,609,610,613],{},"在「",[22,611,612],{},"杨辉三角","」中，每个数是它左上方和右上方的数的和。",[13,615,616],{},[617,618],"img",{"alt":619,"src":620},"图片","\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177155562723371.png",[13,622,623],{},[22,624,70],{},[114,626,629],{"className":627,"code":628,"language":299},[297],"输入: numRows = 5\n输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]\n",[17,630,628],{"__ignoreMap":119},[13,632,633],{},[22,634,635],{},"示例 2:",[114,637,640],{"className":638,"code":639,"language":299},[297],"输入: numRows = 1\n输出: [[1]]\n",[17,641,639],{"__ignoreMap":119},[13,643,644],{},[22,645,88],{},[49,647,648],{},[52,649,650],{},[17,651,652],{},"1 \u003C= numRows \u003C= 30",[107,654,109],{"id":109},[13,656,112],{},[114,658,660],{"className":116,"code":659,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def generate(self, numRows):\n        a = []\n        for i in range(numRows):\n            if i == 0:\n                a.append([1])\n            else:\n                row = [1] * (i + 1)\n                for j in range(1, i):\n                    row[j] = a[i - 1][j - 1] + a[i - 1][j]\n                a.append(row)\n        return a\n        \"\"\"\n        :type numRows: int\n        :rtype: List[List[int]]\n        \"\"\"\n\n",[17,661,662,666,670,675,680,685,690,695,700,705,710,715,720,725,729,734,739],{"__ignoreMap":119},[78,663,664],{"class":124,"line":125},[78,665,129],{"emptyLinePlaceholder":128},[78,667,668],{"class":124,"line":132},[78,669,135],{},[78,671,672],{"class":124,"line":138},[78,673,674],{},"    def generate(self, numRows):\n",[78,676,677],{"class":124,"line":144},[78,678,679],{},"        a = []\n",[78,681,682],{"class":124,"line":150},[78,683,684],{},"        for i in range(numRows):\n",[78,686,687],{"class":124,"line":156},[78,688,689],{},"            if i == 0:\n",[78,691,692],{"class":124,"line":162},[78,693,694],{},"                a.append([1])\n",[78,696,697],{"class":124,"line":168},[78,698,699],{},"            else:\n",[78,701,702],{"class":124,"line":174},[78,703,704],{},"                row = [1] * (i + 1)\n",[78,706,707],{"class":124,"line":180},[78,708,709],{},"                for j in range(1, i):\n",[78,711,712],{"class":124,"line":186},[78,713,714],{},"                    row[j] = a[i - 1][j - 1] + a[i - 1][j]\n",[78,716,717],{"class":124,"line":192},[78,718,719],{},"                a.append(row)\n",[78,721,722],{"class":124,"line":198},[78,723,724],{},"        return a\n",[78,726,727],{"class":124,"line":204},[78,728,207],{},[78,730,731],{"class":124,"line":210},[78,732,733],{},"        :type numRows: int\n",[78,735,736],{"class":124,"line":216},[78,737,738],{},"        :rtype: List[List[int]]\n",[78,740,741],{"class":124,"line":222},[78,742,207],{},[226,744,228],{},{"title":119,"searchDepth":144,"depth":144,"links":746},[747],{"id":109,"depth":132,"text":109},"数组 动态规划","给定一个非负整数 numRows，生成「杨辉三角」的前 numRows 行。",{},"\u002Flegacy-blog\u002F1771555602075",{"title":589,"description":749},"legacy-blog\u002F1771555602075",[246,248,249],"qzlG5yExAnHLlkc9UQPp_deeNAH9t6OulIndp4sYtX4",{"id":757,"title":758,"assetBase":239,"author":8,"body":759,"category":787,"collection":233,"date":234,"description":763,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":789,"navigation":128,"originalPath":239,"path":790,"seo":791,"source":243,"stem":792,"tags":793,"weight":250,"__hash__":795},"content\u002Flegacy-blog\u002F1771573690810.md","VLLM",{"type":10,"value":760,"toc":785},[761,764,767,770,773,776,779,782],[13,762,763],{},"vllm",[13,765,766],{},"推理加速：内存优化、并行计算、调度策略",[13,768,769],{},"内存优化：pageattention：将KV分块，按需分配（allocate_blocks（ceil（current_sequence_length \u002F block_size）））",[13,771,772],{},"显存占用大概减少4倍",[13,774,775],{},"连续批处理：实时监控请求状态，动态合并正在处理的请求。迭代级调度：每生成一个token重新调整批次；抢占式推理：优先处理低延迟要求的请求",[13,777,778],{},"内存池：预先申请大块内存块，循环复用内存块",[13,780,781],{},"案例：一开始使用huggingface pipeline吞吐量较低，且长期占用GPU资源，平均延迟较高。",[13,783,784],{},"8台h800 qwen-72B实际只跑满了不到3台90%利用率，同时能支持用户数量提高，且体验也有所好转",{"title":119,"searchDepth":144,"depth":144,"links":786},[],"技术与求职","article",{},"\u002Flegacy-blog\u002F1771573690810",{"title":758,"description":763},"legacy-blog\u002F1771573690810",[794],"大语言模型","ar_X3H-x2hKJ_1xrdn-oNQ6HhCckmAoXprcW3HoOQd0",{"id":797,"title":798,"assetBase":7,"author":8,"body":799,"category":748,"collection":233,"date":978,"description":979,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":980,"navigation":128,"originalPath":239,"path":981,"seo":982,"source":243,"stem":983,"tags":984,"weight":250,"__hash__":985},"content\u002Flegacy-blog\u002F1771638990475.md","198. 打家劫舍",{"type":10,"value":800,"toc":975},[801,807,814,820,838,843,858,863,875,877,879,973],[13,802,803,804,67],{},"你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，",[22,805,806],{},"如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警",[13,808,809,810,813],{},"给定一个代表每个房屋存放金额的非负整数数组，计算你 ",[22,811,812],{},"不触动警报装置的情况下"," ，一夜之内能够偷窃到的最高金额。",[13,815,816,819],{},[22,817,818],{},"示例 1","：",[72,821,822],{},[13,823,824,819,827,830,833,834,837],{},[22,825,826],{},"输入",[78,828,829],{},"1,2,3,1",[22,831,832],{},"输出","：4\n",[22,835,836],{},"解释","：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。\n偷窃到的最高金额 = 1 + 3 = 4 。",[13,839,840,819],{},[22,841,842],{},"示例 2",[72,844,845],{},[13,846,847,819,849,852,854,855,857],{},[22,848,826],{},[78,850,851],{},"2,7,9,3,1",[22,853,832],{},"：12\n",[22,856,836],{},"：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。\n偷窃到的最高金额 = 2 + 9 + 1 = 12 。",[13,859,860,819],{},[22,861,862],{},"提示",[49,864,865,870],{},[52,866,867],{},[17,868,869],{},"1 \u003C= nums.length \u003C= 100",[52,871,872],{},[17,873,874],{},"0 \u003C= nums[i] \u003C= 400",[107,876,109],{"id":109},[13,878,112],{},[114,880,882],{"className":116,"code":881,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def rob(self, nums):\n        # dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])\n        if not nums:\n            return 0\n        length = len(nums)\n        if length == 1:\n            return nums[0]\n        dp = [0] * length\n        dp[0] = nums[0]\n        dp[1] = max(nums[0], nums[1])\n        for i in range(2, length):\n            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])\n        return dp[length - 1]\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,883,884,888,892,897,902,907,912,917,922,927,932,937,942,947,952,957,961,965,969],{"__ignoreMap":119},[78,885,886],{"class":124,"line":125},[78,887,129],{"emptyLinePlaceholder":128},[78,889,890],{"class":124,"line":132},[78,891,135],{},[78,893,894],{"class":124,"line":138},[78,895,896],{},"    def rob(self, nums):\n",[78,898,899],{"class":124,"line":144},[78,900,901],{},"        # dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])\n",[78,903,904],{"class":124,"line":150},[78,905,906],{},"        if not nums:\n",[78,908,909],{"class":124,"line":156},[78,910,911],{},"            return 0\n",[78,913,914],{"class":124,"line":162},[78,915,916],{},"        length = len(nums)\n",[78,918,919],{"class":124,"line":168},[78,920,921],{},"        if length == 1:\n",[78,923,924],{"class":124,"line":174},[78,925,926],{},"            return nums[0]\n",[78,928,929],{"class":124,"line":180},[78,930,931],{},"        dp = [0] * length\n",[78,933,934],{"class":124,"line":186},[78,935,936],{},"        dp[0] = nums[0]\n",[78,938,939],{"class":124,"line":192},[78,940,941],{},"        dp[1] = max(nums[0], nums[1])\n",[78,943,944],{"class":124,"line":198},[78,945,946],{},"        for i in range(2, length):\n",[78,948,949],{"class":124,"line":204},[78,950,951],{},"            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])\n",[78,953,954],{"class":124,"line":210},[78,955,956],{},"        return dp[length - 1]\n",[78,958,959],{"class":124,"line":216},[78,960,207],{},[78,962,963],{"class":124,"line":222},[78,964,213],{},[78,966,967],{"class":124,"line":421},[78,968,219],{},[78,970,971],{"class":124,"line":427},[78,972,207],{},[226,974,228],{},{"title":119,"searchDepth":144,"depth":144,"links":976},[977],{"id":109,"depth":132,"text":109},"2026-02-21","你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。",{},"\u002Flegacy-blog\u002F1771638990475",{"title":798,"description":979},"legacy-blog\u002F1771638990475",[246,248,249],"9UmmDjnwx_UFjYdkWNDGngIgioLlEJZFOXlGyk21mAU",{"id":987,"title":988,"assetBase":7,"author":8,"body":989,"category":1185,"collection":233,"date":978,"description":1186,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":1187,"navigation":128,"originalPath":239,"path":1188,"seo":1189,"source":243,"stem":1190,"tags":1191,"weight":250,"__hash__":1194},"content\u002Flegacy-blog\u002F1771640139613.md","279. 完全平方数",{"type":10,"value":990,"toc":1182},[991,1003,1030,1034,1056,1060,1077,1081,1088,1090,1092,1180],[13,992,993,994,996,997,285],{},"给你一个整数 ",[17,995,19],{}," ，返回 ",[596,998,999,1000,1002],{},"和为 ",[17,1001,19],{}," 的完全平方数的最少数量",[13,1004,1005,1008,1009,1011,1012,1011,1015,1018,1019,1022,1023,1018,1026,1029],{},[22,1006,1007],{},"完全平方数"," 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，",[17,1010,469],{},"、",[17,1013,1014],{},"4",[17,1016,1017],{},"9"," 和 ",[17,1020,1021],{},"16"," 都是完全平方数，而 ",[17,1024,1025],{},"3",[17,1027,1028],{},"11"," 不是。",[13,1031,1032],{},[22,1033,293],{},[72,1035,1036],{},[13,1037,1038,1041,1042,1045,1048,1049,1052,1053],{},[22,1039,1040],{},"输入："," n = ",[17,1043,1044],{},"12",[22,1046,1047],{},"输出："," 3\n",[22,1050,1051],{},"解释："," ",[17,1054,1055],{},"12 = 4 + 4 + 4",[13,1057,1058],{},[22,1059,306],{},[72,1061,1062],{},[13,1063,1064,1041,1066,1069,1071,1072,1074],{},[22,1065,1040],{},[17,1067,1068],{},"13",[22,1070,1047],{}," 2\n",[22,1073,1051],{},[17,1075,1076],{}," 13 = 4 + 9",[13,1078,1079],{},[22,1080,317],{},[49,1082,1083],{},[52,1084,1085],{},[17,1086,1087],{},"1 \u003C= n \u003C= 104",[107,1089,109],{"id":109},[13,1091,112],{},[114,1093,1095],{"className":116,"code":1094,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def numSquares(self, n):\n        dp = [n] * (n + 1)  # 初始化为一个较大值，如 inf 或 n\n        dp[0] = 0\n\n        # 完全背包\n        i = 1\n        while i * i \u003C= n:  # 第一层循环：判断i*i\n            num = i * i\n            for j in range(num, n + 1):  # 第二层循环：遍历背包【正序】\n                dp[j] = min(dp[j], dp[j - num] + 1)\n            i += 1\n        return dp[-1]\n        \"\"\"\n        :type n: int\n        :rtype: int\n        \"\"\"\n\n",[17,1096,1097,1101,1105,1110,1115,1120,1124,1129,1134,1139,1144,1149,1154,1159,1164,1168,1172,1176],{"__ignoreMap":119},[78,1098,1099],{"class":124,"line":125},[78,1100,129],{"emptyLinePlaceholder":128},[78,1102,1103],{"class":124,"line":132},[78,1104,135],{},[78,1106,1107],{"class":124,"line":138},[78,1108,1109],{},"    def numSquares(self, n):\n",[78,1111,1112],{"class":124,"line":144},[78,1113,1114],{},"        dp = [n] * (n + 1)  # 初始化为一个较大值，如 inf 或 n\n",[78,1116,1117],{"class":124,"line":150},[78,1118,1119],{},"        dp[0] = 0\n",[78,1121,1122],{"class":124,"line":156},[78,1123,129],{"emptyLinePlaceholder":128},[78,1125,1126],{"class":124,"line":162},[78,1127,1128],{},"        # 完全背包\n",[78,1130,1131],{"class":124,"line":168},[78,1132,1133],{},"        i = 1\n",[78,1135,1136],{"class":124,"line":174},[78,1137,1138],{},"        while i * i \u003C= n:  # 第一层循环：判断i*i\n",[78,1140,1141],{"class":124,"line":180},[78,1142,1143],{},"            num = i * i\n",[78,1145,1146],{"class":124,"line":186},[78,1147,1148],{},"            for j in range(num, n + 1):  # 第二层循环：遍历背包【正序】\n",[78,1150,1151],{"class":124,"line":192},[78,1152,1153],{},"                dp[j] = min(dp[j], dp[j - num] + 1)\n",[78,1155,1156],{"class":124,"line":198},[78,1157,1158],{},"            i += 1\n",[78,1160,1161],{"class":124,"line":204},[78,1162,1163],{},"        return dp[-1]\n",[78,1165,1166],{"class":124,"line":210},[78,1167,207],{},[78,1169,1170],{"class":124,"line":216},[78,1171,535],{},[78,1173,1174],{"class":124,"line":222},[78,1175,219],{},[78,1177,1178],{"class":124,"line":421},[78,1179,207],{},[226,1181,228],{},{"title":119,"searchDepth":144,"depth":144,"links":1183},[1184],{"id":109,"depth":132,"text":109},"广度优先搜索 数学 动态规划","给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。",{},"\u002Flegacy-blog\u002F1771640139613",{"title":988,"description":1186},"legacy-blog\u002F1771640139613",[246,1192,1193,249],"广度优先搜索","数学","h9g4DrvOJyLc2h9KT13379i0LAyRamanhhqnwjfu9HA",{"id":1196,"title":1197,"assetBase":7,"author":8,"body":1198,"category":1392,"collection":233,"date":978,"description":1393,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":1394,"navigation":128,"originalPath":239,"path":1395,"seo":1396,"source":243,"stem":1397,"tags":1398,"weight":250,"__hash__":1399},"content\u002Flegacy-blog\u002F1771643279914.md","322. 零钱兑换",{"type":10,"value":1199,"toc":1389},[1200,1219,1223,1243,1247,1261,1266,1278,1282,1299,1301,1303,1387],[13,1201,1202,1203,1206,1207,1210,1211,1214,1215,1218],{},"给你一个整数数组 ",[17,1204,1205],{},"coins"," ，表示不同面额的硬币；以及一个整数 ",[17,1208,1209],{},"amount"," ，表示总金额。\n计算并返回可以凑成总金额所需的 ",[22,1212,1213],{},"最少的硬币个数"," 。如果没有任何一种硬币组合能组成总金额，返回 ",[17,1216,1217],{},"-1"," 。\n你可以认为每种硬币的数量是无限的。",[13,1220,1221],{},[22,1222,293],{},[72,1224,1225],{},[13,1226,1227,1229,1230,1233,1234,1236,1052,1238,1240,1242],{},[22,1228,1040],{}," coins = ",[17,1231,1232],{},"[1, 2, 5]",", amount = ",[17,1235,1028],{},[22,1237,1047],{},[17,1239,1025],{},[22,1241,1051],{}," 11 = 5 + 5 + 1",[13,1244,1245],{},[22,1246,306],{},[72,1248,1249],{},[13,1250,1251,1229,1253,1233,1256,1258,1260],{},[22,1252,1040],{},[17,1254,1255],{},"[2]",[17,1257,1025],{},[22,1259,1047],{}," -1",[13,1262,1263],{},[22,1264,1265],{},"示例 3：",[72,1267,1268],{},[13,1269,1270,1229,1272,1274,1275,1277],{},[22,1271,1040],{},[78,1273,469],{},", amount = 0\n",[22,1276,1047],{}," 0",[13,1279,1280],{},[22,1281,317],{},[49,1283,1284,1289,1294],{},[52,1285,1286],{},[17,1287,1288],{},"1 \u003C= coins.length \u003C= 12",[52,1290,1291],{},[17,1292,1293],{},"1 \u003C= coins[i] \u003C= 231 - 1",[52,1295,1296],{},[17,1297,1298],{},"0 \u003C= amount \u003C= 104",[107,1300,109],{"id":109},[13,1302,112],{},[114,1304,1306],{"className":116,"code":1305,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def coinChange(self, coins, amount):\n        dp = [amount + 1] * (amount + 1)\n        dp[0] = 0\n        for i in range(amount + 1):\n            for coin in coins:\n                if i - coin \u003C 0:\n                    continue\n                dp[i] = min(dp[i], dp[i - coin] + 1)\n        \n        return -1 if dp[amount] == (amount + 1) else dp[amount]\n        \"\"\"\n        :type coins: List[int]\n        :type amount: int\n        :rtype: int\n        \"\"\"\n\n",[17,1307,1308,1312,1316,1321,1326,1330,1335,1340,1345,1350,1355,1360,1365,1369,1374,1379,1383],{"__ignoreMap":119},[78,1309,1310],{"class":124,"line":125},[78,1311,129],{"emptyLinePlaceholder":128},[78,1313,1314],{"class":124,"line":132},[78,1315,135],{},[78,1317,1318],{"class":124,"line":138},[78,1319,1320],{},"    def coinChange(self, coins, amount):\n",[78,1322,1323],{"class":124,"line":144},[78,1324,1325],{},"        dp = [amount + 1] * (amount + 1)\n",[78,1327,1328],{"class":124,"line":150},[78,1329,1119],{},[78,1331,1332],{"class":124,"line":156},[78,1333,1334],{},"        for i in range(amount + 1):\n",[78,1336,1337],{"class":124,"line":162},[78,1338,1339],{},"            for coin in coins:\n",[78,1341,1342],{"class":124,"line":168},[78,1343,1344],{},"                if i - coin \u003C 0:\n",[78,1346,1347],{"class":124,"line":174},[78,1348,1349],{},"                    continue\n",[78,1351,1352],{"class":124,"line":180},[78,1353,1354],{},"                dp[i] = min(dp[i], dp[i - coin] + 1)\n",[78,1356,1357],{"class":124,"line":186},[78,1358,1359],{},"        \n",[78,1361,1362],{"class":124,"line":192},[78,1363,1364],{},"        return -1 if dp[amount] == (amount + 1) else dp[amount]\n",[78,1366,1367],{"class":124,"line":198},[78,1368,207],{},[78,1370,1371],{"class":124,"line":204},[78,1372,1373],{},"        :type coins: List[int]\n",[78,1375,1376],{"class":124,"line":210},[78,1377,1378],{},"        :type amount: int\n",[78,1380,1381],{"class":124,"line":216},[78,1382,219],{},[78,1384,1385],{"class":124,"line":222},[78,1386,207],{},[226,1388,228],{},{"title":119,"searchDepth":144,"depth":144,"links":1390},[1391],{"id":109,"depth":132,"text":109},"广度优先搜索 数组 动态规划","给你一个整数数组 coins ，表示不同面额的硬币；以及一个整数 amount ，表示总金额。\n计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额，返回 -1 。\n你可以认为每种硬币的数量是无限的。",{},"\u002Flegacy-blog\u002F1771643279914",{"title":1197,"description":1393},"legacy-blog\u002F1771643279914",[246,1192,248,249],"2n1LkKVchIiXhSujrdyLbyFKXPi4gq8hw64S9dIKXXE",{"id":1401,"title":1402,"assetBase":7,"author":8,"body":1403,"category":1602,"collection":233,"date":1603,"description":1604,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":1605,"navigation":128,"originalPath":239,"path":1606,"seo":1607,"source":243,"stem":1608,"tags":1609,"weight":250,"__hash__":1610},"content\u002Flegacy-blog\u002F1771724706431.md","139. 单词拆分",{"type":10,"value":1404,"toc":1599},[1405,1420,1423,1427,1446,1450,1465,1469,1482,1486,1518,1520,1522,1597],[13,1406,259,1407,1409,1410,1413,1414,1416,1417,67],{},[17,1408,262],{}," 和一个字符串列表 ",[17,1411,1412],{},"wordDict"," 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 ",[17,1415,262],{}," 则返回 ",[17,1418,1419],{},"true",[13,1421,1422],{},"**注意：**不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。",[13,1424,1425],{},[22,1426,293],{},[72,1428,1429],{},[13,1430,1431,1434,1435,1438,1441,1442,1445],{},[22,1432,1433],{},"输入:"," s = \"leetcode\", wordDict = ",[78,1436,1437],{},"\"leet\", \"code\"",[22,1439,1440],{},"输出:"," true\n",[22,1443,1444],{},"解释:"," 返回 true 因为 \"leetcode\" 可以由 \"leet\" 和 \"code\" 拼接成。",[13,1447,1448],{},[22,1449,306],{},[72,1451,1452],{},[13,1453,1454,1456,1457,1460,1441,1462,1464],{},[22,1455,1433],{}," s = \"applepenapple\", wordDict = ",[78,1458,1459],{},"\"apple\", \"pen\"",[22,1461,1440],{},[22,1463,1444],{}," 返回 true 因为 \"applepenapple\" 可以由 \"apple\" \"pen\" \"apple\" 拼接成。\n注意，你可以重复使用字典中的单词。",[13,1466,1467],{},[22,1468,1265],{},[72,1470,1471],{},[13,1472,1473,1475,1476,1479,1481],{},[22,1474,1433],{}," s = \"catsandog\", wordDict = ",[78,1477,1478],{},"\"cats\", \"dog\", \"sand\", \"and\", \"cat\"",[22,1480,1440],{}," false",[13,1483,1484],{},[22,1485,317],{},[49,1487,1488,1493,1498,1503,1510],{},[52,1489,1490],{},[17,1491,1492],{},"1 \u003C= s.length \u003C= 300",[52,1494,1495],{},[17,1496,1497],{},"1 \u003C= wordDict.length \u003C= 1000",[52,1499,1500],{},[17,1501,1502],{},"1 \u003C= wordDict[i].length \u003C= 20",[52,1504,1505,1018,1507,329],{},[17,1506,262],{},[17,1508,1509],{},"wordDict[i]",[52,1511,1512,1514,1515],{},[17,1513,1412],{}," 中的所有字符串 ",[22,1516,1517],{},"互不相同",[107,1519,109],{"id":109},[13,1521,112],{},[114,1523,1525],{"className":116,"code":1524,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def wordBreak(self, s, wordDict):\n        dp = [False] * (len(s) + 1)\n        dp[0] = True\n        for j in range(1, len(s) + 1):\n            for word in wordDict:\n                if j >= len(word):\n                    dp[j] = dp[j] or (dp[j - len(word)]) and word == s[j - len(word):j] \n        return dp[len(s)]\n        \"\"\"\n        :type s: str\n        :type wordDict: List[str]\n        :rtype: bool\n        \"\"\"\n\n",[17,1526,1527,1531,1535,1540,1545,1550,1555,1560,1565,1570,1575,1579,1583,1588,1593],{"__ignoreMap":119},[78,1528,1529],{"class":124,"line":125},[78,1530,129],{"emptyLinePlaceholder":128},[78,1532,1533],{"class":124,"line":132},[78,1534,135],{},[78,1536,1537],{"class":124,"line":138},[78,1538,1539],{},"    def wordBreak(self, s, wordDict):\n",[78,1541,1542],{"class":124,"line":144},[78,1543,1544],{},"        dp = [False] * (len(s) + 1)\n",[78,1546,1547],{"class":124,"line":150},[78,1548,1549],{},"        dp[0] = True\n",[78,1551,1552],{"class":124,"line":156},[78,1553,1554],{},"        for j in range(1, len(s) + 1):\n",[78,1556,1557],{"class":124,"line":162},[78,1558,1559],{},"            for word in wordDict:\n",[78,1561,1562],{"class":124,"line":168},[78,1563,1564],{},"                if j >= len(word):\n",[78,1566,1567],{"class":124,"line":174},[78,1568,1569],{},"                    dp[j] = dp[j] or (dp[j - len(word)]) and word == s[j - len(word):j] \n",[78,1571,1572],{"class":124,"line":180},[78,1573,1574],{},"        return dp[len(s)]\n",[78,1576,1577],{"class":124,"line":186},[78,1578,207],{},[78,1580,1581],{"class":124,"line":192},[78,1582,360],{},[78,1584,1585],{"class":124,"line":198},[78,1586,1587],{},"        :type wordDict: List[str]\n",[78,1589,1590],{"class":124,"line":204},[78,1591,1592],{},"        :rtype: bool\n",[78,1594,1595],{"class":124,"line":210},[78,1596,207],{},[226,1598,228],{},{"title":119,"searchDepth":144,"depth":144,"links":1600},[1601],{"id":109,"depth":132,"text":109},"数组 哈希表 字符串 动态规划","2026-02-22","给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。",{},"\u002Flegacy-blog\u002F1771724706431",{"title":1402,"description":1604},"legacy-blog\u002F1771724706431",[246,248,449,450,249],"HMSMKz1KPQtjRjQdfUCvquV5gwynUefYvUASaOflmRk",{"id":1612,"title":1613,"assetBase":7,"author":8,"body":1614,"category":1812,"collection":233,"date":1603,"description":1813,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":1814,"navigation":128,"originalPath":239,"path":1815,"seo":1816,"source":243,"stem":1817,"tags":1818,"weight":250,"__hash__":1820},"content\u002Flegacy-blog\u002F1771726036363.md","300. 最长递增子序列",{"type":10,"value":1615,"toc":1809},[1616,1621,1635,1639,1659,1663,1675,1679,1691,1695,1707,1712,1721,1723,1725,1807],[13,1617,1202,1618,1620],{},[17,1619,28],{}," ，找到其中最长严格递增子序列的长度。",[13,1622,1623,1626,1627,1630,1631,1634],{},[22,1624,1625],{},"子序列"," 是由数组派生而来的序列，删除（或不删除）数组中的元素而不改变其余元素的顺序。例如，",[17,1628,1629],{},"[3,6,2,7]"," 是数组 ",[17,1632,1633],{},"[0,3,1,6,2,2,7]"," 的子序列。",[13,1636,1637],{},[22,1638,293],{},[72,1640,1641],{},[13,1642,1643,1645,1646,1649,1651,1652,1654,1655,1658],{},[22,1644,1040],{}," nums = ",[78,1647,1648],{},"10,9,2,5,3,7,101,18",[22,1650,1047],{}," 4\n",[22,1653,1051],{}," 最长递增子序列是 ",[78,1656,1657],{},"2,3,7,101","，因此长度为 4 。",[13,1660,1661],{},[22,1662,306],{},[72,1664,1665],{},[13,1666,1667,1645,1669,1672,1674],{},[22,1668,1040],{},[78,1670,1671],{},"0,1,0,3,2,3",[22,1673,1047],{}," 4",[13,1676,1677],{},[22,1678,1265],{},[72,1680,1681],{},[13,1682,1683,1645,1685,1688,1690],{},[22,1684,1040],{},[78,1686,1687],{},"7,7,7,7,7,7,7",[22,1689,1047],{}," 1",[13,1692,1693],{},[22,1694,317],{},[49,1696,1697,1702],{},[52,1698,1699],{},[17,1700,1701],{},"1 \u003C= nums.length \u003C= 2500",[52,1703,1704],{},[17,1705,1706],{},"-104 \u003C= nums[i] \u003C= 104",[13,1708,1709],{},[22,1710,1711],{},"进阶：",[49,1713,1714],{},[52,1715,1716,1717,1720],{},"你能将算法的时间复杂度降低到 ",[17,1718,1719],{},"O(n log(n))"," 吗?",[107,1722,109],{"id":109},[13,1724,112],{},[114,1726,1728],{"className":116,"code":1727,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def lengthOfLIS(self, nums):\n        if not nums:\n            return 0\n        dp = []\n        for i in range(len(nums)):\n            dp.append(1)\n            for j in range(i):\n                if nums[i] > nums[j]:\n                    dp[i] = max(dp[i], dp[j] + 1)\n        return max(dp)\n                \n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,1729,1730,1734,1738,1743,1747,1751,1756,1761,1766,1771,1776,1781,1786,1791,1795,1799,1803],{"__ignoreMap":119},[78,1731,1732],{"class":124,"line":125},[78,1733,129],{"emptyLinePlaceholder":128},[78,1735,1736],{"class":124,"line":132},[78,1737,135],{},[78,1739,1740],{"class":124,"line":138},[78,1741,1742],{},"    def lengthOfLIS(self, nums):\n",[78,1744,1745],{"class":124,"line":144},[78,1746,906],{},[78,1748,1749],{"class":124,"line":150},[78,1750,911],{},[78,1752,1753],{"class":124,"line":156},[78,1754,1755],{},"        dp = []\n",[78,1757,1758],{"class":124,"line":162},[78,1759,1760],{},"        for i in range(len(nums)):\n",[78,1762,1763],{"class":124,"line":168},[78,1764,1765],{},"            dp.append(1)\n",[78,1767,1768],{"class":124,"line":174},[78,1769,1770],{},"            for j in range(i):\n",[78,1772,1773],{"class":124,"line":180},[78,1774,1775],{},"                if nums[i] > nums[j]:\n",[78,1777,1778],{"class":124,"line":186},[78,1779,1780],{},"                    dp[i] = max(dp[i], dp[j] + 1)\n",[78,1782,1783],{"class":124,"line":192},[78,1784,1785],{},"        return max(dp)\n",[78,1787,1788],{"class":124,"line":198},[78,1789,1790],{},"                \n",[78,1792,1793],{"class":124,"line":204},[78,1794,207],{},[78,1796,1797],{"class":124,"line":210},[78,1798,213],{},[78,1800,1801],{"class":124,"line":216},[78,1802,219],{},[78,1804,1805],{"class":124,"line":222},[78,1806,207],{},[226,1808,228],{},{"title":119,"searchDepth":144,"depth":144,"links":1810},[1811],{"id":109,"depth":132,"text":109},"数组 二分查找 动态规划","给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。",{},"\u002Flegacy-blog\u002F1771726036363",{"title":1613,"description":1813},"legacy-blog\u002F1771726036363",[246,248,1819,249],"二分查找","C112H7MRO0MNGUVWwHOTAt9Ib7MVs0Xa1-e5whAKpes",{"id":1822,"title":1823,"assetBase":7,"author":8,"body":1824,"category":748,"collection":233,"date":1603,"description":2020,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":2021,"navigation":128,"originalPath":239,"path":2022,"seo":2023,"source":243,"stem":2024,"tags":2025,"weight":250,"__hash__":2026},"content\u002Flegacy-blog\u002F1771726986990.md","152. 乘积最大子数组",{"type":10,"value":1825,"toc":2017},[1826,1831,1838,1844,1848,1869,1873,1892,1896,1920,1922,1924,2015],[13,1827,1202,1828,1830],{},[17,1829,28],{}," ，请你找出数组中乘积最大的非空连续 子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。",[13,1832,1833,1834,1837],{},"测试用例的答案是一个 ",[22,1835,1836],{},"32-位"," 整数。",[13,1839,1840,1843],{},[22,1841,1842],{},"请注意","，一个只包含一个元素的数组的乘积是这个元素的值。",[13,1845,1846],{},[22,1847,70],{},[72,1849,1850],{},[13,1851,1852,1645,1854,1857,1052,1859,1862,1864,1865,1868],{},[22,1853,1433],{},[78,1855,1856],{},"2,3,-2,4",[22,1858,1440],{},[17,1860,1861],{},"6",[22,1863,1444],{}," 子数组 ",[78,1866,1867],{},"2,3"," 有最大乘积 6。",[13,1870,1871],{},[22,1872,635],{},[72,1874,1875],{},[13,1876,1877,1645,1879,1882,1884,1885,1887,1888,1891],{},[22,1878,1433],{},[78,1880,1881],{},"-2,0,-1",[22,1883,1440],{}," 0\n",[22,1886,1444],{}," 结果不能为 2, 因为 ",[78,1889,1890],{},"-2,-1"," 不是子数组。",[13,1893,1894],{},[22,1895,88],{},[49,1897,1898,1903,1908],{},[52,1899,1900],{},[17,1901,1902],{},"1 \u003C= nums.length \u003C= 2 * 104",[52,1904,1905],{},[17,1906,1907],{},"-10 \u003C= nums[i] \u003C= 10",[52,1909,1910,1912,1913,1916,1917,1919],{},[17,1911,28],{}," 的任何子数组的乘积都 ",[22,1914,1915],{},"保证"," 是一个 ",[22,1918,1836],{}," 整数",[107,1921,109],{"id":109},[13,1923,112],{},[114,1925,1927],{"className":116,"code":1926,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def maxProduct(self, nums):\n        if not nums:\n            return 0\n        current_max = current_min = global_max = nums[0]\n        \n        # 从第二个元素开始遍历\n        for num in nums[1:]:\n            # 因为当前数可能是负数，乘以前面的最小值可能变成最大值，所以先保存当前max\n            temp = current_max\n            current_max = max(num, temp * num, current_min * num)\n            current_min = min(num, temp * num, current_min * num)\n            global_max = max(global_max, current_max)\n        return global_max\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,1928,1929,1933,1937,1942,1946,1950,1955,1959,1964,1969,1974,1979,1984,1989,1994,1999,2003,2007,2011],{"__ignoreMap":119},[78,1930,1931],{"class":124,"line":125},[78,1932,129],{"emptyLinePlaceholder":128},[78,1934,1935],{"class":124,"line":132},[78,1936,135],{},[78,1938,1939],{"class":124,"line":138},[78,1940,1941],{},"    def maxProduct(self, nums):\n",[78,1943,1944],{"class":124,"line":144},[78,1945,906],{},[78,1947,1948],{"class":124,"line":150},[78,1949,911],{},[78,1951,1952],{"class":124,"line":156},[78,1953,1954],{},"        current_max = current_min = global_max = nums[0]\n",[78,1956,1957],{"class":124,"line":162},[78,1958,1359],{},[78,1960,1961],{"class":124,"line":168},[78,1962,1963],{},"        # 从第二个元素开始遍历\n",[78,1965,1966],{"class":124,"line":174},[78,1967,1968],{},"        for num in nums[1:]:\n",[78,1970,1971],{"class":124,"line":180},[78,1972,1973],{},"            # 因为当前数可能是负数，乘以前面的最小值可能变成最大值，所以先保存当前max\n",[78,1975,1976],{"class":124,"line":186},[78,1977,1978],{},"            temp = current_max\n",[78,1980,1981],{"class":124,"line":192},[78,1982,1983],{},"            current_max = max(num, temp * num, current_min * num)\n",[78,1985,1986],{"class":124,"line":198},[78,1987,1988],{},"            current_min = min(num, temp * num, current_min * num)\n",[78,1990,1991],{"class":124,"line":204},[78,1992,1993],{},"            global_max = max(global_max, current_max)\n",[78,1995,1996],{"class":124,"line":210},[78,1997,1998],{},"        return global_max\n",[78,2000,2001],{"class":124,"line":216},[78,2002,207],{},[78,2004,2005],{"class":124,"line":222},[78,2006,213],{},[78,2008,2009],{"class":124,"line":421},[78,2010,219],{},[78,2012,2013],{"class":124,"line":427},[78,2014,207],{},[226,2016,228],{},{"title":119,"searchDepth":144,"depth":144,"links":2018},[2019],{"id":109,"depth":132,"text":109},"给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续 子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。",{},"\u002Flegacy-blog\u002F1771726986990",{"title":1823,"description":2020},"legacy-blog\u002F1771726986990",[246,248,249],"P2sGjBzeBbcQQgk3Z893zjihk8d57gVyToM6OinR7_Y",{"id":2028,"title":2029,"assetBase":7,"author":8,"body":2030,"category":2228,"collection":233,"date":2229,"description":2230,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":2231,"navigation":128,"originalPath":239,"path":2232,"seo":2233,"source":243,"stem":2234,"tags":2235,"weight":250,"__hash__":2237},"content\u002Flegacy-blog\u002F1771836991106.md","64. 最小路径和",{"type":10,"value":2031,"toc":2225},[2032,2043,2049,2056,2077,2081,2094,2098,2120,2122,2124,2223],[13,2033,2034,2035,2038,2039,2042],{},"给定一个包含非负整数的 ",[17,2036,2037],{},"m x n"," 网格 ",[17,2040,2041],{},"grid"," ，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。",[13,2044,2045,2048],{},[22,2046,2047],{},"说明："," 每次只能向下或者向右移动一步。",[13,2050,2051,2053],{},[22,2052,293],{},[617,2054],{"alt":619,"src":2055},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177183704794361.png",[72,2057,2058],{},[13,2059,2060,2062,2063,2066,2067,2070,2071,2073,2074,2076],{},[22,2061,1040],{}," grid = [[1,3,1],",[78,2064,2065],{},"1,5,1",",",[78,2068,2069],{},"4,2,1","]\n",[22,2072,1047],{}," 7\n",[22,2075,1051],{}," 因为路径 1→3→1→1→1 的总和最小。",[13,2078,2079],{},[22,2080,306],{},[72,2082,2083],{},[13,2084,2085,2087,2088,2070,2091,2093],{},[22,2086,1040],{}," grid = [[1,2,3],",[78,2089,2090],{},"4,5,6",[22,2092,1047],{}," 12",[13,2095,2096],{},[22,2097,317],{},[49,2099,2100,2105,2110,2115],{},[52,2101,2102],{},[17,2103,2104],{},"m == grid.length",[52,2106,2107],{},[17,2108,2109],{},"n == grid[i].length",[52,2111,2112],{},[17,2113,2114],{},"1 \u003C= m, n \u003C= 200",[52,2116,2117],{},[17,2118,2119],{},"0 \u003C= grid[i][j] \u003C= 200",[107,2121,109],{"id":109},[13,2123,112],{},[114,2125,2127],{"className":116,"code":2126,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def minPathSum(self, grid):\n        # dp[i][j] += min(dp[i-1][j], dp[i][j - 1])\n        if not grid or not grid[0]:\n            return 0\n        m = len(grid)\n        n = len(grid[0])\n        for i in range(1, m): # 第一步：初始化第一列（只能从上到下走）\n            grid[i][0] += grid[i-1][0]\n        for j in range(1, n):# 第二步：初始化第一行（只能从左到右走）\n            grid[0][j] += grid[0][j-1]\n        for i in range(1, m):\n            for j in range(1, n):\n                grid[i][j] += min(grid[i-1][j], grid[i][j-1])\n        return grid[-1][-1]\n        \"\"\"\n        :type grid: List[List[int]]\n        :rtype: int\n        \"\"\"\n\n",[17,2128,2129,2133,2137,2142,2147,2152,2156,2161,2166,2171,2176,2181,2186,2191,2196,2201,2206,2210,2215,2219],{"__ignoreMap":119},[78,2130,2131],{"class":124,"line":125},[78,2132,129],{"emptyLinePlaceholder":128},[78,2134,2135],{"class":124,"line":132},[78,2136,135],{},[78,2138,2139],{"class":124,"line":138},[78,2140,2141],{},"    def minPathSum(self, grid):\n",[78,2143,2144],{"class":124,"line":144},[78,2145,2146],{},"        # dp[i][j] += min(dp[i-1][j], dp[i][j - 1])\n",[78,2148,2149],{"class":124,"line":150},[78,2150,2151],{},"        if not grid or not grid[0]:\n",[78,2153,2154],{"class":124,"line":156},[78,2155,911],{},[78,2157,2158],{"class":124,"line":162},[78,2159,2160],{},"        m = len(grid)\n",[78,2162,2163],{"class":124,"line":168},[78,2164,2165],{},"        n = len(grid[0])\n",[78,2167,2168],{"class":124,"line":174},[78,2169,2170],{},"        for i in range(1, m): # 第一步：初始化第一列（只能从上到下走）\n",[78,2172,2173],{"class":124,"line":180},[78,2174,2175],{},"            grid[i][0] += grid[i-1][0]\n",[78,2177,2178],{"class":124,"line":186},[78,2179,2180],{},"        for j in range(1, n):# 第二步：初始化第一行（只能从左到右走）\n",[78,2182,2183],{"class":124,"line":192},[78,2184,2185],{},"            grid[0][j] += grid[0][j-1]\n",[78,2187,2188],{"class":124,"line":198},[78,2189,2190],{},"        for i in range(1, m):\n",[78,2192,2193],{"class":124,"line":204},[78,2194,2195],{},"            for j in range(1, n):\n",[78,2197,2198],{"class":124,"line":210},[78,2199,2200],{},"                grid[i][j] += min(grid[i-1][j], grid[i][j-1])\n",[78,2202,2203],{"class":124,"line":216},[78,2204,2205],{},"        return grid[-1][-1]\n",[78,2207,2208],{"class":124,"line":222},[78,2209,207],{},[78,2211,2212],{"class":124,"line":421},[78,2213,2214],{},"        :type grid: List[List[int]]\n",[78,2216,2217],{"class":124,"line":427},[78,2218,219],{},[78,2220,2221],{"class":124,"line":433},[78,2222,207],{},[226,2224,228],{},{"title":119,"searchDepth":144,"depth":144,"links":2226},[2227],{"id":109,"depth":132,"text":109},"数组 动态规划 矩阵","2026-02-23","给定一个包含非负整数的 m x n 网格 grid ，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。",{},"\u002Flegacy-blog\u002F1771836991106",{"title":2029,"description":2230},"legacy-blog\u002F1771836991106",[246,248,249,2236],"矩阵","0Wd_PAmNDPLzf1R-fY8FAKA4GXkxg24eNAZFmd-EoM4",{"id":2239,"title":2240,"assetBase":7,"author":8,"body":2241,"category":2478,"collection":233,"date":2229,"description":2479,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":2480,"navigation":128,"originalPath":239,"path":2481,"seo":2482,"source":243,"stem":2483,"tags":2484,"weight":250,"__hash__":2485},"content\u002Flegacy-blog\u002F1771837165647.md","62. 不同路径",{"type":10,"value":2242,"toc":2475},[2243,2249,2252,2255,2268,2272,2296,2300,2309,2314,2324,2328,2341,2343,2345,2473],[13,2244,2245,2246,2248],{},"一个机器人位于一个 ",[17,2247,2037],{}," 网格的左上角 （起始点在下图中标记为 “Start” ）。",[13,2250,2251],{},"机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角（在下图中标记为 “Finish” ）。",[13,2253,2254],{},"问总共有多少条不同的路径？",[13,2256,2257,2259,2262,2264,2265,2267],{},[22,2258,293],{},[617,2260],{"alt":619,"src":2261},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177183720787323.png",[22,2263,1040],{}," m = 3, n = 7\n",[22,2266,1047],{}," 28",[13,2269,2270],{},[22,2271,306],{},[72,2273,2274,2284],{},[13,2275,2276,2278,2279,1048,2281,2283],{},[22,2277,1040],{}," m = 3, n = 2\n",[22,2280,1047],{},[22,2282,1051],{},"\n从左上角开始，总共有 3 条路径可以到达右下角。",[2285,2286,2287,2290,2293],"ol",{},[52,2288,2289],{},"向右 -> 向下 -> 向下",[52,2291,2292],{},"向下 -> 向下 -> 向右",[52,2294,2295],{},"向下 -> 向右 -> 向下",[13,2297,2298],{},[22,2299,1265],{},[72,2301,2302],{},[13,2303,2304,2306,2307,2267],{},[22,2305,1040],{}," m = 7, n = 3\n",[22,2308,1047],{},[13,2310,2311],{},[22,2312,2313],{},"示例 4：",[72,2315,2316],{},[13,2317,2318,2320,2321,2323],{},[22,2319,1040],{}," m = 3, n = 3\n",[22,2322,1047],{}," 6",[13,2325,2326],{},[22,2327,317],{},[49,2329,2330,2335],{},[52,2331,2332],{},[17,2333,2334],{},"1 \u003C= m, n \u003C= 100",[52,2336,2337,2338],{},"题目数据保证答案小于等于 ",[17,2339,2340],{},"2 * 109",[107,2342,109],{"id":109},[13,2344,112],{},[114,2346,2348],{"className":116,"code":2347,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def uniquePaths(self, m, n):\n        # dp[i][j]可以由dp[i-1][j]向下或dp[i][j-1]向右到达\n        # 所以dp[i][j] = dp[i-1][j] + dp[i][j-1]\n        dp = [[1] * n for _ in range(m)]\n        for i in range(1, m):\n            for j in range(1, n):\n                dp[i][j] = dp[i-1][j] + dp[i][j-1]\n        return dp[-1][-1]\n        \"\"\"\n        :type m: int\n        :type n: int\n        :rtype: int\n        # 优化版本\n        dp = [1] * n\n        \n        # 遍历每一行（从第二行开始）\n        for i in range(1, m):\n            # 遍历每一列（从第二列开始）\n            for j in range(1, n):\n                # 核心优化：dp[j] = 上一行的dp[j]（原dp[j]） + 左边的dp[j-1]（已更新的当前行）\n                dp[j] = dp[j] + dp[j-1]\n        \n        return dp[-1]\n        \"\"\"\n\n",[17,2349,2350,2354,2358,2363,2368,2373,2378,2382,2386,2391,2396,2400,2405,2409,2413,2418,2423,2427,2432,2436,2441,2446,2452,2458,2463,2468],{"__ignoreMap":119},[78,2351,2352],{"class":124,"line":125},[78,2353,129],{"emptyLinePlaceholder":128},[78,2355,2356],{"class":124,"line":132},[78,2357,135],{},[78,2359,2360],{"class":124,"line":138},[78,2361,2362],{},"    def uniquePaths(self, m, n):\n",[78,2364,2365],{"class":124,"line":144},[78,2366,2367],{},"        # dp[i][j]可以由dp[i-1][j]向下或dp[i][j-1]向右到达\n",[78,2369,2370],{"class":124,"line":150},[78,2371,2372],{},"        # 所以dp[i][j] = dp[i-1][j] + dp[i][j-1]\n",[78,2374,2375],{"class":124,"line":156},[78,2376,2377],{},"        dp = [[1] * n for _ in range(m)]\n",[78,2379,2380],{"class":124,"line":162},[78,2381,2190],{},[78,2383,2384],{"class":124,"line":168},[78,2385,2195],{},[78,2387,2388],{"class":124,"line":174},[78,2389,2390],{},"                dp[i][j] = dp[i-1][j] + dp[i][j-1]\n",[78,2392,2393],{"class":124,"line":180},[78,2394,2395],{},"        return dp[-1][-1]\n",[78,2397,2398],{"class":124,"line":186},[78,2399,207],{},[78,2401,2402],{"class":124,"line":192},[78,2403,2404],{},"        :type m: int\n",[78,2406,2407],{"class":124,"line":198},[78,2408,535],{},[78,2410,2411],{"class":124,"line":204},[78,2412,219],{},[78,2414,2415],{"class":124,"line":210},[78,2416,2417],{},"        # 优化版本\n",[78,2419,2420],{"class":124,"line":216},[78,2421,2422],{},"        dp = [1] * n\n",[78,2424,2425],{"class":124,"line":222},[78,2426,1359],{},[78,2428,2429],{"class":124,"line":421},[78,2430,2431],{},"        # 遍历每一行（从第二行开始）\n",[78,2433,2434],{"class":124,"line":427},[78,2435,2190],{},[78,2437,2438],{"class":124,"line":433},[78,2439,2440],{},"            # 遍历每一列（从第二列开始）\n",[78,2442,2444],{"class":124,"line":2443},21,[78,2445,2195],{},[78,2447,2449],{"class":124,"line":2448},22,[78,2450,2451],{},"                # 核心优化：dp[j] = 上一行的dp[j]（原dp[j]） + 左边的dp[j-1]（已更新的当前行）\n",[78,2453,2455],{"class":124,"line":2454},23,[78,2456,2457],{},"                dp[j] = dp[j] + dp[j-1]\n",[78,2459,2461],{"class":124,"line":2460},24,[78,2462,1359],{},[78,2464,2466],{"class":124,"line":2465},25,[78,2467,1163],{},[78,2469,2471],{"class":124,"line":2470},26,[78,2472,207],{},[226,2474,228],{},{"title":119,"searchDepth":144,"depth":144,"links":2476},[2477],{"id":109,"depth":132,"text":109},"数学 动态规划","一个机器人位于一个 m x n 网格的左上角 （起始点在下图中标记为 “Start” ）。",{},"\u002Flegacy-blog\u002F1771837165647",{"title":2240,"description":2479},"legacy-blog\u002F1771837165647",[246,1193,249],"gT5TBWEvl34KYUHOxQAxnQQ3Q072V9MI4ituHaiwSzM",{"id":2487,"title":2488,"assetBase":7,"author":8,"body":2489,"category":748,"collection":233,"date":2229,"description":2686,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":2687,"navigation":128,"originalPath":239,"path":2688,"seo":2689,"source":243,"stem":2690,"tags":2691,"weight":250,"__hash__":2692},"content\u002Flegacy-blog\u002F1771837303006.md","416. 分割等和子集",{"type":10,"value":2490,"toc":2683},[2491,2504,2508,2527,2531,2546,2550,2562,2564,2566,2681],[13,2492,2493,2494,20,2497,2500,2501,2503],{},"给你一个 ",[22,2495,2496],{},"只包含正整数",[22,2498,2499],{},"非空"," 数组 ",[17,2502,28],{}," 。请你判断是否可以将这个数组分割成两个子集，使得两个子集的元素和相等。",[13,2505,2506],{},[22,2507,293],{},[72,2509,2510],{},[13,2511,2512,1645,2514,2517,1441,2519,2521,2522,1018,2525,285],{},[22,2513,1040],{},[78,2515,2516],{},"1,5,11,5",[22,2518,1047],{},[22,2520,1051],{}," 数组可以分割成 ",[78,2523,2524],{},"1, 5, 5",[78,2526,1028],{},[13,2528,2529],{},[22,2530,306],{},[72,2532,2533],{},[13,2534,2535,1645,2537,2540,2542,2543,2545],{},[22,2536,1040],{},[78,2538,2539],{},"1,2,3,5",[22,2541,1047],{}," false\n",[22,2544,1051],{}," 数组不能分割成两个元素和相等的子集。",[13,2547,2548],{},[22,2549,317],{},[49,2551,2552,2557],{},[52,2553,2554],{},[17,2555,2556],{},"1 \u003C= nums.length \u003C= 200",[52,2558,2559],{},[17,2560,2561],{},"1 \u003C= nums[i] \u003C= 100",[107,2563,109],{"id":109},[13,2565,112],{},[114,2567,2569],{"className":116,"code":2568,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def canPartition(self, nums):\n        # 总数除二，变成能否取得等值序列\n        total_sum = sum(nums)\n        if total_sum % 2 != 0:\n            return False\n        target = total_sum \u002F\u002F 2\n\n        if target \u003C max(nums):  # 单个元素超过一半\n            return False\n        \n        dp = [False] * (target + 1)\n        dp[0] = True # 和为0一定存在（空集）\n        for num in nums:\n            for j in range(target, num - 1, -1):  # 逆序遍历\n                # 如果j-num能凑出，或者j本身已经凑出 \n                dp[j] = dp[j] or dp[j - num] \n\n        return dp[target]\n        \"\"\"\n        :type nums: List[int]\n        :rtype: bool\n        \"\"\"\n\n",[17,2570,2571,2575,2579,2584,2589,2594,2599,2604,2609,2613,2618,2622,2626,2631,2636,2641,2646,2651,2656,2660,2665,2669,2673,2677],{"__ignoreMap":119},[78,2572,2573],{"class":124,"line":125},[78,2574,129],{"emptyLinePlaceholder":128},[78,2576,2577],{"class":124,"line":132},[78,2578,135],{},[78,2580,2581],{"class":124,"line":138},[78,2582,2583],{},"    def canPartition(self, nums):\n",[78,2585,2586],{"class":124,"line":144},[78,2587,2588],{},"        # 总数除二，变成能否取得等值序列\n",[78,2590,2591],{"class":124,"line":150},[78,2592,2593],{},"        total_sum = sum(nums)\n",[78,2595,2596],{"class":124,"line":156},[78,2597,2598],{},"        if total_sum % 2 != 0:\n",[78,2600,2601],{"class":124,"line":162},[78,2602,2603],{},"            return False\n",[78,2605,2606],{"class":124,"line":168},[78,2607,2608],{},"        target = total_sum \u002F\u002F 2\n",[78,2610,2611],{"class":124,"line":174},[78,2612,129],{"emptyLinePlaceholder":128},[78,2614,2615],{"class":124,"line":180},[78,2616,2617],{},"        if target \u003C max(nums):  # 单个元素超过一半\n",[78,2619,2620],{"class":124,"line":186},[78,2621,2603],{},[78,2623,2624],{"class":124,"line":192},[78,2625,1359],{},[78,2627,2628],{"class":124,"line":198},[78,2629,2630],{},"        dp = [False] * (target + 1)\n",[78,2632,2633],{"class":124,"line":204},[78,2634,2635],{},"        dp[0] = True # 和为0一定存在（空集）\n",[78,2637,2638],{"class":124,"line":210},[78,2639,2640],{},"        for num in nums:\n",[78,2642,2643],{"class":124,"line":216},[78,2644,2645],{},"            for j in range(target, num - 1, -1):  # 逆序遍历\n",[78,2647,2648],{"class":124,"line":222},[78,2649,2650],{},"                # 如果j-num能凑出，或者j本身已经凑出 \n",[78,2652,2653],{"class":124,"line":421},[78,2654,2655],{},"                dp[j] = dp[j] or dp[j - num] \n",[78,2657,2658],{"class":124,"line":427},[78,2659,129],{"emptyLinePlaceholder":128},[78,2661,2662],{"class":124,"line":433},[78,2663,2664],{},"        return dp[target]\n",[78,2666,2667],{"class":124,"line":2443},[78,2668,207],{},[78,2670,2671],{"class":124,"line":2448},[78,2672,213],{},[78,2674,2675],{"class":124,"line":2454},[78,2676,1592],{},[78,2678,2679],{"class":124,"line":2460},[78,2680,207],{},[226,2682,228],{},{"title":119,"searchDepth":144,"depth":144,"links":2684},[2685],{"id":109,"depth":132,"text":109},"给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集，使得两个子集的元素和相等。",{},"\u002Flegacy-blog\u002F1771837303006",{"title":2488,"description":2686},"legacy-blog\u002F1771837303006",[246,248,249],"pfuhqS3g00T0WfTKlZnJ7TjLBqes0vNXvtHBeYhi4zM",{"id":2694,"title":2695,"assetBase":239,"author":8,"body":2696,"category":787,"collection":233,"date":2229,"description":2700,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":2703,"navigation":128,"originalPath":239,"path":2704,"seo":2705,"source":243,"stem":2706,"tags":2707,"weight":250,"__hash__":2709},"content\u002Flegacy-blog\u002F1771851417057.md","test",{"type":10,"value":2697,"toc":2701},[2698],[13,2699,2700],{},"hello",{"title":119,"searchDepth":144,"depth":144,"links":2702},[],{},"\u002Flegacy-blog\u002F1771851417057",{"title":2695,"description":2700},"legacy-blog\u002F1771851417057",[2708],"学习记录","F7gorBQlxUnbcaN_N4iVGy43wPwgoXEdeySTG1oeP60",{"id":2711,"title":2712,"assetBase":7,"author":8,"body":2713,"category":2917,"collection":233,"date":2918,"description":2919,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":2920,"navigation":128,"originalPath":239,"path":2921,"seo":2922,"source":243,"stem":2923,"tags":2924,"weight":250,"__hash__":2925},"content\u002Flegacy-blog\u002F1771900677329.md","5. 最长回文子串",{"type":10,"value":2714,"toc":2914},[2715,2723,2727,2740,2744,2754,2758,2770,2772,2774,2912],[13,2716,259,2717,2719,2720,2722],{},[17,2718,262],{},"，找到 ",[17,2721,262],{}," 中最长的回文子串。",[13,2724,2725],{},[22,2726,293],{},[72,2728,2729],{},[13,2730,2731,2733,2734,2736,2737,2739],{},[22,2732,1040],{}," s = \"babad\"\n",[22,2735,1047],{}," \"bab\"\n",[22,2738,1051],{}," \"aba\" 同样是符合题意的答案。",[13,2741,2742],{},[22,2743,306],{},[72,2745,2746],{},[13,2747,2748,2750,2751,2753],{},[22,2749,1040],{}," s = \"cbbd\"\n",[22,2752,1047],{}," \"bb\"",[13,2755,2756],{},[22,2757,317],{},[49,2759,2760,2765],{},[52,2761,2762],{},[17,2763,2764],{},"1 \u003C= s.length \u003C= 1000",[52,2766,2767,2769],{},[17,2768,262],{}," 仅由数字和英文字母组成",[107,2771,109],{"id":109},[13,2773,112],{},[114,2775,2777],{"className":116,"code":2776,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def longestPalindrome(self, s):\n        if len(s) \u003C 2:\n            return s\n        start = 0\n        max_len = 1\n\n        def expand(left, right):\n            while left >= 0 and right \u003C len(s) and s[left] == s[right]:\n                left -= 1\n                right += 1\n            return right - left - 1\n\n        for i in range(len(s)):\n            len1 = expand(i, i)  # 奇数回文\n            len2 = expand(i, i + 1)  # 偶数回文\n            current_max = max(len1, len2)\n            if current_max > max_len:\n                max_len = current_max\n                # 计算初始索引\n                start = i - (current_max - 1) \u002F\u002F 2\n\n        return s[start:start + max_len]\n        \"\"\"\n        :type s: str\n        :rtype: str\n        \"\"\"\n\n",[17,2778,2779,2783,2787,2792,2797,2802,2807,2812,2816,2821,2826,2831,2836,2841,2845,2849,2854,2859,2864,2869,2874,2879,2884,2888,2893,2897,2901,2907],{"__ignoreMap":119},[78,2780,2781],{"class":124,"line":125},[78,2782,129],{"emptyLinePlaceholder":128},[78,2784,2785],{"class":124,"line":132},[78,2786,135],{},[78,2788,2789],{"class":124,"line":138},[78,2790,2791],{},"    def longestPalindrome(self, s):\n",[78,2793,2794],{"class":124,"line":144},[78,2795,2796],{},"        if len(s) \u003C 2:\n",[78,2798,2799],{"class":124,"line":150},[78,2800,2801],{},"            return s\n",[78,2803,2804],{"class":124,"line":156},[78,2805,2806],{},"        start = 0\n",[78,2808,2809],{"class":124,"line":162},[78,2810,2811],{},"        max_len = 1\n",[78,2813,2814],{"class":124,"line":168},[78,2815,129],{"emptyLinePlaceholder":128},[78,2817,2818],{"class":124,"line":174},[78,2819,2820],{},"        def expand(left, right):\n",[78,2822,2823],{"class":124,"line":180},[78,2824,2825],{},"            while left >= 0 and right \u003C len(s) and s[left] == s[right]:\n",[78,2827,2828],{"class":124,"line":186},[78,2829,2830],{},"                left -= 1\n",[78,2832,2833],{"class":124,"line":192},[78,2834,2835],{},"                right += 1\n",[78,2837,2838],{"class":124,"line":198},[78,2839,2840],{},"            return right - left - 1\n",[78,2842,2843],{"class":124,"line":204},[78,2844,129],{"emptyLinePlaceholder":128},[78,2846,2847],{"class":124,"line":210},[78,2848,384],{},[78,2850,2851],{"class":124,"line":216},[78,2852,2853],{},"            len1 = expand(i, i)  # 奇数回文\n",[78,2855,2856],{"class":124,"line":222},[78,2857,2858],{},"            len2 = expand(i, i + 1)  # 偶数回文\n",[78,2860,2861],{"class":124,"line":421},[78,2862,2863],{},"            current_max = max(len1, len2)\n",[78,2865,2866],{"class":124,"line":427},[78,2867,2868],{},"            if current_max > max_len:\n",[78,2870,2871],{"class":124,"line":433},[78,2872,2873],{},"                max_len = current_max\n",[78,2875,2876],{"class":124,"line":2443},[78,2877,2878],{},"                # 计算初始索引\n",[78,2880,2881],{"class":124,"line":2448},[78,2882,2883],{},"                start = i - (current_max - 1) \u002F\u002F 2\n",[78,2885,2886],{"class":124,"line":2454},[78,2887,129],{"emptyLinePlaceholder":128},[78,2889,2890],{"class":124,"line":2460},[78,2891,2892],{},"        return s[start:start + max_len]\n",[78,2894,2895],{"class":124,"line":2465},[78,2896,207],{},[78,2898,2899],{"class":124,"line":2470},[78,2900,360],{},[78,2902,2904],{"class":124,"line":2903},27,[78,2905,2906],{},"        :rtype: str\n",[78,2908,2910],{"class":124,"line":2909},28,[78,2911,207],{},[226,2913,228],{},{"title":119,"searchDepth":144,"depth":144,"links":2915},[2916],{"id":109,"depth":132,"text":109},"双指针 字符串 动态规划","2026-02-24","给你一个字符串 s，找到 s 中最长的回文子串。",{},"\u002Flegacy-blog\u002F1771900677329",{"title":2712,"description":2919},"legacy-blog\u002F1771900677329",[246,451,450,249],"7a8DM9hhYgzzI_4w4-q0voUBOz8EIaMTs6AfQFKXGpc",{"id":2927,"title":2928,"assetBase":7,"author":8,"body":2929,"category":3157,"collection":233,"date":2918,"description":3158,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":3159,"navigation":128,"originalPath":239,"path":3160,"seo":3161,"source":243,"stem":3162,"tags":3163,"weight":250,"__hash__":3164},"content\u002Flegacy-blog\u002F1771900767313.md","1143. 最长公共子序列",{"type":10,"value":2930,"toc":3154},[2931,2950,2956,2975,2981,2985,3001,3005,3017,3021,3033,3037,3051,3053,3055,3152],[13,2932,2933,2934,1018,2937,2940,2941,2944,2945,996,2947,285],{},"给定两个字符串 ",[17,2935,2936],{},"text1",[17,2938,2939],{},"text2","，返回这两个字符串的最长 ",[22,2942,2943],{},"公共子序列"," 的长度。如果不存在 ",[22,2946,2943],{},[17,2948,2949],{},"0",[13,2951,2952,2953,2955],{},"一个字符串的 ",[22,2954,1625],{}," 是指这样一个新的字符串：它是由原字符串在不改变字符的相对顺序的情况下删除某些字符（也可以不删除任何字符）后组成的新字符串。",[49,2957,2958],{},[52,2959,2960,2961,2964,2965,2968,2969,2972,2973,1634],{},"例如，",[17,2962,2963],{},"\"ace\""," 是 ",[17,2966,2967],{},"\"abcde\""," 的子序列，但 ",[17,2970,2971],{},"\"aec\""," 不是 ",[17,2974,2967],{},[13,2976,2977,2978,2980],{},"两个字符串的 ",[22,2979,2943],{}," 是这两个字符串所共同拥有的子序列。",[13,2982,2983],{},[22,2984,293],{},[72,2986,2987],{},[13,2988,2989,2991,2992,2994,2995,2998,3000],{},[22,2990,1040],{}," text1 = \"abcde\", text2 = \"ace\"\n",[22,2993,1047],{}," 3",[2996,2997],"br",{},[22,2999,1051],{}," 最长公共子序列是 \"ace\" ，它的长度为 3 。",[13,3002,3003],{},[22,3004,306],{},[72,3006,3007],{},[13,3008,3009,3011,3012,1048,3014,3016],{},[22,3010,1040],{}," text1 = \"abc\", text2 = \"abc\"\n",[22,3013,1047],{},[22,3015,1051],{}," 最长公共子序列是 \"abc\" ，它的长度为 3 。",[13,3018,3019],{},[22,3020,1265],{},[72,3022,3023],{},[13,3024,3025,3027,3028,1884,3030,3032],{},[22,3026,1040],{}," text1 = \"abc\", text2 = \"def\"\n",[22,3029,1047],{},[22,3031,1051],{}," 两个字符串没有公共子序列，返回 0 。",[13,3034,3035],{},[22,3036,317],{},[49,3038,3039,3044],{},[52,3040,3041],{},[17,3042,3043],{},"1 \u003C= text1.length, text2.length \u003C= 1000",[52,3045,3046,1018,3048,3050],{},[17,3047,2936],{},[17,3049,2939],{}," 仅由小写英文字符组成。",[107,3052,109],{"id":109},[13,3054,112],{},[114,3056,3058],{"className":116,"code":3057,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def longestCommonSubsequence(self, text1, text2):\n        m, n = len(text1), len(text2)\n        dp = [[0] * (n + 1) for _ in range(m + 1)]\n\n        for i in range(1, m + 1):\n            for j in range(1, n + 1):\n                if text1[i - 1] == text2[j - 1]:\n                    dp[i][j] = dp[i - 1][j - 1] + 1\n                else:\n                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])\n        \n        return dp[m][n]\n        \n        \"\"\"\n        :type text1: str\n        :type text2: str\n        :rtype: int\n        \"\"\"\n\n",[17,3059,3060,3064,3068,3073,3078,3083,3087,3092,3097,3102,3107,3112,3117,3121,3126,3130,3134,3139,3144,3148],{"__ignoreMap":119},[78,3061,3062],{"class":124,"line":125},[78,3063,129],{"emptyLinePlaceholder":128},[78,3065,3066],{"class":124,"line":132},[78,3067,135],{},[78,3069,3070],{"class":124,"line":138},[78,3071,3072],{},"    def longestCommonSubsequence(self, text1, text2):\n",[78,3074,3075],{"class":124,"line":144},[78,3076,3077],{},"        m, n = len(text1), len(text2)\n",[78,3079,3080],{"class":124,"line":150},[78,3081,3082],{},"        dp = [[0] * (n + 1) for _ in range(m + 1)]\n",[78,3084,3085],{"class":124,"line":156},[78,3086,129],{"emptyLinePlaceholder":128},[78,3088,3089],{"class":124,"line":162},[78,3090,3091],{},"        for i in range(1, m + 1):\n",[78,3093,3094],{"class":124,"line":168},[78,3095,3096],{},"            for j in range(1, n + 1):\n",[78,3098,3099],{"class":124,"line":174},[78,3100,3101],{},"                if text1[i - 1] == text2[j - 1]:\n",[78,3103,3104],{"class":124,"line":180},[78,3105,3106],{},"                    dp[i][j] = dp[i - 1][j - 1] + 1\n",[78,3108,3109],{"class":124,"line":186},[78,3110,3111],{},"                else:\n",[78,3113,3114],{"class":124,"line":192},[78,3115,3116],{},"                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])\n",[78,3118,3119],{"class":124,"line":198},[78,3120,1359],{},[78,3122,3123],{"class":124,"line":204},[78,3124,3125],{},"        return dp[m][n]\n",[78,3127,3128],{"class":124,"line":210},[78,3129,1359],{},[78,3131,3132],{"class":124,"line":216},[78,3133,207],{},[78,3135,3136],{"class":124,"line":222},[78,3137,3138],{},"        :type text1: str\n",[78,3140,3141],{"class":124,"line":421},[78,3142,3143],{},"        :type text2: str\n",[78,3145,3146],{"class":124,"line":427},[78,3147,219],{},[78,3149,3150],{"class":124,"line":433},[78,3151,207],{},[226,3153,228],{},{"title":119,"searchDepth":144,"depth":144,"links":3155},[3156],{"id":109,"depth":132,"text":109},"字符串 动态规划","给定两个字符串 text1 和 text2，返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ，返回 0 。",{},"\u002Flegacy-blog\u002F1771900767313",{"title":2928,"description":3158},"legacy-blog\u002F1771900767313",[246,450,249],"vetAbpsSuBFaX-q_W9cPo6d5w_PEAy3_Hfie_Z3eR94",{"id":3166,"title":3167,"assetBase":7,"author":8,"body":3168,"category":3157,"collection":233,"date":2918,"description":3398,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":3399,"navigation":128,"originalPath":239,"path":3400,"seo":3401,"source":243,"stem":3402,"tags":3403,"weight":250,"__hash__":3404},"content\u002Flegacy-blog\u002F1771900874853.md","72. 编辑距离",{"type":10,"value":3169,"toc":3395},[3170,3190,3193,3204,3208,3220,3224,3237,3241,3255,3257,3259,3393],[13,3171,3172,3173,1018,3176,3179,3180,3189],{},"给你两个单词 ",[17,3174,3175],{},"word1",[17,3177,3178],{},"word2","， ",[596,3181,3182,3183,3185,3186,3188],{},"请返回将 ",[17,3184,3175],{}," 转换成 ",[17,3187,3178],{}," 所使用的最少操作数","  。",[13,3191,3192],{},"你可以对一个单词进行如下三种操作：",[49,3194,3195,3198,3201],{},[52,3196,3197],{},"插入一个字符",[52,3199,3200],{},"删除一个字符",[52,3202,3203],{},"替换一个字符",[13,3205,3206],{},[22,3207,293],{},[72,3209,3210],{},[13,3211,3212,3214,3215,1048,3217,3219],{},[22,3213,1040],{}," word1 = \"horse\", word2 = \"ros\"\n",[22,3216,1047],{},[22,3218,1051],{},"\nhorse -> rorse (将 'h' 替换为 'r')\nrorse -> rose (删除 'r')\nrose -> ros (删除 'e')",[13,3221,3222],{},[22,3223,306],{},[72,3225,3226],{},[13,3227,3228,3230,3231,3233,3234,3236],{},[22,3229,1040],{}," word1 = \"intention\", word2 = \"execution\"\n",[22,3232,1047],{}," 5\n",[22,3235,1051],{},"\nintention -> inention (删除 't')\ninention -> enention (将 'i' 替换为 'e')\nenention -> exention (将 'n' 替换为 'x')\nexention -> exection (将 'n' 替换为 'c')\nexection -> execution (插入 'u')",[13,3238,3239],{},[22,3240,317],{},[49,3242,3243,3248],{},[52,3244,3245],{},[17,3246,3247],{},"0 \u003C= word1.length, word2.length \u003C= 500",[52,3249,3250,1018,3252,3254],{},[17,3251,3175],{},[17,3253,3178],{}," 由小写英文字母组成",[107,3256,109],{"id":109},[13,3258,112],{},[114,3260,3262],{"className":116,"code":3261,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def minDistance(self, word1, word2):\n        m = len(word1)\n        n = len(word2)\n        if n * m == 0:\n            return n + m\n        dp = [[0] * (n + 1) for _ in range(m + 1)]\n\n        for i in range(m + 1):  # 边界初始化\n            dp[i][0] = i\n        for j in range(n + 1):\n            dp[0][j] = j\n        for i in range(1, m + 1):\n            for j in range(1, n + 1):\n                if word1[i - 1] != word2[j - 1]:\n                    dp[i - 1][j - 1] += 1\n                dp[i][j] = min(dp[i - 1][j] + 1,\n                               dp[i][j - 1] + 1,\n                               dp[i - 1][j - 1]\n                            )\n        \n        return dp[m][n]\n        \"\"\"\n        :type word1: str\n        :type word2: str\n        :rtype: int\n        \"\"\"\n\n",[17,3263,3264,3268,3272,3277,3282,3287,3292,3297,3301,3305,3310,3315,3320,3325,3329,3333,3338,3343,3348,3353,3358,3363,3367,3371,3375,3380,3385,3389],{"__ignoreMap":119},[78,3265,3266],{"class":124,"line":125},[78,3267,129],{"emptyLinePlaceholder":128},[78,3269,3270],{"class":124,"line":132},[78,3271,135],{},[78,3273,3274],{"class":124,"line":138},[78,3275,3276],{},"    def minDistance(self, word1, word2):\n",[78,3278,3279],{"class":124,"line":144},[78,3280,3281],{},"        m = len(word1)\n",[78,3283,3284],{"class":124,"line":150},[78,3285,3286],{},"        n = len(word2)\n",[78,3288,3289],{"class":124,"line":156},[78,3290,3291],{},"        if n * m == 0:\n",[78,3293,3294],{"class":124,"line":162},[78,3295,3296],{},"            return n + m\n",[78,3298,3299],{"class":124,"line":168},[78,3300,3082],{},[78,3302,3303],{"class":124,"line":174},[78,3304,129],{"emptyLinePlaceholder":128},[78,3306,3307],{"class":124,"line":180},[78,3308,3309],{},"        for i in range(m + 1):  # 边界初始化\n",[78,3311,3312],{"class":124,"line":186},[78,3313,3314],{},"            dp[i][0] = i\n",[78,3316,3317],{"class":124,"line":192},[78,3318,3319],{},"        for j in range(n + 1):\n",[78,3321,3322],{"class":124,"line":198},[78,3323,3324],{},"            dp[0][j] = j\n",[78,3326,3327],{"class":124,"line":204},[78,3328,3091],{},[78,3330,3331],{"class":124,"line":210},[78,3332,3096],{},[78,3334,3335],{"class":124,"line":216},[78,3336,3337],{},"                if word1[i - 1] != word2[j - 1]:\n",[78,3339,3340],{"class":124,"line":222},[78,3341,3342],{},"                    dp[i - 1][j - 1] += 1\n",[78,3344,3345],{"class":124,"line":421},[78,3346,3347],{},"                dp[i][j] = min(dp[i - 1][j] + 1,\n",[78,3349,3350],{"class":124,"line":427},[78,3351,3352],{},"                               dp[i][j - 1] + 1,\n",[78,3354,3355],{"class":124,"line":433},[78,3356,3357],{},"                               dp[i - 1][j - 1]\n",[78,3359,3360],{"class":124,"line":2443},[78,3361,3362],{},"                            )\n",[78,3364,3365],{"class":124,"line":2448},[78,3366,1359],{},[78,3368,3369],{"class":124,"line":2454},[78,3370,3125],{},[78,3372,3373],{"class":124,"line":2460},[78,3374,207],{},[78,3376,3377],{"class":124,"line":2465},[78,3378,3379],{},"        :type word1: str\n",[78,3381,3382],{"class":124,"line":2470},[78,3383,3384],{},"        :type word2: str\n",[78,3386,3387],{"class":124,"line":2903},[78,3388,219],{},[78,3390,3391],{"class":124,"line":2909},[78,3392,207],{},[226,3394,228],{},{"title":119,"searchDepth":144,"depth":144,"links":3396},[3397],{"id":109,"depth":132,"text":109},"给你两个单词 word1 和 word2， 请返回将 word1 转换成 word2 所使用的最少操作数  。",{},"\u002Flegacy-blog\u002F1771900874853",{"title":3167,"description":3398},"legacy-blog\u002F1771900874853",[246,450,249],"2XH3KgGuNoLmB1eISE18jMDEeFHIoyEm72NkHL5aBKs",{"id":3406,"title":3407,"assetBase":7,"author":8,"body":3408,"category":248,"collection":233,"date":2918,"description":3578,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":3579,"navigation":128,"originalPath":239,"path":3580,"seo":3581,"source":243,"stem":3582,"tags":3583,"weight":250,"__hash__":3584},"content\u002Flegacy-blog\u002F1771900966098.md","136. 只出现一次的数字",{"type":10,"value":3409,"toc":3575},[3410,3418,3421,3426,3437,3442,3453,3458,3468,3472,3487,3489,3491,3573],[13,3411,2493,3412,3414,3415,3417],{},[22,3413,2499],{}," 整数数组 ",[17,3416,28],{}," ，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。",[13,3419,3420],{},"你必须设计并实现线性时间复杂度的算法来解决此问题，且该算法只使用常量额外空间。",[13,3422,3423],{},[22,3424,3425],{},"示例 1 ：",[72,3427,3428],{},[13,3429,3430,1645,3432,3435,1690],{},[22,3431,1040],{},[78,3433,3434],{},"2,2,1",[22,3436,1047],{},[13,3438,3439],{},[22,3440,3441],{},"示例 2 ：",[72,3443,3444],{},[13,3445,3446,1645,3448,3451,1674],{},[22,3447,1040],{},[78,3449,3450],{},"4,1,2,1,2",[22,3452,1047],{},[13,3454,3455],{},[22,3456,3457],{},"示例 3 ：",[72,3459,3460],{},[13,3461,3462,1645,3464,3466,1690],{},[22,3463,1040],{},[78,3465,469],{},[22,3467,1047],{},[13,3469,3470],{},[22,3471,317],{},[49,3473,3474,3479,3484],{},[52,3475,3476],{},[17,3477,3478],{},"1 \u003C= nums.length \u003C= 3 * 104",[52,3480,3481],{},[17,3482,3483],{},"-3 * 104 \u003C= nums[i] \u003C= 3 * 104",[52,3485,3486],{},"除了某个元素只出现一次以外，其余每个元素均出现两次。",[107,3488,109],{"id":109},[13,3490,112],{},[114,3492,3494],{"className":116,"code":3493,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def singleNumber(self, nums):\n        hash_map = {}\n        for num in nums:\n            if num in hash_map:\n                hash_map[num] += 1\n            else:\n                hash_map[num] = 1\n        for key, value in hash_map.items():\n            if value == 1:\n                return key\n        return -1\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,3495,3496,3500,3504,3509,3514,3518,3523,3528,3532,3537,3542,3547,3552,3557,3561,3565,3569],{"__ignoreMap":119},[78,3497,3498],{"class":124,"line":125},[78,3499,129],{"emptyLinePlaceholder":128},[78,3501,3502],{"class":124,"line":132},[78,3503,135],{},[78,3505,3506],{"class":124,"line":138},[78,3507,3508],{},"    def singleNumber(self, nums):\n",[78,3510,3511],{"class":124,"line":144},[78,3512,3513],{},"        hash_map = {}\n",[78,3515,3516],{"class":124,"line":150},[78,3517,2640],{},[78,3519,3520],{"class":124,"line":156},[78,3521,3522],{},"            if num in hash_map:\n",[78,3524,3525],{"class":124,"line":162},[78,3526,3527],{},"                hash_map[num] += 1\n",[78,3529,3530],{"class":124,"line":168},[78,3531,699],{},[78,3533,3534],{"class":124,"line":174},[78,3535,3536],{},"                hash_map[num] = 1\n",[78,3538,3539],{"class":124,"line":180},[78,3540,3541],{},"        for key, value in hash_map.items():\n",[78,3543,3544],{"class":124,"line":186},[78,3545,3546],{},"            if value == 1:\n",[78,3548,3549],{"class":124,"line":192},[78,3550,3551],{},"                return key\n",[78,3553,3554],{"class":124,"line":198},[78,3555,3556],{},"        return -1\n",[78,3558,3559],{"class":124,"line":204},[78,3560,207],{},[78,3562,3563],{"class":124,"line":210},[78,3564,213],{},[78,3566,3567],{"class":124,"line":216},[78,3568,219],{},[78,3570,3571],{"class":124,"line":222},[78,3572,207],{},[226,3574,228],{},{"title":119,"searchDepth":144,"depth":144,"links":3576},[3577],{"id":109,"depth":132,"text":109},"给你一个 非空 整数数组 nums ，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。",{},"\u002Flegacy-blog\u002F1771900966098",{"title":3407,"description":3578},"legacy-blog\u002F1771900966098",[246,248],"aG_fO1Is-ksibVG0DrIarIwAjrtAk5xLajlNMGkGEZc",{"id":3586,"title":3587,"assetBase":7,"author":8,"body":3588,"category":3752,"collection":233,"date":2918,"description":3753,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":3754,"navigation":128,"originalPath":239,"path":3755,"seo":3756,"source":243,"stem":3757,"tags":3758,"weight":250,"__hash__":3760},"content\u002Flegacy-blog\u002F1771901031011.md","169. 多数元素",{"type":10,"value":3589,"toc":3749},[3590,3606,3609,3613,3624,3628,3640,3644,3664,3667,3669,3671,3747],[13,3591,3592,3593,3595,3596,3598,3599,1052,3602,3605],{},"给定一个大小为 ",[17,3594,19],{}," 的数组 ",[17,3597,28],{}," ，返回其中的多数元素。多数元素是指在数组中出现次数 ",[22,3600,3601],{},"大于",[17,3603,3604],{},"⌊ n\u002F2 ⌋"," 的元素。",[13,3607,3608],{},"你可以假设数组是非空的，并且给定的数组总是存在多数元素。",[13,3610,3611],{},[22,3612,293],{},[72,3614,3615],{},[13,3616,3617,1645,3619,3622,2994],{},[22,3618,1040],{},[78,3620,3621],{},"3,2,3",[22,3623,1047],{},[13,3625,3626],{},[22,3627,306],{},[72,3629,3630],{},[13,3631,3632,1645,3634,3637,3639],{},[22,3633,1040],{},[78,3635,3636],{},"2,2,1,1,1,2,2",[22,3638,1047],{}," 2",[13,3641,3642],{},[22,3643,317],{},[49,3645,3646,3651,3656,3661],{},[52,3647,3648],{},[17,3649,3650],{},"n == nums.length",[52,3652,3653],{},[17,3654,3655],{},"1 \u003C= n \u003C= 5 * 104",[52,3657,3658],{},[17,3659,3660],{},"-109 \u003C= nums[i] \u003C= 109",[52,3662,3663],{},"输入保证数组中一定有一个多数元素。",[13,3665,3666],{},"**进阶：**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。",[107,3668,109],{"id":109},[13,3670,112],{},[114,3672,3674],{"className":116,"code":3673,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def majorityElement(self, nums):\n        hash_map = {}\n        for num in nums:\n            if num in hash_map:\n                hash_map[num] += 1\n            else:\n                hash_map[num] = 1\n        for key, value in hash_map.items():\n            if value > len(nums) \u002F\u002F 2:\n                return key\n        return nums[0]\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,3675,3676,3680,3684,3689,3693,3697,3701,3705,3709,3713,3717,3722,3726,3731,3735,3739,3743],{"__ignoreMap":119},[78,3677,3678],{"class":124,"line":125},[78,3679,129],{"emptyLinePlaceholder":128},[78,3681,3682],{"class":124,"line":132},[78,3683,135],{},[78,3685,3686],{"class":124,"line":138},[78,3687,3688],{},"    def majorityElement(self, nums):\n",[78,3690,3691],{"class":124,"line":144},[78,3692,3513],{},[78,3694,3695],{"class":124,"line":150},[78,3696,2640],{},[78,3698,3699],{"class":124,"line":156},[78,3700,3522],{},[78,3702,3703],{"class":124,"line":162},[78,3704,3527],{},[78,3706,3707],{"class":124,"line":168},[78,3708,699],{},[78,3710,3711],{"class":124,"line":174},[78,3712,3536],{},[78,3714,3715],{"class":124,"line":180},[78,3716,3541],{},[78,3718,3719],{"class":124,"line":186},[78,3720,3721],{},"            if value > len(nums) \u002F\u002F 2:\n",[78,3723,3724],{"class":124,"line":192},[78,3725,3551],{},[78,3727,3728],{"class":124,"line":198},[78,3729,3730],{},"        return nums[0]\n",[78,3732,3733],{"class":124,"line":204},[78,3734,207],{},[78,3736,3737],{"class":124,"line":210},[78,3738,213],{},[78,3740,3741],{"class":124,"line":216},[78,3742,219],{},[78,3744,3745],{"class":124,"line":222},[78,3746,207],{},[226,3748,228],{},{"title":119,"searchDepth":144,"depth":144,"links":3750},[3751],{"id":109,"depth":132,"text":109},"数组 哈希表 排序","给定一个大小为 n 的数组 nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n\u002F2 ⌋ 的元素。",{},"\u002Flegacy-blog\u002F1771901031011",{"title":3587,"description":3753},"legacy-blog\u002F1771901031011",[246,248,449,3759],"排序","FYysRo552CnQIE3UeC6w0VO9fPfOgBjGngtyZnx3wRY",{"id":3762,"title":3763,"assetBase":7,"author":8,"body":3764,"category":3963,"collection":233,"date":3964,"description":3965,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":3966,"navigation":128,"originalPath":239,"path":3967,"seo":3968,"source":243,"stem":3969,"tags":3970,"weight":250,"__hash__":3971},"content\u002Flegacy-blog\u002F1771985521726.md","75. 颜色分类",{"type":10,"value":3765,"toc":3960},[3766,3779,3790,3793,3797,3811,3815,3829,3833,3855,3859,3864,3866,3868,3958],[13,3767,3768,3769,3771,3772,3774,3775,3778],{},"给定一个包含红色、白色和蓝色、共 ",[17,3770,19],{}," 个元素的数组 ",[17,3773,28],{}," ，",[22,3776,3777],{},"原地"," 对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。",[13,3780,3781,3782,3784,3785,1018,3787,3789],{},"我们使用整数 ",[17,3783,2949],{},"、 ",[17,3786,469],{},[17,3788,472],{}," 分别表示红色、白色和蓝色。",[13,3791,3792],{},"必须在不使用库内置的 sort 函数的情况下解决这个问题。",[13,3794,3795],{},[22,3796,293],{},[72,3798,3799],{},[13,3800,3801,1645,3803,3806,1052,3808],{},[22,3802,1040],{},[78,3804,3805],{},"2,0,2,1,1,0",[22,3807,1047],{},[78,3809,3810],{},"0,0,1,1,2,2",[13,3812,3813],{},[22,3814,306],{},[72,3816,3817],{},[13,3818,3819,1645,3821,3824,1052,3826],{},[22,3820,1040],{},[78,3822,3823],{},"2,0,1",[22,3825,1047],{},[78,3827,3828],{},"0,1,2",[13,3830,3831],{},[22,3832,317],{},[49,3834,3835,3839,3844],{},[52,3836,3837],{},[17,3838,3650],{},[52,3840,3841],{},[17,3842,3843],{},"1 \u003C= n \u003C= 300",[52,3845,3846,3848,3849,1011,3851,275,3853],{},[17,3847,35],{}," 为 ",[17,3850,2949],{},[17,3852,469],{},[17,3854,472],{},[13,3856,3857],{},[22,3858,1711],{},[49,3860,3861],{},[52,3862,3863],{},"你能想出一个仅使用常数空间的一趟扫描算法吗？",[107,3865,109],{"id":109},[13,3867,112],{},[114,3869,3871],{"className":116,"code":3870,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def sortColors(self, nums):\n        # 用三个指针记录区域尾部\n        num0 = num1 = num2 = 0\n        for i in range(len(nums)):\n            if nums[i] == 0:\n                nums[num2] = 2; num2 += 1\n                nums[num1] = 1; num1 += 1\n                nums[num0] = 0; num0 += 1\n            elif nums[i] == 1:\n                nums[num2] = 2; num2 += 1\n                nums[num1] = 1; num1 += 1\n            else:\n                nums[num2] = 2; num2 += 1\n        \"\"\"\n        :type nums: List[int]\n        :rtype: None Do not return anything, modify nums in-place instead.\n        \"\"\"\n\n",[17,3872,3873,3877,3881,3886,3891,3896,3900,3905,3910,3915,3920,3925,3929,3933,3937,3941,3945,3949,3954],{"__ignoreMap":119},[78,3874,3875],{"class":124,"line":125},[78,3876,129],{"emptyLinePlaceholder":128},[78,3878,3879],{"class":124,"line":132},[78,3880,135],{},[78,3882,3883],{"class":124,"line":138},[78,3884,3885],{},"    def sortColors(self, nums):\n",[78,3887,3888],{"class":124,"line":144},[78,3889,3890],{},"        # 用三个指针记录区域尾部\n",[78,3892,3893],{"class":124,"line":150},[78,3894,3895],{},"        num0 = num1 = num2 = 0\n",[78,3897,3898],{"class":124,"line":156},[78,3899,1760],{},[78,3901,3902],{"class":124,"line":162},[78,3903,3904],{},"            if nums[i] == 0:\n",[78,3906,3907],{"class":124,"line":168},[78,3908,3909],{},"                nums[num2] = 2; num2 += 1\n",[78,3911,3912],{"class":124,"line":174},[78,3913,3914],{},"                nums[num1] = 1; num1 += 1\n",[78,3916,3917],{"class":124,"line":180},[78,3918,3919],{},"                nums[num0] = 0; num0 += 1\n",[78,3921,3922],{"class":124,"line":186},[78,3923,3924],{},"            elif nums[i] == 1:\n",[78,3926,3927],{"class":124,"line":192},[78,3928,3909],{},[78,3930,3931],{"class":124,"line":198},[78,3932,3914],{},[78,3934,3935],{"class":124,"line":204},[78,3936,699],{},[78,3938,3939],{"class":124,"line":210},[78,3940,3909],{},[78,3942,3943],{"class":124,"line":216},[78,3944,207],{},[78,3946,3947],{"class":124,"line":222},[78,3948,213],{},[78,3950,3951],{"class":124,"line":421},[78,3952,3953],{},"        :rtype: None Do not return anything, modify nums in-place instead.\n",[78,3955,3956],{"class":124,"line":427},[78,3957,207],{},[226,3959,228],{},{"title":119,"searchDepth":144,"depth":144,"links":3961},[3962],{"id":109,"depth":132,"text":109},"数组 双指针 排序","2026-02-25","给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ，原地 对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。",{},"\u002Flegacy-blog\u002F1771985521726",{"title":3763,"description":3965},"legacy-blog\u002F1771985521726",[246,248,451,3759],"CzjdjkjzbXb5beexF3YLPgtzg_UmdIMKBbKsj6RiYU0",{"id":3973,"title":3974,"assetBase":7,"author":8,"body":3975,"category":4241,"collection":233,"date":3964,"description":4242,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":4243,"navigation":128,"originalPath":239,"path":4244,"seo":4245,"source":243,"stem":4246,"tags":4247,"weight":250,"__hash__":4248},"content\u002Flegacy-blog\u002F1771986764878.md","31. 下一个排列",{"type":10,"value":3976,"toc":4238},[3977,3984,4008,4018,4048,4056,4062,4066,4080,4084,4097,4101,4114,4118,4129,4131,4133,4236],[13,3978,3979,3980,3983],{},"整数数组的一个 ",[22,3981,3982],{},"排列","  就是将其所有成员以序列或线性顺序排列。",[49,3985,3986],{},[52,3987,2960,3988,3991,3992,3995,3996,1011,3999,1011,4002,1011,4005,285],{},[17,3989,3990],{},"arr = [1,2,3]"," ，以下这些都可以视作 ",[17,3993,3994],{},"arr"," 的排列：",[17,3997,3998],{},"[1,2,3]",[17,4000,4001],{},"[1,3,2]",[17,4003,4004],{},"[3,1,2]",[17,4006,4007],{},"[2,3,1]",[13,4009,4010,4011,4014,4015,4017],{},"整数数组的 ",[22,4012,4013],{},"下一个排列"," 是指其整数的下一个字典序更大的排列。更正式地，如果数组的所有排列根据其字典顺序从小到大排列在一个容器中，那么数组的 ",[22,4016,4013],{}," 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列，那么这个数组必须重排为字典序最小的排列（即，其元素按升序排列）。",[49,4019,4020,4027,4035],{},[52,4021,2960,4022,4024,4025,285],{},[17,4023,3990],{}," 的下一个排列是 ",[17,4026,4001],{},[52,4028,4029,4030,4024,4033,285],{},"类似地，",[17,4031,4032],{},"arr = [2,3,1]",[17,4034,4004],{},[52,4036,4037,4038,4024,4041,4043,4044,4047],{},"而 ",[17,4039,4040],{},"arr = [3,2,1]",[17,4042,3998],{}," ，因为 ",[17,4045,4046],{},"[3,2,1]"," 不存在一个字典序更大的排列。",[13,4049,1202,4050,4052,4053,4055],{},[17,4051,28],{}," ，找出 ",[17,4054,28],{}," 的下一个排列。",[13,4057,4058,4059,4061],{},"必须 ",[22,4060,3777],{}," 修改，只允许使用额外常数空间。",[13,4063,4064],{},[22,4065,293],{},[72,4067,4068],{},[13,4069,4070,1645,4072,4075,1052,4077],{},[22,4071,1040],{},[78,4073,4074],{},"1,2,3",[22,4076,1047],{},[78,4078,4079],{},"1,3,2",[13,4081,4082],{},[22,4083,306],{},[72,4085,4086],{},[13,4087,4088,1645,4090,4093,1052,4095],{},[22,4089,1040],{},[78,4091,4092],{},"3,2,1",[22,4094,1047],{},[78,4096,4074],{},[13,4098,4099],{},[22,4100,1265],{},[72,4102,4103],{},[13,4104,4105,1645,4107,4110,1052,4112],{},[22,4106,1040],{},[78,4108,4109],{},"1,1,5",[22,4111,1047],{},[78,4113,2065],{},[13,4115,4116],{},[22,4117,317],{},[49,4119,4120,4124],{},[52,4121,4122],{},[17,4123,869],{},[52,4125,4126],{},[17,4127,4128],{},"0 \u003C= nums[i] \u003C= 100",[107,4130,109],{"id":109},[13,4132,112],{},[114,4134,4136],{"className":116,"code":4135,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def nextPermutation(self, nums):\n        i = len(nums) - 2\n        while i >= 0 and nums[i] >= nums[i + 1]:\n            i -= 1\n        if i >= 0:\n            j = len(nums) - 1\n            while j >= 0 and nums[i] >= nums[j]:\n                j -= 1\n            nums[i], nums[j] =  nums[j], nums[i]\n        \n        left, right = i + 1, len(nums) - 1\n        while left \u003C right:\n            nums[left], nums[right] = nums[right], nums[left]\n            left += 1\n            right -= 1\n        \"\"\"\n        :type nums: List[int]\n        :rtype: None Do not return anything, modify nums in-place instead.\n        \"\"\"\n\n",[17,4137,4138,4142,4146,4151,4156,4161,4166,4171,4176,4181,4186,4191,4195,4200,4205,4210,4215,4220,4224,4228,4232],{"__ignoreMap":119},[78,4139,4140],{"class":124,"line":125},[78,4141,129],{"emptyLinePlaceholder":128},[78,4143,4144],{"class":124,"line":132},[78,4145,135],{},[78,4147,4148],{"class":124,"line":138},[78,4149,4150],{},"    def nextPermutation(self, nums):\n",[78,4152,4153],{"class":124,"line":144},[78,4154,4155],{},"        i = len(nums) - 2\n",[78,4157,4158],{"class":124,"line":150},[78,4159,4160],{},"        while i >= 0 and nums[i] >= nums[i + 1]:\n",[78,4162,4163],{"class":124,"line":156},[78,4164,4165],{},"            i -= 1\n",[78,4167,4168],{"class":124,"line":162},[78,4169,4170],{},"        if i >= 0:\n",[78,4172,4173],{"class":124,"line":168},[78,4174,4175],{},"            j = len(nums) - 1\n",[78,4177,4178],{"class":124,"line":174},[78,4179,4180],{},"            while j >= 0 and nums[i] >= nums[j]:\n",[78,4182,4183],{"class":124,"line":180},[78,4184,4185],{},"                j -= 1\n",[78,4187,4188],{"class":124,"line":186},[78,4189,4190],{},"            nums[i], nums[j] =  nums[j], nums[i]\n",[78,4192,4193],{"class":124,"line":192},[78,4194,1359],{},[78,4196,4197],{"class":124,"line":198},[78,4198,4199],{},"        left, right = i + 1, len(nums) - 1\n",[78,4201,4202],{"class":124,"line":204},[78,4203,4204],{},"        while left \u003C right:\n",[78,4206,4207],{"class":124,"line":210},[78,4208,4209],{},"            nums[left], nums[right] = nums[right], nums[left]\n",[78,4211,4212],{"class":124,"line":216},[78,4213,4214],{},"            left += 1\n",[78,4216,4217],{"class":124,"line":222},[78,4218,4219],{},"            right -= 1\n",[78,4221,4222],{"class":124,"line":421},[78,4223,207],{},[78,4225,4226],{"class":124,"line":427},[78,4227,213],{},[78,4229,4230],{"class":124,"line":433},[78,4231,3953],{},[78,4233,4234],{"class":124,"line":2443},[78,4235,207],{},[226,4237,228],{},{"title":119,"searchDepth":144,"depth":144,"links":4239},[4240],{"id":109,"depth":132,"text":109},"数组 双指针","整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。",{},"\u002Flegacy-blog\u002F1771986764878",{"title":3974,"description":4242},"legacy-blog\u002F1771986764878",[246,248,451],"WP1W5KbmAy-E1MAGwoD4v4IvvRLxs8T5qMpVuxGqg5A",{"id":4250,"title":4251,"assetBase":7,"author":8,"body":4252,"category":4503,"collection":233,"date":3964,"description":4504,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":4505,"navigation":128,"originalPath":239,"path":4506,"seo":4507,"source":243,"stem":4508,"tags":4509,"weight":250,"__hash__":4510},"content\u002Flegacy-blog\u002F1771987903130.md","287. 寻找重复数",{"type":10,"value":4253,"toc":4500},[4254,4273,4285,4298,4302,4313,4317,4328,4333,4344,4348,4381,4385,4400,4402,4404,4498],[13,4255,4256,4257,4260,4261,4263,4264,4267,4268,1018,4270,4272],{},"给定一个包含 ",[17,4258,4259],{},"n + 1"," 个整数的数组 ",[17,4262,28],{}," ，其数字都在 ",[17,4265,4266],{},"[1, n]"," 范围内（包括 ",[17,4269,469],{},[17,4271,19],{},"），可知至少存在一个重复的整数。",[13,4274,4275,4276,4278,4279,996,4282,285],{},"假设 ",[17,4277,28],{}," 只有 ",[22,4280,4281],{},"一个重复的整数",[22,4283,4284],{},"这个重复的数",[13,4286,4287,4288,2500,4291,4293,4294,4297],{},"你设计的解决方案必须 ",[22,4289,4290],{},"不修改",[17,4292,28],{}," 且只用常量级 ",[17,4295,4296],{},"O(1)"," 的额外空间。",[13,4299,4300],{},[22,4301,293],{},[72,4303,4304],{},[13,4305,4306,1645,4308,4311,3639],{},[22,4307,1040],{},[78,4309,4310],{},"1,3,4,2,2",[22,4312,1047],{},[13,4314,4315],{},[22,4316,306],{},[72,4318,4319],{},[13,4320,4321,1645,4323,4326,2994],{},[22,4322,1040],{},[78,4324,4325],{},"3,1,3,4,2",[22,4327,1047],{},[13,4329,4330],{},[22,4331,4332],{},"示例 3 :",[72,4334,4335],{},[13,4336,4337,1645,4339,4342,2994],{},[22,4338,1040],{},[78,4340,4341],{},"3,3,3,3,3",[22,4343,1047],{},[13,4345,4346],{},[22,4347,317],{},[49,4349,4350,4355,4360,4365],{},[52,4351,4352],{},[17,4353,4354],{},"1 \u003C= n \u003C= 105",[52,4356,4357],{},[17,4358,4359],{},"nums.length == n + 1",[52,4361,4362],{},[17,4363,4364],{},"1 \u003C= nums[i] \u003C= n",[52,4366,4367,4369,4370,4373,4374,4377,4378],{},[17,4368,28],{}," 中 ",[22,4371,4372],{},"只有一个整数"," 出现 ",[22,4375,4376],{},"两次或多次"," ，其余整数均只出现 ",[22,4379,4380],{},"一次",[13,4382,4383],{},[22,4384,1711],{},[49,4386,4387,4393],{},[52,4388,4389,4390,4392],{},"如何证明 ",[17,4391,28],{}," 中至少存在一个重复的数字?",[52,4394,4395,4396,4399],{},"你可以设计一个线性级时间复杂度 ",[17,4397,4398],{},"O(n)"," 的解决方案吗？",[107,4401,109],{"id":109},[13,4403,112],{},[114,4405,4407],{"className":116,"code":4406,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def findDuplicate(self, nums):\n        # 快慢指针\n        fast = slow = 0\n        while True:\n            fast = nums[nums[fast]]\n            slow = nums[slow]\n            if slow == fast:\n                # 重置快指针到起点，相遇点是环的入口\n                fast = 0;\n                while nums[slow] != nums[fast]:\n                    fast = nums[fast]\n                    slow = nums[slow]\n                return nums[slow]\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,4408,4409,4413,4417,4422,4427,4432,4437,4442,4447,4452,4457,4462,4467,4472,4477,4482,4486,4490,4494],{"__ignoreMap":119},[78,4410,4411],{"class":124,"line":125},[78,4412,129],{"emptyLinePlaceholder":128},[78,4414,4415],{"class":124,"line":132},[78,4416,135],{},[78,4418,4419],{"class":124,"line":138},[78,4420,4421],{},"    def findDuplicate(self, nums):\n",[78,4423,4424],{"class":124,"line":144},[78,4425,4426],{},"        # 快慢指针\n",[78,4428,4429],{"class":124,"line":150},[78,4430,4431],{},"        fast = slow = 0\n",[78,4433,4434],{"class":124,"line":156},[78,4435,4436],{},"        while True:\n",[78,4438,4439],{"class":124,"line":162},[78,4440,4441],{},"            fast = nums[nums[fast]]\n",[78,4443,4444],{"class":124,"line":168},[78,4445,4446],{},"            slow = nums[slow]\n",[78,4448,4449],{"class":124,"line":174},[78,4450,4451],{},"            if slow == fast:\n",[78,4453,4454],{"class":124,"line":180},[78,4455,4456],{},"                # 重置快指针到起点，相遇点是环的入口\n",[78,4458,4459],{"class":124,"line":186},[78,4460,4461],{},"                fast = 0;\n",[78,4463,4464],{"class":124,"line":192},[78,4465,4466],{},"                while nums[slow] != nums[fast]:\n",[78,4468,4469],{"class":124,"line":198},[78,4470,4471],{},"                    fast = nums[fast]\n",[78,4473,4474],{"class":124,"line":204},[78,4475,4476],{},"                    slow = nums[slow]\n",[78,4478,4479],{"class":124,"line":210},[78,4480,4481],{},"                return nums[slow]\n",[78,4483,4484],{"class":124,"line":216},[78,4485,207],{},[78,4487,4488],{"class":124,"line":222},[78,4489,213],{},[78,4491,4492],{"class":124,"line":421},[78,4493,219],{},[78,4495,4496],{"class":124,"line":427},[78,4497,207],{},[226,4499,228],{},{"title":119,"searchDepth":144,"depth":144,"links":4501},[4502],{"id":109,"depth":132,"text":109},"数组 双指针 二分查找","给定一个包含 n + 1 个整数的数组 nums ，其数字都在 [1, n] 范围内（包括 1 和 n），可知至少存在一个重复的整数。",{},"\u002Flegacy-blog\u002F1771987903130",{"title":4251,"description":4504},"legacy-blog\u002F1771987903130",[246,248,451,1819],"katYH53jg_chzMnso2ks1k3NZkFayYlNo32TGwRs0a4",{"id":4512,"title":4513,"assetBase":239,"author":8,"body":4514,"category":787,"collection":233,"date":6374,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":6375,"navigation":128,"originalPath":239,"path":6376,"seo":6377,"source":243,"stem":6378,"tags":6379,"weight":250,"__hash__":6381},"content\u002Flegacy-blog\u002F1772091314596.md","Attention",{"type":10,"value":4515,"toc":6367},[4516,4520,4524,4527,4535,4538,4553,4557,4560,4563,4989,4992,5226,5303,5514,5591,5977,6081,6085,6088,6269,6272,6287,6291,6294,6297,6300,6345,6355,6359,6362,6365],[4517,4518,4513],"h1",{"id":4519},"attention",[107,4521,4523],{"id":4522},"什么是-attention","什么是 Attention",[13,4525,4526],{},"由于 NLP 任务所需要处理的文本往往是序列，因此专用于处理序列、时序数据的 RNN 往往能够在 NLP 任务上取得最优的效果。但 RNN 及 LSTM 虽然具有捕捉时序信息、适合序列生成的优点，却有两个难以弥补的缺陷：",[2285,4528,4529,4532],{},[52,4530,4531],{},"序列依序计算的模式能够很好地模拟时序信息，但限制了计算机并行计算的能力。由于序列需要依次输入、依序计算，图形处理器（Graphics Processing Unit，GPU）并行计算的能力受到了极大限制，导致 RNN 为基础架构的模型虽然参数量不算特别大，但计算时间成本却很高；",[52,4533,4534],{},"RNN 难以捕捉长序列的相关关系。在 RNN 架构中，距离越远的输入之间的关系就越难被捕捉，同时 RNN 需要将整个序列读入内存依次计算，也限制了序列的长度。虽然 LSTM 中通过门机制对此进行了一定优化，但对于较远距离相关关系的捕捉，RNN 依旧是不如人意的。",[13,4536,4537],{},"注意力机制最先源于计算机视觉领域，其核心思想为当我们关注一张图片，我们往往无需看清楚全部内容而仅将注意力集中在重点部分即可。而在自然语言处理领域，我们往往也可以通过将重点注意力集中在一个或几个 token，从而取得更高效高质的计算效果。",[13,4539,4540,4541,4544,4545,4548,4549,4552],{},"注意力机制有三个核心变量：",[22,4542,4543],{},"Query","（查询值）、",[22,4546,4547],{},"Key","（键值）和 ",[22,4550,4551],{},"Value","（真值）。通过对 Query 和 Key 进行运算我们可以得到一个权重，这个权重其实反映了从 Query 出发，对文本每一个 token 应该分布的注意力相对大小。通过把权重和 Value 进行运算，得到的最后结果就是从 Query 出发计算整个文本注意力得到的结果。",[107,4554,4556],{"id":4555},"qkv-公式","QKV 公式",[13,4558,4559],{},"通过合理的训练拟合，词向量能够表征语义信息，从而让语义相近的词在向量空间中距离更近，语义较远的词在向量空间中距离更远。我们往往用欧式距离来衡量词向量的相似性，根据词向量的定义，语义相似的两个词对应的词向量的点积应该大于0，而语义不相似的词向量点积应该小于0。那么，我们就可以用点积来计算词之间的相似度。",[13,4561,4562],{},"基于矩阵乘法的定义，x 即为 q 与每一个 k 值的点积。现在我们得到的 x 即反映了 Query 和每一个 Key 的相似程度，我们再通过一个 Softmax 层将其转化为和为 1 的权重：",[78,4564,4567],{"className":4565},[4566],"katex-display",[78,4568,4571,4651],{"className":4569},[4570],"katex",[78,4572,4575],{"className":4573},[4574],"katex-mathml",[4576,4577,4580],"math",{"xmlns":4578,"display":4579},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML","block",[4581,4582,4583,4646],"semantics",{},[4584,4585,4586,4590,4595,4599,4607,4610],"mrow",{},[4587,4588,4589],"mtext",{},"softmax",[4591,4592,4594],"mo",{"stretchy":4593},"false","(",[4596,4597,4598],"mi",{},"x",[4600,4601,4602,4605],"msub",{},[4591,4603,4604],{"stretchy":4593},")",[4596,4606,39],{},[4591,4608,4609],{},"=",[4611,4612,4613,4625],"mfrac",{},[4614,4615,4616,4619],"msup",{},[4596,4617,4618],{},"e",[4584,4620,4621,4623],{},[4596,4622,4598],{},[4596,4624,39],{},[4584,4626,4627,4636],{},[4628,4629,4630,4633],"munder",{},[4591,4631,4632],{},"∑",[4596,4634,4635],{},"j",[4614,4637,4638,4640],{},[4596,4639,4618],{},[4600,4641,4642,4644],{},[4596,4643,4598],{},[4596,4645,4635],{},[4647,4648,4650],"annotation",{"encoding":4649},"application\u002Fx-tex","\\text{softmax}(x)_i = \\frac{e^{xi}}{\\sum_{j}e^{x_j}}",[78,4652,4655,4748],{"className":4653,"ariaHidden":1419},[4654],"katex-html",[78,4656,4659,4664,4671,4675,4679,4736,4741,4745],{"className":4657},[4658],"base",[78,4660],{"className":4661,"style":4663},[4662],"strut","height:1em;vertical-align:-0.25em;",[78,4665,4668],{"className":4666},[4667,299],"mord",[78,4669,4589],{"className":4670},[4667],[78,4672,4594],{"className":4673},[4674],"mopen",[78,4676,4598],{"className":4677},[4667,4678],"mathnormal",[78,4680,4683,4686],{"className":4681},[4682],"mclose",[78,4684,4604],{"className":4685},[4682],[78,4687,4690],{"className":4688},[4689],"msupsub",[78,4691,4695,4727],{"className":4692},[4693,4694],"vlist-t","vlist-t2",[78,4696,4699,4722],{"className":4697},[4698],"vlist-r",[78,4700,4704],{"className":4701,"style":4703},[4702],"vlist","height:0.3117em;",[78,4705,4707,4712],{"style":4706},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[78,4708],{"className":4709,"style":4711},[4710],"pstrut","height:2.7em;",[78,4713,4719],{"className":4714},[4715,4716,4717,4718],"sizing","reset-size6","size3","mtight",[78,4720,39],{"className":4721},[4667,4678,4718],[78,4723,4726],{"className":4724},[4725],"vlist-s","​",[78,4728,4730],{"className":4729},[4698],[78,4731,4734],{"className":4732,"style":4733},[4702],"height:0.15em;",[78,4735],{},[78,4737],{"className":4738,"style":4740},[4739],"mspace","margin-right:0.2778em;",[78,4742,4609],{"className":4743},[4744],"mrel",[78,4746],{"className":4747,"style":4740},[4739],[78,4749,4751,4755],{"className":4750},[4658],[78,4752],{"className":4753,"style":4754},[4662],"height:2.6235em;vertical-align:-1.1218em;",[78,4756,4758,4762,4986],{"className":4757},[4667],[78,4759],{"className":4760},[4674,4761],"nulldelimiter",[78,4763,4765],{"className":4764},[4611],[78,4766,4768,4977],{"className":4767},[4693,4694],[78,4769,4771,4974],{"className":4770},[4698],[78,4772,4775,4917,4928],{"className":4773,"style":4774},[4702],"height:1.5017em;",[78,4776,4778,4782],{"style":4777},"top:-2.314em;",[78,4779],{"className":4780,"style":4781},[4710],"height:3em;",[78,4783,4785,4836,4840],{"className":4784},[4667],[78,4786,4789,4795],{"className":4787},[4788],"mop",[78,4790,4632],{"className":4791,"style":4794},[4788,4792,4793],"op-symbol","small-op","position:relative;top:0em;",[78,4796,4798],{"className":4797},[4689],[78,4799,4801,4827],{"className":4800},[4693,4694],[78,4802,4804,4824],{"className":4803},[4698],[78,4805,4808],{"className":4806,"style":4807},[4702],"height:0.162em;",[78,4809,4811,4814],{"style":4810},"top:-2.4003em;margin-left:0em;margin-right:0.05em;",[78,4812],{"className":4813,"style":4711},[4710],[78,4815,4817],{"className":4816},[4715,4716,4717,4718],[78,4818,4820],{"className":4819},[4667,4718],[78,4821,4635],{"className":4822,"style":4823},[4667,4678,4718],"margin-right:0.0572em;",[78,4825,4726],{"className":4826},[4725],[78,4828,4830],{"className":4829},[4698],[78,4831,4834],{"className":4832,"style":4833},[4702],"height:0.4358em;",[78,4835],{},[78,4837],{"className":4838,"style":4839},[4739],"margin-right:0.1667em;",[78,4841,4843,4846],{"className":4842},[4667],[78,4844,4618],{"className":4845},[4667,4678],[78,4847,4849],{"className":4848},[4689],[78,4850,4852],{"className":4851},[4693],[78,4853,4855],{"className":4854},[4698],[78,4856,4859],{"className":4857,"style":4858},[4702],"height:0.6065em;",[78,4860,4862,4865],{"style":4861},"top:-3.0051em;margin-right:0.05em;",[78,4863],{"className":4864,"style":4711},[4710],[78,4866,4868],{"className":4867},[4715,4716,4717,4718],[78,4869,4871],{"className":4870},[4667,4718],[78,4872,4874,4877],{"className":4873},[4667,4718],[78,4875,4598],{"className":4876},[4667,4678,4718],[78,4878,4880],{"className":4879},[4689],[78,4881,4883,4908],{"className":4882},[4693,4694],[78,4884,4886,4905],{"className":4885},[4698],[78,4887,4890],{"className":4888,"style":4889},[4702],"height:0.3281em;",[78,4891,4893,4897],{"style":4892},"top:-2.357em;margin-left:0em;margin-right:0.0714em;",[78,4894],{"className":4895,"style":4896},[4710],"height:2.5em;",[78,4898,4902],{"className":4899},[4715,4900,4901,4718],"reset-size3","size1",[78,4903,4635],{"className":4904,"style":4823},[4667,4678,4718],[78,4906,4726],{"className":4907},[4725],[78,4909,4911],{"className":4910},[4698],[78,4912,4915],{"className":4913,"style":4914},[4702],"height:0.2819em;",[78,4916],{},[78,4918,4920,4923],{"style":4919},"top:-3.23em;",[78,4921],{"className":4922,"style":4781},[4710],[78,4924],{"className":4925,"style":4927},[4926],"frac-line","border-bottom-width:0.04em;",[78,4929,4931,4934],{"style":4930},"top:-3.677em;",[78,4932],{"className":4933,"style":4781},[4710],[78,4935,4937],{"className":4936},[4667],[78,4938,4940,4943],{"className":4939},[4667],[78,4941,4618],{"className":4942},[4667,4678],[78,4944,4946],{"className":4945},[4689],[78,4947,4949],{"className":4948},[4693],[78,4950,4952],{"className":4951},[4698],[78,4953,4956],{"className":4954,"style":4955},[4702],"height:0.8247em;",[78,4957,4959,4962],{"style":4958},"top:-3.063em;margin-right:0.05em;",[78,4960],{"className":4961,"style":4711},[4710],[78,4963,4965],{"className":4964},[4715,4716,4717,4718],[78,4966,4968,4971],{"className":4967},[4667,4718],[78,4969,4598],{"className":4970},[4667,4678,4718],[78,4972,39],{"className":4973},[4667,4678,4718],[78,4975,4726],{"className":4976},[4725],[78,4978,4980],{"className":4979},[4698],[78,4981,4984],{"className":4982,"style":4983},[4702],"height:1.1218em;",[78,4985],{},[78,4987],{"className":4988},[4682,4761],[13,4990,4991],{},"这样，得到的向量就能够反映 Query 和每一个 Key 的相似程度，同时又相加权重为 1，也就是我们的注意力分数了。最后，我们再将得到的注意力分数和值向量做对应乘积即可。根据上述过程，我们就可以得到注意力机制计算的基本公式：",[78,4993,4995],{"className":4994},[4566],[78,4996,4998,5083],{"className":4997},[4570],[78,4999,5001],{"className":5000},[4574],[4576,5002,5003],{"xmlns":4578,"display":4579},[4581,5004,5005,5080],{},[4584,5006,5007,5010,5013,5015,5017,5019,5021,5023,5026,5028,5030,5033,5035,5038,5040,5043,5045,5047,5049,5051,5054,5056,5059,5061,5063,5065,5068,5075,5077],{},[4596,5008,5009],{},"a",[4596,5011,5012],{},"t",[4596,5014,5012],{},[4596,5016,4618],{},[4596,5018,19],{},[4596,5020,5012],{},[4596,5022,39],{},[4596,5024,5025],{},"o",[4596,5027,19],{},[4591,5029,4594],{"stretchy":4593},[4596,5031,5032],{},"Q",[4591,5034,2066],{"separator":1419},[4596,5036,5037],{},"K",[4591,5039,2066],{"separator":1419},[4596,5041,5042],{},"V",[4591,5044,4604],{"stretchy":4593},[4591,5046,4609],{},[4596,5048,262],{},[4596,5050,5025],{},[4596,5052,5053],{},"f",[4596,5055,5012],{},[4596,5057,5058],{},"m",[4596,5060,5009],{},[4596,5062,4598],{},[4591,5064,4594],{"stretchy":4593},[4596,5066,5067],{},"q",[4614,5069,5070,5072],{},[4596,5071,5037],{},[4596,5073,5074],{},"T",[4591,5076,4604],{"stretchy":4593},[4596,5078,5079],{},"v",[4647,5081,5082],{"encoding":4649},"attention(Q,K,V) = softmax(qK^T)v",[78,5084,5086,5156],{"className":5085,"ariaHidden":1419},[4654],[78,5087,5089,5092,5095,5099,5102,5105,5108,5111,5114,5117,5120,5123,5127,5130,5134,5137,5140,5144,5147,5150,5153],{"className":5088},[4658],[78,5090],{"className":5091,"style":4663},[4662],[78,5093,5009],{"className":5094},[4667,4678],[78,5096,5098],{"className":5097},[4667,4678],"tt",[78,5100,4618],{"className":5101},[4667,4678],[78,5103,19],{"className":5104},[4667,4678],[78,5106,5012],{"className":5107},[4667,4678],[78,5109,39],{"className":5110},[4667,4678],[78,5112,5025],{"className":5113},[4667,4678],[78,5115,19],{"className":5116},[4667,4678],[78,5118,4594],{"className":5119},[4674],[78,5121,5032],{"className":5122},[4667,4678],[78,5124,2066],{"className":5125},[5126],"mpunct",[78,5128],{"className":5129,"style":4839},[4739],[78,5131,5037],{"className":5132,"style":5133},[4667,4678],"margin-right:0.0715em;",[78,5135,2066],{"className":5136},[5126],[78,5138],{"className":5139,"style":4839},[4739],[78,5141,5042],{"className":5142,"style":5143},[4667,4678],"margin-right:0.2222em;",[78,5145,4604],{"className":5146},[4682],[78,5148],{"className":5149,"style":4740},[4739],[78,5151,4609],{"className":5152},[4744],[78,5154],{"className":5155,"style":4740},[4739],[78,5157,5159,5163,5167,5171,5174,5178,5181,5184,5188,5220,5223],{"className":5158},[4658],[78,5160],{"className":5161,"style":5162},[4662],"height:1.1413em;vertical-align:-0.25em;",[78,5164,5166],{"className":5165},[4667,4678],"so",[78,5168,5053],{"className":5169,"style":5170},[4667,4678],"margin-right:0.1076em;",[78,5172,5012],{"className":5173},[4667,4678],[78,5175,5177],{"className":5176},[4667,4678],"ma",[78,5179,4598],{"className":5180},[4667,4678],[78,5182,4594],{"className":5183},[4674],[78,5185,5067],{"className":5186,"style":5187},[4667,4678],"margin-right:0.0359em;",[78,5189,5191,5194],{"className":5190},[4667],[78,5192,5037],{"className":5193,"style":5133},[4667,4678],[78,5195,5197],{"className":5196},[4689],[78,5198,5200],{"className":5199},[4693],[78,5201,5203],{"className":5202},[4698],[78,5204,5207],{"className":5205,"style":5206},[4702],"height:0.8913em;",[78,5208,5210,5213],{"style":5209},"top:-3.113em;margin-right:0.05em;",[78,5211],{"className":5212,"style":4711},[4710],[78,5214,5216],{"className":5215},[4715,4716,4717,4718],[78,5217,5074],{"className":5218,"style":5219},[4667,4678,4718],"margin-right:0.1389em;",[78,5221,4604],{"className":5222},[4682],[78,5224,5079],{"className":5225,"style":5187},[4667,4678],[13,5227,5228,5229,5302],{},"此时的值还是一个标量，我们此次只查询了一个 Query。我们可以将值转化为维度为 ",[78,5230,5232,5251],{"className":5231},[4570],[78,5233,5235],{"className":5234},[4574],[4576,5236,5237],{"xmlns":4578},[4581,5238,5239,5248],{},[4584,5240,5241],{},[4600,5242,5243,5246],{},[4596,5244,5245],{},"d",[4596,5247,5079],{},[4647,5249,5250],{"encoding":4649},"d_v",[78,5252,5254],{"className":5253,"ariaHidden":1419},[4654],[78,5255,5257,5261],{"className":5256},[4658],[78,5258],{"className":5259,"style":5260},[4662],"height:0.8444em;vertical-align:-0.15em;",[78,5262,5264,5267],{"className":5263},[4667],[78,5265,5245],{"className":5266},[4667,4678],[78,5268,5270],{"className":5269},[4689],[78,5271,5273,5294],{"className":5272},[4693,4694],[78,5274,5276,5291],{"className":5275},[4698],[78,5277,5280],{"className":5278,"style":5279},[4702],"height:0.1514em;",[78,5281,5282,5285],{"style":4706},[78,5283],{"className":5284,"style":4711},[4710],[78,5286,5288],{"className":5287},[4715,4716,4717,4718],[78,5289,5079],{"className":5290,"style":5187},[4667,4678,4718],[78,5292,4726],{"className":5293},[4725],[78,5295,5297],{"className":5296},[4698],[78,5298,5300],{"className":5299,"style":4733},[4702],[78,5301],{}," 的向量，同时一次性查询多个 Query，同样将多个 Query 对应的词向量堆叠在一起形成矩阵 Q，得到公式：",[78,5304,5306],{"className":5305},[4566],[78,5307,5309,5383],{"className":5308},[4570],[78,5310,5312],{"className":5311},[4574],[4576,5313,5314],{"xmlns":4578,"display":4579},[4581,5315,5316,5380],{},[4584,5317,5318,5320,5322,5324,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346,5348,5350,5352,5354,5356,5358,5360,5362,5364,5366,5368,5370,5376,5378],{},[4596,5319,5009],{},[4596,5321,5012],{},[4596,5323,5012],{},[4596,5325,4618],{},[4596,5327,19],{},[4596,5329,5012],{},[4596,5331,39],{},[4596,5333,5025],{},[4596,5335,19],{},[4591,5337,4594],{"stretchy":4593},[4596,5339,5032],{},[4591,5341,2066],{"separator":1419},[4596,5343,5037],{},[4591,5345,2066],{"separator":1419},[4596,5347,5042],{},[4591,5349,4604],{"stretchy":4593},[4591,5351,4609],{},[4596,5353,262],{},[4596,5355,5025],{},[4596,5357,5053],{},[4596,5359,5012],{},[4596,5361,5058],{},[4596,5363,5009],{},[4596,5365,4598],{},[4591,5367,4594],{"stretchy":4593},[4596,5369,5032],{},[4614,5371,5372,5374],{},[4596,5373,5037],{},[4596,5375,5074],{},[4591,5377,4604],{"stretchy":4593},[4596,5379,5042],{},[4647,5381,5382],{"encoding":4649},"attention(Q,K,V) = softmax(QK^T)V",[78,5384,5386,5452],{"className":5385,"ariaHidden":1419},[4654],[78,5387,5389,5392,5395,5398,5401,5404,5407,5410,5413,5416,5419,5422,5425,5428,5431,5434,5437,5440,5443,5446,5449],{"className":5388},[4658],[78,5390],{"className":5391,"style":4663},[4662],[78,5393,5009],{"className":5394},[4667,4678],[78,5396,5098],{"className":5397},[4667,4678],[78,5399,4618],{"className":5400},[4667,4678],[78,5402,19],{"className":5403},[4667,4678],[78,5405,5012],{"className":5406},[4667,4678],[78,5408,39],{"className":5409},[4667,4678],[78,5411,5025],{"className":5412},[4667,4678],[78,5414,19],{"className":5415},[4667,4678],[78,5417,4594],{"className":5418},[4674],[78,5420,5032],{"className":5421},[4667,4678],[78,5423,2066],{"className":5424},[5126],[78,5426],{"className":5427,"style":4839},[4739],[78,5429,5037],{"className":5430,"style":5133},[4667,4678],[78,5432,2066],{"className":5433},[5126],[78,5435],{"className":5436,"style":4839},[4739],[78,5438,5042],{"className":5439,"style":5143},[4667,4678],[78,5441,4604],{"className":5442},[4682],[78,5444],{"className":5445,"style":4740},[4739],[78,5447,4609],{"className":5448},[4744],[78,5450],{"className":5451,"style":4740},[4739],[78,5453,5455,5458,5461,5464,5467,5470,5473,5476,5479,5508,5511],{"className":5454},[4658],[78,5456],{"className":5457,"style":5162},[4662],[78,5459,5166],{"className":5460},[4667,4678],[78,5462,5053],{"className":5463,"style":5170},[4667,4678],[78,5465,5012],{"className":5466},[4667,4678],[78,5468,5177],{"className":5469},[4667,4678],[78,5471,4598],{"className":5472},[4667,4678],[78,5474,4594],{"className":5475},[4674],[78,5477,5032],{"className":5478},[4667,4678],[78,5480,5482,5485],{"className":5481},[4667],[78,5483,5037],{"className":5484,"style":5133},[4667,4678],[78,5486,5488],{"className":5487},[4689],[78,5489,5491],{"className":5490},[4693],[78,5492,5494],{"className":5493},[4698],[78,5495,5497],{"className":5496,"style":5206},[4702],[78,5498,5499,5502],{"style":5209},[78,5500],{"className":5501,"style":4711},[4710],[78,5503,5505],{"className":5504},[4715,4716,4717,4718],[78,5506,5074],{"className":5507,"style":5219},[4667,4678,4718],[78,5509,4604],{"className":5510},[4682],[78,5512,5042],{"className":5513,"style":5143},[4667,4678],[13,5515,5516,5517,5590],{},"如果 Q 和 K 对应的维度 ",[78,5518,5520,5539],{"className":5519},[4570],[78,5521,5523],{"className":5522},[4574],[4576,5524,5525],{"xmlns":4578},[4581,5526,5527,5536],{},[4584,5528,5529],{},[4600,5530,5531,5533],{},[4596,5532,5245],{},[4596,5534,5535],{},"k",[4647,5537,5538],{"encoding":4649},"d_k",[78,5540,5542],{"className":5541,"ariaHidden":1419},[4654],[78,5543,5545,5548],{"className":5544},[4658],[78,5546],{"className":5547,"style":5260},[4662],[78,5549,5551,5554],{"className":5550},[4667],[78,5552,5245],{"className":5553},[4667,4678],[78,5555,5557],{"className":5556},[4689],[78,5558,5560,5582],{"className":5559},[4693,4694],[78,5561,5563,5579],{"className":5562},[4698],[78,5564,5567],{"className":5565,"style":5566},[4702],"height:0.3361em;",[78,5568,5569,5572],{"style":4706},[78,5570],{"className":5571,"style":4711},[4710],[78,5573,5575],{"className":5574},[4715,4716,4717,4718],[78,5576,5535],{"className":5577,"style":5578},[4667,4678,4718],"margin-right:0.0315em;",[78,5580,4726],{"className":5581},[4725],[78,5583,5585],{"className":5584},[4698],[78,5586,5588],{"className":5587,"style":4733},[4702],[78,5589],{}," 比较大，softmax 放缩时就非常容易受影响，使不同值之间的差异较大，从而影响梯度的稳定性。因此，我们要将 Q 和 K 乘积的结果做一个放缩：",[78,5592,5594],{"className":5593},[4566],[78,5595,5597,5684],{"className":5596},[4570],[78,5598,5600],{"className":5599},[4574],[4576,5601,5602],{"xmlns":4578,"display":4579},[4581,5603,5604,5681],{},[4584,5605,5606,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626,5628,5630,5632,5634,5636,5638,5640,5642,5644,5646,5648,5650,5652,5654,5656,5677,5679],{},[4596,5607,5009],{},[4596,5609,5012],{},[4596,5611,5012],{},[4596,5613,4618],{},[4596,5615,19],{},[4596,5617,5012],{},[4596,5619,39],{},[4596,5621,5025],{},[4596,5623,19],{},[4591,5625,4594],{"stretchy":4593},[4596,5627,5032],{},[4591,5629,2066],{"separator":1419},[4596,5631,5037],{},[4591,5633,2066],{"separator":1419},[4596,5635,5042],{},[4591,5637,4604],{"stretchy":4593},[4591,5639,4609],{},[4596,5641,262],{},[4596,5643,5025],{},[4596,5645,5053],{},[4596,5647,5012],{},[4596,5649,5058],{},[4596,5651,5009],{},[4596,5653,4598],{},[4591,5655,4594],{"stretchy":4593},[4611,5657,5658,5668],{},[4584,5659,5660,5662],{},[4596,5661,5032],{},[4614,5663,5664,5666],{},[4596,5665,5037],{},[4596,5667,5074],{},[5669,5670,5671],"msqrt",{},[4600,5672,5673,5675],{},[4596,5674,5245],{},[4596,5676,5535],{},[4591,5678,4604],{"stretchy":4593},[4596,5680,5042],{},[4647,5682,5683],{"encoding":4649},"attention(Q,K,V) = softmax(\\frac{QK^T}{\\sqrt{d_k}})V",[78,5685,5687,5753],{"className":5686,"ariaHidden":1419},[4654],[78,5688,5690,5693,5696,5699,5702,5705,5708,5711,5714,5717,5720,5723,5726,5729,5732,5735,5738,5741,5744,5747,5750],{"className":5689},[4658],[78,5691],{"className":5692,"style":4663},[4662],[78,5694,5009],{"className":5695},[4667,4678],[78,5697,5098],{"className":5698},[4667,4678],[78,5700,4618],{"className":5701},[4667,4678],[78,5703,19],{"className":5704},[4667,4678],[78,5706,5012],{"className":5707},[4667,4678],[78,5709,39],{"className":5710},[4667,4678],[78,5712,5025],{"className":5713},[4667,4678],[78,5715,19],{"className":5716},[4667,4678],[78,5718,4594],{"className":5719},[4674],[78,5721,5032],{"className":5722},[4667,4678],[78,5724,2066],{"className":5725},[5126],[78,5727],{"className":5728,"style":4839},[4739],[78,5730,5037],{"className":5731,"style":5133},[4667,4678],[78,5733,2066],{"className":5734},[5126],[78,5736],{"className":5737,"style":4839},[4739],[78,5739,5042],{"className":5740,"style":5143},[4667,4678],[78,5742,4604],{"className":5743},[4682],[78,5745],{"className":5746,"style":4740},[4739],[78,5748,4609],{"className":5749},[4744],[78,5751],{"className":5752,"style":4740},[4739],[78,5754,5756,5760,5763,5766,5769,5772,5775,5778,5971,5974],{"className":5755},[4658],[78,5757],{"className":5758,"style":5759},[4662],"height:2.4483em;vertical-align:-0.93em;",[78,5761,5166],{"className":5762},[4667,4678],[78,5764,5053],{"className":5765,"style":5170},[4667,4678],[78,5767,5012],{"className":5768},[4667,4678],[78,5770,5177],{"className":5771},[4667,4678],[78,5773,4598],{"className":5774},[4667,4678],[78,5776,4594],{"className":5777},[4674],[78,5779,5781,5784,5968],{"className":5780},[4667],[78,5782],{"className":5783},[4674,4761],[78,5785,5787],{"className":5786},[4611],[78,5788,5790,5959],{"className":5789},[4693,4694],[78,5791,5793,5956],{"className":5792},[4698],[78,5794,5797,5907,5915],{"className":5795,"style":5796},[4702],"height:1.5183em;",[78,5798,5800,5803],{"style":5799},"top:-2.2528em;",[78,5801],{"className":5802,"style":4781},[4710],[78,5804,5806],{"className":5805},[4667],[78,5807,5810],{"className":5808},[4667,5809],"sqrt",[78,5811,5813,5898],{"className":5812},[4693,4694],[78,5814,5816,5895],{"className":5815},[4698],[78,5817,5820,5872],{"className":5818,"style":5819},[4702],"height:0.8572em;",[78,5821,5825,5828],{"className":5822,"style":5824},[5823],"svg-align","top:-3em;",[78,5826],{"className":5827,"style":4781},[4710],[78,5829,5832],{"className":5830,"style":5831},[4667],"padding-left:0.833em;",[78,5833,5835,5838],{"className":5834},[4667],[78,5836,5245],{"className":5837},[4667,4678],[78,5839,5841],{"className":5840},[4689],[78,5842,5844,5864],{"className":5843},[4693,4694],[78,5845,5847,5861],{"className":5846},[4698],[78,5848,5850],{"className":5849,"style":5566},[4702],[78,5851,5852,5855],{"style":4706},[78,5853],{"className":5854,"style":4711},[4710],[78,5856,5858],{"className":5857},[4715,4716,4717,4718],[78,5859,5535],{"className":5860,"style":5578},[4667,4678,4718],[78,5862,4726],{"className":5863},[4725],[78,5865,5867],{"className":5866},[4698],[78,5868,5870],{"className":5869,"style":4733},[4702],[78,5871],{},[78,5873,5875,5878],{"style":5874},"top:-2.8172em;",[78,5876],{"className":5877,"style":4781},[4710],[78,5879,5883],{"className":5880,"style":5882},[5881],"hide-tail","min-width:0.853em;height:1.08em;",[5884,5885,5891],"svg",{"xmlns":5886,"width":5887,"height":5888,"viewBox":5889,"preserveAspectRatio":5890},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","400em","1.08em","0 0 400000 1080","xMinYMin slice",[5892,5893],"path",{"d":5894},"M95,702\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl0 -0\nc5.3,-9.3,12,-14,20,-14\nH400000v40H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM834 80h400000v40h-400000z",[78,5896,4726],{"className":5897},[4725],[78,5899,5901],{"className":5900},[4698],[78,5902,5905],{"className":5903,"style":5904},[4702],"height:0.1828em;",[78,5906],{},[78,5908,5909,5912],{"style":4919},[78,5910],{"className":5911,"style":4781},[4710],[78,5913],{"className":5914,"style":4927},[4926],[78,5916,5917,5920],{"style":4930},[78,5918],{"className":5919,"style":4781},[4710],[78,5921,5923,5926],{"className":5922},[4667],[78,5924,5032],{"className":5925},[4667,4678],[78,5927,5929,5932],{"className":5928},[4667],[78,5930,5037],{"className":5931,"style":5133},[4667,4678],[78,5933,5935],{"className":5934},[4689],[78,5936,5938],{"className":5937},[4693],[78,5939,5941],{"className":5940},[4698],[78,5942,5945],{"className":5943,"style":5944},[4702],"height:0.8413em;",[78,5946,5947,5950],{"style":4958},[78,5948],{"className":5949,"style":4711},[4710],[78,5951,5953],{"className":5952},[4715,4716,4717,4718],[78,5954,5074],{"className":5955,"style":5219},[4667,4678,4718],[78,5957,4726],{"className":5958},[4725],[78,5960,5962],{"className":5961},[4698],[78,5963,5966],{"className":5964,"style":5965},[4702],"height:0.93em;",[78,5967],{},[78,5969],{"className":5970},[4682,4761],[78,5972,4604],{"className":5973},[4682],[78,5975,5042],{"className":5976,"style":5143},[4667,4678],[114,5978,5980],{"className":116,"code":5979,"language":118,"meta":119,"style":119},"'''注意力计算函数'''\ndef attention(query, key, value, dropout=None):\n    '''\n    args:\n    query: 查询值矩阵\n    key: 键值矩阵\n    value: 真值矩阵\n    '''\n    # 获取键向量的维度，键向量的维度和值向量的维度相同\n    d_k = query.size(-1) \n    # 计算Q与K的内积并除以根号dk\n    # transpose——相当于转置\n    scores = torch.matmul(query, key.transpose(-2, -1)) \u002F math.sqrt(d_k)\n    # Softmax\n    p_attn = scores.softmax(dim=-1)\n    if dropout is not None:\n        p_attn = dropout(p_attn)\n        # 采样\n     # 根据计算结果对value进行加权求和\n    return torch.matmul(p_attn, value), p_attn\n",[17,5981,5982,5987,5992,5997,6002,6007,6012,6017,6021,6026,6031,6036,6041,6046,6051,6056,6061,6066,6071,6076],{"__ignoreMap":119},[78,5983,5984],{"class":124,"line":125},[78,5985,5986],{},"'''注意力计算函数'''\n",[78,5988,5989],{"class":124,"line":132},[78,5990,5991],{},"def attention(query, key, value, dropout=None):\n",[78,5993,5994],{"class":124,"line":138},[78,5995,5996],{},"    '''\n",[78,5998,5999],{"class":124,"line":144},[78,6000,6001],{},"    args:\n",[78,6003,6004],{"class":124,"line":150},[78,6005,6006],{},"    query: 查询值矩阵\n",[78,6008,6009],{"class":124,"line":156},[78,6010,6011],{},"    key: 键值矩阵\n",[78,6013,6014],{"class":124,"line":162},[78,6015,6016],{},"    value: 真值矩阵\n",[78,6018,6019],{"class":124,"line":168},[78,6020,5996],{},[78,6022,6023],{"class":124,"line":174},[78,6024,6025],{},"    # 获取键向量的维度，键向量的维度和值向量的维度相同\n",[78,6027,6028],{"class":124,"line":180},[78,6029,6030],{},"    d_k = query.size(-1) \n",[78,6032,6033],{"class":124,"line":186},[78,6034,6035],{},"    # 计算Q与K的内积并除以根号dk\n",[78,6037,6038],{"class":124,"line":192},[78,6039,6040],{},"    # transpose——相当于转置\n",[78,6042,6043],{"class":124,"line":198},[78,6044,6045],{},"    scores = torch.matmul(query, key.transpose(-2, -1)) \u002F math.sqrt(d_k)\n",[78,6047,6048],{"class":124,"line":204},[78,6049,6050],{},"    # Softmax\n",[78,6052,6053],{"class":124,"line":210},[78,6054,6055],{},"    p_attn = scores.softmax(dim=-1)\n",[78,6057,6058],{"class":124,"line":216},[78,6059,6060],{},"    if dropout is not None:\n",[78,6062,6063],{"class":124,"line":222},[78,6064,6065],{},"        p_attn = dropout(p_attn)\n",[78,6067,6068],{"class":124,"line":421},[78,6069,6070],{},"        # 采样\n",[78,6072,6073],{"class":124,"line":427},[78,6074,6075],{},"     # 根据计算结果对value进行加权求和\n",[78,6077,6078],{"class":124,"line":433},[78,6079,6080],{},"    return torch.matmul(p_attn, value), p_attn\n",[107,6082,6084],{"id":6083},"self-attention-自注意力","Self-Attention 自注意力",[13,6086,6087],{},"在我们的实际应用中，我们往往只需要计算 Query 和 Key 之间的注意力结果，很少存在额外的真值 Value。也就是说，我们其实只需要拟合两个文本序列。在经典的 注意力机制中，Q 往往来自于一个序列，K 与 V 来自于另一个序列，都通过参数矩阵计算得到，从而可以拟合这两个序列之间的关系。例如在 Transformer 的 Decoder 结构中，Q 来自于 Decoder 的输入，K 与 V 来自于 Encoder 的输出，从而拟合了编码信息与历史信息之间的关系，便于综合这两种信息实现未来的预测。",[13,6089,6090,6091,6268],{},"在 Transformer 的 Encoder 结构中，使用的是 注意力机制的变种 —— 自注意力（self-attention）机制。所谓自注意力，即是计算本身序列中每个元素对其他元素的注意力分布，即在计算过程中，Q、K、V 都由同一个输入通过不同的参数矩阵计算得到。在 Encoder 中，Q、K、V 分别是输入对参数矩阵 ",[78,6092,6094,6129],{"className":6093},[4570],[78,6095,6097],{"className":6096},[4574],[4576,6098,6099],{"xmlns":4578},[4581,6100,6101,6126],{},[4584,6102,6103,6110,6112,6118,6120],{},[4600,6104,6105,6108],{},[4596,6106,6107],{},"W",[4596,6109,5067],{},[4587,6111,1011],{},[4600,6113,6114,6116],{},[4596,6115,6107],{},[4596,6117,5535],{},[4587,6119,1011],{},[4600,6121,6122,6124],{},[4596,6123,6107],{},[4596,6125,5079],{},[4647,6127,6128],{"encoding":4649},"W_q、W_k、W_v",[78,6130,6132],{"className":6131,"ariaHidden":1419},[4654],[78,6133,6135,6139,6181,6185,6225,6228],{"className":6134},[4658],[78,6136],{"className":6137,"style":6138},[4662],"height:0.9694em;vertical-align:-0.2861em;",[78,6140,6142,6145],{"className":6141},[4667],[78,6143,6107],{"className":6144,"style":5219},[4667,4678],[78,6146,6148],{"className":6147},[4689],[78,6149,6151,6172],{"className":6150},[4693,4694],[78,6152,6154,6169],{"className":6153},[4698],[78,6155,6157],{"className":6156,"style":5279},[4702],[78,6158,6160,6163],{"style":6159},"top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;",[78,6161],{"className":6162,"style":4711},[4710],[78,6164,6166],{"className":6165},[4715,4716,4717,4718],[78,6167,5067],{"className":6168,"style":5187},[4667,4678,4718],[78,6170,4726],{"className":6171},[4725],[78,6173,6175],{"className":6174},[4698],[78,6176,6179],{"className":6177,"style":6178},[4702],"height:0.2861em;",[78,6180],{},[78,6182,1011],{"className":6183},[4667,6184],"cjk_fallback",[78,6186,6188,6191],{"className":6187},[4667],[78,6189,6107],{"className":6190,"style":5219},[4667,4678],[78,6192,6194],{"className":6193},[4689],[78,6195,6197,6217],{"className":6196},[4693,4694],[78,6198,6200,6214],{"className":6199},[4698],[78,6201,6203],{"className":6202,"style":5566},[4702],[78,6204,6205,6208],{"style":6159},[78,6206],{"className":6207,"style":4711},[4710],[78,6209,6211],{"className":6210},[4715,4716,4717,4718],[78,6212,5535],{"className":6213,"style":5578},[4667,4678,4718],[78,6215,4726],{"className":6216},[4725],[78,6218,6220],{"className":6219},[4698],[78,6221,6223],{"className":6222,"style":4733},[4702],[78,6224],{},[78,6226,1011],{"className":6227},[4667,6184],[78,6229,6231,6234],{"className":6230},[4667],[78,6232,6107],{"className":6233,"style":5219},[4667,4678],[78,6235,6237],{"className":6236},[4689],[78,6238,6240,6260],{"className":6239},[4693,4694],[78,6241,6243,6257],{"className":6242},[4698],[78,6244,6246],{"className":6245,"style":5279},[4702],[78,6247,6248,6251],{"style":6159},[78,6249],{"className":6250,"style":4711},[4710],[78,6252,6254],{"className":6253},[4715,4716,4717,4718],[78,6255,5079],{"className":6256,"style":5187},[4667,4678,4718],[78,6258,4726],{"className":6259},[4725],[78,6261,6263],{"className":6262},[4698],[78,6264,6266],{"className":6265,"style":4733},[4702],[78,6267],{}," 做积得到，从而拟合输入语句中每一个 token 对其他所有 token 的关系。",[13,6270,6271],{},"通过自注意力机制，我们可以找到一段文本中每一个 token 与其他所有 token 的相关关系大小，从而建模文本之间的依赖关系。在代码中的实现，self-attention 机制其实是通过给 Q、K、V 的输入传入同一个参数实现的：",[114,6273,6275],{"className":116,"code":6274,"language":118,"meta":119,"style":119},"# attention 为上文定义的注意力计算函数\nattention(x, x, x)\n",[17,6276,6277,6282],{"__ignoreMap":119},[78,6278,6279],{"class":124,"line":125},[78,6280,6281],{},"# attention 为上文定义的注意力计算函数\n",[78,6283,6284],{"class":124,"line":132},[78,6285,6286],{},"attention(x, x, x)\n",[107,6288,6290],{"id":6289},"mask-self-attention-掩码自注意力","Mask Self-Attention 掩码自注意力",[13,6292,6293],{},"掩码的作用是遮蔽一些特定位置的 token，模型在学习的过程中，会忽略掉被遮蔽的 token。",[13,6295,6296],{},"使用注意力掩码的核心动机是让模型只能使用历史信息进行预测而不能看到未来信息。使用注意力机制的 Transformer 模型也是通过类似于 n-gram 的语言模型任务来学习的，也就是对一个文本序列，不断根据之前的 token 来预测下一个 token，直到将整个文本序列补全。上述过程是一个串行的过程，也就是需要先完成 Step 1，才能做 Step 2，接下来逐步完成整个序列的补全。Transformer 相对于 RNN 的核心优势之一即在于其可以并行计算，具有更高的计算效率。如果对于每一个训练语料，模型都需要串行完成上述过程才能完成学习，那么很明显没有做到并行计算，计算效率很低。",[13,6298,6299],{},"针对这个问题，Transformer 就提出了掩码自注意力的方法。掩码自注意力会生成一串掩码，来遮蔽未来信息。在每一行输入中，模型仍然是只看到前面的 token，预测下一个 token。但是注意，上述输入不再是串行的过程，而可以一起并行地输入到模型中，模型只需要每一个样本根据未被遮蔽的 token 来预测下一个 token 即可，从而实现了并行的语言模型。",[114,6301,6303],{"className":116,"code":6302,"language":118,"meta":119,"style":119},"# 创建一个上三角矩阵，用于遮蔽未来信息。\n# 先通过 full 函数创建一个 1 * seq_len * seq_len 的矩阵\nmask = torch.full((1, args.max_seq_len, args.max_seq_len), float(\"-inf\"))\n# triu 函数的功能是创建一个上三角矩阵\n# 此处的 scores 为计算得到的注意力分数，mask 为上文生成的掩码矩阵\nscores = scores + mask[:, :seqlen, :seqlen]\nscores = F.softmax(scores.float(), dim=-1).type_as(xq)\nmask = torch.triu(mask, diagonal=1)\n",[17,6304,6305,6310,6315,6320,6325,6330,6335,6340],{"__ignoreMap":119},[78,6306,6307],{"class":124,"line":125},[78,6308,6309],{},"# 创建一个上三角矩阵，用于遮蔽未来信息。\n",[78,6311,6312],{"class":124,"line":132},[78,6313,6314],{},"# 先通过 full 函数创建一个 1 * seq_len * seq_len 的矩阵\n",[78,6316,6317],{"class":124,"line":138},[78,6318,6319],{},"mask = torch.full((1, args.max_seq_len, args.max_seq_len), float(\"-inf\"))\n",[78,6321,6322],{"class":124,"line":144},[78,6323,6324],{},"# triu 函数的功能是创建一个上三角矩阵\n",[78,6326,6327],{"class":124,"line":150},[78,6328,6329],{},"# 此处的 scores 为计算得到的注意力分数，mask 为上文生成的掩码矩阵\n",[78,6331,6332],{"class":124,"line":156},[78,6333,6334],{},"scores = scores + mask[:, :seqlen, :seqlen]\n",[78,6336,6337],{"class":124,"line":162},[78,6338,6339],{},"scores = F.softmax(scores.float(), dim=-1).type_as(xq)\n",[78,6341,6342],{"class":124,"line":168},[78,6343,6344],{},"mask = torch.triu(mask, diagonal=1)\n",[13,6346,6347,6348,6351,6352,6354],{},"通过做求和，上三角区域（也就是应该被遮蔽的 token 对应的位置）的注意力分数结果都变成了 ",[17,6349,6350],{},"-inf","，而下三角区域的分数不变。再做 Softmax 操作，",[17,6353,6350],{}," 的值在经过 Softmax 之后会被置为 0，从而忽略了上三角区域计算的注意力分数，从而实现了注意力遮蔽。",[107,6356,6358],{"id":6357},"multi-head-attention-多头注意力机制","Multi-Head Attention 多头注意力机制",[13,6360,6361],{},"注意力机制可以实现并行化与长期依赖关系拟合，但一次注意力计算只能拟合一种相关关系，单一的注意力机制很难全面拟合语句序列里的相关关系。因此 Transformer 使用了多头注意力机制（Multi-Head Attention），即同时对一个语料进行多次注意力计算，每次注意力计算都能拟合不同的关系，将最后的多次结果拼接起来作为最后的输出，即可更全面深入地拟合语言信息。",[13,6363,6364],{},"事实上，所谓的多头注意力机制其实就是将原始的输入序列进行多组的自注意力处理；然后再将每一组得到的自注意力结果拼接起来，再通过一个线性层进行处理，得到最终的输出。",[226,6366,228],{},{"title":119,"searchDepth":144,"depth":144,"links":6368},[6369,6370,6371,6372,6373],{"id":4522,"depth":132,"text":4523},{"id":4555,"depth":132,"text":4556},{"id":6083,"depth":132,"text":6084},{"id":6289,"depth":132,"text":6290},{"id":6357,"depth":132,"text":6358},"2026-02-26",{},"\u002Flegacy-blog\u002F1772091314596",{"title":4513,"description":119},"legacy-blog\u002F1772091314596",[794,6380],"软件工程","Yyf4k9XsKylZKNkTkZlppVhlLLoHMIgnhKU2RtFoaW0",{"id":6383,"title":6384,"assetBase":239,"author":8,"body":6385,"category":787,"collection":233,"date":6374,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":7739,"navigation":128,"originalPath":239,"path":7740,"seo":7741,"source":243,"stem":7742,"tags":7743,"weight":250,"__hash__":7745},"content\u002Flegacy-blog\u002F1772091473887.md","Transformers Base",{"type":10,"value":6386,"toc":7731},[6387,6391,6396,6400,6403,6406,6409,6508,6575,6578,6705,6769,6773,6776,6858,6861,6865,6868,6871,6874,6888,6891,6894,6972,6976,6979,6982,7007,7010,7014,7017,7020,7023,7032,7036,7039,7042,7045,7316,7593,7596,7604,7729],[4517,6388,6390],{"id":6389},"transformers","Transformers",[13,6392,6393],{},[617,6394],{"alt":619,"src":6395},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_17720915124995.png",[107,6397,6399],{"id":6398},"encoder-decoder","Encoder & Decoder",[13,6401,6402],{},"所谓编码，就是将输入的自然语言序列通过隐藏层编码成能够表征语义的向量（或矩阵），可以简单理解为更复杂的词向量表示。而解码，就是对输入的自然语言序列编码得到的向量或矩阵通过隐藏层输出，再解码成对应的自然语言目标序列。通过编码再解码，就可以实现 Seq2Seq 任务。",[13,6404,6405],{},"Transformer 中的 Encoder，就是用于上述的编码过程；Decoder 则用于上述的解码过程。",[13,6407,6408],{},"Encoder 由 N 个 Encoder Layer 组成，每一个 Encoder Layer 包括一个注意力层和一个前馈神经网络，在最后会加入一个 Layer Norm 实现规范化。",[114,6410,6412],{"className":116,"code":6411,"language":118,"meta":119,"style":119},"class EncoderLayer(nn.Module):\n  '''Encoder层'''\n    def __init__(self, args):\n        super().__init__()\n        # 一个 Layer 中有两个 LayerNorm，分别在 Attention 之前和 MLP 之前\n        self.attention_norm = LayerNorm(args.n_embd)\n        # Encoder 不需要掩码，传入 is_causal=False\n        self.attention = MultiHeadAttention(args, is_causal=False)\n        self.fnn_norm = LayerNorm(args.n_embd)\n        self.feed_forward = MLP(args.dim, args.dim, args.dropout)\n\n    def forward(self, x):\n        # Layer Norm\n        norm_x = self.attention_norm(x)\n        # 自注意力\n        h = x + self.attention.forward(norm_x, norm_x, norm_x)\n        # 经过前馈神经网络\n        out = h + self.feed_forward.forward(self.fnn_norm(h))\n        return out\n",[17,6413,6414,6419,6424,6429,6434,6439,6444,6449,6454,6459,6464,6468,6473,6478,6483,6488,6493,6498,6503],{"__ignoreMap":119},[78,6415,6416],{"class":124,"line":125},[78,6417,6418],{},"class EncoderLayer(nn.Module):\n",[78,6420,6421],{"class":124,"line":132},[78,6422,6423],{},"  '''Encoder层'''\n",[78,6425,6426],{"class":124,"line":138},[78,6427,6428],{},"    def __init__(self, args):\n",[78,6430,6431],{"class":124,"line":144},[78,6432,6433],{},"        super().__init__()\n",[78,6435,6436],{"class":124,"line":150},[78,6437,6438],{},"        # 一个 Layer 中有两个 LayerNorm，分别在 Attention 之前和 MLP 之前\n",[78,6440,6441],{"class":124,"line":156},[78,6442,6443],{},"        self.attention_norm = LayerNorm(args.n_embd)\n",[78,6445,6446],{"class":124,"line":162},[78,6447,6448],{},"        # Encoder 不需要掩码，传入 is_causal=False\n",[78,6450,6451],{"class":124,"line":168},[78,6452,6453],{},"        self.attention = MultiHeadAttention(args, is_causal=False)\n",[78,6455,6456],{"class":124,"line":174},[78,6457,6458],{},"        self.fnn_norm = LayerNorm(args.n_embd)\n",[78,6460,6461],{"class":124,"line":180},[78,6462,6463],{},"        self.feed_forward = MLP(args.dim, args.dim, args.dropout)\n",[78,6465,6466],{"class":124,"line":186},[78,6467,129],{"emptyLinePlaceholder":128},[78,6469,6470],{"class":124,"line":192},[78,6471,6472],{},"    def forward(self, x):\n",[78,6474,6475],{"class":124,"line":198},[78,6476,6477],{},"        # Layer Norm\n",[78,6479,6480],{"class":124,"line":204},[78,6481,6482],{},"        norm_x = self.attention_norm(x)\n",[78,6484,6485],{"class":124,"line":210},[78,6486,6487],{},"        # 自注意力\n",[78,6489,6490],{"class":124,"line":216},[78,6491,6492],{},"        h = x + self.attention.forward(norm_x, norm_x, norm_x)\n",[78,6494,6495],{"class":124,"line":222},[78,6496,6497],{},"        # 经过前馈神经网络\n",[78,6499,6500],{"class":124,"line":421},[78,6501,6502],{},"        out = h + self.feed_forward.forward(self.fnn_norm(h))\n",[78,6504,6505],{"class":124,"line":427},[78,6506,6507],{},"        return out\n",[114,6509,6511],{"className":116,"code":6510,"language":118,"meta":119,"style":119},"class Encoder(nn.Module):\n    '''Encoder 块'''\n    def __init__(self, args):\n        super(Encoder, self).__init__() \n        # 一个 Encoder 由 N 个 Encoder Layer 组成\n        self.layers = nn.ModuleList([EncoderLayer(args) for _ in range(args.n_layer)])\n        self.norm = LayerNorm(args.n_embd)\n\n    def forward(self, x):\n        \"分别通过 N 层 Encoder Layer\"\n        for layer in self.layers:\n            x = layer(x)\n        return self.norm(x)\n",[17,6512,6513,6518,6523,6527,6532,6537,6542,6547,6551,6555,6560,6565,6570],{"__ignoreMap":119},[78,6514,6515],{"class":124,"line":125},[78,6516,6517],{},"class Encoder(nn.Module):\n",[78,6519,6520],{"class":124,"line":132},[78,6521,6522],{},"    '''Encoder 块'''\n",[78,6524,6525],{"class":124,"line":138},[78,6526,6428],{},[78,6528,6529],{"class":124,"line":144},[78,6530,6531],{},"        super(Encoder, self).__init__() \n",[78,6533,6534],{"class":124,"line":150},[78,6535,6536],{},"        # 一个 Encoder 由 N 个 Encoder Layer 组成\n",[78,6538,6539],{"class":124,"line":156},[78,6540,6541],{},"        self.layers = nn.ModuleList([EncoderLayer(args) for _ in range(args.n_layer)])\n",[78,6543,6544],{"class":124,"line":162},[78,6545,6546],{},"        self.norm = LayerNorm(args.n_embd)\n",[78,6548,6549],{"class":124,"line":168},[78,6550,129],{"emptyLinePlaceholder":128},[78,6552,6553],{"class":124,"line":174},[78,6554,6472],{},[78,6556,6557],{"class":124,"line":180},[78,6558,6559],{},"        \"分别通过 N 层 Encoder Layer\"\n",[78,6561,6562],{"class":124,"line":186},[78,6563,6564],{},"        for layer in self.layers:\n",[78,6566,6567],{"class":124,"line":192},[78,6568,6569],{},"            x = layer(x)\n",[78,6571,6572],{"class":124,"line":198},[78,6573,6574],{},"        return self.norm(x)\n",[13,6576,6577],{},"和 EncoderLayer 不同的是，DecoderLayer 由两个注意力层和一个前馈神经网络组成。第一个注意力层是一个掩码自注意力层，即使用 Mask 的注意力计算，保证每一个 token 只能使用该 token 之前的注意力分数；第二个注意力层是一个多头注意力层，该层将使用第一个注意力层的输出作为 query，使用 Encoder 的输出作为 key 和 value，来计算注意力分数。最后，再经过前馈神经网络。",[114,6579,6581],{"className":116,"code":6580,"language":118,"meta":119,"style":119},"class DecoderLayer(nn.Module):\n  '''解码层'''\n    def __init__(self, args):\n        super().__init__()\n        # 一个 Layer 中有三个 LayerNorm，分别在 Mask Attention 之前、Self Attention 之前和 MLP 之前\n        self.attention_norm_1 = LayerNorm(args.n_embd)\n        # Decoder 的第一个部分是 Mask Attention，传入 is_causal=True\n        self.mask_attention = MultiHeadAttention(args, is_causal=True)\n        self.attention_norm_2 = LayerNorm(args.n_embd)\n        # Decoder 的第二个部分是 类似于 Encoder 的 Attention，传入 is_causal=False\n        self.attention = MultiHeadAttention(args, is_causal=False)\n        self.ffn_norm = LayerNorm(args.n_embd)\n        # 第三个部分是 MLP\n        self.feed_forward = MLP(args.dim, args.dim, args.dropout)\n\n    def forward(self, x, enc_out):\n        # Layer Norm\n        norm_x = self.attention_norm_1(x)\n        # 掩码自注意力\n        x = x + self.mask_attention.forward(norm_x, norm_x, norm_x)\n        # 多头注意力\n        norm_x = self.attention_norm_2(x)\n        h = x + self.attention.forward(norm_x, enc_out, enc_out)\n        # 经过前馈神经网络\n        out = h + self.feed_forward.forward(self.ffn_norm(h))\n        return out\n",[17,6582,6583,6588,6593,6597,6601,6606,6611,6616,6621,6626,6631,6635,6640,6645,6649,6653,6658,6662,6667,6672,6677,6682,6687,6692,6696,6701],{"__ignoreMap":119},[78,6584,6585],{"class":124,"line":125},[78,6586,6587],{},"class DecoderLayer(nn.Module):\n",[78,6589,6590],{"class":124,"line":132},[78,6591,6592],{},"  '''解码层'''\n",[78,6594,6595],{"class":124,"line":138},[78,6596,6428],{},[78,6598,6599],{"class":124,"line":144},[78,6600,6433],{},[78,6602,6603],{"class":124,"line":150},[78,6604,6605],{},"        # 一个 Layer 中有三个 LayerNorm，分别在 Mask Attention 之前、Self Attention 之前和 MLP 之前\n",[78,6607,6608],{"class":124,"line":156},[78,6609,6610],{},"        self.attention_norm_1 = LayerNorm(args.n_embd)\n",[78,6612,6613],{"class":124,"line":162},[78,6614,6615],{},"        # Decoder 的第一个部分是 Mask Attention，传入 is_causal=True\n",[78,6617,6618],{"class":124,"line":168},[78,6619,6620],{},"        self.mask_attention = MultiHeadAttention(args, is_causal=True)\n",[78,6622,6623],{"class":124,"line":174},[78,6624,6625],{},"        self.attention_norm_2 = LayerNorm(args.n_embd)\n",[78,6627,6628],{"class":124,"line":180},[78,6629,6630],{},"        # Decoder 的第二个部分是 类似于 Encoder 的 Attention，传入 is_causal=False\n",[78,6632,6633],{"class":124,"line":186},[78,6634,6453],{},[78,6636,6637],{"class":124,"line":192},[78,6638,6639],{},"        self.ffn_norm = LayerNorm(args.n_embd)\n",[78,6641,6642],{"class":124,"line":198},[78,6643,6644],{},"        # 第三个部分是 MLP\n",[78,6646,6647],{"class":124,"line":204},[78,6648,6463],{},[78,6650,6651],{"class":124,"line":210},[78,6652,129],{"emptyLinePlaceholder":128},[78,6654,6655],{"class":124,"line":216},[78,6656,6657],{},"    def forward(self, x, enc_out):\n",[78,6659,6660],{"class":124,"line":222},[78,6661,6477],{},[78,6663,6664],{"class":124,"line":421},[78,6665,6666],{},"        norm_x = self.attention_norm_1(x)\n",[78,6668,6669],{"class":124,"line":427},[78,6670,6671],{},"        # 掩码自注意力\n",[78,6673,6674],{"class":124,"line":433},[78,6675,6676],{},"        x = x + self.mask_attention.forward(norm_x, norm_x, norm_x)\n",[78,6678,6679],{"class":124,"line":2443},[78,6680,6681],{},"        # 多头注意力\n",[78,6683,6684],{"class":124,"line":2448},[78,6685,6686],{},"        norm_x = self.attention_norm_2(x)\n",[78,6688,6689],{"class":124,"line":2454},[78,6690,6691],{},"        h = x + self.attention.forward(norm_x, enc_out, enc_out)\n",[78,6693,6694],{"class":124,"line":2460},[78,6695,6497],{},[78,6697,6698],{"class":124,"line":2465},[78,6699,6700],{},"        out = h + self.feed_forward.forward(self.ffn_norm(h))\n",[78,6702,6703],{"class":124,"line":2470},[78,6704,6507],{},[114,6706,6708],{"className":116,"code":6707,"language":118,"meta":119,"style":119},"class Decoder(nn.Module):\n    '''解码器'''\n    def __init__(self, args):\n        super(Decoder, self).__init__() \n        # 一个 Decoder 由 N 个 Decoder Layer 组成\n        self.layers = nn.ModuleList([DecoderLayer(args) for _ in range(args.n_layer)])\n        self.norm = LayerNorm(args.n_embd)\n\n    def forward(self, x, enc_out):\n        \"Pass the input (and mask) through each layer in turn.\"\n        for layer in self.layers:\n            x = layer(x, enc_out)\n        return self.norm(x)\n",[17,6709,6710,6715,6720,6724,6729,6734,6739,6743,6747,6751,6756,6760,6765],{"__ignoreMap":119},[78,6711,6712],{"class":124,"line":125},[78,6713,6714],{},"class Decoder(nn.Module):\n",[78,6716,6717],{"class":124,"line":132},[78,6718,6719],{},"    '''解码器'''\n",[78,6721,6722],{"class":124,"line":138},[78,6723,6428],{},[78,6725,6726],{"class":124,"line":144},[78,6727,6728],{},"        super(Decoder, self).__init__() \n",[78,6730,6731],{"class":124,"line":150},[78,6732,6733],{},"        # 一个 Decoder 由 N 个 Decoder Layer 组成\n",[78,6735,6736],{"class":124,"line":156},[78,6737,6738],{},"        self.layers = nn.ModuleList([DecoderLayer(args) for _ in range(args.n_layer)])\n",[78,6740,6741],{"class":124,"line":162},[78,6742,6546],{},[78,6744,6745],{"class":124,"line":168},[78,6746,129],{"emptyLinePlaceholder":128},[78,6748,6749],{"class":124,"line":174},[78,6750,6657],{},[78,6752,6753],{"class":124,"line":180},[78,6754,6755],{},"        \"Pass the input (and mask) through each layer in turn.\"\n",[78,6757,6758],{"class":124,"line":186},[78,6759,6564],{},[78,6761,6762],{"class":124,"line":192},[78,6763,6764],{},"            x = layer(x, enc_out)\n",[78,6766,6767],{"class":124,"line":198},[78,6768,6574],{},[107,6770,6772],{"id":6771},"fnn-前馈神经网络","FNN 前馈神经网络",[13,6774,6775],{},"前馈神经网络（Feed Forward Neural Network，FNN），每一层的神经元都和上下两层的每一个神经元完全连接的网络结构。每一个 Encoder Layer 都包含一个注意力机制和一个前馈神经网络。前馈神经网络的实现：",[114,6777,6779],{"className":116,"code":6778,"language":118,"meta":119,"style":119},"class MLP(nn.Module):\n    '''前馈神经网络'''\n    def __init__(self, dim: int, hidden_dim: int, dropout: float):\n        super().__init__()\n        # 定义第一层线性变换，从输入维度到隐藏维度\n        self.w1 = nn.Linear(dim, hidden_dim, bias=False)\n        # 定义第二层线性变换，从隐藏维度到输入维度\n        self.w2 = nn.Linear(hidden_dim, dim, bias=False)\n        # 定义dropout层，用于防止过拟合\n        self.dropout = nn.Dropout(dropout)\n\n    def forward(self, x):\n        # 前向传播函数\n        # 首先，输入x通过第一层线性变换和RELU激活函数\n        # 最后，通过第二层线性变换和dropout层\n        return self.dropout(self.w2(F.relu(self.w1(x))))\n",[17,6780,6781,6786,6791,6796,6800,6805,6810,6815,6820,6825,6830,6834,6838,6843,6848,6853],{"__ignoreMap":119},[78,6782,6783],{"class":124,"line":125},[78,6784,6785],{},"class MLP(nn.Module):\n",[78,6787,6788],{"class":124,"line":132},[78,6789,6790],{},"    '''前馈神经网络'''\n",[78,6792,6793],{"class":124,"line":138},[78,6794,6795],{},"    def __init__(self, dim: int, hidden_dim: int, dropout: float):\n",[78,6797,6798],{"class":124,"line":144},[78,6799,6433],{},[78,6801,6802],{"class":124,"line":150},[78,6803,6804],{},"        # 定义第一层线性变换，从输入维度到隐藏维度\n",[78,6806,6807],{"class":124,"line":156},[78,6808,6809],{},"        self.w1 = nn.Linear(dim, hidden_dim, bias=False)\n",[78,6811,6812],{"class":124,"line":162},[78,6813,6814],{},"        # 定义第二层线性变换，从隐藏维度到输入维度\n",[78,6816,6817],{"class":124,"line":168},[78,6818,6819],{},"        self.w2 = nn.Linear(hidden_dim, dim, bias=False)\n",[78,6821,6822],{"class":124,"line":174},[78,6823,6824],{},"        # 定义dropout层，用于防止过拟合\n",[78,6826,6827],{"class":124,"line":180},[78,6828,6829],{},"        self.dropout = nn.Dropout(dropout)\n",[78,6831,6832],{"class":124,"line":186},[78,6833,129],{"emptyLinePlaceholder":128},[78,6835,6836],{"class":124,"line":192},[78,6837,6472],{},[78,6839,6840],{"class":124,"line":198},[78,6841,6842],{},"        # 前向传播函数\n",[78,6844,6845],{"class":124,"line":204},[78,6846,6847],{},"        # 首先，输入x通过第一层线性变换和RELU激活函数\n",[78,6849,6850],{"class":124,"line":210},[78,6851,6852],{},"        # 最后，通过第二层线性变换和dropout层\n",[78,6854,6855],{"class":124,"line":216},[78,6856,6857],{},"        return self.dropout(self.w2(F.relu(self.w1(x))))\n",[13,6859,6860],{},"Transformer 的前馈神经网络是由两个线性层中间加一个 RELU 激活函数组成的，以及前馈神经网络还加入了一个 Dropout 层来防止过拟合。Dropout 层只在训练时开启，推理\u002F测试阶段关闭，所以许多Transformer结构示意图中不会画出该层。",[107,6862,6864],{"id":6863},"layer-norm-层归一化","Layer Norm 层归一化",[13,6866,6867],{},"层归一化（Layer Norm）是深度学习中经典的归一化操作。神经网络主流的归一化一般有两种，批归一化（Batch Norm）和层归一化（Layer Norm）。",[13,6869,6870],{},"归一化核心是为了让不同层输入的取值范围或者分布能够比较一致。由于深度神经网络中每一层的输入都是上一层的输出，因此多层传递下，对网络中较高的层，之前的所有神经层的参数变化会导致其输入的分布发生较大的改变。也就是说，随着神经网络参数的更新，各层的输出分布是不相同的，且差异会随着网络深度的增大而增大。但是，需要预测的条件分布始终是相同的，从而也就造成了预测的误差。因此，在深度神经网络中，往往需要归一化操作，将每一层的输入都归一化成标准正态分布。",[13,6872,6873],{},"批归一化是指在一个 mini-batch 上进行归一化，相当于对一个 batch 对样本拆分出来一部分，首先计算样本的均值，再计算样本的方差，最后，对每个样本的值减去均值再除以标准差来将这一个 mini-batch 的样本的分布转化为标准正态分布。但是，批归一化存在一些缺陷，例如：",[49,6875,6876,6879,6882,6885],{},[52,6877,6878],{},"当显存有限，mini-batch 较小时，Batch Norm 取的样本的均值和方差不能反映全局的统计分布信息，从而导致效果变差；",[52,6880,6881],{},"对于在时间维度展开的 RNN，不同句子的同一分布大概率不同，所以 Batch Norm 的归一化会失去意义；",[52,6883,6884],{},"在训练时，Batch Norm 需要保存每个 step 的统计信息（均值和方差）。在测试时，由于变长句子的特性，测试集可能出现比训练集更长的句子，所以对于后面位置的 step，是没有训练的统计量使用的；",[52,6886,6887],{},"应用 Batch Norm，每个 step 都需要去保存和计算 batch 统计量，耗时又耗力",[13,6889,6890],{},"因此，出现了在深度神经网络中更常用、效果更好的层归一化（Layer Norm）。相较于 Batch Norm 在每一层统计所有样本的均值和方差，Layer Norm 在每个样本上计算其所有层的均值和方差，从而使每个样本的分布达到稳定。Layer Norm 的归一化方式其实和 Batch Norm 是完全一样的，只是统计统计量的维度不同。",[13,6892,6893],{},"基于上述进行归一化的公式，我们可以实现一个 Layer Norm 层：",[114,6895,6897],{"className":116,"code":6896,"language":118,"meta":119,"style":119},"class LayerNorm(nn.Module):\n    ''' Layer Norm 层'''\n    def __init__(self, features, eps=1e-6):\n        super().__init__()\n        # 线性矩阵做映射\n        self.a_2 = nn.Parameter(torch.ones(features))\n        self.b_2 = nn.Parameter(torch.zeros(features))\n        self.eps = eps\n    \n    def forward(self, x):\n        # 在统计每个样本所有维度的值，求均值和方差\n        mean = x.mean(-1, keepdim=True) # mean: [bsz, max_len, 1]\n        std = x.std(-1, keepdim=True) # std: [bsz, max_len, 1]\n        # 注意这里也在最后一个维度发生了广播\n        return self.a_2 * (x - mean) \u002F (std + self.eps) + self.b_2\n",[17,6898,6899,6904,6909,6914,6918,6923,6928,6933,6938,6943,6947,6952,6957,6962,6967],{"__ignoreMap":119},[78,6900,6901],{"class":124,"line":125},[78,6902,6903],{},"class LayerNorm(nn.Module):\n",[78,6905,6906],{"class":124,"line":132},[78,6907,6908],{},"    ''' Layer Norm 层'''\n",[78,6910,6911],{"class":124,"line":138},[78,6912,6913],{},"    def __init__(self, features, eps=1e-6):\n",[78,6915,6916],{"class":124,"line":144},[78,6917,6433],{},[78,6919,6920],{"class":124,"line":150},[78,6921,6922],{},"        # 线性矩阵做映射\n",[78,6924,6925],{"class":124,"line":156},[78,6926,6927],{},"        self.a_2 = nn.Parameter(torch.ones(features))\n",[78,6929,6930],{"class":124,"line":162},[78,6931,6932],{},"        self.b_2 = nn.Parameter(torch.zeros(features))\n",[78,6934,6935],{"class":124,"line":168},[78,6936,6937],{},"        self.eps = eps\n",[78,6939,6940],{"class":124,"line":174},[78,6941,6942],{},"    \n",[78,6944,6945],{"class":124,"line":180},[78,6946,6472],{},[78,6948,6949],{"class":124,"line":186},[78,6950,6951],{},"        # 在统计每个样本所有维度的值，求均值和方差\n",[78,6953,6954],{"class":124,"line":192},[78,6955,6956],{},"        mean = x.mean(-1, keepdim=True) # mean: [bsz, max_len, 1]\n",[78,6958,6959],{"class":124,"line":198},[78,6960,6961],{},"        std = x.std(-1, keepdim=True) # std: [bsz, max_len, 1]\n",[78,6963,6964],{"class":124,"line":204},[78,6965,6966],{},"        # 注意这里也在最后一个维度发生了广播\n",[78,6968,6969],{"class":124,"line":210},[78,6970,6971],{},"        return self.a_2 * (x - mean) \u002F (std + self.eps) + self.b_2\n",[107,6973,6975],{"id":6974},"resnet-残差连接","ResNet 残差连接",[13,6977,6978],{},"由于 Transformer 模型结构较复杂、层数较深，为了避免模型退化，Transformer 采用了残差连接的思想来连接每一个子层。残差连接，即下一层的输入不仅是上一层的输出，还包括上一层的输入。残差连接允许最底层信息直接传到最高层，让高层专注于残差的学习。",[13,6980,6981],{},"我们在代码实现中，通过在层的 forward 计算中加上原值来实现残差连接：",[114,6983,6985],{"className":116,"code":6984,"language":118,"meta":119,"style":119},"# 注意力计算\nh = x + self.attention.forward(self.attention_norm(x))\n# 经过前馈神经网络\nout = h + self.feed_forward.forward(self.fnn_norm(h))Copy to clipboardErrorCopied\n",[17,6986,6987,6992,6997,7002],{"__ignoreMap":119},[78,6988,6989],{"class":124,"line":125},[78,6990,6991],{},"# 注意力计算\n",[78,6993,6994],{"class":124,"line":132},[78,6995,6996],{},"h = x + self.attention.forward(self.attention_norm(x))\n",[78,6998,6999],{"class":124,"line":138},[78,7000,7001],{},"# 经过前馈神经网络\n",[78,7003,7004],{"class":124,"line":144},[78,7005,7006],{},"out = h + self.feed_forward.forward(self.fnn_norm(h))Copy to clipboardErrorCopied\n",[13,7008,7009],{},"在上文代码中，self.attention_norm 和 self.fnn_norm 都是 LayerNorm 层，self.attn 是注意力层，而 self.feed_forward 是前馈神经网络。",[107,7011,7013],{"id":7012},"embedding-层","Embedding 层",[13,7015,7016],{},"在 NLP 任务中，我们往往需要将自然语言的输入转化为机器可以处理的向量。在深度学习中，承担这个任务的组件就是 Embedding 层。",[13,7018,7019],{},"Embedding 层其实是一个存储固定大小的词典的嵌入向量查找表。也就是说，在输入神经网络之前，我们往往会先让自然语言输入通过分词器 tokenizer，分词器的作用是把自然语言输入切分成 token 并转化成一个固定的 index。",[13,7021,7022],{},"Embedding 层的输入往往是一个形状为 （batch_size，seq_len，1）的矩阵，第一个维度是一次批处理的数量，第二个维度是自然语言序列的长度，第三个维度则是 token 经过 tokenizer 转化成的 index 值。",[114,7024,7026],{"className":116,"code":7025,"language":118,"meta":119,"style":119},"self.tok_embeddings = nn.Embedding(args.vocab_size, args.dim)\n",[17,7027,7028],{"__ignoreMap":119},[78,7029,7030],{"class":124,"line":125},[78,7031,7025],{},[107,7033,7035],{"id":7034},"position-encoding-位置编码","Position Encoding 位置编码",[13,7037,7038],{},"注意力机制可以实现良好的并行计算，但同时，其注意力计算的方式也导致序列中相对位置的丢失。在 RNN、LSTM 中，输入序列会沿着语句本身的顺序被依次递归处理，因此输入序列的顺序提供了极其重要的信息，这也和自然语言的本身特性非常吻合。",[13,7040,7041],{},"但从上文对注意力机制的分析我们可以发现，在注意力机制的计算过程中，对于序列中的每一个 token，其他各个位置对其来说都是平等的，即“我喜欢你”和“你喜欢我”在注意力机制看来是完全相同的，但无疑这是注意力机制存在的一个巨大问题。因此，为使用序列顺序信息，保留序列中的相对位置信息，Transformer 采用了位置编码机制，该机制也在之后被多种模型沿用。",[13,7043,7044],{},"位置编码，即根据序列中 token 的相对位置对其进行编码，再将位置编码加入词向量编码中。位置编码的方式有很多，Transformer 使用了正余弦函数来进行位置编码（绝对位置编码 Sinusoidal），其编码方式为：",[78,7046,7048],{"className":7047},[4566],[78,7049,7051,7138],{"className":7050},[4570],[78,7052,7054],{"className":7053},[4574],[4576,7055,7056],{"xmlns":4578,"display":4579},[4581,7057,7058,7135],{},[4584,7059,7060,7063,7066,7068,7070,7072,7074,7076,7079,7081,7083,7085,7087,7089,7091,7093,7095,7097,7099,7103,7133],{},[4596,7061,7062],{},"P",[4596,7064,7065],{},"E",[4591,7067,4594],{"stretchy":4593},[4596,7069,13],{},[4596,7071,5025],{},[4596,7073,262],{},[4591,7075,2066],{"separator":1419},[7077,7078,472],"mn",{},[4596,7080,39],{},[4591,7082,4604],{"stretchy":4593},[4591,7084,4609],{},[4596,7086,262],{},[4596,7088,39],{},[4596,7090,19],{},[4591,7092,4594],{"stretchy":4593},[4596,7094,13],{},[4596,7096,5025],{},[4596,7098,262],{},[4596,7100,7102],{"mathvariant":7101},"normal","\u002F",[4614,7104,7105,7108],{},[7077,7106,7107],{},"10000",[4584,7109,7110,7112,7114,7116],{},[7077,7111,472],{},[4596,7113,39],{},[4596,7115,7102],{"mathvariant":7101},[4600,7117,7118,7120],{},[4596,7119,5245],{},[4584,7121,7122,7124,7126,7128,7130],{},[4596,7123,5058],{},[4596,7125,5025],{},[4596,7127,5245],{},[4596,7129,4618],{},[4596,7131,7132],{},"l",[4591,7134,4604],{"stretchy":4593},[4647,7136,7137],{"encoding":4649},"PE(pos,2i)=sin(pos\u002F10000^{2i\u002Fd_{model}})",[78,7139,7141,7188],{"className":7140,"ariaHidden":1419},[4654],[78,7142,7144,7147,7150,7154,7157,7160,7164,7167,7170,7173,7176,7179,7182,7185],{"className":7143},[4658],[78,7145],{"className":7146,"style":4663},[4662],[78,7148,7062],{"className":7149,"style":5219},[4667,4678],[78,7151,7065],{"className":7152,"style":7153},[4667,4678],"margin-right:0.0576em;",[78,7155,4594],{"className":7156},[4674],[78,7158,13],{"className":7159},[4667,4678],[78,7161,7163],{"className":7162},[4667,4678],"os",[78,7165,2066],{"className":7166},[5126],[78,7168],{"className":7169,"style":4839},[4739],[78,7171,472],{"className":7172},[4667],[78,7174,39],{"className":7175},[4667,4678],[78,7177,4604],{"className":7178},[4682],[78,7180],{"className":7181,"style":4740},[4739],[78,7183,4609],{"className":7184},[4744],[78,7186],{"className":7187,"style":4740},[4739],[78,7189,7191,7195,7198,7202,7205,7208,7211,7215,7313],{"className":7190},[4658],[78,7192],{"className":7193,"style":7194},[4662],"height:1.188em;vertical-align:-0.25em;",[78,7196,262],{"className":7197},[4667,4678],[78,7199,7201],{"className":7200},[4667,4678],"in",[78,7203,4594],{"className":7204},[4674],[78,7206,13],{"className":7207},[4667,4678],[78,7209,7163],{"className":7210},[4667,4678],[78,7212,7214],{"className":7213},[4667],"\u002F1000",[78,7216,7218,7221],{"className":7217},[4667],[78,7219,2949],{"className":7220},[4667],[78,7222,7224],{"className":7223},[4689],[78,7225,7227],{"className":7226},[4693],[78,7228,7230],{"className":7229},[4698],[78,7231,7234],{"className":7232,"style":7233},[4702],"height:0.938em;",[78,7235,7236,7239],{"style":5209},[78,7237],{"className":7238,"style":4711},[4710],[78,7240,7242],{"className":7241},[4715,4716,4717,4718],[78,7243,7245,7248,7251,7254],{"className":7244},[4667,4718],[78,7246,472],{"className":7247},[4667,4718],[78,7249,39],{"className":7250},[4667,4678,4718],[78,7252,7102],{"className":7253},[4667,4718],[78,7255,7257,7260],{"className":7256},[4667,4718],[78,7258,5245],{"className":7259},[4667,4678,4718],[78,7261,7263],{"className":7262},[4689],[78,7264,7266,7304],{"className":7265},[4693,4694],[78,7267,7269,7301],{"className":7268},[4698],[78,7270,7273],{"className":7271,"style":7272},[4702],"height:0.3448em;",[78,7274,7276,7279],{"style":7275},"top:-2.3488em;margin-left:0em;margin-right:0.0714em;",[78,7277],{"className":7278,"style":4896},[4710],[78,7280,7282],{"className":7281},[4715,4900,4901,4718],[78,7283,7285,7288,7291,7294,7297],{"className":7284},[4667,4718],[78,7286,5058],{"className":7287},[4667,4678,4718],[78,7289,5025],{"className":7290},[4667,4678,4718],[78,7292,5245],{"className":7293},[4667,4678,4718],[78,7295,4618],{"className":7296},[4667,4678,4718],[78,7298,7132],{"className":7299,"style":7300},[4667,4678,4718],"margin-right:0.0197em;",[78,7302,4726],{"className":7303},[4725],[78,7305,7307],{"className":7306},[4698],[78,7308,7311],{"className":7309,"style":7310},[4702],"height:0.1512em;",[78,7312],{},[78,7314,4604],{"className":7315},[4682],[78,7317,7319],{"className":7318},[4566],[78,7320,7322,7408],{"className":7321},[4570],[78,7323,7325],{"className":7324},[4574],[4576,7326,7327],{"xmlns":4578,"display":4579},[4581,7328,7329,7405],{},[4584,7330,7331,7333,7335,7337,7339,7341,7343,7345,7347,7349,7352,7354,7356,7358,7361,7363,7365,7367,7369,7371,7373,7375,7403],{},[4596,7332,7062],{},[4596,7334,7065],{},[4591,7336,4594],{"stretchy":4593},[4596,7338,13],{},[4596,7340,5025],{},[4596,7342,262],{},[4591,7344,2066],{"separator":1419},[7077,7346,472],{},[4596,7348,39],{},[4591,7350,7351],{},"+",[7077,7353,469],{},[4591,7355,4604],{"stretchy":4593},[4591,7357,4609],{},[4596,7359,7360],{},"c",[4596,7362,5025],{},[4596,7364,262],{},[4591,7366,4594],{"stretchy":4593},[4596,7368,13],{},[4596,7370,5025],{},[4596,7372,262],{},[4596,7374,7102],{"mathvariant":7101},[4614,7376,7377,7379],{},[7077,7378,7107],{},[4584,7380,7381,7383,7385,7387],{},[7077,7382,472],{},[4596,7384,39],{},[4596,7386,7102],{"mathvariant":7101},[4600,7388,7389,7391],{},[4596,7390,5245],{},[4584,7392,7393,7395,7397,7399,7401],{},[4596,7394,5058],{},[4596,7396,5025],{},[4596,7398,5245],{},[4596,7400,4618],{},[4596,7402,7132],{},[4591,7404,4604],{"stretchy":4593},[4647,7406,7407],{"encoding":4649},"PE(pos,2i+1)=cos(pos\u002F10000^{2i\u002Fd_{model}})",[78,7409,7411,7454,7475],{"className":7410,"ariaHidden":1419},[4654],[78,7412,7414,7417,7420,7423,7426,7429,7432,7435,7438,7441,7444,7447,7451],{"className":7413},[4658],[78,7415],{"className":7416,"style":4663},[4662],[78,7418,7062],{"className":7419,"style":5219},[4667,4678],[78,7421,7065],{"className":7422,"style":7153},[4667,4678],[78,7424,4594],{"className":7425},[4674],[78,7427,13],{"className":7428},[4667,4678],[78,7430,7163],{"className":7431},[4667,4678],[78,7433,2066],{"className":7434},[5126],[78,7436],{"className":7437,"style":4839},[4739],[78,7439,472],{"className":7440},[4667],[78,7442,39],{"className":7443},[4667,4678],[78,7445],{"className":7446,"style":5143},[4739],[78,7448,7351],{"className":7449},[7450],"mbin",[78,7452],{"className":7453,"style":5143},[4739],[78,7455,7457,7460,7463,7466,7469,7472],{"className":7456},[4658],[78,7458],{"className":7459,"style":4663},[4662],[78,7461,469],{"className":7462},[4667],[78,7464,4604],{"className":7465},[4682],[78,7467],{"className":7468,"style":4740},[4739],[78,7470,4609],{"className":7471},[4744],[78,7473],{"className":7474,"style":4740},[4739],[78,7476,7478,7481,7485,7488,7491,7494,7497,7590],{"className":7477},[4658],[78,7479],{"className":7480,"style":7194},[4662],[78,7482,7484],{"className":7483},[4667,4678],"cos",[78,7486,4594],{"className":7487},[4674],[78,7489,13],{"className":7490},[4667,4678],[78,7492,7163],{"className":7493},[4667,4678],[78,7495,7214],{"className":7496},[4667],[78,7498,7500,7503],{"className":7499},[4667],[78,7501,2949],{"className":7502},[4667],[78,7504,7506],{"className":7505},[4689],[78,7507,7509],{"className":7508},[4693],[78,7510,7512],{"className":7511},[4698],[78,7513,7515],{"className":7514,"style":7233},[4702],[78,7516,7517,7520],{"style":5209},[78,7518],{"className":7519,"style":4711},[4710],[78,7521,7523],{"className":7522},[4715,4716,4717,4718],[78,7524,7526,7529,7532,7535],{"className":7525},[4667,4718],[78,7527,472],{"className":7528},[4667,4718],[78,7530,39],{"className":7531},[4667,4678,4718],[78,7533,7102],{"className":7534},[4667,4718],[78,7536,7538,7541],{"className":7537},[4667,4718],[78,7539,5245],{"className":7540},[4667,4678,4718],[78,7542,7544],{"className":7543},[4689],[78,7545,7547,7582],{"className":7546},[4693,4694],[78,7548,7550,7579],{"className":7549},[4698],[78,7551,7553],{"className":7552,"style":7272},[4702],[78,7554,7555,7558],{"style":7275},[78,7556],{"className":7557,"style":4896},[4710],[78,7559,7561],{"className":7560},[4715,4900,4901,4718],[78,7562,7564,7567,7570,7573,7576],{"className":7563},[4667,4718],[78,7565,5058],{"className":7566},[4667,4678,4718],[78,7568,5025],{"className":7569},[4667,4678,4718],[78,7571,5245],{"className":7572},[4667,4678,4718],[78,7574,4618],{"className":7575},[4667,4678,4718],[78,7577,7132],{"className":7578,"style":7300},[4667,4678,4718],[78,7580,4726],{"className":7581},[4725],[78,7583,7585],{"className":7584},[4698],[78,7586,7588],{"className":7587,"style":7310},[4702],[78,7589],{},[78,7591,4604],{"className":7592},[4682],[13,7594,7595],{},"pos 为 token 在句子中的位置，2i 和 2i+1 则指示了位置编码向量的维度索引是奇数还是偶数。这样的位置编码主要有两个好处：",[2285,7597,7598,7601],{},[52,7599,7600],{},"使 PE 能够适应比训练集里面所有句子更长的句子，假设训练集里面最长的句子是有 20 个单词，突然来了一个长度为 21 的句子，则使用公式计算的方法可以计算出第 21 位的 Embedding。",[52,7602,7603],{},"可以让模型容易地计算出相对位置，对于固定长度的间距 k，PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。",[114,7605,7607],{"className":116,"code":7606,"language":118,"meta":119,"style":119},"class PositionalEncoding(nn.Module):\n    '''位置编码模块'''\n\n    def __init__(self, args):\n        super(PositionalEncoding, self).__init__()\n        # Dropout 层\n        # self.dropout = nn.Dropout(p=args.dropout)\n\n        # block size 是序列的最大长度\n        pe = torch.zeros(args.block_size, args.n_embd)\n        position = torch.arange(0, args.block_size).unsqueeze(1)\n        # 计算 theta\n        div_term = torch.exp(\n            torch.arange(0, args.n_embd, 2) * -(math.log(10000.0) \u002F args.n_embd)\n        )\n        # 分别计算 sin、cos 结果\n        pe[:, 0::2] = torch.sin(position * div_term)\n        pe[:, 1::2] = torch.cos(position * div_term)\n        pe = pe.unsqueeze(0)\n        self.register_buffer(\"pe\", pe)\n\n    def forward(self, x):\n        # 将位置编码加到 Embedding 结果上\n        x = x + self.pe[:, : x.size(1)].requires_grad_(False)\n        return x\n",[17,7608,7609,7614,7619,7623,7627,7632,7637,7642,7646,7651,7656,7661,7666,7671,7676,7681,7686,7691,7696,7701,7706,7710,7714,7719,7724],{"__ignoreMap":119},[78,7610,7611],{"class":124,"line":125},[78,7612,7613],{},"class PositionalEncoding(nn.Module):\n",[78,7615,7616],{"class":124,"line":132},[78,7617,7618],{},"    '''位置编码模块'''\n",[78,7620,7621],{"class":124,"line":138},[78,7622,129],{"emptyLinePlaceholder":128},[78,7624,7625],{"class":124,"line":144},[78,7626,6428],{},[78,7628,7629],{"class":124,"line":150},[78,7630,7631],{},"        super(PositionalEncoding, self).__init__()\n",[78,7633,7634],{"class":124,"line":156},[78,7635,7636],{},"        # Dropout 层\n",[78,7638,7639],{"class":124,"line":162},[78,7640,7641],{},"        # self.dropout = nn.Dropout(p=args.dropout)\n",[78,7643,7644],{"class":124,"line":168},[78,7645,129],{"emptyLinePlaceholder":128},[78,7647,7648],{"class":124,"line":174},[78,7649,7650],{},"        # block size 是序列的最大长度\n",[78,7652,7653],{"class":124,"line":180},[78,7654,7655],{},"        pe = torch.zeros(args.block_size, args.n_embd)\n",[78,7657,7658],{"class":124,"line":186},[78,7659,7660],{},"        position = torch.arange(0, args.block_size).unsqueeze(1)\n",[78,7662,7663],{"class":124,"line":192},[78,7664,7665],{},"        # 计算 theta\n",[78,7667,7668],{"class":124,"line":198},[78,7669,7670],{},"        div_term = torch.exp(\n",[78,7672,7673],{"class":124,"line":204},[78,7674,7675],{},"            torch.arange(0, args.n_embd, 2) * -(math.log(10000.0) \u002F args.n_embd)\n",[78,7677,7678],{"class":124,"line":210},[78,7679,7680],{},"        )\n",[78,7682,7683],{"class":124,"line":216},[78,7684,7685],{},"        # 分别计算 sin、cos 结果\n",[78,7687,7688],{"class":124,"line":222},[78,7689,7690],{},"        pe[:, 0::2] = torch.sin(position * div_term)\n",[78,7692,7693],{"class":124,"line":421},[78,7694,7695],{},"        pe[:, 1::2] = torch.cos(position * div_term)\n",[78,7697,7698],{"class":124,"line":427},[78,7699,7700],{},"        pe = pe.unsqueeze(0)\n",[78,7702,7703],{"class":124,"line":433},[78,7704,7705],{},"        self.register_buffer(\"pe\", pe)\n",[78,7707,7708],{"class":124,"line":2443},[78,7709,129],{"emptyLinePlaceholder":128},[78,7711,7712],{"class":124,"line":2448},[78,7713,6472],{},[78,7715,7716],{"class":124,"line":2454},[78,7717,7718],{},"        # 将位置编码加到 Embedding 结果上\n",[78,7720,7721],{"class":124,"line":2460},[78,7722,7723],{},"        x = x + self.pe[:, : x.size(1)].requires_grad_(False)\n",[78,7725,7726],{"class":124,"line":2465},[78,7727,7728],{},"        return x\n",[226,7730,228],{},{"title":119,"searchDepth":144,"depth":144,"links":7732},[7733,7734,7735,7736,7737,7738],{"id":6398,"depth":132,"text":6399},{"id":6771,"depth":132,"text":6772},{"id":6863,"depth":132,"text":6864},{"id":6974,"depth":132,"text":6975},{"id":7012,"depth":132,"text":7013},{"id":7034,"depth":132,"text":7035},{},"\u002Flegacy-blog\u002F1772091473887",{"title":6384,"description":119},"legacy-blog\u002F1772091473887",[7744],"机器学习","GmUYzZnLII4foHyztcOPLA0_bz-Zk0folFZ2PDGUbVQ",{"id":7747,"title":7748,"assetBase":239,"author":8,"body":7749,"category":787,"collection":233,"date":9127,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":9128,"navigation":128,"originalPath":239,"path":9129,"seo":9130,"source":243,"stem":9131,"tags":9132,"weight":250,"__hash__":9134},"content\u002Flegacy-blog\u002F1772193539212.md","LangChain Core",{"type":10,"value":7750,"toc":9095},[7751,7754,7758,7762,7801,7804,7891,7894,7919,7922,8004,8007,8056,8060,8063,8126,8129,8135,8141,8147,8153,8182,8185,8289,8293,8297,8355,8359,8365,8470,8529,8533,8538,8591,8595,8598,8604,8647,8650,8655,8662,8751,8755,8765,8772,8775,8793,8829,8836,8842,8861,8913,8917,8927,8972,8975,8981,9014,9017,9031,9034,9039,9093],[4517,7752,7748],{"id":7753},"langchain-core",[107,7755,7757],{"id":7756},"models-模型","Models 模型",[7759,7760,7761],"h4",{"id":7761},"基本初始化与参数",[114,7763,7765],{"className":116,"code":7764,"language":118,"meta":119,"style":119},"import os\nfrom langchain.chat_models import init_chat_model\n\nmodel = init_chat_model(model, api_key, temperature,\n                        max_tokens, max_retries, timeout,  # 基础参数\n                       )\nresponse = model.invoke(\"Why do parrots talk?\")\n",[17,7766,7767,7772,7777,7781,7786,7791,7796],{"__ignoreMap":119},[78,7768,7769],{"class":124,"line":125},[78,7770,7771],{},"import os\n",[78,7773,7774],{"class":124,"line":132},[78,7775,7776],{},"from langchain.chat_models import init_chat_model\n",[78,7778,7779],{"class":124,"line":138},[78,7780,129],{"emptyLinePlaceholder":128},[78,7782,7783],{"class":124,"line":144},[78,7784,7785],{},"model = init_chat_model(model, api_key, temperature,\n",[78,7787,7788],{"class":124,"line":150},[78,7789,7790],{},"                        max_tokens, max_retries, timeout,  # 基础参数\n",[78,7792,7793],{"class":124,"line":156},[78,7794,7795],{},"                       )\n",[78,7797,7798],{"class":124,"line":162},[78,7799,7800],{},"response = model.invoke(\"Why do parrots talk?\")\n",[7759,7802,7803],{"id":7803},"输出方式",[114,7805,7807],{"className":116,"code":7806,"language":118,"meta":119,"style":119},"response = model.invoke(conversation)  # 完整输出\nprint(response)\n\nfull = None  # None | AIMessageChunk\nfor chunk in model.stream(conversation):  # 流式输出\n    full = chunk if full is None else full + chunk\n    print(full.text)  # token 块\nprint(full.content_blocks)  # 最终完整 Message 结构\n\nresponses = model.batch([\"1\", \"2\", \"3\"])  # batch 输出\nfor response in responses:\n    print(response)  # 全部生成完才输出\n    \nfor response in model.batch_as_completed([\"1\", \"2\", \"3\"]\n    #  config={'max_concurrency': 5,}  # 控制并发\n):\n    print(response)  # 生成一条输出一条\n",[17,7808,7809,7814,7819,7823,7828,7833,7838,7843,7848,7852,7857,7862,7867,7871,7876,7881,7886],{"__ignoreMap":119},[78,7810,7811],{"class":124,"line":125},[78,7812,7813],{},"response = model.invoke(conversation)  # 完整输出\n",[78,7815,7816],{"class":124,"line":132},[78,7817,7818],{},"print(response)\n",[78,7820,7821],{"class":124,"line":138},[78,7822,129],{"emptyLinePlaceholder":128},[78,7824,7825],{"class":124,"line":144},[78,7826,7827],{},"full = None  # None | AIMessageChunk\n",[78,7829,7830],{"class":124,"line":150},[78,7831,7832],{},"for chunk in model.stream(conversation):  # 流式输出\n",[78,7834,7835],{"class":124,"line":156},[78,7836,7837],{},"    full = chunk if full is None else full + chunk\n",[78,7839,7840],{"class":124,"line":162},[78,7841,7842],{},"    print(full.text)  # token 块\n",[78,7844,7845],{"class":124,"line":168},[78,7846,7847],{},"print(full.content_blocks)  # 最终完整 Message 结构\n",[78,7849,7850],{"class":124,"line":174},[78,7851,129],{"emptyLinePlaceholder":128},[78,7853,7854],{"class":124,"line":180},[78,7855,7856],{},"responses = model.batch([\"1\", \"2\", \"3\"])  # batch 输出\n",[78,7858,7859],{"class":124,"line":186},[78,7860,7861],{},"for response in responses:\n",[78,7863,7864],{"class":124,"line":192},[78,7865,7866],{},"    print(response)  # 全部生成完才输出\n",[78,7868,7869],{"class":124,"line":198},[78,7870,6942],{},[78,7872,7873],{"class":124,"line":204},[78,7874,7875],{},"for response in model.batch_as_completed([\"1\", \"2\", \"3\"]\n",[78,7877,7878],{"class":124,"line":210},[78,7879,7880],{},"    #  config={'max_concurrency': 5,}  # 控制并发\n",[78,7882,7883],{"class":124,"line":216},[78,7884,7885],{},"):\n",[78,7887,7888],{"class":124,"line":222},[78,7889,7890],{},"    print(response)  # 生成一条输出一条\n",[7759,7892,7893],{"id":7893},"工具调用",[114,7895,7897],{"className":116,"code":7896,"language":118,"meta":119,"style":119},"model.bind_tools([get_weather],\n                tool_choice=\"any\",  # 强制工具调用\n                parallel_tool_calls=False,  # 自动并行根据调用，默认为 True\n                ) \n",[17,7898,7899,7904,7909,7914],{"__ignoreMap":119},[78,7900,7901],{"class":124,"line":125},[78,7902,7903],{},"model.bind_tools([get_weather],\n",[78,7905,7906],{"class":124,"line":132},[78,7907,7908],{},"                tool_choice=\"any\",  # 强制工具调用\n",[78,7910,7911],{"class":124,"line":138},[78,7912,7913],{},"                parallel_tool_calls=False,  # 自动并行根据调用，默认为 True\n",[78,7915,7916],{"class":124,"line":144},[78,7917,7918],{},"                )\n",[7759,7920,7921],{"id":7921},"结构化输出",[114,7923,7925],{"className":116,"code":7924,"language":118,"meta":119,"style":119},"from pydantic import BaseModel, Field  # pydantic 模式\nclass sample1(BaseModel):\n    \"\"\"工具说明\"\"\"\n    字段名: str = Field(..., description=\"字段描述\")\n\nfrom typing_extensions import TypedDict, Annotated  # TypedDict 模式（推荐）无需运行验证\nclass sample2(TypedDict):\n    \"\"\"工具说明\"\"\"\n    字段名: Annotated[str, ..., \"字段描述\"]   \n\nimport json  # json 模式\nsample3 = {}\nmodel_with_structure = model.with_structured_output(sample1\u002Fsample2\u002Fsample3,\n                                                   method=\"sample3\"  # 仅 json 需要\n                                                   )\nresponse = model_with_structure.invoke(\"\")\n",[17,7926,7927,7932,7937,7942,7947,7951,7956,7961,7965,7970,7974,7979,7984,7989,7994,7999],{"__ignoreMap":119},[78,7928,7929],{"class":124,"line":125},[78,7930,7931],{},"from pydantic import BaseModel, Field  # pydantic 模式\n",[78,7933,7934],{"class":124,"line":132},[78,7935,7936],{},"class sample1(BaseModel):\n",[78,7938,7939],{"class":124,"line":138},[78,7940,7941],{},"    \"\"\"工具说明\"\"\"\n",[78,7943,7944],{"class":124,"line":144},[78,7945,7946],{},"    字段名: str = Field(..., description=\"字段描述\")\n",[78,7948,7949],{"class":124,"line":150},[78,7950,129],{"emptyLinePlaceholder":128},[78,7952,7953],{"class":124,"line":156},[78,7954,7955],{},"from typing_extensions import TypedDict, Annotated  # TypedDict 模式（推荐）无需运行验证\n",[78,7957,7958],{"class":124,"line":162},[78,7959,7960],{},"class sample2(TypedDict):\n",[78,7962,7963],{"class":124,"line":168},[78,7964,7941],{},[78,7966,7967],{"class":124,"line":174},[78,7968,7969],{},"    字段名: Annotated[str, ..., \"字段描述\"]   \n",[78,7971,7972],{"class":124,"line":180},[78,7973,129],{"emptyLinePlaceholder":128},[78,7975,7976],{"class":124,"line":186},[78,7977,7978],{},"import json  # json 模式\n",[78,7980,7981],{"class":124,"line":192},[78,7982,7983],{},"sample3 = {}\n",[78,7985,7986],{"class":124,"line":198},[78,7987,7988],{},"model_with_structure = model.with_structured_output(sample1\u002Fsample2\u002Fsample3,\n",[78,7990,7991],{"class":124,"line":204},[78,7992,7993],{},"                                                   method=\"sample3\"  # 仅 json 需要\n",[78,7995,7996],{"class":124,"line":210},[78,7997,7998],{},"                                                   )\n",[78,8000,8001],{"class":124,"line":216},[78,8002,8003],{},"response = model_with_structure.invoke(\"\")\n",[7759,8005,8006],{"id":8006},"速率限制",[114,8008,8010],{"className":116,"code":8009,"language":118,"meta":119,"style":119},"from langchain_core.rate_limiters import InMemoryRateLimiter\nrate_limiter = InMemoryRateLimiter(\n    requests_per_second=0.1,  # 默认1s 1请求，这里是10s 1请求\n    check_every_n_seconds=0.1,  # 发起请求间隔时间，默认1s 1间隔，这里是0.1s\n    max_bucket_size=10,  # 容纳最大请求数量（防止并发爆炸）\n)\nmodel = init_chat_model(..., # 基础参数\n                        rate_limiter=rate_limiter,  # 请求速率限制\n                       )\n",[17,8011,8012,8017,8022,8027,8032,8037,8042,8047,8052],{"__ignoreMap":119},[78,8013,8014],{"class":124,"line":125},[78,8015,8016],{},"from langchain_core.rate_limiters import InMemoryRateLimiter\n",[78,8018,8019],{"class":124,"line":132},[78,8020,8021],{},"rate_limiter = InMemoryRateLimiter(\n",[78,8023,8024],{"class":124,"line":138},[78,8025,8026],{},"    requests_per_second=0.1,  # 默认1s 1请求，这里是10s 1请求\n",[78,8028,8029],{"class":124,"line":144},[78,8030,8031],{},"    check_every_n_seconds=0.1,  # 发起请求间隔时间，默认1s 1间隔，这里是0.1s\n",[78,8033,8034],{"class":124,"line":150},[78,8035,8036],{},"    max_bucket_size=10,  # 容纳最大请求数量（防止并发爆炸）\n",[78,8038,8039],{"class":124,"line":156},[78,8040,8041],{},")\n",[78,8043,8044],{"class":124,"line":162},[78,8045,8046],{},"model = init_chat_model(..., # 基础参数\n",[78,8048,8049],{"class":124,"line":168},[78,8050,8051],{},"                        rate_limiter=rate_limiter,  # 请求速率限制\n",[78,8053,8054],{"class":124,"line":174},[78,8055,7795],{},[107,8057,8059],{"id":8058},"messages-消息","Messages 消息",[7759,8061,8062],{"id":8062},"基础使用",[114,8064,8066],{"className":116,"code":8065,"language":118,"meta":119,"style":119},"from langchain.messages import SystemMessage, HumanMessage, AIMessage\nmessages = [  # 消息提示\n    SystemMessage(\"\"),\n    HumanMessage(\"\"),\n    AIMessage(\"\")\n]\nmessages = [  # 词典格式\n    {\"role\": \"system\", \"content\": \"\"},\n    {\"role\": \"user\", \"content\": \"\"},\n    {\"role\": \"assistant\", \"content\": \"\"}\n]\nresponse = model.invoke(messages)\n",[17,8067,8068,8073,8078,8083,8088,8093,8097,8102,8107,8112,8117,8121],{"__ignoreMap":119},[78,8069,8070],{"class":124,"line":125},[78,8071,8072],{},"from langchain.messages import SystemMessage, HumanMessage, AIMessage\n",[78,8074,8075],{"class":124,"line":132},[78,8076,8077],{},"messages = [  # 消息提示\n",[78,8079,8080],{"class":124,"line":138},[78,8081,8082],{},"    SystemMessage(\"\"),\n",[78,8084,8085],{"class":124,"line":144},[78,8086,8087],{},"    HumanMessage(\"\"),\n",[78,8089,8090],{"class":124,"line":150},[78,8091,8092],{},"    AIMessage(\"\")\n",[78,8094,8095],{"class":124,"line":156},[78,8096,2070],{},[78,8098,8099],{"class":124,"line":162},[78,8100,8101],{},"messages = [  # 词典格式\n",[78,8103,8104],{"class":124,"line":168},[78,8105,8106],{},"    {\"role\": \"system\", \"content\": \"\"},\n",[78,8108,8109],{"class":124,"line":174},[78,8110,8111],{},"    {\"role\": \"user\", \"content\": \"\"},\n",[78,8113,8114],{"class":124,"line":180},[78,8115,8116],{},"    {\"role\": \"assistant\", \"content\": \"\"}\n",[78,8118,8119],{"class":124,"line":186},[78,8120,2070],{},[78,8122,8123],{"class":124,"line":192},[78,8124,8125],{},"response = model.invoke(messages)\n",[7759,8127,8128],{"id":8128},"消息类型",[13,8130,8131,8134],{},[17,8132,8133],{},"SystemMessage"," 表示一组初始指令，用于引导模型的行为。您可以使用系统消息来设置语气、定义模型角色并建立响应指南。",[13,8136,8137,8140],{},[17,8138,8139],{},"HumanMessage"," 表示用户输入和交互。它们可以包含文本、图像、音频、文件以及任何其他多模态内容。",[13,8142,8143,8146],{},[17,8144,8145],{},"AIMessage"," 表示模型调用的输出。它们可以包含多模态数据、工具调用和提供商特定的元数据。",[13,8148,8149,8152],{},[17,8150,8151],{},"ToolMessage"," 对于支持工具调用的模型，AI 消息可以包含工具调用。工具消息用于将单个工具执行的结果反馈给模型。",[114,8154,8156],{"className":116,"code":8155,"language":118,"meta":119,"style":119},"from langchain.messages import ToolMessage\ntool_message = ToolMessage(\n    content=weather_result,\n    tool_call_id=\"call_123\"  # Must match the call ID\n)\n",[17,8157,8158,8163,8168,8173,8178],{"__ignoreMap":119},[78,8159,8160],{"class":124,"line":125},[78,8161,8162],{},"from langchain.messages import ToolMessage\n",[78,8164,8165],{"class":124,"line":132},[78,8166,8167],{},"tool_message = ToolMessage(\n",[78,8169,8170],{"class":124,"line":138},[78,8171,8172],{},"    content=weather_result,\n",[78,8174,8175],{"class":124,"line":144},[78,8176,8177],{},"    tool_call_id=\"call_123\"  # Must match the call ID\n",[78,8179,8180],{"class":124,"line":150},[78,8181,8041],{},[7759,8183,8184],{"id":8184},"标准输出",[114,8186,8188],{"className":116,"code":8187,"language":118,"meta":119,"style":119},"from langchain.messages import AIMessage\nmessage = AIMessage(  # 包装一个 AIMessage 模拟 AI 输出\n    content=[\n        {\n            \"type\": \"reasoning\",\n            \"id\": \"rs_abc123\",\n            \"summary\": [\n                {\"type\": \"summary_text\", \"text\": \"summary 1\"},\n                {\"type\": \"summary_text\", \"text\": \"summary 2\"},\n            ],\n        },\n        {\"type\": \"text\", \"text\": \"...\", \"id\": \"msg_abc123\"},\n    ],\n    response_metadata={\"model_provider\": \"openai\"}\n)\nmessage.content_blocks\n# 输出如下:\n[{'type': 'reasoning', 'id': 'rs_abc123', 'reasoning': 'summary 1'},\n {'type': 'reasoning', 'id': 'rs_abc123', 'reasoning': 'summary 2'},\n {'type': 'text', 'text': '...', 'id': 'msg_abc123'}]\n",[17,8189,8190,8195,8200,8205,8210,8215,8220,8225,8230,8235,8240,8245,8250,8255,8260,8264,8269,8274,8279,8284],{"__ignoreMap":119},[78,8191,8192],{"class":124,"line":125},[78,8193,8194],{},"from langchain.messages import AIMessage\n",[78,8196,8197],{"class":124,"line":132},[78,8198,8199],{},"message = AIMessage(  # 包装一个 AIMessage 模拟 AI 输出\n",[78,8201,8202],{"class":124,"line":138},[78,8203,8204],{},"    content=[\n",[78,8206,8207],{"class":124,"line":144},[78,8208,8209],{},"        {\n",[78,8211,8212],{"class":124,"line":150},[78,8213,8214],{},"            \"type\": \"reasoning\",\n",[78,8216,8217],{"class":124,"line":156},[78,8218,8219],{},"            \"id\": \"rs_abc123\",\n",[78,8221,8222],{"class":124,"line":162},[78,8223,8224],{},"            \"summary\": [\n",[78,8226,8227],{"class":124,"line":168},[78,8228,8229],{},"                {\"type\": \"summary_text\", \"text\": \"summary 1\"},\n",[78,8231,8232],{"class":124,"line":174},[78,8233,8234],{},"                {\"type\": \"summary_text\", \"text\": \"summary 2\"},\n",[78,8236,8237],{"class":124,"line":180},[78,8238,8239],{},"            ],\n",[78,8241,8242],{"class":124,"line":186},[78,8243,8244],{},"        },\n",[78,8246,8247],{"class":124,"line":192},[78,8248,8249],{},"        {\"type\": \"text\", \"text\": \"...\", \"id\": \"msg_abc123\"},\n",[78,8251,8252],{"class":124,"line":198},[78,8253,8254],{},"    ],\n",[78,8256,8257],{"class":124,"line":204},[78,8258,8259],{},"    response_metadata={\"model_provider\": \"openai\"}\n",[78,8261,8262],{"class":124,"line":210},[78,8263,8041],{},[78,8265,8266],{"class":124,"line":216},[78,8267,8268],{},"message.content_blocks\n",[78,8270,8271],{"class":124,"line":222},[78,8272,8273],{},"# 输出如下:\n",[78,8275,8276],{"class":124,"line":421},[78,8277,8278],{},"[{'type': 'reasoning', 'id': 'rs_abc123', 'reasoning': 'summary 1'},\n",[78,8280,8281],{"class":124,"line":427},[78,8282,8283],{}," {'type': 'reasoning', 'id': 'rs_abc123', 'reasoning': 'summary 2'},\n",[78,8285,8286],{"class":124,"line":433},[78,8287,8288],{}," {'type': 'text', 'text': '...', 'id': 'msg_abc123'}]\n",[107,8290,8292],{"id":8291},"tools-工具","Tools 工具",[7759,8294,8296],{"id":8295},"tool-装饰器","@Tool 装饰器",[114,8298,8300],{"className":116,"code":8299,"language":118,"meta":119,"style":119},"from pydantic import BaseModel, Field\nfrom typing import Literal\n\nclass Input(BaseModel):\n    location: str = Field(description=\"City\")\n\n@tool(\"real_func\", description=\"实际方法描述\",  # 自定义描述和名称\n     args_schema=Input)  \ndef func(label: str):\n    \"\"\"方法描述\"\"\"\n    pass\n",[17,8301,8302,8307,8312,8316,8321,8326,8330,8335,8340,8345,8350],{"__ignoreMap":119},[78,8303,8304],{"class":124,"line":125},[78,8305,8306],{},"from pydantic import BaseModel, Field\n",[78,8308,8309],{"class":124,"line":132},[78,8310,8311],{},"from typing import Literal\n",[78,8313,8314],{"class":124,"line":138},[78,8315,129],{"emptyLinePlaceholder":128},[78,8317,8318],{"class":124,"line":144},[78,8319,8320],{},"class Input(BaseModel):\n",[78,8322,8323],{"class":124,"line":150},[78,8324,8325],{},"    location: str = Field(description=\"City\")\n",[78,8327,8328],{"class":124,"line":156},[78,8329,129],{"emptyLinePlaceholder":128},[78,8331,8332],{"class":124,"line":162},[78,8333,8334],{},"@tool(\"real_func\", description=\"实际方法描述\",  # 自定义描述和名称\n",[78,8336,8337],{"class":124,"line":168},[78,8338,8339],{},"     args_schema=Input)  \n",[78,8341,8342],{"class":124,"line":174},[78,8343,8344],{},"def func(label: str):\n",[78,8346,8347],{"class":124,"line":180},[78,8348,8349],{},"    \"\"\"方法描述\"\"\"\n",[78,8351,8352],{"class":124,"line":186},[78,8353,8354],{},"    pass\n",[7759,8356,8358],{"id":8357},"toolruntime","ToolRuntime",[13,8360,8361,8362,8364],{},"工具可以通过 ",[17,8363,8358],{},"参数，提供：",[8366,8367,8368,8385],"table",{},[8369,8370,8371],"thead",{},[8372,8373,8374,8379,8382],"tr",{},[8375,8376,8378],"th",{"align":8377},"left","Component",[8375,8380,8381],{"align":8377},"Description",[8375,8383,8384],{"align":8377},"Use case",[8386,8387,8388,8402,8415,8428,8441,8457],"tbody",{},[8372,8389,8390,8396,8399],{},[8391,8392,8393],"td",{"align":8377},[22,8394,8395],{},"State",[8391,8397,8398],{"align":8377},"Short-term memory - mutable data that exists for the current conversation (messages, counters, custom fields)",[8391,8400,8401],{"align":8377},"Access conversation history, track tool call counts",[8372,8403,8404,8409,8412],{},[8391,8405,8406],{"align":8377},[22,8407,8408],{},"Context",[8391,8410,8411],{"align":8377},"Immutable configuration passed at invocation time (user IDs, session info)",[8391,8413,8414],{"align":8377},"Personalize responses based on user identity",[8372,8416,8417,8422,8425],{},[8391,8418,8419],{"align":8377},[22,8420,8421],{},"Store",[8391,8423,8424],{"align":8377},"Long-term memory - persistent data that survives across conversations",[8391,8426,8427],{"align":8377},"Save user preferences, maintain knowledge base",[8372,8429,8430,8435,8438],{},[8391,8431,8432],{"align":8377},[22,8433,8434],{},"Stream Writer",[8391,8436,8437],{"align":8377},"Emit real-time updates during tool execution",[8391,8439,8440],{"align":8377},"Show progress for long-running operations",[8372,8442,8443,8448,8454],{},[8391,8444,8445],{"align":8377},[22,8446,8447],{},"Config",[8391,8449,8450,8453],{"align":8377},[17,8451,8452],{},"RunnableConfig"," for the execution",[8391,8455,8456],{"align":8377},"Access callbacks, tags, and metadata",[8372,8458,8459,8464,8467],{},[8391,8460,8461],{"align":8377},[22,8462,8463],{},"Tool Call ID",[8391,8465,8466],{"align":8377},"Unique identifier for the current tool invocation",[8391,8468,8469],{"align":8377},"Correlate tool calls for logs and model invocations",[114,8471,8473],{"className":116,"code":8472,"language":118,"meta":119,"style":119},"from langchain.tools import tool, ToolRuntime\n\n@tool\ndef func(\n    pref_name: str,\n    runtime: ToolRuntime\n) -> str:\n    \"\"\"Get a user preference value.\"\"\"\n    preferences = runtime.state.get(\"user_preferences\", {})  # 通过 runtime. 拿取参数\n    return preferences.get(pref_name, \"Not set\")\n# runtime .state\u002F.context\u002F.store\u002F.stream_writer\n",[17,8474,8475,8480,8484,8489,8494,8499,8504,8509,8514,8519,8524],{"__ignoreMap":119},[78,8476,8477],{"class":124,"line":125},[78,8478,8479],{},"from langchain.tools import tool, ToolRuntime\n",[78,8481,8482],{"class":124,"line":132},[78,8483,129],{"emptyLinePlaceholder":128},[78,8485,8486],{"class":124,"line":138},[78,8487,8488],{},"@tool\n",[78,8490,8491],{"class":124,"line":144},[78,8492,8493],{},"def func(\n",[78,8495,8496],{"class":124,"line":150},[78,8497,8498],{},"    pref_name: str,\n",[78,8500,8501],{"class":124,"line":156},[78,8502,8503],{},"    runtime: ToolRuntime\n",[78,8505,8506],{"class":124,"line":162},[78,8507,8508],{},") -> str:\n",[78,8510,8511],{"class":124,"line":168},[78,8512,8513],{},"    \"\"\"Get a user preference value.\"\"\"\n",[78,8515,8516],{"class":124,"line":174},[78,8517,8518],{},"    preferences = runtime.state.get(\"user_preferences\", {})  # 通过 runtime. 拿取参数\n",[78,8520,8521],{"class":124,"line":180},[78,8522,8523],{},"    return preferences.get(pref_name, \"Not set\")\n",[78,8525,8526],{"class":124,"line":186},[78,8527,8528],{},"# runtime .state\u002F.context\u002F.store\u002F.stream_writer\n",[7759,8530,8532],{"id":8531},"toolnode","ToolNode",[13,8534,8535,8537],{},[17,8536,8532],{}," 是一个预建节点，用于在LangGraph工作流程中执行工具。它自动处理并行工具执行、错误处理和状态注入。",[114,8539,8541],{"className":116,"code":8540,"language":118,"meta":119,"style":119},"from langgraph.prebuilt import ToolNode\nfrom langgraph.graph import StateGraph, MessagesState\n\n# Create the ToolNode with your tools\ntool_node = ToolNode([search, calculator])\n\n# Use in a graph\nbuilder = StateGraph(MessagesState)\nbuilder.add_node(\"tools\", tool_node)\n# ... add other nodes and edges\n",[17,8542,8543,8548,8553,8557,8562,8567,8571,8576,8581,8586],{"__ignoreMap":119},[78,8544,8545],{"class":124,"line":125},[78,8546,8547],{},"from langgraph.prebuilt import ToolNode\n",[78,8549,8550],{"class":124,"line":132},[78,8551,8552],{},"from langgraph.graph import StateGraph, MessagesState\n",[78,8554,8555],{"class":124,"line":138},[78,8556,129],{"emptyLinePlaceholder":128},[78,8558,8559],{"class":124,"line":144},[78,8560,8561],{},"# Create the ToolNode with your tools\n",[78,8563,8564],{"class":124,"line":150},[78,8565,8566],{},"tool_node = ToolNode([search, calculator])\n",[78,8568,8569],{"class":124,"line":156},[78,8570,129],{"emptyLinePlaceholder":128},[78,8572,8573],{"class":124,"line":162},[78,8574,8575],{},"# Use in a graph\n",[78,8577,8578],{"class":124,"line":168},[78,8579,8580],{},"builder = StateGraph(MessagesState)\n",[78,8582,8583],{"class":124,"line":174},[78,8584,8585],{},"builder.add_node(\"tools\", tool_node)\n",[78,8587,8588],{"class":124,"line":180},[78,8589,8590],{},"# ... add other nodes and edges\n",[107,8592,8594],{"id":8593},"short-term-memory-短期记忆","Short-term memory 短期记忆",[13,8596,8597],{},"对话历史是最常见的短期记忆形式。长时间对话对当今的LLM来说是一大挑战;完整的历史可能无法放入LLM的上下文窗口，导致上下文丢失或错误。即使你的模型支持完整的上下文长度，大多数大语言模型在长上下文下表现仍然不佳。他们会被陈旧或离题内容“分心”，同时又面临响应较慢和成本更高的问题。聊天模型接受上下文，使用消息，这些指令（系统消息）和输入（人工消息）。在聊天应用中，消息在人工输入和模型响应之间交替切换，导致消息列表随着时间增长而变长。由于上下文窗口有限，许多应用可以通过使用去除或“遗忘”陈旧信息的技术保持效果。",[13,8599,8600,8601],{},"要为代理添加短期记忆（线程级持久性），你需要在创建代理时指定  ",[17,8602,8603],{},"checkpointer",[114,8605,8607],{"className":116,"code":8606,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langgraph.checkpoint.memory import InMemorySaver  \n\nagent = create_agent(\n    \"gpt-5\",\n    tools=[get_user_info],\n    checkpointer=InMemorySaver(),  \n)\n",[17,8608,8609,8614,8619,8623,8628,8633,8638,8643],{"__ignoreMap":119},[78,8610,8611],{"class":124,"line":125},[78,8612,8613],{},"from langchain.agents import create_agent\n",[78,8615,8616],{"class":124,"line":132},[78,8617,8618],{},"from langgraph.checkpoint.memory import InMemorySaver  \n",[78,8620,8621],{"class":124,"line":138},[78,8622,129],{"emptyLinePlaceholder":128},[78,8624,8625],{"class":124,"line":144},[78,8626,8627],{},"agent = create_agent(\n",[78,8629,8630],{"class":124,"line":150},[78,8631,8632],{},"    \"gpt-5\",\n",[78,8634,8635],{"class":124,"line":156},[78,8636,8637],{},"    tools=[get_user_info],\n",[78,8639,8640],{"class":124,"line":162},[78,8641,8642],{},"    checkpointer=InMemorySaver(),  \n",[78,8644,8645],{"class":124,"line":168},[78,8646,8041],{},[7759,8648,8649],{"id":8649},"摘要信息",[13,8651,8652],{},[617,8653],{"alt":619,"src":8654},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177219356980448.png",[13,8656,8657,8658,8661],{},"要在 Agent 中总结消息历史，可以使用内置的 ",[17,8659,8660],{},"SummarizationMiddleware",":",[114,8663,8665],{"className":116,"code":8664,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import SummarizationMiddleware\nfrom langgraph.checkpoint.memory import InMemorySaver\nfrom langchain_core.runnables import RunnableConfig\n\ncheckpointer = InMemorySaver()\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[],\n    middleware=[\n        SummarizationMiddleware(\n            model=\"gpt-4.1-mini\",  # 可以用一个小模型做总结\n            trigger=(\"tokens\", 4000),\n            keep=(\"messages\", 20)\n        )\n    ],\n    checkpointer=checkpointer,\n)\n",[17,8666,8667,8671,8676,8681,8686,8690,8695,8699,8704,8709,8714,8719,8724,8729,8734,8738,8742,8747],{"__ignoreMap":119},[78,8668,8669],{"class":124,"line":125},[78,8670,8613],{},[78,8672,8673],{"class":124,"line":132},[78,8674,8675],{},"from langchain.agents.middleware import SummarizationMiddleware\n",[78,8677,8678],{"class":124,"line":138},[78,8679,8680],{},"from langgraph.checkpoint.memory import InMemorySaver\n",[78,8682,8683],{"class":124,"line":144},[78,8684,8685],{},"from langchain_core.runnables import RunnableConfig\n",[78,8687,8688],{"class":124,"line":150},[78,8689,129],{"emptyLinePlaceholder":128},[78,8691,8692],{"class":124,"line":156},[78,8693,8694],{},"checkpointer = InMemorySaver()\n",[78,8696,8697],{"class":124,"line":162},[78,8698,8627],{},[78,8700,8701],{"class":124,"line":168},[78,8702,8703],{},"    model=\"gpt-4.1\",\n",[78,8705,8706],{"class":124,"line":174},[78,8707,8708],{},"    tools=[],\n",[78,8710,8711],{"class":124,"line":180},[78,8712,8713],{},"    middleware=[\n",[78,8715,8716],{"class":124,"line":186},[78,8717,8718],{},"        SummarizationMiddleware(\n",[78,8720,8721],{"class":124,"line":192},[78,8722,8723],{},"            model=\"gpt-4.1-mini\",  # 可以用一个小模型做总结\n",[78,8725,8726],{"class":124,"line":198},[78,8727,8728],{},"            trigger=(\"tokens\", 4000),\n",[78,8730,8731],{"class":124,"line":204},[78,8732,8733],{},"            keep=(\"messages\", 20)\n",[78,8735,8736],{"class":124,"line":210},[78,8737,7680],{},[78,8739,8740],{"class":124,"line":216},[78,8741,8254],{},[78,8743,8744],{"class":124,"line":222},[78,8745,8746],{},"    checkpointer=checkpointer,\n",[78,8748,8749],{"class":124,"line":421},[78,8750,8041],{},[107,8752,8754],{"id":8753},"streaming-流式传输","Streaming 流式传输",[13,8756,8757,8758,1018,8761,8764],{},"在 LangChain 中，",[17,8759,8760],{},"stream",[17,8762,8763],{},"astream"," 都是用来实现**流式输出（Streaming）**的方法。它们的核心功能是一致的：允许你在大语言模型（LLM）生成完整响应之前，逐块（chunk）地获取和返回输出数据。这正是实现类似 ChatGPT 那种“打字机”实时回复效果的关键。",[7759,8766,8768,8769,8771],{"id":8767},"_1-stream-同步流式输出","1. ",[17,8770,8760],{}," (同步流式输出)",[13,8773,8774],{},"当你调用它时，它会返回一个标准的 Python 迭代器（Iterator）。",[49,8776,8777,8783],{},[52,8778,8779,8782],{},[22,8780,8781],{},"执行方式","：在循环读取每一个 chunk 的过程中，如果下一个 chunk 还没准备好（例如正在等待网络返回），它会**阻塞（Block）**当前线程。在这个线程等待 LLM 响应期间，程序无法去执行其他任务。",[52,8784,8785,8788,8789,8792],{},[22,8786,8787],{},"语法","：使用标准的 ",[17,8790,8791],{},"for"," 循环。",[114,8794,8798],{"className":8795,"code":8796,"language":8797,"meta":119,"style":119},"language-Python shiki shiki-themes github-dark","# stream 的使用示例\nchat_model = ChatOpenAI()\n\n# 标准的 for 循环\nfor chunk in chat_model.stream(\"讲一个关于程序员的笑话\"):\n    print(chunk.content, end=\"\", flush=True)\n","Python",[17,8799,8800,8805,8810,8814,8819,8824],{"__ignoreMap":119},[78,8801,8802],{"class":124,"line":125},[78,8803,8804],{},"# stream 的使用示例\n",[78,8806,8807],{"class":124,"line":132},[78,8808,8809],{},"chat_model = ChatOpenAI()\n",[78,8811,8812],{"class":124,"line":138},[78,8813,129],{"emptyLinePlaceholder":128},[78,8815,8816],{"class":124,"line":144},[78,8817,8818],{},"# 标准的 for 循环\n",[78,8820,8821],{"class":124,"line":150},[78,8822,8823],{},"for chunk in chat_model.stream(\"讲一个关于程序员的笑话\"):\n",[78,8825,8826],{"class":124,"line":156},[78,8827,8828],{},"    print(chunk.content, end=\"\", flush=True)\n",[7759,8830,8832,8833,8835],{"id":8831},"_2-astream-异步流式输出","2. ",[17,8834,8763],{}," (异步流式输出)",[13,8837,8838,8839,8841],{},"这是一个异步方法（前缀 ",[17,8840,5009],{}," 代表 asynchronous）。调用它会返回一个异步生成器（AsyncGenerator）。",[49,8843,8844,8849],{},[52,8845,8846,8848],{},[22,8847,8781],{},"：它是**非阻塞（Non-blocking）**的。在等待 LLM 返回下一个 chunk 的网络 I\u002FO 期间，它会将控制权交还给事件循环（Event Loop），允许你的程序在等待期间去处理其他并发任务（比如处理另一个用户的 HTTP 请求）。",[52,8850,8851,8853,8854,8857,8858,8792],{},[22,8852,8787],{},"：必须在 ",[17,8855,8856],{},"async def"," 函数中运行，并使用 ",[17,8859,8860],{},"async for",[114,8862,8864],{"className":8795,"code":8863,"language":8797,"meta":119,"style":119},"import asyncio\n\n# astream 的使用示例\nchat_model = ChatOpenAI()\n\nasync def get_streaming_response():\n    # 异步的 async for 循环\n    async for chunk in chat_model.astream(\"讲一个关于程序员的笑话\"):\n        print(chunk.content, end=\"\", flush=True)\nasyncio.run(get_streaming_response())\n",[17,8865,8866,8871,8875,8880,8884,8888,8893,8898,8903,8908],{"__ignoreMap":119},[78,8867,8868],{"class":124,"line":125},[78,8869,8870],{},"import asyncio\n",[78,8872,8873],{"class":124,"line":132},[78,8874,129],{"emptyLinePlaceholder":128},[78,8876,8877],{"class":124,"line":138},[78,8878,8879],{},"# astream 的使用示例\n",[78,8881,8882],{"class":124,"line":144},[78,8883,8809],{},[78,8885,8886],{"class":124,"line":150},[78,8887,129],{"emptyLinePlaceholder":128},[78,8889,8890],{"class":124,"line":156},[78,8891,8892],{},"async def get_streaming_response():\n",[78,8894,8895],{"class":124,"line":162},[78,8896,8897],{},"    # 异步的 async for 循环\n",[78,8899,8900],{"class":124,"line":168},[78,8901,8902],{},"    async for chunk in chat_model.astream(\"讲一个关于程序员的笑话\"):\n",[78,8904,8905],{"class":124,"line":174},[78,8906,8907],{},"        print(chunk.content, end=\"\", flush=True)\n",[78,8909,8910],{"class":124,"line":180},[78,8911,8912],{},"asyncio.run(get_streaming_response())\n",[107,8914,8916],{"id":8915},"structured-output-结构化输出","Structured output 结构化输出",[13,8918,8919,8920,8923,8924],{},"LangChain的 ",[17,8921,8922],{},"create_agent"," 自动处理结构化输出。用户设置他们想要的结构化输出模式，当模型生成结构化数据时，会被捕获、验证，并以代理状态键返回。",[17,8925,8926],{},"'structured_response'",[114,8928,8930],{"className":116,"code":8929,"language":118,"meta":119,"style":119},"def create_agent(\n    ...\n    response_format: Union[\n        ToolStrategy[StructuredResponseT],\n        ProviderStrategy[StructuredResponseT],\n        type[StructuredResponseT],\n        None,\n    ]\n",[17,8931,8932,8937,8942,8947,8952,8957,8962,8967],{"__ignoreMap":119},[78,8933,8934],{"class":124,"line":125},[78,8935,8936],{},"def create_agent(\n",[78,8938,8939],{"class":124,"line":132},[78,8940,8941],{},"    ...\n",[78,8943,8944],{"class":124,"line":138},[78,8945,8946],{},"    response_format: Union[\n",[78,8948,8949],{"class":124,"line":144},[78,8950,8951],{},"        ToolStrategy[StructuredResponseT],\n",[78,8953,8954],{"class":124,"line":150},[78,8955,8956],{},"        ProviderStrategy[StructuredResponseT],\n",[78,8958,8959],{"class":124,"line":156},[78,8960,8961],{},"        type[StructuredResponseT],\n",[78,8963,8964],{"class":124,"line":162},[78,8965,8966],{},"        None,\n",[78,8968,8969],{"class":124,"line":168},[78,8970,8971],{},"    ]\n",[7759,8973,8974],{"id":8974},"响应格式",[13,8976,8977,8978],{},"用于控制代理返回结构化数据的方式：",[17,8979,8980],{},"response_format",[49,8982,8983,8991,8999,9007],{},[52,8984,8985,8990],{},[22,8986,8987],{},[17,8988,8989],{},"ToolStrategy[StructuredResponseT]","：使用工具调用进行结构化输出",[52,8992,8993,8998],{},[22,8994,8995],{},[17,8996,8997],{},"ProviderStrategy[StructuredResponseT]","：使用提供者原生的结构化输出",[52,9000,9001,9006],{},[22,9002,9003],{},[17,9004,9005],{},"type[StructuredResponseT]","：模式类型——根据模型能力自动选择最佳策略",[52,9008,9009,9010,9013],{},"**",[17,9011,9012],{},"无：","**结构化输出未被明确请求",[13,9015,9016],{},"当直接提供模式类型时，LangChain 会自动选择：",[49,9018,9019,9025],{},[52,9020,9021,9024],{},[17,9022,9023],{},"ProviderStrategy","如果所选模型和提供者支持本地结构化输出。",[52,9026,9027,9030],{},[17,9028,9029],{},"ToolStrategy","其他型号。",[7759,9032,9033],{"id":9033},"工具调用策略",[13,9035,9036,9037],{},"对于不支持原生结构化输出的模型，LangChain 使用工具调用来实现相同的结果。这适用于所有支持工具调用的模型（大多数现代型号）。要使用此策略，请配置一个：",[17,9038,9029],{},[114,9040,9042],{"className":116,"code":9041,"language":118,"meta":119,"style":119},"class ToolStrategy(Generic[SchemaT]):\n    schema: type[SchemaT]\n    tool_message_content: str | None\n    handle_errors: Union[\n        bool,\n        str,\n        type[Exception],\n        tuple[type[Exception], ...],\n        Callable[[Exception], str],\n    ]\n",[17,9043,9044,9049,9054,9059,9064,9069,9074,9079,9084,9089],{"__ignoreMap":119},[78,9045,9046],{"class":124,"line":125},[78,9047,9048],{},"class ToolStrategy(Generic[SchemaT]):\n",[78,9050,9051],{"class":124,"line":132},[78,9052,9053],{},"    schema: type[SchemaT]\n",[78,9055,9056],{"class":124,"line":138},[78,9057,9058],{},"    tool_message_content: str | None\n",[78,9060,9061],{"class":124,"line":144},[78,9062,9063],{},"    handle_errors: Union[\n",[78,9065,9066],{"class":124,"line":150},[78,9067,9068],{},"        bool,\n",[78,9070,9071],{"class":124,"line":156},[78,9072,9073],{},"        str,\n",[78,9075,9076],{"class":124,"line":162},[78,9077,9078],{},"        type[Exception],\n",[78,9080,9081],{"class":124,"line":168},[78,9082,9083],{},"        tuple[type[Exception], ...],\n",[78,9085,9086],{"class":124,"line":174},[78,9087,9088],{},"        Callable[[Exception], str],\n",[78,9090,9091],{"class":124,"line":180},[78,9092,8971],{},[226,9094,228],{},{"title":119,"searchDepth":144,"depth":144,"links":9096},[9097,9104,9109,9114,9117,9123],{"id":7756,"depth":132,"text":7757,"children":9098},[9099,9100,9101,9102,9103],{"id":7761,"depth":144,"text":7761},{"id":7803,"depth":144,"text":7803},{"id":7893,"depth":144,"text":7893},{"id":7921,"depth":144,"text":7921},{"id":8006,"depth":144,"text":8006},{"id":8058,"depth":132,"text":8059,"children":9105},[9106,9107,9108],{"id":8062,"depth":144,"text":8062},{"id":8128,"depth":144,"text":8128},{"id":8184,"depth":144,"text":8184},{"id":8291,"depth":132,"text":8292,"children":9110},[9111,9112,9113],{"id":8295,"depth":144,"text":8296},{"id":8357,"depth":144,"text":8358},{"id":8531,"depth":144,"text":8532},{"id":8593,"depth":132,"text":8594,"children":9115},[9116],{"id":8649,"depth":144,"text":8649},{"id":8753,"depth":132,"text":8754,"children":9118},[9119,9121],{"id":8767,"depth":144,"text":9120},"1. stream (同步流式输出)",{"id":8831,"depth":144,"text":9122},"2. astream (异步流式输出)",{"id":8915,"depth":132,"text":8916,"children":9124},[9125,9126],{"id":8974,"depth":144,"text":8974},{"id":9033,"depth":144,"text":9033},"2026-02-27",{},"\u002Flegacy-blog\u002F1772193539212",{"title":7748,"description":119},"legacy-blog\u002F1772193539212",[794,9133],"智能体","RYQUoLT00dHXsI-mRSKlDx_FdedEzPr4K_85ctcAepM",{"id":9136,"title":9137,"assetBase":239,"author":8,"body":9138,"category":787,"collection":233,"date":9127,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":10710,"navigation":128,"originalPath":239,"path":10711,"seo":10712,"source":243,"stem":10713,"tags":10714,"weight":250,"__hash__":10716},"content\u002Flegacy-blog\u002F1772198092147.md","LangChain Middleware",{"type":10,"value":9139,"toc":10691},[9140,9143,9146,9149,9163,9168,9221,9224,9229,9233,9236,9239,9382,9386,9389,9400,9481,9485,9488,9499,9628,9632,9635,9649,9745,9748,9751,9765,9831,9835,9838,9841,9929,9952,9956,9959,9963,9966,9992,10083,10087,10090,10104,10167,10171,10174,10179,10205,10210,10224,10229,10237,10242,10253,10257,10260,10359,10364,10378,10381,10384,10416,10544,10547,10551,10626,10629,10689],[4517,9141,9137],{"id":9142},"langchain-middleware",[107,9144,9145],{"id":9145},"概述",[13,9147,9148],{},"中间件提供了一种更严格控制代理内部发生事情的方法。中间件适用于以下用途：",[49,9150,9151,9154,9157,9160],{},[52,9152,9153],{},"通过日志记录、分析和调试跟踪代理行为。",[52,9155,9156],{},"变换 prompt 提示，工具选择，以及输出格式。",[52,9158,9159],{},"添加 重新生成 ，多重方案 以及早期终止逻辑。",[52,9161,9162],{},"提供 速率限制 等保护机制，以及 PII检测。",[13,9164,9165,9166,8661],{},"通过传递中间件来添加 ",[17,9167,8922],{},[114,9169,9171],{"className":116,"code":9170,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import SummarizationMiddleware, HumanInTheLoopMiddleware\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[...],\n    middleware=[\n        SummarizationMiddleware(...),\n        HumanInTheLoopMiddleware(...)\n    ],\n)\n",[17,9172,9173,9177,9182,9186,9190,9194,9199,9203,9208,9213,9217],{"__ignoreMap":119},[78,9174,9175],{"class":124,"line":125},[78,9176,8613],{},[78,9178,9179],{"class":124,"line":132},[78,9180,9181],{},"from langchain.agents.middleware import SummarizationMiddleware, HumanInTheLoopMiddleware\n",[78,9183,9184],{"class":124,"line":138},[78,9185,129],{"emptyLinePlaceholder":128},[78,9187,9188],{"class":124,"line":144},[78,9189,8627],{},[78,9191,9192],{"class":124,"line":150},[78,9193,8703],{},[78,9195,9196],{"class":124,"line":156},[78,9197,9198],{},"    tools=[...],\n",[78,9200,9201],{"class":124,"line":162},[78,9202,8713],{},[78,9204,9205],{"class":124,"line":168},[78,9206,9207],{},"        SummarizationMiddleware(...),\n",[78,9209,9210],{"class":124,"line":174},[78,9211,9212],{},"        HumanInTheLoopMiddleware(...)\n",[78,9214,9215],{"class":124,"line":180},[78,9216,8254],{},[78,9218,9219],{"class":124,"line":186},[78,9220,8041],{},[13,9222,9223],{},"中间件在每一步之前和之后都暴露了钩子：",[13,9225,9226],{},[617,9227],{"alt":619,"src":9228},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177219813683942.png",[107,9230,9232],{"id":9231},"prebuilt-middleware-预构建中间件","Prebuilt middleware 预构建中间件",[7759,9234,9235],{"id":9235},"通用中间件",[13,9237,9238],{},"以下中间件适用于任何大型语言模型提供商：",[8366,9240,9241,9252],{},[8369,9242,9243],{},[8372,9244,9245,9249],{},[8375,9246,9248],{"align":9247},"center","中间件",[8375,9250,9251],{"align":9247},"描述",[8386,9253,9254,9262,9270,9278,9286,9294,9302,9310,9318,9326,9334,9342,9350,9358,9366,9374],{},[8372,9255,9256,9259],{},[8391,9257,9258],{"align":9247},"Summarization",[8391,9260,9261],{"align":9247},"接近 token 限制时自动总结对话记录。",[8372,9263,9264,9267],{},[8391,9265,9266],{"align":9247},"Human-in-the-loop",[8391,9268,9269],{"align":9247},"暂停执行以供人工批准工具调用。",[8372,9271,9272,9275],{},[8391,9273,9274],{"align":9247},"Model call limit",[8391,9276,9277],{"align":9247},"限制模型调用次数，以防止过高成本。",[8372,9279,9280,9283],{},[8391,9281,9282],{"align":9247},"Tool call limit",[8391,9284,9285],{"align":9247},"通过限制呼叫次数来控制工具执行。",[8372,9287,9288,9291],{},[8391,9289,9290],{"align":9247},"Model fallback",[8391,9292,9293],{"align":9247},"当主模式失败时，会自动回退到其他模式。",[8372,9295,9296,9299],{},[8391,9297,9298],{"align":9247},"PII detection",[8391,9300,9301],{"align":9247},"检测并处理个人身份信息（PII）。",[8372,9303,9304,9307],{},[8391,9305,9306],{"align":9247},"To-do list",[8391,9308,9309],{"align":9247},"为客服人员配备任务规划和跟踪能力。",[8372,9311,9312,9315],{},[8391,9313,9314],{"align":9247},"LLM tool selector",[8391,9316,9317],{"align":9247},"在调用主模型之前，先用LLM选择相关工具。",[8372,9319,9320,9323],{},[8391,9321,9322],{"align":9247},"Tool retry",[8391,9324,9325],{"align":9247},"用指数后退自动重试失败的工具调用。",[8372,9327,9328,9331],{},[8391,9329,9330],{"align":9247},"Model retry",[8391,9332,9333],{"align":9247},"自动用指数退回方式重试失败的模型调用。",[8372,9335,9336,9339],{},[8391,9337,9338],{"align":9247},"LLM tool emulator",[8391,9340,9341],{"align":9247},"用LLM模拟工具执行以进行测试。",[8372,9343,9344,9347],{},[8391,9345,9346],{"align":9247},"Context editing",[8391,9348,9349],{"align":9247},"通过修剪或清理工具使用来管理对话上下文。",[8372,9351,9352,9355],{},[8391,9353,9354],{"align":9247},"Shell tool",[8391,9356,9357],{"align":9247},"向 agent 开放一个持久的 shell 会话以执行命令。",[8372,9359,9360,9363],{},[8391,9361,9362],{"align":9247},"File search",[8391,9364,9365],{"align":9247},"在文件系统文件上提供 Glob 和 Grep 搜索工具。",[8372,9367,9368,9371],{},[8391,9369,9370],{"align":9247},"Filesystem",[8391,9372,9373],{"align":9247},"为 agent 提供存储上下文和长期记忆的文件系统。",[8372,9375,9376,9379],{},[8391,9377,9378],{"align":9247},"Subagent",[8391,9380,9381],{"align":9247},"增加生成子 agent 的能力。",[7759,9383,9385],{"id":9384},"summarization-摘要","Summarization 摘要",[13,9387,9388],{},"当接近令牌限制时自动总结对话历史，保留近期消息同时压缩旧上下文。摘要适用于以下情况：",[49,9390,9391,9394,9397],{},[52,9392,9393],{},"长时间的对话超出上下文窗口。",[52,9395,9396],{},"多回合对话，历史悠久。",[52,9398,9399],{},"在保持完整对话上下文的重要应用中。",[114,9401,9403],{"className":116,"code":9402,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import SummarizationMiddleware\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[your_weather_tool, your_calculator_tool],\n    middleware=[\n        SummarizationMiddleware(\n            model=\"gpt-4.1-mini\",\n            trigger=(\"tokens\", 4000),  # 触发摘要的条件。可以是：\n            # fraction（float）：模型上下文大小的比例（0-1） | tokens（内文）：绝对代币计数 | messages（int）：消息数量 |至少必须指定一个条件。如果不提供，摘要不会自动触发。\n            keep=(\"messages\", 20),  # 总结后应保留多少上下文。具体指定以下之一：\n            # fraction（float）：模型上下文大小的比例（0-1） | tokens（内文）：绝对的代币数量 | messages（int）：需要保留的最近消息数量\n            summary_prompt=\"\",  # 自定义提示模板用于摘要。如果未指定，则使用内置模板。\n        ),\n    ],\n)\n",[17,9404,9405,9409,9413,9417,9421,9425,9430,9434,9438,9443,9448,9453,9458,9463,9468,9473,9477],{"__ignoreMap":119},[78,9406,9407],{"class":124,"line":125},[78,9408,8613],{},[78,9410,9411],{"class":124,"line":132},[78,9412,8675],{},[78,9414,9415],{"class":124,"line":138},[78,9416,129],{"emptyLinePlaceholder":128},[78,9418,9419],{"class":124,"line":144},[78,9420,8627],{},[78,9422,9423],{"class":124,"line":150},[78,9424,8703],{},[78,9426,9427],{"class":124,"line":156},[78,9428,9429],{},"    tools=[your_weather_tool, your_calculator_tool],\n",[78,9431,9432],{"class":124,"line":162},[78,9433,8713],{},[78,9435,9436],{"class":124,"line":168},[78,9437,8718],{},[78,9439,9440],{"class":124,"line":174},[78,9441,9442],{},"            model=\"gpt-4.1-mini\",\n",[78,9444,9445],{"class":124,"line":180},[78,9446,9447],{},"            trigger=(\"tokens\", 4000),  # 触发摘要的条件。可以是：\n",[78,9449,9450],{"class":124,"line":186},[78,9451,9452],{},"            # fraction（float）：模型上下文大小的比例（0-1） | tokens（内文）：绝对代币计数 | messages（int）：消息数量 |至少必须指定一个条件。如果不提供，摘要不会自动触发。\n",[78,9454,9455],{"class":124,"line":192},[78,9456,9457],{},"            keep=(\"messages\", 20),  # 总结后应保留多少上下文。具体指定以下之一：\n",[78,9459,9460],{"class":124,"line":198},[78,9461,9462],{},"            # fraction（float）：模型上下文大小的比例（0-1） | tokens（内文）：绝对的代币数量 | messages（int）：需要保留的最近消息数量\n",[78,9464,9465],{"class":124,"line":204},[78,9466,9467],{},"            summary_prompt=\"\",  # 自定义提示模板用于摘要。如果未指定，则使用内置模板。\n",[78,9469,9470],{"class":124,"line":210},[78,9471,9472],{},"        ),\n",[78,9474,9475],{"class":124,"line":216},[78,9476,8254],{},[78,9478,9479],{"class":124,"line":222},[78,9480,8041],{},[7759,9482,9484],{"id":9483},"human-in-the-loop-人机交互","Human-in-the-loop  人机交互",[13,9486,9487],{},"在执行工具调用前，暂停执行，以便人工批准、编辑或拒绝。人机交互适用于以下情况：",[49,9489,9490,9493,9496],{},[52,9491,9492],{},"需要人工批准的高风险作（例如数据库写入、金融交易）。",[52,9494,9495],{},"必须有人监督的合规工作流程。",[52,9497,9498],{},"长期对话，人工反馈引导经纪人。",[114,9500,9502],{"className":116,"code":9501,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import HumanInTheLoopMiddleware\nfrom langgraph.checkpoint.memory import InMemorySaver\n\ndef read_email_tool(email_id: str) -> str:\n    \"\"\"Mock function to read an email by its ID.\"\"\"\n    return f\"Email content for ID: {email_id}\"\n\ndef send_email_tool(recipient: str, subject: str, body: str) -> str:\n    \"\"\"Mock function to send an email.\"\"\"\n    return f\"Email sent to {recipient} with subject '{subject}'\"\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[your_read_email_tool, your_send_email_tool],\n    checkpointer=InMemorySaver(),\n    middleware=[\n        HumanInTheLoopMiddleware(\n            interrupt_on={\n                \"your_send_email_tool\": {\n                    \"allowed_decisions\": [\"approve\", \"edit\", \"reject\"],\n                },\n                \"your_read_email_tool\": False,\n            }\n        ),\n    ],\n)\n",[17,9503,9504,9508,9513,9517,9521,9526,9531,9536,9540,9545,9550,9555,9559,9563,9567,9572,9577,9581,9586,9591,9596,9601,9606,9611,9616,9620,9624],{"__ignoreMap":119},[78,9505,9506],{"class":124,"line":125},[78,9507,8613],{},[78,9509,9510],{"class":124,"line":132},[78,9511,9512],{},"from langchain.agents.middleware import HumanInTheLoopMiddleware\n",[78,9514,9515],{"class":124,"line":138},[78,9516,8680],{},[78,9518,9519],{"class":124,"line":144},[78,9520,129],{"emptyLinePlaceholder":128},[78,9522,9523],{"class":124,"line":150},[78,9524,9525],{},"def read_email_tool(email_id: str) -> str:\n",[78,9527,9528],{"class":124,"line":156},[78,9529,9530],{},"    \"\"\"Mock function to read an email by its ID.\"\"\"\n",[78,9532,9533],{"class":124,"line":162},[78,9534,9535],{},"    return f\"Email content for ID: {email_id}\"\n",[78,9537,9538],{"class":124,"line":168},[78,9539,129],{"emptyLinePlaceholder":128},[78,9541,9542],{"class":124,"line":174},[78,9543,9544],{},"def send_email_tool(recipient: str, subject: str, body: str) -> str:\n",[78,9546,9547],{"class":124,"line":180},[78,9548,9549],{},"    \"\"\"Mock function to send an email.\"\"\"\n",[78,9551,9552],{"class":124,"line":186},[78,9553,9554],{},"    return f\"Email sent to {recipient} with subject '{subject}'\"\n",[78,9556,9557],{"class":124,"line":192},[78,9558,129],{"emptyLinePlaceholder":128},[78,9560,9561],{"class":124,"line":198},[78,9562,8627],{},[78,9564,9565],{"class":124,"line":204},[78,9566,8703],{},[78,9568,9569],{"class":124,"line":210},[78,9570,9571],{},"    tools=[your_read_email_tool, your_send_email_tool],\n",[78,9573,9574],{"class":124,"line":216},[78,9575,9576],{},"    checkpointer=InMemorySaver(),\n",[78,9578,9579],{"class":124,"line":222},[78,9580,8713],{},[78,9582,9583],{"class":124,"line":421},[78,9584,9585],{},"        HumanInTheLoopMiddleware(\n",[78,9587,9588],{"class":124,"line":427},[78,9589,9590],{},"            interrupt_on={\n",[78,9592,9593],{"class":124,"line":433},[78,9594,9595],{},"                \"your_send_email_tool\": {\n",[78,9597,9598],{"class":124,"line":2443},[78,9599,9600],{},"                    \"allowed_decisions\": [\"approve\", \"edit\", \"reject\"],\n",[78,9602,9603],{"class":124,"line":2448},[78,9604,9605],{},"                },\n",[78,9607,9608],{"class":124,"line":2454},[78,9609,9610],{},"                \"your_read_email_tool\": False,\n",[78,9612,9613],{"class":124,"line":2460},[78,9614,9615],{},"            }\n",[78,9617,9618],{"class":124,"line":2465},[78,9619,9472],{},[78,9621,9622],{"class":124,"line":2470},[78,9623,8254],{},[78,9625,9626],{"class":124,"line":2903},[78,9627,8041],{},[7759,9629,9631],{"id":9630},"shell-tool-命令行工具","Shell tool 命令行工具",[13,9633,9634],{},"向 agent 开放一个持久的壳会话以执行命令。Shell 工具中间件适用于以下用途：",[49,9636,9637,9640,9643,9646],{},[52,9638,9639],{},"需要执行系统命令的 agent",[52,9641,9642],{},"开发与部署自动化任务",[52,9644,9645],{},"测试与验证工作流程",[52,9647,9648],{},"文件系统作与脚本执行",[114,9650,9652],{"className":116,"code":9651,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import (\n    ShellToolMiddleware,\n    HostExecutionPolicy,\n)\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[search_tool],\n    middleware=[\n        ShellToolMiddleware(\n            workspace_root=\"\u002Fworkspace\",  # shell 会话的基础目录。\n            execution_policy=HostExecutionPolicy(), # 执行策略控制超时、输出限制和资源配置。\n            # startup_commands 会话开始后顺序执行的可选命令(比如进入环境)\n            # shutdown_commands 会话关闭前执行的可选命令(比如释放资源)\n            # shell_command 可选的shell可执行文件或参数用于启动持久会话。默认为\u002Fbin\u002Fbash。\n            # env 可选的环境变量可以提供给shell会话。命令执行前，数值会被强制到字符串中。\n        ),\n    ],\n)\n",[17,9653,9654,9658,9663,9668,9673,9677,9681,9685,9689,9694,9698,9703,9708,9713,9718,9723,9728,9733,9737,9741],{"__ignoreMap":119},[78,9655,9656],{"class":124,"line":125},[78,9657,8613],{},[78,9659,9660],{"class":124,"line":132},[78,9661,9662],{},"from langchain.agents.middleware import (\n",[78,9664,9665],{"class":124,"line":138},[78,9666,9667],{},"    ShellToolMiddleware,\n",[78,9669,9670],{"class":124,"line":144},[78,9671,9672],{},"    HostExecutionPolicy,\n",[78,9674,9675],{"class":124,"line":150},[78,9676,8041],{},[78,9678,9679],{"class":124,"line":156},[78,9680,129],{"emptyLinePlaceholder":128},[78,9682,9683],{"class":124,"line":162},[78,9684,8627],{},[78,9686,9687],{"class":124,"line":168},[78,9688,8703],{},[78,9690,9691],{"class":124,"line":174},[78,9692,9693],{},"    tools=[search_tool],\n",[78,9695,9696],{"class":124,"line":180},[78,9697,8713],{},[78,9699,9700],{"class":124,"line":186},[78,9701,9702],{},"        ShellToolMiddleware(\n",[78,9704,9705],{"class":124,"line":192},[78,9706,9707],{},"            workspace_root=\"\u002Fworkspace\",  # shell 会话的基础目录。\n",[78,9709,9710],{"class":124,"line":198},[78,9711,9712],{},"            execution_policy=HostExecutionPolicy(), # 执行策略控制超时、输出限制和资源配置。\n",[78,9714,9715],{"class":124,"line":204},[78,9716,9717],{},"            # startup_commands 会话开始后顺序执行的可选命令(比如进入环境)\n",[78,9719,9720],{"class":124,"line":210},[78,9721,9722],{},"            # shutdown_commands 会话关闭前执行的可选命令(比如释放资源)\n",[78,9724,9725],{"class":124,"line":216},[78,9726,9727],{},"            # shell_command 可选的shell可执行文件或参数用于启动持久会话。默认为\u002Fbin\u002Fbash。\n",[78,9729,9730],{"class":124,"line":222},[78,9731,9732],{},"            # env 可选的环境变量可以提供给shell会话。命令执行前，数值会被强制到字符串中。\n",[78,9734,9735],{"class":124,"line":421},[78,9736,9472],{},[78,9738,9739],{"class":124,"line":427},[78,9740,8254],{},[78,9742,9743],{"class":124,"line":433},[78,9744,8041],{},[7759,9746,9362],{"id":9747},"file-search",[13,9749,9750],{},"在文件系统上提供 Glob 和 Grep 搜索工具。文件搜索中间件适用于以下用途：",[49,9752,9753,9756,9759,9762],{},[52,9754,9755],{},"代码探索与分析",[52,9757,9758],{},"按名称模式查找文件",[52,9760,9761],{},"使用正则表达式搜索代码内容",[52,9763,9764],{},"需要文件发现的大型代码库",[114,9766,9768],{"className":116,"code":9767,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.agents.middleware import FilesystemFileSearchMiddleware\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    tools=[],\n    middleware=[\n        FilesystemFileSearchMiddleware(\n            root_path=\"\u002Fworkspace\",  # 查找根目录\n            use_ripgrep=True,  # 是否使用ripgrep进行搜索。如果ripgrep不可用，则会退回到Python正则表达式。\n            # max_file_size_mb 最大搜索文件大小（MB）。比这个更大的文件会被跳过。\n        ),\n    ],\n)\n",[17,9769,9770,9774,9779,9783,9787,9791,9795,9799,9804,9809,9814,9819,9823,9827],{"__ignoreMap":119},[78,9771,9772],{"class":124,"line":125},[78,9773,8613],{},[78,9775,9776],{"class":124,"line":132},[78,9777,9778],{},"from langchain.agents.middleware import FilesystemFileSearchMiddleware\n",[78,9780,9781],{"class":124,"line":138},[78,9782,129],{"emptyLinePlaceholder":128},[78,9784,9785],{"class":124,"line":144},[78,9786,8627],{},[78,9788,9789],{"class":124,"line":150},[78,9790,8703],{},[78,9792,9793],{"class":124,"line":156},[78,9794,8708],{},[78,9796,9797],{"class":124,"line":162},[78,9798,8713],{},[78,9800,9801],{"class":124,"line":168},[78,9802,9803],{},"        FilesystemFileSearchMiddleware(\n",[78,9805,9806],{"class":124,"line":174},[78,9807,9808],{},"            root_path=\"\u002Fworkspace\",  # 查找根目录\n",[78,9810,9811],{"class":124,"line":180},[78,9812,9813],{},"            use_ripgrep=True,  # 是否使用ripgrep进行搜索。如果ripgrep不可用，则会退回到Python正则表达式。\n",[78,9815,9816],{"class":124,"line":186},[78,9817,9818],{},"            # max_file_size_mb 最大搜索文件大小（MB）。比这个更大的文件会被跳过。\n",[78,9820,9821],{"class":124,"line":192},[78,9822,9472],{},[78,9824,9825],{"class":124,"line":198},[78,9826,8254],{},[78,9828,9829],{"class":124,"line":204},[78,9830,8041],{},[7759,9832,9834],{"id":9833},"subagent-子-agent","Subagent 子 agent",[13,9836,9837],{},"将任务交接给子代理可以隔离上下文，保持主 agent 的上下文窗口干净，同时仍深入任务。",[13,9839,9840],{},"子代理中间件来自 deep agent 允许你通过工具提供次级 agent。",[114,9842,9844],{"className":116,"code":9843,"language":118,"meta":119,"style":119},"from deepagents.middleware.subagents import SubAgentMiddleware\n\nagent = create_agent(\n    model=\"1\",\n    middleware=[\n        SubAgentMiddleware(\n            default_model=\"2\",\n            default_tools=[],\n            subagents=[\n                {\n                    \"name\": \"weather\", \"description\": \"\", \"system_prompt\": \"\",\n                    \"tools\": [], \"model\": \"3\",\n                    \"middleware\": [],\n                }\n            ],\n        )\n    ],\n)\n",[17,9845,9846,9851,9855,9859,9864,9868,9873,9878,9883,9888,9893,9898,9903,9908,9913,9917,9921,9925],{"__ignoreMap":119},[78,9847,9848],{"class":124,"line":125},[78,9849,9850],{},"from deepagents.middleware.subagents import SubAgentMiddleware\n",[78,9852,9853],{"class":124,"line":132},[78,9854,129],{"emptyLinePlaceholder":128},[78,9856,9857],{"class":124,"line":138},[78,9858,8627],{},[78,9860,9861],{"class":124,"line":144},[78,9862,9863],{},"    model=\"1\",\n",[78,9865,9866],{"class":124,"line":150},[78,9867,8713],{},[78,9869,9870],{"class":124,"line":156},[78,9871,9872],{},"        SubAgentMiddleware(\n",[78,9874,9875],{"class":124,"line":162},[78,9876,9877],{},"            default_model=\"2\",\n",[78,9879,9880],{"class":124,"line":168},[78,9881,9882],{},"            default_tools=[],\n",[78,9884,9885],{"class":124,"line":174},[78,9886,9887],{},"            subagents=[\n",[78,9889,9890],{"class":124,"line":180},[78,9891,9892],{},"                {\n",[78,9894,9895],{"class":124,"line":186},[78,9896,9897],{},"                    \"name\": \"weather\", \"description\": \"\", \"system_prompt\": \"\",\n",[78,9899,9900],{"class":124,"line":192},[78,9901,9902],{},"                    \"tools\": [], \"model\": \"3\",\n",[78,9904,9905],{"class":124,"line":198},[78,9906,9907],{},"                    \"middleware\": [],\n",[78,9909,9910],{"class":124,"line":204},[78,9911,9912],{},"                }\n",[78,9914,9915],{"class":124,"line":210},[78,9916,8239],{},[78,9918,9919],{"class":124,"line":216},[78,9920,7680],{},[78,9922,9923],{"class":124,"line":222},[78,9924,8254],{},[78,9926,9927],{"class":124,"line":421},[78,9928,8041],{},[13,9930,9931,9932,1011,9935,1011,9937,9940,9941,9944,9945,9948,9949,9951],{},"subagent 通过",[22,9933,9934],{},"名称",[22,9936,9251],{},[22,9938,9939],{},"系统提示","符和",[22,9942,9943],{},"工具","定义。你也可以提供带有自定义",[22,9946,9947],{},"模型","或额外",[22,9950,9248],{},"的子代理。当你想给子代理一个额外的静态密钥以与主 agent 共享时，这尤其有用。",[107,9953,9955],{"id":9954},"custom-middleware-自定义中间件","Custom middleware 自定义中间件",[13,9957,9958],{},"中间件提供了两种类型的钩子来拦截代理执行：",[7759,9960,9962],{"id":9961},"node-style-hooks-节点式钩子","Node-style hooks 节点式钩子",[13,9964,9965],{},"在特定执行点顺序运行。用于日志记录、验证和状态更新。可用钩子：",[49,9967,9968,9974,9980,9986],{},[52,9969,9970,9973],{},[17,9971,9972],{},"before_agent","- agent 开始前（每次调用一次）",[52,9975,9976,9979],{},[17,9977,9978],{},"before_model","- 每次模型调用前",[52,9981,9982,9985],{},[17,9983,9984],{},"after_model","- 每次模型响应后",[52,9987,9988,9991],{},[17,9989,9990],{},"after_agent","- agent 完成后（每次调用一次）",[114,9993,9995],{"className":116,"code":9994,"language":118,"meta":119,"style":119},"from langchain.agents.middleware import before_model, after_model, AgentState\nfrom langchain.messages import AIMessage\nfrom langgraph.runtime import Runtime\nfrom typing import Any\n\n@before_model(can_jump_to=[\"end\"])\ndef check_message_limit(state: AgentState, runtime: Runtime):\n    if len(state[\"messages\"]) >= 50:\n        return {\n            \"messages\": [AIMessage(\"Conversation limit reached.\")],\n            \"jump_to\": \"end\"\n        }\n    return None\n\n@after_model\ndef log_response(state: AgentState, runtime: Runtime):\n    print(f\"Model returned: {state['messages'][-1].content}\")\n    return None\n",[17,9996,9997,10002,10006,10011,10016,10020,10025,10030,10035,10040,10045,10050,10055,10060,10064,10069,10074,10079],{"__ignoreMap":119},[78,9998,9999],{"class":124,"line":125},[78,10000,10001],{},"from langchain.agents.middleware import before_model, after_model, AgentState\n",[78,10003,10004],{"class":124,"line":132},[78,10005,8194],{},[78,10007,10008],{"class":124,"line":138},[78,10009,10010],{},"from langgraph.runtime import Runtime\n",[78,10012,10013],{"class":124,"line":144},[78,10014,10015],{},"from typing import Any\n",[78,10017,10018],{"class":124,"line":150},[78,10019,129],{"emptyLinePlaceholder":128},[78,10021,10022],{"class":124,"line":156},[78,10023,10024],{},"@before_model(can_jump_to=[\"end\"])\n",[78,10026,10027],{"class":124,"line":162},[78,10028,10029],{},"def check_message_limit(state: AgentState, runtime: Runtime):\n",[78,10031,10032],{"class":124,"line":168},[78,10033,10034],{},"    if len(state[\"messages\"]) >= 50:\n",[78,10036,10037],{"class":124,"line":174},[78,10038,10039],{},"        return {\n",[78,10041,10042],{"class":124,"line":180},[78,10043,10044],{},"            \"messages\": [AIMessage(\"Conversation limit reached.\")],\n",[78,10046,10047],{"class":124,"line":186},[78,10048,10049],{},"            \"jump_to\": \"end\"\n",[78,10051,10052],{"class":124,"line":192},[78,10053,10054],{},"        }\n",[78,10056,10057],{"class":124,"line":198},[78,10058,10059],{},"    return None\n",[78,10061,10062],{"class":124,"line":204},[78,10063,129],{"emptyLinePlaceholder":128},[78,10065,10066],{"class":124,"line":210},[78,10067,10068],{},"@after_model\n",[78,10070,10071],{"class":124,"line":216},[78,10072,10073],{},"def log_response(state: AgentState, runtime: Runtime):\n",[78,10075,10076],{"class":124,"line":222},[78,10077,10078],{},"    print(f\"Model returned: {state['messages'][-1].content}\")\n",[78,10080,10081],{"class":124,"line":421},[78,10082,10059],{},[7759,10084,10086],{"id":10085},"wrap-style-hooks-缠绕式钩子","Wrap-style hooks 缠绕式钩子",[13,10088,10089],{},"当调用处理程序时，拦截执行和控制。用于重试、缓存和转换。你决定调用处理器是零次（短路）、一次（正常流）还是多次（重试逻辑）。可用钩子：",[49,10091,10092,10098],{},[52,10093,10094,10097],{},[17,10095,10096],{},"wrap_model_call","- 围绕每个模型调用",[52,10099,10100,10103],{},[17,10101,10102],{},"wrap_tool_call","- 围绕每个工具调用",[114,10105,10107],{"className":116,"code":10106,"language":118,"meta":119,"style":119},"from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse\nfrom typing import Callable\n\n\n@wrap_model_call\ndef retry_model(request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse],):\n    for attempt in range(3):\n        try:\n            return handler(request)\n        except Exception as e:\n            if attempt == 2: raise\n            print(f\"Retry {attempt + 1}\u002F3 after error: {e}\")\n",[17,10108,10109,10114,10119,10123,10127,10132,10137,10142,10147,10152,10157,10162],{"__ignoreMap":119},[78,10110,10111],{"class":124,"line":125},[78,10112,10113],{},"from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse\n",[78,10115,10116],{"class":124,"line":132},[78,10117,10118],{},"from typing import Callable\n",[78,10120,10121],{"class":124,"line":138},[78,10122,129],{"emptyLinePlaceholder":128},[78,10124,10125],{"class":124,"line":144},[78,10126,129],{"emptyLinePlaceholder":128},[78,10128,10129],{"class":124,"line":150},[78,10130,10131],{},"@wrap_model_call\n",[78,10133,10134],{"class":124,"line":156},[78,10135,10136],{},"def retry_model(request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse],):\n",[78,10138,10139],{"class":124,"line":162},[78,10140,10141],{},"    for attempt in range(3):\n",[78,10143,10144],{"class":124,"line":168},[78,10145,10146],{},"        try:\n",[78,10148,10149],{"class":124,"line":174},[78,10150,10151],{},"            return handler(request)\n",[78,10153,10154],{"class":124,"line":180},[78,10155,10156],{},"        except Exception as e:\n",[78,10158,10159],{"class":124,"line":186},[78,10160,10161],{},"            if attempt == 2: raise\n",[78,10163,10164],{"class":124,"line":192},[78,10165,10166],{},"            print(f\"Retry {attempt + 1}\u002F3 after error: {e}\")\n",[7759,10168,10170],{"id":10169},"decorator-based-middleware-基于装饰器的中间件","Decorator-based middleware 基于装饰器的中间件",[13,10172,10173],{},"单钩中间件快速简单。使用装饰师来包裹各个功能。",[13,10175,10176],{},[22,10177,10178],{},"节点风格：",[49,10180,10181,10187,10193,10199],{},[52,10182,10183,10186],{},[17,10184,10185],{},"@before_agent"," - 在代理开始前运行（每次调用一次）",[52,10188,10189,10192],{},[17,10190,10191],{},"@before_model"," - 在每次模型调用前运行",[52,10194,10195,10198],{},[17,10196,10197],{},"@after_model"," - 每次模型响应后运行",[52,10200,10201,10204],{},[17,10202,10203],{},"@after_agent"," - 在代理完成后运行（每次调用一次）",[13,10206,10207],{},[22,10208,10209],{},"缠绕式：",[49,10211,10212,10218],{},[52,10213,10214,10217],{},[17,10215,10216],{},"@wrap_model_call"," - 用自定义逻辑包裹每个模型调用",[52,10219,10220,10223],{},[17,10221,10222],{},"@wrap_tool_call"," - 用自定义逻辑封装每个工具调用",[13,10225,10226],{},[22,10227,10228],{},"便利性：",[49,10230,10231],{},[52,10232,10233,10236],{},[17,10234,10235],{},"@dynamic_prompt"," - 生成动态系统提示",[13,10238,10239],{},[22,10240,10241],{},"何时使用装饰器模式：",[49,10243,10244,10247,10250],{},[52,10245,10246],{},"需要单钩",[52,10248,10249],{},"无复杂配置",[52,10251,10252],{},"快速原型制作",[7759,10254,10256],{"id":10255},"class-based-middleware-基于类的中间件","Class-based middleware 基于类的中间件",[13,10258,10259],{},"对于拥有多个钩子或配置的复杂中间件来说，功能更强大。当你需要为同一钩子定义同步和非同步实现，或者想在单一中间件中合并多个钩子时，可以使用类。",[114,10261,10263],{"className":116,"code":10262,"language":118,"meta":119,"style":119},"from langchain.agents.middleware import (\n    AgentMiddleware, AgentState,\n    ModelRequest, ModelResponse,\n)\nfrom langgraph.runtime import Runtime\nfrom typing import Any, Callable\n\nclass LoggingMiddleware(AgentMiddleware):\n    def before_model(self, state: AgentState, runtime: Runtime) -> dict[str, Any] | None:\n        print(f\"输入模型的有 {len(state['messages'])} 条信息\")\n        return None\n\n    def after_model(self, state: AgentState, runtime: Runtime) -> dict[str, Any] | None:\n        print(f\"模型回复内容: {state['messages'][-1].content}\")\n        return None\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    middleware=[LoggingMiddleware()],\n    tools=[...],\n)\n",[17,10264,10265,10269,10274,10279,10283,10287,10292,10296,10301,10306,10311,10316,10320,10325,10330,10334,10338,10342,10346,10351,10355],{"__ignoreMap":119},[78,10266,10267],{"class":124,"line":125},[78,10268,9662],{},[78,10270,10271],{"class":124,"line":132},[78,10272,10273],{},"    AgentMiddleware, AgentState,\n",[78,10275,10276],{"class":124,"line":138},[78,10277,10278],{},"    ModelRequest, ModelResponse,\n",[78,10280,10281],{"class":124,"line":144},[78,10282,8041],{},[78,10284,10285],{"class":124,"line":150},[78,10286,10010],{},[78,10288,10289],{"class":124,"line":156},[78,10290,10291],{},"from typing import Any, Callable\n",[78,10293,10294],{"class":124,"line":162},[78,10295,129],{"emptyLinePlaceholder":128},[78,10297,10298],{"class":124,"line":168},[78,10299,10300],{},"class LoggingMiddleware(AgentMiddleware):\n",[78,10302,10303],{"class":124,"line":174},[78,10304,10305],{},"    def before_model(self, state: AgentState, runtime: Runtime) -> dict[str, Any] | None:\n",[78,10307,10308],{"class":124,"line":180},[78,10309,10310],{},"        print(f\"输入模型的有 {len(state['messages'])} 条信息\")\n",[78,10312,10313],{"class":124,"line":186},[78,10314,10315],{},"        return None\n",[78,10317,10318],{"class":124,"line":192},[78,10319,129],{"emptyLinePlaceholder":128},[78,10321,10322],{"class":124,"line":198},[78,10323,10324],{},"    def after_model(self, state: AgentState, runtime: Runtime) -> dict[str, Any] | None:\n",[78,10326,10327],{"class":124,"line":204},[78,10328,10329],{},"        print(f\"模型回复内容: {state['messages'][-1].content}\")\n",[78,10331,10332],{"class":124,"line":210},[78,10333,10315],{},[78,10335,10336],{"class":124,"line":216},[78,10337,129],{"emptyLinePlaceholder":128},[78,10339,10340],{"class":124,"line":222},[78,10341,8627],{},[78,10343,10344],{"class":124,"line":421},[78,10345,8703],{},[78,10347,10348],{"class":124,"line":427},[78,10349,10350],{},"    middleware=[LoggingMiddleware()],\n",[78,10352,10353],{"class":124,"line":433},[78,10354,9198],{},[78,10356,10357],{"class":124,"line":2443},[78,10358,8041],{},[13,10360,10361],{},[22,10362,10363],{},"何时使用类模式：",[49,10365,10366,10369,10372,10375],{},[52,10367,10368],{},"为同一钩子定义同步和异步实现",[52,10370,10371],{},"单个中间件需要多个钩子",[52,10373,10374],{},"需要复杂的配置（例如，可配置阈值、自定义模型）",[52,10376,10377],{},"在项目间重复使用初始时间配置",[7759,10379,10380],{"id":10380},"自定义状态模式",[13,10382,10383],{},"中间件可以通过自定义属性扩展代理状态。这使得中间件能够：",[49,10385,10386,10392,10404,10410],{},[52,10387,10388,10391],{},[22,10389,10390],{},"跨执行跟踪状态","：维护计数器、标志或其他在整个执行生命周期中持续存在的值",[52,10393,10394,10397,10398,10400,10401,10403],{},[22,10395,10396],{},"在钩子之间共享数据","：将信息从",[17,10399,9978],{},"传递到",[17,10402,9984],{},"或不同中间件实例之间",[52,10405,10406,10409],{},[22,10407,10408],{},"实现跨领域关注点","：添加速率限制、使用跟踪、用户上下文或审计日志等功能，而无需修改核心代理逻辑",[52,10411,10412,10415],{},[22,10413,10414],{},"做出有条件决策","：利用累积状态决定是否继续执行、跳转到不同节点或动态修改行为",[114,10417,10419],{"className":116,"code":10418,"language":118,"meta":119,"style":119},"from langchain.agents import create_agent\nfrom langchain.messages import HumanMessage\nfrom langchain.agents.middleware import AgentState, before_model, after_model\nfrom typing_extensions import NotRequired\nfrom typing import Any\nfrom langgraph.runtime import Runtime\n\nclass CustomState(AgentState):\n    model_call_count: NotRequired[int]\n    user_id: NotRequired[str]\n\n@before_model(state_schema=CustomState, can_jump_to=[\"end\"])\ndef check_call_limit(state: CustomState, runtime: Runtime) -> dict[str, Any] | None:\n    count = state.get(\"model_call_count\", 0)\n    if count > 10:\n        return {\"jump_to\": \"end\"}\n    return None\n\n@after_model(state_schema=CustomState)\ndef increment_counter(state: CustomState, runtime: Runtime) -> dict[str, Any] | None:\n    return {\"model_call_count\": state.get(\"model_call_count\", 0) + 1}\n\nagent = create_agent(\n    model=\"gpt-4.1\",\n    middleware=[check_call_limit, increment_counter],\n    tools=[],\n)\n",[17,10420,10421,10425,10430,10435,10440,10444,10448,10452,10457,10462,10467,10471,10476,10481,10486,10491,10496,10500,10504,10509,10514,10519,10523,10527,10531,10536,10540],{"__ignoreMap":119},[78,10422,10423],{"class":124,"line":125},[78,10424,8613],{},[78,10426,10427],{"class":124,"line":132},[78,10428,10429],{},"from langchain.messages import HumanMessage\n",[78,10431,10432],{"class":124,"line":138},[78,10433,10434],{},"from langchain.agents.middleware import AgentState, before_model, after_model\n",[78,10436,10437],{"class":124,"line":144},[78,10438,10439],{},"from typing_extensions import NotRequired\n",[78,10441,10442],{"class":124,"line":150},[78,10443,10015],{},[78,10445,10446],{"class":124,"line":156},[78,10447,10010],{},[78,10449,10450],{"class":124,"line":162},[78,10451,129],{"emptyLinePlaceholder":128},[78,10453,10454],{"class":124,"line":168},[78,10455,10456],{},"class CustomState(AgentState):\n",[78,10458,10459],{"class":124,"line":174},[78,10460,10461],{},"    model_call_count: NotRequired[int]\n",[78,10463,10464],{"class":124,"line":180},[78,10465,10466],{},"    user_id: NotRequired[str]\n",[78,10468,10469],{"class":124,"line":186},[78,10470,129],{"emptyLinePlaceholder":128},[78,10472,10473],{"class":124,"line":192},[78,10474,10475],{},"@before_model(state_schema=CustomState, can_jump_to=[\"end\"])\n",[78,10477,10478],{"class":124,"line":198},[78,10479,10480],{},"def check_call_limit(state: CustomState, runtime: Runtime) -> dict[str, Any] | None:\n",[78,10482,10483],{"class":124,"line":204},[78,10484,10485],{},"    count = state.get(\"model_call_count\", 0)\n",[78,10487,10488],{"class":124,"line":210},[78,10489,10490],{},"    if count > 10:\n",[78,10492,10493],{"class":124,"line":216},[78,10494,10495],{},"        return {\"jump_to\": \"end\"}\n",[78,10497,10498],{"class":124,"line":222},[78,10499,10059],{},[78,10501,10502],{"class":124,"line":421},[78,10503,129],{"emptyLinePlaceholder":128},[78,10505,10506],{"class":124,"line":427},[78,10507,10508],{},"@after_model(state_schema=CustomState)\n",[78,10510,10511],{"class":124,"line":433},[78,10512,10513],{},"def increment_counter(state: CustomState, runtime: Runtime) -> dict[str, Any] | None:\n",[78,10515,10516],{"class":124,"line":2443},[78,10517,10518],{},"    return {\"model_call_count\": state.get(\"model_call_count\", 0) + 1}\n",[78,10520,10521],{"class":124,"line":2448},[78,10522,129],{"emptyLinePlaceholder":128},[78,10524,10525],{"class":124,"line":2454},[78,10526,8627],{},[78,10528,10529],{"class":124,"line":2460},[78,10530,8703],{},[78,10532,10533],{"class":124,"line":2465},[78,10534,10535],{},"    middleware=[check_call_limit, increment_counter],\n",[78,10537,10538],{"class":124,"line":2470},[78,10539,8708],{},[78,10541,10542],{"class":124,"line":2903},[78,10543,8041],{},[7759,10545,10546],{"id":10546},"实例",[10548,10549,10550],"h6",{"id":10550},"工具调用监控",[114,10552,10554],{"className":116,"code":10553,"language":118,"meta":119,"style":119},"@wrap_tool_call\ndef monitor_tool(\n    request: ToolCallRequest,\n    handler: Callable[[ToolCallRequest], ToolMessage | Command],\n) -> ToolMessage | Command:\n    print(f\"Executing tool: {request.tool_call['name']}\")\n    print(f\"Arguments: {request.tool_call['args']}\")\n    try:\n        result = handler(request)\n        print(f\"Tool completed successfully\")\n        return result\n    except Exception as e:\n        print(f\"Tool failed: {e}\")\n        raise\n",[17,10555,10556,10561,10566,10571,10576,10581,10586,10591,10596,10601,10606,10611,10616,10621],{"__ignoreMap":119},[78,10557,10558],{"class":124,"line":125},[78,10559,10560],{},"@wrap_tool_call\n",[78,10562,10563],{"class":124,"line":132},[78,10564,10565],{},"def monitor_tool(\n",[78,10567,10568],{"class":124,"line":138},[78,10569,10570],{},"    request: ToolCallRequest,\n",[78,10572,10573],{"class":124,"line":144},[78,10574,10575],{},"    handler: Callable[[ToolCallRequest], ToolMessage | Command],\n",[78,10577,10578],{"class":124,"line":150},[78,10579,10580],{},") -> ToolMessage | Command:\n",[78,10582,10583],{"class":124,"line":156},[78,10584,10585],{},"    print(f\"Executing tool: {request.tool_call['name']}\")\n",[78,10587,10588],{"class":124,"line":162},[78,10589,10590],{},"    print(f\"Arguments: {request.tool_call['args']}\")\n",[78,10592,10593],{"class":124,"line":168},[78,10594,10595],{},"    try:\n",[78,10597,10598],{"class":124,"line":174},[78,10599,10600],{},"        result = handler(request)\n",[78,10602,10603],{"class":124,"line":180},[78,10604,10605],{},"        print(f\"Tool completed successfully\")\n",[78,10607,10608],{"class":124,"line":186},[78,10609,10610],{},"        return result\n",[78,10612,10613],{"class":124,"line":192},[78,10614,10615],{},"    except Exception as e:\n",[78,10617,10618],{"class":124,"line":198},[78,10619,10620],{},"        print(f\"Tool failed: {e}\")\n",[78,10622,10623],{"class":124,"line":204},[78,10624,10625],{},"        raise\n",[10548,10627,10628],{"id":10628},"动态选择工具",[114,10630,10631],{"className":116,"code":10553,"language":118,"meta":119,"style":119},[17,10632,10633,10637,10641,10645,10649,10653,10657,10661,10665,10669,10673,10677,10681,10685],{"__ignoreMap":119},[78,10634,10635],{"class":124,"line":125},[78,10636,10560],{},[78,10638,10639],{"class":124,"line":132},[78,10640,10565],{},[78,10642,10643],{"class":124,"line":138},[78,10644,10570],{},[78,10646,10647],{"class":124,"line":144},[78,10648,10575],{},[78,10650,10651],{"class":124,"line":150},[78,10652,10580],{},[78,10654,10655],{"class":124,"line":156},[78,10656,10585],{},[78,10658,10659],{"class":124,"line":162},[78,10660,10590],{},[78,10662,10663],{"class":124,"line":168},[78,10664,10595],{},[78,10666,10667],{"class":124,"line":174},[78,10668,10600],{},[78,10670,10671],{"class":124,"line":180},[78,10672,10605],{},[78,10674,10675],{"class":124,"line":186},[78,10676,10610],{},[78,10678,10679],{"class":124,"line":192},[78,10680,10615],{},[78,10682,10683],{"class":124,"line":198},[78,10684,10620],{},[78,10686,10687],{"class":124,"line":204},[78,10688,10625],{},[226,10690,228],{},{"title":119,"searchDepth":144,"depth":144,"links":10692},[10693,10694,10702],{"id":9145,"depth":132,"text":9145},{"id":9231,"depth":132,"text":9232,"children":10695},[10696,10697,10698,10699,10700,10701],{"id":9235,"depth":144,"text":9235},{"id":9384,"depth":144,"text":9385},{"id":9483,"depth":144,"text":9484},{"id":9630,"depth":144,"text":9631},{"id":9747,"depth":144,"text":9362},{"id":9833,"depth":144,"text":9834},{"id":9954,"depth":132,"text":9955,"children":10703},[10704,10705,10706,10707,10708,10709],{"id":9961,"depth":144,"text":9962},{"id":10085,"depth":144,"text":10086},{"id":10169,"depth":144,"text":10170},{"id":10255,"depth":144,"text":10256},{"id":10380,"depth":144,"text":10380},{"id":10546,"depth":144,"text":10546},{},"\u002Flegacy-blog\u002F1772198092147",{"title":9137,"description":119},"legacy-blog\u002F1772198092147",[794,9133,10715],"数据库","Fh0xivMDvgyZpj2LiHUd-K9pnXJE5dJfBpn7h9krcx8",{"id":10718,"title":10719,"assetBase":7,"author":8,"body":10720,"category":10943,"collection":233,"date":10944,"description":10945,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":10946,"navigation":128,"originalPath":239,"path":10947,"seo":10948,"source":243,"stem":10949,"tags":10950,"weight":250,"__hash__":10952},"content\u002Flegacy-blog\u002F1772247039911.md","238. 除了自身以外数组的乘积",{"type":10,"value":10721,"toc":10940},[10722,10741,10760,10764,10778,10782,10796,10800,10823,10835,10837,10839,10938],[13,10723,1202,10724,10726,10727,10730,10731,10734,10735,10737,10738,10740],{},[17,10725,28],{},"，返回 数组 ",[17,10728,10729],{},"answer"," ，其中 ",[17,10732,10733],{},"answer[i]"," 等于 ",[17,10736,28],{}," 中除了 ",[17,10739,35],{}," 之外其余各元素的乘积 。",[13,10742,10743,10744,2500,10746,10748,10749,10752,10753,10756,10757,10759],{},"题目数据 ",[22,10745,1915],{},[17,10747,28],{},"之中任意元素的全部前缀元素和后缀的乘积都在",[22,10750,10751],{},"32 位","整数范围内。\n请 ",[22,10754,10755],{},"不要使用除法，"," 且在 ",[17,10758,4398],{}," 时间复杂度内完成此题。",[13,10761,10762],{},[22,10763,70],{},[72,10765,10766],{},[13,10767,10768,1645,10770,10773,1052,10775],{},[22,10769,1433],{},[17,10771,10772],{},"[1,2,3,4]",[22,10774,1440],{},[17,10776,10777],{},"[24,12,8,6]",[13,10779,10780],{},[22,10781,635],{},[72,10783,10784],{},[13,10785,10786,1645,10788,10791,1052,10793],{},[22,10787,1433],{},[78,10789,10790],{},"-1,1,0,-3,3",[22,10792,1440],{},[78,10794,10795],{},"0,0,9,0,0",[13,10797,10798],{},[22,10799,317],{},[49,10801,10802,10807,10812],{},[52,10803,10804],{},[17,10805,10806],{},"2 \u003C= nums.length \u003C= 105",[52,10808,10809],{},[17,10810,10811],{},"-30 \u003C= nums[i] \u003C= 30",[52,10813,826,10814,10816,10817,10819,10820,10822],{},[22,10815,1915],{},"数组 ",[17,10818,10733],{}," 在",[22,10821,10751],{},"整数范围内",[13,10824,10825,10827,10828,10830,10831,10834],{},[22,10826,1711],{}," 你可以在 ",[17,10829,4296],{}," 的额外空间复杂度内完成这个题目吗？（ 出于对空间复杂度分析的目的，输出数组 ",[22,10832,10833],{},"不被视为"," 额外空间。）",[107,10836,109],{"id":109},[13,10838,112],{},[114,10840,10842],{"className":116,"code":10841,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def productExceptSelf(self, nums):\n        # 乘左边，乘右边\n        n = len(nums)\n        left = 1\n        answer = [1] * n\n        for i in range(n):\n            answer[i] *= left\n            left *= nums[i]\n        right = 1\n        for i in range(n - 1, -1, -1):\n            answer[i] *= right\n            right *= nums[i]\n            \n        return answer\n        \"\"\"\n        :type nums: List[int]\n        :rtype: List[int]\n        \"\"\"\n\n",[17,10843,10844,10848,10852,10857,10862,10867,10872,10877,10882,10887,10892,10897,10902,10907,10912,10917,10922,10926,10930,10934],{"__ignoreMap":119},[78,10845,10846],{"class":124,"line":125},[78,10847,129],{"emptyLinePlaceholder":128},[78,10849,10850],{"class":124,"line":132},[78,10851,135],{},[78,10853,10854],{"class":124,"line":138},[78,10855,10856],{},"    def productExceptSelf(self, nums):\n",[78,10858,10859],{"class":124,"line":144},[78,10860,10861],{},"        # 乘左边，乘右边\n",[78,10863,10864],{"class":124,"line":150},[78,10865,10866],{},"        n = len(nums)\n",[78,10868,10869],{"class":124,"line":156},[78,10870,10871],{},"        left = 1\n",[78,10873,10874],{"class":124,"line":162},[78,10875,10876],{},"        answer = [1] * n\n",[78,10878,10879],{"class":124,"line":168},[78,10880,10881],{},"        for i in range(n):\n",[78,10883,10884],{"class":124,"line":174},[78,10885,10886],{},"            answer[i] *= left\n",[78,10888,10889],{"class":124,"line":180},[78,10890,10891],{},"            left *= nums[i]\n",[78,10893,10894],{"class":124,"line":186},[78,10895,10896],{},"        right = 1\n",[78,10898,10899],{"class":124,"line":192},[78,10900,10901],{},"        for i in range(n - 1, -1, -1):\n",[78,10903,10904],{"class":124,"line":198},[78,10905,10906],{},"            answer[i] *= right\n",[78,10908,10909],{"class":124,"line":204},[78,10910,10911],{},"            right *= nums[i]\n",[78,10913,10914],{"class":124,"line":210},[78,10915,10916],{},"            \n",[78,10918,10919],{"class":124,"line":216},[78,10920,10921],{},"        return answer\n",[78,10923,10924],{"class":124,"line":222},[78,10925,207],{},[78,10927,10928],{"class":124,"line":421},[78,10929,213],{},[78,10931,10932],{"class":124,"line":427},[78,10933,365],{},[78,10935,10936],{"class":124,"line":433},[78,10937,207],{},[226,10939,228],{},{"title":119,"searchDepth":144,"depth":144,"links":10941},[10942],{"id":109,"depth":132,"text":109},"数组 前缀和","2026-02-28","给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积 。",{},"\u002Flegacy-blog\u002F1772247039911",{"title":10719,"description":10945},"legacy-blog\u002F1772247039911",[246,248,10951],"前缀和","TM9jfS5Bm9R4Zua0lUlZFBh7mZuUgIVfRSvcnAtmZbQ",{"id":10954,"title":10955,"assetBase":7,"author":8,"body":10956,"category":11176,"collection":233,"date":10944,"description":11177,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":11178,"navigation":128,"originalPath":239,"path":11179,"seo":11180,"source":243,"stem":11181,"tags":11182,"weight":250,"__hash__":11183},"content\u002Flegacy-blog\u002F1772248750984.md","334. 递增的三元子序列",{"type":10,"value":10957,"toc":11173},[10958,10966,10985,10989,11003,11007,11021,11025,11049,11053,11065,11075,11077,11079,11171],[13,10959,1202,10960,10962,10963,10965],{},[17,10961,28],{}," ，判断这个数组中是否存在长度为 ",[17,10964,1025],{}," 的递增子序列。",[13,10967,10968,10969,10972,10973,10976,10977,996,10980,10982,10983,285],{},"如果存在这样的三元组下标 ",[17,10970,10971],{},"(i, j, k)"," 且满足 ",[17,10974,10975],{},"i \u003C j \u003C k"," ，使得 ",[17,10978,10979],{},"nums[i] \u003C nums[j] \u003C nums[k]",[17,10981,1419],{}," ；否则，返回 ",[17,10984,4593],{},[13,10986,10987],{},[22,10988,293],{},[72,10990,10991],{},[13,10992,10993,1645,10995,10998,1441,11000,11002],{},[22,10994,1040],{},[78,10996,10997],{},"1,2,3,4,5",[22,10999,1047],{},[22,11001,1051],{}," 任何 i \u003C j \u003C k 的三元组都满足题意",[13,11004,11005],{},[22,11006,306],{},[72,11008,11009],{},[13,11010,11011,1645,11013,11016,2542,11018,11020],{},[22,11012,1040],{},[78,11014,11015],{},"5,4,3,2,1",[22,11017,1047],{},[22,11019,1051],{}," 不存在满足题意的三元组",[13,11022,11023],{},[22,11024,1265],{},[72,11026,11027],{},[13,11028,11029,1645,11031,11034,1441,11036,11038,11039,11041,11042,11044,11045,11048],{},[22,11030,1040],{},[78,11032,11033],{},"2,1,5,0,4,6",[22,11035,1047],{},[22,11037,1051],{}," 其中一个满足题意的三元组是 (1, 4, 5)，因为 nums",[78,11040,469],{}," == 1 \u003C nums",[78,11043,1014],{}," == 4 \u003C nums",[78,11046,11047],{},"5"," == 6",[13,11050,11051],{},[22,11052,317],{},[49,11054,11055,11060],{},[52,11056,11057],{},[17,11058,11059],{},"1 \u003C= nums.length \u003C= 5* 105",[52,11061,11062],{},[17,11063,11064],{},"-231 \u003C= nums[i] \u003C= 231 - 1",[13,11066,11067,11069,11070,11072,11073,4399],{},[22,11068,1711],{}," 你能实现时间复杂度为 ",[17,11071,4398],{}," ，空间复杂度为 ",[17,11074,4296],{},[107,11076,109],{"id":109},[13,11078,112],{},[114,11080,11082],{"className":116,"code":11081,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def increasingTriplet(self, nums):\n        # 维护两个变量，first和second，分别表示当前遍历到的元素之前的最小值和次小值\n        # 如果当前元素大于second，说明存在递增三元组，返回True\n        # 否则，更新first和second\n        first = second = float('inf')\n        for num in nums:\n            if num > second:\n                return True\n            elif num > first:\n                second = num\n            else:\n                first = num\n        return False\n        \"\"\"\n        :type nums: List[int]\n        :rtype: bool\n        \"\"\"\n\n",[17,11083,11084,11088,11092,11097,11102,11107,11112,11117,11121,11126,11131,11136,11141,11145,11150,11155,11159,11163,11167],{"__ignoreMap":119},[78,11085,11086],{"class":124,"line":125},[78,11087,129],{"emptyLinePlaceholder":128},[78,11089,11090],{"class":124,"line":132},[78,11091,135],{},[78,11093,11094],{"class":124,"line":138},[78,11095,11096],{},"    def increasingTriplet(self, nums):\n",[78,11098,11099],{"class":124,"line":144},[78,11100,11101],{},"        # 维护两个变量，first和second，分别表示当前遍历到的元素之前的最小值和次小值\n",[78,11103,11104],{"class":124,"line":150},[78,11105,11106],{},"        # 如果当前元素大于second，说明存在递增三元组，返回True\n",[78,11108,11109],{"class":124,"line":156},[78,11110,11111],{},"        # 否则，更新first和second\n",[78,11113,11114],{"class":124,"line":162},[78,11115,11116],{},"        first = second = float('inf')\n",[78,11118,11119],{"class":124,"line":168},[78,11120,2640],{},[78,11122,11123],{"class":124,"line":174},[78,11124,11125],{},"            if num > second:\n",[78,11127,11128],{"class":124,"line":180},[78,11129,11130],{},"                return True\n",[78,11132,11133],{"class":124,"line":186},[78,11134,11135],{},"            elif num > first:\n",[78,11137,11138],{"class":124,"line":192},[78,11139,11140],{},"                second = num\n",[78,11142,11143],{"class":124,"line":198},[78,11144,699],{},[78,11146,11147],{"class":124,"line":204},[78,11148,11149],{},"                first = num\n",[78,11151,11152],{"class":124,"line":210},[78,11153,11154],{},"        return False\n",[78,11156,11157],{"class":124,"line":216},[78,11158,207],{},[78,11160,11161],{"class":124,"line":222},[78,11162,213],{},[78,11164,11165],{"class":124,"line":421},[78,11166,1592],{},[78,11168,11169],{"class":124,"line":427},[78,11170,207],{},[226,11172,228],{},{"title":119,"searchDepth":144,"depth":144,"links":11174},[11175],{"id":109,"depth":132,"text":109},"贪心 数组","给你一个整数数组 nums ，判断这个数组中是否存在长度为 3 的递增子序列。",{},"\u002Flegacy-blog\u002F1772248750984",{"title":10955,"description":11177},"legacy-blog\u002F1772248750984",[246,247,248],"TQ8fzEzGzINYWnfFOQGze1lqi0SpkC5gLegVJ0KaQMs",{"id":11185,"title":11186,"assetBase":7,"author":8,"body":11187,"category":11485,"collection":233,"date":11486,"description":11487,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":11488,"navigation":128,"originalPath":239,"path":11489,"seo":11490,"source":243,"stem":11491,"tags":11492,"weight":250,"__hash__":11493},"content\u002Flegacy-blog\u002F1772506428091.md","443. 压缩字符串",{"type":10,"value":11188,"toc":11482},[11189,11206,11223,11252,11256,11275,11279,11296,11300,11319,11323,11336,11338,11340,11480],[13,11190,11191,11192,11195,11196,11198,11199,11201,11202,11205],{},"给你一个字符数组 ",[17,11193,11194],{},"chars"," ，请使用下述算法压缩：\n从一个空字符串 ",[17,11197,262],{}," 开始。对于 ",[17,11200,11194],{}," 中的每组 ",[22,11203,11204],{},"连续重复字符"," ：",[49,11207,11208,11217],{},[52,11209,11210,11211,11213,11214,11216],{},"如果这一组长度为 ",[17,11212,469],{}," ，则将字符追加到 ",[17,11215,262],{}," 中。",[52,11218,11219,11220,11222],{},"否则，需要向 ",[17,11221,262],{}," 追加字符，后跟这一组的长度。",[13,11224,11225,11226,1052,11228,11231,11232,11234,11235,275,11238,11240,11241,11243,11244,11247,11248,11251],{},"压缩后得到的字符串 ",[17,11227,262],{},[22,11229,11230],{},"不应该直接返回"," ，需要转储到字符数组 ",[17,11233,11194],{}," 中。需要注意的是，如果组长度为 ",[17,11236,11237],{},"10",[17,11239,11237],{}," 以上，则在 ",[17,11242,11194],{}," 数组中会被拆分为多个字符。\n请在 ",[22,11245,11246],{},"修改完输入数组后"," ，返回该数组的新长度。\n你必须设计并实现一个只使用常量额外空间的算法来解决此问题。\n",[22,11249,11250],{},"注意："," 数组中超出返回长度的字符无关紧要，应予忽略。",[13,11253,11254],{},[22,11255,293],{},[72,11257,11258],{},[13,11259,11260,11262,11263,11266,11268,11269,11272,11274],{},[22,11261,1040],{}," chars = ",[78,11264,11265],{},"\"a\",\"a\",\"b\",\"b\",\"c\",\"c\",\"c\"",[22,11267,1047],{}," 返回 6 ，输入数组的前 6 个字符应该是：",[78,11270,11271],{},"\"a\",\"2\",\"b\",\"2\",\"c\",\"3\"",[22,11273,1051],{},"\"aa\" 被 \"a2\" 替代。\"bb\" 被 \"b2\" 替代。\"ccc\" 被 \"c3\" 替代。",[13,11276,11277],{},[22,11278,306],{},[72,11280,11281],{},[13,11282,11283,11262,11285,11288,11290,11291,11293,11295],{},[22,11284,1040],{},[78,11286,11287],{},"\"a\"",[22,11289,1047],{}," 返回 1 ，输入数组的前 1 个字符应该是：",[78,11292,11287],{},[22,11294,1051],{}," 唯一的组是“a”，它保持未压缩，因为它是一个字符。",[13,11297,11298],{},[22,11299,1265],{},[72,11301,11302],{},[13,11303,11304,11262,11306,11309,11311,11312,11315,11316,11318],{},[22,11305,1040],{},[78,11307,11308],{},"\"a\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\",\"b\"",[22,11310,1047],{}," 返回 4 ，输入数组的前 4 个字符应该是：",[78,11313,11314],{},"\"a\",\"b\",\"1\",\"2\"","。\n",[22,11317,1051],{}," 由于字符 \"a\" 不重复，所以不会被压缩。\"bbbbbbbbbbbb\" 被 “b12” 替代。",[13,11320,11321],{},[22,11322,317],{},[49,11324,11325,11330],{},[52,11326,11327],{},[17,11328,11329],{},"1 \u003C= chars.length \u003C= 2000",[52,11331,11332,11335],{},[17,11333,11334],{},"chars[i]"," 可以是小写英文字母、大写英文字母、数字或符号",[107,11337,109],{"id":109},[13,11339,112],{},[114,11341,11343],{"className":116,"code":11342,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def compress(self, chars):\n        if not chars:\n            return 0\n\n        write = read = 0\n        n = len(chars)\n\n        while read \u003C n:\n            current_char = chars[read]  # 当前遍历字符\n            count = 0  # 统计出现次数\n            while read \u003C n and chars[read] == current_char:\n                count += 1\n                read += 1\n            chars[write] = current_char  # 写入当前字符\n            write += 1\n        \n            if count > 1:\n                count_str = str(count)  # 数字转换字符串\n                for digit in count_str:\n                    chars[write] = digit\n                    write += 1\n        \n        return write\n        \"\"\"\n        :type chars: List[str]\n        :rtype: int\n        \"\"\"\n\n",[17,11344,11345,11349,11353,11358,11363,11367,11371,11376,11381,11385,11390,11395,11400,11405,11409,11414,11419,11424,11428,11433,11438,11443,11448,11453,11457,11462,11466,11471,11475],{"__ignoreMap":119},[78,11346,11347],{"class":124,"line":125},[78,11348,129],{"emptyLinePlaceholder":128},[78,11350,11351],{"class":124,"line":132},[78,11352,135],{},[78,11354,11355],{"class":124,"line":138},[78,11356,11357],{},"    def compress(self, chars):\n",[78,11359,11360],{"class":124,"line":144},[78,11361,11362],{},"        if not chars:\n",[78,11364,11365],{"class":124,"line":150},[78,11366,911],{},[78,11368,11369],{"class":124,"line":156},[78,11370,129],{"emptyLinePlaceholder":128},[78,11372,11373],{"class":124,"line":162},[78,11374,11375],{},"        write = read = 0\n",[78,11377,11378],{"class":124,"line":168},[78,11379,11380],{},"        n = len(chars)\n",[78,11382,11383],{"class":124,"line":174},[78,11384,129],{"emptyLinePlaceholder":128},[78,11386,11387],{"class":124,"line":180},[78,11388,11389],{},"        while read \u003C n:\n",[78,11391,11392],{"class":124,"line":186},[78,11393,11394],{},"            current_char = chars[read]  # 当前遍历字符\n",[78,11396,11397],{"class":124,"line":192},[78,11398,11399],{},"            count = 0  # 统计出现次数\n",[78,11401,11402],{"class":124,"line":198},[78,11403,11404],{},"            while read \u003C n and chars[read] == current_char:\n",[78,11406,11407],{"class":124,"line":204},[78,11408,195],{},[78,11410,11411],{"class":124,"line":210},[78,11412,11413],{},"                read += 1\n",[78,11415,11416],{"class":124,"line":216},[78,11417,11418],{},"            chars[write] = current_char  # 写入当前字符\n",[78,11420,11421],{"class":124,"line":222},[78,11422,11423],{},"            write += 1\n",[78,11425,11426],{"class":124,"line":421},[78,11427,1359],{},[78,11429,11430],{"class":124,"line":427},[78,11431,11432],{},"            if count > 1:\n",[78,11434,11435],{"class":124,"line":433},[78,11436,11437],{},"                count_str = str(count)  # 数字转换字符串\n",[78,11439,11440],{"class":124,"line":2443},[78,11441,11442],{},"                for digit in count_str:\n",[78,11444,11445],{"class":124,"line":2448},[78,11446,11447],{},"                    chars[write] = digit\n",[78,11449,11450],{"class":124,"line":2454},[78,11451,11452],{},"                    write += 1\n",[78,11454,11455],{"class":124,"line":2460},[78,11456,1359],{},[78,11458,11459],{"class":124,"line":2465},[78,11460,11461],{},"        return write\n",[78,11463,11464],{"class":124,"line":2470},[78,11465,207],{},[78,11467,11468],{"class":124,"line":2903},[78,11469,11470],{},"        :type chars: List[str]\n",[78,11472,11473],{"class":124,"line":2909},[78,11474,219],{},[78,11476,11478],{"class":124,"line":11477},29,[78,11479,207],{},[226,11481,228],{},{"title":119,"searchDepth":144,"depth":144,"links":11483},[11484],{"id":109,"depth":132,"text":109},"双指针 字符串","2026-03-03","给你一个字符数组 chars ，请使用下述算法压缩：\n从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 ：",{},"\u002Flegacy-blog\u002F1772506428091",{"title":11186,"description":11487},"legacy-blog\u002F1772506428091",[246,451,450],"bBhU0ExSVppo79b-Kc4N-Cy7ukTf48BmRRKaeCADpjQ",{"id":11495,"title":11496,"assetBase":7,"author":8,"body":11497,"category":11668,"collection":233,"date":11669,"description":11670,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":11671,"navigation":128,"originalPath":239,"path":11672,"seo":11673,"source":243,"stem":11674,"tags":11675,"weight":250,"__hash__":11677},"content\u002Flegacy-blog\u002F1772590916451.md","643. 子数组最大平均数 I",{"type":10,"value":11498,"toc":11665},[11499,11510,11519,11526,11530,11546,11550,11562,11566,11581,11583,11585,11663],[13,11500,11501,11502,11504,11505,11507,11508,285],{},"给你一个由 ",[17,11503,19],{}," 个元素组成的整数数组 ",[17,11506,28],{}," 和一个整数 ",[17,11509,5535],{},[13,11511,11512,11513,11518],{},"请你找出平均数最大且 ",[22,11514,11515,11516],{},"长度为 ",[17,11517,5535],{}," 的连续子数组，并输出该最大平均数。",[13,11520,11521,11522,11525],{},"任何误差小于 ",[17,11523,11524],{},"10-5"," 的答案都将被视为正确答案。",[13,11527,11528],{},[22,11529,293],{},[72,11531,11532],{},[13,11533,11534,1645,11536,11539,11540,11542,11543,11545],{},[22,11535,1040],{},[78,11537,11538],{},"1,12,-5,-6,50,3",", k = 4\n",[22,11541,1047],{}," 12.75\n",[22,11544,1051],{}," 最大平均数 (12-5-6+50)\u002F4 = 51\u002F4 = 12.75",[13,11547,11548],{},[22,11549,306],{},[72,11551,11552],{},[13,11553,11554,1645,11556,11558,11559,11561],{},[22,11555,1040],{},[78,11557,11047],{},", k = 1\n",[22,11560,1047],{}," 5.00000",[13,11563,11564],{},[22,11565,317],{},[49,11567,11568,11572,11577],{},[52,11569,11570],{},[17,11571,3650],{},[52,11573,11574],{},[17,11575,11576],{},"1 \u003C= k \u003C= n \u003C= 105",[52,11578,11579],{},[17,11580,1706],{},[107,11582,109],{"id":109},[13,11584,112],{},[114,11586,11588],{"className":116,"code":11587,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def findMaxAverage(self, nums, k):\n        current_sum = sum(nums[:k])\n        max_sum = current_sum\n\n        for i in range(k, len(nums)):\n            current_sum = current_sum - nums[i - k] + nums[i]\n            max_sum = current_sum if current_sum > max_sum else max_sum\n        \n        return float(max_sum) \u002F k\n        \"\"\"\n        :type nums: List[int]\n        :type k: int\n        :rtype: float\n        \"\"\"\n\n",[17,11589,11590,11594,11598,11603,11608,11613,11617,11622,11627,11632,11636,11641,11645,11649,11654,11659],{"__ignoreMap":119},[78,11591,11592],{"class":124,"line":125},[78,11593,129],{"emptyLinePlaceholder":128},[78,11595,11596],{"class":124,"line":132},[78,11597,135],{},[78,11599,11600],{"class":124,"line":138},[78,11601,11602],{},"    def findMaxAverage(self, nums, k):\n",[78,11604,11605],{"class":124,"line":144},[78,11606,11607],{},"        current_sum = sum(nums[:k])\n",[78,11609,11610],{"class":124,"line":150},[78,11611,11612],{},"        max_sum = current_sum\n",[78,11614,11615],{"class":124,"line":156},[78,11616,129],{"emptyLinePlaceholder":128},[78,11618,11619],{"class":124,"line":162},[78,11620,11621],{},"        for i in range(k, len(nums)):\n",[78,11623,11624],{"class":124,"line":168},[78,11625,11626],{},"            current_sum = current_sum - nums[i - k] + nums[i]\n",[78,11628,11629],{"class":124,"line":174},[78,11630,11631],{},"            max_sum = current_sum if current_sum > max_sum else max_sum\n",[78,11633,11634],{"class":124,"line":180},[78,11635,1359],{},[78,11637,11638],{"class":124,"line":186},[78,11639,11640],{},"        return float(max_sum) \u002F k\n",[78,11642,11643],{"class":124,"line":192},[78,11644,207],{},[78,11646,11647],{"class":124,"line":198},[78,11648,213],{},[78,11650,11651],{"class":124,"line":204},[78,11652,11653],{},"        :type k: int\n",[78,11655,11656],{"class":124,"line":210},[78,11657,11658],{},"        :rtype: float\n",[78,11660,11661],{"class":124,"line":216},[78,11662,207],{},[226,11664,228],{},{"title":119,"searchDepth":144,"depth":144,"links":11666},[11667],{"id":109,"depth":132,"text":109},"数组 滑动窗口","2026-03-04","给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。",{},"\u002Flegacy-blog\u002F1772590916451",{"title":11496,"description":11670},"legacy-blog\u002F1772590916451",[246,248,11676],"滑动窗口","Lyx5b0_kjkwaPzPx2GP2GZrMnwLuEnk4_kTMHY-Sz7o",{"id":11679,"title":11680,"assetBase":7,"author":8,"body":11681,"category":11903,"collection":233,"date":11904,"description":11905,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":11906,"navigation":128,"originalPath":239,"path":11907,"seo":11908,"source":243,"stem":11909,"tags":11910,"weight":250,"__hash__":11911},"content\u002Flegacy-blog\u002F1772714593906.md","1004. 最大连续1的个数 III",{"type":10,"value":11682,"toc":11900},[11683,11703,11707,11731,11735,11762,11766,11787,11789,11791,11898],[13,11684,11685,11686,11507,11688,11690,11691,11693,11694,11696,11697,285],{},"给定一个二进制数组 ",[17,11687,28],{},[17,11689,5535],{},"，假设最多可以翻转 ",[17,11692,5535],{}," 个 ",[17,11695,2949],{}," ，则返回执行操作后 ",[596,11698,11699,11700,11702],{},"数组中连续 ",[17,11701,469],{}," 的最大个数",[13,11704,11705],{},[22,11706,293],{},[72,11708,11709],{},[13,11710,11711,1645,11713,11716,11717,11719,11720,1052,11722,11730],{},[22,11712,1040],{},[78,11714,11715],{},"1,1,1,0,0,0,1,1,1,1,0",", K = 2\n",[22,11718,1047],{}," 6\n",[22,11721,1051],{},[78,11723,11724,11725,11727,11728],{},"1,1,1,0,0,",[22,11726,469],{},",1,1,1,1,",[22,11729,469],{},"\n粗体数字从 0 翻转到 1，最长的子数组长度为 6。",[13,11732,11733],{},[22,11734,306],{},[72,11736,11737],{},[13,11738,11739,1645,11741,11744,11745,11747,11748,1052,11750,11761],{},[22,11740,1040],{},[78,11742,11743],{},"0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1",", K = 3\n",[22,11746,1047],{}," 10\n",[22,11749,1051],{},[78,11751,11752,11753,2066,11755,11757,11758,11760],{},"0,0,1,1,",[22,11754,469],{},[22,11756,469],{},",1,1,1,",[22,11759,469],{},",1,1,0,0,0,1,1,1,1","\n粗体数字从 0 翻转到 1，最长的子数组长度为 10。",[13,11763,11764],{},[22,11765,317],{},[49,11767,11768,11773,11782],{},[52,11769,11770],{},[17,11771,11772],{},"1 \u003C= nums.length \u003C= 105",[52,11774,11775,2972,11777,11779,11780],{},[17,11776,35],{},[17,11778,2949],{}," 就是 ",[17,11781,469],{},[52,11783,11784],{},[17,11785,11786],{},"0 \u003C= k \u003C= nums.length",[107,11788,109],{"id":109},[13,11790,112],{},[114,11792,11794],{"className":116,"code":11793,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def longestOnes(self, nums, k):\n        count0 = 0\n        max_len = 0\n        left = 0\n        for right in range(len(nums)):\n            if nums[right] == 0:  # 右指针遇到0\n                count0 += 1\n            \n            while count0 > k:  # 数量超过k收缩左指针\n                if nums[left] == 0:\n                    count0 -= 1\n                left += 1\n            current_len = right - left + 1\n            max_len = max(max_len, current_len)\n        return max_len\n        \"\"\"\n        :type nums: List[int]\n        :type k: int\n        :rtype: int\n        \"\"\"\n\n",[17,11795,11796,11800,11804,11809,11814,11819,11824,11829,11834,11839,11843,11848,11853,11858,11863,11868,11873,11878,11882,11886,11890,11894],{"__ignoreMap":119},[78,11797,11798],{"class":124,"line":125},[78,11799,129],{"emptyLinePlaceholder":128},[78,11801,11802],{"class":124,"line":132},[78,11803,135],{},[78,11805,11806],{"class":124,"line":138},[78,11807,11808],{},"    def longestOnes(self, nums, k):\n",[78,11810,11811],{"class":124,"line":144},[78,11812,11813],{},"        count0 = 0\n",[78,11815,11816],{"class":124,"line":150},[78,11817,11818],{},"        max_len = 0\n",[78,11820,11821],{"class":124,"line":156},[78,11822,11823],{},"        left = 0\n",[78,11825,11826],{"class":124,"line":162},[78,11827,11828],{},"        for right in range(len(nums)):\n",[78,11830,11831],{"class":124,"line":168},[78,11832,11833],{},"            if nums[right] == 0:  # 右指针遇到0\n",[78,11835,11836],{"class":124,"line":174},[78,11837,11838],{},"                count0 += 1\n",[78,11840,11841],{"class":124,"line":180},[78,11842,10916],{},[78,11844,11845],{"class":124,"line":186},[78,11846,11847],{},"            while count0 > k:  # 数量超过k收缩左指针\n",[78,11849,11850],{"class":124,"line":192},[78,11851,11852],{},"                if nums[left] == 0:\n",[78,11854,11855],{"class":124,"line":198},[78,11856,11857],{},"                    count0 -= 1\n",[78,11859,11860],{"class":124,"line":204},[78,11861,11862],{},"                left += 1\n",[78,11864,11865],{"class":124,"line":210},[78,11866,11867],{},"            current_len = right - left + 1\n",[78,11869,11870],{"class":124,"line":216},[78,11871,11872],{},"            max_len = max(max_len, current_len)\n",[78,11874,11875],{"class":124,"line":222},[78,11876,11877],{},"        return max_len\n",[78,11879,11880],{"class":124,"line":421},[78,11881,207],{},[78,11883,11884],{"class":124,"line":427},[78,11885,213],{},[78,11887,11888],{"class":124,"line":433},[78,11889,11653],{},[78,11891,11892],{"class":124,"line":2443},[78,11893,219],{},[78,11895,11896],{"class":124,"line":2448},[78,11897,207],{},[226,11899,228],{},{"title":119,"searchDepth":144,"depth":144,"links":11901},[11902],{"id":109,"depth":132,"text":109},"滑动窗口 前缀和 数组","2026-03-05","给定一个二进制数组 nums 和一个整数 k，假设最多可以翻转 k 个 0 ，则返回执行操作后 数组中连续 1 的最大个数 。",{},"\u002Flegacy-blog\u002F1772714593906",{"title":11680,"description":11905},"legacy-blog\u002F1772714593906",[246,11676,10951,248],"AZl-rpwRC3x5HKIdzc8aFfp6mhhayo4JipZiLFG7Ok4",{"id":11913,"title":11914,"assetBase":7,"author":8,"body":11915,"category":12121,"collection":233,"date":11904,"description":12122,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":12123,"navigation":128,"originalPath":239,"path":12124,"seo":12125,"source":243,"stem":12126,"tags":12127,"weight":250,"__hash__":12128},"content\u002Flegacy-blog\u002F1772715851102.md","1493. 删掉一个元素以后全为 1 的最长子数组",{"type":10,"value":11916,"toc":12118},[11917,11923,11926,11929,11934,11952,11956,11977,11981,11994,11998,12013,12015,12017,12116],[13,11918,11919,11920,11922],{},"给你一个二进制数组 ",[17,11921,28],{}," ，你需要从中删掉一个元素。",[13,11924,11925],{},"请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。",[13,11927,11928],{},"如果不存在这样的子数组，请返回 0 。",[13,11930,11931],{},[22,11932,11933],{},"提示 1：",[72,11935,11936],{},[13,11937,11938,1645,11940,11943,1048,11945,11947,11948,11951],{},[22,11939,1040],{},[78,11941,11942],{},"1,1,0,1",[22,11944,1047],{},[22,11946,1051],{}," 删掉位置 2 的数后，",[78,11949,11950],{},"1,1,1"," 包含 3 个 1 。",[13,11953,11954],{},[22,11955,306],{},[72,11957,11958],{},[13,11959,11960,1645,11962,11965,3233,11967,11969,11970,11973,11974,285],{},[22,11961,1040],{},[78,11963,11964],{},"0,1,1,1,0,1,1,0,1",[22,11966,1047],{},[22,11968,1051],{}," 删掉位置 4 的数字后，",[78,11971,11972],{},"0,1,1,1,1,1,0,1"," 的最长全 1 子数组为 ",[78,11975,11976],{},"1,1,1,1,1",[13,11978,11979],{},[22,11980,1265],{},[72,11982,11983],{},[13,11984,11985,1645,11987,11989,1071,11991,11993],{},[22,11986,1040],{},[78,11988,11950],{},[22,11990,1047],{},[22,11992,1051],{}," 你必须要删除一个元素。",[13,11995,11996],{},[22,11997,317],{},[49,11999,12000,12004],{},[52,12001,12002],{},[17,12003,11772],{},[52,12005,12006,12008,12009,12008,12011,285],{},[17,12007,35],{}," 要么是 ",[17,12010,2949],{},[17,12012,469],{},[107,12014,109],{"id":109},[13,12016,112],{},[114,12018,12020],{"className":116,"code":12019,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def longestSubarray(self, nums):\n        max_len = 0\n        left = zero_count = 0\n        for right in range(len(nums)):\n            if nums[right] == 0:\n                zero_count += 1\n            while zero_count > 1:  # 移动左边界，直到窗口中数量小于1\n                if nums[left] == 0:\n                    zero_count -= 1\n                left += 1\n            current_len = right - left\n            max_len = max(max_len, current_len)\n \n        # 特殊情况，数组全1，至少删除一个\u002F为空返回0\n        return max_len if max_len != len(nums) else len(nums) - 1 if nums else 0\n        \"\"\"\n        :type nums: List[int]\n        :rtype: int\n        \"\"\"\n\n",[17,12021,12022,12026,12030,12035,12039,12044,12048,12053,12058,12063,12067,12072,12076,12081,12085,12090,12095,12100,12104,12108,12112],{"__ignoreMap":119},[78,12023,12024],{"class":124,"line":125},[78,12025,129],{"emptyLinePlaceholder":128},[78,12027,12028],{"class":124,"line":132},[78,12029,135],{},[78,12031,12032],{"class":124,"line":138},[78,12033,12034],{},"    def longestSubarray(self, nums):\n",[78,12036,12037],{"class":124,"line":144},[78,12038,11818],{},[78,12040,12041],{"class":124,"line":150},[78,12042,12043],{},"        left = zero_count = 0\n",[78,12045,12046],{"class":124,"line":156},[78,12047,11828],{},[78,12049,12050],{"class":124,"line":162},[78,12051,12052],{},"            if nums[right] == 0:\n",[78,12054,12055],{"class":124,"line":168},[78,12056,12057],{},"                zero_count += 1\n",[78,12059,12060],{"class":124,"line":174},[78,12061,12062],{},"            while zero_count > 1:  # 移动左边界，直到窗口中数量小于1\n",[78,12064,12065],{"class":124,"line":180},[78,12066,11852],{},[78,12068,12069],{"class":124,"line":186},[78,12070,12071],{},"                    zero_count -= 1\n",[78,12073,12074],{"class":124,"line":192},[78,12075,11862],{},[78,12077,12078],{"class":124,"line":198},[78,12079,12080],{},"            current_len = right - left\n",[78,12082,12083],{"class":124,"line":204},[78,12084,11872],{},[78,12086,12087],{"class":124,"line":210},[78,12088,12089],{}," \n",[78,12091,12092],{"class":124,"line":216},[78,12093,12094],{},"        # 特殊情况，数组全1，至少删除一个\u002F为空返回0\n",[78,12096,12097],{"class":124,"line":222},[78,12098,12099],{},"        return max_len if max_len != len(nums) else len(nums) - 1 if nums else 0\n",[78,12101,12102],{"class":124,"line":421},[78,12103,207],{},[78,12105,12106],{"class":124,"line":427},[78,12107,213],{},[78,12109,12110],{"class":124,"line":433},[78,12111,219],{},[78,12113,12114],{"class":124,"line":2443},[78,12115,207],{},[226,12117,228],{},{"title":119,"searchDepth":144,"depth":144,"links":12119},[12120],{"id":109,"depth":132,"text":109},"数组 动态规划 滑动窗口","给你一个二进制数组 nums ，你需要从中删掉一个元素。",{},"\u002Flegacy-blog\u002F1772715851102",{"title":11914,"description":12122},"legacy-blog\u002F1772715851102",[246,248,249,11676],"RR7jaOKu8898mqihQekoLEnMc6xXkXAuxG9XpULUxfc",{"id":12130,"title":12131,"assetBase":7,"author":8,"body":12132,"category":12349,"collection":233,"date":12350,"description":12351,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":12352,"navigation":128,"originalPath":239,"path":12353,"seo":12354,"source":243,"stem":12355,"tags":12356,"weight":250,"__hash__":12357},"content\u002Flegacy-blog\u002F1772882074756.md","1657. 确定两个字符串是否接近",{"type":10,"value":12133,"toc":12346},[12134,12140,12147,12180,12183,12202,12206,12218,12222,12234,12238,12254,12258,12272,12274,12276,12344],[13,12135,12136,12137,11205],{},"如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 ",[22,12138,12139],{},"接近",[13,12141,12142,12143,12146],{},"*操作 1：交换任意两个",[22,12144,12145],{},"现有"," 字符。",[49,12148,12149,12161],{},[52,12150,2960,12151,12154,12155,12157,12158,12160],{},[17,12152,12153],{},"abcde -> aecdb","\n*操作 2：将一个",[22,12156,12145],{},"字符的每次出现转换为另一个",[22,12159,12145],{}," 字符，并对另一个字符执行相同的操作。",[52,12162,2960,12163,12166,12167,12169,12170,12173,12174,12176,12177,12179],{},[17,12164,12165],{},"aacabb -> bbcbaa","（所有 ",[17,12168,5009],{}," 转化为 ",[17,12171,12172],{},"b"," ，而所有的 ",[17,12175,12172],{}," 转换为 ",[17,12178,5009],{}," ）",[13,12181,12182],{},"你可以根据需要对任意一个字符串多次使用这两种操作。",[13,12184,12185,12186,1018,12188,12190,12191,1018,12193,1052,12195,12197,12198,10982,12200,285],{},"给你两个字符串，",[17,12187,3175],{},[17,12189,3178],{}," 。如果 ",[17,12192,3175],{},[17,12194,3178],{},[22,12196,12139],{}," ，就返回 ",[17,12199,1419],{},[17,12201,4593],{},[13,12203,12204],{},[22,12205,293],{},[72,12207,12208],{},[13,12209,12210,12212,12213,1441,12215,12217],{},[22,12211,1040],{}," word1 = \"abc\", word2 = \"bca\"\n",[22,12214,1047],{},[22,12216,1051],{}," 2 次操作从 word1 获得 word2 。\n执行操作 1：\"abc\" -> \"acb\"\n执行操作 1：\"acb\" -> \"bca\"",[13,12219,12220],{},[22,12221,306],{},[72,12223,12224],{},[13,12225,12226,12228,12229,2542,12231,12233],{},[22,12227,1040],{}," word1 = \"a\", word2 = \"aa\"\n",[22,12230,1047],{},[22,12232,1051],{}," 不管执行多少次操作，都无法从 word1 得到 word2 ，反之亦然。",[13,12235,12236],{},[22,12237,1265],{},[72,12239,12240],{},[13,12241,12242,12244,12245,1441,12247,12249,12250,12253],{},[22,12243,1040],{}," word1 = \"cabbba\", word2 = \"abbccc\"\n",[22,12246,1047],{},[22,12248,1051],{}," 3 次操作从 word1 获得 word2 。\n执行操作 1：\"cabbba\" -> \"caabbb\"\n执行操作 2：",[17,12251,12252],{},"\"","caabbb\" -> \"baaccc\"\n执行操作 2：\"baaccc\" -> \"abbccc\"",[13,12255,12256],{},[22,12257,317],{},[49,12259,12260,12265],{},[52,12261,12262],{},[17,12263,12264],{},"1 \u003C= word1.length, word2.length \u003C= 105",[52,12266,12267,1018,12269,12271],{},[17,12268,3175],{},[17,12270,3178],{}," 仅包含小写英文字母",[107,12273,109],{"id":109},[13,12275,112],{},[114,12277,12279],{"className":116,"code":12278,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def closeStrings(self, word1, word2):\n        return (len(word1) == len(word2) and\n                set(word1) == set(word2) and\n                sorted(Counter(word1).values()) == sorted(Counter(word2).values()))\n        # 条件1：两个字符串长度必须相等（长度不同不可能是接近字符串） \n        # 条件2：两个字符串的字符集合必须相等（字符种类完全一致） \n        # 条件3：字符出现次数的列表排序后相等（次数分布一致）\n        \"\"\"\n        :type word1: str\n        :type word2: str\n        :rtype: bool\n        \"\"\"\n\n",[17,12280,12281,12285,12289,12294,12299,12304,12309,12314,12319,12324,12328,12332,12336,12340],{"__ignoreMap":119},[78,12282,12283],{"class":124,"line":125},[78,12284,129],{"emptyLinePlaceholder":128},[78,12286,12287],{"class":124,"line":132},[78,12288,135],{},[78,12290,12291],{"class":124,"line":138},[78,12292,12293],{},"    def closeStrings(self, word1, word2):\n",[78,12295,12296],{"class":124,"line":144},[78,12297,12298],{},"        return (len(word1) == len(word2) and\n",[78,12300,12301],{"class":124,"line":150},[78,12302,12303],{},"                set(word1) == set(word2) and\n",[78,12305,12306],{"class":124,"line":156},[78,12307,12308],{},"                sorted(Counter(word1).values()) == sorted(Counter(word2).values()))\n",[78,12310,12311],{"class":124,"line":162},[78,12312,12313],{},"        # 条件1：两个字符串长度必须相等（长度不同不可能是接近字符串） \n",[78,12315,12316],{"class":124,"line":168},[78,12317,12318],{},"        # 条件2：两个字符串的字符集合必须相等（字符种类完全一致） \n",[78,12320,12321],{"class":124,"line":174},[78,12322,12323],{},"        # 条件3：字符出现次数的列表排序后相等（次数分布一致）\n",[78,12325,12326],{"class":124,"line":180},[78,12327,207],{},[78,12329,12330],{"class":124,"line":186},[78,12331,3379],{},[78,12333,12334],{"class":124,"line":192},[78,12335,3384],{},[78,12337,12338],{"class":124,"line":198},[78,12339,1592],{},[78,12341,12342],{"class":124,"line":204},[78,12343,207],{},[226,12345,228],{},{"title":119,"searchDepth":144,"depth":144,"links":12347},[12348],{"id":109,"depth":132,"text":109},"字符串 排序","2026-03-07","如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：",{},"\u002Flegacy-blog\u002F1772882074756",{"title":12131,"description":12351},"legacy-blog\u002F1772882074756",[246,450,3759],"IvHl0qH-DdeEQp9WjHw51qxNCUISbc64blLl90mrHbo",{"id":12359,"title":12360,"assetBase":7,"author":8,"body":12361,"category":12567,"collection":233,"date":12350,"description":12568,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":12569,"navigation":128,"originalPath":239,"path":12570,"seo":12571,"source":243,"stem":12572,"tags":12573,"weight":250,"__hash__":12574},"content\u002Flegacy-blog\u002F1772883032576.md","2352. 相等行列对",{"type":10,"value":12362,"toc":12564},[12363,12388,12391,12398,12424,12431,12469,12473,12490,12492,12494,12562],[13,12364,12365,12366,12368,12369,12372,12373,12375,12376,12379,12380,12383,12384,12387],{},"给你一个下标从 ",[22,12367,2949],{}," 开始、大小为 ",[17,12370,12371],{},"n x n"," 的整数矩阵 ",[17,12374,2041],{}," ，返回满足 ",[17,12377,12378],{},"Ri"," 行和 ",[17,12381,12382],{},"Cj"," 列相等的行列对 ",[17,12385,12386],{},"(Ri, Cj)"," 的数目。",[13,12389,12390],{},"如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。",[13,12392,12393,12395],{},[22,12394,293],{},[617,12396],{"alt":619,"src":12397},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177288308309432.jpeg",[72,12399,12400,12417],{},[13,12401,12402,12404,12405,2066,12408,2070,12411,12413,12414,12416],{},[22,12403,1040],{}," grid = [[3,2,1],",[78,12406,12407],{},"1,7,6",[78,12409,12410],{},"2,7,7",[22,12412,1047],{}," 1\n",[22,12415,1051],{}," 存在一对相等行列对：",[49,12418,12419],{},[52,12420,12421,12422],{},"(第 2 行，第 1 列)：",[78,12423,12410],{},[13,12425,12426,12428],{},[22,12427,306],{},[617,12429],{"alt":619,"src":12430},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177288309234775.jpeg",[72,12432,12433,12451],{},[13,12434,12435,12437,12438,2066,12441,2066,12444,2070,12446,1048,12448,12450],{},[22,12436,1040],{}," grid = [[3,1,2,2],",[78,12439,12440],{},"1,4,4,5",[78,12442,12443],{},"2,4,2,2",[78,12445,12443],{},[22,12447,1047],{},[22,12449,1051],{}," 存在三对相等行列对：",[49,12452,12453,12459,12464],{},[52,12454,12455,12456],{},"(第 0 行，第 0 列)：",[78,12457,12458],{},"3,1,2,2",[52,12460,12461,12462],{},"(第 2 行, 第 2 列)：",[78,12463,12443],{},[52,12465,12466,12467],{},"(第 3 行, 第 2 列)：",[78,12468,12443],{},[13,12470,12471],{},[22,12472,317],{},[49,12474,12475,12480,12485],{},[52,12476,12477],{},[17,12478,12479],{},"n == grid.length == grid[i].length",[52,12481,12482],{},[17,12483,12484],{},"1 \u003C= n \u003C= 200",[52,12486,12487],{},[17,12488,12489],{},"1 \u003C= grid[i][j] \u003C= 105",[107,12491,109],{"id":109},[13,12493,112],{},[114,12495,12497],{"className":116,"code":12496,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def equalPairs(self, grid):\n        ans = 0\n        for x in zip(*grid):\n            lx = list(x)\n            for y in grid:\n                if lx == y:\n                    ans += 1\n        return ans\n        \"\"\"\n        :type grid: List[List[int]]\n        :rtype: int\n        \"\"\"\n\n",[17,12498,12499,12503,12507,12512,12517,12522,12527,12532,12537,12542,12546,12550,12554,12558],{"__ignoreMap":119},[78,12500,12501],{"class":124,"line":125},[78,12502,129],{"emptyLinePlaceholder":128},[78,12504,12505],{"class":124,"line":132},[78,12506,135],{},[78,12508,12509],{"class":124,"line":138},[78,12510,12511],{},"    def equalPairs(self, grid):\n",[78,12513,12514],{"class":124,"line":144},[78,12515,12516],{},"        ans = 0\n",[78,12518,12519],{"class":124,"line":150},[78,12520,12521],{},"        for x in zip(*grid):\n",[78,12523,12524],{"class":124,"line":156},[78,12525,12526],{},"            lx = list(x)\n",[78,12528,12529],{"class":124,"line":162},[78,12530,12531],{},"            for y in grid:\n",[78,12533,12534],{"class":124,"line":168},[78,12535,12536],{},"                if lx == y:\n",[78,12538,12539],{"class":124,"line":174},[78,12540,12541],{},"                    ans += 1\n",[78,12543,12544],{"class":124,"line":180},[78,12545,436],{},[78,12547,12548],{"class":124,"line":186},[78,12549,207],{},[78,12551,12552],{"class":124,"line":192},[78,12553,2214],{},[78,12555,12556],{"class":124,"line":198},[78,12557,219],{},[78,12559,12560],{"class":124,"line":204},[78,12561,207],{},[226,12563,228],{},{"title":119,"searchDepth":144,"depth":144,"links":12565},[12566],{"id":109,"depth":132,"text":109},"数组 哈希表 矩阵","给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。",{},"\u002Flegacy-blog\u002F1772883032576",{"title":12360,"description":12568},"legacy-blog\u002F1772883032576",[246,248,449,2236],"7DY7y2HQaaN6QonaO7cmW5ejvZciD79m-JsniHwkWfM",{"id":12576,"title":12577,"assetBase":7,"author":8,"body":12578,"category":12817,"collection":233,"date":12350,"description":12818,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":12819,"navigation":128,"originalPath":239,"path":12820,"seo":12821,"source":243,"stem":12822,"tags":12823,"weight":250,"__hash__":12825},"content\u002Flegacy-blog\u002F1772885453424.md","735. 小行星碰撞",{"type":10,"value":12579,"toc":12814},[12580,12587,12590,12593,12597,12615,12619,12635,12639,12655,12659,12676,12680,12697,12699,12701,12812],[13,12581,12582,12583,12586],{},"给定一个整数数组 ",[17,12584,12585],{},"asteroids","，表示在同一行的小行星。数组中小行星的索引表示它们在空间中的相对位置。",[13,12588,12589],{},"对于数组中的每一个元素，其绝对值表示小行星的大小，正负表示小行星的移动方向（正表示向右移动，负表示向左移动）。每一颗小行星以相同的速度移动。",[13,12591,12592],{},"找出碰撞后剩下的所有小行星。碰撞规则：两个小行星相互碰撞，较小的小行星会爆炸。如果两颗小行星大小相同，则两颗小行星都会爆炸。两颗移动方向相同的小行星，永远不会发生碰撞。",[13,12594,12595],{},[22,12596,293],{},[72,12598,12599],{},[13,12600,12601,12603,12604,12607,12609,12612,12614],{},[22,12602,1040],{}," asteroids = ",[78,12605,12606],{},"5,10,-5",[22,12608,1047],{},[78,12610,12611],{},"5,10",[22,12613,1051],{}," 10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。",[13,12616,12617],{},[22,12618,306],{},[72,12620,12621],{},[13,12622,12623,12603,12625,12628,12630,12632,12634],{},[22,12624,1040],{},[78,12626,12627],{},"8,-8",[22,12629,1047],{},[78,12631],{},[22,12633,1051],{}," 8 和 -8 碰撞后，两者都发生爆炸。",[13,12636,12637],{},[22,12638,1265],{},[72,12640,12641],{},[13,12642,12643,12603,12645,12648,12650,12652,12654],{},[22,12644,1040],{},[78,12646,12647],{},"10,2,-5",[22,12649,1047],{},[78,12651,11237],{},[22,12653,1051],{}," 2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。",[13,12656,12657],{},[22,12658,2313],{},[72,12660,12661],{},[13,12662,12663,12603,12665,12668,12670,12673,12675],{},[22,12664,1040],{},[78,12666,12667],{},"3,5,-6,2,-1,4",[22,12669,1047],{},[78,12671,12672],{},"-6,2,4",[22,12674,1051],{}," 小行星 -6 使小行星 3 和 5 爆炸，然后继续向左移动。在另一边，小行星 2 使小行星 -1 爆炸，然> 后继续向右移动，没有碰撞小行星 4。",[13,12677,12678],{},[22,12679,317],{},[49,12681,12682,12687,12692],{},[52,12683,12684],{},[17,12685,12686],{},"2 \u003C= asteroids.length \u003C= 104",[52,12688,12689],{},[17,12690,12691],{},"-1000 \u003C= asteroids[i] \u003C= 1000",[52,12693,12694],{},[17,12695,12696],{},"asteroids[i] != 0",[107,12698,109],{"id":109},[13,12700,112],{},[114,12702,12704],{"className":116,"code":12703,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def asteroidCollision(self, asteroids):\n        stack = []\n        for ast in asteroids:\n            destoryed = False  # 标记当前行星是否被撞毁（默认False）\n            # 栈不为空\u002F栈顶向右\u002F当前向左 发生碰撞\n            while stack and stack[-1] > 0 and ast \u003C 0 and not destoryed:\n                if abs(ast) > abs(stack[-1]):\n                    stack.pop()\n                elif abs(ast) \u003C abs(stack[-1]):\n                    destoryed = True\n                else:\n                    stack.pop()\n                    destoryed = True\n            \n            if not destoryed:\n                stack.append(ast)\n        return stack\n        \"\"\"\n        :type asteroids: List[int]\n        :rtype: List[int]\n        \"\"\"\n\n",[17,12705,12706,12710,12714,12719,12724,12729,12734,12739,12744,12749,12754,12759,12764,12768,12772,12776,12780,12785,12790,12795,12799,12804,12808],{"__ignoreMap":119},[78,12707,12708],{"class":124,"line":125},[78,12709,129],{"emptyLinePlaceholder":128},[78,12711,12712],{"class":124,"line":132},[78,12713,135],{},[78,12715,12716],{"class":124,"line":138},[78,12717,12718],{},"    def asteroidCollision(self, asteroids):\n",[78,12720,12721],{"class":124,"line":144},[78,12722,12723],{},"        stack = []\n",[78,12725,12726],{"class":124,"line":150},[78,12727,12728],{},"        for ast in asteroids:\n",[78,12730,12731],{"class":124,"line":156},[78,12732,12733],{},"            destoryed = False  # 标记当前行星是否被撞毁（默认False）\n",[78,12735,12736],{"class":124,"line":162},[78,12737,12738],{},"            # 栈不为空\u002F栈顶向右\u002F当前向左 发生碰撞\n",[78,12740,12741],{"class":124,"line":168},[78,12742,12743],{},"            while stack and stack[-1] > 0 and ast \u003C 0 and not destoryed:\n",[78,12745,12746],{"class":124,"line":174},[78,12747,12748],{},"                if abs(ast) > abs(stack[-1]):\n",[78,12750,12751],{"class":124,"line":180},[78,12752,12753],{},"                    stack.pop()\n",[78,12755,12756],{"class":124,"line":186},[78,12757,12758],{},"                elif abs(ast) \u003C abs(stack[-1]):\n",[78,12760,12761],{"class":124,"line":192},[78,12762,12763],{},"                    destoryed = True\n",[78,12765,12766],{"class":124,"line":198},[78,12767,3111],{},[78,12769,12770],{"class":124,"line":204},[78,12771,12753],{},[78,12773,12774],{"class":124,"line":210},[78,12775,12763],{},[78,12777,12778],{"class":124,"line":216},[78,12779,10916],{},[78,12781,12782],{"class":124,"line":222},[78,12783,12784],{},"            if not destoryed:\n",[78,12786,12787],{"class":124,"line":421},[78,12788,12789],{},"                stack.append(ast)\n",[78,12791,12792],{"class":124,"line":427},[78,12793,12794],{},"        return stack\n",[78,12796,12797],{"class":124,"line":433},[78,12798,207],{},[78,12800,12801],{"class":124,"line":2443},[78,12802,12803],{},"        :type asteroids: List[int]\n",[78,12805,12806],{"class":124,"line":2448},[78,12807,365],{},[78,12809,12810],{"class":124,"line":2454},[78,12811,207],{},[226,12813,228],{},{"title":119,"searchDepth":144,"depth":144,"links":12815},[12816],{"id":109,"depth":132,"text":109},"栈 数组","给定一个整数数组 asteroids，表示在同一行的小行星。数组中小行星的索引表示它们在空间中的相对位置。",{},"\u002Flegacy-blog\u002F1772885453424",{"title":12577,"description":12818},"legacy-blog\u002F1772885453424",[246,12824,248],"栈","lrbHP05DWAQ4-Kigy6fQNvF2dTCeV720RfIYzU62OCU",{"id":12827,"title":12828,"assetBase":7,"author":8,"body":12829,"category":13108,"collection":233,"date":13109,"description":13110,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":13111,"navigation":128,"originalPath":239,"path":13112,"seo":13113,"source":243,"stem":13114,"tags":13115,"weight":250,"__hash__":13117},"content\u002Flegacy-blog\u002F1772954823013.md","394. 字符串解码",{"type":10,"value":12830,"toc":13105},[12831,12861,12865,12881,12885,12899,12903,12920,12924,12937,12941,12974,12976,12978,13103],[13,12832,12833,12834,12837,12838,12841,12842,12844,12845,12847,12848,12850,12851,275,12854,12857,12858,67],{},"给定一个经过编码的字符串，返回它解码后的字符串。\n编码规则为: ",[17,12835,12836],{},"k[encoded_string]","，表示其中方括号内部的 ",[17,12839,12840],{},"encoded_string"," 正好重复 ",[17,12843,5535],{}," 次。注意 ",[17,12846,5535],{}," 保证为正整数。\n你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。\n此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 ",[17,12849,5535],{}," ，例如不会出现像 ",[17,12852,12853],{},"3a",[17,12855,12856],{},"2[4]"," 的输入。\n测试用例保证输出的长度不会超过 ",[17,12859,12860],{},"105",[13,12862,12863],{},[22,12864,293],{},[72,12866,12867],{},[13,12868,12869,12871,12872,472,12874,12877,12878,12880],{},[22,12870,1040],{}," s = \"3",[78,12873,5009],{},[78,12875,12876],{},"bc","\"\n",[22,12879,1047],{},"\"aaabcbc\"",[13,12882,12883],{},[22,12884,306],{},[72,12886,12887],{},[13,12888,12889,12871,12891,12877,12896,12898],{},[22,12890,1040],{},[78,12892,12893,12894],{},"a2",[78,12895,7360],{},[22,12897,1047],{},"\"accaccacc\"",[13,12900,12901],{},[22,12902,1265],{},[72,12904,12905],{},[13,12906,12907,12909,12910,1025,12913,12916,12917,12919],{},[22,12908,1040],{}," s = \"2",[78,12911,12912],{},"abc",[78,12914,12915],{},"cd","ef\"\n",[22,12918,1047],{},"\"abcabccdcdcdef\"",[13,12921,12922],{},[22,12923,2313],{},[72,12925,12926],{},[13,12927,12928,12930,12931,12933,12934,12936],{},[22,12929,1040],{}," s = \"abc3",[78,12932,12915],{},"xyz\"\n",[22,12935,1047],{},"\"abccdcdcdxyz\"",[13,12938,12939],{},[22,12940,317],{},[49,12942,12943,12948,12957,12966],{},[52,12944,12945],{},[17,12946,12947],{},"1 \u003C= s.length \u003C= 30",[52,12949,12950,12952,12953,12956],{},[17,12951,262],{}," 由小写英文字母、数字和方括号 ",[17,12954,12955],{},"'[]'"," 组成",[52,12958,12959,12961,12962,12965],{},[17,12960,262],{}," 保证是一个",[22,12963,12964],{},"有效"," 的输入。",[52,12967,12968,12970,12971],{},[17,12969,262],{}," 中所有整数的取值范围为 ",[17,12972,12973],{},"[1, 300]",[107,12975,109],{"id":109},[13,12977,112],{},[114,12979,12981],{"className":116,"code":12980,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def decodeString(self, s):\n        stack = []\n        result = ''\n        current_num = 0  # 用于存储累计数字（多位数） \n        \n        for char in s:\n            if char.isdigit():\n                current_num = current_num * 10 + int(char)\n            elif char == '[':\n                # 左括号，当前数字和之前的字符串入栈然后重置\n                stack.append((result, current_num))\n                result = ''\n                current_num = 0\n            elif char == ']':\n                # 右括号，弹出栈顶的（前缀字符串\u002F重复次数），拼接结果\n                prev_str, num = stack.pop()\n                result = prev_str + num * result\n            else:\n                result += char  # 普通字符直接拼接\n        return result\n        \"\"\"\n        :type s: str\n        :rtype: str\n        \"\"\"\n\n",[17,12982,12983,12987,12991,12996,13000,13005,13010,13014,13019,13024,13029,13034,13039,13044,13049,13054,13059,13064,13069,13074,13078,13083,13087,13091,13095,13099],{"__ignoreMap":119},[78,12984,12985],{"class":124,"line":125},[78,12986,129],{"emptyLinePlaceholder":128},[78,12988,12989],{"class":124,"line":132},[78,12990,135],{},[78,12992,12993],{"class":124,"line":138},[78,12994,12995],{},"    def decodeString(self, s):\n",[78,12997,12998],{"class":124,"line":144},[78,12999,12723],{},[78,13001,13002],{"class":124,"line":150},[78,13003,13004],{},"        result = ''\n",[78,13006,13007],{"class":124,"line":156},[78,13008,13009],{},"        current_num = 0  # 用于存储累计数字（多位数） \n",[78,13011,13012],{"class":124,"line":162},[78,13013,1359],{},[78,13015,13016],{"class":124,"line":168},[78,13017,13018],{},"        for char in s:\n",[78,13020,13021],{"class":124,"line":174},[78,13022,13023],{},"            if char.isdigit():\n",[78,13025,13026],{"class":124,"line":180},[78,13027,13028],{},"                current_num = current_num * 10 + int(char)\n",[78,13030,13031],{"class":124,"line":186},[78,13032,13033],{},"            elif char == '[':\n",[78,13035,13036],{"class":124,"line":192},[78,13037,13038],{},"                # 左括号，当前数字和之前的字符串入栈然后重置\n",[78,13040,13041],{"class":124,"line":198},[78,13042,13043],{},"                stack.append((result, current_num))\n",[78,13045,13046],{"class":124,"line":204},[78,13047,13048],{},"                result = ''\n",[78,13050,13051],{"class":124,"line":210},[78,13052,13053],{},"                current_num = 0\n",[78,13055,13056],{"class":124,"line":216},[78,13057,13058],{},"            elif char == ']':\n",[78,13060,13061],{"class":124,"line":222},[78,13062,13063],{},"                # 右括号，弹出栈顶的（前缀字符串\u002F重复次数），拼接结果\n",[78,13065,13066],{"class":124,"line":421},[78,13067,13068],{},"                prev_str, num = stack.pop()\n",[78,13070,13071],{"class":124,"line":427},[78,13072,13073],{},"                result = prev_str + num * result\n",[78,13075,13076],{"class":124,"line":433},[78,13077,699],{},[78,13079,13080],{"class":124,"line":2443},[78,13081,13082],{},"                result += char  # 普通字符直接拼接\n",[78,13084,13085],{"class":124,"line":2448},[78,13086,10610],{},[78,13088,13089],{"class":124,"line":2454},[78,13090,207],{},[78,13092,13093],{"class":124,"line":2460},[78,13094,360],{},[78,13096,13097],{"class":124,"line":2465},[78,13098,2906],{},[78,13100,13101],{"class":124,"line":2470},[78,13102,207],{},[226,13104,228],{},{"title":119,"searchDepth":144,"depth":144,"links":13106},[13107],{"id":109,"depth":132,"text":109},"栈 递归 字符串","2026-03-08","给定一个经过编码的字符串，返回它解码后的字符串。\n编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。\n你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。\n此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。\n测试用例保证输出的长度不会超过 105。",{},"\u002Flegacy-blog\u002F1772954823013",{"title":12828,"description":13110},"legacy-blog\u002F1772954823013",[246,12824,13116,450],"递归","E8-LdGyUdy8mQlSIrbCKUuKgd46gI0ZfYeHHPnmvF4g",{"id":13119,"title":13120,"assetBase":7,"author":8,"body":13121,"category":13394,"collection":233,"date":13395,"description":13396,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":13397,"navigation":128,"originalPath":239,"path":13398,"seo":13399,"source":243,"stem":13400,"tags":13401,"weight":250,"__hash__":13402},"content\u002Flegacy-blog\u002F1773045454038.md","328. 奇偶链表",{"type":10,"value":13122,"toc":13391},[13123,13130,13147,13150,13159,13166,13180,13187,13201,13205,13223,13225,13227,13389],[13,13124,13125,13126,13129],{},"给定单链表的头节点 ",[17,13127,13128],{},"head"," ，将所有索引为奇数的节点和索引为偶数的节点分别分组，保持它们原有的相对顺序，然后把偶数索引节点分组连接到奇数索引节点分组之后，返回重新排序的链表。",[13,13131,13132,13135,13136,3774,13139,13142,13143,13146],{},[22,13133,13134],{},"第一个"," 节点的索引被认为是 ",[22,13137,13138],{},"奇数",[22,13140,13141],{},"第二个","节点的索引为",[22,13144,13145],{},"偶数"," ，以此类推。",[13,13148,13149],{},"请注意，偶数组和奇数组内部的相对顺序应该与输入时保持一致。",[13,13151,13152,13153,13155,13156,13158],{},"你必须在 ",[17,13154,4296],{}," 的额外空间复杂度和 ",[17,13157,4398],{}," 的时间复杂度下解决这个问题。",[13,13160,13161,13163],{},[22,13162,70],{},[617,13164],{"alt":619,"src":13165},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177304552463437.jpeg",[72,13167,13168],{},[13,13169,13170,13172,13173,13175,1052,13177],{},[22,13171,1433],{}," head = ",[78,13174,10997],{},[22,13176,1440],{},[78,13178,13179],{},"1,3,5,2,4",[13,13181,13182,13184],{},[22,13183,635],{},[617,13185],{"alt":619,"src":13186},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177304553379812.jpeg",[72,13188,13189],{},[13,13190,13191,13172,13193,13196,1052,13198],{},[22,13192,1433],{},[78,13194,13195],{},"2,1,3,5,6,4,7",[22,13197,1440],{},[78,13199,13200],{},"2,3,6,7,1,5,4",[13,13202,13203],{},[22,13204,88],{},[49,13206,13207,13213,13218],{},[52,13208,13209,13212],{},[17,13210,13211],{},"n ==","  链表中的节点数",[52,13214,13215],{},[17,13216,13217],{},"0 \u003C= n \u003C= 104",[52,13219,13220],{},[17,13221,13222],{},"-106 \u003C= Node.val \u003C= 106",[107,13224,109],{"id":109},[13,13226,112],{},[114,13228,13230],{"className":116,"code":13229,"language":118,"meta":119,"style":119},"\n# Definition for singly-linked list.\n# class ListNode(object):\n#     def __init__(self, val=0, next=None):\n#         self.val = val\n#         self.next = next\nclass Solution(object):\n    def oddEvenList(self, head):\n        if not head or not head.next: # 如果只有一个节点或为空\n            return head\n        \n        pre_odd = ListNode(0)  # 奇数节点前驱\n        pre_even = ListNode(0)  # 偶数节点前驱\n        odd = pre_odd  # 奇数移动指针\n        even = pre_even  # 偶数移动指针\n        is_odd = True  # 是否为奇数位置\n        while head:\n            if is_odd:\n                odd.next = head\n                odd = odd.next\n            else:\n                even.next = head\n                even = even.next\n            is_odd = not is_odd  # 切换奇偶标记\n            head = head.next\n        even.next = None\n        odd.next = pre_even.next\n        return pre_odd.next\n        \"\"\"\n        :type head: Optional[ListNode]\n        :rtype: Optional[ListNode]\n        \"\"\"\n\n",[17,13231,13232,13236,13241,13246,13251,13256,13261,13265,13270,13275,13280,13284,13289,13294,13299,13304,13309,13314,13319,13324,13329,13333,13338,13343,13348,13353,13358,13363,13368,13372,13378,13384],{"__ignoreMap":119},[78,13233,13234],{"class":124,"line":125},[78,13235,129],{"emptyLinePlaceholder":128},[78,13237,13238],{"class":124,"line":132},[78,13239,13240],{},"# Definition for singly-linked list.\n",[78,13242,13243],{"class":124,"line":138},[78,13244,13245],{},"# class ListNode(object):\n",[78,13247,13248],{"class":124,"line":144},[78,13249,13250],{},"#     def __init__(self, val=0, next=None):\n",[78,13252,13253],{"class":124,"line":150},[78,13254,13255],{},"#         self.val = val\n",[78,13257,13258],{"class":124,"line":156},[78,13259,13260],{},"#         self.next = next\n",[78,13262,13263],{"class":124,"line":162},[78,13264,135],{},[78,13266,13267],{"class":124,"line":168},[78,13268,13269],{},"    def oddEvenList(self, head):\n",[78,13271,13272],{"class":124,"line":174},[78,13273,13274],{},"        if not head or not head.next: # 如果只有一个节点或为空\n",[78,13276,13277],{"class":124,"line":180},[78,13278,13279],{},"            return head\n",[78,13281,13282],{"class":124,"line":186},[78,13283,1359],{},[78,13285,13286],{"class":124,"line":192},[78,13287,13288],{},"        pre_odd = ListNode(0)  # 奇数节点前驱\n",[78,13290,13291],{"class":124,"line":198},[78,13292,13293],{},"        pre_even = ListNode(0)  # 偶数节点前驱\n",[78,13295,13296],{"class":124,"line":204},[78,13297,13298],{},"        odd = pre_odd  # 奇数移动指针\n",[78,13300,13301],{"class":124,"line":210},[78,13302,13303],{},"        even = pre_even  # 偶数移动指针\n",[78,13305,13306],{"class":124,"line":216},[78,13307,13308],{},"        is_odd = True  # 是否为奇数位置\n",[78,13310,13311],{"class":124,"line":222},[78,13312,13313],{},"        while head:\n",[78,13315,13316],{"class":124,"line":421},[78,13317,13318],{},"            if is_odd:\n",[78,13320,13321],{"class":124,"line":427},[78,13322,13323],{},"                odd.next = head\n",[78,13325,13326],{"class":124,"line":433},[78,13327,13328],{},"                odd = odd.next\n",[78,13330,13331],{"class":124,"line":2443},[78,13332,699],{},[78,13334,13335],{"class":124,"line":2448},[78,13336,13337],{},"                even.next = head\n",[78,13339,13340],{"class":124,"line":2454},[78,13341,13342],{},"                even = even.next\n",[78,13344,13345],{"class":124,"line":2460},[78,13346,13347],{},"            is_odd = not is_odd  # 切换奇偶标记\n",[78,13349,13350],{"class":124,"line":2465},[78,13351,13352],{},"            head = head.next\n",[78,13354,13355],{"class":124,"line":2470},[78,13356,13357],{},"        even.next = None\n",[78,13359,13360],{"class":124,"line":2903},[78,13361,13362],{},"        odd.next = pre_even.next\n",[78,13364,13365],{"class":124,"line":2909},[78,13366,13367],{},"        return pre_odd.next\n",[78,13369,13370],{"class":124,"line":11477},[78,13371,207],{},[78,13373,13375],{"class":124,"line":13374},30,[78,13376,13377],{},"        :type head: Optional[ListNode]\n",[78,13379,13381],{"class":124,"line":13380},31,[78,13382,13383],{},"        :rtype: Optional[ListNode]\n",[78,13385,13387],{"class":124,"line":13386},32,[78,13388,207],{},[226,13390,228],{},{"title":119,"searchDepth":144,"depth":144,"links":13392},[13393],{"id":109,"depth":132,"text":109},"链表","2026-03-09","给定单链表的头节点 head ，将所有索引为奇数的节点和索引为偶数的节点分别分组，保持它们原有的相对顺序，然后把偶数索引节点分组连接到奇数索引节点分组之后，返回重新排序的链表。",{},"\u002Flegacy-blog\u002F1773045454038",{"title":13120,"description":13396},"legacy-blog\u002F1773045454038",[246,13394],"oef4vFtU9U_vxrJ1mdi24on89CVF8RiPX8hOnXqZucY",{"id":13404,"title":13405,"assetBase":7,"author":8,"body":13406,"category":13735,"collection":233,"date":13395,"description":13736,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":13737,"navigation":128,"originalPath":239,"path":13738,"seo":13739,"source":243,"stem":13740,"tags":13741,"weight":250,"__hash__":13742},"content\u002Flegacy-blog\u002F1773046793770.md","2130. 链表最大孪生和",{"type":10,"value":13407,"toc":13732},[13408,13435,13458,13464,13473,13480,13494,13501,13523,13530,13545,13556,13563,13565,13567,13730],[13,13409,13410,13411,13413,13414,3848,13416,13418,13419,20,13422,13424,13425,13427,13428,13430,13431,13434],{},"在一个大小为 ",[17,13412,19],{}," 且 ",[17,13415,19],{},[22,13417,13145],{}," 的链表中，对于 ",[17,13420,13421],{},"0 \u003C= i \u003C= (n \u002F 2) - 1",[17,13423,39],{}," ，第 ",[17,13426,39],{}," 个节点（下标从",[22,13429,2949],{}," 开始）的孪生节点为第 ",[17,13432,13433],{},"(n-1-i)"," 个节点 。",[49,13436,13437],{},[52,13438,13439,13440,13443,13444,13446,13447,13449,13450,13446,13452,13454,13455,13457],{},"比方说，",[17,13441,13442],{},"n = 4"," 那么节点 ",[17,13445,2949],{}," 是节点 ",[17,13448,1025],{}," 的孪生节点，节点 ",[17,13451,469],{},[17,13453,472],{}," 的孪生节点。这是长度为 ",[17,13456,13442],{}," 的链表中所有的孪生节点。",[13,13459,13460,13463],{},[22,13461,13462],{},"孪生和"," 定义为一个节点和它孪生节点两者值之和。",[13,13465,13466,13467,13469,13470,285],{},"给你一个长度为偶数的链表的头节点 ",[17,13468,13128],{}," ，请你返回链表的 ",[22,13471,13472],{},"最大孪生和",[13,13474,13475,13477],{},[22,13476,293],{},[617,13478],{"alt":619,"src":13479},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_17730469020274.png",[72,13481,13482],{},[13,13483,13484,13172,13486,13489,11719,13491,13493],{},[22,13485,1040],{},[78,13487,13488],{},"5,4,2,1",[22,13490,1047],{},[22,13492,1051],{},"\n节点 0 和节点 1 分别是节点 3 和 2 的孪生节点。孪生和都为 6 。\n链表中没有其他孪生节点。\n所以，链表的最大孪生和是 6 。",[13,13495,13496,13498],{},[22,13497,306],{},[617,13499],{"alt":619,"src":13500},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177304693295650.png",[72,13502,13503,13515],{},[13,13504,13505,13172,13507,13510,2073,13512,13514],{},[22,13506,1040],{},[78,13508,13509],{},"4,2,2,3",[22,13511,1047],{},[22,13513,1051],{},"\n链表中的孪生节点为：",[49,13516,13517,13520],{},[52,13518,13519],{},"节点 0 是节点 3 的孪生节点，孪生和为 4 + 3 = 7 。",[52,13521,13522],{},"节点 1 是节点 2 的孪生节点，孪生和为 2 + 2 = 4 。\n所以，最大孪生和为 max(7, 4) = 7 。",[13,13524,13525,13527],{},[22,13526,1265],{},[617,13528],{"alt":619,"src":13529},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177304694276992.png",[72,13531,13532],{},[13,13533,13534,13172,13536,13539,13541,13542,13544],{},[22,13535,1040],{},[78,13537,13538],{},"1,100000",[22,13540,1047],{}," 100001\n",[22,13543,1051],{},"\n链表中只有一对孪生节点，孪生和为 1 + 100000 = 100001 。",[13,13546,13547,13549,13550,13553,13554,285],{},[22,13548,317],{},"\n*链表的节点数目是 ",[17,13551,13552],{},"[2, 105]"," 中的",[22,13555,13145],{},[49,13557,13558],{},[52,13559,13560],{},[17,13561,13562],{},"1 \u003C= Node.val \u003C= 105",[107,13564,109],{"id":109},[13,13566,112],{},[114,13568,13570],{"className":116,"code":13569,"language":118,"meta":119,"style":119},"\n# Definition for singly-linked list.\n# class ListNode(object):\n#     def __init__(self, val=0, next=None):\n#         self.val = val\n#         self.next = next\nclass Solution(object):\n    def pairSum(self, head):\n        slow = head\n        fast = head\n        while fast and fast.next:\n            slow = slow.next\n            fast = fast.next.next\n\n        # 步骤2：反转链表的后半部分（从slow开始）\n        prev = None\n        curr = slow\n        while curr:\n            temp = curr.next  # 保存下一个节点\n            curr.next = prev  # 反转指针\n            prev = curr       # 前驱指针后移\n            curr = temp       # 当前指针后移\n\n        max_sum = 0\n        while prev:  # 只需遍历后半部分（长度为n\u002F2）\n            current_sum = head.val + prev.val\n            max_sum = max(max_sum, current_sum)\n            head = head.next\n            prev = prev.next\n        return max_sum\n        \"\"\"\n        :type head: Optional[ListNode]\n        :rtype: int\n        \"\"\"\n\n",[17,13571,13572,13576,13580,13584,13588,13592,13596,13600,13605,13610,13615,13620,13625,13630,13634,13639,13644,13649,13654,13659,13664,13669,13674,13678,13683,13688,13693,13698,13702,13707,13712,13716,13720,13725],{"__ignoreMap":119},[78,13573,13574],{"class":124,"line":125},[78,13575,129],{"emptyLinePlaceholder":128},[78,13577,13578],{"class":124,"line":132},[78,13579,13240],{},[78,13581,13582],{"class":124,"line":138},[78,13583,13245],{},[78,13585,13586],{"class":124,"line":144},[78,13587,13250],{},[78,13589,13590],{"class":124,"line":150},[78,13591,13255],{},[78,13593,13594],{"class":124,"line":156},[78,13595,13260],{},[78,13597,13598],{"class":124,"line":162},[78,13599,135],{},[78,13601,13602],{"class":124,"line":168},[78,13603,13604],{},"    def pairSum(self, head):\n",[78,13606,13607],{"class":124,"line":174},[78,13608,13609],{},"        slow = head\n",[78,13611,13612],{"class":124,"line":180},[78,13613,13614],{},"        fast = head\n",[78,13616,13617],{"class":124,"line":186},[78,13618,13619],{},"        while fast and fast.next:\n",[78,13621,13622],{"class":124,"line":192},[78,13623,13624],{},"            slow = slow.next\n",[78,13626,13627],{"class":124,"line":198},[78,13628,13629],{},"            fast = fast.next.next\n",[78,13631,13632],{"class":124,"line":204},[78,13633,129],{"emptyLinePlaceholder":128},[78,13635,13636],{"class":124,"line":210},[78,13637,13638],{},"        # 步骤2：反转链表的后半部分（从slow开始）\n",[78,13640,13641],{"class":124,"line":216},[78,13642,13643],{},"        prev = None\n",[78,13645,13646],{"class":124,"line":222},[78,13647,13648],{},"        curr = slow\n",[78,13650,13651],{"class":124,"line":421},[78,13652,13653],{},"        while curr:\n",[78,13655,13656],{"class":124,"line":427},[78,13657,13658],{},"            temp = curr.next  # 保存下一个节点\n",[78,13660,13661],{"class":124,"line":433},[78,13662,13663],{},"            curr.next = prev  # 反转指针\n",[78,13665,13666],{"class":124,"line":2443},[78,13667,13668],{},"            prev = curr       # 前驱指针后移\n",[78,13670,13671],{"class":124,"line":2448},[78,13672,13673],{},"            curr = temp       # 当前指针后移\n",[78,13675,13676],{"class":124,"line":2454},[78,13677,129],{"emptyLinePlaceholder":128},[78,13679,13680],{"class":124,"line":2460},[78,13681,13682],{},"        max_sum = 0\n",[78,13684,13685],{"class":124,"line":2465},[78,13686,13687],{},"        while prev:  # 只需遍历后半部分（长度为n\u002F2）\n",[78,13689,13690],{"class":124,"line":2470},[78,13691,13692],{},"            current_sum = head.val + prev.val\n",[78,13694,13695],{"class":124,"line":2903},[78,13696,13697],{},"            max_sum = max(max_sum, current_sum)\n",[78,13699,13700],{"class":124,"line":2909},[78,13701,13352],{},[78,13703,13704],{"class":124,"line":11477},[78,13705,13706],{},"            prev = prev.next\n",[78,13708,13709],{"class":124,"line":13374},[78,13710,13711],{},"        return max_sum\n",[78,13713,13714],{"class":124,"line":13380},[78,13715,207],{},[78,13717,13718],{"class":124,"line":13386},[78,13719,13377],{},[78,13721,13723],{"class":124,"line":13722},33,[78,13724,219],{},[78,13726,13728],{"class":124,"line":13727},34,[78,13729,207],{},[226,13731,228],{},{"title":119,"searchDepth":144,"depth":144,"links":13733},[13734],{"id":109,"depth":132,"text":109},"链表 双指针","在一个大小为 n 且 n 为 偶数 的链表中，对于 0 \u003C= i \u003C= (n \u002F 2) - 1 的 i ，第 i 个节点（下标从0 开始）的孪生节点为第 (n-1-i) 个节点 。",{},"\u002Flegacy-blog\u002F1773046793770",{"title":13405,"description":13736},"legacy-blog\u002F1773046793770",[246,13394,451],"uyjnzBErmQk5g1yg_q_waiodGR8hUh_hsownU8KC-LE",{"id":13744,"title":13745,"assetBase":239,"author":8,"body":13746,"category":787,"collection":233,"date":13395,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":14536,"navigation":128,"originalPath":239,"path":14537,"seo":14538,"source":243,"stem":14539,"tags":14540,"weight":250,"__hash__":14543},"content\u002Flegacy-blog\u002F1773063997239.md","LangChain Advanced",{"type":10,"value":13747,"toc":14521},[13748,13751,13755,13758,13775,13778,13781,13785,13788,13972,13976,13979,13982,13988,13992,14002,14024,14027,14030,14108,14111,14194,14197,14200,14204,14211,14214,14217,14220,14349,14353,14356,14370,14373,14376,14382,14393,14396,14406,14409,14426,14429,14433,14519],[4517,13749,13745],{"id":13750},"langchain-advanced",[107,13752,13754],{"id":13753},"guardrails-守卫","Guardrails 守卫",[13,13756,13757],{},"守卫通过在 Agent 执行的关键节点验证和过滤内容，帮助构建安全、合规的人工智能应用。他们能够检测敏感信息，执行内容政策，验证输出，并在不安全行为引发问题前预防。常见的使用场景包括：",[49,13759,13760,13763,13766,13769,13772],{},[52,13761,13762],{},"防止 PII 泄露",[52,13764,13765],{},"检测和阻挡即时注入攻击",[52,13767,13768],{},"屏蔽不当或有害内容",[52,13770,13771],{},"执行业务规则和合规要求",[52,13773,13774],{},"验证输出质量和准确性",[13,13776,13777],{},"通常使用中间件阶段设置守卫实现节点拦截执行。内置有 PII 守卫和人机交互守卫。",[7759,13779,13780],{"id":13780},"自定义守卫",[10548,13782,13784],{"id":13783},"before-agent-guardrails","Before agent guardrails",[13,13786,13787],{},"在每次调用开始时，使用“before agent”钩子验证一次请求。这对于会话级检查非常有用，比如认证、速率限制或在处理开始前阻止不当请求。",[114,13789,13791],{"className":116,"code":13790,"language":118,"meta":119,"style":119},"from typing import Any\nfrom langchain.agents.middleware import AgentMiddleware, AgentState, hook_config\nfrom langchain.agents import create_agent\n\nclass ContentFilterMiddleware(AgentMiddleware):\n    \"\"\"确定性防护：拦截包含禁用关键词的请求\"\"\"\n    def __init__(self, banned_keywords: list[str]):\n        super().__init__()\n        self.banned_keywords = [kw.lower() for kw in banned_keywords]  # 关键词转小写\n\n    @hook_config(can_jump_to=[\"end\"])\n    def before_agent(self, state: AgentState, runtime) -> dict[str, Any] | None:\n        if not state[\"messages\"]: return None  # 检查是否有消息\n\n        first_msg = state[\"messages\"][0]\n        if first_msg.type != \"human\":  # 只检查用户消息\n            return None\n        content = first_msg.content.lower()\n\n        # 检测禁用关键词\n        for kw in self.banned_keywords:\n            if kw in content:\n                return {\n                    \"messages\": [{\n                        \"role\": \"assistant\",\n                        \"content\": \"无法处理包含不当内容的请求，请重新表述。\"\n                    }],\n                    \"jump_to\": \"end\"  # 直接跳转到结束\n                }\n        return None\n\n# 创建智能体\nagent = create_agent(\n    model=\"gpt-4.1\",\n    middleware=[\n        ContentFilterMiddleware(banned_keywords=[\"hack\", \"exploit\", \"malware\"])\n    ]\n)\n",[17,13792,13793,13797,13802,13806,13810,13815,13820,13825,13829,13834,13838,13843,13848,13853,13857,13862,13867,13872,13877,13881,13886,13891,13896,13901,13906,13911,13916,13921,13926,13930,13934,13938,13943,13947,13951,13956,13962,13967],{"__ignoreMap":119},[78,13794,13795],{"class":124,"line":125},[78,13796,10015],{},[78,13798,13799],{"class":124,"line":132},[78,13800,13801],{},"from langchain.agents.middleware import AgentMiddleware, AgentState, hook_config\n",[78,13803,13804],{"class":124,"line":138},[78,13805,8613],{},[78,13807,13808],{"class":124,"line":144},[78,13809,129],{"emptyLinePlaceholder":128},[78,13811,13812],{"class":124,"line":150},[78,13813,13814],{},"class ContentFilterMiddleware(AgentMiddleware):\n",[78,13816,13817],{"class":124,"line":156},[78,13818,13819],{},"    \"\"\"确定性防护：拦截包含禁用关键词的请求\"\"\"\n",[78,13821,13822],{"class":124,"line":162},[78,13823,13824],{},"    def __init__(self, banned_keywords: list[str]):\n",[78,13826,13827],{"class":124,"line":168},[78,13828,6433],{},[78,13830,13831],{"class":124,"line":174},[78,13832,13833],{},"        self.banned_keywords = [kw.lower() for kw in banned_keywords]  # 关键词转小写\n",[78,13835,13836],{"class":124,"line":180},[78,13837,129],{"emptyLinePlaceholder":128},[78,13839,13840],{"class":124,"line":186},[78,13841,13842],{},"    @hook_config(can_jump_to=[\"end\"])\n",[78,13844,13845],{"class":124,"line":192},[78,13846,13847],{},"    def before_agent(self, state: AgentState, runtime) -> dict[str, Any] | None:\n",[78,13849,13850],{"class":124,"line":198},[78,13851,13852],{},"        if not state[\"messages\"]: return None  # 检查是否有消息\n",[78,13854,13855],{"class":124,"line":204},[78,13856,129],{"emptyLinePlaceholder":128},[78,13858,13859],{"class":124,"line":210},[78,13860,13861],{},"        first_msg = state[\"messages\"][0]\n",[78,13863,13864],{"class":124,"line":216},[78,13865,13866],{},"        if first_msg.type != \"human\":  # 只检查用户消息\n",[78,13868,13869],{"class":124,"line":222},[78,13870,13871],{},"            return None\n",[78,13873,13874],{"class":124,"line":421},[78,13875,13876],{},"        content = first_msg.content.lower()\n",[78,13878,13879],{"class":124,"line":427},[78,13880,129],{"emptyLinePlaceholder":128},[78,13882,13883],{"class":124,"line":433},[78,13884,13885],{},"        # 检测禁用关键词\n",[78,13887,13888],{"class":124,"line":2443},[78,13889,13890],{},"        for kw in self.banned_keywords:\n",[78,13892,13893],{"class":124,"line":2448},[78,13894,13895],{},"            if kw in content:\n",[78,13897,13898],{"class":124,"line":2454},[78,13899,13900],{},"                return {\n",[78,13902,13903],{"class":124,"line":2460},[78,13904,13905],{},"                    \"messages\": [{\n",[78,13907,13908],{"class":124,"line":2465},[78,13909,13910],{},"                        \"role\": \"assistant\",\n",[78,13912,13913],{"class":124,"line":2470},[78,13914,13915],{},"                        \"content\": \"无法处理包含不当内容的请求，请重新表述。\"\n",[78,13917,13918],{"class":124,"line":2903},[78,13919,13920],{},"                    }],\n",[78,13922,13923],{"class":124,"line":2909},[78,13924,13925],{},"                    \"jump_to\": \"end\"  # 直接跳转到结束\n",[78,13927,13928],{"class":124,"line":11477},[78,13929,9912],{},[78,13931,13932],{"class":124,"line":13374},[78,13933,10315],{},[78,13935,13936],{"class":124,"line":13380},[78,13937,129],{"emptyLinePlaceholder":128},[78,13939,13940],{"class":124,"line":13386},[78,13941,13942],{},"# 创建智能体\n",[78,13944,13945],{"class":124,"line":13722},[78,13946,8627],{},[78,13948,13949],{"class":124,"line":13727},[78,13950,8703],{},[78,13952,13954],{"class":124,"line":13953},35,[78,13955,8713],{},[78,13957,13959],{"class":124,"line":13958},36,[78,13960,13961],{},"        ContentFilterMiddleware(banned_keywords=[\"hack\", \"exploit\", \"malware\"])\n",[78,13963,13965],{"class":124,"line":13964},37,[78,13966,8971],{},[78,13968,13970],{"class":124,"line":13969},38,[78,13971,8041],{},[10548,13973,13975],{"id":13974},"after-agent-guardrails","After agent guardrails",[13,13977,13978],{},"使用“after agent”钩子验证一次最终输出，然后返回给用户。这对于基于模型的安全检查、质量验证或对整个代理响应的最终合规扫描非常有用。",[13,13980,13981],{},"(这个和上面的案例类似，从检查用户输入变成检查 agent\u002FLLM 输出)",[13,13983,13984,13987],{},[22,13985,13986],{},"结合多个守卫","：可以通过将多个守卫添加到中间件数组来堆叠它们。它们按顺序执行，允许构建分层保护。",[107,13989,13991],{"id":13990},"runtime-运行时","Runtime 运行时",[13,13993,13994,13995,13997,13998,14001],{},"LangChain的",[17,13996,8922],{},"在底层运行于 LangGraph 的 Runtime 运行时。LangGraph 暴露的 ",[17,13999,14000],{},"Runtime"," 具有以下信息的对象：",[2285,14003,14004,14010,14015],{},[52,14005,14006,14009],{},[22,14007,14008],{},"context","：静态信息，如用户ID、数据库连接或其他代理调用的依赖关系",[52,14011,14012,14014],{},[22,14013,8421],{},"：一个 BaseStore 实例用于 长期记忆",[52,14016,14017,14020,14021],{},[22,14018,14019],{},"Stream writer","：通过流模式用于流式信息流的对象",[17,14022,14023],{},"\"custom\"",[7759,14025,14026],{"id":14026},"访问方式",[13,14028,14029],{},"使用 create_agent 创建智能体时，你可以指定一个 context_schema 来定义存储在智能体上下文中的 Runtime 结构。 调用智能体时，传入 context 参数并携带本次运行的相关配置：",[114,14031,14033],{"className":116,"code":14032,"language":118,"meta":119,"style":119},"from dataclasses import dataclass\nfrom langchain.agents import create_agent\n\n@dataclass\nclass Context:\n    user_name: str\n        \nagent = create_agent(\n    model=\"gpt-5-nano\",\n    tools=[...],\n    context_schema=Context  # 指定上下文结构\n)\nagent.invoke(\n    {\"messages\": [{\"role\": \"user\", \"content\": \"What's my name?\"}]},\n    context=Context(user_name=\"John Smith\")  # 传入上下文数据\n)\n",[17,14034,14035,14040,14044,14048,14053,14058,14063,14067,14071,14076,14080,14085,14089,14094,14099,14104],{"__ignoreMap":119},[78,14036,14037],{"class":124,"line":125},[78,14038,14039],{},"from dataclasses import dataclass\n",[78,14041,14042],{"class":124,"line":132},[78,14043,8613],{},[78,14045,14046],{"class":124,"line":138},[78,14047,129],{"emptyLinePlaceholder":128},[78,14049,14050],{"class":124,"line":144},[78,14051,14052],{},"@dataclass\n",[78,14054,14055],{"class":124,"line":150},[78,14056,14057],{},"class Context:\n",[78,14059,14060],{"class":124,"line":156},[78,14061,14062],{},"    user_name: str\n",[78,14064,14065],{"class":124,"line":162},[78,14066,1359],{},[78,14068,14069],{"class":124,"line":168},[78,14070,8627],{},[78,14072,14073],{"class":124,"line":174},[78,14074,14075],{},"    model=\"gpt-5-nano\",\n",[78,14077,14078],{"class":124,"line":180},[78,14079,9198],{},[78,14081,14082],{"class":124,"line":186},[78,14083,14084],{},"    context_schema=Context  # 指定上下文结构\n",[78,14086,14087],{"class":124,"line":192},[78,14088,8041],{},[78,14090,14091],{"class":124,"line":198},[78,14092,14093],{},"agent.invoke(\n",[78,14095,14096],{"class":124,"line":204},[78,14097,14098],{},"    {\"messages\": [{\"role\": \"user\", \"content\": \"What's my name?\"}]},\n",[78,14100,14101],{"class":124,"line":210},[78,14102,14103],{},"    context=Context(user_name=\"John Smith\")  # 传入上下文数据\n",[78,14105,14106],{"class":124,"line":216},[78,14107,8041],{},[13,14109,14110],{},"你可以在工具内部访问运行时信息，以实现访问上下文（context）\u002F读取或写入长期记忆\u002F写入自定义流（例如：工具执行进度\u002F更新）。在工具内部使用 runtime 参数访问 ToolRuntime 对象：",[114,14112,14114],{"className":116,"code":14113,"language":118,"meta":119,"style":119},"from dataclasses import dataclass\nfrom langchain.tools import tool, ToolRuntime  \n\n@dataclass\nclass Context:\n    user_id: str\n\n@tool\ndef fetch_user_email_preferences(runtime: ToolRuntime[Context]) -> str:\n    \"\"\"从存储中获取用户的邮件偏好设置。\"\"\"\n    user_id = runtime.context.user_id  # 从上下文中获取用户ID\n\n    preferences: str = \"该用户希望你撰写简洁且礼貌的邮件。\"\n    if runtime.store:  # 检查是否有存储可用\n        if memory := runtime.store.get((\"users\",), user_id):\n            preferences = memory.value[\"preferences\"]\n    return preferences\n",[17,14115,14116,14120,14125,14129,14133,14137,14142,14146,14150,14155,14160,14165,14169,14174,14179,14184,14189],{"__ignoreMap":119},[78,14117,14118],{"class":124,"line":125},[78,14119,14039],{},[78,14121,14122],{"class":124,"line":132},[78,14123,14124],{},"from langchain.tools import tool, ToolRuntime  \n",[78,14126,14127],{"class":124,"line":138},[78,14128,129],{"emptyLinePlaceholder":128},[78,14130,14131],{"class":124,"line":144},[78,14132,14052],{},[78,14134,14135],{"class":124,"line":150},[78,14136,14057],{},[78,14138,14139],{"class":124,"line":156},[78,14140,14141],{},"    user_id: str\n",[78,14143,14144],{"class":124,"line":162},[78,14145,129],{"emptyLinePlaceholder":128},[78,14147,14148],{"class":124,"line":168},[78,14149,8488],{},[78,14151,14152],{"class":124,"line":174},[78,14153,14154],{},"def fetch_user_email_preferences(runtime: ToolRuntime[Context]) -> str:\n",[78,14156,14157],{"class":124,"line":180},[78,14158,14159],{},"    \"\"\"从存储中获取用户的邮件偏好设置。\"\"\"\n",[78,14161,14162],{"class":124,"line":186},[78,14163,14164],{},"    user_id = runtime.context.user_id  # 从上下文中获取用户ID\n",[78,14166,14167],{"class":124,"line":192},[78,14168,129],{"emptyLinePlaceholder":128},[78,14170,14171],{"class":124,"line":198},[78,14172,14173],{},"    preferences: str = \"该用户希望你撰写简洁且礼貌的邮件。\"\n",[78,14175,14176],{"class":124,"line":204},[78,14177,14178],{},"    if runtime.store:  # 检查是否有存储可用\n",[78,14180,14181],{"class":124,"line":210},[78,14182,14183],{},"        if memory := runtime.store.get((\"users\",), user_id):\n",[78,14185,14186],{"class":124,"line":216},[78,14187,14188],{},"            preferences = memory.value[\"preferences\"]\n",[78,14190,14191],{"class":124,"line":222},[78,14192,14193],{},"    return preferences\n",[13,14195,14196],{},"你也可以在中间件中访问运行时信息，以根据用户上下文生成动态提示词、修改消息或控制智能体行为。",[13,14198,14199],{},"在节点式钩子（node-style hooks）中使用 runtime 参数访问 Runtime 对象；对于包装式钩子（wrap-style hooks），该对象可在 ModelRequest 参数中获取。",[107,14201,14203],{"id":14202},"long-term-memory-长期记忆","Long-term memory 长期记忆",[13,14205,14206,14207,14210],{},"LangChain代理使用 ",[22,14208,14209],{},"LangGraph 持久化"," 以实现长期记忆。这是一个更高级的话题，需要懂LangGraph才能使用。",[7759,14212,14213],{"id":14213},"内存存储",[13,14215,14216],{},"LangGraph 将长期记忆存储为 JSON 文档，存储在 store 中。每个内存分别被保存在自定义（类似文件夹）和独立文件（类似文件名）下。命名空间通常包含用户或组织 ID 或其他标签，以便于信息分类。",[13,14218,14219],{},"这种结构使记忆能够进行层级存储。通过内容筛选支持跨命名空间搜索。",[114,14221,14223],{"className":116,"code":14222,"language":118,"meta":119,"style":119},"from langgraph.store.memory import InMemoryStore\n\ndef embed(texts: list[str]) -> list[list[float]]:\n    # 模拟嵌入函数，实际使用时请替换为真实的嵌入模型\n    return [[1.0, 2.0]]\n\n# 初始化内存存储（生产环境建议使用数据库-backed存储）\nstore = InMemoryStore(index={\"embed\": embed, \"dims\": 2})\n\n# 定义命名空间（用户ID + 应用场景）\nnamespace = (\"用户123\", \"闲聊场景\")\n# 存入一条记忆\nstore.put(\n    namespace,\n    \"记忆ID-001\",\n    {\"偏好规则\": [\"喜欢简洁直接的表达\", \"只说中文和Python\"],\"自定义键\": \"自定义值\"}\n)\n\n# 根据ID获取记忆\nitem = store.get(namespace, \"记忆ID-001\")\n# 在命名空间内搜索记忆（按内容过滤 + 向量相似度排序）\nitems = store.search(\n    namespace, \n    filter={\"自定义键\": \"自定义值\"}, \n    query=\"用户的语言偏好\"\n)\n",[17,14224,14225,14230,14234,14239,14244,14249,14253,14258,14263,14267,14272,14277,14282,14287,14292,14297,14302,14306,14310,14315,14320,14325,14330,14335,14340,14345],{"__ignoreMap":119},[78,14226,14227],{"class":124,"line":125},[78,14228,14229],{},"from langgraph.store.memory import InMemoryStore\n",[78,14231,14232],{"class":124,"line":132},[78,14233,129],{"emptyLinePlaceholder":128},[78,14235,14236],{"class":124,"line":138},[78,14237,14238],{},"def embed(texts: list[str]) -> list[list[float]]:\n",[78,14240,14241],{"class":124,"line":144},[78,14242,14243],{},"    # 模拟嵌入函数，实际使用时请替换为真实的嵌入模型\n",[78,14245,14246],{"class":124,"line":150},[78,14247,14248],{},"    return [[1.0, 2.0]]\n",[78,14250,14251],{"class":124,"line":156},[78,14252,129],{"emptyLinePlaceholder":128},[78,14254,14255],{"class":124,"line":162},[78,14256,14257],{},"# 初始化内存存储（生产环境建议使用数据库-backed存储）\n",[78,14259,14260],{"class":124,"line":168},[78,14261,14262],{},"store = InMemoryStore(index={\"embed\": embed, \"dims\": 2})\n",[78,14264,14265],{"class":124,"line":174},[78,14266,129],{"emptyLinePlaceholder":128},[78,14268,14269],{"class":124,"line":180},[78,14270,14271],{},"# 定义命名空间（用户ID + 应用场景）\n",[78,14273,14274],{"class":124,"line":186},[78,14275,14276],{},"namespace = (\"用户123\", \"闲聊场景\")\n",[78,14278,14279],{"class":124,"line":192},[78,14280,14281],{},"# 存入一条记忆\n",[78,14283,14284],{"class":124,"line":198},[78,14285,14286],{},"store.put(\n",[78,14288,14289],{"class":124,"line":204},[78,14290,14291],{},"    namespace,\n",[78,14293,14294],{"class":124,"line":210},[78,14295,14296],{},"    \"记忆ID-001\",\n",[78,14298,14299],{"class":124,"line":216},[78,14300,14301],{},"    {\"偏好规则\": [\"喜欢简洁直接的表达\", \"只说中文和Python\"],\"自定义键\": \"自定义值\"}\n",[78,14303,14304],{"class":124,"line":222},[78,14305,8041],{},[78,14307,14308],{"class":124,"line":421},[78,14309,129],{"emptyLinePlaceholder":128},[78,14311,14312],{"class":124,"line":427},[78,14313,14314],{},"# 根据ID获取记忆\n",[78,14316,14317],{"class":124,"line":433},[78,14318,14319],{},"item = store.get(namespace, \"记忆ID-001\")\n",[78,14321,14322],{"class":124,"line":2443},[78,14323,14324],{},"# 在命名空间内搜索记忆（按内容过滤 + 向量相似度排序）\n",[78,14326,14327],{"class":124,"line":2448},[78,14328,14329],{},"items = store.search(\n",[78,14331,14332],{"class":124,"line":2454},[78,14333,14334],{},"    namespace, \n",[78,14336,14337],{"class":124,"line":2460},[78,14338,14339],{},"    filter={\"自定义键\": \"自定义值\"}, \n",[78,14341,14342],{"class":124,"line":2465},[78,14343,14344],{},"    query=\"用户的语言偏好\"\n",[78,14346,14347],{"class":124,"line":2470},[78,14348,8041],{},[107,14350,14352],{"id":14351},"retrival-检索","Retrival 检索",[13,14354,14355],{},"大型语言模型（LLM）功能强大，但它们有两个关键限制：",[49,14357,14358,14364],{},[52,14359,14360,14363],{},[22,14361,14362],{},"有限的上下文","——他们无法一次性吞入整个语料库。",[52,14365,14366,14369],{},[22,14367,14368],{},"静态知识","——他们的训练数据被冻结在某个时间点。",[13,14371,14372],{},"检索通过在查询时获取相关外部知识来解决这些问题。这就是检索**增强生成（RAG）**的基础：通过上下文特定信息增强LLM的答案。",[7759,14374,14375],{"id":14375},"知识库与检索",[13,14377,14378,14381],{},[22,14379,14380],{},"知识库","是检索时使用的文档 \u002F 结构化数据存储库。若已有知识库（如 SQL 数据库、内部文档），无需重建，可直接：",[49,14383,14384,14390],{},[52,14385,14386,14387,14389],{},"作为",[22,14388,9943],{},"连接到 Agentic RAG 代理；",[52,14391,14392],{},"查询后将内容作为上下文喂给 LLM。",[13,14394,14395],{},"若需自定义知识库，可用 LangChain 的文档加载器 + 向量存储实现。",[13,14397,14398,14401,14402,14405],{},[22,14399,14400],{},"检索","允许LLM在运行时访问相关上下文。但大多数现实应用更进一步：",[22,14403,14404],{},"它们将检索与生成结合","起来，产生扎实、上下文感知的答案。这就是检索**增强生成（RAG）**的核心理念。检索流程成为更广泛系统基础，结合搜索与生成。",[13,14407,14408],{},"典型的检索工作流程如下：",[114,14410,14414],{"className":14411,"code":14412,"language":14413,"meta":119,"style":119},"language-plaintext shiki shiki-themes github-dark","来源（Google Drive\u002FSlack\u002FNotion等）→ 文档加载器 → 文档 → 分割成块 → 转嵌入 → 向量存储\n用户查询 → 查询嵌入 → 向量存储 → 检索器 → LLM用检索信息生成回答\n","plaintext",[17,14415,14416,14421],{"__ignoreMap":119},[78,14417,14418],{"class":124,"line":125},[78,14419,14420],{},"来源（Google Drive\u002FSlack\u002FNotion等）→ 文档加载器 → 文档 → 分割成块 → 转嵌入 → 向量存储\n",[78,14422,14423],{"class":124,"line":132},[78,14424,14425],{},"用户查询 → 查询嵌入 → 向量存储 → 检索器 → LLM用检索信息生成回答\n",[13,14427,14428],{},"每个组件都是模块化的：你可以切换加载器、分流器、嵌入或向量存储，而无需重写应用逻辑。",[7759,14430,14432],{"id":14431},"常见-rag-架构","常见 RAG 架构",[8366,14434,14435,14456],{},[8369,14436,14437],{},[8372,14438,14439,14442,14444,14447,14450,14453],{},[8375,14440,14441],{"align":9247},"架构",[8375,14443,9251],{"align":9247},[8375,14445,14446],{"align":9247},"控制",[8375,14448,14449],{"align":9247},"灵活性",[8375,14451,14452],{"align":9247},"延迟",[8375,14454,14455],{"align":9247},"适用场景",[8386,14457,14458,14480,14500],{},[8372,14459,14460,14465,14468,14471,14474,14477],{},[8391,14461,14462],{"align":9247},[22,14463,14464],{},"2-Step RAG",[8391,14466,14467],{"align":9247},"检索总是发生在生成之前。简单且可预测",[8391,14469,14470],{"align":9247},"高",[8391,14472,14473],{"align":9247},"低",[8391,14475,14476],{"align":9247},"快",[8391,14478,14479],{"align":9247},"FAQ、文档机器人",[8372,14481,14482,14487,14490,14492,14494,14497],{},[8391,14483,14484],{"align":9247},[22,14485,14486],{},"Agentic RAG",[8391,14488,14489],{"align":9247},"LLM驱动的 agent 决定在推理过程中何时以及如何检索",[8391,14491,14473],{"align":9247},[8391,14493,14470],{"align":9247},[8391,14495,14496],{"align":9247},"可变",[8391,14498,14499],{"align":9247},"多工具研究助理",[8372,14501,14502,14507,14510,14512,14514,14516],{},[8391,14503,14504],{"align":9247},[22,14505,14506],{},"Hybrid RAG",[8391,14508,14509],{"align":9247},"将两种方法的特点与验证步骤相结合",[8391,14511,236],{"align":9247},[8391,14513,236],{"align":9247},[8391,14515,14496],{"align":9247},[8391,14517,14518],{"align":9247},"需质量验证的领域问答",[226,14520,228],{},{"title":119,"searchDepth":144,"depth":144,"links":14522},[14523,14526,14529,14532],{"id":13753,"depth":132,"text":13754,"children":14524},[14525],{"id":13780,"depth":144,"text":13780},{"id":13990,"depth":132,"text":13991,"children":14527},[14528],{"id":14026,"depth":144,"text":14026},{"id":14202,"depth":132,"text":14203,"children":14530},[14531],{"id":14213,"depth":144,"text":14213},{"id":14351,"depth":132,"text":14352,"children":14533},[14534,14535],{"id":14375,"depth":144,"text":14375},{"id":14431,"depth":144,"text":14432},{},"\u002Flegacy-blog\u002F1773063997239",{"title":13745,"description":119},"legacy-blog\u002F1773063997239",[794,14541,9133,7744,10715,6380,14542],"检索增强生成","科研","Up4Os6asdcWn20aoOdBkDrRiuClPrTOq_Zxl7S48Mt4",{"id":14545,"title":14546,"assetBase":239,"author":8,"body":14547,"category":787,"collection":233,"date":14962,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":14963,"navigation":128,"originalPath":239,"path":14964,"seo":14965,"source":243,"stem":14966,"tags":14967,"weight":250,"__hash__":14969},"content\u002Flegacy-blog\u002F1773321514683.md","Context Engineering",{"type":10,"value":14548,"toc":14948},[14549,14553,14556,14562,14565,14568,14676,14679,14683,14686,14692,14695,14698,14704,14707,14783,14786,14790,14793,14796,14800,14808,14816,14824,14828,14835,14841,14845,14852,14868,14872,14875,14879,14882,14892,14895,14898,14901,14921,14928,14932,14935,14942,14945],[4517,14550,14552],{"id":14551},"context-engineering-上下文工程","Context Engineering 上下文工程",[107,14554,14555],{"id":14555},"从提示词工程到上下文工程的范式转移",[13,14557,14558,14559],{},"在人工智能应用发展的早期阶段，提升大语言模型（LLM）表现的核心手段集中于“提示词工程”（Prompt Engineering）。提示词工程主要关注如何通过精确的自然语言指令、角色设定（Role-playing）、少样本学习（Few-shot learning）以及思维链（Chain-of-Thought）技术来引导模型输出特定格式或风格的回答 。然而，随着大模型应用从单一的对话问答走向复杂的多步推理和自主智能体（AI Agents）系统，提示词工程的局限性开始暴漏无遗。",[22,14560,14561],{},"当模型需要处理跨越数十个对话轮次、整合外部API数据并遵循严格的企业合规逻辑时，单纯依赖静态指令已无法避免模型出现幻觉、指令遗忘或工具调用混乱。",[13,14563,14564],{},"这种技术瓶颈促成了行业向“上下文工程”（Context Engineering）的重大范式转移。上下文工程并非要取代提示词工程，而是将其降维为自身系统架构中的一个子集。提示词工程解决的是“如何对模型说话”的语言学问题，而上下文工程解决的则是“在说话时，模型需要并且只能知道什么”的系统级数据架构问题 。当智能体在循环中运行时，它会不断生成庞大的数据宇宙（包括工具调用结果、检索到的文档、历史对话和中间推理步骤）。如果不加节制地将这些信息全部塞入上下文窗口，模型将面临严重的挑战。研究表明，大模型在处理长文本时存在“中间迷失”（Lost in the Middle）的U型性能曲线问题，即模型能较好地回忆起开头和结尾的信息，但会忽略埋藏在中间的细节 。",[13,14566,14567],{},"为了清晰界定上下文工程的理论边界，有必要将其与传统的提示词工程以及检索增强生成（RAG）进行多维度的对比分析。",[8366,14569,14570,14594],{},[8369,14571,14572],{},[8372,14573,14574,14579,14584,14589],{},[8375,14575,14576],{"align":9247},[22,14577,14578],{},"对比维度",[8375,14580,14581],{"align":9247},[22,14582,14583],{},"提示词工程 (Prompt Engineering)",[8375,14585,14586],{"align":9247},[22,14587,14588],{},"检索增强生成 (RAG)",[8375,14590,14591],{"align":9247},[22,14592,14593],{},"上下文工程 (Context Engineering)",[8386,14595,14596,14612,14628,14644,14660],{},[8372,14597,14598,14603,14606,14609],{},[8391,14599,14600],{"align":9247},[22,14601,14602],{},"核心目标",[8391,14604,14605],{"align":9247},"优化单一交互的语言学精确度与输出格式，消除自然语言指令中的歧义",[8391,14607,14608],{"align":9247},"通过连接外部结构化或非结构化知识库，解决模型知识盲区与事实性幻觉问题",[8391,14610,14611],{"align":9247},"构建完整的动态信息环境，精细化管理计算资源，确保智能体在多步执行中的连贯性与可靠性",[8372,14613,14614,14619,14622,14625],{},[8391,14615,14616],{"align":9247},[22,14617,14618],{},"作用范围",[8391,14620,14621],{"align":9247},"单轮次、静态、局部（指令层面），将被动接受的上下文视为既定前提",[8391,14623,14624],{"align":9247},"局部数据检索、向量映射、单点知识片段注入",[8391,14626,14627],{"align":9247},"全局系统架构、跨会话状态管理、生命周期干预、动态工具编排与剪裁",[8372,14629,14630,14635,14638,14641],{},[8391,14631,14632],{"align":9247},[22,14633,14634],{},"核心机制",[8391,14636,14637],{"align":9247},"角色设定、思维链（CoT）、输出格式约束（如JSON\u002FXML声明）",[8391,14639,14640],{"align":9247},"文本切分（Chunking）、语义嵌入（Embedding）、相似度排序（Re-ranking）",[8391,14642,14643],{"align":9247},"上下文物理隔离、记忆有损压缩、中间件拦截控制流、模型上下文协议（MCP）映射",[8372,14645,14646,14651,14654,14657],{},[8391,14647,14648],{"align":9247},[22,14649,14650],{},"典型故障模式",[8391,14652,14653],{"align":9247},"歧义指令导致误解，或过度约束导致模型丧失灵活性",[8391,14655,14656],{"align":9247},"召回质量低导致答案错误，或检索粒度不当导致噪音引入",[8391,14658,14659],{"align":9247},"噪音过载导致上下文坍塌、冗余工具重叠导致决策树混乱、状态丢失导致陷入死循环",[8372,14661,14662,14667,14670,14673],{},[8391,14663,14664],{"align":9247},[22,14665,14666],{},"系统级隐喻",[8391,14668,14669],{"align":9247},"编写单个离散函数的逻辑代码与入参声明",[8391,14671,14672],{"align":9247},"数据库的索引构建与特定条件下的查询（Query）操作",[8391,14674,14675],{"align":9247},"设计整个软件的内存分配、垃圾回收机制（GC）、多线程状态同步与系统安全架构",[13,14677,14678],{},"在现代智能体开发中，RAG仅仅是上下文工程众多信息输入管道中的一条 。上下文工程需要统筹考虑RAG召回的片段如何与对话历史、工具描述以及用户系统状态进行优先级排序和融合。如果缺乏上下文工程的全局视角，盲目扩大上下文窗口不仅会导致成本和首字延迟呈二次方级数增长，还会引发“上下文腐化”，即随着上下文标记数的增加，模型准确回忆特定信息的能力显著下降 。",[107,14680,14682],{"id":14681},"langchain-上下文工程","LangChain 上下文工程",[13,14684,14685],{},"在工业级智能体系统的构建中，LangChain 及其底层运行时 LangGraph 提供了目前业界最为完善的上下文工程抽象模型。一个典型的智能体运行循环（Agent Loop）本质上是一个状态机，包含两个主要步骤的交替运行：首先是模型调用（Model Call）阶段，系统将系统指令、历史消息和可用工具的模式（Schema）传递给 LLM，模型进行推理后返回最终响应或发出执行工具的请求；其次是工具执行（Tool Execution）阶段，系统接管控制权，执行模型请求的特定工具逻辑，并将执行结果作为观察（Observation）返回给状态机。这个循环将持续迭代，直到大模型决定任务已完成并输出最终结果。",[13,14687,14688,14689,67],{},"为了使这个循环具备工业级的稳定性，系统设计者必须在循环的每一个执行节点，以及节点之间的状态流转过程中，实施精准的上下文控制。LangChain 将这种控制域划分为三种核心上下文类型：",[22,14690,14691],{},"模型上下文（Model Context）、工具上下文（Tool Context）以及生命周期上下文（Life-cycle Context）",[13,14693,14694],{},"**模型上下文决定了单次模型调用时究竟“看”到什么信息。**这包括系统提示词的动态拼接、经过剪裁和过滤的对话消息历史、当前节点激活的特定工具子集、动态选择的基础模型（如针对简单任务调用轻量级模型，针对复杂推理调用前沿模型），以及强制约束的结构化响应格式。这种上下文被定义为“瞬态”（Transient），因为对其进行的修改仅仅改变了当前这一轮次发给模型的请求负载，而不会永久改变系统保存在底层的全局状态 。例如，在某次调用前临时隐藏某个涉及高权限的转账工具，这一操作在当前轮次生效，但底层注册的工具列表并未丢失。",[13,14696,14697],{},"**工具上下文涉及工具在执行过程中能够访问和产生的信息边界。**工具不仅是执行外部动作（如调用 API、修改文件）的执行器，更是读取环境深层状态并向系统写入新知识的桥梁。工具上下文的修改通常是“持久化”（Persistent）的，工具的执行结果会被永久追加到消息历史中，或者工具内部的逻辑会直接更新系统的长期记忆数据库。",[13,14699,14700,14703],{},[22,14701,14702],{},"生命周期上下文关注的是在模型调用和工具调用之间发生的跨领域关注点","（Cross-cutting concerns）。通过生命周期钩子，系统可以在不侵入核心业务逻辑和提示词模板的前提下，持久化地执行对话历史摘要、应用数据防泄漏（DLP）护栏拦截、或者进行合规性审计日志的记录。",[13,14705,14706],{},"为了物理支撑上述三种上下文的高效流转，LangChain 抽象出了三个维度的基础数据源，它们在生命周期和可变性维度上存在严格的隔离界限，构成了上下文工程的底层数据底座。",[8366,14708,14709,14733],{},[8369,14710,14711],{},[8372,14712,14713,14718,14723,14728],{},[8375,14714,14715],{"align":9247},[22,14716,14717],{},"数据源类型",[8375,14719,14720],{"align":9247},[22,14721,14722],{},"架构别名与系统隐喻",[8375,14724,14725],{"align":9247},[22,14726,14727],{},"生命周期与可变性界限",[8375,14729,14730],{"align":9247},[22,14731,14732],{},"核心作用与典型企业级应用场景",[8386,14734,14735,14751,14767],{},[8372,14736,14737,14742,14745,14748],{},[8391,14738,14739],{"align":9247},[22,14740,14741],{},"Runtime Context (运行时上下文)",[8391,14743,14744],{"align":9247},"静态配置 \u002F 依赖注入",[8391,14746,14747],{"align":9247},"单次运行级 (不可变 Static)",[8391,14749,14750],{"align":9247},"传递系统级的基础设施依赖，如数据库连接池对象、当前请求的用户 ID、外部 API 密钥、环境变量及租户级别的功能开关。其核心价值在于避免了全局变量的污染，使得工具和中间件在执行时能够保持无状态（Stateless）和高可测试性。",[8372,14752,14753,14758,14761,14764],{},[8391,14754,14755],{"align":9247},[22,14756,14757],{},"State (状态)",[8391,14759,14760],{"align":9247},"短期记忆 \u002F 本地工作台",[8391,14762,14763],{"align":9247},"会话\u002F线程级 (动态可变 Dynamic)",[8391,14765,14766],{"align":9247},"存储当前对话生命周期内的完整执行轨迹、消息列表、临时上传的文件元数据、当前步骤的认知授权状态以及中间推理结果。LangGraph 通过 Checkpointer 将状态持久化，支持线程的随时挂起与恢复，但一旦逻辑上的会话被重置，该短期记忆即失去当前焦点。",[8372,14768,14769,14774,14777,14780],{},[8391,14770,14771],{"align":9247},[22,14772,14773],{},"Store (存储)",[8391,14775,14776],{"align":9247},"长期记忆 \u002F 全局档案库",[8391,14778,14779],{"align":9247},"跨会话级 (持久可变 Dynamic)",[8391,14781,14782],{"align":9247},"持久化存储用户的偏好设置、从历史交互中提取并压缩的核心洞察、组织架构知识以及业务策略。供智能体在未来全新的会话中进行跨线程检索和复用，通常由键值对存储或向量数据库（如 MongoDB, PostgreSQL）提供底层支持。",[13,14784,14785],{},"高级的上下文工程实践则是：在系统初始化阶段，将用户的鉴权令牌（Auth Token）和所在司法管辖区（Jurisdiction）放入 Runtime Context；在模型推理前的拦截阶段，通过中间件从 Store 中读取该用户以往的偏好报表格式并注入到 State 的特定字段中；最后在模型决定执行 SQL 查询工具时，工具内部逻辑直接从 Runtime Context 读取令牌，并根据鉴权系统动态拼接最终的执行代码，而无需大模型感知底层的鉴权复杂性 。这种关注点分离的架构不仅保证了数据的绝对隔离与安全性，还极大提升了系统的模块化与可维护性。",[107,14787,14789],{"id":14788},"langchain-中间件上下文控制的神经中枢","LangChain 中间件：上下文控制的神经中枢",[13,14791,14792],{},"在复杂的智能体流转网络中，如果将上下文工程中的各种修剪、注入、路由逻辑直接耦合在代理的核心执行节点代码中，系统很快就会陷入难以调试的代码泥潭。为了应对生产环境中的复杂干预需求，LangChain 在其 1.0 Alpha 版本中引入了革命性的中间件（Middleware）架构 。中间件是使上下文工程在工程实践中得以优雅落地的神经中枢，它借鉴了成熟 Web 服务器（如 Express.js 或 Django）的洋葱模型与拦截器模式，允许开发者在代理生命周期的任意细微阶段挂载非侵入式逻辑，从而实现对上下文的精准“外科手术式”干预 。",[13,14794,14795],{},"LangChain 的中间件架构暴露了多个核心的生命周期钩子（Hooks），按照其执行的机制可以分为节点式钩子（Node-style hooks）和包裹式钩子（Wrap-style hooks）。每个钩子在上下文控制矩阵中承担着不可替代的职能。",[7759,14797,14799],{"id":14798},"节点式拦截钩子全局状态与控制流的守门人","节点式拦截钩子：全局状态与控制流的守门人",[13,14801,14802,14803,1018,14805,14807],{},"节点式钩子主要包括 ",[17,14804,9978],{},[17,14806,9984],{},"，它们在特定的执行点按顺序触发，并拥有对智能体底层 State 的直接突变（Mutation）权限。",[13,14809,14810,14812,14813,14815],{},[17,14811,9978],{}," 钩子在每次向大模型发起调用之前触发。它的核心价值在于对持久化上下文进行前置的全局干预。在处理超长文本或多轮对话场景下，对话历史记录的无限制增长是导致模型 OOM（Out of Memory）或推理性能崩溃的首要原因。系统架构师通常会在此处部署高级的总结策略（Summarization）：当检测到 State 中的消息总标记数接近当前模型上下文窗口的 80% 阈值时，",[17,14814,9978],{}," 中间件会主动挂起主流程，触发一个轻量级模型（如 GPT-4o-mini）对早期的对话历史进行结构化摘要，随后持久化地用这条摘要消息替换掉 State 中的冗长列表 。这并不是简单的数据截断，而是通过“有损压缩”机制永久性地重塑了智能体的短期记忆，确保最新的关键指令不被淹没。此外，该钩子常被用于前置的访问控制拦截，若中间件检测到用户当前的意图违反了企业合规策略，它可以直接返回更新后的状态，并使用路由指令跳转（Jump）至结束节点，从而阻断后续昂贵的模型推理过程。",[13,14817,14818,14820,14821,14823],{},[17,14819,9984],{}," 钩子则运行在模型输出生成之后、工具实际执行之前，构成了系统的后置安全防线。这是部署安全护栏（Guardrails）和引入人在回路（Human-in-the-loop）机制的最佳节点。例如，如果模型经过推理，决定调用一个涉及高敏感操作（如“删除云端生产环境数据库”或“向外部供应商发送带机密附件的邮件”）的工具，",[17,14822,9984],{}," 中间件会立刻拦截该工具调用请求，将智能体状态挂起（Pause），并向外部系统发送审批通知。只有当人类管理员或自动化策略系统返回明确的批准指令后，智能体才会被重新唤醒并进入工具执行节点 。",[7759,14825,14827],{"id":14826},"瞬态干预钩子精细化请求的动态重塑","瞬态干预钩子：精细化请求的动态重塑",[13,14829,14830,14831,14834],{},"相较于直接修改底层 State 的持久化操作，",[17,14832,14833],{},"modify_model_request"," 钩子提供了一种更为克制且极具针对性的瞬态干预机制。它在模型即将被触发的最后一刻执行，专门用于动态修改当前请求的有效负载（Payload），而绝对不会对 State 造成任何持久化污染 。",[13,14836,14837,14838,14840],{},"以一个全能型企业 IT 支持智能体为例，它可能在底层注册了高达上百个潜在的运维工具。如果将所有工具的描述 Schema 一次性塞入提示词，庞大的 Token 消耗将急剧增加延迟，且相似度极高的工具描述会导致模型患上“选择困难症”进而产生幻觉 。通过 ",[17,14839,14833],{},"，系统可以根据 State 中记录的当前对话阶段、用户输入意图的分类结果，或者从 Runtime Context 中提取的用户部门信息，动态过滤并仅仅下发当前轮次最相关的 3 到 5 个工具描述。同时，系统也可以利用此钩子实现动态模型路由（Model Routing）。例如，当检测到上下文包含大量复杂的 Python 代码生成需求时，动态将请求重定向至代码能力极强的模型版本（如 Claude 3.5 Sonnet）；而在处理常规的闲聊澄清环节时，则动态切换至成本更低、速度更快的模型，从而在保证质量的同时实现全局推理成本的最优化 。",[7759,14842,14844],{"id":14843},"包裹式钩子可观测性与韧性工程的基石","包裹式钩子：可观测性与韧性工程的基石",[13,14846,14847,1018,14849,14851],{},[17,14848,10096],{},[17,14850,10102],{}," 属于包裹式钩子（Wrap-style hooks），它们的设计理念类似于面向切面编程（AOP）中的环绕通知（Around Advice）。这两个钩子能够同时拦截目标函数执行前和执行后的状态，是实现企业级系统韧性（Resilience）和深度可观测性（Observability）的基石。",[13,14853,14854,14855,1018,14857,14859,14860,14863,14864,14867],{},"当外部 API 不稳定或模型服务遭遇限流（Rate Limiting）时，",[17,14856,10096],{},[17,14858,10102],{}," 可以优雅地捕获异常，并实施带有指数退避（Exponential Backoff）的自动重试逻辑。更为关键的是，在通过这些钩子拦截到模型响应后，开发者可以返回一个携带 ",[17,14861,14862],{},"Command"," 指令的 ",[17,14865,14866],{},"ExtendedModelResponse"," 对象，将运行时计算的元数据（如当前调用的确切 Token 消耗量、网络延迟毫秒数、工具执行时间等）以非侵入式的方式注入到智能体的 State 中，以便后续节点用于成本计费或性能监控分析 。这种基于中间件的拦截矩阵，使得上下文工程从零散的“打补丁”式的代码片段，升华为一套高度内聚、可复用且易于测试的工业级流水线。",[107,14869,14871],{"id":14870},"长期记忆管理memory-management","长期记忆管理（Memory Management）",[13,14873,14874],{},"在掌握了基础的上下文组装与中间件控制流之后，工程团队面临的最大挑战往往是如何处理动辄需要跨越数小时甚至数周的长周期任务（Long-horizon tasks）。现代智能体系统绝不能仅仅依赖模型不断膨胀的上下文窗口能力。因为即使模型在理论上支持高达数百万 Token 的输入，海量无结构的原始数据堆砌依然会导致严重的“注意力稀释”与“上下文坍塌”（Context Collapse），表现为模型在海量噪音中遗失关键业务逻辑，最终导致行为失控 。因此，高阶上下文工程必须实施极具策略性的记忆管理模式，将信息从“被动堆积”转变为“主动提纯”。",[7759,14876,14878],{"id":14877},"结构化笔记与代理式记忆agentic-memory","结构化笔记与代理式记忆（Agentic Memory）",[13,14880,14881],{},"第一种关键模式是“结构化笔记”（Structured Note-taking），在业界也常被称为代理式记忆。与系统强制执行的截断式文本摘要不同，这是一种赋予智能体自主性，让其主动在当前上下文窗口之外维护外部持久化状态的策略。",[13,14883,14884,14885,275,14888,14891],{},"当智能体被要求执行复杂的代码库重构或跨越数小时的游戏探索（如控制智能体游玩宝可梦）时，单纯的窗口滚动会导致其迅速丧失对全局目标的把控 。通过上下文工程，系统为智能体提供了一个专用的文件写入工具，并指令其维护一个类似于 ",[17,14886,14887],{},"NOTES.md",[17,14889,14890],{},"STATE.json"," 的独立状态账本。在这个文件中，智能体被要求以高密度的结构化格式持续记录当前的核心目标、已完成的里程碑、遇到的死胡同（避免重复试错）、以及未完成的子任务依赖树。每当当前的上下文窗口因填充了过多冗余的工具调用日志而面临崩溃，系统触发环境重置（Environment Reset）时，智能体在新的干净窗口中只需首先调用读取工具拉取这份结构化笔记，即可在几秒钟内瞬间恢复完整的工作记忆与任务上下文 。这种模式完美模仿了人类高级工程师的交接班记录习惯，用极小的 Token 开销彻底规避了细粒度技术决策在长程对话中的消散。",[7759,14893,14894],{"id":14894},"多维记忆流抽象",[13,14896,14897],{},"在更广阔的企业级应用中，用户的个性化偏好、历史纠错记录以及组织内部的业务惯例不能随着单个智能体生命周期的结束而灰飞烟灭。这要求上下文工程从短期的 State 管理跨越到基于 Store 的全局长期记忆融合。",[13,14899,14900],{},"LangChain 推出的 LangMem 架构为这种复杂需求提供了标准化的解决方案，它将记忆系统解耦为三种并行的记忆流：",[2285,14902,14903,14909,14915],{},[52,14904,14905,14908],{},[22,14906,14907],{},"语义记忆（Semantic Memory）","：用于提取和存储交互中呈现的客观事实关系（如“用户的核心项目是项目 A”、“公司的默认数据库是 PostgreSQL”），通常映射到图数据库或知识图谱中。",[52,14910,14911,14914],{},[22,14912,14913],{},"情景记忆（Episodic Memory）","：用于保留特定历史会话的连贯时间切片，帮助智能体回溯“上周二我们关于服务器宕机的讨论进行到了哪一步”。",[52,14916,14917,14920],{},[22,14918,14919],{},"程序记忆（Procedural Memory）","：这是最具价值的层面，专门用于系统后台异步提取并固化用户的工作流偏好、纠错指令或特定的代码编写风格（如“用户偏好使用 TypeScript 强类型声明”），并在未来的会话中作为隐式规则自动注入系统提示词 。",[13,14922,14923,14924,14927],{},"为了保证记忆的动态更新而不发生坍塌，斯坦福与学术界联合提出的 ACE（Agentic Context Engineering）框架引入了更为模块化的演进机制。ACE 框架将上下文视为一本“不断进化的战术手册”，其内部运作包含三个专门的子代理角色：",[22,14925,14926],{},"生成器（Generator）负责执行任务并产出轨迹；反思器（Reflector）负责批判这些轨迹，从成功或失败的反馈中提取具体的经验教训；策展人（Curator）则负责将这些洞察合成为结构化的、条目化的“增量更新”（Delta Updates）","。通过这种基于局部增量编辑而非全局重写的机制，ACE 框架有效防止了信息迭代过程中的细节磨损（Brevity bias） 。在底层基础设施层面，这些高阶记忆策略通常与融合了向量搜索与文档存储能力的数据库（如集成 Vector Search 的 MongoDB Atlas 或支持 pgvector 的 PostgreSQL）紧密结合，构成强大的记忆检索中枢 。",[107,14929,14931],{"id":14930},"上下文物理隔离context-isolation","上下文物理隔离（Context Isolation）",[13,14933,14934],{},"当单个智能体面对跨域的复杂企业任务时，即便是最顶尖的大模型，其推理能力也会在海量异构信息的冲击下出现退化。将数百页的 API 文档、所有可能的执行工具库以及冗长的业务规则全部集中在单一节点（Single-agent node）的提示词中，被业界公认为是一种极其脆弱的“巨型提示词反模式”（Monolithic Mega-Prompt Anti-pattern）。",[13,14936,14937,14938,14941],{},"在多智能体架构中，",[22,14939,14940],{},"协调者-工作者（Orchestrator-Worker \u002F Supervisor）模式","是最为主流且经过验证的企业级设计模式 。在该模式下，主节点（Orchestrator Agent）扮演项目经理的角色，它自身不携带任何具体的执行工具（如代码解释器或数据库连接器），而是仅仅维持一个高度凝练的“全局上下文”（Global Context），其中包含了用户的终极目标、总体约束条件以及任务的分解蓝图。",[13,14943,14944],{},"当遇到需要深度下钻的具体子任务时，主节点会采用“将智能体作为工具”（Agent-as-a-Tool）的范式，动态孵化或调用一个专业的工作者智能体（如专门负责编写 SQL 的子智能体，或专门负责审查安全漏洞的子智能体）。在任务交接的瞬间，上下文工程的精髓得以体现：主节点并不会将数百轮的对话历史和所有背景资料一股脑地倾泻给子智能体，而是通过上下文过滤器，提炼并仅向子智能体下发严格限定的“局部上下文”（Local Context），即它完成当前原子任务所需的最小信息集。",[13,14946,14947],{},"工作者智能体在其独立的上下文沙盒（Context Sandbox）中，由于没有全局无关信息的干扰，能够以极高的准确率进行高频的试错、工具调用和逻辑推理。当子任务完成后，工作者同样不会返回冗长的执行日志，而是仅仅将脱水后的、提纯的关键结果（通常严格限制在 1000 到 2000 个 Token 以内）作为最终输出返回给协调者主节点 。这种严格的上下文进出双向管控机制，不仅大幅削减了 API 调用的 Token 计费成本，更从系统架构的根源上阻断了长下文导致的逻辑幻觉与认知过载现象，使得整个 AI 系统的表现变得确定且可追溯。",{"title":119,"searchDepth":144,"depth":144,"links":14949},[14950,14951,14952,14957,14961],{"id":14555,"depth":132,"text":14555},{"id":14681,"depth":132,"text":14682},{"id":14788,"depth":132,"text":14789,"children":14953},[14954,14955,14956],{"id":14798,"depth":144,"text":14799},{"id":14826,"depth":144,"text":14827},{"id":14843,"depth":144,"text":14844},{"id":14870,"depth":132,"text":14871,"children":14958},[14959,14960],{"id":14877,"depth":144,"text":14878},{"id":14894,"depth":144,"text":14894},{"id":14930,"depth":132,"text":14931},"2026-03-12",{},"\u002Flegacy-blog\u002F1773321514683",{"title":14546,"description":119},"legacy-blog\u002F1773321514683",[794,14541,9133,14968,7744,10715,6380],"可靠人工智能","mP3ixfMFKL3nuzcxdYlqqUneXET54NOru_qDG1KC33Y",{"id":14971,"title":14972,"assetBase":239,"author":8,"body":14973,"category":787,"collection":233,"date":15959,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":15960,"navigation":128,"originalPath":239,"path":15961,"seo":15962,"source":243,"stem":15963,"tags":15964,"weight":250,"__hash__":15965},"content\u002Flegacy-blog\u002F1773559659588.md","Python Base",{"type":10,"value":14974,"toc":15934},[14975,14978,14981,14996,15000,15003,15017,15056,15059,15112,15115,15118,15139,15202,15207,15218,15222,15238,15241,15250,15252,15262,15269,15284,15288,15342,15346,15401,15404,15425,15429,15514,15517,15521,15592,15595,15600,15608,15699,15702,15706,15709,15763,15766,15855,15858,15932],[107,14976,14977],{"id":14977},"语法基础",[7759,14979,14980],{"id":14980},"快读模板",[114,14982,14984],{"className":116,"code":14983,"language":118,"meta":119,"style":119},"import sys\ninput = lambda:sys.stdin.readline().strip()\n",[17,14985,14986,14991],{"__ignoreMap":119},[78,14987,14988],{"class":124,"line":125},[78,14989,14990],{},"import sys\n",[78,14992,14993],{"class":124,"line":132},[78,14994,14995],{},"input = lambda:sys.stdin.readline().strip()\n",[7759,14997,14999],{"id":14998},"内置排序算法-sorted","内置排序算法 sorted()",[13,15001,15002],{},"可以对任何可迭代对象进行排序，返回一个新的排序后的列表。",[72,15004,15005,15008,15011,15014],{},[13,15006,15007],{},"sorted(iterable, key=None, reverse=False)",[13,15009,15010],{},"iterable：需要排序的可迭代对象",[13,15012,15013],{},"key：排序规则，可以传入一个函数，指定排序依据",[13,15015,15016],{},"reverse：是否反向排序，默认为False（升序）",[114,15018,15020],{"className":116,"code":15019,"language":118,"meta":119,"style":119},"word = [\"apple\", \"banana\", \"kiwi\", \"cherry\"]\nprint(sorted(words, key=len, reverse=True))\n# 输出：['banana', 'cherry', 'apple', 'kiwi']\n\n# 结合 lambda\nprint(sorted(words, key=lambda x: x[1]))\n# 输出：['banana', 'cherry', 'kiwi', 'apple']\n",[17,15021,15022,15027,15032,15037,15041,15046,15051],{"__ignoreMap":119},[78,15023,15024],{"class":124,"line":125},[78,15025,15026],{},"word = [\"apple\", \"banana\", \"kiwi\", \"cherry\"]\n",[78,15028,15029],{"class":124,"line":132},[78,15030,15031],{},"print(sorted(words, key=len, reverse=True))\n",[78,15033,15034],{"class":124,"line":138},[78,15035,15036],{},"# 输出：['banana', 'cherry', 'apple', 'kiwi']\n",[78,15038,15039],{"class":124,"line":144},[78,15040,129],{"emptyLinePlaceholder":128},[78,15042,15043],{"class":124,"line":150},[78,15044,15045],{},"# 结合 lambda\n",[78,15047,15048],{"class":124,"line":156},[78,15049,15050],{},"print(sorted(words, key=lambda x: x[1]))\n",[78,15052,15053],{"class":124,"line":162},[78,15054,15055],{},"# 输出：['banana', 'cherry', 'kiwi', 'apple']\n",[7759,15057,15058],{"id":15058},"处理常见输入格式",[114,15060,15062],{"className":116,"code":15061,"language":118,"meta":119,"style":119},"# 1.单行多个整数\na, b, c = map(int, input().split())  # 输入：1 2 3\n\n# 2.多行多个整数\nn = int(input())  # 输入行数\nlst = [int(input()) for _ in range(n)]  # 读取 n 行整数\n\n# 3.矩阵输入\nn, m = map(int, input().split())  # 输入矩阵大小\nmatrix = [list(map(int, input().split())) for _ in range(n)]  # 读取 n 行 m 列的矩阵\n",[17,15063,15064,15069,15074,15078,15083,15088,15093,15097,15102,15107],{"__ignoreMap":119},[78,15065,15066],{"class":124,"line":125},[78,15067,15068],{},"# 1.单行多个整数\n",[78,15070,15071],{"class":124,"line":132},[78,15072,15073],{},"a, b, c = map(int, input().split())  # 输入：1 2 3\n",[78,15075,15076],{"class":124,"line":138},[78,15077,129],{"emptyLinePlaceholder":128},[78,15079,15080],{"class":124,"line":144},[78,15081,15082],{},"# 2.多行多个整数\n",[78,15084,15085],{"class":124,"line":150},[78,15086,15087],{},"n = int(input())  # 输入行数\n",[78,15089,15090],{"class":124,"line":156},[78,15091,15092],{},"lst = [int(input()) for _ in range(n)]  # 读取 n 行整数\n",[78,15094,15095],{"class":124,"line":162},[78,15096,129],{"emptyLinePlaceholder":128},[78,15098,15099],{"class":124,"line":168},[78,15100,15101],{},"# 3.矩阵输入\n",[78,15103,15104],{"class":124,"line":174},[78,15105,15106],{},"n, m = map(int, input().split())  # 输入矩阵大小\n",[78,15108,15109],{"class":124,"line":180},[78,15110,15111],{},"matrix = [list(map(int, input().split())) for _ in range(n)]  # 读取 n 行 m 列的矩阵\n",[107,15113,15114],{"id":15114},"语法进阶",[7759,15116,15117],{"id":15117},"列表推导器",[72,15119,15120,15125],{},[13,15121,15122],{},[78,15123,15124],{},"expression for item in iterable if condition",[49,15126,15127,15130,15133,15136],{},[52,15128,15129],{},"expression: 表达式，用于生成列表中的元素",[52,15131,15132],{},"item: 可迭代对象中的每个元素",[52,15134,15135],{},"iterable: 可迭代对象（如列表、字符串、range等）",[52,15137,15138],{},"condition: 可选，用于过滤元素的条件",[114,15140,15142],{"className":116,"code":15141,"language":118,"meta":119,"style":119},"# 过滤 1~20 中的偶数并取平方\nevens = [i**2 for i in range(1, 21) if i % 2 == 0]\n# 输出：[4, 16, 36, 64, 100, 144, 196, 256, 324, 400]\n\n# 将输入字符串列表转换为整数列表\ninput_data = list(map(int, input().split()))  # 假设输入 \"1 2 3 4 5\"\n# 使用列表推导器实现\ninput_data = [int(x) for x in input().split()]\n# 输出：[1, 2, 3, 4, 5]\n\n# list(int) 转 int\nnum = int(''.join(map(str, nums)))\n",[17,15143,15144,15149,15154,15159,15163,15168,15173,15178,15183,15188,15192,15197],{"__ignoreMap":119},[78,15145,15146],{"class":124,"line":125},[78,15147,15148],{},"# 过滤 1~20 中的偶数并取平方\n",[78,15150,15151],{"class":124,"line":132},[78,15152,15153],{},"evens = [i**2 for i in range(1, 21) if i % 2 == 0]\n",[78,15155,15156],{"class":124,"line":138},[78,15157,15158],{},"# 输出：[4, 16, 36, 64, 100, 144, 196, 256, 324, 400]\n",[78,15160,15161],{"class":124,"line":144},[78,15162,129],{"emptyLinePlaceholder":128},[78,15164,15165],{"class":124,"line":150},[78,15166,15167],{},"# 将输入字符串列表转换为整数列表\n",[78,15169,15170],{"class":124,"line":156},[78,15171,15172],{},"input_data = list(map(int, input().split()))  # 假设输入 \"1 2 3 4 5\"\n",[78,15174,15175],{"class":124,"line":162},[78,15176,15177],{},"# 使用列表推导器实现\n",[78,15179,15180],{"class":124,"line":168},[78,15181,15182],{},"input_data = [int(x) for x in input().split()]\n",[78,15184,15185],{"class":124,"line":174},[78,15186,15187],{},"# 输出：[1, 2, 3, 4, 5]\n",[78,15189,15190],{"class":124,"line":180},[78,15191,129],{"emptyLinePlaceholder":128},[78,15193,15194],{"class":124,"line":186},[78,15195,15196],{},"# list(int) 转 int\n",[78,15198,15199],{"class":124,"line":192},[78,15200,15201],{},"num = int(''.join(map(str, nums)))\n",[13,15203,15204],{},[22,15205,15206],{},"列表特性",[13,15208,15209,15210,15213,15214,15217],{},"比较大小的时候，不管长度如何，依次比较到第一个元素不相等的位置。比如 ",[78,15211,15212],{},"1, 2, 3"," \u003C ",[78,15215,15216],{},"2, 3"," 因为在比较 1 \u003C 2 的时候就终止。",[7759,15219,15221],{"id":15220},"range-函数","range 函数",[72,15223,15224,15227],{},[13,15225,15226],{},"range(start, stop, step)",[49,15228,15229,15232,15235],{},[52,15230,15231],{},"start: 序列起始值（包含）",[52,15233,15234],{},"stop: 序列结束值（不包含）",[52,15236,15237],{},"step: 步长，默认为1",[13,15239,15240],{},"range返回的是一个range对象，是一个惰性序列，节省内存。如果需要列表，可以用list()函数将其转换为列表。",[114,15242,15244],{"className":116,"code":15243,"language":118,"meta":119,"style":119},"seq = range(10, 0, -1)  # 倒序数组start应该是最大值，end应该是最小值\n",[17,15245,15246],{"__ignoreMap":119},[78,15247,15248],{"class":124,"line":125},[78,15249,15243],{},[7759,15251,450],{"id":450},[13,15253,15254,15257,15258,15261],{},[17,15255,15256],{},"s1.startswith(s2, beg = 0, end = len(s2))","： 用于检查字符串 s1 是否以字符串 s2 开头。是则返回 True。如果指定 beg 和 end，则在 s1 ",[78,15259,15260],{},"beg: end"," 范围内查找。",[13,15263,15264,15265,15268],{},"使用 ",[17,15266,15267],{},"ascii_lowercase"," 遍历 26 个字母：",[114,15270,15272],{"className":116,"code":15271,"language":118,"meta":119,"style":119},"from string import ascii_lowercase\ncnt = {ch: 0 for ch in ascii_lowercase}\n",[17,15273,15274,15279],{"__ignoreMap":119},[78,15275,15276],{"class":124,"line":125},[78,15277,15278],{},"from string import ascii_lowercase\n",[78,15280,15281],{"class":124,"line":132},[78,15282,15283],{},"cnt = {ch: 0 for ch in ascii_lowercase}\n",[7759,15285,15287],{"id":15286},"队列先进先出","队列（先进先出）",[114,15289,15291],{"className":116,"code":15290,"language":118,"meta":119,"style":119},"from collections import deque\n\nq = deque()  # 初始化\nq.append(x)  # 从右侧入队\nq.appendleft(x)  # 从左侧入队\nx = q.popleft()  # 从左侧出队（O(1)）\nlen(q)  # 获取队列长度\nq.extend(可迭代元素)  # 向右侧添加可迭代元素\nq.extendleft(可迭代元素)    \nq.count(1)  # 统计元素个数 1\n",[17,15292,15293,15298,15302,15307,15312,15317,15322,15327,15332,15337],{"__ignoreMap":119},[78,15294,15295],{"class":124,"line":125},[78,15296,15297],{},"from collections import deque\n",[78,15299,15300],{"class":124,"line":132},[78,15301,129],{"emptyLinePlaceholder":128},[78,15303,15304],{"class":124,"line":138},[78,15305,15306],{},"q = deque()  # 初始化\n",[78,15308,15309],{"class":124,"line":144},[78,15310,15311],{},"q.append(x)  # 从右侧入队\n",[78,15313,15314],{"class":124,"line":150},[78,15315,15316],{},"q.appendleft(x)  # 从左侧入队\n",[78,15318,15319],{"class":124,"line":156},[78,15320,15321],{},"x = q.popleft()  # 从左侧出队（O(1)）\n",[78,15323,15324],{"class":124,"line":162},[78,15325,15326],{},"len(q)  # 获取队列长度\n",[78,15328,15329],{"class":124,"line":168},[78,15330,15331],{},"q.extend(可迭代元素)  # 向右侧添加可迭代元素\n",[78,15333,15334],{"class":124,"line":174},[78,15335,15336],{},"q.extendleft(可迭代元素)    \n",[78,15338,15339],{"class":124,"line":180},[78,15340,15341],{},"q.count(1)  # 统计元素个数 1\n",[7759,15343,15345],{"id":15344},"栈先进后出","栈（先进后出）",[114,15347,15349],{"className":116,"code":15348,"language":118,"meta":119,"style":119},"stk = []\nstk.append(x)  # 入栈\nstk.pop()  # 出栈（默认弹出最后一个元素，O(1)）\nstk[-1]  # 获取栈顶元素不移除\nstk.get(key, default_value=None)  # 返回 key 对应的 value，不存在则返回 default_value\nstk.keys()  # 键构成的可迭代对象\nstk.values()  # 值构成的可迭代对象\nstk.items()  # 键值对构成的可迭代对象\nstk = defaultdict(list)  # 指定了具有默认值空列表的字典\nstk[key] = value  # 创建一个键值对\n",[17,15350,15351,15356,15361,15366,15371,15376,15381,15386,15391,15396],{"__ignoreMap":119},[78,15352,15353],{"class":124,"line":125},[78,15354,15355],{},"stk = []\n",[78,15357,15358],{"class":124,"line":132},[78,15359,15360],{},"stk.append(x)  # 入栈\n",[78,15362,15363],{"class":124,"line":138},[78,15364,15365],{},"stk.pop()  # 出栈（默认弹出最后一个元素，O(1)）\n",[78,15367,15368],{"class":124,"line":144},[78,15369,15370],{},"stk[-1]  # 获取栈顶元素不移除\n",[78,15372,15373],{"class":124,"line":150},[78,15374,15375],{},"stk.get(key, default_value=None)  # 返回 key 对应的 value，不存在则返回 default_value\n",[78,15377,15378],{"class":124,"line":156},[78,15379,15380],{},"stk.keys()  # 键构成的可迭代对象\n",[78,15382,15383],{"class":124,"line":162},[78,15384,15385],{},"stk.values()  # 值构成的可迭代对象\n",[78,15387,15388],{"class":124,"line":168},[78,15389,15390],{},"stk.items()  # 键值对构成的可迭代对象\n",[78,15392,15393],{"class":124,"line":174},[78,15394,15395],{},"stk = defaultdict(list)  # 指定了具有默认值空列表的字典\n",[78,15397,15398],{"class":124,"line":180},[78,15399,15400],{},"stk[key] = value  # 创建一个键值对\n",[7759,15402,15403],{"id":15403},"栈与队列小技巧",[49,15405,15406,15409,15416,15419],{},[52,15407,15408],{},"快速判断空队列\u002F栈：if not q:  # 判空",[52,15410,15411,15412,15415],{},"栈的翻转：stack",[78,15413,15414],{},"::-1","  # 用切片获取逆序",[52,15417,15418],{},"队列转列表：list(q)  # 将 deque 转换为普通列表",[52,15420,15421,15422,15424],{},"一次性初始化：deque(",[78,15423,15212],{},")  # 用迭代器初始化队列",[7759,15426,15428],{"id":15427},"map-映射函数","map 映射函数",[114,15430,15432],{"className":116,"code":15431,"language":118,"meta":119,"style":119},"# map(function, iterable, ...)\n\n# 计算平方数\ndef square(x):\n    return x ** 2\n\n# 计算列表各个元素的平方\nmap(square, [1,2,3,4,5])\n# [1, 4, 9, 16, 25]\n\n# 使用 lambda 匿名函数\nmap(lambda x: x ** 2, [1, 2, 3, 4, 5])\n# [1, 4, 9, 16, 25]\n\n# 提供了两个列表，对相同位置的列表数据进行相加\nmap(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])\n# [3, 7, 11, 15, 19]\n",[17,15433,15434,15439,15443,15448,15453,15458,15462,15467,15472,15477,15481,15486,15491,15495,15499,15504,15509],{"__ignoreMap":119},[78,15435,15436],{"class":124,"line":125},[78,15437,15438],{},"# map(function, iterable, ...)\n",[78,15440,15441],{"class":124,"line":132},[78,15442,129],{"emptyLinePlaceholder":128},[78,15444,15445],{"class":124,"line":138},[78,15446,15447],{},"# 计算平方数\n",[78,15449,15450],{"class":124,"line":144},[78,15451,15452],{},"def square(x):\n",[78,15454,15455],{"class":124,"line":150},[78,15456,15457],{},"    return x ** 2\n",[78,15459,15460],{"class":124,"line":156},[78,15461,129],{"emptyLinePlaceholder":128},[78,15463,15464],{"class":124,"line":162},[78,15465,15466],{},"# 计算列表各个元素的平方\n",[78,15468,15469],{"class":124,"line":168},[78,15470,15471],{},"map(square, [1,2,3,4,5])\n",[78,15473,15474],{"class":124,"line":174},[78,15475,15476],{},"# [1, 4, 9, 16, 25]\n",[78,15478,15479],{"class":124,"line":180},[78,15480,129],{"emptyLinePlaceholder":128},[78,15482,15483],{"class":124,"line":186},[78,15484,15485],{},"# 使用 lambda 匿名函数\n",[78,15487,15488],{"class":124,"line":192},[78,15489,15490],{},"map(lambda x: x ** 2, [1, 2, 3, 4, 5])\n",[78,15492,15493],{"class":124,"line":198},[78,15494,15476],{},[78,15496,15497],{"class":124,"line":204},[78,15498,129],{"emptyLinePlaceholder":128},[78,15500,15501],{"class":124,"line":210},[78,15502,15503],{},"# 提供了两个列表，对相同位置的列表数据进行相加\n",[78,15505,15506],{"class":124,"line":216},[78,15507,15508],{},"map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])\n",[78,15510,15511],{"class":124,"line":222},[78,15512,15513],{},"# [3, 7, 11, 15, 19]\n",[107,15515,15516],{"id":15516},"库函数",[7759,15518,15520],{"id":15519},"counter","Counter",[114,15522,15524],{"className":116,"code":15523,"language":118,"meta":119,"style":119},"from collections import Counter\n\nlist1 = [\"a\", \"a\", \"a\", \"b\", \"c\", \"c\", \"f\", \"g\", \"g\", \"g\", \"f\"]\ndic = Counter(list1)\n# dic =     Counter({'a': 3, 'g': 3, 'c': 2, 'f': 2, 'b': 1})\n\nlist1 = [\"a\", \"a\", \"a\", \"b\", \"c\", \"f\", \"g\", \"g\", \"c\", \"11\", \"g\", \"f\", \"10\", \"2\"]\nprint(Counter(list1).most_common(3))\n# 结果：[('a', 3), ('g', 3), ('c', 2)]\n\nlist1 = [\"a\", \"a\", \"a\", \"b\", \"c\", \"f\", \"g\", \"g\", \"c\", \"11\", \"g\", \"f\", \"10\", \"2\"]\nprint(Counter(list1).most_common(1))\n# 结果：[('a', 3)]\n# most_common(k) 时间复杂度 O(nlog⁡k)。\n",[17,15525,15526,15531,15535,15540,15545,15550,15554,15559,15564,15569,15573,15577,15582,15587],{"__ignoreMap":119},[78,15527,15528],{"class":124,"line":125},[78,15529,15530],{},"from collections import Counter\n",[78,15532,15533],{"class":124,"line":132},[78,15534,129],{"emptyLinePlaceholder":128},[78,15536,15537],{"class":124,"line":138},[78,15538,15539],{},"list1 = [\"a\", \"a\", \"a\", \"b\", \"c\", \"c\", \"f\", \"g\", \"g\", \"g\", \"f\"]\n",[78,15541,15542],{"class":124,"line":144},[78,15543,15544],{},"dic = Counter(list1)\n",[78,15546,15547],{"class":124,"line":150},[78,15548,15549],{},"# dic =     Counter({'a': 3, 'g': 3, 'c': 2, 'f': 2, 'b': 1})\n",[78,15551,15552],{"class":124,"line":156},[78,15553,129],{"emptyLinePlaceholder":128},[78,15555,15556],{"class":124,"line":162},[78,15557,15558],{},"list1 = [\"a\", \"a\", \"a\", \"b\", \"c\", \"f\", \"g\", \"g\", \"c\", \"11\", \"g\", \"f\", \"10\", \"2\"]\n",[78,15560,15561],{"class":124,"line":168},[78,15562,15563],{},"print(Counter(list1).most_common(3))\n",[78,15565,15566],{"class":124,"line":174},[78,15567,15568],{},"# 结果：[('a', 3), ('g', 3), ('c', 2)]\n",[78,15570,15571],{"class":124,"line":180},[78,15572,129],{"emptyLinePlaceholder":128},[78,15574,15575],{"class":124,"line":186},[78,15576,15558],{},[78,15578,15579],{"class":124,"line":192},[78,15580,15581],{},"print(Counter(list1).most_common(1))\n",[78,15583,15584],{"class":124,"line":198},[78,15585,15586],{},"# 结果：[('a', 3)]\n",[78,15588,15589],{"class":124,"line":204},[78,15590,15591],{},"# most_common(k) 时间复杂度 O(nlog⁡k)。\n",[7759,15593,15594],{"id":15594},"bisect",[13,15596,15597],{},[17,15598,15599],{},"bisect(a, x, lo = 0, hi = len(nums))",[49,15601,15602,15605],{},[52,15603,15604],{},"给定一个单调不减的数组 a，在其 [lo, hi) 区间中，返回第一个严格大于 x 的下标位置",[52,15606,15607],{},"时间复杂度 O(log n)",[114,15609,15611],{"className":116,"code":15610,"language":118,"meta":119,"style":119},"from bisect import *\n#      0  1  2  3  4    5\narr = [1, 9, 9, 9, 200, 500]\n\n# 查找插入位置\nbisect(arr, 3)  # 输出：1 (第一个大于 3 的索引)\nbisect(arr, -99)  # 输出：0 (第一个大于 -99 的索引)\nbisect(arr, 1000)  # 输出：6 (第一个大于 1000 的索引，此时为数组长度)\n\n# 查找大于等于\n# bisect(arr, x - 1)\n\n# 逆序数组，找到小于 x 的位置索引\n# arr = [-x for x in arr]\n# bisect(arr, -x)\n\n# 查找首个出现\n# bisect_left(arr, x)\n",[17,15612,15613,15618,15623,15628,15632,15637,15642,15647,15652,15656,15661,15666,15670,15675,15680,15685,15689,15694],{"__ignoreMap":119},[78,15614,15615],{"class":124,"line":125},[78,15616,15617],{},"from bisect import *\n",[78,15619,15620],{"class":124,"line":132},[78,15621,15622],{},"#      0  1  2  3  4    5\n",[78,15624,15625],{"class":124,"line":138},[78,15626,15627],{},"arr = [1, 9, 9, 9, 200, 500]\n",[78,15629,15630],{"class":124,"line":144},[78,15631,129],{"emptyLinePlaceholder":128},[78,15633,15634],{"class":124,"line":150},[78,15635,15636],{},"# 查找插入位置\n",[78,15638,15639],{"class":124,"line":156},[78,15640,15641],{},"bisect(arr, 3)  # 输出：1 (第一个大于 3 的索引)\n",[78,15643,15644],{"class":124,"line":162},[78,15645,15646],{},"bisect(arr, -99)  # 输出：0 (第一个大于 -99 的索引)\n",[78,15648,15649],{"class":124,"line":168},[78,15650,15651],{},"bisect(arr, 1000)  # 输出：6 (第一个大于 1000 的索引，此时为数组长度)\n",[78,15653,15654],{"class":124,"line":174},[78,15655,129],{"emptyLinePlaceholder":128},[78,15657,15658],{"class":124,"line":180},[78,15659,15660],{},"# 查找大于等于\n",[78,15662,15663],{"class":124,"line":186},[78,15664,15665],{},"# bisect(arr, x - 1)\n",[78,15667,15668],{"class":124,"line":192},[78,15669,129],{"emptyLinePlaceholder":128},[78,15671,15672],{"class":124,"line":198},[78,15673,15674],{},"# 逆序数组，找到小于 x 的位置索引\n",[78,15676,15677],{"class":124,"line":204},[78,15678,15679],{},"# arr = [-x for x in arr]\n",[78,15681,15682],{"class":124,"line":210},[78,15683,15684],{},"# bisect(arr, -x)\n",[78,15686,15687],{"class":124,"line":216},[78,15688,129],{"emptyLinePlaceholder":128},[78,15690,15691],{"class":124,"line":222},[78,15692,15693],{},"# 查找首个出现\n",[78,15695,15696],{"class":124,"line":421},[78,15697,15698],{},"# bisect_left(arr, x)\n",[107,15700,15701],{"id":15701},"算法入门",[7759,15703,15705],{"id":15704},"埃氏筛onloglogn","埃氏筛（O(nloglogn)）",[13,15707,15708],{},"求解素数",[114,15710,15712],{"className":116,"code":15711,"language":118,"meta":119,"style":119},"primes = []\nis_prime = [True] * (n + 1)\nis_prime[1] = is_prime[0] = False\n\nfor i in range(2, int(math.sqrt(n)) + 1):  # i * i \u003C= n\n    if is_prime[i]:\n        for j in range(i * i, n + 1, i):\n            is_prime[j] = False\nfor i in range(2, n + 1):\n    if is_prime[i]: primes.append(i)\n",[17,15713,15714,15719,15724,15729,15733,15738,15743,15748,15753,15758],{"__ignoreMap":119},[78,15715,15716],{"class":124,"line":125},[78,15717,15718],{},"primes = []\n",[78,15720,15721],{"class":124,"line":132},[78,15722,15723],{},"is_prime = [True] * (n + 1)\n",[78,15725,15726],{"class":124,"line":138},[78,15727,15728],{},"is_prime[1] = is_prime[0] = False\n",[78,15730,15731],{"class":124,"line":144},[78,15732,129],{"emptyLinePlaceholder":128},[78,15734,15735],{"class":124,"line":150},[78,15736,15737],{},"for i in range(2, int(math.sqrt(n)) + 1):  # i * i \u003C= n\n",[78,15739,15740],{"class":124,"line":156},[78,15741,15742],{},"    if is_prime[i]:\n",[78,15744,15745],{"class":124,"line":162},[78,15746,15747],{},"        for j in range(i * i, n + 1, i):\n",[78,15749,15750],{"class":124,"line":168},[78,15751,15752],{},"            is_prime[j] = False\n",[78,15754,15755],{"class":124,"line":174},[78,15756,15757],{},"for i in range(2, n + 1):\n",[78,15759,15760],{"class":124,"line":180},[78,15761,15762],{},"    if is_prime[i]: primes.append(i)\n",[7759,15764,15765],{"id":15765},"逆波兰表达式",[114,15767,15769],{"className":116,"code":15768,"language":118,"meta":119,"style":119},"def eval_rpn(tokens: list[str]):\n    stack = []\n    ops = {\n        '+': lambda a, b: a + b,\n        '-': lambda a, b: a - b,\n        '*': lambda a, b: a * b,\n        '\u002F': lambda a, b: int(a \u002F b),  # 向零取整（python默认向下取整）\n    }\n    \n    for t in tokens:\n        if t in ops:\n            b = stack.pop()\n            a = stack.pop()\n            stack.append(ops[t](a, b))  # a 在前，b 在后\n        else:\n            stack.append(int(t))\n    return stack[0]\n",[17,15770,15771,15776,15781,15786,15791,15796,15801,15806,15811,15815,15820,15825,15830,15835,15840,15845,15850],{"__ignoreMap":119},[78,15772,15773],{"class":124,"line":125},[78,15774,15775],{},"def eval_rpn(tokens: list[str]):\n",[78,15777,15778],{"class":124,"line":132},[78,15779,15780],{},"    stack = []\n",[78,15782,15783],{"class":124,"line":138},[78,15784,15785],{},"    ops = {\n",[78,15787,15788],{"class":124,"line":144},[78,15789,15790],{},"        '+': lambda a, b: a + b,\n",[78,15792,15793],{"class":124,"line":150},[78,15794,15795],{},"        '-': lambda a, b: a - b,\n",[78,15797,15798],{"class":124,"line":156},[78,15799,15800],{},"        '*': lambda a, b: a * b,\n",[78,15802,15803],{"class":124,"line":162},[78,15804,15805],{},"        '\u002F': lambda a, b: int(a \u002F b),  # 向零取整（python默认向下取整）\n",[78,15807,15808],{"class":124,"line":168},[78,15809,15810],{},"    }\n",[78,15812,15813],{"class":124,"line":174},[78,15814,6942],{},[78,15816,15817],{"class":124,"line":180},[78,15818,15819],{},"    for t in tokens:\n",[78,15821,15822],{"class":124,"line":186},[78,15823,15824],{},"        if t in ops:\n",[78,15826,15827],{"class":124,"line":192},[78,15828,15829],{},"            b = stack.pop()\n",[78,15831,15832],{"class":124,"line":198},[78,15833,15834],{},"            a = stack.pop()\n",[78,15836,15837],{"class":124,"line":204},[78,15838,15839],{},"            stack.append(ops[t](a, b))  # a 在前，b 在后\n",[78,15841,15842],{"class":124,"line":210},[78,15843,15844],{},"        else:\n",[78,15846,15847],{"class":124,"line":216},[78,15848,15849],{},"            stack.append(int(t))\n",[78,15851,15852],{"class":124,"line":222},[78,15853,15854],{},"    return stack[0]\n",[7759,15856,15857],{"id":15857},"根据身高重建队列",[114,15859,15861],{"className":116,"code":15860,"language":118,"meta":119,"style":119},"def reconstructQueue(self, people: List[List[int]]):\n    # [7, 0],[4, 4],[7, 1],[5, 0],[6, 1],[5, 2]\n    people.sort(key=lambda x: (-x[0], x[1]))  # 按照x[0]降序、x[1]升序排列\n    # [7, 0],[7, 1],[6, 1],[5, 0],[5, 2],[4, 4]\n    \n    res = []\n    for i, p in enumerate(people):\n        h, k = p[0], p[1]\n        if k == i:\n            res.append(p)\n        elif k \u003C i:\n            res.insert(k, p)\n    # [7, 0],[6, 1],[7, 1],[5, 0],[5, 2],[4, 4]\n    return res\n",[17,15862,15863,15868,15873,15878,15883,15887,15892,15897,15902,15907,15912,15917,15922,15927],{"__ignoreMap":119},[78,15864,15865],{"class":124,"line":125},[78,15866,15867],{},"def reconstructQueue(self, people: List[List[int]]):\n",[78,15869,15870],{"class":124,"line":132},[78,15871,15872],{},"    # [7, 0],[4, 4],[7, 1],[5, 0],[6, 1],[5, 2]\n",[78,15874,15875],{"class":124,"line":138},[78,15876,15877],{},"    people.sort(key=lambda x: (-x[0], x[1]))  # 按照x[0]降序、x[1]升序排列\n",[78,15879,15880],{"class":124,"line":144},[78,15881,15882],{},"    # [7, 0],[7, 1],[6, 1],[5, 0],[5, 2],[4, 4]\n",[78,15884,15885],{"class":124,"line":150},[78,15886,6942],{},[78,15888,15889],{"class":124,"line":156},[78,15890,15891],{},"    res = []\n",[78,15893,15894],{"class":124,"line":162},[78,15895,15896],{},"    for i, p in enumerate(people):\n",[78,15898,15899],{"class":124,"line":168},[78,15900,15901],{},"        h, k = p[0], p[1]\n",[78,15903,15904],{"class":124,"line":174},[78,15905,15906],{},"        if k == i:\n",[78,15908,15909],{"class":124,"line":180},[78,15910,15911],{},"            res.append(p)\n",[78,15913,15914],{"class":124,"line":186},[78,15915,15916],{},"        elif k \u003C i:\n",[78,15918,15919],{"class":124,"line":192},[78,15920,15921],{},"            res.insert(k, p)\n",[78,15923,15924],{"class":124,"line":198},[78,15925,15926],{},"    # [7, 0],[6, 1],[7, 1],[5, 0],[5, 2],[4, 4]\n",[78,15928,15929],{"class":124,"line":204},[78,15930,15931],{},"    return res\n",[226,15933,228],{},{"title":119,"searchDepth":144,"depth":144,"links":15935},[15936,15941,15950,15954],{"id":14977,"depth":132,"text":14977,"children":15937},[15938,15939,15940],{"id":14980,"depth":144,"text":14980},{"id":14998,"depth":144,"text":14999},{"id":15058,"depth":144,"text":15058},{"id":15114,"depth":132,"text":15114,"children":15942},[15943,15944,15945,15946,15947,15948,15949],{"id":15117,"depth":144,"text":15117},{"id":15220,"depth":144,"text":15221},{"id":450,"depth":144,"text":450},{"id":15286,"depth":144,"text":15287},{"id":15344,"depth":144,"text":15345},{"id":15403,"depth":144,"text":15403},{"id":15427,"depth":144,"text":15428},{"id":15516,"depth":132,"text":15516,"children":15951},[15952,15953],{"id":15519,"depth":144,"text":15520},{"id":15594,"depth":144,"text":15594},{"id":15701,"depth":132,"text":15701,"children":15955},[15956,15957,15958],{"id":15704,"depth":144,"text":15705},{"id":15765,"depth":144,"text":15765},{"id":15857,"depth":144,"text":15857},"2026-03-15",{},"\u002Flegacy-blog\u002F1773559659588",{"title":14972,"description":119},"legacy-blog\u002F1773559659588",[246],"k6PzWuf3JL_iUeGpDFIlDuMEPLfrHizE5K05b-jvRRo",{"id":15967,"title":15968,"assetBase":7,"author":8,"body":15969,"category":16218,"collection":233,"date":16219,"description":16220,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":16221,"navigation":128,"originalPath":239,"path":16222,"seo":16223,"source":243,"stem":16224,"tags":16225,"weight":250,"__hash__":16228},"content\u002Flegacy-blog\u002F1773818821956.md","872. 叶子相似的树",{"type":10,"value":15970,"toc":16215},[15971,15977,15982,16005,16009,16014,16029,16033,16038,16048,16052,16067,16069,16071,16213],[13,15972,15973,15974,285],{},"请考虑一棵二叉树上所有的叶子，这些叶子的值按从左到右的顺序排列形成一个 ",[22,15975,15976],{},"叶值序列",[13,15978,15979],{},[617,15980],{"alt":619,"src":15981},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177381891750140.png",[13,15983,15984,15985,15988,15989,15992,15993,1018,15996,15999,16000,16002,16003,285],{},"举个例子，如上图所示，给定一棵叶值序列为 ",[17,15986,15987],{},"(6, 7, 4, 9, 8)"," 的树。\n如果有两棵二叉树的叶值序列是相同，那么我们就认为它们是 ",[596,15990,15991],{},"叶相似"," 的。\n如果给定的两个根结点分别为 ",[17,15994,15995],{},"root1",[17,15997,15998],{},"root2"," 的树是叶相似的，则返回 ",[17,16001,1419],{},"；否则返回 ",[17,16004,4593],{},[13,16006,16007],{},[22,16008,293],{},[13,16010,16011],{},[617,16012],{"alt":619,"src":16013},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177381892329813.jpeg",[13,16015,16016,16018,16019,16022,16023,16026,16028],{},[22,16017,1040],{}," root1 = ",[78,16020,16021],{},"3,5,1,6,2,9,8,null,null,7,4",", root2 = ",[78,16024,16025],{},"3,5,1,6,7,4,2,null,null,null,null,null,null,9,8",[22,16027,1047],{}," true",[13,16030,16031],{},[22,16032,306],{},[13,16034,16035],{},[617,16036],{"alt":619,"src":16037},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177381892981710.jpeg",[13,16039,16040,16018,16042,16022,16044,16046,1481],{},[22,16041,1040],{},[78,16043,4074],{},[78,16045,4079],{},[22,16047,1047],{},[13,16049,16050],{},[22,16051,317],{},[49,16053,16054,16061],{},[52,16055,16056,16057,16060],{},"给定的两棵树结点数在 ",[17,16058,16059],{},"[1, 200]"," 范围内",[52,16062,16063,16064,16060],{},"给定的两棵树上的值在 ",[17,16065,16066],{},"[0, 200]",[107,16068,109],{"id":109},[13,16070,112],{},[114,16072,16074],{"className":116,"code":16073,"language":118,"meta":119,"style":119},"\n# Definition for a binary tree node.\n# class TreeNode(object):\n#     def __init__(self, val=0, left=None, right=None):\n#         self.val = val\n#         self.left = left\n#         self.right = right\nclass Solution(object):\n    def leafSimilar(self, root1, root2):\n        def get_leaf_sequence(root, sequence):\n            if not root:\n                return \n            if not root.left and not root.right:  # 是叶子节点\n                sequence.append(root.val)\n                return\n            get_leaf_sequence(root.left, sequence)\n            get_leaf_sequence(root.right, sequence)\n        \n        seq1 = []\n        get_leaf_sequence(root1, seq1)\n        seq2 = []\n        get_leaf_sequence(root2, seq2)\n\n        return seq1 == seq2\n        \"\"\"\n        :type root1: Optional[TreeNode]\n        :type root2: Optional[TreeNode]\n        :rtype: bool\n        \"\"\"\n\n",[17,16075,16076,16080,16085,16090,16095,16099,16104,16109,16113,16118,16123,16128,16133,16138,16143,16148,16153,16158,16162,16167,16172,16177,16182,16186,16191,16195,16200,16205,16209],{"__ignoreMap":119},[78,16077,16078],{"class":124,"line":125},[78,16079,129],{"emptyLinePlaceholder":128},[78,16081,16082],{"class":124,"line":132},[78,16083,16084],{},"# Definition for a binary tree node.\n",[78,16086,16087],{"class":124,"line":138},[78,16088,16089],{},"# class TreeNode(object):\n",[78,16091,16092],{"class":124,"line":144},[78,16093,16094],{},"#     def __init__(self, val=0, left=None, right=None):\n",[78,16096,16097],{"class":124,"line":150},[78,16098,13255],{},[78,16100,16101],{"class":124,"line":156},[78,16102,16103],{},"#         self.left = left\n",[78,16105,16106],{"class":124,"line":162},[78,16107,16108],{},"#         self.right = right\n",[78,16110,16111],{"class":124,"line":168},[78,16112,135],{},[78,16114,16115],{"class":124,"line":174},[78,16116,16117],{},"    def leafSimilar(self, root1, root2):\n",[78,16119,16120],{"class":124,"line":180},[78,16121,16122],{},"        def get_leaf_sequence(root, sequence):\n",[78,16124,16125],{"class":124,"line":186},[78,16126,16127],{},"            if not root:\n",[78,16129,16130],{"class":124,"line":192},[78,16131,16132],{},"                return \n",[78,16134,16135],{"class":124,"line":198},[78,16136,16137],{},"            if not root.left and not root.right:  # 是叶子节点\n",[78,16139,16140],{"class":124,"line":204},[78,16141,16142],{},"                sequence.append(root.val)\n",[78,16144,16145],{"class":124,"line":210},[78,16146,16147],{},"                return\n",[78,16149,16150],{"class":124,"line":216},[78,16151,16152],{},"            get_leaf_sequence(root.left, sequence)\n",[78,16154,16155],{"class":124,"line":222},[78,16156,16157],{},"            get_leaf_sequence(root.right, sequence)\n",[78,16159,16160],{"class":124,"line":421},[78,16161,1359],{},[78,16163,16164],{"class":124,"line":427},[78,16165,16166],{},"        seq1 = []\n",[78,16168,16169],{"class":124,"line":433},[78,16170,16171],{},"        get_leaf_sequence(root1, seq1)\n",[78,16173,16174],{"class":124,"line":2443},[78,16175,16176],{},"        seq2 = []\n",[78,16178,16179],{"class":124,"line":2448},[78,16180,16181],{},"        get_leaf_sequence(root2, seq2)\n",[78,16183,16184],{"class":124,"line":2454},[78,16185,129],{"emptyLinePlaceholder":128},[78,16187,16188],{"class":124,"line":2460},[78,16189,16190],{},"        return seq1 == seq2\n",[78,16192,16193],{"class":124,"line":2465},[78,16194,207],{},[78,16196,16197],{"class":124,"line":2470},[78,16198,16199],{},"        :type root1: Optional[TreeNode]\n",[78,16201,16202],{"class":124,"line":2903},[78,16203,16204],{},"        :type root2: Optional[TreeNode]\n",[78,16206,16207],{"class":124,"line":2909},[78,16208,1592],{},[78,16210,16211],{"class":124,"line":11477},[78,16212,207],{},[226,16214,228],{},{"title":119,"searchDepth":144,"depth":144,"links":16216},[16217],{"id":109,"depth":132,"text":109},"树 深度优先搜索","2026-03-18","请考虑一棵二叉树上所有的叶子，这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。",{},"\u002Flegacy-blog\u002F1773818821956",{"title":15968,"description":16220},"legacy-blog\u002F1773818821956",[246,16226,16227],"树","深度优先搜索","Oojxl6BTkUF67AUILR0NIe0FI0snVOzHoFyKW1dxylk",{"id":16230,"title":16231,"assetBase":7,"author":8,"body":16232,"category":16218,"collection":233,"date":16219,"description":16459,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":16460,"navigation":128,"originalPath":239,"path":16461,"seo":16462,"source":243,"stem":16463,"tags":16464,"weight":250,"__hash__":16465},"content\u002Flegacy-blog\u002F1773820318321.md","437. 路径总和 III",{"type":10,"value":16233,"toc":16456},[16234,16254,16258,16263,16279,16283,16295,16299,16317,16319,16321,16454],[13,16235,16236,16237,16240,16241,16244,16245,20,16247,16250,16251,16253],{},"给定一个二叉树的根节点 ",[17,16238,16239],{},"root"," ，和一个整数 ",[17,16242,16243],{},"targetSum"," ，求该二叉树里节点值之和等于 ",[17,16246,16243],{},[22,16248,16249],{},"路径"," 的数目。\n",[22,16252,16249],{}," 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。",[13,16255,16256],{},[22,16257,293],{},[13,16259,16260],{},[617,16261],{"alt":619,"src":16262},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177382032998299.jpeg",[72,16264,16265],{},[13,16266,16267,16269,16270,16273,16274,1048,16276,16278],{},[22,16268,1040],{}," root = ",[78,16271,16272],{},"10,5,-3,3,2,null,11,3,-2,null,1",", targetSum = 8\n",[22,16275,1047],{},[22,16277,1051],{}," 和等于 8 的路径有 3 条，如图所示。",[13,16280,16281],{},[22,16282,306],{},[72,16284,16285],{},[13,16286,16287,16269,16289,16292,16293,2994],{},[22,16288,1040],{},[78,16290,16291],{},"5,4,8,11,null,13,4,7,2,null,null,5,1",", targetSum = 22\n",[22,16294,1047],{},[13,16296,16297],{},[22,16298,88],{},[49,16300,16301,16307,16312],{},[52,16302,16303,16304],{},"二叉树的节点个数的范围是 ",[17,16305,16306],{},"[0,1000]",[52,16308,16309],{},[17,16310,16311],{},"-109 \u003C= Node.val \u003C= 109",[52,16313,16314],{},[17,16315,16316],{},"-1000 \u003C= targetSum \u003C= 1000",[107,16318,109],{"id":109},[13,16320,112],{},[114,16322,16324],{"className":116,"code":16323,"language":118,"meta":119,"style":119},"\n# Definition for a binary tree node.\n# class TreeNode(object):\n#     def __init__(self, val=0, left=None, right=None):\n#         self.val = val\n#         self.left = left\n#         self.right = right\nclass Solution(object):\n    def pathSum(self, root, targetSum):\n        if not root:\n            return 0\n        def dfs(node, current_sum):\n            if not node:\n                return 0\n            current_sum += node.val  # 累加当前节点到路径和\n            count = 1 if current_sum == targetSum else 0\n            count += dfs(node.left, current_sum)\n            count += dfs(node.right, current_sum)\n            return count\n        total = dfs(root, 0)  # 以当前节点出发+左与右\n        total += self.pathSum(root.left, targetSum)  # 左子树为起点\n        total += self.pathSum(root.right, targetSum)  # 右子树为起点\n        return total\n        \"\"\"\n        :type root: Optional[TreeNode]\n        :type targetSum: int\n        :rtype: int\n        \"\"\"\n\n",[17,16325,16326,16330,16334,16338,16342,16346,16350,16354,16358,16363,16368,16372,16377,16382,16387,16392,16397,16402,16407,16412,16417,16422,16427,16432,16436,16441,16446,16450],{"__ignoreMap":119},[78,16327,16328],{"class":124,"line":125},[78,16329,129],{"emptyLinePlaceholder":128},[78,16331,16332],{"class":124,"line":132},[78,16333,16084],{},[78,16335,16336],{"class":124,"line":138},[78,16337,16089],{},[78,16339,16340],{"class":124,"line":144},[78,16341,16094],{},[78,16343,16344],{"class":124,"line":150},[78,16345,13255],{},[78,16347,16348],{"class":124,"line":156},[78,16349,16103],{},[78,16351,16352],{"class":124,"line":162},[78,16353,16108],{},[78,16355,16356],{"class":124,"line":168},[78,16357,135],{},[78,16359,16360],{"class":124,"line":174},[78,16361,16362],{},"    def pathSum(self, root, targetSum):\n",[78,16364,16365],{"class":124,"line":180},[78,16366,16367],{},"        if not root:\n",[78,16369,16370],{"class":124,"line":186},[78,16371,911],{},[78,16373,16374],{"class":124,"line":192},[78,16375,16376],{},"        def dfs(node, current_sum):\n",[78,16378,16379],{"class":124,"line":198},[78,16380,16381],{},"            if not node:\n",[78,16383,16384],{"class":124,"line":204},[78,16385,16386],{},"                return 0\n",[78,16388,16389],{"class":124,"line":210},[78,16390,16391],{},"            current_sum += node.val  # 累加当前节点到路径和\n",[78,16393,16394],{"class":124,"line":216},[78,16395,16396],{},"            count = 1 if current_sum == targetSum else 0\n",[78,16398,16399],{"class":124,"line":222},[78,16400,16401],{},"            count += dfs(node.left, current_sum)\n",[78,16403,16404],{"class":124,"line":421},[78,16405,16406],{},"            count += dfs(node.right, current_sum)\n",[78,16408,16409],{"class":124,"line":427},[78,16410,16411],{},"            return count\n",[78,16413,16414],{"class":124,"line":433},[78,16415,16416],{},"        total = dfs(root, 0)  # 以当前节点出发+左与右\n",[78,16418,16419],{"class":124,"line":2443},[78,16420,16421],{},"        total += self.pathSum(root.left, targetSum)  # 左子树为起点\n",[78,16423,16424],{"class":124,"line":2448},[78,16425,16426],{},"        total += self.pathSum(root.right, targetSum)  # 右子树为起点\n",[78,16428,16429],{"class":124,"line":2454},[78,16430,16431],{},"        return total\n",[78,16433,16434],{"class":124,"line":2460},[78,16435,207],{},[78,16437,16438],{"class":124,"line":2465},[78,16439,16440],{},"        :type root: Optional[TreeNode]\n",[78,16442,16443],{"class":124,"line":2470},[78,16444,16445],{},"        :type targetSum: int\n",[78,16447,16448],{"class":124,"line":2903},[78,16449,219],{},[78,16451,16452],{"class":124,"line":2909},[78,16453,207],{},[226,16455,228],{},{"title":119,"searchDepth":144,"depth":144,"links":16457},[16458],{"id":109,"depth":132,"text":109},"给定一个二叉树的根节点 root ，和一个整数 targetSum ，求该二叉树里节点值之和等于 targetSum 的 路径 的数目。\n路径 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。",{},"\u002Flegacy-blog\u002F1773820318321",{"title":16231,"description":16459},"legacy-blog\u002F1773820318321",[246,16226,16227],"HlntXfOj91-AgK6jGgE0orwY8uufpnA9g7DpJO50pQ4",{"id":16467,"title":16468,"assetBase":7,"author":8,"body":16469,"category":16735,"collection":233,"date":16219,"description":16736,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":16737,"navigation":128,"originalPath":239,"path":16738,"seo":16739,"source":243,"stem":16740,"tags":16741,"weight":250,"__hash__":16742},"content\u002Flegacy-blog\u002F1773821340007.md","1372. 二叉树中的最长交错路径",{"type":10,"value":16470,"toc":16732},[16471,16477,16495,16506,16510,16515,16529,16533,16538,16552,16556,16566,16570,16586,16588,16590,16730],[13,16472,16473,16474,16476],{},"给你一棵以 ",[17,16475,16239],{}," 为根的二叉树，二叉树中的交错路径定义如下：",[49,16478,16479,16486,16489,16492],{},[52,16480,16481,16482,16485],{},"选择二叉树中",[22,16483,16484],{},"任意"," 节点和一个方向（左或者右）。",[52,16487,16488],{},"如果前进方向为右，那么移动到当前节点的的右子节点，否则移动到它的左子节点。",[52,16490,16491],{},"改变前进方向：左变右或者右变左。",[52,16493,16494],{},"重复第二步和第三步，直到你在树中无法继续移动。",[13,16496,16497,16498,16501,16502,16505],{},"交错路径的长度定义为：",[22,16499,16500],{},"访问过的节点数目 - 1","（单个节点的路径长度为 0 ）。\n请你返回给定树中最长 ",[22,16503,16504],{},"交错路径"," 的长度。",[13,16507,16508],{},[22,16509,293],{},[13,16511,16512],{},[617,16513],{"alt":619,"src":16514},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177382139898947.png",[72,16516,16517],{},[13,16518,16519,16269,16521,16524,1048,16526,16528],{},[22,16520,1040],{},[78,16522,16523],{},"1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1",[22,16525,1047],{},[22,16527,1051],{}," 蓝色节点为树中最长交错路径（右 -> 左 -> 右）。",[13,16530,16531],{},[22,16532,306],{},[13,16534,16535],{},[617,16536],{"alt":619,"src":16537},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177382140394655.png",[72,16539,16540],{},[13,16541,16542,16269,16544,16547,1651,16549,16551],{},[22,16543,1040],{},[78,16545,16546],{},"1,1,1,null,1,null,null,1,1,null,1",[22,16548,1047],{},[22,16550,1051],{}," 蓝色节点为树中最长交错路径（左 -> 右 -> 左 -> 右）。",[13,16553,16554],{},[22,16555,1265],{},[72,16557,16558],{},[13,16559,16560,16269,16562,16564,1277],{},[22,16561,1040],{},[78,16563,469],{},[22,16565,1047],{},[13,16567,16568],{},[22,16569,317],{},[49,16571,16572,16579],{},[52,16573,16574,16575,16578],{},"每棵树最多有 ",[17,16576,16577],{},"50000"," 个节点。",[52,16580,16581,16582,16585],{},"每个节点的值在 ",[17,16583,16584],{},"[1, 100]"," 之间。",[107,16587,109],{"id":109},[13,16589,112],{},[114,16591,16593],{"className":116,"code":16592,"language":118,"meta":119,"style":119},"\n# Definition for a binary tree node.\n# class TreeNode(object):\n#     def __init__(self, val=0, left=None, right=None):\n#         self.val = val\n#         self.left = left\n#         self.right = right\nclass Solution(object):\n    def longestZigZag(self, root):\n        self.max_len = 0\n        def dfs(node):\n            if not node:\n                return (-1, -1)\n            # 递归获取左右子树的结果\n            _, left_right = dfs(node.left)\n            right_left, _ = dfs(node.right)\n            # 当前节点向左：依赖左子节点的向右长度 + 1\n            curr_left = left_right + 1\n            # 当前节点向右：依赖右子节点的向左长度 + 1\n            curr_right = right_left + 1\n            \n            self.max_len = max(self.max_len, curr_left, curr_right)\n            return (curr_left, curr_right)\n        \n        dfs(root)\n        return self.max_len\n        \"\"\"\n        :type root: Optional[TreeNode]\n        :rtype: int\n        \"\"\"\n\n",[17,16594,16595,16599,16603,16607,16611,16615,16619,16623,16627,16632,16637,16642,16646,16651,16656,16661,16666,16671,16676,16681,16686,16690,16695,16700,16704,16709,16714,16718,16722,16726],{"__ignoreMap":119},[78,16596,16597],{"class":124,"line":125},[78,16598,129],{"emptyLinePlaceholder":128},[78,16600,16601],{"class":124,"line":132},[78,16602,16084],{},[78,16604,16605],{"class":124,"line":138},[78,16606,16089],{},[78,16608,16609],{"class":124,"line":144},[78,16610,16094],{},[78,16612,16613],{"class":124,"line":150},[78,16614,13255],{},[78,16616,16617],{"class":124,"line":156},[78,16618,16103],{},[78,16620,16621],{"class":124,"line":162},[78,16622,16108],{},[78,16624,16625],{"class":124,"line":168},[78,16626,135],{},[78,16628,16629],{"class":124,"line":174},[78,16630,16631],{},"    def longestZigZag(self, root):\n",[78,16633,16634],{"class":124,"line":180},[78,16635,16636],{},"        self.max_len = 0\n",[78,16638,16639],{"class":124,"line":186},[78,16640,16641],{},"        def dfs(node):\n",[78,16643,16644],{"class":124,"line":192},[78,16645,16381],{},[78,16647,16648],{"class":124,"line":198},[78,16649,16650],{},"                return (-1, -1)\n",[78,16652,16653],{"class":124,"line":204},[78,16654,16655],{},"            # 递归获取左右子树的结果\n",[78,16657,16658],{"class":124,"line":210},[78,16659,16660],{},"            _, left_right = dfs(node.left)\n",[78,16662,16663],{"class":124,"line":216},[78,16664,16665],{},"            right_left, _ = dfs(node.right)\n",[78,16667,16668],{"class":124,"line":222},[78,16669,16670],{},"            # 当前节点向左：依赖左子节点的向右长度 + 1\n",[78,16672,16673],{"class":124,"line":421},[78,16674,16675],{},"            curr_left = left_right + 1\n",[78,16677,16678],{"class":124,"line":427},[78,16679,16680],{},"            # 当前节点向右：依赖右子节点的向左长度 + 1\n",[78,16682,16683],{"class":124,"line":433},[78,16684,16685],{},"            curr_right = right_left + 1\n",[78,16687,16688],{"class":124,"line":2443},[78,16689,10916],{},[78,16691,16692],{"class":124,"line":2448},[78,16693,16694],{},"            self.max_len = max(self.max_len, curr_left, curr_right)\n",[78,16696,16697],{"class":124,"line":2454},[78,16698,16699],{},"            return (curr_left, curr_right)\n",[78,16701,16702],{"class":124,"line":2460},[78,16703,1359],{},[78,16705,16706],{"class":124,"line":2465},[78,16707,16708],{},"        dfs(root)\n",[78,16710,16711],{"class":124,"line":2470},[78,16712,16713],{},"        return self.max_len\n",[78,16715,16716],{"class":124,"line":2903},[78,16717,207],{},[78,16719,16720],{"class":124,"line":2909},[78,16721,16440],{},[78,16723,16724],{"class":124,"line":11477},[78,16725,219],{},[78,16727,16728],{"class":124,"line":13374},[78,16729,207],{},[226,16731,228],{},{"title":119,"searchDepth":144,"depth":144,"links":16733},[16734],{"id":109,"depth":132,"text":109},"树 深度优先搜索 动态规划","给你一棵以 root 为根的二叉树，二叉树中的交错路径定义如下：",{},"\u002Flegacy-blog\u002F1773821340007",{"title":16468,"description":16736},"legacy-blog\u002F1773821340007",[246,16226,16227,249],"IeUWp2cMvAUUkbEYtX2iRX8RLEEbGmI_miW-hG47v0Y",{"id":16744,"title":16745,"assetBase":239,"author":8,"body":16746,"category":787,"collection":233,"date":20885,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":20886,"navigation":128,"originalPath":239,"path":20887,"seo":20888,"source":243,"stem":20889,"tags":20890,"weight":250,"__hash__":20891},"content\u002Flegacy-blog\u002F1773927948738.md","从零构建向量数据库",{"type":10,"value":16747,"toc":20874},[16748,16750,16754,16757,17063,17066,17069,17080,17083,17086,17089,17386,17828,17990,17993,18000,18160,18630,19091,19094,19217,19220,19227,19911,20604,20607,20611,20614,20628,20631,20642,20645,20649,20652,20655,20658,20664,20667,20675,20825,20833,20836,20847,20850,20853,20856,20859,20862,20865,20868,20871],[4517,16749,16745],{"id":16745},[107,16751,16753],{"id":16752},"第-1-章","第 1 章",[7759,16755,16756],{"id":16756},"向量",[13,16758,16759,16760,16811,16812,16842,16843,10730,16918,1018,16946,16975,16976,17004,17005,17033,17034,17062],{},"在数学中，向量通常用黑斜体字母表示，如",[78,16761,16763,16785],{"className":16762},[4570],[78,16764,16766],{"className":16765},[4574],[4576,16767,16768],{"xmlns":4578},[4581,16769,16770,16782],{},[4584,16771,16772,16774,16776,16778,16780],{},[4596,16773,5009],{},[4587,16775,1011],{},[4596,16777,12172],{},[4587,16779,1011],{},[4596,16781,7360],{},[4647,16783,16784],{"encoding":4649},"\\mathbf{\\mathit{a}}、\\mathit{b}、\\mathit{c}",[78,16786,16788],{"className":16787,"ariaHidden":1419},[4654],[78,16789,16791,16795,16799,16802,16805,16808],{"className":16790},[4658],[78,16792],{"className":16793,"style":16794},[4662],"height:0.6944em;",[78,16796,5009],{"className":16797},[4667,16798],"mathit",[78,16800,1011],{"className":16801},[4667,6184],[78,16803,12172],{"className":16804},[4667,16798],[78,16806,1011],{"className":16807},[4667,6184],[78,16809,7360],{"className":16810},[4667,16798]," 等。向量也可以用二维坐标表示，例如二维平面上的向量 ",[78,16813,16815,16829],{"className":16814},[4570],[78,16816,16818],{"className":16817},[4574],[4576,16819,16820],{"xmlns":4578},[4581,16821,16822,16826],{},[4584,16823,16824],{},[4596,16825,5009],{},[4647,16827,16828],{"encoding":4649},"\\mathbf{\\mathit{a}}",[78,16830,16832],{"className":16831,"ariaHidden":1419},[4654],[78,16833,16835,16839],{"className":16834},[4658],[78,16836],{"className":16837,"style":16838},[4662],"height:0.4306em;",[78,16840,5009],{"className":16841},[4667,16798]," 可以表示为 ",[78,16844,16846,16873],{"className":16845},[4570],[78,16847,16849],{"className":16848},[4574],[4576,16850,16851],{"xmlns":4578},[4581,16852,16853,16870],{},[4584,16854,16855,16857,16859,16861,16863,16865,16868],{},[4596,16856,5009],{},[4591,16858,4609],{},[4591,16860,4594],{"stretchy":4593},[4596,16862,4598],{},[4591,16864,2066],{"separator":1419},[4596,16866,16867],{},"y",[4591,16869,4604],{"stretchy":4593},[4647,16871,16872],{"encoding":4649},"a=(x,y)",[78,16874,16876,16894],{"className":16875,"ariaHidden":1419},[4654],[78,16877,16879,16882,16885,16888,16891],{"className":16878},[4658],[78,16880],{"className":16881,"style":16838},[4662],[78,16883,5009],{"className":16884},[4667,4678],[78,16886],{"className":16887,"style":4740},[4739],[78,16889,4609],{"className":16890},[4744],[78,16892],{"className":16893,"style":4740},[4739],[78,16895,16897,16900,16903,16906,16909,16912,16915],{"className":16896},[4658],[78,16898],{"className":16899,"style":4663},[4662],[78,16901,4594],{"className":16902},[4674],[78,16904,4598],{"className":16905},[4667,4678],[78,16907,2066],{"className":16908},[5126],[78,16910],{"className":16911,"style":4839},[4739],[78,16913,16867],{"className":16914,"style":5187},[4667,4678],[78,16916,4604],{"className":16917},[4682],[78,16919,16921,16934],{"className":16920},[4570],[78,16922,16924],{"className":16923},[4574],[4576,16925,16926],{"xmlns":4578},[4581,16927,16928,16932],{},[4584,16929,16930],{},[4596,16931,4598],{},[4647,16933,4598],{"encoding":4649},[78,16935,16937],{"className":16936,"ariaHidden":1419},[4654],[78,16938,16940,16943],{"className":16939},[4658],[78,16941],{"className":16942,"style":16838},[4662],[78,16944,4598],{"className":16945},[4667,4678],[78,16947,16949,16962],{"className":16948},[4570],[78,16950,16952],{"className":16951},[4574],[4576,16953,16954],{"xmlns":4578},[4581,16955,16956,16960],{},[4584,16957,16958],{},[4596,16959,16867],{},[4647,16961,16867],{"encoding":4649},[78,16963,16965],{"className":16964,"ariaHidden":1419},[4654],[78,16966,16968,16972],{"className":16967},[4658],[78,16969],{"className":16970,"style":16971},[4662],"height:0.625em;vertical-align:-0.1944em;",[78,16973,16867],{"className":16974,"style":5187},[4667,4678]," 分别表示 ",[78,16977,16979,16992],{"className":16978},[4570],[78,16980,16982],{"className":16981},[4574],[4576,16983,16984],{"xmlns":4578},[4581,16985,16986,16990],{},[4584,16987,16988],{},[4596,16989,5009],{},[4647,16991,16828],{"encoding":4649},[78,16993,16995],{"className":16994,"ariaHidden":1419},[4654],[78,16996,16998,17001],{"className":16997},[4658],[78,16999],{"className":17000,"style":16838},[4662],[78,17002,5009],{"className":17003},[4667,16798]," 在 ",[78,17006,17008,17021],{"className":17007},[4570],[78,17009,17011],{"className":17010},[4574],[4576,17012,17013],{"xmlns":4578},[4581,17014,17015,17019],{},[4584,17016,17017],{},[4596,17018,4598],{},[4647,17020,4598],{"encoding":4649},[78,17022,17024],{"className":17023,"ariaHidden":1419},[4654],[78,17025,17027,17030],{"className":17026},[4658],[78,17028],{"className":17029,"style":16838},[4662],[78,17031,4598],{"className":17032},[4667,4678]," 轴和 ",[78,17035,17037,17050],{"className":17036},[4570],[78,17038,17040],{"className":17039},[4574],[4576,17041,17042],{"xmlns":4578},[4581,17043,17044,17048],{},[4584,17045,17046],{},[4596,17047,16867],{},[4647,17049,16867],{"encoding":4649},[78,17051,17053],{"className":17052,"ariaHidden":1419},[4654],[78,17054,17056,17059],{"className":17055},[4658],[78,17057],{"className":17058,"style":16971},[4662],[78,17060,16867],{"className":17061,"style":5187},[4667,4678]," 轴上的分量。扩展到更高维度也是适用的。",[13,17064,17065],{},"在几何意义上，两个向量的和向量是一个向量的首与另一个向量的尾组成的向量；与当前向量大小相等、方向相反的向量，我们称之为当前向量的负向量，两个向量的差向量可以转化为一个向量与另一个负向量的和。",[10548,17067,17068],{"id":17068},"向量和标量的差异",[49,17070,17071,17074,17077],{},[52,17072,17073],{},"向量具有方向和大小，而标量只有大小；",[52,17075,17076],{},"向量可以用坐标表示，而标量通常用普通的数值表示；",[52,17078,17079],{},"向量可以进行加、减和数乘等运算，而标量可以进行加、减、乘、除等运算。",[7759,17081,17082],{"id":17082},"向量间的相似度",[10548,17084,17085],{"id":17085},"余弦相似度",[13,17087,17088],{},"余弦相似度（Cosine Similarity）是一种常用的向量相似度度量方法，用于衡量两个向量之间的相似度。它通过计算两个向量夹角的余弦值来评估它们的相似程度。\n余弦相似度的公式如下：",[78,17090,17092],{"className":17091},[4566],[78,17093,17095,17183],{"className":17094},[4570],[78,17096,17098],{"className":17097},[4574],[4576,17099,17100],{"xmlns":4578,"display":4579},[4581,17101,17102,17180],{},[4584,17103,17104,17106,17108,17110,17112,17114,17120,17122,17124,17126,17128,17130,17133,17135,17137,17139,17141,17144,17146,17149,17151,17153],{},[4596,17105,7360],{},[4596,17107,5025],{},[4596,17109,262],{},[4596,17111,39],{},[4596,17113,19],{},[4600,17115,17116,17118],{},[4596,17117,4618],{},[4596,17119,262],{},[4596,17121,39],{},[4596,17123,5058],{},[4596,17125,39],{},[4596,17127,7132],{},[4596,17129,5009],{},[4596,17131,17132],{},"r",[4596,17134,39],{},[4596,17136,5012],{},[4596,17138,16867],{},[4591,17140,4594],{"stretchy":4593},[4596,17142,17143],{},"A",[4591,17145,2066],{"separator":1419},[4596,17147,17148],{},"B",[4591,17150,4604],{"stretchy":4593},[4591,17152,4609],{},[4611,17154,17155,17165],{},[4584,17156,17157,17160,17163],{},[4596,17158,17143],{"mathvariant":17159},"bold",[4591,17161,17162],{},"⋅",[4596,17164,17148],{"mathvariant":17159},[4584,17166,17167,17170,17172,17174,17176,17178],{},[4596,17168,17169],{"mathvariant":7101},"∥",[4596,17171,17143],{"mathvariant":17159},[4596,17173,17169],{"mathvariant":7101},[4596,17175,17169],{"mathvariant":7101},[4596,17177,17148],{"mathvariant":17159},[4596,17179,17169],{"mathvariant":7101},[4647,17181,17182],{"encoding":4649},"cosine_similarity (A, B) = \\frac{\\mathbf{A} \\cdot \\mathbf{B}}{\\|\\mathbf{A}\\| \\|\\mathbf{B}\\|}",[78,17184,17186,17289],{"className":17185,"ariaHidden":1419},[4654],[78,17187,17189,17192,17195,17198,17238,17242,17245,17248,17252,17255,17258,17261,17264,17267,17270,17273,17277,17280,17283,17286],{"className":17188},[4658],[78,17190],{"className":17191,"style":4663},[4662],[78,17193,7484],{"className":17194},[4667,4678],[78,17196,7201],{"className":17197},[4667,4678],[78,17199,17201,17204],{"className":17200},[4667],[78,17202,4618],{"className":17203},[4667,4678],[78,17205,17207],{"className":17206},[4689],[78,17208,17210,17230],{"className":17209},[4693,4694],[78,17211,17213,17227],{"className":17212},[4698],[78,17214,17216],{"className":17215,"style":5279},[4702],[78,17217,17218,17221],{"style":4706},[78,17219],{"className":17220,"style":4711},[4710],[78,17222,17224],{"className":17223},[4715,4716,4717,4718],[78,17225,262],{"className":17226},[4667,4678,4718],[78,17228,4726],{"className":17229},[4725],[78,17231,17233],{"className":17232},[4698],[78,17234,17236],{"className":17235,"style":4733},[4702],[78,17237],{},[78,17239,17241],{"className":17240},[4667,4678],"imi",[78,17243,7132],{"className":17244,"style":7300},[4667,4678],[78,17246,5009],{"className":17247},[4667,4678],[78,17249,17132],{"className":17250,"style":17251},[4667,4678],"margin-right:0.0278em;",[78,17253,39],{"className":17254},[4667,4678],[78,17256,5012],{"className":17257},[4667,4678],[78,17259,16867],{"className":17260,"style":5187},[4667,4678],[78,17262,4594],{"className":17263},[4674],[78,17265,17143],{"className":17266},[4667,4678],[78,17268,2066],{"className":17269},[5126],[78,17271],{"className":17272,"style":4839},[4739],[78,17274,17148],{"className":17275,"style":17276},[4667,4678],"margin-right:0.0502em;",[78,17278,4604],{"className":17279},[4682],[78,17281],{"className":17282,"style":4740},[4739],[78,17284,4609],{"className":17285},[4744],[78,17287],{"className":17288,"style":4740},[4739],[78,17290,17292,17296],{"className":17291},[4658],[78,17293],{"className":17294,"style":17295},[4662],"height:2.2991em;vertical-align:-0.936em;",[78,17297,17299,17302,17383],{"className":17298},[4667],[78,17300],{"className":17301},[4674,4761],[78,17303,17305],{"className":17304},[4611],[78,17306,17308,17374],{"className":17307},[4693,4694],[78,17309,17311,17371],{"className":17310},[4698],[78,17312,17315,17340,17348],{"className":17313,"style":17314},[4702],"height:1.3631em;",[78,17316,17317,17320],{"style":4777},[78,17318],{"className":17319,"style":4781},[4710],[78,17321,17323,17326,17330,17334,17337],{"className":17322},[4667],[78,17324,17169],{"className":17325},[4667],[78,17327,17143],{"className":17328},[4667,17329],"mathbf",[78,17331,17333],{"className":17332},[4667],"∥∥",[78,17335,17148],{"className":17336},[4667,17329],[78,17338,17169],{"className":17339},[4667],[78,17341,17342,17345],{"style":4919},[78,17343],{"className":17344,"style":4781},[4710],[78,17346],{"className":17347,"style":4927},[4926],[78,17349,17350,17353],{"style":4930},[78,17351],{"className":17352,"style":4781},[4710],[78,17354,17356,17359,17362,17365,17368],{"className":17355},[4667],[78,17357,17143],{"className":17358},[4667,17329],[78,17360],{"className":17361,"style":5143},[4739],[78,17363,17162],{"className":17364},[7450],[78,17366],{"className":17367,"style":5143},[4739],[78,17369,17148],{"className":17370},[4667,17329],[78,17372,4726],{"className":17373},[4725],[78,17375,17377],{"className":17376},[4698],[78,17378,17381],{"className":17379,"style":17380},[4702],"height:0.936em;",[78,17382],{},[78,17384],{"className":17385},[4682,4761],[13,17387,17388,17389,1018,17419,17448,17449,17479,17480,1018,17508,17536,17537,67,17584,17479,17635,1018,17663,17691,17692,1018,17731,17770,17771,1018,17799,17827],{},"其中，",[78,17390,17392,17406],{"className":17391},[4570],[78,17393,17395],{"className":17394},[4574],[4576,17396,17397],{"xmlns":4578},[4581,17398,17399,17403],{},[4584,17400,17401],{},[4596,17402,17143],{"mathvariant":17159},[4647,17404,17405],{"encoding":4649},"\\mathbf{A}",[78,17407,17409],{"className":17408,"ariaHidden":1419},[4654],[78,17410,17412,17416],{"className":17411},[4658],[78,17413],{"className":17414,"style":17415},[4662],"height:0.6861em;",[78,17417,17143],{"className":17418},[4667,17329],[78,17420,17422,17436],{"className":17421},[4570],[78,17423,17425],{"className":17424},[4574],[4576,17426,17427],{"xmlns":4578},[4581,17428,17429,17433],{},[4584,17430,17431],{},[4596,17432,17148],{"mathvariant":17159},[4647,17434,17435],{"encoding":4649},"\\mathbf{B}",[78,17437,17439],{"className":17438,"ariaHidden":1419},[4654],[78,17440,17442,17445],{"className":17441},[4658],[78,17443],{"className":17444,"style":17415},[4662],[78,17446,17148],{"className":17447},[4667,17329]," 是两个向量，它们的夹角",[78,17450,17452,17467],{"className":17451},[4570],[78,17453,17455],{"className":17454},[4574],[4576,17456,17457],{"xmlns":4578},[4581,17458,17459,17464],{},[4584,17460,17461],{},[4596,17462,17463],{},"θ",[4647,17465,17466],{"encoding":4649},"\\theta",[78,17468,17470],{"className":17469,"ariaHidden":1419},[4654],[78,17471,17473,17476],{"className":17472},[4658],[78,17474],{"className":17475,"style":16794},[4662],[78,17477,17463],{"className":17478,"style":17251},[4667,4678]," 表示向量 ",[78,17481,17483,17496],{"className":17482},[4570],[78,17484,17486],{"className":17485},[4574],[4576,17487,17488],{"xmlns":4578},[4581,17489,17490,17494],{},[4584,17491,17492],{},[4596,17493,17143],{"mathvariant":17159},[4647,17495,17405],{"encoding":4649},[78,17497,17499],{"className":17498,"ariaHidden":1419},[4654],[78,17500,17502,17505],{"className":17501},[4658],[78,17503],{"className":17504,"style":17415},[4662],[78,17506,17143],{"className":17507},[4667,17329],[78,17509,17511,17524],{"className":17510},[4570],[78,17512,17514],{"className":17513},[4574],[4576,17515,17516],{"xmlns":4578},[4581,17517,17518,17522],{},[4584,17519,17520],{},[4596,17521,17148],{"mathvariant":17159},[4647,17523,17435],{"encoding":4649},[78,17525,17527],{"className":17526,"ariaHidden":1419},[4654],[78,17528,17530,17533],{"className":17529},[4658],[78,17531],{"className":17532,"style":17415},[4662],[78,17534,17148],{"className":17535},[4667,17329]," 之间的夹角，cosine_similarity (A, B) 也可以写作 ",[78,17538,17540,17563],{"className":17539},[4570],[78,17541,17543],{"className":17542},[4574],[4576,17544,17545],{"xmlns":4578},[4581,17546,17547,17560],{},[4584,17548,17549,17551,17554,17556,17558],{},[4596,17550,7484],{},[4591,17552,17553],{},"⁡",[4591,17555,4594],{"stretchy":4593},[4596,17557,17463],{},[4591,17559,4604],{"stretchy":4593},[4647,17561,17562],{"encoding":4649},"\\cos(\\theta)",[78,17564,17566],{"className":17565,"ariaHidden":1419},[4654],[78,17567,17569,17572,17575,17578,17581],{"className":17568},[4658],[78,17570],{"className":17571,"style":4663},[4662],[78,17573,7484],{"className":17574},[4788],[78,17576,4594],{"className":17577},[4674],[78,17579,17463],{"className":17580,"style":17251},[4667,4678],[78,17582,4604],{"className":17583},[4682],[78,17585,17587,17605],{"className":17586},[4570],[78,17588,17590],{"className":17589},[4574],[4576,17591,17592],{"xmlns":4578},[4581,17593,17594,17602],{},[4584,17595,17596,17598,17600],{},[4596,17597,17143],{"mathvariant":17159},[4591,17599,17162],{},[4596,17601,17148],{"mathvariant":17159},[4647,17603,17604],{"encoding":4649},"\\mathbf{A} \\cdot \\mathbf{B}",[78,17606,17608,17626],{"className":17607,"ariaHidden":1419},[4654],[78,17609,17611,17614,17617,17620,17623],{"className":17610},[4658],[78,17612],{"className":17613,"style":17415},[4662],[78,17615,17143],{"className":17616},[4667,17329],[78,17618],{"className":17619,"style":5143},[4739],[78,17621,17162],{"className":17622},[7450],[78,17624],{"className":17625,"style":5143},[4739],[78,17627,17629,17632],{"className":17628},[4658],[78,17630],{"className":17631,"style":17415},[4662],[78,17633,17148],{"className":17634},[4667,17329],[78,17636,17638,17651],{"className":17637},[4570],[78,17639,17641],{"className":17640},[4574],[4576,17642,17643],{"xmlns":4578},[4581,17644,17645,17649],{},[4584,17646,17647],{},[4596,17648,17143],{"mathvariant":17159},[4647,17650,17405],{"encoding":4649},[78,17652,17654],{"className":17653,"ariaHidden":1419},[4654],[78,17655,17657,17660],{"className":17656},[4658],[78,17658],{"className":17659,"style":17415},[4662],[78,17661,17143],{"className":17662},[4667,17329],[78,17664,17666,17679],{"className":17665},[4570],[78,17667,17669],{"className":17668},[4574],[4576,17670,17671],{"xmlns":4578},[4581,17672,17673,17677],{},[4584,17674,17675],{},[4596,17676,17148],{"mathvariant":17159},[4647,17678,17435],{"encoding":4649},[78,17680,17682],{"className":17681,"ariaHidden":1419},[4654],[78,17683,17685,17688],{"className":17684},[4658],[78,17686],{"className":17687,"style":17415},[4662],[78,17689,17148],{"className":17690},[4667,17329]," 的点积，",[78,17693,17695,17713],{"className":17694},[4570],[78,17696,17698],{"className":17697},[4574],[4576,17699,17700],{"xmlns":4578},[4581,17701,17702,17710],{},[4584,17703,17704,17706,17708],{},[4596,17705,17169],{"mathvariant":7101},[4596,17707,17143],{"mathvariant":17159},[4596,17709,17169],{"mathvariant":7101},[4647,17711,17712],{"encoding":4649},"\\|\\mathbf{A}\\|",[78,17714,17716],{"className":17715,"ariaHidden":1419},[4654],[78,17717,17719,17722,17725,17728],{"className":17718},[4658],[78,17720],{"className":17721,"style":4663},[4662],[78,17723,17169],{"className":17724},[4667],[78,17726,17143],{"className":17727},[4667,17329],[78,17729,17169],{"className":17730},[4667],[78,17732,17734,17752],{"className":17733},[4570],[78,17735,17737],{"className":17736},[4574],[4576,17738,17739],{"xmlns":4578},[4581,17740,17741,17749],{},[4584,17742,17743,17745,17747],{},[4596,17744,17169],{"mathvariant":7101},[4596,17746,17148],{"mathvariant":17159},[4596,17748,17169],{"mathvariant":7101},[4647,17750,17751],{"encoding":4649},"\\|\\mathbf{B}\\|",[78,17753,17755],{"className":17754,"ariaHidden":1419},[4654],[78,17756,17758,17761,17764,17767],{"className":17757},[4658],[78,17759],{"className":17760,"style":4663},[4662],[78,17762,17169],{"className":17763},[4667],[78,17765,17148],{"className":17766},[4667,17329],[78,17768,17169],{"className":17769},[4667]," 分别表示向量 ",[78,17772,17774,17787],{"className":17773},[4570],[78,17775,17777],{"className":17776},[4574],[4576,17778,17779],{"xmlns":4578},[4581,17780,17781,17785],{},[4584,17782,17783],{},[4596,17784,17143],{"mathvariant":17159},[4647,17786,17405],{"encoding":4649},[78,17788,17790],{"className":17789,"ariaHidden":1419},[4654],[78,17791,17793,17796],{"className":17792},[4658],[78,17794],{"className":17795,"style":17415},[4662],[78,17797,17143],{"className":17798},[4667,17329],[78,17800,17802,17815],{"className":17801},[4570],[78,17803,17805],{"className":17804},[4574],[4576,17806,17807],{"xmlns":4578},[4581,17808,17809,17813],{},[4584,17810,17811],{},[4596,17812,17148],{"mathvariant":17159},[4647,17814,17435],{"encoding":4649},[78,17816,17818],{"className":17817,"ariaHidden":1419},[4654],[78,17819,17821,17824],{"className":17820},[4658],[78,17822],{"className":17823,"style":17415},[4662],[78,17825,17148],{"className":17826},[4667,17329]," 的模（或范数）。",[13,17829,17830,17831,17891,17892,17921,17922,17956,17957,17985,17986,17989],{},"余弦相似度的取值范围在 ",[78,17832,17834,17861],{"className":17833},[4570],[78,17835,17837],{"className":17836},[4574],[4576,17838,17839],{"xmlns":4578},[4581,17840,17841,17858],{},[4584,17842,17843,17846,17849,17851,17853,17855],{},[4591,17844,17845],{"stretchy":4593},"[",[4591,17847,17848],{},"−",[7077,17850,469],{},[4591,17852,2066],{"separator":1419},[7077,17854,469],{},[4591,17856,17857],{"stretchy":4593},"]",[4647,17859,17860],{"encoding":4649},"[-1, 1]",[78,17862,17864],{"className":17863,"ariaHidden":1419},[4654],[78,17865,17867,17870,17873,17876,17879,17882,17885,17888],{"className":17866},[4658],[78,17868],{"className":17869,"style":4663},[4662],[78,17871,17845],{"className":17872},[4674],[78,17874,17848],{"className":17875},[4667],[78,17877,469],{"className":17878},[4667],[78,17880,2066],{"className":17881},[5126],[78,17883],{"className":17884,"style":4839},[4739],[78,17886,469],{"className":17887},[4667],[78,17889,17857],{"className":17890},[4682]," 之间，其中 ",[78,17893,17895,17908],{"className":17894},[4570],[78,17896,17898],{"className":17897},[4574],[4576,17899,17900],{"xmlns":4578},[4581,17901,17902,17906],{},[4584,17903,17904],{},[7077,17905,469],{},[4647,17907,469],{"encoding":4649},[78,17909,17911],{"className":17910,"ariaHidden":1419},[4654],[78,17912,17914,17918],{"className":17913},[4658],[78,17915],{"className":17916,"style":17917},[4662],"height:0.6444em;",[78,17919,469],{"className":17920},[4667]," 表示两个向量完全相同，",[78,17923,17925,17940],{"className":17924},[4570],[78,17926,17928],{"className":17927},[4574],[4576,17929,17930],{"xmlns":4578},[4581,17931,17932,17938],{},[4584,17933,17934,17936],{},[4591,17935,17848],{},[7077,17937,469],{},[4647,17939,1217],{"encoding":4649},[78,17941,17943],{"className":17942,"ariaHidden":1419},[4654],[78,17944,17946,17950,17953],{"className":17945},[4658],[78,17947],{"className":17948,"style":17949},[4662],"height:0.7278em;vertical-align:-0.0833em;",[78,17951,17848],{"className":17952},[4667],[78,17954,469],{"className":17955},[4667]," 表示两个向量完全相反，",[78,17958,17960,17973],{"className":17959},[4570],[78,17961,17963],{"className":17962},[4574],[4576,17964,17965],{"xmlns":4578},[4581,17966,17967,17971],{},[4584,17968,17969],{},[7077,17970,2949],{},[4647,17972,2949],{"encoding":4649},[78,17974,17976],{"className":17975,"ariaHidden":1419},[4654],[78,17977,17979,17982],{"className":17978},[4658],[78,17980],{"className":17981,"style":17917},[4662],[78,17983,2949],{"className":17984},[4667]," 表示两个向量正交（无相似度）。余弦相似度的有点事它不受向量大小的影响，只关注向量之间的方向。\n因此，当我们需要",[22,17987,17988],{},"比较两个向量在方向上的相似程度","时，可以选择使用余弦相似度。",[10548,17991,17992],{"id":17992},"内积",[13,17994,17995,17996,17999],{},"内积（Inner Product， IP）是指两个向量在相同方向上的投影长度的乘积。它可以用于衡量两个向量在方向上的相似程度。\n当我们需要",[22,17997,17998],{},"比较两个特征在某些特征上的绝对数值","时可以选择使用内积。\n内积的公式如下：",[78,18001,18003],{"className":18002},[4566],[78,18004,18006,18064],{"className":18005},[4570],[78,18007,18009],{"className":18008},[4574],[4576,18010,18011],{"xmlns":4578,"display":4579},[4581,18012,18013,18061],{},[4584,18014,18015,18017,18019,18021,18023,18025,18028,18030,18032,18034,18036,18039,18041,18043,18045,18047,18049,18051,18053,18055,18057,18059],{},[4596,18016,39],{},[4596,18018,19],{},[4596,18020,19],{},[4596,18022,4618],{},[4596,18024,17132],{},[4596,18026,18027],{"mathvariant":7101},"_",[4596,18029,13],{},[4596,18031,17132],{},[4596,18033,5025],{},[4596,18035,5245],{},[4596,18037,18038],{},"u",[4596,18040,7360],{},[4596,18042,5012],{},[4591,18044,4594],{"stretchy":4593},[4596,18046,17143],{},[4591,18048,2066],{"separator":1419},[4596,18050,17148],{},[4591,18052,4604],{"stretchy":4593},[4591,18054,4609],{},[4596,18056,17143],{"mathvariant":17159},[4591,18058,17162],{},[4596,18060,17148],{"mathvariant":17159},[4647,18062,18063],{"encoding":4649},"inner\\_product (A, B) = \\mathbf{A} \\cdot \\mathbf{B}",[78,18065,18067,18133,18151],{"className":18066,"ariaHidden":1419},[4654],[78,18068,18070,18074,18078,18082,18085,18088,18091,18094,18097,18100,18103,18106,18109,18112,18115,18118,18121,18124,18127,18130],{"className":18069},[4658],[78,18071],{"className":18072,"style":18073},[4662],"height:1.06em;vertical-align:-0.31em;",[78,18075,18077],{"className":18076},[4667,4678],"inn",[78,18079,18081],{"className":18080,"style":17251},[4667,4678],"er",[78,18083,18027],{"className":18084,"style":17251},[4667],[78,18086,13],{"className":18087},[4667,4678],[78,18089,17132],{"className":18090,"style":17251},[4667,4678],[78,18092,5025],{"className":18093},[4667,4678],[78,18095,5245],{"className":18096},[4667,4678],[78,18098,18038],{"className":18099},[4667,4678],[78,18101,7360],{"className":18102},[4667,4678],[78,18104,5012],{"className":18105},[4667,4678],[78,18107,4594],{"className":18108},[4674],[78,18110,17143],{"className":18111},[4667,4678],[78,18113,2066],{"className":18114},[5126],[78,18116],{"className":18117,"style":4839},[4739],[78,18119,17148],{"className":18120,"style":17276},[4667,4678],[78,18122,4604],{"className":18123},[4682],[78,18125],{"className":18126,"style":4740},[4739],[78,18128,4609],{"className":18129},[4744],[78,18131],{"className":18132,"style":4740},[4739],[78,18134,18136,18139,18142,18145,18148],{"className":18135},[4658],[78,18137],{"className":18138,"style":17415},[4662],[78,18140,17143],{"className":18141},[4667,17329],[78,18143],{"className":18144,"style":5143},[4739],[78,18146,17162],{"className":18147},[7450],[78,18149],{"className":18150,"style":5143},[4739],[78,18152,18154,18157],{"className":18153},[4658],[78,18155],{"className":18156,"style":17415},[4662],[78,18158,17148],{"className":18159},[4667,17329],[13,18161,4275,18162,1018,18398,18629],{},[78,18163,18165,18215],{"className":18164},[4570],[78,18166,18168],{"className":18167},[4574],[4576,18169,18170],{"xmlns":4578},[4581,18171,18172,18212],{},[4584,18173,18174,18176,18178,18180,18186,18188,18194,18196,18199,18202,18204,18210],{},[4596,18175,17143],{},[4591,18177,4609],{},[4591,18179,4594],{"stretchy":4593},[4600,18181,18182,18184],{},[4596,18183,5009],{},[7077,18185,469],{},[4591,18187,2066],{"separator":1419},[4600,18189,18190,18192],{},[4596,18191,5009],{},[7077,18193,472],{},[4591,18195,2066],{"separator":1419},[4591,18197,18198],{},"⋯",[4587,18200,18201],{}," ",[4591,18203,2066],{"separator":1419},[4600,18205,18206,18208],{},[4596,18207,5009],{},[4596,18209,19],{},[4591,18211,4604],{"stretchy":4593},[4647,18213,18214],{"encoding":4649},"A=(a_1, a_2, \\cdots, a_n)",[78,18216,18218,18237],{"className":18217,"ariaHidden":1419},[4654],[78,18219,18221,18225,18228,18231,18234],{"className":18220},[4658],[78,18222],{"className":18223,"style":18224},[4662],"height:0.6833em;",[78,18226,17143],{"className":18227},[4667,4678],[78,18229],{"className":18230,"style":4740},[4739],[78,18232,4609],{"className":18233},[4744],[78,18235],{"className":18236,"style":4740},[4739],[78,18238,18240,18243,18246,18287,18290,18293,18333,18336,18339,18343,18346,18349,18352,18355,18395],{"className":18239},[4658],[78,18241],{"className":18242,"style":4663},[4662],[78,18244,4594],{"className":18245},[4674],[78,18247,18249,18252],{"className":18248},[4667],[78,18250,5009],{"className":18251},[4667,4678],[78,18253,18255],{"className":18254},[4689],[78,18256,18258,18279],{"className":18257},[4693,4694],[78,18259,18261,18276],{"className":18260},[4698],[78,18262,18265],{"className":18263,"style":18264},[4702],"height:0.3011em;",[78,18266,18267,18270],{"style":4706},[78,18268],{"className":18269,"style":4711},[4710],[78,18271,18273],{"className":18272},[4715,4716,4717,4718],[78,18274,469],{"className":18275},[4667,4718],[78,18277,4726],{"className":18278},[4725],[78,18280,18282],{"className":18281},[4698],[78,18283,18285],{"className":18284,"style":4733},[4702],[78,18286],{},[78,18288,2066],{"className":18289},[5126],[78,18291],{"className":18292,"style":4839},[4739],[78,18294,18296,18299],{"className":18295},[4667],[78,18297,5009],{"className":18298},[4667,4678],[78,18300,18302],{"className":18301},[4689],[78,18303,18305,18325],{"className":18304},[4693,4694],[78,18306,18308,18322],{"className":18307},[4698],[78,18309,18311],{"className":18310,"style":18264},[4702],[78,18312,18313,18316],{"style":4706},[78,18314],{"className":18315,"style":4711},[4710],[78,18317,18319],{"className":18318},[4715,4716,4717,4718],[78,18320,472],{"className":18321},[4667,4718],[78,18323,4726],{"className":18324},[4725],[78,18326,18328],{"className":18327},[4698],[78,18329,18331],{"className":18330,"style":4733},[4702],[78,18332],{},[78,18334,2066],{"className":18335},[5126],[78,18337],{"className":18338,"style":4839},[4739],[78,18340,18198],{"className":18341},[18342],"minner",[78,18344],{"className":18345,"style":4839},[4739],[78,18347],{"className":18348,"style":4839},[4739],[78,18350,2066],{"className":18351},[5126],[78,18353],{"className":18354,"style":4839},[4739],[78,18356,18358,18361],{"className":18357},[4667],[78,18359,5009],{"className":18360},[4667,4678],[78,18362,18364],{"className":18363},[4689],[78,18365,18367,18387],{"className":18366},[4693,4694],[78,18368,18370,18384],{"className":18369},[4698],[78,18371,18373],{"className":18372,"style":5279},[4702],[78,18374,18375,18378],{"style":4706},[78,18376],{"className":18377,"style":4711},[4710],[78,18379,18381],{"className":18380},[4715,4716,4717,4718],[78,18382,19],{"className":18383},[4667,4678,4718],[78,18385,4726],{"className":18386},[4725],[78,18388,18390],{"className":18389},[4698],[78,18391,18393],{"className":18392,"style":4733},[4702],[78,18394],{},[78,18396,4604],{"className":18397},[4682],[78,18399,18401,18449],{"className":18400},[4570],[78,18402,18404],{"className":18403},[4574],[4576,18405,18406],{"xmlns":4578},[4581,18407,18408,18446],{},[4584,18409,18410,18412,18414,18416,18422,18424,18430,18432,18434,18436,18438,18444],{},[4596,18411,17148],{},[4591,18413,4609],{},[4591,18415,4594],{"stretchy":4593},[4600,18417,18418,18420],{},[4596,18419,12172],{},[7077,18421,469],{},[4591,18423,2066],{"separator":1419},[4600,18425,18426,18428],{},[4596,18427,12172],{},[7077,18429,472],{},[4591,18431,2066],{"separator":1419},[4591,18433,18198],{},[4587,18435,18201],{},[4591,18437,2066],{"separator":1419},[4600,18439,18440,18442],{},[4596,18441,12172],{},[4596,18443,19],{},[4591,18445,4604],{"stretchy":4593},[4647,18447,18448],{"encoding":4649},"B=(b_1, b_2, \\cdots, b_n)",[78,18450,18452,18470],{"className":18451,"ariaHidden":1419},[4654],[78,18453,18455,18458,18461,18464,18467],{"className":18454},[4658],[78,18456],{"className":18457,"style":18224},[4662],[78,18459,17148],{"className":18460,"style":17276},[4667,4678],[78,18462],{"className":18463,"style":4740},[4739],[78,18465,4609],{"className":18466},[4744],[78,18468],{"className":18469,"style":4740},[4739],[78,18471,18473,18476,18479,18519,18522,18525,18565,18568,18571,18574,18577,18580,18583,18586,18626],{"className":18472},[4658],[78,18474],{"className":18475,"style":4663},[4662],[78,18477,4594],{"className":18478},[4674],[78,18480,18482,18485],{"className":18481},[4667],[78,18483,12172],{"className":18484},[4667,4678],[78,18486,18488],{"className":18487},[4689],[78,18489,18491,18511],{"className":18490},[4693,4694],[78,18492,18494,18508],{"className":18493},[4698],[78,18495,18497],{"className":18496,"style":18264},[4702],[78,18498,18499,18502],{"style":4706},[78,18500],{"className":18501,"style":4711},[4710],[78,18503,18505],{"className":18504},[4715,4716,4717,4718],[78,18506,469],{"className":18507},[4667,4718],[78,18509,4726],{"className":18510},[4725],[78,18512,18514],{"className":18513},[4698],[78,18515,18517],{"className":18516,"style":4733},[4702],[78,18518],{},[78,18520,2066],{"className":18521},[5126],[78,18523],{"className":18524,"style":4839},[4739],[78,18526,18528,18531],{"className":18527},[4667],[78,18529,12172],{"className":18530},[4667,4678],[78,18532,18534],{"className":18533},[4689],[78,18535,18537,18557],{"className":18536},[4693,4694],[78,18538,18540,18554],{"className":18539},[4698],[78,18541,18543],{"className":18542,"style":18264},[4702],[78,18544,18545,18548],{"style":4706},[78,18546],{"className":18547,"style":4711},[4710],[78,18549,18551],{"className":18550},[4715,4716,4717,4718],[78,18552,472],{"className":18553},[4667,4718],[78,18555,4726],{"className":18556},[4725],[78,18558,18560],{"className":18559},[4698],[78,18561,18563],{"className":18562,"style":4733},[4702],[78,18564],{},[78,18566,2066],{"className":18567},[5126],[78,18569],{"className":18570,"style":4839},[4739],[78,18572,18198],{"className":18573},[18342],[78,18575],{"className":18576,"style":4839},[4739],[78,18578],{"className":18579,"style":4839},[4739],[78,18581,2066],{"className":18582},[5126],[78,18584],{"className":18585,"style":4839},[4739],[78,18587,18589,18592],{"className":18588},[4667],[78,18590,12172],{"className":18591},[4667,4678],[78,18593,18595],{"className":18594},[4689],[78,18596,18598,18618],{"className":18597},[4693,4694],[78,18599,18601,18615],{"className":18600},[4698],[78,18602,18604],{"className":18603,"style":5279},[4702],[78,18605,18606,18609],{"style":4706},[78,18607],{"className":18608,"style":4711},[4710],[78,18610,18612],{"className":18611},[4715,4716,4717,4718],[78,18613,19],{"className":18614},[4667,4678,4718],[78,18616,4726],{"className":18617},[4725],[78,18619,18621],{"className":18620},[4698],[78,18622,18624],{"className":18623,"style":4733},[4702],[78,18625],{},[78,18627,4604],{"className":18628},[4682]," 是两个向量，它们的内积可以表示为：",[78,18631,18633],{"className":18632},[4566],[78,18634,18636,18730],{"className":18635},[4570],[78,18637,18639],{"className":18638},[4574],[4576,18640,18641],{"xmlns":4578,"display":4579},[4581,18642,18643,18727],{},[4584,18644,18645,18647,18649,18651,18653,18655,18657,18659,18661,18663,18665,18667,18669,18671,18673,18675,18677,18679,18681,18683,18689,18695,18697,18703,18709,18711,18713,18715,18721],{},[4596,18646,39],{},[4596,18648,19],{},[4596,18650,19],{},[4596,18652,4618],{},[4596,18654,17132],{},[4596,18656,18027],{"mathvariant":7101},[4596,18658,13],{},[4596,18660,17132],{},[4596,18662,5025],{},[4596,18664,5245],{},[4596,18666,18038],{},[4596,18668,7360],{},[4596,18670,5012],{},[4591,18672,4594],{"stretchy":4593},[4596,18674,17143],{},[4591,18676,2066],{"separator":1419},[4596,18678,17148],{},[4591,18680,4604],{"stretchy":4593},[4591,18682,4609],{},[4600,18684,18685,18687],{},[4596,18686,5009],{},[7077,18688,469],{},[4600,18690,18691,18693],{},[4596,18692,12172],{},[7077,18694,469],{},[4591,18696,7351],{},[4600,18698,18699,18701],{},[4596,18700,5009],{},[7077,18702,472],{},[4600,18704,18705,18707],{},[4596,18706,12172],{},[7077,18708,472],{},[4591,18710,7351],{},[4591,18712,18198],{},[4591,18714,7351],{},[4600,18716,18717,18719],{},[4596,18718,5009],{},[4596,18720,19],{},[4600,18722,18723,18725],{},[4596,18724,12172],{},[4596,18726,19],{},[4647,18728,18729],{"encoding":4649},"inner\\_product (A, B) = a_1b_1 + a_2b_2 + \\cdots + a_nb_n",[78,18731,18733,18796,18891,18986,19005],{"className":18732,"ariaHidden":1419},[4654],[78,18734,18736,18739,18742,18745,18748,18751,18754,18757,18760,18763,18766,18769,18772,18775,18778,18781,18784,18787,18790,18793],{"className":18735},[4658],[78,18737],{"className":18738,"style":18073},[4662],[78,18740,18077],{"className":18741},[4667,4678],[78,18743,18081],{"className":18744,"style":17251},[4667,4678],[78,18746,18027],{"className":18747,"style":17251},[4667],[78,18749,13],{"className":18750},[4667,4678],[78,18752,17132],{"className":18753,"style":17251},[4667,4678],[78,18755,5025],{"className":18756},[4667,4678],[78,18758,5245],{"className":18759},[4667,4678],[78,18761,18038],{"className":18762},[4667,4678],[78,18764,7360],{"className":18765},[4667,4678],[78,18767,5012],{"className":18768},[4667,4678],[78,18770,4594],{"className":18771},[4674],[78,18773,17143],{"className":18774},[4667,4678],[78,18776,2066],{"className":18777},[5126],[78,18779],{"className":18780,"style":4839},[4739],[78,18782,17148],{"className":18783,"style":17276},[4667,4678],[78,18785,4604],{"className":18786},[4682],[78,18788],{"className":18789,"style":4740},[4739],[78,18791,4609],{"className":18792},[4744],[78,18794],{"className":18795,"style":4740},[4739],[78,18797,18799,18802,18842,18882,18885,18888],{"className":18798},[4658],[78,18800],{"className":18801,"style":5260},[4662],[78,18803,18805,18808],{"className":18804},[4667],[78,18806,5009],{"className":18807},[4667,4678],[78,18809,18811],{"className":18810},[4689],[78,18812,18814,18834],{"className":18813},[4693,4694],[78,18815,18817,18831],{"className":18816},[4698],[78,18818,18820],{"className":18819,"style":18264},[4702],[78,18821,18822,18825],{"style":4706},[78,18823],{"className":18824,"style":4711},[4710],[78,18826,18828],{"className":18827},[4715,4716,4717,4718],[78,18829,469],{"className":18830},[4667,4718],[78,18832,4726],{"className":18833},[4725],[78,18835,18837],{"className":18836},[4698],[78,18838,18840],{"className":18839,"style":4733},[4702],[78,18841],{},[78,18843,18845,18848],{"className":18844},[4667],[78,18846,12172],{"className":18847},[4667,4678],[78,18849,18851],{"className":18850},[4689],[78,18852,18854,18874],{"className":18853},[4693,4694],[78,18855,18857,18871],{"className":18856},[4698],[78,18858,18860],{"className":18859,"style":18264},[4702],[78,18861,18862,18865],{"style":4706},[78,18863],{"className":18864,"style":4711},[4710],[78,18866,18868],{"className":18867},[4715,4716,4717,4718],[78,18869,469],{"className":18870},[4667,4718],[78,18872,4726],{"className":18873},[4725],[78,18875,18877],{"className":18876},[4698],[78,18878,18880],{"className":18879,"style":4733},[4702],[78,18881],{},[78,18883],{"className":18884,"style":5143},[4739],[78,18886,7351],{"className":18887},[7450],[78,18889],{"className":18890,"style":5143},[4739],[78,18892,18894,18897,18937,18977,18980,18983],{"className":18893},[4658],[78,18895],{"className":18896,"style":5260},[4662],[78,18898,18900,18903],{"className":18899},[4667],[78,18901,5009],{"className":18902},[4667,4678],[78,18904,18906],{"className":18905},[4689],[78,18907,18909,18929],{"className":18908},[4693,4694],[78,18910,18912,18926],{"className":18911},[4698],[78,18913,18915],{"className":18914,"style":18264},[4702],[78,18916,18917,18920],{"style":4706},[78,18918],{"className":18919,"style":4711},[4710],[78,18921,18923],{"className":18922},[4715,4716,4717,4718],[78,18924,472],{"className":18925},[4667,4718],[78,18927,4726],{"className":18928},[4725],[78,18930,18932],{"className":18931},[4698],[78,18933,18935],{"className":18934,"style":4733},[4702],[78,18936],{},[78,18938,18940,18943],{"className":18939},[4667],[78,18941,12172],{"className":18942},[4667,4678],[78,18944,18946],{"className":18945},[4689],[78,18947,18949,18969],{"className":18948},[4693,4694],[78,18950,18952,18966],{"className":18951},[4698],[78,18953,18955],{"className":18954,"style":18264},[4702],[78,18956,18957,18960],{"style":4706},[78,18958],{"className":18959,"style":4711},[4710],[78,18961,18963],{"className":18962},[4715,4716,4717,4718],[78,18964,472],{"className":18965},[4667,4718],[78,18967,4726],{"className":18968},[4725],[78,18970,18972],{"className":18971},[4698],[78,18973,18975],{"className":18974,"style":4733},[4702],[78,18976],{},[78,18978],{"className":18979,"style":5143},[4739],[78,18981,7351],{"className":18982},[7450],[78,18984],{"className":18985,"style":5143},[4739],[78,18987,18989,18993,18996,18999,19002],{"className":18988},[4658],[78,18990],{"className":18991,"style":18992},[4662],"height:0.6667em;vertical-align:-0.0833em;",[78,18994,18198],{"className":18995},[18342],[78,18997],{"className":18998,"style":5143},[4739],[78,19000,7351],{"className":19001},[7450],[78,19003],{"className":19004,"style":5143},[4739],[78,19006,19008,19011,19051],{"className":19007},[4658],[78,19009],{"className":19010,"style":5260},[4662],[78,19012,19014,19017],{"className":19013},[4667],[78,19015,5009],{"className":19016},[4667,4678],[78,19018,19020],{"className":19019},[4689],[78,19021,19023,19043],{"className":19022},[4693,4694],[78,19024,19026,19040],{"className":19025},[4698],[78,19027,19029],{"className":19028,"style":5279},[4702],[78,19030,19031,19034],{"style":4706},[78,19032],{"className":19033,"style":4711},[4710],[78,19035,19037],{"className":19036},[4715,4716,4717,4718],[78,19038,19],{"className":19039},[4667,4678,4718],[78,19041,4726],{"className":19042},[4725],[78,19044,19046],{"className":19045},[4698],[78,19047,19049],{"className":19048,"style":4733},[4702],[78,19050],{},[78,19052,19054,19057],{"className":19053},[4667],[78,19055,12172],{"className":19056},[4667,4678],[78,19058,19060],{"className":19059},[4689],[78,19061,19063,19083],{"className":19062},[4693,4694],[78,19064,19066,19080],{"className":19065},[4698],[78,19067,19069],{"className":19068,"style":5279},[4702],[78,19070,19071,19074],{"style":4706},[78,19072],{"className":19073,"style":4711},[4710],[78,19075,19077],{"className":19076},[4715,4716,4717,4718],[78,19078,19],{"className":19079},[4667,4678,4718],[78,19081,4726],{"className":19082},[4725],[78,19084,19086],{"className":19085},[4698],[78,19087,19089],{"className":19088,"style":4733},[4702],[78,19090],{},[13,19092,19093],{},"在几何上，向量的内积等于它们的模的乘积乘以它们之间夹角的余弦值。即",[78,19095,19097],{"className":19096},[4566],[78,19098,19100,19142],{"className":19099},[4570],[78,19101,19103],{"className":19102},[4574],[4576,19104,19105],{"xmlns":4578,"display":4579},[4581,19106,19107,19139],{},[4584,19108,19109,19111,19113,19115,19117,19119,19121,19123,19125,19127,19129,19131,19133,19135,19137],{},[4596,19110,17143],{"mathvariant":17159},[4591,19112,17162],{},[4596,19114,17148],{"mathvariant":17159},[4591,19116,4609],{},[4596,19118,17169],{"mathvariant":7101},[4596,19120,17143],{"mathvariant":17159},[4596,19122,17169],{"mathvariant":7101},[4596,19124,17169],{"mathvariant":7101},[4596,19126,17148],{"mathvariant":17159},[4596,19128,17169],{"mathvariant":7101},[4596,19130,7484],{},[4591,19132,17553],{},[4591,19134,4594],{"stretchy":4593},[4596,19136,17463],{},[4591,19138,4604],{"stretchy":4593},[4647,19140,19141],{"encoding":4649},"\\mathbf{A} \\cdot \\mathbf{B} = \\|\\mathbf{A}\\| \\|\\mathbf{B}\\| \\cos(\\theta)",[78,19143,19145,19163,19181],{"className":19144,"ariaHidden":1419},[4654],[78,19146,19148,19151,19154,19157,19160],{"className":19147},[4658],[78,19149],{"className":19150,"style":17415},[4662],[78,19152,17143],{"className":19153},[4667,17329],[78,19155],{"className":19156,"style":5143},[4739],[78,19158,17162],{"className":19159},[7450],[78,19161],{"className":19162,"style":5143},[4739],[78,19164,19166,19169,19172,19175,19178],{"className":19165},[4658],[78,19167],{"className":19168,"style":17415},[4662],[78,19170,17148],{"className":19171},[4667,17329],[78,19173],{"className":19174,"style":4740},[4739],[78,19176,4609],{"className":19177},[4744],[78,19179],{"className":19180,"style":4740},[4739],[78,19182,19184,19187,19190,19193,19196,19199,19202,19205,19208,19211,19214],{"className":19183},[4658],[78,19185],{"className":19186,"style":4663},[4662],[78,19188,17169],{"className":19189},[4667],[78,19191,17143],{"className":19192},[4667,17329],[78,19194,17333],{"className":19195},[4667],[78,19197,17148],{"className":19198},[4667,17329],[78,19200,17169],{"className":19201},[4667],[78,19203],{"className":19204,"style":4839},[4739],[78,19206,7484],{"className":19207},[4788],[78,19209,4594],{"className":19210},[4674],[78,19212,17463],{"className":19213,"style":17251},[4667,4678],[78,19215,4604],{"className":19216},[4682],[10548,19218,19219],{"id":19219},"欧式距离",[13,19221,19222,19223,19226],{},"欧式距离（Euclidean Distance）是指在欧氏空间中，两个点之间的直线距离。它可以直观的表示两点之间的远近程度。两个向量之间的欧氏距离通过计算对应分量差值的平方和，再开方得到。欧氏距离关注的是向量之间的绝对距离，适用于比较两个向量在空间中的相对位置。当我们",[22,19224,19225],{},"关注两个向量之间的差异程度","时，可以选择使用欧氏距离。\n欧式距离的公式如下：",[78,19228,19230],{"className":19229},[4566],[78,19231,19233,19371],{"className":19232},[4570],[78,19234,19236],{"className":19235},[4574],[4576,19237,19238],{"xmlns":4578,"display":4579},[4581,19239,19240,19368],{},[4584,19241,19242,19244,19246,19248,19250,19252,19254,19256,19258,19260,19262,19264,19266,19268,19270,19272,19274,19276,19278,19280,19282,19284,19286,19288,19290],{},[4596,19243,4618],{},[4596,19245,18038],{},[4596,19247,7360],{},[4596,19249,7132],{},[4596,19251,39],{},[4596,19253,5245],{},[4596,19255,4618],{},[4596,19257,5009],{},[4596,19259,19],{},[4596,19261,18027],{"mathvariant":7101},[4596,19263,5245],{},[4596,19265,39],{},[4596,19267,262],{},[4596,19269,5012],{},[4596,19271,5009],{},[4596,19273,19],{},[4596,19275,7360],{},[4596,19277,4618],{},[4591,19279,4594],{"stretchy":4593},[4596,19281,17143],{},[4591,19283,2066],{"separator":1419},[4596,19285,17148],{},[4591,19287,4604],{"stretchy":4593},[4591,19289,4609],{},[5669,19291,19292],{},[4584,19293,19294,19296,19302,19304,19310,19316,19318,19320,19326,19328,19334,19340,19342,19344,19346,19348,19354,19356,19362],{},[4591,19295,4594],{"stretchy":4593},[4600,19297,19298,19300],{},[4596,19299,17143],{},[7077,19301,469],{},[4591,19303,17848],{},[4600,19305,19306,19308],{},[4596,19307,17148],{},[7077,19309,469],{},[4614,19311,19312,19314],{},[4591,19313,4604],{"stretchy":4593},[7077,19315,472],{},[4591,19317,7351],{},[4591,19319,4594],{"stretchy":4593},[4600,19321,19322,19324],{},[4596,19323,17143],{},[7077,19325,472],{},[4591,19327,17848],{},[4600,19329,19330,19332],{},[4596,19331,17148],{},[7077,19333,472],{},[4614,19335,19336,19338],{},[4591,19337,4604],{"stretchy":4593},[7077,19339,472],{},[4591,19341,7351],{},[4591,19343,18198],{},[4591,19345,7351],{},[4591,19347,4594],{"stretchy":4593},[4600,19349,19350,19352],{},[4596,19351,17143],{},[4596,19353,19],{},[4591,19355,17848],{},[4600,19357,19358,19360],{},[4596,19359,17148],{},[4596,19361,19],{},[4614,19363,19364,19366],{},[4591,19365,4604],{"stretchy":4593},[7077,19367,472],{},[4647,19369,19370],{"encoding":4649},"euclidean\\_distance (A, B) = \\sqrt{(A_1 - B_1)^2 + (A_2 - B_2)^2 + \\cdots + (A_n - B_n)^2}",[78,19372,19374,19454],{"className":19373,"ariaHidden":1419},[4654],[78,19375,19377,19380,19383,19386,19389,19392,19395,19398,19401,19405,19408,19411,19414,19417,19420,19423,19427,19430,19433,19436,19439,19442,19445,19448,19451],{"className":19376},[4658],[78,19378],{"className":19379,"style":18073},[4662],[78,19381,4618],{"className":19382},[4667,4678],[78,19384,18038],{"className":19385},[4667,4678],[78,19387,7360],{"className":19388},[4667,4678],[78,19390,7132],{"className":19391,"style":7300},[4667,4678],[78,19393,39],{"className":19394},[4667,4678],[78,19396,5245],{"className":19397},[4667,4678],[78,19399,4618],{"className":19400},[4667,4678],[78,19402,19404],{"className":19403},[4667,4678],"an",[78,19406,18027],{"className":19407,"style":17251},[4667],[78,19409,5245],{"className":19410},[4667,4678],[78,19412,39],{"className":19413},[4667,4678],[78,19415,262],{"className":19416},[4667,4678],[78,19418,5012],{"className":19419},[4667,4678],[78,19421,19404],{"className":19422},[4667,4678],[78,19424,19426],{"className":19425},[4667,4678],"ce",[78,19428,4594],{"className":19429},[4674],[78,19431,17143],{"className":19432},[4667,4678],[78,19434,2066],{"className":19435},[5126],[78,19437],{"className":19438,"style":4839},[4739],[78,19440,17148],{"className":19441,"style":17276},[4667,4678],[78,19443,4604],{"className":19444},[4682],[78,19446],{"className":19447,"style":4740},[4739],[78,19449,4609],{"className":19450},[4744],[78,19452],{"className":19453,"style":4740},[4739],[78,19455,19457,19461],{"className":19456},[4658],[78,19458],{"className":19459,"style":19460},[4662],"height:1.24em;vertical-align:-0.2561em;",[78,19462,19464],{"className":19463},[4667,5809],[78,19465,19467,19902],{"className":19466},[4693,4694],[78,19468,19470,19899],{"className":19469},[4698],[78,19471,19474,19882],{"className":19472,"style":19473},[4702],"height:0.9839em;",[78,19475,19478,19482],{"className":19476,"style":19477},[5823],"top:-3.2em;",[78,19479],{"className":19480,"style":19481},[4710],"height:3.2em;",[78,19483,19486,19489,19529,19532,19535,19538,19579,19610,19613,19616,19619,19622,19662,19665,19668,19671,19711,19740,19743,19746,19749,19752,19755,19758,19761,19764,19804,19807,19810,19813,19853],{"className":19484,"style":19485},[4667],"padding-left:1em;",[78,19487,4594],{"className":19488},[4674],[78,19490,19492,19495],{"className":19491},[4667],[78,19493,17143],{"className":19494},[4667,4678],[78,19496,19498],{"className":19497},[4689],[78,19499,19501,19521],{"className":19500},[4693,4694],[78,19502,19504,19518],{"className":19503},[4698],[78,19505,19507],{"className":19506,"style":18264},[4702],[78,19508,19509,19512],{"style":4706},[78,19510],{"className":19511,"style":4711},[4710],[78,19513,19515],{"className":19514},[4715,4716,4717,4718],[78,19516,469],{"className":19517},[4667,4718],[78,19519,4726],{"className":19520},[4725],[78,19522,19524],{"className":19523},[4698],[78,19525,19527],{"className":19526,"style":4733},[4702],[78,19528],{},[78,19530],{"className":19531,"style":5143},[4739],[78,19533,17848],{"className":19534},[7450],[78,19536],{"className":19537,"style":5143},[4739],[78,19539,19541,19544],{"className":19540},[4667],[78,19542,17148],{"className":19543,"style":17276},[4667,4678],[78,19545,19547],{"className":19546},[4689],[78,19548,19550,19571],{"className":19549},[4693,4694],[78,19551,19553,19568],{"className":19552},[4698],[78,19554,19556],{"className":19555,"style":18264},[4702],[78,19557,19559,19562],{"style":19558},"top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;",[78,19560],{"className":19561,"style":4711},[4710],[78,19563,19565],{"className":19564},[4715,4716,4717,4718],[78,19566,469],{"className":19567},[4667,4718],[78,19569,4726],{"className":19570},[4725],[78,19572,19574],{"className":19573},[4698],[78,19575,19577],{"className":19576,"style":4733},[4702],[78,19578],{},[78,19580,19582,19585],{"className":19581},[4682],[78,19583,4604],{"className":19584},[4682],[78,19586,19588],{"className":19587},[4689],[78,19589,19591],{"className":19590},[4693],[78,19592,19594],{"className":19593},[4698],[78,19595,19598],{"className":19596,"style":19597},[4702],"height:0.7401em;",[78,19599,19601,19604],{"style":19600},"top:-2.989em;margin-right:0.05em;",[78,19602],{"className":19603,"style":4711},[4710],[78,19605,19607],{"className":19606},[4715,4716,4717,4718],[78,19608,472],{"className":19609},[4667,4718],[78,19611],{"className":19612,"style":5143},[4739],[78,19614,7351],{"className":19615},[7450],[78,19617],{"className":19618,"style":5143},[4739],[78,19620,4594],{"className":19621},[4674],[78,19623,19625,19628],{"className":19624},[4667],[78,19626,17143],{"className":19627},[4667,4678],[78,19629,19631],{"className":19630},[4689],[78,19632,19634,19654],{"className":19633},[4693,4694],[78,19635,19637,19651],{"className":19636},[4698],[78,19638,19640],{"className":19639,"style":18264},[4702],[78,19641,19642,19645],{"style":4706},[78,19643],{"className":19644,"style":4711},[4710],[78,19646,19648],{"className":19647},[4715,4716,4717,4718],[78,19649,472],{"className":19650},[4667,4718],[78,19652,4726],{"className":19653},[4725],[78,19655,19657],{"className":19656},[4698],[78,19658,19660],{"className":19659,"style":4733},[4702],[78,19661],{},[78,19663],{"className":19664,"style":5143},[4739],[78,19666,17848],{"className":19667},[7450],[78,19669],{"className":19670,"style":5143},[4739],[78,19672,19674,19677],{"className":19673},[4667],[78,19675,17148],{"className":19676,"style":17276},[4667,4678],[78,19678,19680],{"className":19679},[4689],[78,19681,19683,19703],{"className":19682},[4693,4694],[78,19684,19686,19700],{"className":19685},[4698],[78,19687,19689],{"className":19688,"style":18264},[4702],[78,19690,19691,19694],{"style":19558},[78,19692],{"className":19693,"style":4711},[4710],[78,19695,19697],{"className":19696},[4715,4716,4717,4718],[78,19698,472],{"className":19699},[4667,4718],[78,19701,4726],{"className":19702},[4725],[78,19704,19706],{"className":19705},[4698],[78,19707,19709],{"className":19708,"style":4733},[4702],[78,19710],{},[78,19712,19714,19717],{"className":19713},[4682],[78,19715,4604],{"className":19716},[4682],[78,19718,19720],{"className":19719},[4689],[78,19721,19723],{"className":19722},[4693],[78,19724,19726],{"className":19725},[4698],[78,19727,19729],{"className":19728,"style":19597},[4702],[78,19730,19731,19734],{"style":19600},[78,19732],{"className":19733,"style":4711},[4710],[78,19735,19737],{"className":19736},[4715,4716,4717,4718],[78,19738,472],{"className":19739},[4667,4718],[78,19741],{"className":19742,"style":5143},[4739],[78,19744,7351],{"className":19745},[7450],[78,19747],{"className":19748,"style":5143},[4739],[78,19750,18198],{"className":19751},[18342],[78,19753],{"className":19754,"style":5143},[4739],[78,19756,7351],{"className":19757},[7450],[78,19759],{"className":19760,"style":5143},[4739],[78,19762,4594],{"className":19763},[4674],[78,19765,19767,19770],{"className":19766},[4667],[78,19768,17143],{"className":19769},[4667,4678],[78,19771,19773],{"className":19772},[4689],[78,19774,19776,19796],{"className":19775},[4693,4694],[78,19777,19779,19793],{"className":19778},[4698],[78,19780,19782],{"className":19781,"style":5279},[4702],[78,19783,19784,19787],{"style":4706},[78,19785],{"className":19786,"style":4711},[4710],[78,19788,19790],{"className":19789},[4715,4716,4717,4718],[78,19791,19],{"className":19792},[4667,4678,4718],[78,19794,4726],{"className":19795},[4725],[78,19797,19799],{"className":19798},[4698],[78,19800,19802],{"className":19801,"style":4733},[4702],[78,19803],{},[78,19805],{"className":19806,"style":5143},[4739],[78,19808,17848],{"className":19809},[7450],[78,19811],{"className":19812,"style":5143},[4739],[78,19814,19816,19819],{"className":19815},[4667],[78,19817,17148],{"className":19818,"style":17276},[4667,4678],[78,19820,19822],{"className":19821},[4689],[78,19823,19825,19845],{"className":19824},[4693,4694],[78,19826,19828,19842],{"className":19827},[4698],[78,19829,19831],{"className":19830,"style":5279},[4702],[78,19832,19833,19836],{"style":19558},[78,19834],{"className":19835,"style":4711},[4710],[78,19837,19839],{"className":19838},[4715,4716,4717,4718],[78,19840,19],{"className":19841},[4667,4678,4718],[78,19843,4726],{"className":19844},[4725],[78,19846,19848],{"className":19847},[4698],[78,19849,19851],{"className":19850,"style":4733},[4702],[78,19852],{},[78,19854,19856,19859],{"className":19855},[4682],[78,19857,4604],{"className":19858},[4682],[78,19860,19862],{"className":19861},[4689],[78,19863,19865],{"className":19864},[4693],[78,19866,19868],{"className":19867},[4698],[78,19869,19871],{"className":19870,"style":19597},[4702],[78,19872,19873,19876],{"style":19600},[78,19874],{"className":19875,"style":4711},[4710],[78,19877,19879],{"className":19878},[4715,4716,4717,4718],[78,19880,472],{"className":19881},[4667,4718],[78,19883,19885,19888],{"style":19884},"top:-2.9439em;",[78,19886],{"className":19887,"style":19481},[4710],[78,19889,19892],{"className":19890,"style":19891},[5881],"min-width:1.02em;height:1.28em;",[5884,19893,19896],{"xmlns":5886,"width":5887,"height":19894,"viewBox":19895,"preserveAspectRatio":5890},"1.28em","0 0 400000 1296",[5892,19897],{"d":19898},"M263,681c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl0 -0\nc4.7,-7.3,11,-11,19,-11\nH40000v40H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM1001 80h400000v40h-400000z",[78,19900,4726],{"className":19901},[4725],[78,19903,19905],{"className":19904},[4698],[78,19906,19909],{"className":19907,"style":19908},[4702],"height:0.2561em;",[78,19910],{},[13,19912,17388,19913,1018,20144,20375,20376,1018,20447,17770,20517,1018,20545,20573,20574,20603],{},[78,19914,19916,19964],{"className":19915},[4570],[78,19917,19919],{"className":19918},[4574],[4576,19920,19921],{"xmlns":4578},[4581,19922,19923,19961],{},[4584,19924,19925,19927,19929,19931,19937,19939,19945,19947,19949,19951,19953,19959],{},[4596,19926,17143],{},[4591,19928,4609],{},[4591,19930,4594],{"stretchy":4593},[4600,19932,19933,19935],{},[4596,19934,17143],{},[7077,19936,469],{},[4591,19938,2066],{"separator":1419},[4600,19940,19941,19943],{},[4596,19942,17143],{},[7077,19944,472],{},[4591,19946,2066],{"separator":1419},[4591,19948,18198],{},[4587,19950,18201],{},[4591,19952,2066],{"separator":1419},[4600,19954,19955,19957],{},[4596,19956,17143],{},[4596,19958,19],{},[4591,19960,4604],{"stretchy":4593},[4647,19962,19963],{"encoding":4649},"A=(A_1, A_2, \\cdots, A_n)",[78,19965,19967,19985],{"className":19966,"ariaHidden":1419},[4654],[78,19968,19970,19973,19976,19979,19982],{"className":19969},[4658],[78,19971],{"className":19972,"style":18224},[4662],[78,19974,17143],{"className":19975},[4667,4678],[78,19977],{"className":19978,"style":4740},[4739],[78,19980,4609],{"className":19981},[4744],[78,19983],{"className":19984,"style":4740},[4739],[78,19986,19988,19991,19994,20034,20037,20040,20080,20083,20086,20089,20092,20095,20098,20101,20141],{"className":19987},[4658],[78,19989],{"className":19990,"style":4663},[4662],[78,19992,4594],{"className":19993},[4674],[78,19995,19997,20000],{"className":19996},[4667],[78,19998,17143],{"className":19999},[4667,4678],[78,20001,20003],{"className":20002},[4689],[78,20004,20006,20026],{"className":20005},[4693,4694],[78,20007,20009,20023],{"className":20008},[4698],[78,20010,20012],{"className":20011,"style":18264},[4702],[78,20013,20014,20017],{"style":4706},[78,20015],{"className":20016,"style":4711},[4710],[78,20018,20020],{"className":20019},[4715,4716,4717,4718],[78,20021,469],{"className":20022},[4667,4718],[78,20024,4726],{"className":20025},[4725],[78,20027,20029],{"className":20028},[4698],[78,20030,20032],{"className":20031,"style":4733},[4702],[78,20033],{},[78,20035,2066],{"className":20036},[5126],[78,20038],{"className":20039,"style":4839},[4739],[78,20041,20043,20046],{"className":20042},[4667],[78,20044,17143],{"className":20045},[4667,4678],[78,20047,20049],{"className":20048},[4689],[78,20050,20052,20072],{"className":20051},[4693,4694],[78,20053,20055,20069],{"className":20054},[4698],[78,20056,20058],{"className":20057,"style":18264},[4702],[78,20059,20060,20063],{"style":4706},[78,20061],{"className":20062,"style":4711},[4710],[78,20064,20066],{"className":20065},[4715,4716,4717,4718],[78,20067,472],{"className":20068},[4667,4718],[78,20070,4726],{"className":20071},[4725],[78,20073,20075],{"className":20074},[4698],[78,20076,20078],{"className":20077,"style":4733},[4702],[78,20079],{},[78,20081,2066],{"className":20082},[5126],[78,20084],{"className":20085,"style":4839},[4739],[78,20087,18198],{"className":20088},[18342],[78,20090],{"className":20091,"style":4839},[4739],[78,20093],{"className":20094,"style":4839},[4739],[78,20096,2066],{"className":20097},[5126],[78,20099],{"className":20100,"style":4839},[4739],[78,20102,20104,20107],{"className":20103},[4667],[78,20105,17143],{"className":20106},[4667,4678],[78,20108,20110],{"className":20109},[4689],[78,20111,20113,20133],{"className":20112},[4693,4694],[78,20114,20116,20130],{"className":20115},[4698],[78,20117,20119],{"className":20118,"style":5279},[4702],[78,20120,20121,20124],{"style":4706},[78,20122],{"className":20123,"style":4711},[4710],[78,20125,20127],{"className":20126},[4715,4716,4717,4718],[78,20128,19],{"className":20129},[4667,4678,4718],[78,20131,4726],{"className":20132},[4725],[78,20134,20136],{"className":20135},[4698],[78,20137,20139],{"className":20138,"style":4733},[4702],[78,20140],{},[78,20142,4604],{"className":20143},[4682],[78,20145,20147,20195],{"className":20146},[4570],[78,20148,20150],{"className":20149},[4574],[4576,20151,20152],{"xmlns":4578},[4581,20153,20154,20192],{},[4584,20155,20156,20158,20160,20162,20168,20170,20176,20178,20180,20182,20184,20190],{},[4596,20157,17148],{},[4591,20159,4609],{},[4591,20161,4594],{"stretchy":4593},[4600,20163,20164,20166],{},[4596,20165,17148],{},[7077,20167,469],{},[4591,20169,2066],{"separator":1419},[4600,20171,20172,20174],{},[4596,20173,17148],{},[7077,20175,472],{},[4591,20177,2066],{"separator":1419},[4591,20179,18198],{},[4587,20181,18201],{},[4591,20183,2066],{"separator":1419},[4600,20185,20186,20188],{},[4596,20187,17148],{},[4596,20189,19],{},[4591,20191,4604],{"stretchy":4593},[4647,20193,20194],{"encoding":4649},"B=(B_1, B_2, \\cdots, B_n)",[78,20196,20198,20216],{"className":20197,"ariaHidden":1419},[4654],[78,20199,20201,20204,20207,20210,20213],{"className":20200},[4658],[78,20202],{"className":20203,"style":18224},[4662],[78,20205,17148],{"className":20206,"style":17276},[4667,4678],[78,20208],{"className":20209,"style":4740},[4739],[78,20211,4609],{"className":20212},[4744],[78,20214],{"className":20215,"style":4740},[4739],[78,20217,20219,20222,20225,20265,20268,20271,20311,20314,20317,20320,20323,20326,20329,20332,20372],{"className":20218},[4658],[78,20220],{"className":20221,"style":4663},[4662],[78,20223,4594],{"className":20224},[4674],[78,20226,20228,20231],{"className":20227},[4667],[78,20229,17148],{"className":20230,"style":17276},[4667,4678],[78,20232,20234],{"className":20233},[4689],[78,20235,20237,20257],{"className":20236},[4693,4694],[78,20238,20240,20254],{"className":20239},[4698],[78,20241,20243],{"className":20242,"style":18264},[4702],[78,20244,20245,20248],{"style":19558},[78,20246],{"className":20247,"style":4711},[4710],[78,20249,20251],{"className":20250},[4715,4716,4717,4718],[78,20252,469],{"className":20253},[4667,4718],[78,20255,4726],{"className":20256},[4725],[78,20258,20260],{"className":20259},[4698],[78,20261,20263],{"className":20262,"style":4733},[4702],[78,20264],{},[78,20266,2066],{"className":20267},[5126],[78,20269],{"className":20270,"style":4839},[4739],[78,20272,20274,20277],{"className":20273},[4667],[78,20275,17148],{"className":20276,"style":17276},[4667,4678],[78,20278,20280],{"className":20279},[4689],[78,20281,20283,20303],{"className":20282},[4693,4694],[78,20284,20286,20300],{"className":20285},[4698],[78,20287,20289],{"className":20288,"style":18264},[4702],[78,20290,20291,20294],{"style":19558},[78,20292],{"className":20293,"style":4711},[4710],[78,20295,20297],{"className":20296},[4715,4716,4717,4718],[78,20298,472],{"className":20299},[4667,4718],[78,20301,4726],{"className":20302},[4725],[78,20304,20306],{"className":20305},[4698],[78,20307,20309],{"className":20308,"style":4733},[4702],[78,20310],{},[78,20312,2066],{"className":20313},[5126],[78,20315],{"className":20316,"style":4839},[4739],[78,20318,18198],{"className":20319},[18342],[78,20321],{"className":20322,"style":4839},[4739],[78,20324],{"className":20325,"style":4839},[4739],[78,20327,2066],{"className":20328},[5126],[78,20330],{"className":20331,"style":4839},[4739],[78,20333,20335,20338],{"className":20334},[4667],[78,20336,17148],{"className":20337,"style":17276},[4667,4678],[78,20339,20341],{"className":20340},[4689],[78,20342,20344,20364],{"className":20343},[4693,4694],[78,20345,20347,20361],{"className":20346},[4698],[78,20348,20350],{"className":20349,"style":5279},[4702],[78,20351,20352,20355],{"style":19558},[78,20353],{"className":20354,"style":4711},[4710],[78,20356,20358],{"className":20357},[4715,4716,4717,4718],[78,20359,19],{"className":20360},[4667,4678,4718],[78,20362,4726],{"className":20363},[4725],[78,20365,20367],{"className":20366},[4698],[78,20368,20370],{"className":20369,"style":4733},[4702],[78,20371],{},[78,20373,4604],{"className":20374},[4682]," 是两个 n 维向量，",[78,20377,20379,20397],{"className":20378},[4570],[78,20380,20382],{"className":20381},[4574],[4576,20383,20384],{"xmlns":4578},[4581,20385,20386,20394],{},[4584,20387,20388],{},[4600,20389,20390,20392],{},[4596,20391,17143],{},[4596,20393,39],{},[4647,20395,20396],{"encoding":4649},"A_i",[78,20398,20400],{"className":20399,"ariaHidden":1419},[4654],[78,20401,20403,20407],{"className":20402},[4658],[78,20404],{"className":20405,"style":20406},[4662],"height:0.8333em;vertical-align:-0.15em;",[78,20408,20410,20413],{"className":20409},[4667],[78,20411,17143],{"className":20412},[4667,4678],[78,20414,20416],{"className":20415},[4689],[78,20417,20419,20439],{"className":20418},[4693,4694],[78,20420,20422,20436],{"className":20421},[4698],[78,20423,20425],{"className":20424,"style":4703},[4702],[78,20426,20427,20430],{"style":4706},[78,20428],{"className":20429,"style":4711},[4710],[78,20431,20433],{"className":20432},[4715,4716,4717,4718],[78,20434,39],{"className":20435},[4667,4678,4718],[78,20437,4726],{"className":20438},[4725],[78,20440,20442],{"className":20441},[4698],[78,20443,20445],{"className":20444,"style":4733},[4702],[78,20446],{},[78,20448,20450,20468],{"className":20449},[4570],[78,20451,20453],{"className":20452},[4574],[4576,20454,20455],{"xmlns":4578},[4581,20456,20457,20465],{},[4584,20458,20459],{},[4600,20460,20461,20463],{},[4596,20462,17148],{},[4596,20464,39],{},[4647,20466,20467],{"encoding":4649},"B_i",[78,20469,20471],{"className":20470,"ariaHidden":1419},[4654],[78,20472,20474,20477],{"className":20473},[4658],[78,20475],{"className":20476,"style":20406},[4662],[78,20478,20480,20483],{"className":20479},[4667],[78,20481,17148],{"className":20482,"style":17276},[4667,4678],[78,20484,20486],{"className":20485},[4689],[78,20487,20489,20509],{"className":20488},[4693,4694],[78,20490,20492,20506],{"className":20491},[4698],[78,20493,20495],{"className":20494,"style":4703},[4702],[78,20496,20497,20500],{"style":19558},[78,20498],{"className":20499,"style":4711},[4710],[78,20501,20503],{"className":20502},[4715,4716,4717,4718],[78,20504,39],{"className":20505},[4667,4678,4718],[78,20507,4726],{"className":20508},[4725],[78,20510,20512],{"className":20511},[4698],[78,20513,20515],{"className":20514,"style":4733},[4702],[78,20516],{},[78,20518,20520,20533],{"className":20519},[4570],[78,20521,20523],{"className":20522},[4574],[4576,20524,20525],{"xmlns":4578},[4581,20526,20527,20531],{},[4584,20528,20529],{},[4596,20530,17143],{},[4647,20532,17143],{"encoding":4649},[78,20534,20536],{"className":20535,"ariaHidden":1419},[4654],[78,20537,20539,20542],{"className":20538},[4658],[78,20540],{"className":20541,"style":18224},[4662],[78,20543,17143],{"className":20544},[4667,4678],[78,20546,20548,20561],{"className":20547},[4570],[78,20549,20551],{"className":20550},[4574],[4576,20552,20553],{"xmlns":4578},[4581,20554,20555,20559],{},[4584,20556,20557],{},[4596,20558,17148],{},[4647,20560,17148],{"encoding":4649},[78,20562,20564],{"className":20563,"ariaHidden":1419},[4654],[78,20565,20567,20570],{"className":20566},[4658],[78,20568],{"className":20569,"style":18224},[4662],[78,20571,17148],{"className":20572,"style":17276},[4667,4678]," 的第 ",[78,20575,20577,20590],{"className":20576},[4570],[78,20578,20580],{"className":20579},[4574],[4576,20581,20582],{"xmlns":4578},[4581,20583,20584,20588],{},[4584,20585,20586],{},[4596,20587,39],{},[4647,20589,39],{"encoding":4649},[78,20591,20593],{"className":20592,"ariaHidden":1419},[4654],[78,20594,20596,20600],{"className":20595},[4658],[78,20597],{"className":20598,"style":20599},[4662],"height:0.6595em;",[78,20601,39],{"className":20602},[4667,4678]," 个分量。欧式距离通常被简称为 L2，其中 L 表示长度，2 就是上述计算公式中的指数 2。",[13,20605,20606],{},"（在我们的论文中，用一个样本的向量召回相似样本的向量时，我们通常会选择使用欧式距离作为相似度度量，因为欧式距离关注的是向量之间的差异程度，而余弦相似度关注的是向量之间的方向相似度。）",[7759,20608,20610],{"id":20609},"为什么需要向量数据库","为什么需要向量数据库？",[10548,20612,20613],{"id":20613},"向量数据与传统数据的差异",[2285,20615,20616,20619,20622,20625],{},[52,20617,20618],{},"维数差异：向量数据通常是高维的，而传统数据（如关系型数据库）通常是低维的。我们无法简单的将传统数据中的每个特征映射到一个维度上，而向量数据可以直接将每个特征表示为一个维度上的数值。我们在设计向量数据库的底层存储结构时可以更好地按快去规划存储空间，从而优化存储效率。",[52,20620,20621],{},"字段内相关性差异：向量数据多个维度之间的相关性通常较高，这些维度是神经网络经过学习之后提取出来的，因此往往要对多个字段组合计算才能比较准确地衡量两个向量之间的相似度。向量数据很少单独在某一个维度上作比较，多个维度更多地是一个集合，它们同时行动，彼此相关。而传统数据格式的多个键-值对是完全独立的个体，它们独立代表了数据的一个方面。",[52,20623,20624],{},"优化手段差异：向量数据的格式单一，每个维度的数据往往都是固定的数据格式，这可以帮我们找到一些数学上的优化手段，例如使用索引结构来加速向量的检索。",[52,20626,20627],{},"使用方法差异：传统的数据格式基于关键词进行精确匹配，不会去理解词语背后的语义。而向量数据的匹配是基于语义理解的，也许两个词看起来差异很大，但其实语义很接近。（“玻璃”和“玻璃心”；“天气不错”和”晴空万里“）",[10548,20629,20630],{"id":20630},"向量数据库的设计",[2285,20632,20633,20636,20639],{},[52,20634,20635],{},"结合向量数据格式设计相应的存储、索引和查询组件，面向向量数据库中独特的“向量”部分，把向量数据的管理能力做到极致；",[52,20637,20638],{},"重视数据库技术多年积累的通用能力，将这些能力应用到向量数据库中，向量数据库的本质依然是数据库系统；",[52,20640,20641],{},"轻装上阵，不急于补充传统数据库的都有能力，在演进过程中逐步为向量数据库增加个功能，小步快跑地应对AI技术的快速发展。",[13,20643,20644],{},"向量数据本质上是一种结构化的数据形式，它由非结构化数据通过向量化技术转化而来，从而成为计算机可以理解的数据。",[107,20646,20648],{"id":20647},"第-3-章","第 3 章",[7759,20650,20651],{"id":20651},"基础能力",[10548,20653,20654],{"id":20654},"逻辑层次",[13,20656,20657],{},"向量数据库通常包含五个逻辑层次，分别是实例、库、集合、文档和字段。其中实例位于最顶层，字段位于最底层，五者是依次向下包含的关系，共同构建了向量数据库的逻辑结构。",[114,20659,20662],{"className":20660,"code":20661,"language":299},[297],"向量数据库\n├─ 实例（instance）：向量数据库资源管理的载体，实现向量数据库逻辑概念与物理概念之间的映射\n│  ├─ 物理资源集合\n│  ├─ 连接地址\n│  └─ 授权访问信息\n├─ 库（database）：逻辑上相关的集合组合的容器，一个实例可以容纳多个库，一个库汇集了一系列集合\n│  ├─ 逻辑上相关的集合组合\n│  ├─ 数据隔离\n│  └─ 统一管理\n├─ 集合（collection）：存储向量数据的逻辑载体，类似于关系型数据库中的表（shardNum 表示数据分片数\u002FreplicaNum 表示副本数\u002Findexes 表示索引配置）\n│  ├─ 多个字段的组合\n│  ├─ 可靠性和可用性参数配置\n│  └─ 索引类型定义\n├─ 文档（document）：相当于关系型数据库中的一行数据\n│  ├─ 多个字段的组合\n│  ├─ 数据存储的最底层完整单元\n│  └─ 数据操作的基本单位\n└─ 字段（field）：向量数据库中的数据最小单位，文档中的单个数据项，代表了文档的一个属性或特征\n   ├─ 标量字段\n   │  ├─ 文本\n   │  ├─ 数值\n   │  └─ 日期\n   └─ 向量字段\n      ├─ 向量数据\n      └─ 索引类型（如扁平、HNSW、IVF）\n",[17,20663,20661],{"__ignoreMap":119},[10548,20665,20666],{"id":20666},"索引",[2285,20668,20669,20672],{},[52,20670,20671],{},"主键索引（Primary Key Index）：每个文档都有一个唯一的标识符，称为主键。主键索引用于快速定位和访问特定文档，类似于关系型数据库中的主键索引。",[52,20673,20674],{},"向量索引（Vector Index）：为了支持向量数据的快速检索，向量数据库通常会为向量字段创建索引。这些索引可以基于不同的算法，如扁平索引、HNSW 索引、IVF 索引等。向量索引的目的是将向量数据映射到一个低维空间，使得在该空间中进行相似度计算变得高效。\n主流向量索引方法的重要信息",[8366,20676,20677,20698],{},[8369,20678,20679],{},[8372,20680,20681,20684,20687,20690,20693,20695],{},[8375,20682,20683],{},"向量索引",[8375,20685,20686],{},"简洁描述",[8375,20688,20689],{},"优点",[8375,20691,20692],{},"缺点",[8375,20694,14455],{},[8375,20696,20697],{},"参数配置",[8386,20699,20700,20738,20782],{},[8372,20701,20702,20705,20708,20717,20726,20735],{},[8391,20703,20704],{},"扁平索引",[8391,20706,20707],{},"全量比较所有向量的暴力搜索方法",[8391,20709,20710,20711,20713,20714,20716],{},"1. 实现简单",[2996,20712],{},"2. 无索引构建开销",[2996,20715],{},"3. 搜索结果精确",[8391,20718,20719,20720,20722,20723,20725],{},"1. 搜索速度慢",[2996,20721],{},"2. 内存占用大",[2996,20724],{},"3. 不适合大规模数据",[8391,20727,20728,20729,20731,20732,20734],{},"1. 小规模数据集",[2996,20730],{},"2. 对搜索精度要求极高的场景",[2996,20733],{},"3. 向量维度较低的情况",[8391,20736,20737],{},"无特殊参数",[8372,20739,20740,20743,20746,20755,20764,20773],{},[8391,20741,20742],{},"HNSW",[8391,20744,20745],{},"分层图索引结构，通过构建多层导航图加速搜索",[8391,20747,20748,20749,20751,20752,20754],{},"1. 搜索速度快",[2996,20750],{},"2. 检索精度高",[2996,20753],{},"3. 支持动态插入",[8391,20756,20757,20758,20760,20761,20763],{},"1. 索引构建时间长",[2996,20759],{},"2. 内存占用较大",[2996,20762],{},"3. 索引构建参数调优复杂",[8391,20765,20766,20767,20769,20770,20772],{},"1. 大规模数据集",[2996,20768],{},"2. 对搜索速度和精度要求都较高的场景",[2996,20771],{},"3. 在线服务场景",[8391,20774,20775,20776,20778,20779,20781],{},"1. M：每层的最大连接数",[2996,20777],{},"2. ef_construction：构建时的候选列表大小",[2996,20780],{},"3. ef_search：搜索时的候选列表大小",[8372,20783,20784,20787,20790,20799,20808,20816],{},[8391,20785,20786],{},"IVF",[8391,20788,20789],{},"倒排文件索引，将向量空间划分为多个聚类中心",[8391,20791,20792,20793,20795,20796,20798],{},"1. 索引构建速度快",[2996,20794],{},"2. 内存占用适中",[2996,20797],{},"3. 支持大规模数据",[8391,20800,20801,20802,20804,20805,20807],{},"1. 搜索精度略低于HNSW",[2996,20803],{},"2. 聚类中心数量影响搜索效果",[2996,20806],{},"3. 不适合高维向量",[8391,20809,20766,20810,20812,20813,20815],{},[2996,20811],{},"2. 对搜索速度要求较高，精度要求适中的场景",[2996,20814],{},"3. 批量查询场景",[8391,20817,20818,20819,20821,20822,20824],{},"1. nlist：聚类中心数量",[2996,20820],{},"2. nprobe：查询时访问的聚类中心数量",[2996,20823],{},"3. 距离计算方法",[2285,20826,20827,20830],{"start":138},[52,20828,20829],{},"过滤器索引（Filter Index）：为了支持基于非向量字段的条件查询，向量数据库通常会为这些字段创建过滤器索引。过滤器索引可以基于哈希索引、B+树索引等数据结构，用于快速定位满足条件的文档。",[52,20831,20832],{},"索引重建（Index Rebuild）：为了保持索引的效率和准确性，向量数据库通常会定期对索引进行重建。索引重建的过程包括删除旧索引、重新插入文档数据、重新构建索引结构等操作。重建索引的频率可以根据数据集的大小、写入频率和查询需求来调整。",[13,20834,20835],{},"关键指标：",[49,20837,20838,20841,20844],{},[52,20839,20840],{},"访问延迟（latency）：指从发送查询请求到返回查询结果的时间延迟。较低的访问延迟可以提高系统的响应速度和用户满意度。",[52,20842,20843],{},"实例吞吐量（throughput）：指系统在单位时间内能够处理的查询请求数量。较高的实例吞吐量可以支持更大的并发查询需求。",[52,20845,20846],{},"召回率（recall）：指系统返回的相关文档数量与查询条件下所有相关文档数量的比例。较高的召回率可以确保系统返回的文档与查询需求相符。",[7759,20848,20849],{"id":20849},"高阶能力",[10548,20851,20852],{"id":20852},"动态schema",[13,20854,20855],{},"在MySQL数据库中，所有字段必须事先定义。后续的数据写入过程会对字段的存在和类型进行严格的校验。\n向量数据库具备动态schema的能力，即可以在运行时动态添加、删除或修改字段。使用 update\u002Fupsert 接口进行数据写入和更新时，我们可以根据业务变化动态的增加或减少字段，从而提高应用使用数据库的灵活性。",[10548,20857,20858],{"id":20858},"别名机制",[13,20860,20861],{},"向量数据是通过预训练的量化模型生成的。同时，所有的数据都需要由同一个向量化模型生成。如果新旧模型生成的向量数据混合在一起使用，将对召回率产生负面影响。\n为了解决这个问题，向量数据库引入了别名机制。别名机制允许用户为每个字段指定一个别名，而不是直接使用字段名。通过别名机制，用户可以在不改变字段名的情况下，切换使用不同的向量化模型生成的向量数据。\n举个例子：假设客户端当前访问的集合名称为 A，我们可以在后台新建一个集合 B，并使用新的向量化模型生成的向量数据写入 B。写入成功后，可以将集合 B 的别名设置为 A，客户端仍使用 A 来访问数据，但是实际访问的是集合 B。",[10548,20863,20864],{"id":20864},"向量化",[13,20866,20867],{},"为了使用向量数据库，需要开发者自己选择合适的向量化模型对数据进行向量化。为了简化开发者的使用流程，向量数据库通常会提供一些机制，从而使开发者能够直接通过原始数据与向量数据库进行交互。",[10548,20869,20870],{"id":20870},"混合查询",[13,20872,20873],{},"混合查询结合了向量字段和标量字段，配合自定义的标量字段和过滤器条件表达式作为查询条件，实现对向量数据库的综合操作。",{"title":119,"searchDepth":144,"depth":144,"links":20875},[20876,20881],{"id":16752,"depth":132,"text":16753,"children":20877},[20878,20879,20880],{"id":16756,"depth":144,"text":16756},{"id":17082,"depth":144,"text":17082},{"id":20609,"depth":144,"text":20610},{"id":20647,"depth":132,"text":20648,"children":20882},[20883,20884],{"id":20651,"depth":144,"text":20651},{"id":20849,"depth":144,"text":20849},"2026-03-19",{},"\u002Flegacy-blog\u002F1773927948738",{"title":16745,"description":119},"legacy-blog\u002F1773927948738",[14968,7744,246,10715,14542],"DhONjkTYzPMbAhAoHAGiZ1ZxGYYJ2cw0pkRDt5FjkRw",{"id":20893,"title":20894,"assetBase":7,"author":8,"body":20895,"category":16218,"collection":233,"date":21172,"description":21173,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":21174,"navigation":128,"originalPath":239,"path":21175,"seo":21176,"source":243,"stem":21177,"tags":21178,"weight":250,"__hash__":21179},"content\u002Flegacy-blog\u002F1774096170470.md","236. 二叉树的最近公共祖先",{"type":10,"value":20896,"toc":21169},[20897,20904,20908,20913,20937,20941,20946,20967,20971,20983,20987,21019,21021,21023,21167],[13,20898,20899,20900,20903],{},"给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。\n百度百科中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（",[22,20901,20902],{},"一个节点也可以是它自己的祖先","）。”",[13,20905,20906],{},[22,20907,293],{},[13,20909,20910],{},[617,20911],{"alt":619,"src":20912},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_17740962641021.png",[72,20914,20915],{},[13,20916,20917,16269,20919,20922,20923,1048,20925,20927,20928,20930,20931,20933,20934],{},[22,20918,1040],{},[78,20920,20921],{},"3,5,1,6,2,0,8,null,null,7,4",", p = 5, q = 1\n",[22,20924,1047],{},[22,20926,1051],{}," 节点 ",[17,20929,11047],{}," 和节点 ",[17,20932,469],{}," 的最近公共祖先是节点 ",[17,20935,20936],{},"3 。",[13,20938,20939],{},[22,20940,306],{},[13,20942,20943],{},[617,20944],{"alt":619,"src":20945},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177409627131549.png",[72,20947,20948],{},[13,20949,20950,16269,20952,20954,20955,3233,20957,20927,20959,20930,20961,20933,20963,20966],{},[22,20951,1040],{},[78,20953,20921],{},", p = 5, q = 4\n",[22,20956,1047],{},[22,20958,1051],{},[17,20960,11047],{},[17,20962,1014],{},[17,20964,20965],{},"5 。","因为根据定义最近公共祖先节点可以为节点本身。",[13,20968,20969],{},[22,20970,1265],{},[72,20972,20973],{},[13,20974,20975,16269,20977,20980,20981,1690],{},[22,20976,1040],{},[78,20978,20979],{},"1,2",", p = 1, q = 2\n",[22,20982,1047],{},[13,20984,20985],{},[22,20986,317],{},[49,20988,20989,20995,20999,21007,21012],{},[52,20990,20991,20992,20994],{},"树中节点数目在范围 ",[17,20993,13552],{}," 内。",[52,20996,20997],{},[17,20998,16311],{},[52,21000,21001,21002,1052,21005,285],{},"所有 ",[17,21003,21004],{},"Node.val",[17,21006,1517],{},[52,21008,21009],{},[17,21010,21011],{},"p != q",[52,21013,21014,1018,21016,21018],{},[17,21015,13],{},[17,21017,5067],{}," 均存在于给定的二叉树中。",[107,21020,109],{"id":109},[13,21022,112],{},[114,21024,21026],{"className":116,"code":21025,"language":118,"meta":119,"style":119},"\n# Definition for a binary tree node.\n# class TreeNode(object):\n#     def __init__(self, x):\n#         self.val = x\n#         self.left = None\n#         self.right = None\n\nclass Solution(object):\n    def lowestCommonAncestor(self, root, p, q):\n        # 递归遍历，遇到目标节点或空节点直接返回，作为递归终止条件。\n        # 左右子树返回结果都非空时，当前节点是最近公共祖先；仅一侧有结果时，该结果就是答案。\n        def getNode(node):\n            if not node or node == p or node == q:\n                return node\n            left_res = getNode(node.left)\n            right_res = getNode(node.right)\n\n            if left_res and right_res:\n                return node\n            else:\n                return left_res or right_res\n        \n        return getNode(root)\n        \"\"\"\n        :type root: TreeNode\n        :type p: TreeNode\n        :type q: TreeNode\n        :rtype: TreeNode\n        \"\"\"\n\n",[17,21027,21028,21032,21036,21040,21045,21050,21055,21060,21064,21068,21073,21078,21083,21088,21093,21098,21103,21108,21112,21117,21121,21125,21130,21134,21139,21143,21148,21153,21158,21163],{"__ignoreMap":119},[78,21029,21030],{"class":124,"line":125},[78,21031,129],{"emptyLinePlaceholder":128},[78,21033,21034],{"class":124,"line":132},[78,21035,16084],{},[78,21037,21038],{"class":124,"line":138},[78,21039,16089],{},[78,21041,21042],{"class":124,"line":144},[78,21043,21044],{},"#     def __init__(self, x):\n",[78,21046,21047],{"class":124,"line":150},[78,21048,21049],{},"#         self.val = x\n",[78,21051,21052],{"class":124,"line":156},[78,21053,21054],{},"#         self.left = None\n",[78,21056,21057],{"class":124,"line":162},[78,21058,21059],{},"#         self.right = None\n",[78,21061,21062],{"class":124,"line":168},[78,21063,129],{"emptyLinePlaceholder":128},[78,21065,21066],{"class":124,"line":174},[78,21067,135],{},[78,21069,21070],{"class":124,"line":180},[78,21071,21072],{},"    def lowestCommonAncestor(self, root, p, q):\n",[78,21074,21075],{"class":124,"line":186},[78,21076,21077],{},"        # 递归遍历，遇到目标节点或空节点直接返回，作为递归终止条件。\n",[78,21079,21080],{"class":124,"line":192},[78,21081,21082],{},"        # 左右子树返回结果都非空时，当前节点是最近公共祖先；仅一侧有结果时，该结果就是答案。\n",[78,21084,21085],{"class":124,"line":198},[78,21086,21087],{},"        def getNode(node):\n",[78,21089,21090],{"class":124,"line":204},[78,21091,21092],{},"            if not node or node == p or node == q:\n",[78,21094,21095],{"class":124,"line":210},[78,21096,21097],{},"                return node\n",[78,21099,21100],{"class":124,"line":216},[78,21101,21102],{},"            left_res = getNode(node.left)\n",[78,21104,21105],{"class":124,"line":222},[78,21106,21107],{},"            right_res = getNode(node.right)\n",[78,21109,21110],{"class":124,"line":421},[78,21111,129],{"emptyLinePlaceholder":128},[78,21113,21114],{"class":124,"line":427},[78,21115,21116],{},"            if left_res and right_res:\n",[78,21118,21119],{"class":124,"line":433},[78,21120,21097],{},[78,21122,21123],{"class":124,"line":2443},[78,21124,699],{},[78,21126,21127],{"class":124,"line":2448},[78,21128,21129],{},"                return left_res or right_res\n",[78,21131,21132],{"class":124,"line":2454},[78,21133,1359],{},[78,21135,21136],{"class":124,"line":2460},[78,21137,21138],{},"        return getNode(root)\n",[78,21140,21141],{"class":124,"line":2465},[78,21142,207],{},[78,21144,21145],{"class":124,"line":2470},[78,21146,21147],{},"        :type root: TreeNode\n",[78,21149,21150],{"class":124,"line":2903},[78,21151,21152],{},"        :type p: TreeNode\n",[78,21154,21155],{"class":124,"line":2909},[78,21156,21157],{},"        :type q: TreeNode\n",[78,21159,21160],{"class":124,"line":11477},[78,21161,21162],{},"        :rtype: TreeNode\n",[78,21164,21165],{"class":124,"line":13374},[78,21166,207],{},[226,21168,228],{},{"title":119,"searchDepth":144,"depth":144,"links":21170},[21171],{"id":109,"depth":132,"text":109},"2026-03-21","给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。\n百度百科中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（一个节点也可以是它自己的祖先）。”",{},"\u002Flegacy-blog\u002F1774096170470",{"title":20894,"description":21173},"legacy-blog\u002F1774096170470",[246,16226,16227],"Z5jPJ84BTmx_4M3kj7viPrHcnUqa3vTDF4cMr6e9lrw",{"id":21181,"title":21182,"assetBase":7,"author":8,"body":21183,"category":21464,"collection":233,"date":21172,"description":21465,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":21466,"navigation":128,"originalPath":239,"path":21467,"seo":21468,"source":243,"stem":21469,"tags":21470,"weight":250,"__hash__":21472},"content\u002Flegacy-blog\u002F1774098692322.md","450. 删除二叉搜索树中的节点",{"type":10,"value":21184,"toc":21461},[21185,21198,21206,21210,21215,21242,21246,21262,21267,21279,21283,21310,21312,21314,21459],[13,21186,21187,21188,21190,21191,21194,21195,21197],{},"给定一个二叉搜索树的根节点 ",[22,21189,16239],{}," 和一个值",[22,21192,21193],{},"key","，删除二叉搜索树中的",[22,21196,21193],{}," 对应的节点，并保证二叉搜索树的性质不变。返回二叉搜索树（有可能被更新）的根节点的引用。\n一般来说，删除节点可分为两个步骤：",[2285,21199,21200,21203],{},[52,21201,21202],{},"首先找到需要删除的节点；",[52,21204,21205],{},"如果找到了，删除它。",[13,21207,21208],{},[22,21209,70],{},[13,21211,21212],{},[617,21213],{"alt":619,"src":21214},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_17740988318751.jpeg",[72,21216,21217],{},[13,21218,21219,16269,21221,21224,21225,21227,21230,21232,21233,21235,21236,11315,21239],{},[22,21220,1040],{},[78,21222,21223],{},"5,3,6,2,4,null,7",", key = 3\n",[22,21226,1047],{},[78,21228,21229],{},"5,4,6,2,null,null,7",[22,21231,1051],{}," 给定需要删除的节点值是 3，所以我们首先找到 3 这个节点，然后删除它。\n一个正确的答案是 ",[78,21234,21229],{},", 如下图所示。\n另一个正确答案是 ",[78,21237,21238],{},"5,2,6,null,4,null,7",[617,21240],{"alt":619,"src":21241},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177409884443129.jpeg",[13,21243,21244],{},[22,21245,635],{},[72,21247,21248],{},[13,21249,21250,16269,21252,21254,21255,1052,21257,21259,21261],{},[22,21251,1433],{},[78,21253,21223],{},", key = 0\n",[22,21256,1440],{},[78,21258,21223],{},[22,21260,1444],{}," 二叉树不包含值为 0 的节点",[13,21263,21264],{},[22,21265,21266],{},"示例 3:",[72,21268,21269],{},[13,21270,21271,16269,21273,21254,21275,1052,21277],{},[22,21272,1433],{},[78,21274],{},[22,21276,1440],{},[78,21278],{},[13,21280,21281],{},[22,21282,88],{},[49,21284,21285,21292,21297,21300,21305],{},[52,21286,21287,21288,21291],{},"节点数的范围 ",[17,21289,21290],{},"[0, 104]",".",[52,21293,21294],{},[17,21295,21296],{},"-105 \u003C= Node.val \u003C= 105",[52,21298,21299],{},"节点值唯一",[52,21301,21302,21304],{},[17,21303,16239],{}," 是合法的二叉搜索树",[52,21306,21307],{},[17,21308,21309],{},"-105 \u003C= key \u003C= 105",[107,21311,109],{"id":109},[13,21313,112],{},[114,21315,21317],{"className":116,"code":21316,"language":118,"meta":119,"style":119},"\n# Definition for a binary tree node.\n# class TreeNode(object):\n#     def __init__(self, val=0, left=None, right=None):\n#         self.val = val\n#         self.left = left\n#         self.right = right\nclass Solution(object):\n    def deleteNode(self, root, key):\n        # 找到删除节点右子树的最小值，替换删除节点位置\n        if not root:\n            return None\n        if root.val > key:\n            root.left = self.deleteNode(root.left, key)\n        elif root.val \u003C key:\n            root.right = self.deleteNode(root.right, key)\n        else:\n            if not root.left or not root.right:\n                root = root.left if root.left else root.right\n            else:\n                cur = root.right\n                while cur.left:\n                    cur = cur.left\n                root.val = cur.val\n                root.right = self.deleteNode(root.right, cur.val)\n        return root\n        \"\"\"\n        :type root: Optional[TreeNode]\n        :type key: int\n        :rtype: Optional[TreeNode]\n        \"\"\"\n\n",[17,21318,21319,21323,21327,21331,21335,21339,21343,21347,21351,21356,21361,21365,21369,21374,21379,21384,21389,21393,21398,21403,21407,21412,21417,21422,21427,21432,21437,21441,21445,21450,21455],{"__ignoreMap":119},[78,21320,21321],{"class":124,"line":125},[78,21322,129],{"emptyLinePlaceholder":128},[78,21324,21325],{"class":124,"line":132},[78,21326,16084],{},[78,21328,21329],{"class":124,"line":138},[78,21330,16089],{},[78,21332,21333],{"class":124,"line":144},[78,21334,16094],{},[78,21336,21337],{"class":124,"line":150},[78,21338,13255],{},[78,21340,21341],{"class":124,"line":156},[78,21342,16103],{},[78,21344,21345],{"class":124,"line":162},[78,21346,16108],{},[78,21348,21349],{"class":124,"line":168},[78,21350,135],{},[78,21352,21353],{"class":124,"line":174},[78,21354,21355],{},"    def deleteNode(self, root, key):\n",[78,21357,21358],{"class":124,"line":180},[78,21359,21360],{},"        # 找到删除节点右子树的最小值，替换删除节点位置\n",[78,21362,21363],{"class":124,"line":186},[78,21364,16367],{},[78,21366,21367],{"class":124,"line":192},[78,21368,13871],{},[78,21370,21371],{"class":124,"line":198},[78,21372,21373],{},"        if root.val > key:\n",[78,21375,21376],{"class":124,"line":204},[78,21377,21378],{},"            root.left = self.deleteNode(root.left, key)\n",[78,21380,21381],{"class":124,"line":210},[78,21382,21383],{},"        elif root.val \u003C key:\n",[78,21385,21386],{"class":124,"line":216},[78,21387,21388],{},"            root.right = self.deleteNode(root.right, key)\n",[78,21390,21391],{"class":124,"line":222},[78,21392,15844],{},[78,21394,21395],{"class":124,"line":421},[78,21396,21397],{},"            if not root.left or not root.right:\n",[78,21399,21400],{"class":124,"line":427},[78,21401,21402],{},"                root = root.left if root.left else root.right\n",[78,21404,21405],{"class":124,"line":433},[78,21406,699],{},[78,21408,21409],{"class":124,"line":2443},[78,21410,21411],{},"                cur = root.right\n",[78,21413,21414],{"class":124,"line":2448},[78,21415,21416],{},"                while cur.left:\n",[78,21418,21419],{"class":124,"line":2454},[78,21420,21421],{},"                    cur = cur.left\n",[78,21423,21424],{"class":124,"line":2460},[78,21425,21426],{},"                root.val = cur.val\n",[78,21428,21429],{"class":124,"line":2465},[78,21430,21431],{},"                root.right = self.deleteNode(root.right, cur.val)\n",[78,21433,21434],{"class":124,"line":2470},[78,21435,21436],{},"        return root\n",[78,21438,21439],{"class":124,"line":2903},[78,21440,207],{},[78,21442,21443],{"class":124,"line":2909},[78,21444,16440],{},[78,21446,21447],{"class":124,"line":11477},[78,21448,21449],{},"        :type key: int\n",[78,21451,21452],{"class":124,"line":13374},[78,21453,21454],{},"        :rtype: Optional[TreeNode]\n",[78,21456,21457],{"class":124,"line":13380},[78,21458,207],{},[226,21460,228],{},{"title":119,"searchDepth":144,"depth":144,"links":21462},[21463],{"id":109,"depth":132,"text":109},"树 二叉搜索树","给定一个二叉搜索树的根节点 root 和一个值key，删除二叉搜索树中的key 对应的节点，并保证二叉搜索树的性质不变。返回二叉搜索树（有可能被更新）的根节点的引用。\n一般来说，删除节点可分为两个步骤：",{},"\u002Flegacy-blog\u002F1774098692322",{"title":21182,"description":21465},"legacy-blog\u002F1774098692322",[246,16226,21471],"二叉搜索树","oH6xfyRYgqAtc6NPTaM_VFNbTB0CdGev2NnI9A6Xvos",{"id":21474,"title":21475,"assetBase":7,"author":8,"body":21476,"category":21709,"collection":233,"date":21710,"description":21711,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":21712,"navigation":128,"originalPath":239,"path":21713,"seo":21714,"source":243,"stem":21715,"tags":21716,"weight":250,"__hash__":21717},"content\u002Flegacy-blog\u002F1774270965355.md","841. 钥匙和房间",{"type":10,"value":21477,"toc":21706},[21478,21517,21521,21539,21543,21562,21566,21600,21602,21604,21704],[13,21479,21480,21481,21483,21484,21486,21487,21489,21490,21492,21493,21496,21497,21500,21501,21504,21505,21507,21508,21511,21512,21514,21515,67],{},"有 ",[17,21482,19],{}," 个房间，房间按从 ",[17,21485,2949],{}," 到 ",[17,21488,63],{}," 编号。最初，除 ",[17,21491,2949],{}," 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而，你不能在没有获得钥匙的时候进入锁住的房间。\n当你进入一个房间，你可能会在里面找到一套 ",[22,21494,21495],{},"不同的钥匙","，每把钥匙上都有对应的房间号，即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。\n给你一个数组 ",[17,21498,21499],{},"rooms"," 其中 ",[17,21502,21503],{},"rooms[i]"," 是你进入 ",[17,21506,39],{}," 号房间可以获得的钥匙集合。如果能进入 ",[22,21509,21510],{},"所有"," 房间返回 ",[17,21513,1419],{},"，否则返回 ",[17,21516,4593],{},[13,21518,21519],{},[22,21520,293],{},[72,21522,21523],{},[13,21524,21525,21527,21528,2066,21530,2066,21532,2070,21534,1441,21536,21538],{},[22,21526,1040],{}," rooms = [[1],",[78,21529,472],{},[78,21531,1025],{},[78,21533],{},[22,21535,1047],{},[22,21537,1051],{},"\n我们从 0 号房间开始，拿到钥匙 1。\n之后我们去 1 号房间，拿到钥匙 2。\n然后我们去 2 号房间，拿到钥匙 3。\n最后我们去了 3 号房间。\n由于我们能够进入每个房间，我们返回 true。",[13,21540,21541],{},[22,21542,306],{},[72,21544,21545],{},[13,21546,21547,21549,21550,2066,21553,2066,21555,2070,21557,2542,21559,21561],{},[22,21548,1040],{}," rooms = [[1,3],",[78,21551,21552],{},"3,0,1",[78,21554,472],{},[78,21556,2949],{},[22,21558,1047],{},[22,21560,1051],{}," 我们不能进入 2 号房间。",[13,21563,21564],{},[22,21565,317],{},[49,21567,21568,21573,21578,21583,21588,21593],{},[52,21569,21570],{},[17,21571,21572],{},"n == rooms.length",[52,21574,21575],{},[17,21576,21577],{},"2 \u003C= n \u003C= 1000",[52,21579,21580],{},[17,21581,21582],{},"0 \u003C= rooms[i].length \u003C= 1000",[52,21584,21585],{},[17,21586,21587],{},"1 \u003C= sum(rooms[i].length) \u003C= 3000",[52,21589,21590],{},[17,21591,21592],{},"0 \u003C= rooms[i][j] \u003C n",[52,21594,21001,21595,21597,21598],{},[17,21596,21503],{}," 的值",[22,21599,1517],{},[107,21601,109],{"id":109},[13,21603,112],{},[114,21605,21607],{"className":116,"code":21606,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def canVisitAllRooms(self, rooms):\n        n = len(rooms)\n        res = [1] * n\n        res[0] = 0\n        from collections import deque\n        queue = deque(rooms[0])\n        while queue:\n            room_num = queue.popleft()  # 取出当前要访问的房间号\n            # 如果该房间未被访问过\n            if res[room_num] == 1:\n                res[room_num] = 0  # 标记为已访问\n                for key in rooms[room_num]:  # 将该房间的钥匙加入队列\n                    queue.append(key)\n        return sum(res) == 0\n        \"\"\"\n        :type rooms: List[List[int]]\n        :rtype: bool\n        \"\"\"\n\n",[17,21608,21609,21613,21617,21622,21627,21632,21637,21642,21647,21652,21657,21662,21667,21672,21677,21682,21687,21691,21696,21700],{"__ignoreMap":119},[78,21610,21611],{"class":124,"line":125},[78,21612,129],{"emptyLinePlaceholder":128},[78,21614,21615],{"class":124,"line":132},[78,21616,135],{},[78,21618,21619],{"class":124,"line":138},[78,21620,21621],{},"    def canVisitAllRooms(self, rooms):\n",[78,21623,21624],{"class":124,"line":144},[78,21625,21626],{},"        n = len(rooms)\n",[78,21628,21629],{"class":124,"line":150},[78,21630,21631],{},"        res = [1] * n\n",[78,21633,21634],{"class":124,"line":156},[78,21635,21636],{},"        res[0] = 0\n",[78,21638,21639],{"class":124,"line":162},[78,21640,21641],{},"        from collections import deque\n",[78,21643,21644],{"class":124,"line":168},[78,21645,21646],{},"        queue = deque(rooms[0])\n",[78,21648,21649],{"class":124,"line":174},[78,21650,21651],{},"        while queue:\n",[78,21653,21654],{"class":124,"line":180},[78,21655,21656],{},"            room_num = queue.popleft()  # 取出当前要访问的房间号\n",[78,21658,21659],{"class":124,"line":186},[78,21660,21661],{},"            # 如果该房间未被访问过\n",[78,21663,21664],{"class":124,"line":192},[78,21665,21666],{},"            if res[room_num] == 1:\n",[78,21668,21669],{"class":124,"line":198},[78,21670,21671],{},"                res[room_num] = 0  # 标记为已访问\n",[78,21673,21674],{"class":124,"line":204},[78,21675,21676],{},"                for key in rooms[room_num]:  # 将该房间的钥匙加入队列\n",[78,21678,21679],{"class":124,"line":210},[78,21680,21681],{},"                    queue.append(key)\n",[78,21683,21684],{"class":124,"line":216},[78,21685,21686],{},"        return sum(res) == 0\n",[78,21688,21689],{"class":124,"line":222},[78,21690,207],{},[78,21692,21693],{"class":124,"line":421},[78,21694,21695],{},"        :type rooms: List[List[int]]\n",[78,21697,21698],{"class":124,"line":427},[78,21699,1592],{},[78,21701,21702],{"class":124,"line":433},[78,21703,207],{},[226,21705,228],{},{"title":119,"searchDepth":144,"depth":144,"links":21707},[21708],{"id":109,"depth":132,"text":109},"深度优先搜索 广度优先搜索","2026-03-23","有 n 个房间，房间按从 0 到 n - 1 编号。最初，除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而，你不能在没有获得钥匙的时候进入锁住的房间。\n当你进入一个房间，你可能会在里面找到一套 不同的钥匙，每把钥匙上都有对应的房间号，即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。\n给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true，否则返回 false。",{},"\u002Flegacy-blog\u002F1774270965355",{"title":21475,"description":21711},"legacy-blog\u002F1774270965355",[246,16227,1192],"RmEdf70dAnjrFnbfeD8kK84iY7K_M6FwPQCAjndSOxE",{"id":21719,"title":21720,"assetBase":7,"author":8,"body":21721,"category":21709,"collection":233,"date":21710,"description":21978,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":21979,"navigation":128,"originalPath":239,"path":21980,"seo":21981,"source":243,"stem":21982,"tags":21983,"weight":250,"__hash__":21984},"content\u002Flegacy-blog\u002F1774272051966.md","547. 省份数量",{"type":10,"value":21722,"toc":21975},[21723,21771,21775,21780,21795,21799,21804,21818,21822,21857,21859,21861,21973],[13,21724,21480,21725,21727,21728,21730,21731,21733,21734,21730,21736,21738,21739,21730,21741,21743,21744,21747,21748,21750,21751,10730,21754,21757,21758,21760,21761,21763,21764,21767,21768,21770],{},[17,21726,19],{}," 个城市，其中一些彼此相连，另一些没有相连。如果城市 ",[17,21729,5009],{}," 与城市 ",[17,21732,12172],{}," 直接相连，且城市 ",[17,21735,12172],{},[17,21737,7360],{}," 直接相连，那么城市 ",[17,21740,5009],{},[17,21742,7360],{}," 间接相连。\n",[22,21745,21746],{},"省份"," 是一组直接或间接相连的城市，组内不含其他没有相连的城市。\n给你一个 ",[17,21749,12371],{}," 的矩阵 ",[17,21752,21753],{},"isConnected",[17,21755,21756],{},"isConnected[i][j] = 1"," 表示第 ",[17,21759,39],{}," 个城市和第 ",[17,21762,4635],{}," 个城市直接相连，而 ",[17,21765,21766],{},"isConnected[i][j] = 0"," 表示二者不直接相连。\n返回矩阵中 ",[22,21769,21746],{}," 的数量。",[13,21772,21773],{},[22,21774,293],{},[13,21776,21777],{},[617,21778],{"alt":619,"src":21779},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_17742721430102.jpeg",[72,21781,21782],{},[13,21783,21784,21786,21787,2066,21790,2070,21793,3639],{},[22,21785,1040],{}," isConnected = [[1,1,0],",[78,21788,21789],{},"1,1,0",[78,21791,21792],{},"0,0,1",[22,21794,1047],{},[13,21796,21797],{},[22,21798,306],{},[13,21800,21801],{},[617,21802],{"alt":619,"src":21803},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177427214968450.jpeg",[72,21805,21806],{},[13,21807,21808,21810,21811,2066,21814,2070,21816,2994],{},[22,21809,1040],{}," isConnected = [[1,0,0],",[78,21812,21813],{},"0,1,0",[78,21815,21792],{},[22,21817,1047],{},[13,21819,21820],{},[22,21821,317],{},[49,21823,21824,21828,21833,21838,21847,21852],{},[52,21825,21826],{},[17,21827,12484],{},[52,21829,21830],{},[17,21831,21832],{},"n == isConnected.length",[52,21834,21835],{},[17,21836,21837],{},"n == isConnected[i].length",[52,21839,21840,3848,21843,275,21845],{},[17,21841,21842],{},"isConnected[i][j]",[17,21844,469],{},[17,21846,2949],{},[52,21848,21849],{},[17,21850,21851],{},"isConnected[i][i] == 1",[52,21853,21854],{},[17,21855,21856],{},"isConnected[i][j] == isConnected[j][i]",[107,21858,109],{"id":109},[13,21860,112],{},[114,21862,21864],{"className":116,"code":21863,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def findCircleNum(self, isConnected):\n        n = len(isConnected)\n        visited = [False] * n\n        province_count = 0\n\n        def dfs(current):  # 遍历和current连通的所有城市\n            visited[current] = True\n            for j in range(n):\n                if isConnected[current][j] == 1 and not visited[j]:\n                    dfs(j)\n        \n        for i in range(n):  # 遍历所有城市\n            if not visited[i]:\n                province_count += 1\n                dfs(i)\n\n        return province_count\n        \"\"\"\n        :type isConnected: List[List[int]]\n        :rtype: int\n        \"\"\"\n\n",[17,21865,21866,21870,21874,21879,21884,21889,21894,21898,21903,21908,21913,21918,21923,21927,21932,21937,21942,21947,21951,21956,21960,21965,21969],{"__ignoreMap":119},[78,21867,21868],{"class":124,"line":125},[78,21869,129],{"emptyLinePlaceholder":128},[78,21871,21872],{"class":124,"line":132},[78,21873,135],{},[78,21875,21876],{"class":124,"line":138},[78,21877,21878],{},"    def findCircleNum(self, isConnected):\n",[78,21880,21881],{"class":124,"line":144},[78,21882,21883],{},"        n = len(isConnected)\n",[78,21885,21886],{"class":124,"line":150},[78,21887,21888],{},"        visited = [False] * n\n",[78,21890,21891],{"class":124,"line":156},[78,21892,21893],{},"        province_count = 0\n",[78,21895,21896],{"class":124,"line":162},[78,21897,129],{"emptyLinePlaceholder":128},[78,21899,21900],{"class":124,"line":168},[78,21901,21902],{},"        def dfs(current):  # 遍历和current连通的所有城市\n",[78,21904,21905],{"class":124,"line":174},[78,21906,21907],{},"            visited[current] = True\n",[78,21909,21910],{"class":124,"line":180},[78,21911,21912],{},"            for j in range(n):\n",[78,21914,21915],{"class":124,"line":186},[78,21916,21917],{},"                if isConnected[current][j] == 1 and not visited[j]:\n",[78,21919,21920],{"class":124,"line":192},[78,21921,21922],{},"                    dfs(j)\n",[78,21924,21925],{"class":124,"line":198},[78,21926,1359],{},[78,21928,21929],{"class":124,"line":204},[78,21930,21931],{},"        for i in range(n):  # 遍历所有城市\n",[78,21933,21934],{"class":124,"line":210},[78,21935,21936],{},"            if not visited[i]:\n",[78,21938,21939],{"class":124,"line":216},[78,21940,21941],{},"                province_count += 1\n",[78,21943,21944],{"class":124,"line":222},[78,21945,21946],{},"                dfs(i)\n",[78,21948,21949],{"class":124,"line":421},[78,21950,129],{"emptyLinePlaceholder":128},[78,21952,21953],{"class":124,"line":427},[78,21954,21955],{},"        return province_count\n",[78,21957,21958],{"class":124,"line":433},[78,21959,207],{},[78,21961,21962],{"class":124,"line":2443},[78,21963,21964],{},"        :type isConnected: List[List[int]]\n",[78,21966,21967],{"class":124,"line":2448},[78,21968,219],{},[78,21970,21971],{"class":124,"line":2454},[78,21972,207],{},[226,21974,228],{},{"title":119,"searchDepth":144,"depth":144,"links":21976},[21977],{"id":109,"depth":132,"text":109},"有 n 个城市，其中一些彼此相连，另一些没有相连。如果城市 a 与城市 b 直接相连，且城市 b 与城市 c 直接相连，那么城市 a 与城市 c 间接相连。\n省份 是一组直接或间接相连的城市，组内不含其他没有相连的城市。\n给你一个 n x n 的矩阵 isConnected ，其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连，而 isConnected[i][j] = 0 表示二者不直接相连。\n返回矩阵中 省份 的数量。",{},"\u002Flegacy-blog\u002F1774272051966",{"title":21720,"description":21978},"legacy-blog\u002F1774272051966",[246,16227,1192],"LDmO0yh7_rxS3YoBXttPMS2IHubyb3xjsj72N6v4Brg",{"id":21986,"title":21987,"assetBase":7,"author":8,"body":21988,"category":21709,"collection":233,"date":21710,"description":22265,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":22266,"navigation":128,"originalPath":239,"path":22267,"seo":22268,"source":243,"stem":22269,"tags":22270,"weight":250,"__hash__":22271},"content\u002Flegacy-blog\u002F1774272969421.md","1466. 重新规划路线",{"type":10,"value":21989,"toc":22262},[21990,22020,22024,22029,22052,22056,22061,22080,22084,22096,22100,22127,22129,22131,22260],[13,21991,21992,21994,21995,21486,21997,22000,22001,22003,22004,22007,22008,22011,22012,21486,22014,22016,22017,22019],{},[17,21993,19],{}," 座城市，从 ",[17,21996,2949],{},[17,21998,21999],{},"n-1"," 编号，其间共有 ",[17,22002,21999],{}," 条路线。因此，要想在两座不同城市之间旅行只有唯一一条路线可供选择（路线网形成一颗树）。去年，交通运输部决定重新规划路线，以改变交通拥堵的状况。\n路线用 ",[17,22005,22006],{},"connections"," 表示，其中 ",[17,22009,22010],{},"connections[i] = [a, b]"," 表示从城市 ",[17,22013,5009],{},[17,22015,12172],{}," 的一条有向路线。\n今年，城市 0 将会举办一场大型比赛，很多游客都想前往城市 0 。\n请你帮助重新规划路线方向，使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。\n题目数据 ",[22,22018,1915],{}," 每个城市在重新规划路线方向后都能到达城市 0 。",[13,22021,22022],{},[22,22023,293],{},[13,22025,22026],{},[617,22027],{"alt":619,"src":22028},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177427302587523.png",[72,22030,22031],{},[13,22032,22033,22035,22036,2066,22039,2066,22041,2066,22044,2070,22047,1048,22049,22051],{},[22,22034,1040],{}," n = 6, connections = [[0,1],",[78,22037,22038],{},"1,3",[78,22040,1867],{},[78,22042,22043],{},"4,0",[78,22045,22046],{},"4,5",[22,22048,1047],{},[22,22050,1051],{}," 更改以红色显示的路线的方向，使每个城市都可以到达城市 0 。",[13,22053,22054],{},[22,22055,306],{},[13,22057,22058],{},[617,22059],{"alt":619,"src":22060},"\u002Fcontent-assets\u002Flegacy-blog\u002Fimg_177427303335533.png",[72,22062,22063],{},[13,22064,22065,22067,22068,2066,22070,2066,22073,2070,22076,1071,22078,22051],{},[22,22066,1040],{}," n = 5, connections = [[1,0],",[78,22069,20979],{},[78,22071,22072],{},"3,2",[78,22074,22075],{},"3,4",[22,22077,1047],{},[22,22079,1051],{},[13,22081,22082],{},[22,22083,1265],{},[72,22085,22086],{},[13,22087,22088,22090,22091,2070,22094,1277],{},[22,22089,1040],{}," n = 3, connections = [[1,0],",[78,22092,22093],{},"2,0",[22,22095,1047],{},[13,22097,22098],{},[22,22099,317],{},[49,22101,22102,22107,22112,22117,22122],{},[52,22103,22104],{},[17,22105,22106],{},"2 \u003C= n \u003C= 5* 10^4",[52,22108,22109],{},[17,22110,22111],{},"connections.length == n-1",[52,22113,22114],{},[17,22115,22116],{},"connections[i].length == 2",[52,22118,22119],{},[17,22120,22121],{},"0 \u003C= connections[i][0], connections[i][1] \u003C= n-1",[52,22123,22124],{},[17,22125,22126],{},"connections[i][0] != connections[i][1]",[107,22128,109],{"id":109},[13,22130,112],{},[114,22132,22134],{"className":116,"code":22133,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def minReorder(self, n, connections):\n        # 构建邻接表，存储 (邻居, 是否需要反向)\n        adj = [[] for _ in range(n)]\n        for a, b in connections:\n            adj[a].append((b, 1))  # 原方向a→b，需要反向（计数+1）\n            adj[b].append((a, 0))  # 反向b→a，不需要反向\n        \n        visited = [False] * n\n        self.res = 0  # 记录需要反向的数量\n        \n        # DFS遍历\n        def dfs(node):\n            visited[node] = True\n            for neighbor, need_reverse in adj[node]:\n                if not visited[neighbor]:\n                    self.res += need_reverse  # 需要反向则计数+1\n                    dfs(neighbor)\n        \n        dfs(0)  # 从0出发遍历\n        return self.res\n        \"\"\"\n        :type n: int\n        :type connections: List[List[int]]\n        :rtype: int\n        \"\"\"\n\n",[17,22135,22136,22140,22144,22149,22154,22159,22164,22169,22174,22178,22182,22187,22191,22196,22200,22205,22210,22215,22220,22225,22229,22234,22239,22243,22247,22252,22256],{"__ignoreMap":119},[78,22137,22138],{"class":124,"line":125},[78,22139,129],{"emptyLinePlaceholder":128},[78,22141,22142],{"class":124,"line":132},[78,22143,135],{},[78,22145,22146],{"class":124,"line":138},[78,22147,22148],{},"    def minReorder(self, n, connections):\n",[78,22150,22151],{"class":124,"line":144},[78,22152,22153],{},"        # 构建邻接表，存储 (邻居, 是否需要反向)\n",[78,22155,22156],{"class":124,"line":150},[78,22157,22158],{},"        adj = [[] for _ in range(n)]\n",[78,22160,22161],{"class":124,"line":156},[78,22162,22163],{},"        for a, b in connections:\n",[78,22165,22166],{"class":124,"line":162},[78,22167,22168],{},"            adj[a].append((b, 1))  # 原方向a→b，需要反向（计数+1）\n",[78,22170,22171],{"class":124,"line":168},[78,22172,22173],{},"            adj[b].append((a, 0))  # 反向b→a，不需要反向\n",[78,22175,22176],{"class":124,"line":174},[78,22177,1359],{},[78,22179,22180],{"class":124,"line":180},[78,22181,21888],{},[78,22183,22184],{"class":124,"line":186},[78,22185,22186],{},"        self.res = 0  # 记录需要反向的数量\n",[78,22188,22189],{"class":124,"line":192},[78,22190,1359],{},[78,22192,22193],{"class":124,"line":198},[78,22194,22195],{},"        # DFS遍历\n",[78,22197,22198],{"class":124,"line":204},[78,22199,16641],{},[78,22201,22202],{"class":124,"line":210},[78,22203,22204],{},"            visited[node] = True\n",[78,22206,22207],{"class":124,"line":216},[78,22208,22209],{},"            for neighbor, need_reverse in adj[node]:\n",[78,22211,22212],{"class":124,"line":222},[78,22213,22214],{},"                if not visited[neighbor]:\n",[78,22216,22217],{"class":124,"line":421},[78,22218,22219],{},"                    self.res += need_reverse  # 需要反向则计数+1\n",[78,22221,22222],{"class":124,"line":427},[78,22223,22224],{},"                    dfs(neighbor)\n",[78,22226,22227],{"class":124,"line":433},[78,22228,1359],{},[78,22230,22231],{"class":124,"line":2443},[78,22232,22233],{},"        dfs(0)  # 从0出发遍历\n",[78,22235,22236],{"class":124,"line":2448},[78,22237,22238],{},"        return self.res\n",[78,22240,22241],{"class":124,"line":2454},[78,22242,207],{},[78,22244,22245],{"class":124,"line":2460},[78,22246,535],{},[78,22248,22249],{"class":124,"line":2465},[78,22250,22251],{},"        :type connections: List[List[int]]\n",[78,22253,22254],{"class":124,"line":2470},[78,22255,219],{},[78,22257,22258],{"class":124,"line":2903},[78,22259,207],{},[226,22261,228],{},{"title":119,"searchDepth":144,"depth":144,"links":22263},[22264],{"id":109,"depth":132,"text":109},"n 座城市，从 0 到 n-1 编号，其间共有 n-1 条路线。因此，要想在两座不同城市之间旅行只有唯一一条路线可供选择（路线网形成一颗树）。去年，交通运输部决定重新规划路线，以改变交通拥堵的状况。\n路线用 connections 表示，其中 connections[i] = [a, b] 表示从城市 a 到 b 的一条有向路线。\n今年，城市 0 将会举办一场大型比赛，很多游客都想前往城市 0 。\n请你帮助重新规划路线方向，使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。\n题目数据 保证 每个城市在重新规划路线方向后都能到达城市 0 。",{},"\u002Flegacy-blog\u002F1774272969421",{"title":21987,"description":22265},"legacy-blog\u002F1774272969421",[246,16227,1192],"AdDpOCPXQS-JqDmYDAFZxY8TlrmltqWCY6ay3ofevuQ",{"id":22273,"title":22274,"assetBase":7,"author":8,"body":22275,"category":22696,"collection":233,"date":22697,"description":22698,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":22699,"navigation":128,"originalPath":239,"path":22700,"seo":22701,"source":243,"stem":22702,"tags":22703,"weight":250,"__hash__":22705},"content\u002Flegacy-blog\u002F1774343695728.md","399. 除法求值",{"type":10,"value":22276,"toc":22693},[22277,22337,22341,22403,22407,22434,22438,22462,22466,22514,22516,22518,22691],[13,22278,22279,22280,22283,22284,22287,22288,1018,22291,22294,22295,22298,22299,275,22302,22305,22306,22309,22310,21757,22313,22315,22316,22319,22320,22323,22324,22327,22328,22330,22331,22333,22334,22336],{},"给你一个变量对数组 ",[17,22281,22282],{},"equations"," 和一个实数值数组 ",[17,22285,22286],{},"values"," 作为已知条件，其中 ",[17,22289,22290],{},"equations[i] = [Ai, Bi]",[17,22292,22293],{},"values[i]"," 共同表示等式 ",[17,22296,22297],{},"Ai \u002F Bi = values[i]"," 。每个 ",[17,22300,22301],{},"Ai",[17,22303,22304],{},"Bi"," 是一个表示单个变量的字符串。\n另有一些以数组 ",[17,22307,22308],{},"queries"," 表示的问题，其中 ",[17,22311,22312],{},"queries[j] = [Cj, Dj]",[17,22314,4635],{}," 个问题，请你根据已知条件找出 ",[17,22317,22318],{},"Cj \u002F Dj = ?"," 的结果作为答案。\n返回 ",[22,22321,22322],{},"所有问题的答案"," 。如果存在某个无法确定的答案，则用 ",[17,22325,22326],{},"-1.0"," 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串，也需要用 ",[17,22329,22326],{}," 替代这个答案。\n",[22,22332,11250],{}," 输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况，且不存在任何矛盾的结果。\n",[22,22335,11250],{}," 未在等式列表中出现的变量是未定义的，因此无法确定它们的答案。",[13,22338,22339],{},[22,22340,293],{},[72,22342,22343],{},[13,22344,22345,22347,22348,22351,22352,22355,22356,2066,22359,2066,22362,2066,22365,2070,22368,22370,22373,22375,22376,2066,22379,22382,22383,2066,22386,2066,22389,2066,22392,2066,22395,22398,22399,22402],{},[22,22346,1040],{}," equations = [[\"a\",\"b\"],",[78,22349,22350],{},"\"b\",\"c\"","], values = ",[78,22353,22354],{},"2.0,3.0",", queries = [[\"a\",\"c\"],",[78,22357,22358],{},"\"b\",\"a\"",[78,22360,22361],{},"\"a\",\"e\"",[78,22363,22364],{},"\"a\",\"a\"",[78,22366,22367],{},"\"x\",\"x\"",[22,22369,1047],{},[78,22371,22372],{},"6.00000,0.50000,-1.00000,1.00000,-1.00000",[22,22374,1051],{},"\n条件：",[596,22377,22378],{},"a \u002F b = 2.0",[596,22380,22381],{},"b \u002F c = 3.0","\n问题：",[596,22384,22385],{},"a \u002F c = ?",[596,22387,22388],{},"b \u002F a = ?",[596,22390,22391],{},"a \u002F e = ?",[596,22393,22394],{},"a \u002F a = ?",[596,22396,22397],{},"x \u002F x = ?","\n结果：",[78,22400,22401],{},"6.0, 0.5, -1.0, 1.0, -1.0","\n注意：x 是未定义的 => -1.0",[13,22404,22405],{},[22,22406,306],{},[72,22408,22409],{},[13,22410,22411,22347,22413,2066,22415,22351,22418,22355,22421,2066,22424,2066,22426,2070,22429,22431],{},[22,22412,1040],{},[78,22414,22350],{},[78,22416,22417],{},"\"bc\",\"cd\"",[78,22419,22420],{},"1.5,2.5,5.0",[78,22422,22423],{},"\"c\",\"b\"",[78,22425,22417],{},[78,22427,22428],{},"\"cd\",\"bc\"",[22,22430,1047],{},[78,22432,22433],{},"3.75000,0.40000,5.00000,0.20000",[13,22435,22436],{},[22,22437,1265],{},[72,22439,22440],{},[13,22441,22442,22444,22445,22448,22449,2066,22451,2066,22454,2070,22457,22459],{},[22,22443,1040],{}," equations = [[\"a\",\"b\"]], values = ",[78,22446,22447],{},"0.5",", queries = [[\"a\",\"b\"],",[78,22450,22358],{},[78,22452,22453],{},"\"a\",\"c\"",[78,22455,22456],{},"\"x\",\"y\"",[22,22458,1047],{},[78,22460,22461],{},"0.50000,2.00000,-1.00000,-1.00000",[13,22463,22464],{},[22,22465,317],{},[49,22467,22468,22473,22478,22483,22488,22493,22498,22503,22508],{},[52,22469,22470],{},[17,22471,22472],{},"1 \u003C= equations.length \u003C= 20",[52,22474,22475],{},[17,22476,22477],{},"equations[i].length == 2",[52,22479,22480],{},[17,22481,22482],{},"1 \u003C= Ai.length, Bi.length \u003C= 5",[52,22484,22485],{},[17,22486,22487],{},"values.length == equations.length",[52,22489,22490],{},[17,22491,22492],{},"0.0 \u003C values[i] \u003C= 20.0",[52,22494,22495],{},[17,22496,22497],{},"1 \u003C= queries.length \u003C= 20",[52,22499,22500],{},[17,22501,22502],{},"queries[i].length == 2",[52,22504,22505],{},[17,22506,22507],{},"1 \u003C= Cj.length, Dj.length \u003C= 5",[52,22509,22510,22513],{},[17,22511,22512],{},"Ai, Bi, Cj, Dj"," 由小写英文字母与数字组成",[107,22515,109],{"id":109},[13,22517,112],{},[114,22519,22521],{"className":116,"code":22520,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def calcEquation(self, equations, values, queries):\n        from collections import defaultdict\n        graph = defaultdict(int)  # 构建图：key 是 (变量a, 变量b)，value 是 a \u002F b 的结果\n        set1 = set()\n        for i in range(len(equations)):\n            a, b = equations[i]\n            graph[(a, b)] = values[i]  # a \u002F b = 对应值\n            graph[(b, a)] = 1 \u002F values[i]  # b \u002F a = 倒数\n            set1.add(a)\n            set1.add(b)\n        \n        arr = list(set1)\n        # k 是中间节点：i -> k -> j，即 i\u002Fj = (i\u002Fk) * (k\u002Fj)\n        for k in arr:\n            for i in arr:\n                for j in arr:\n                    # 如果 i 能到 k，且 k 能到 j（值不为 0）\n                    if graph[(i, k)] and graph[(k, j)]:\n                        graph[(i, j)] = graph[(i, k)] * graph[(k, j)]\n        \n        res = []\n        for x, y in queries:\n            if graph[(x, y)]:\n                res.append(graph[(x, y)])\n            else:\n                res.append(-1)\n        return res\n        \"\"\"\n        :type equations: List[List[str]]\n        :type values: List[float]\n        :type queries: List[List[str]]\n        :rtype: List[float]\n        \"\"\"\n\n",[17,22522,22523,22527,22531,22536,22541,22546,22551,22556,22561,22566,22571,22576,22581,22585,22590,22595,22600,22605,22610,22615,22620,22625,22629,22634,22639,22644,22649,22653,22658,22663,22667,22672,22677,22682,22687],{"__ignoreMap":119},[78,22524,22525],{"class":124,"line":125},[78,22526,129],{"emptyLinePlaceholder":128},[78,22528,22529],{"class":124,"line":132},[78,22530,135],{},[78,22532,22533],{"class":124,"line":138},[78,22534,22535],{},"    def calcEquation(self, equations, values, queries):\n",[78,22537,22538],{"class":124,"line":144},[78,22539,22540],{},"        from collections import defaultdict\n",[78,22542,22543],{"class":124,"line":150},[78,22544,22545],{},"        graph = defaultdict(int)  # 构建图：key 是 (变量a, 变量b)，value 是 a \u002F b 的结果\n",[78,22547,22548],{"class":124,"line":156},[78,22549,22550],{},"        set1 = set()\n",[78,22552,22553],{"class":124,"line":162},[78,22554,22555],{},"        for i in range(len(equations)):\n",[78,22557,22558],{"class":124,"line":168},[78,22559,22560],{},"            a, b = equations[i]\n",[78,22562,22563],{"class":124,"line":174},[78,22564,22565],{},"            graph[(a, b)] = values[i]  # a \u002F b = 对应值\n",[78,22567,22568],{"class":124,"line":180},[78,22569,22570],{},"            graph[(b, a)] = 1 \u002F values[i]  # b \u002F a = 倒数\n",[78,22572,22573],{"class":124,"line":186},[78,22574,22575],{},"            set1.add(a)\n",[78,22577,22578],{"class":124,"line":192},[78,22579,22580],{},"            set1.add(b)\n",[78,22582,22583],{"class":124,"line":198},[78,22584,1359],{},[78,22586,22587],{"class":124,"line":204},[78,22588,22589],{},"        arr = list(set1)\n",[78,22591,22592],{"class":124,"line":210},[78,22593,22594],{},"        # k 是中间节点：i -> k -> j，即 i\u002Fj = (i\u002Fk) * (k\u002Fj)\n",[78,22596,22597],{"class":124,"line":216},[78,22598,22599],{},"        for k in arr:\n",[78,22601,22602],{"class":124,"line":222},[78,22603,22604],{},"            for i in arr:\n",[78,22606,22607],{"class":124,"line":421},[78,22608,22609],{},"                for j in arr:\n",[78,22611,22612],{"class":124,"line":427},[78,22613,22614],{},"                    # 如果 i 能到 k，且 k 能到 j（值不为 0）\n",[78,22616,22617],{"class":124,"line":433},[78,22618,22619],{},"                    if graph[(i, k)] and graph[(k, j)]:\n",[78,22621,22622],{"class":124,"line":2443},[78,22623,22624],{},"                        graph[(i, j)] = graph[(i, k)] * graph[(k, j)]\n",[78,22626,22627],{"class":124,"line":2448},[78,22628,1359],{},[78,22630,22631],{"class":124,"line":2454},[78,22632,22633],{},"        res = []\n",[78,22635,22636],{"class":124,"line":2460},[78,22637,22638],{},"        for x, y in queries:\n",[78,22640,22641],{"class":124,"line":2465},[78,22642,22643],{},"            if graph[(x, y)]:\n",[78,22645,22646],{"class":124,"line":2470},[78,22647,22648],{},"                res.append(graph[(x, y)])\n",[78,22650,22651],{"class":124,"line":2903},[78,22652,699],{},[78,22654,22655],{"class":124,"line":2909},[78,22656,22657],{},"                res.append(-1)\n",[78,22659,22660],{"class":124,"line":11477},[78,22661,22662],{},"        return res\n",[78,22664,22665],{"class":124,"line":13374},[78,22666,207],{},[78,22668,22669],{"class":124,"line":13380},[78,22670,22671],{},"        :type equations: List[List[str]]\n",[78,22673,22674],{"class":124,"line":13386},[78,22675,22676],{},"        :type values: List[float]\n",[78,22678,22679],{"class":124,"line":13722},[78,22680,22681],{},"        :type queries: List[List[str]]\n",[78,22683,22684],{"class":124,"line":13727},[78,22685,22686],{},"        :rtype: List[float]\n",[78,22688,22689],{"class":124,"line":13953},[78,22690,207],{},[226,22692,228],{},{"title":119,"searchDepth":144,"depth":144,"links":22694},[22695],{"id":109,"depth":132,"text":109},"深度优先搜索 广度优先搜索 并查集","2026-03-24","给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件，其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai \u002F Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。\n另有一些以数组 queries 表示的问题，其中 queries[j] = [Cj, Dj] 表示第 j 个问题，请你根据已知条件找出 Cj \u002F Dj = ? 的结果作为答案。\n返回 所有问题的答案 。如果存在某个无法确定的答案，则用 -1.0 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串，也需要用 -1.0 替代这个答案。\n注意： 输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况，且不存在任何矛盾的结果。\n注意： 未在等式列表中出现的变量是未定义的，因此无法确定它们的答案。",{},"\u002Flegacy-blog\u002F1774343695728",{"title":22274,"description":22698},"legacy-blog\u002F1774343695728",[246,16227,1192,22704],"并查集","rQdF-Um9ssxzaMdVjD527UYxRzqrsCif2cJAsiWSWVU",{"id":22707,"title":22708,"assetBase":7,"author":8,"body":22709,"category":23072,"collection":233,"date":23073,"description":23074,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":23075,"navigation":128,"originalPath":239,"path":23076,"seo":23077,"source":243,"stem":23078,"tags":23079,"weight":250,"__hash__":23080},"content\u002Flegacy-blog\u002F1774423688876.md","2300. 咒语和药水的成功对数",{"type":10,"value":22710,"toc":23069},[22711,22773,22777,22860,22864,22929,22933,22960,22962,22964,23067],[13,22712,22713,22714,1018,22717,22720,22721,1018,22723,10730,22725,21757,22728,22730,22731,21757,22734,22736,22737,22740,22741,22744,22745,22748,22750,22751,22754,22755,22757,22758,22761,22762,22765,22766,22768,22769,22772],{},"给你两个正整数数组 ",[17,22715,22716],{},"spells",[17,22718,22719],{},"potions"," ，长度分别为 ",[17,22722,19],{},[17,22724,5058],{},[17,22726,22727],{},"spells[i]",[17,22729,39],{}," 个咒语的能量强度，",[17,22732,22733],{},"potions[j]",[17,22735,4635],{}," 瓶药水的能量强度。\n同时给你一个整数 ",[17,22738,22739],{},"success"," 。一个咒语和药水的能量强度 ",[22,22742,22743],{},"相乘"," 如果",[22,22746,22747],{},"大于等于",[17,22749,22739],{}," ，那么它们视为一对",[22,22752,22753],{},"成功"," 的组合。\n请你返回一个长度为 ",[17,22756,19],{}," 的整数数组 ",[17,22759,22760],{},"pairs","，其中 ",[17,22763,22764],{},"pairs[i]"," 是能跟第 ",[17,22767,39],{}," 个咒语成功组合的 ",[22,22770,22771],{},"药水"," 数目。",[13,22774,22775],{},[22,22776,293],{},[72,22778,22779,22798],{},[13,22780,22781,22783,22784,22787,22788,22790,22791,22793,22796],{},[22,22782,1040],{}," spells = ",[78,22785,22786],{},"5,1,3",", potions = ",[78,22789,10997],{},", success = 7\n",[22,22792,1047],{},[78,22794,22795],{},"4,0,3",[22,22797,1051],{},[49,22799,22800,22829,22837],{},[52,22801,22802,22803,22805,22806,22828],{},"第 0 个咒语：5 *",[78,22804,10997],{}," = ",[78,22807,22808,22809,2066,22813,2066,22818,2066,22823],{},"5,",[596,22810,22811],{},[22,22812,11237],{},[596,22814,22815],{},[22,22816,22817],{},"15",[596,22819,22820],{},[22,22821,22822],{},"20",[596,22824,22825],{},[22,22826,22827],{},"25"," 。总共 4 个成功组合。",[52,22830,22831,22832,22805,22834,22836],{},"第 1 个咒语：1 * ",[78,22833,10997],{},[78,22835,10997],{}," 。总共 0 个成功组合。",[52,22838,22839,22840,22805,22842,22857,22858,285],{},"第 2 个咒语：3 *",[78,22841,10997],{},[78,22843,22844,22845,2066,22849,2066,22853],{},"3,6,",[596,22846,22847],{},[22,22848,1017],{},[596,22850,22851],{},[22,22852,1044],{},[596,22854,22855],{},[22,22856,22817],{}," 。总共 3 个成功组合。\n所以返回 ",[78,22859,22795],{},[13,22861,22862],{},[22,22863,306],{},[72,22865,22866,22884],{},[13,22867,22868,22783,22870,22787,22873,22876,22877,22879,22882],{},[22,22869,1040],{},[78,22871,22872],{},"3,1,2",[78,22874,22875],{},"8,5,8",", success = 16\n",[22,22878,1047],{},[78,22880,22881],{},"2,0,2",[22,22883,1051],{},[49,22885,22886,22904,22910],{},[52,22887,22888,22889,22805,22891,22903],{},"第 0 个咒语：3 *",[78,22890,22875],{},[78,22892,22893,22898,22899],{},[596,22894,22895],{},[22,22896,22897],{},"24",",15,",[596,22900,22901],{},[22,22902,22897],{}," 。总共 2 个成功组合。",[52,22905,22831,22906,22805,22908,22836],{},[78,22907,22875],{},[78,22909,22875],{},[52,22911,22912,22913,22805,22915,22926,22927,285],{},"第 2 个咒语：2 *",[78,22914,22875],{},[78,22916,22917,22921,22922],{},[596,22918,22919],{},[22,22920,1021],{},",10,",[596,22923,22924],{},[22,22925,1021],{}," 。总共 2 个成功组合。\n所以返回 ",[78,22928,22881],{},[13,22930,22931],{},[22,22932,317],{},[49,22934,22935,22940,22945,22950,22955],{},[52,22936,22937],{},[17,22938,22939],{},"n == spells.length",[52,22941,22942],{},[17,22943,22944],{},"m == potions.length",[52,22946,22947],{},[17,22948,22949],{},"1 \u003C= n, m \u003C= 105",[52,22951,22952],{},[17,22953,22954],{},"1 \u003C= spells[i], potions[i] \u003C= 105",[52,22956,22957],{},[17,22958,22959],{},"1 \u003C= success \u003C= 1010",[107,22961,109],{"id":109},[13,22963,112],{},[114,22965,22967],{"className":116,"code":22966,"language":118,"meta":119,"style":119},"\nclass Solution(object):\n    def successfulPairs(self, spells, potions, success):\n        mx = max(potions)\n        cnt = [0] * (mx + 1)\n        for y in potions:\n            cnt[y] += 1\n        \n        for i in range(mx - 1, -1, -1):  # 后缀和 → cnt[i] 代表强度 >= i 的药水总数量\n            cnt[i] += cnt[i + 1]\n        \n        for i, x in enumerate(spells):\n            low = (success - 1) \u002F\u002F x + 1  # 计算当前咒语 x 至少需要多大的药水 low 才能满足 x*y >= success\n            spells[i] = cnt[low] if low \u003C= mx else 0\n        return spells\n        \"\"\"\n        :type spells: List[int]\n        :type potions: List[int]\n        :type success: int\n        :rtype: List[int]\n        \"\"\"\n\n",[17,22968,22969,22973,22977,22982,22987,22992,22997,23002,23006,23011,23016,23020,23025,23030,23035,23040,23044,23049,23054,23059,23063],{"__ignoreMap":119},[78,22970,22971],{"class":124,"line":125},[78,22972,129],{"emptyLinePlaceholder":128},[78,22974,22975],{"class":124,"line":132},[78,22976,135],{},[78,22978,22979],{"class":124,"line":138},[78,22980,22981],{},"    def successfulPairs(self, spells, potions, success):\n",[78,22983,22984],{"class":124,"line":144},[78,22985,22986],{},"        mx = max(potions)\n",[78,22988,22989],{"class":124,"line":150},[78,22990,22991],{},"        cnt = [0] * (mx + 1)\n",[78,22993,22994],{"class":124,"line":156},[78,22995,22996],{},"        for y in potions:\n",[78,22998,22999],{"class":124,"line":162},[78,23000,23001],{},"            cnt[y] += 1\n",[78,23003,23004],{"class":124,"line":168},[78,23005,1359],{},[78,23007,23008],{"class":124,"line":174},[78,23009,23010],{},"        for i in range(mx - 1, -1, -1):  # 后缀和 → cnt[i] 代表强度 >= i 的药水总数量\n",[78,23012,23013],{"class":124,"line":180},[78,23014,23015],{},"            cnt[i] += cnt[i + 1]\n",[78,23017,23018],{"class":124,"line":186},[78,23019,1359],{},[78,23021,23022],{"class":124,"line":192},[78,23023,23024],{},"        for i, x in enumerate(spells):\n",[78,23026,23027],{"class":124,"line":198},[78,23028,23029],{},"            low = (success - 1) \u002F\u002F x + 1  # 计算当前咒语 x 至少需要多大的药水 low 才能满足 x*y >= success\n",[78,23031,23032],{"class":124,"line":204},[78,23033,23034],{},"            spells[i] = cnt[low] if low \u003C= mx else 0\n",[78,23036,23037],{"class":124,"line":210},[78,23038,23039],{},"        return spells\n",[78,23041,23042],{"class":124,"line":216},[78,23043,207],{},[78,23045,23046],{"class":124,"line":222},[78,23047,23048],{},"        :type spells: List[int]\n",[78,23050,23051],{"class":124,"line":421},[78,23052,23053],{},"        :type potions: List[int]\n",[78,23055,23056],{"class":124,"line":427},[78,23057,23058],{},"        :type success: int\n",[78,23060,23061],{"class":124,"line":433},[78,23062,365],{},[78,23064,23065],{"class":124,"line":2443},[78,23066,207],{},[226,23068,228],{},{"title":119,"searchDepth":144,"depth":144,"links":23070},[23071],{"id":109,"depth":132,"text":109},"数组 二分查找 排序","2026-03-25","给你两个正整数数组 spells 和 potions ，长度分别为 n 和 m ，其中 spells[i] 表示第 i 个咒语的能量强度，potions[j] 表示第 j 瓶药水的能量强度。\n同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果大于等于success ，那么它们视为一对成功 的组合。\n请你返回一个长度为 n 的整数数组 pairs，其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。",{},"\u002Flegacy-blog\u002F1774423688876",{"title":22708,"description":23074},"legacy-blog\u002F1774423688876",[246,248,1819,3759],"RainUuIQWdudZuyu2cagwaoROYzLzR7rRGIXs0S1bFw",{"id":23082,"title":23083,"assetBase":7,"author":8,"body":23084,"category":23240,"collection":233,"date":23241,"description":23088,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":23242,"navigation":128,"originalPath":239,"path":23243,"seo":23244,"source":243,"stem":23245,"tags":23246,"weight":250,"__hash__":23249},"content\u002Flegacy-blog\u002F1775737473462.md","lq1. 最大数字",{"type":10,"value":23085,"toc":23232},[23086,23089,23093,23096,23099,23102,23105,23111,23114,23120,23123,23126,23128,23130,23230],[13,23087,23088],{},"我们有 nn 个连续的整数 1,2,3,⋯,n1,2,3,⋯,n，可以自由排列它们的顺序。\n然后，我们把这些数字转换成二进制表示，按照排列顺序拼接形成一个新的二进制数。\n我们的目标是让这个二进制数的值最大，并输出这个二进制对应的十进制表示。",[23090,23091,23092],"h3",{"id":23092},"输入格式",[13,23094,23095],{},"输入一行包含一个正整数 nn。",[23090,23097,23098],{"id":23098},"输出格式",[13,23100,23101],{},"输出一行包含一个整数表示答案。",[23090,23103,23104],{"id":23104},"样例输入",[114,23106,23109],{"className":23107,"code":23108,"language":299},[297],"3\n",[17,23110,23108],{"__ignoreMap":119},[23090,23112,23113],{"id":23113},"样例输出",[114,23115,23118],{"className":23116,"code":23117,"language":299},[297],"30\n",[17,23119,23117],{"__ignoreMap":119},[23090,23121,23122],{"id":23122},"评测用例规模与约定",[13,23124,23125],{},"对于 2020% 的评测用例，1≤n≤101≤n≤10；\n对于 4040% 的评测用例，1≤n≤1001≤n≤100；\n对于 6060% 的评测用例，1≤n≤5001≤n≤500；\n对于 8080% 的评测用例，1≤n≤10001≤n≤1000；\n对于所有评测用例，1≤n≤100001≤n≤10000。",[107,23127,109],{"id":109},[13,23129,112],{},[114,23131,23133],{"className":116,"code":23132,"language":118,"meta":119,"style":119},"\nimport sys\nfrom functools import cmp_to_key\n\n# 自定义比较函数：按二进制拼接后的大小排序\ndef compare(x, y):\n    bx = bin(x)[2:]  # 得到x的正确二进制串（去掉0b前缀）\n    by = bin(y)[2:]  # 得到y的正确二进制串\n    # 比较拼接后的字典序：bx+by更大则x排在y前面（返回-1），否则y排在x前面（返回1）\n    return -1 if bx + by > by + bx else 1\n\ndef main():\n    n = int(sys.stdin.readline().strip())\n    nums = list(range(1, n + 1))  # 生成1~n的列表\n    nums.sort(key=cmp_to_key(compare))  # 按自定义规则排序\n    binary_str = ''.join(bin(num)[2:] for num in nums)  # 拼接所有二进制串\n    print(int(binary_str, 2))  # 二进制转十进制输出\n\nif __name__ == \"__main__\":\n    main()\n\n",[17,23134,23135,23139,23143,23148,23152,23157,23162,23167,23172,23177,23182,23186,23191,23196,23201,23206,23211,23216,23220,23225],{"__ignoreMap":119},[78,23136,23137],{"class":124,"line":125},[78,23138,129],{"emptyLinePlaceholder":128},[78,23140,23141],{"class":124,"line":132},[78,23142,14990],{},[78,23144,23145],{"class":124,"line":138},[78,23146,23147],{},"from functools import cmp_to_key\n",[78,23149,23150],{"class":124,"line":144},[78,23151,129],{"emptyLinePlaceholder":128},[78,23153,23154],{"class":124,"line":150},[78,23155,23156],{},"# 自定义比较函数：按二进制拼接后的大小排序\n",[78,23158,23159],{"class":124,"line":156},[78,23160,23161],{},"def compare(x, y):\n",[78,23163,23164],{"class":124,"line":162},[78,23165,23166],{},"    bx = bin(x)[2:]  # 得到x的正确二进制串（去掉0b前缀）\n",[78,23168,23169],{"class":124,"line":168},[78,23170,23171],{},"    by = bin(y)[2:]  # 得到y的正确二进制串\n",[78,23173,23174],{"class":124,"line":174},[78,23175,23176],{},"    # 比较拼接后的字典序：bx+by更大则x排在y前面（返回-1），否则y排在x前面（返回1）\n",[78,23178,23179],{"class":124,"line":180},[78,23180,23181],{},"    return -1 if bx + by > by + bx else 1\n",[78,23183,23184],{"class":124,"line":186},[78,23185,129],{"emptyLinePlaceholder":128},[78,23187,23188],{"class":124,"line":192},[78,23189,23190],{},"def main():\n",[78,23192,23193],{"class":124,"line":198},[78,23194,23195],{},"    n = int(sys.stdin.readline().strip())\n",[78,23197,23198],{"class":124,"line":204},[78,23199,23200],{},"    nums = list(range(1, n + 1))  # 生成1~n的列表\n",[78,23202,23203],{"class":124,"line":210},[78,23204,23205],{},"    nums.sort(key=cmp_to_key(compare))  # 按自定义规则排序\n",[78,23207,23208],{"class":124,"line":216},[78,23209,23210],{},"    binary_str = ''.join(bin(num)[2:] for num in nums)  # 拼接所有二进制串\n",[78,23212,23213],{"class":124,"line":222},[78,23214,23215],{},"    print(int(binary_str, 2))  # 二进制转十进制输出\n",[78,23217,23218],{"class":124,"line":421},[78,23219,129],{"emptyLinePlaceholder":128},[78,23221,23222],{"class":124,"line":427},[78,23223,23224],{},"if __name__ == \"__main__\":\n",[78,23226,23227],{"class":124,"line":433},[78,23228,23229],{},"    main()\n",[226,23231,228],{},{"title":119,"searchDepth":144,"depth":144,"links":23233},[23234,23235,23236,23237,23238,23239],{"id":23092,"depth":138,"text":23092},{"id":23098,"depth":138,"text":23098},{"id":23104,"depth":138,"text":23104},{"id":23113,"depth":138,"text":23113},{"id":23122,"depth":138,"text":23122},{"id":109,"depth":132,"text":109},"蓝桥杯 基础","2026-04-09",{},"\u002Flegacy-blog\u002F1775737473462",{"title":23083,"description":23088},"legacy-blog\u002F1775737473462",[246,23247,23248],"蓝桥杯","基础","7AUW5e6aTKzpsgFDEVPJARpZa6ZBNCuWFqu0oGuJIMk",{"id":23251,"title":23252,"assetBase":239,"author":8,"body":23253,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":23326,"navigation":128,"originalPath":23327,"path":23328,"seo":23329,"source":23330,"stem":23331,"tags":23332,"weight":250,"__hash__":23334},"content\u002Fundergraduate\u002Fnote-083f0769cea2.md","Element-Plus与Element-UI",{"type":10,"value":23254,"toc":23320},[23255,23259,23269,23272,23276,23282,23288,23291,23295,23298,23305,23308,23311,23314,23317],[4517,23256,23258],{"id":23257},"element-pluselement-ui","Element-Plus&&Element-UI",[72,23260,23261,23266],{},[13,23262,23263],{},[22,23264,23265],{},"写在前面：",[13,23267,23268],{},"作为个人的一个学习文档，最近开了一个新坑，跟着20年的视频做了一个前端的demo，但是人家的前端配置是v-cli+vue2+element-ui+axios，而我决定使用当下比较新的技术栈：vite+vue3+element-plus+axios，所以不可避免地在过程中遇到了许多因为跨版本而留下的坑。这篇文档就以element-ui和element-plus为起点，记录简单的开发流程以供参考，以及一些已经发生变更的代码。方便未来借鉴与参考。",[13,23270,23271],{},"在此基础上，在所有流程中仅针对使用vite+vue3技术栈的开发人员。（node.js环境）",[107,23273,23275],{"id":23274},"安装问题详解待补充","安装&问题详解（待补充）",[10548,23277,23279],{"id":23278},"_1使用包管理器-npm-安装-element-plus",[22,23280,23281],{},"1、使用包管理器 (NPM) 安装 Element Plus",[114,23283,23286],{"className":23284,"code":23285,"language":299},[297],"$ npm install element-plus --save\n$ cnpm install element-plus --save  \u002F\u002F 通过中国镜像下载，但最好所有安装方式保持一致\n",[17,23287,23285],{"__ignoreMap":119},[23289,23290],"hr",{},[10548,23292,23294],{"id":23293},"_2问题详解","2、问题详解",[13,23296,23297],{},"1、Vue3中使用Element-Plus与Element-UI不兼容问题：Element-UI是饿了么开发的前端组件库，主要针对的是Vue框架，但是Vue3相比Vue2有了很多改动，一些函数、方法都被弃用了，因此在使用中遇到了不少需要解决的问题。",[13,23299,23300,23301,23304],{},"（1）icon的使用方式：在Element-UI中icon是作为class样式引用的固定字段，但是Element-Plus中为了方便开发者自定义icon的样式，将这些字段变成了标签。因此如果需要动态传输icon的内容（比如从后端向前传）就不能使用",[23302,23303],"binding",{"value":119},"来进行引用了，而是要把要用到的icon先从Element-Plus中提取出来，放入component中实例化后才能使用；",[13,23306,23307],{},"（2）插槽的更新：slot具名插槽和slot-scope作用域插槽在Vue3中已经被弃用，在Vue3中使用v-slot取代了原有的插槽；",[13,23309,23310],{},"（3）弹出框的更新：Element-UI的各种弹出框使用:visible.sync方法绑定属性实现弹出框的显示、隐藏，但是实际上这句话的内核还是调用的Vue里的方法，所以在Element-Plus中舍弃了这个方法，直接使用更为简单直接的v-model实现对于属性的双向绑定；",[13,23312,23313],{},"（4）关于文档的阅读：Element-Plus用的是TypeScript语法体系，所以有些地方反而使用不了，ElementUI虽然适配的是Vue2，但是使用的是JavaScript语法体系，在export default中参考ElementUI会方便很多。但是实际上TS体系比JS体系要安全方便一些，但是因为本人能力有限，在JS都不是很熟悉的情况下不敢贸然转到TS，但是值得一提的是：未来的趋势一定是TS。",[13,23315,23316],{},"2、Vue3中require方法的弃用：require是node.js环境下对于静态资源的一种调用方式，但是因为它属于node.js环境，所以在浏览器上实际上是不生效的。同样，如果用require请求的是图片资源的话，在后续前后端合并时会出现找不到的情况，所以取消require使用import来引用资源，同时个人建议图片等资源放到远程仓库（Github）中通过URL来使用，可以避免很多不必要的麻烦。",[13,23318,23319],{},"3、mock.js的使用：在还没有开发后端的情况下，对前端进行数据渲染时通常需要获取后端的数据，目前网上的教程都是教大家使用开源的mock.js去Mock数据，但是近几年有不少国内外的接口软件崭露头角，比如说postman、Apifox等。这里我使用的是Apifox向前后端发送Mock数据。",{"title":119,"searchDepth":144,"depth":144,"links":23321},[23322],{"id":23274,"depth":132,"text":23275},"TalkingAbout","本科阶段","2024-02-02",{},"TalkingAbout\u002F前端\u002F1_关于Vue\u002FElement-Plus与Element-UI.md","\u002Fundergraduate\u002Fnote-083f0769cea2",{"title":23252,"description":119},"undergraduate","undergraduate\u002Fnote-083f0769cea2",[23333],"随笔","l6Cb9gUDJe2-tcSqJm-kIEzgQx37zerd6ZX0qbyAQg0",{"id":23336,"title":23337,"assetBase":239,"author":8,"body":23338,"category":23371,"collection":23324,"date":23325,"description":23345,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":23372,"navigation":128,"originalPath":23373,"path":23374,"seo":23375,"source":23330,"stem":23376,"tags":23377,"weight":250,"__hash__":23379},"content\u002Fundergraduate\u002Fnote-0d84fc881c88.md","《论人格分裂》",{"type":10,"value":23339,"toc":23369},[23340,23343,23346,23349,23352,23360,23363,23366],[4517,23341,23337],{"id":23342},"论人格分裂",[13,23344,23345],{},"在现在的社会，什么稀奇古怪的病都能冒出来，有些你可能听过，有些则闻所未闻。不过今天我想谈谈“多重人格”，当然顺带会囊括一些奇奇怪怪的内容进去。",[13,23347,23348],{},"选择这个切入其实不算偶然。最近几年互联网上见多了“人格分裂”的“患者”：小时候看过的江南的《龙族》，通过脑中桥手术实现左右脑人格；20 年看过一本《我真的只有一个老婆》，这个就是搞笑都市恋爱，大概是 14 个还是 15 个人格来着；21 年在 YouTube 上看过一个在直播中无缝切换人格的主播，讲道理以我的观点其实在有点扯；以及最近在看《黑客军团》第一季男主与他爹人格……本身其实这种东西并不常见，但是互联网、大数据放大了这种事态，比如我在 B 站搜了个多重人格，待会 B 站又要开始给我倾泻互联网垃圾了。",[13,23350,23351],{},"但我对于它的病理其实并不感兴趣，我更感兴趣的是它发生的过程：在大部分乃至全部的多重人格、人格分裂小说中，基本以两类为主——受到强烈刺激 or 左右脑\u002F部分脑不协同。其实这里我想提及的是比人格分裂更火的科幻概念“数据意识”。当下又有多种影视作品诠释了这一概念，反正也是自说自话，干脆就展开来说说吧。我比较好奇的是《万神殿》中的意识上传，将大脑一层一层扫描进机器重构实现“物理”结构的再现；《流浪地球2》里的数字生命，不知道什么方式拷贝出的自我意识（大多影视作品都是分离，这就有了是我还是不是我的讨论）；GPT 式的推理，有人不是把自己一生的日记输入进去去学习吗，然后生成的线程在做出的决策上基本上相差无几，这个其实很容易确认不是本我意识或人格，他更倾向于小说中的“夺舍”或者刑侦上的推理，拿到了你个人的数据做出一个决策我觉得确实是不难的；《黑客帝国》中的引导意识，当人本身就处在机器提供的培养皿中，那诞生的人格基本上可以说是系统指定的了。",[72,23353,23354,23357],{},[13,23355,23356],{},"我个人认为《万神殿》是最合理的，但是烧毁大脑重构结构这种方式其实我并不认可，我虽然不知道脑科学现在的研究水平，但是一个人的浅层意识和深层意识天差地别，先烧毁皮层我觉得是个 bad idea，从内部开始烧可能比较合理。关于深浅意识的讨论我放到之后再说。",[13,23358,23359],{},"同时重构大脑结构这种方式我也不置可否，大脑一定要长大脑样子吗？我觉得不需要的。如果所有的参数都能考虑到，你就是一块砖只要能指挥身体做事，那他都能算大脑。不过毕竟拿不到所有的参数，所以短期看来重构结构可能是比较正确的方式。（但是依然不知道数据是怎么出来的）",[13,23361,23362],{},"回到正题，“数据意识”和人格有什么关系呢？在引入多重宇宙之前，应该是没有关系的。那“数据意识”和多重宇宙又有什么关系？我认为是“选择”。大部分“数据意识”的影视作品比如我上面提到的那些，如果把“数据意识”看作人格本身的拷贝，那么其内核并不在于是人还是机器，而是做了什么选择：你的人身选择了保全人类、而你的机身选择了发展机器，这是同一个人格在不同环境下做出的不同选择。那么多重宇宙就是同一人格在同一环境下做出的不同选择。由数学思想可知，同一环境和不同环境的并集就是所有环境，那么所有的事态就是诞生自“选择”。我粗浅的认为人格的“分裂”就在于“选择”的不同。",[13,23364,23365],{},"同时还要强调，“分裂”可以说每做一个选择都产生了分裂，但无法证明每一个选择都能导致“人格分裂”。在众多的人格分裂案例中，受到刺激是人格分裂的主要诱因，比如有人声称小时候受到虐待所以诞生了强势的人格。我认为“人格分裂”就是本我认知的差异导致极端情况下的反转，或者是“物极必反”。有人认为浅层意识代表感性而深层意识代表理性，因为人们偏向于选择直觉，而直觉往往是对的；但我更支持浅层意识代表的是理性而非感性，而深层意识才蕴藏着猛兽。我们最接近潜意识的时候是在睡梦中，当浅层意识睡去，深层意识才开始活跃。不妨回想自己做过的一些梦境，恐怖、喜爱、憎恨、欢愉，梦境大多是主题分明且情感强烈的。那么如果直觉是潜意识的指引，那我更倾向于认为它是本我强烈的求生欲。就像路上见到美女就想一亲芳泽、看见大把钞票就会起歪脑筋，但是事实上人们通过表层意识的主观引导避免了大部分时间的产生，但你无法否认看见的一刹没有心动过（除非实力悬殊 or 危及生命）。那么“人格分裂”就是浅层意识和深层意识的选择上出现了“不合”。",[13,23367,23368],{},"所以假设有这么一种情况：两个不同时间线或者曾经做过不同选择的你记忆融合，那么你对分歧的事物会如何选择？首先应该明确的就是，不论哪种情况，哪怕是物理的脑中桥手术，最终呈现的效果就是潜意识不一致，或者是掌握的信息不对等了。比如牛顿被苹果砸了发现了地心引力决定不吃苹果来纪念其做出的伟大贡献，而另一个牛顿则同样认为苹果是神圣的于是决定吃掉它，这是选择的不同；另一个时间线则是被梨子砸了于是有了不同的选择。如果这三个或",{"title":119,"searchDepth":144,"depth":144,"links":23370},[],"Tittle-Tattle",{},"Tittle-Tattle\u002F《论人格分裂》.md","\u002Fundergraduate\u002Fnote-0d84fc881c88",{"title":23337,"description":23345},"undergraduate\u002Fnote-0d84fc881c88",[23378,14542,23333],"大数据","YTobbBMIm1om25snEkGsaI7eBu2VNNBd2mMspmOttag",{"id":23381,"title":23382,"assetBase":239,"author":8,"body":23383,"category":23936,"collection":23324,"date":23325,"description":23387,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":23937,"navigation":128,"originalPath":23938,"path":23939,"seo":23940,"source":23330,"stem":23941,"tags":23942,"weight":250,"__hash__":23943},"content\u002Fundergraduate\u002Fnote-1521338a667d.md","Java混合Scala",{"type":10,"value":23384,"toc":23934},[23385,23388,23391,23394,23397,23400,23404,23519,23523,23634,23637,23640,23650,23699,23702,23788,23791,23794,23866,23869,23901,23904,23907,23909,23912,23919,23926,23932],[13,23386,23387],{},"最近这几天把Scala学完了，被他的数据处理能力深深的折服。",[13,23389,23390],{},"尤其是WordCount功能，之前接过的一个小外包就有这种要求的分词功能，当时是使用的开源依赖Kumo词库，但是别人的东西怎么实现的说实话真不知道。",[13,23392,23393],{},"后来和同学探讨的过程中了解到Elastic Search是可以实现分词功能的，效果极佳但是资源占用大，对于一个小项目来说可能资源大部分回响ES倾斜，所以虽然有所耳闻但是并没有实际实践。",[13,23395,23396],{},"再后来学了Hadoop框架，了解到WordCount在上面的实现是拆分成Map和Reduce两个阶段，但是其过程主要面向框架中处理，虽然都是Java但是其实很多过程并不清晰（其实是没能力手撸一个）",[13,23398,23399],{},"然后学了Scala，刚好Scala最后也是介绍了WordCount功能，本质上Scala对WordCount的处理也是一个Map、Reduce的过程，但是代码简洁（可读性不强），流程也更清晰。于是想着Java和Scala都是基于JVM，那干脆Java中调用Scala，看能否实现。",[10548,23401,23403],{"id":23402},"scala代码如下","Scala代码如下：",[114,23405,23409],{"className":23406,"code":23407,"language":23408,"meta":119,"style":119},"language-scala shiki shiki-themes github-dark","import java.util\nimport scala.collection.JavaConverters._  \u002F\u002F 格式转换依赖包\n\nclass wc {\n  def WordCount(stringList: util.List[String]): util.List[(String, Int)] = {\n    val s = stringList.asScala.toList  \u002F\u002F 格式转换Java.List --> Scala.List\n    \u002F\u002F 1) 将句子切分成单词\n    val wordList: List[String] = s.flatMap(str => str.split(\" \"))\n    \u002F\u002F 2) 将相同的单词放置在一起\n    val wordToWordsMap: Map[String, List[String]] = wordList.groupBy(word => word)\n    \u002F\u002F 3) 对相同的单词进行计数\n    \u002F\u002F (word, list) => (word, count)\n    val wordToCountMap: Map[String, Int] = wordToWordsMap.map(tuple => (tuple._1, tuple._2.size))\n    \u002F\u002F 4) 对计数完成后的结果进行排序（降序）\n    val sortList: List[(String, Int)] = wordToCountMap.toList.sortWith {\n      (left, right) => {\n        left._2 > right._2\n      }\n    }\n    sortList.asJava  \u002F\u002F 以Java.List的格式返回\n  }\n}\n","scala",[17,23410,23411,23416,23421,23425,23430,23435,23440,23445,23450,23455,23460,23465,23470,23475,23480,23485,23490,23495,23500,23504,23509,23514],{"__ignoreMap":119},[78,23412,23413],{"class":124,"line":125},[78,23414,23415],{},"import java.util\n",[78,23417,23418],{"class":124,"line":132},[78,23419,23420],{},"import scala.collection.JavaConverters._  \u002F\u002F 格式转换依赖包\n",[78,23422,23423],{"class":124,"line":138},[78,23424,129],{"emptyLinePlaceholder":128},[78,23426,23427],{"class":124,"line":144},[78,23428,23429],{},"class wc {\n",[78,23431,23432],{"class":124,"line":150},[78,23433,23434],{},"  def WordCount(stringList: util.List[String]): util.List[(String, Int)] = {\n",[78,23436,23437],{"class":124,"line":156},[78,23438,23439],{},"    val s = stringList.asScala.toList  \u002F\u002F 格式转换Java.List --> Scala.List\n",[78,23441,23442],{"class":124,"line":162},[78,23443,23444],{},"    \u002F\u002F 1) 将句子切分成单词\n",[78,23446,23447],{"class":124,"line":168},[78,23448,23449],{},"    val wordList: List[String] = s.flatMap(str => str.split(\" \"))\n",[78,23451,23452],{"class":124,"line":174},[78,23453,23454],{},"    \u002F\u002F 2) 将相同的单词放置在一起\n",[78,23456,23457],{"class":124,"line":180},[78,23458,23459],{},"    val wordToWordsMap: Map[String, List[String]] = wordList.groupBy(word => word)\n",[78,23461,23462],{"class":124,"line":186},[78,23463,23464],{},"    \u002F\u002F 3) 对相同的单词进行计数\n",[78,23466,23467],{"class":124,"line":192},[78,23468,23469],{},"    \u002F\u002F (word, list) => (word, count)\n",[78,23471,23472],{"class":124,"line":198},[78,23473,23474],{},"    val wordToCountMap: Map[String, Int] = wordToWordsMap.map(tuple => (tuple._1, tuple._2.size))\n",[78,23476,23477],{"class":124,"line":204},[78,23478,23479],{},"    \u002F\u002F 4) 对计数完成后的结果进行排序（降序）\n",[78,23481,23482],{"class":124,"line":210},[78,23483,23484],{},"    val sortList: List[(String, Int)] = wordToCountMap.toList.sortWith {\n",[78,23486,23487],{"class":124,"line":216},[78,23488,23489],{},"      (left, right) => {\n",[78,23491,23492],{"class":124,"line":222},[78,23493,23494],{},"        left._2 > right._2\n",[78,23496,23497],{"class":124,"line":421},[78,23498,23499],{},"      }\n",[78,23501,23502],{"class":124,"line":427},[78,23503,15810],{},[78,23505,23506],{"class":124,"line":433},[78,23507,23508],{},"    sortList.asJava  \u002F\u002F 以Java.List的格式返回\n",[78,23510,23511],{"class":124,"line":2443},[78,23512,23513],{},"  }\n",[78,23515,23516],{"class":124,"line":2448},[78,23517,23518],{},"}\n",[10548,23520,23522],{"id":23521},"java端代码如下","Java端代码如下：",[114,23524,23528],{"className":23525,"code":23526,"language":23527,"meta":119,"style":119},"language-Java shiki shiki-themes github-dark","import scala.Tuple2;\n\u002F\u002F 这里引用了Scala元组\nimport java.util.*;\n\npublic class WCImp {\n    public static void main(String[] args) {\n        List\u003CString> sl = new ArrayList\u003CString>();\n        sl.add(\"Hello Scala Hbase kafka\");\n        sl.add(\"Hello Scala Hbase\");\n        sl.add(\" Hello Scala\");\n        sl.add(\"Hello\");\n        System.out.println(sl);\n\n        wc word = new wc();\n        List\u003CTuple2\u003CString, Object>> s = word.WordCount(sl);\n        System.out.println(s);\n    }\n}\n\n\n\u002F\u002F 输出结果：\n\u002F\u002F [(Hello,4), (Scala,3), (Hbase,2), (,1), (kafka,1)]\n","Java",[17,23529,23530,23535,23540,23545,23549,23554,23559,23564,23569,23574,23579,23584,23589,23593,23598,23603,23608,23612,23616,23620,23624,23629],{"__ignoreMap":119},[78,23531,23532],{"class":124,"line":125},[78,23533,23534],{},"import scala.Tuple2;\n",[78,23536,23537],{"class":124,"line":132},[78,23538,23539],{},"\u002F\u002F 这里引用了Scala元组\n",[78,23541,23542],{"class":124,"line":138},[78,23543,23544],{},"import java.util.*;\n",[78,23546,23547],{"class":124,"line":144},[78,23548,129],{"emptyLinePlaceholder":128},[78,23550,23551],{"class":124,"line":150},[78,23552,23553],{},"public class WCImp {\n",[78,23555,23556],{"class":124,"line":156},[78,23557,23558],{},"    public static void main(String[] args) {\n",[78,23560,23561],{"class":124,"line":162},[78,23562,23563],{},"        List\u003CString> sl = new ArrayList\u003CString>();\n",[78,23565,23566],{"class":124,"line":168},[78,23567,23568],{},"        sl.add(\"Hello Scala Hbase kafka\");\n",[78,23570,23571],{"class":124,"line":174},[78,23572,23573],{},"        sl.add(\"Hello Scala Hbase\");\n",[78,23575,23576],{"class":124,"line":180},[78,23577,23578],{},"        sl.add(\" Hello Scala\");\n",[78,23580,23581],{"class":124,"line":186},[78,23582,23583],{},"        sl.add(\"Hello\");\n",[78,23585,23586],{"class":124,"line":192},[78,23587,23588],{},"        System.out.println(sl);\n",[78,23590,23591],{"class":124,"line":198},[78,23592,129],{"emptyLinePlaceholder":128},[78,23594,23595],{"class":124,"line":204},[78,23596,23597],{},"        wc word = new wc();\n",[78,23599,23600],{"class":124,"line":210},[78,23601,23602],{},"        List\u003CTuple2\u003CString, Object>> s = word.WordCount(sl);\n",[78,23604,23605],{"class":124,"line":216},[78,23606,23607],{},"        System.out.println(s);\n",[78,23609,23610],{"class":124,"line":222},[78,23611,15810],{},[78,23613,23614],{"class":124,"line":421},[78,23615,23518],{},[78,23617,23618],{"class":124,"line":427},[78,23619,129],{"emptyLinePlaceholder":128},[78,23621,23622],{"class":124,"line":433},[78,23623,129],{"emptyLinePlaceholder":128},[78,23625,23626],{"class":124,"line":2443},[78,23627,23628],{},"\u002F\u002F 输出结果：\n",[78,23630,23631],{"class":124,"line":2448},[78,23632,23633],{},"\u002F\u002F [(Hello,4), (Scala,3), (Hbase,2), (,1), (kafka,1)]\n",[13,23635,23636],{},"关于这个Tuple元组类型，Java中没有原生支持元组，所以还是导入了一个Scala下的依赖包实现Java端数据的传输，这里是为了方便将传回的数据再在Java中进行处理，如果直接作为结果输出可以不需要在Scala那边转Java格式。",[13,23638,23639],{},"如果还想全部变成Java的话可以尝试在Scala那边将tuple转成map或者其他之后再传，但个人认为这个WordCount的例子中并没有必要。同时，在Java中引入Tuple2后也能实现Scala的元组操作，我觉得挺好玩的（但真不一定很方便）",[13,23641,23642,23643,23649],{},"关于Scala的数据类型，Java中一切类继承自Object类，所以String自然也是Object的子类；但是Scala中略有不同（参照博客",[5009,23644,23648],{"href":23645,"rel":23646},"https:\u002F\u002Fwww.cnblogs.com\u002Ftt-day\u002Fp\u002F16499623.html",[23647],"nofollow","scala中的数据类型","），Scala的基本数据类型继承自AnyVal，但是String，我们通过源码：",[114,23651,23655],{"className":23652,"code":23653,"language":23654,"meta":119,"style":119},"language-java shiki shiki-themes github-dark","package java.lang;\n\nimport java.io.ObjectStreamField;\nimport java.io.UnsupportedEncodingException;\nimport java.nio.charset.Charset;\nimport java.util.*;\n\npublic final class String\n    implements java.io.Serializable, Comparable\u003CString>, CharSequence\n","java",[17,23656,23657,23662,23666,23671,23676,23681,23685,23689,23694],{"__ignoreMap":119},[78,23658,23659],{"class":124,"line":125},[78,23660,23661],{},"package java.lang;\n",[78,23663,23664],{"class":124,"line":132},[78,23665,129],{"emptyLinePlaceholder":128},[78,23667,23668],{"class":124,"line":138},[78,23669,23670],{},"import java.io.ObjectStreamField;\n",[78,23672,23673],{"class":124,"line":144},[78,23674,23675],{},"import java.io.UnsupportedEncodingException;\n",[78,23677,23678],{"class":124,"line":150},[78,23679,23680],{},"import java.nio.charset.Charset;\n",[78,23682,23683],{"class":124,"line":156},[78,23684,23544],{},[78,23686,23687],{"class":124,"line":162},[78,23688,129],{"emptyLinePlaceholder":128},[78,23690,23691],{"class":124,"line":168},[78,23692,23693],{},"public final class String\n",[78,23695,23696],{"class":124,"line":174},[78,23697,23698],{},"    implements java.io.Serializable, Comparable\u003CString>, CharSequence\n",[13,23700,23701],{},"索引自String.java，所以说Scala中的String和Java中的String基本上是一样的（甚至跳转到的源码也是一样的）。作为参照，可以参考Scala其他数据类型的源码（以Int为例）：",[114,23703,23705],{"className":23406,"code":23704,"language":23408,"meta":119,"style":119},"package scala\n\n\u002F\u002F Int.scala\nfinal abstract class Int private extends AnyVal {\n  def toByte: Byte\n  def toShort: Short\n  def toChar: Char\n  def toInt: Int\n  def toLong: Long\n  def toFloat: Float\n  def toDouble: Double\n}\n\n\u002F\u002F AnyVal.scala\nabstract class AnyVal extends Any {\n  def getClass(): Class[_ \u003C: AnyVal] = null\n}\n",[17,23706,23707,23712,23716,23721,23726,23731,23736,23741,23746,23751,23756,23761,23765,23769,23774,23779,23784],{"__ignoreMap":119},[78,23708,23709],{"class":124,"line":125},[78,23710,23711],{},"package scala\n",[78,23713,23714],{"class":124,"line":132},[78,23715,129],{"emptyLinePlaceholder":128},[78,23717,23718],{"class":124,"line":138},[78,23719,23720],{},"\u002F\u002F Int.scala\n",[78,23722,23723],{"class":124,"line":144},[78,23724,23725],{},"final abstract class Int private extends AnyVal {\n",[78,23727,23728],{"class":124,"line":150},[78,23729,23730],{},"  def toByte: Byte\n",[78,23732,23733],{"class":124,"line":156},[78,23734,23735],{},"  def toShort: Short\n",[78,23737,23738],{"class":124,"line":162},[78,23739,23740],{},"  def toChar: Char\n",[78,23742,23743],{"class":124,"line":168},[78,23744,23745],{},"  def toInt: Int\n",[78,23747,23748],{"class":124,"line":174},[78,23749,23750],{},"  def toLong: Long\n",[78,23752,23753],{"class":124,"line":180},[78,23754,23755],{},"  def toFloat: Float\n",[78,23757,23758],{"class":124,"line":186},[78,23759,23760],{},"  def toDouble: Double\n",[78,23762,23763],{"class":124,"line":192},[78,23764,23518],{},[78,23766,23767],{"class":124,"line":198},[78,23768,129],{"emptyLinePlaceholder":128},[78,23770,23771],{"class":124,"line":204},[78,23772,23773],{},"\u002F\u002F AnyVal.scala\n",[78,23775,23776],{"class":124,"line":210},[78,23777,23778],{},"abstract class AnyVal extends Any {\n",[78,23780,23781],{"class":124,"line":216},[78,23782,23783],{},"  def getClass(): Class[_ \u003C: AnyVal] = null\n",[78,23785,23786],{"class":124,"line":222},[78,23787,23518],{},[13,23789,23790],{},"这样就能很好的解释为什么在Scala和Java进行数据类型转换的时候String只能转String，而其他的都是AnyVal转Object了。",[13,23792,23793],{},"回到Java的Tuple2中，应该对于Tuple包有相应的包处理，但是我只是一时兴起，并没有过多深入，所以只是浅浅的在Java中对Tuple进行一个输出观察，代码如下：",[114,23795,23797],{"className":23652,"code":23796,"language":23654,"meta":119,"style":119},"for (Tuple2 i: s) {\n    System.out.println(\"i =\" + i);\n    System.out.println(\"i.toString =\" + i.toString());\n    System.out.println(\"Normal: \" + i._1 + \" \" +  i._2);\n    String s1 = (String) i._1;\n    Integer s2 = (Integer) i._2;\n    System.out.println(\"Change: \" + s1 + \" \" + s2);\n}\n\n\u002F\u002F 输出结果：\n\u002F\u002F i =(Hello,4)\n\u002F\u002F i.toString =(Hello,4)\n\u002F\u002F Normal: Hello 4\n\u002F\u002F Change: Hello 4\n",[17,23798,23799,23804,23809,23814,23819,23824,23829,23834,23838,23842,23846,23851,23856,23861],{"__ignoreMap":119},[78,23800,23801],{"class":124,"line":125},[78,23802,23803],{},"for (Tuple2 i: s) {\n",[78,23805,23806],{"class":124,"line":132},[78,23807,23808],{},"    System.out.println(\"i =\" + i);\n",[78,23810,23811],{"class":124,"line":138},[78,23812,23813],{},"    System.out.println(\"i.toString =\" + i.toString());\n",[78,23815,23816],{"class":124,"line":144},[78,23817,23818],{},"    System.out.println(\"Normal: \" + i._1 + \" \" +  i._2);\n",[78,23820,23821],{"class":124,"line":150},[78,23822,23823],{},"    String s1 = (String) i._1;\n",[78,23825,23826],{"class":124,"line":156},[78,23827,23828],{},"    Integer s2 = (Integer) i._2;\n",[78,23830,23831],{"class":124,"line":162},[78,23832,23833],{},"    System.out.println(\"Change: \" + s1 + \" \" + s2);\n",[78,23835,23836],{"class":124,"line":168},[78,23837,23518],{},[78,23839,23840],{"class":124,"line":174},[78,23841,129],{"emptyLinePlaceholder":128},[78,23843,23844],{"class":124,"line":180},[78,23845,23628],{},[78,23847,23848],{"class":124,"line":186},[78,23849,23850],{},"\u002F\u002F i =(Hello,4)\n",[78,23852,23853],{"class":124,"line":192},[78,23854,23855],{},"\u002F\u002F i.toString =(Hello,4)\n",[78,23857,23858],{"class":124,"line":198},[78,23859,23860],{},"\u002F\u002F Normal: Hello 4\n",[78,23862,23863],{"class":124,"line":204},[78,23864,23865],{},"\u002F\u002F Change: Hello 4\n",[13,23867,23868],{},"可以看出，输出结果在Java能够正常使用，用getClass函数查看：",[114,23870,23872],{"className":23652,"code":23871,"language":23654,"meta":119,"style":119},"System.out.println(\"Normal: \" + i._1.getClass() + \" \" +  i._2.getClass());\nSystem.out.println(\"Normal: \" + i._1.getClass() + \" \" +  i._2.getClass());\n\n\u002F\u002F 输出结果：\n\u002F\u002F Normal: class java.lang.String class java.lang.Integer\n\u002F\u002F Change: class java.lang.String class java.lang.Integer\n",[17,23873,23874,23879,23883,23887,23891,23896],{"__ignoreMap":119},[78,23875,23876],{"class":124,"line":125},[78,23877,23878],{},"System.out.println(\"Normal: \" + i._1.getClass() + \" \" +  i._2.getClass());\n",[78,23880,23881],{"class":124,"line":132},[78,23882,23878],{},[78,23884,23885],{"class":124,"line":138},[78,23886,129],{"emptyLinePlaceholder":128},[78,23888,23889],{"class":124,"line":144},[78,23890,23628],{},[78,23892,23893],{"class":124,"line":150},[78,23894,23895],{},"\u002F\u002F Normal: class java.lang.String class java.lang.Integer\n",[78,23897,23898],{"class":124,"line":156},[78,23899,23900],{},"\u002F\u002F Change: class java.lang.String class java.lang.Integer\n",[13,23902,23903],{},"但是注意！虽然其类型都是Java.lang.*，但是tuple中的仍然属于Object类型，需要转换。",[13,23905,23906],{},"本来还想做个Scala、Java转Json和读取Json的测试，但是需要引入其他的依赖，暂时先进行搁置。",[23289,23908],{},[13,23910,23911],{},"参考资料：",[13,23913,23914],{},[5009,23915,23918],{"href":23916,"rel":23917},"http:\u002F\u002Fcn.voidcc.com\u002Fquestion\u002Fp-vrjwohbl-bad.html",[23647],"为什么String与Int，Boolean，Byte ...在scala中不同？",[13,23920,23921],{},[5009,23922,23925],{"href":23923,"rel":23924},"https:\u002F\u002Fqa.1r1g.com\u002Fsf\u002Fask\u002F47229941\u002F",[23647],"将Java集合转换为Scala集合",[13,23927,23928],{},[5009,23929,23925],{"href":23930,"rel":23931},"https:\u002F\u002Fwww.dovov.com\u002Fjavascala-3.html",[23647],[226,23933,228],{},{"title":119,"searchDepth":144,"depth":144,"links":23935},[],"Little Tips",{},"Little Tips\u002FJava混合Scala.md","\u002Fundergraduate\u002Fnote-1521338a667d",{"title":23382,"description":23387},"undergraduate\u002Fnote-1521338a667d",[23378,10715],"EW2EuCRhQG-D-l373ROaespKY74AWlPXUf00vfrwrJQ",{"id":23945,"title":23946,"assetBase":239,"author":8,"body":23947,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":25492,"navigation":128,"originalPath":25493,"path":25494,"seo":25495,"source":23330,"stem":25496,"tags":25497,"weight":250,"__hash__":25498},"content\u002Fundergraduate\u002Fnote-1699c2c6a95c.md","LangChain工程实践",{"type":10,"value":23948,"toc":25486},[23949,23953,23978,23982,24334,24337,24341,24346,24550,24555,24778,24782,24787,25301,25306,25478,25481,25484],[4517,23950,23952],{"id":23951},"langchain-实践","LangChain 实践",[72,23954,23955,23958,23961,23968,23975],{},[13,23956,23957],{},"前言：",[13,23959,23960],{},"该文档为《LangChain 入门与避坑指北》的项目实践，实际上就是将",[13,23962,23963],{},[5009,23964,23967],{"href":23965,"rel":23966},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1t8411y7fp?vd_source=75fc8fb6d21bda88e7f19b3fe3d00dbb",[23647],"ChatGLM+Langchain构建本地知识库，只需6G显存，支持实时上传文档",[13,23969,23970],{},[5009,23971,23974],{"href":23972,"rel":23973},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1E94y187YX?vd_source=75fc8fb6d21bda88e7f19b3fe3d00dbb",[23647],"九天玩转Langchain！",[13,23976,23977],{},"中的项目进行复现与注释~",[107,23979,23981],{"id":23980},"_1本地知识库问答文本","1、本地知识库问答（文本）",[114,23983,23985],{"className":116,"code":23984,"language":118,"meta":119,"style":119},"import os\n\nfrom langchain.chains import RetrievalQA  # 导入 RetrievalQA 类用于检索问答\nfrom langchain.embeddings.huggingface import HuggingFaceEmbeddings\nfrom langchain.text_splitter import CharacterTextSplitter\nfrom langchain_community.document_loaders import DirectoryLoader\nfrom langchain_community.vectorstores import Chroma\n\nfrom langchain_chatglm3 import ChatGLM3  # 自定义 ChatGLM3 类用于加载模型\n\n# 加载embeddings\nembeddings_model_dict = {\n    \"ernie-tiny\": \"nghuyong\u002Fernie-3.0-nano-zh\",\n    \"ernie-base\": \"nghuyong\u002Fernie-3.0-base-zh\",\n    \"text2vec\": \"GranymeNil\u002Ftext2vec-large-chinese\",\n    \"text2vec2\": \"uer\u002Fsbert-base-chinese-nil\",\n    \"text2vec3\": \"shibing624\u002Ftext2vec-base-chinese\",\n}\n\n\n# 这里默认是同级目录下的 data 文件夹，将txt文件放入 data 文件夹即可\ndef load_document(directory=\"data\"):\n    loader = DirectoryLoader(directory)  # 加载文档\n    documents = loader.load()\n    text_splitter = CharacterTextSplitter(chunk_size=256, chunk_overlap=0)\n    split_docs = text_splitter.split_documents(documents)  # 切分文档\n    print(split_docs[:2])\n    return split_docs\n\n\ndef load_embedding_mode(model_name=\"ernie-tiny\"):\n    encode_kwargs = {\"normalize_embeddings\": False}\n    model_kwargs = {\"device\": \"cuda:0\"}\n    return HuggingFaceEmbeddings(\n        model_name=embeddings_model_dict[model_name],\n        encode_kwargs=encode_kwargs,\n        model_kwargs=model_kwargs\n    )\n\n\ndef store_chroma(docs, embeddings, persist_directory='VectorStore'):\n    # 存储 Chroma 向量化的文档\n    db = Chroma.from_documents(docs, embeddings, persist_directory=persist_directory)\n    db.persist()\n    return db\n\n\nembeddings = load_embedding_mode('text2vec3')  # 加载嵌入模型\nif not os.path.exists(\"Vectorstore\"):\n    documents = load_document()  # 加载文档\n    db = store_chroma(documents, embeddings)  # 存储向量化的文档\nelse:\n    # 加载已存在的向量化文档\n    db = Chroma(persist_directory='VectorStore', embedding_function=embeddings)\n\n# 创建 ChatGLM3 实例\nllm = ChatGLM3(endpoint_url=\"http:\u002F\u002Flocalhost:8000\u002F\", max_token=5000)\n\nretriever = db.as_retriever()  # 创建文档检索器\nqa = RetrievalQA.from_chain_type(\n    llm=llm,\n    chain_type='stuff',\n    retriever=retriever\n)  # 装填至 chain\n\nresponse = qa.invoke('你的数据库中有几本书？')  # 使用 QA 模型对问题进行推理\nprint(response)\n",[17,23986,23987,23991,23995,24000,24005,24010,24015,24020,24024,24029,24033,24038,24043,24048,24053,24058,24063,24068,24072,24076,24080,24085,24090,24095,24100,24105,24110,24115,24120,24124,24128,24133,24138,24143,24148,24153,24158,24163,24168,24173,24178,24184,24190,24196,24202,24208,24213,24218,24224,24230,24236,24242,24248,24254,24260,24265,24271,24277,24282,24288,24294,24300,24306,24312,24318,24323,24329],{"__ignoreMap":119},[78,23988,23989],{"class":124,"line":125},[78,23990,7771],{},[78,23992,23993],{"class":124,"line":132},[78,23994,129],{"emptyLinePlaceholder":128},[78,23996,23997],{"class":124,"line":138},[78,23998,23999],{},"from langchain.chains import RetrievalQA  # 导入 RetrievalQA 类用于检索问答\n",[78,24001,24002],{"class":124,"line":144},[78,24003,24004],{},"from langchain.embeddings.huggingface import HuggingFaceEmbeddings\n",[78,24006,24007],{"class":124,"line":150},[78,24008,24009],{},"from langchain.text_splitter import CharacterTextSplitter\n",[78,24011,24012],{"class":124,"line":156},[78,24013,24014],{},"from langchain_community.document_loaders import DirectoryLoader\n",[78,24016,24017],{"class":124,"line":162},[78,24018,24019],{},"from langchain_community.vectorstores import Chroma\n",[78,24021,24022],{"class":124,"line":168},[78,24023,129],{"emptyLinePlaceholder":128},[78,24025,24026],{"class":124,"line":174},[78,24027,24028],{},"from langchain_chatglm3 import ChatGLM3  # 自定义 ChatGLM3 类用于加载模型\n",[78,24030,24031],{"class":124,"line":180},[78,24032,129],{"emptyLinePlaceholder":128},[78,24034,24035],{"class":124,"line":186},[78,24036,24037],{},"# 加载embeddings\n",[78,24039,24040],{"class":124,"line":192},[78,24041,24042],{},"embeddings_model_dict = {\n",[78,24044,24045],{"class":124,"line":198},[78,24046,24047],{},"    \"ernie-tiny\": \"nghuyong\u002Fernie-3.0-nano-zh\",\n",[78,24049,24050],{"class":124,"line":204},[78,24051,24052],{},"    \"ernie-base\": \"nghuyong\u002Fernie-3.0-base-zh\",\n",[78,24054,24055],{"class":124,"line":210},[78,24056,24057],{},"    \"text2vec\": \"GranymeNil\u002Ftext2vec-large-chinese\",\n",[78,24059,24060],{"class":124,"line":216},[78,24061,24062],{},"    \"text2vec2\": \"uer\u002Fsbert-base-chinese-nil\",\n",[78,24064,24065],{"class":124,"line":222},[78,24066,24067],{},"    \"text2vec3\": \"shibing624\u002Ftext2vec-base-chinese\",\n",[78,24069,24070],{"class":124,"line":421},[78,24071,23518],{},[78,24073,24074],{"class":124,"line":427},[78,24075,129],{"emptyLinePlaceholder":128},[78,24077,24078],{"class":124,"line":433},[78,24079,129],{"emptyLinePlaceholder":128},[78,24081,24082],{"class":124,"line":2443},[78,24083,24084],{},"# 这里默认是同级目录下的 data 文件夹，将txt文件放入 data 文件夹即可\n",[78,24086,24087],{"class":124,"line":2448},[78,24088,24089],{},"def load_document(directory=\"data\"):\n",[78,24091,24092],{"class":124,"line":2454},[78,24093,24094],{},"    loader = DirectoryLoader(directory)  # 加载文档\n",[78,24096,24097],{"class":124,"line":2460},[78,24098,24099],{},"    documents = loader.load()\n",[78,24101,24102],{"class":124,"line":2465},[78,24103,24104],{},"    text_splitter = CharacterTextSplitter(chunk_size=256, chunk_overlap=0)\n",[78,24106,24107],{"class":124,"line":2470},[78,24108,24109],{},"    split_docs = text_splitter.split_documents(documents)  # 切分文档\n",[78,24111,24112],{"class":124,"line":2903},[78,24113,24114],{},"    print(split_docs[:2])\n",[78,24116,24117],{"class":124,"line":2909},[78,24118,24119],{},"    return split_docs\n",[78,24121,24122],{"class":124,"line":11477},[78,24123,129],{"emptyLinePlaceholder":128},[78,24125,24126],{"class":124,"line":13374},[78,24127,129],{"emptyLinePlaceholder":128},[78,24129,24130],{"class":124,"line":13380},[78,24131,24132],{},"def load_embedding_mode(model_name=\"ernie-tiny\"):\n",[78,24134,24135],{"class":124,"line":13386},[78,24136,24137],{},"    encode_kwargs = {\"normalize_embeddings\": False}\n",[78,24139,24140],{"class":124,"line":13722},[78,24141,24142],{},"    model_kwargs = {\"device\": \"cuda:0\"}\n",[78,24144,24145],{"class":124,"line":13727},[78,24146,24147],{},"    return HuggingFaceEmbeddings(\n",[78,24149,24150],{"class":124,"line":13953},[78,24151,24152],{},"        model_name=embeddings_model_dict[model_name],\n",[78,24154,24155],{"class":124,"line":13958},[78,24156,24157],{},"        encode_kwargs=encode_kwargs,\n",[78,24159,24160],{"class":124,"line":13964},[78,24161,24162],{},"        model_kwargs=model_kwargs\n",[78,24164,24165],{"class":124,"line":13969},[78,24166,24167],{},"    )\n",[78,24169,24171],{"class":124,"line":24170},39,[78,24172,129],{"emptyLinePlaceholder":128},[78,24174,24176],{"class":124,"line":24175},40,[78,24177,129],{"emptyLinePlaceholder":128},[78,24179,24181],{"class":124,"line":24180},41,[78,24182,24183],{},"def store_chroma(docs, embeddings, persist_directory='VectorStore'):\n",[78,24185,24187],{"class":124,"line":24186},42,[78,24188,24189],{},"    # 存储 Chroma 向量化的文档\n",[78,24191,24193],{"class":124,"line":24192},43,[78,24194,24195],{},"    db = Chroma.from_documents(docs, embeddings, persist_directory=persist_directory)\n",[78,24197,24199],{"class":124,"line":24198},44,[78,24200,24201],{},"    db.persist()\n",[78,24203,24205],{"class":124,"line":24204},45,[78,24206,24207],{},"    return db\n",[78,24209,24211],{"class":124,"line":24210},46,[78,24212,129],{"emptyLinePlaceholder":128},[78,24214,24216],{"class":124,"line":24215},47,[78,24217,129],{"emptyLinePlaceholder":128},[78,24219,24221],{"class":124,"line":24220},48,[78,24222,24223],{},"embeddings = load_embedding_mode('text2vec3')  # 加载嵌入模型\n",[78,24225,24227],{"class":124,"line":24226},49,[78,24228,24229],{},"if not os.path.exists(\"Vectorstore\"):\n",[78,24231,24233],{"class":124,"line":24232},50,[78,24234,24235],{},"    documents = load_document()  # 加载文档\n",[78,24237,24239],{"class":124,"line":24238},51,[78,24240,24241],{},"    db = store_chroma(documents, embeddings)  # 存储向量化的文档\n",[78,24243,24245],{"class":124,"line":24244},52,[78,24246,24247],{},"else:\n",[78,24249,24251],{"class":124,"line":24250},53,[78,24252,24253],{},"    # 加载已存在的向量化文档\n",[78,24255,24257],{"class":124,"line":24256},54,[78,24258,24259],{},"    db = Chroma(persist_directory='VectorStore', embedding_function=embeddings)\n",[78,24261,24263],{"class":124,"line":24262},55,[78,24264,129],{"emptyLinePlaceholder":128},[78,24266,24268],{"class":124,"line":24267},56,[78,24269,24270],{},"# 创建 ChatGLM3 实例\n",[78,24272,24274],{"class":124,"line":24273},57,[78,24275,24276],{},"llm = ChatGLM3(endpoint_url=\"http:\u002F\u002Flocalhost:8000\u002F\", max_token=5000)\n",[78,24278,24280],{"class":124,"line":24279},58,[78,24281,129],{"emptyLinePlaceholder":128},[78,24283,24285],{"class":124,"line":24284},59,[78,24286,24287],{},"retriever = db.as_retriever()  # 创建文档检索器\n",[78,24289,24291],{"class":124,"line":24290},60,[78,24292,24293],{},"qa = RetrievalQA.from_chain_type(\n",[78,24295,24297],{"class":124,"line":24296},61,[78,24298,24299],{},"    llm=llm,\n",[78,24301,24303],{"class":124,"line":24302},62,[78,24304,24305],{},"    chain_type='stuff',\n",[78,24307,24309],{"class":124,"line":24308},63,[78,24310,24311],{},"    retriever=retriever\n",[78,24313,24315],{"class":124,"line":24314},64,[78,24316,24317],{},")  # 装填至 chain\n",[78,24319,24321],{"class":124,"line":24320},65,[78,24322,129],{"emptyLinePlaceholder":128},[78,24324,24326],{"class":124,"line":24325},66,[78,24327,24328],{},"response = qa.invoke('你的数据库中有几本书？')  # 使用 QA 模型对问题进行推理\n",[78,24330,24332],{"class":124,"line":24331},67,[78,24333,7818],{},[13,24335,24336],{},"**注意：**这个不能 copy 即用，使用的是 GLM3 模型，可以换成其他本地模型如 GLM，从控制台查看引入包即可。",[107,24338,24340],{"id":24339},"_2本地知识库问答pdf","2、本地知识库问答（PDF）",[49,24342,24343],{},[52,24344,24345],{},"langchain_helper.py （实现方法的工具类）",[114,24347,24349],{"className":116,"code":24348,"language":118,"meta":119,"style":119},"import os\n\nfrom langchain_community.document_loaders import PyPDFLoader  \nfrom langchain.embeddings.openai import OpenAIEmbeddings\nfrom langchain.indexes.vectorstore import VectorstoreIndexCreator\nfrom langchain.vectorstores.chroma import Chroma  \nfrom langchain.indexes.vectorstore import VectorStoreIndexWrapper  #\n\nos.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'  # 设置模型接口位置\nos.environ[\"OPENAI_API_KEY\"] = 'sk-~'        # 设置模型 KEY\nfile_path = \"*.pdf\"  # PDF 文件路径\nlocal_persist_path = \".\u002Fvector_store\"  # 向量存储的本地持久化路径\n\n\n# 获取索引路径\ndef get_index_path(index_name):\n    return os.path.join(local_persist_path, index_name)\n\n\n# 加载PDF文档并保存索引\ndef load_pdf_and_save_index(file_path, index_name):\n    loader = PyPDFLoader(file_path)  # 使用 PyPDFLoader 加载PDF文档\n    index = VectorstoreIndexCreator(vectorstore_kwargs={\"persist_directory\": get_index_path(index_name)}). \\\n        from_loaders([loader])  # 创建向量存储索引\n    index.vectorstore.persist()  # 持久化索引\n\n\n# 加载索引\ndef load_index(index_name):\n    index_path = get_index_path(index_name)  # 获取索引路径\n    embedding = OpenAIEmbeddings()  # 使用 OpenAIEmbeddings 加载嵌入模型\n    vectordb = Chroma(\n        persist_directory=index_path,\n        embedding_function=embedding\n    )  # 创建 Chroma 向量存储\n    return VectorStoreIndexWrapper(vectorstore=vectordb)  # 返回向量存储索引的包装类\n\n\ndef query_index_lc(index, query):\n    # 使用 map_reduce 方法查询索引\n    ans = index.query_with_sources(query, chain_type=\"map_reduce\") \n    return ans['answer']\n\n",[17,24350,24351,24355,24359,24364,24369,24374,24379,24384,24388,24393,24398,24403,24408,24412,24416,24421,24426,24431,24435,24439,24444,24449,24454,24459,24464,24469,24473,24477,24482,24487,24492,24497,24502,24507,24512,24517,24522,24526,24530,24535,24540,24545],{"__ignoreMap":119},[78,24352,24353],{"class":124,"line":125},[78,24354,7771],{},[78,24356,24357],{"class":124,"line":132},[78,24358,129],{"emptyLinePlaceholder":128},[78,24360,24361],{"class":124,"line":138},[78,24362,24363],{},"from langchain_community.document_loaders import PyPDFLoader  \n",[78,24365,24366],{"class":124,"line":144},[78,24367,24368],{},"from langchain.embeddings.openai import OpenAIEmbeddings\n",[78,24370,24371],{"class":124,"line":150},[78,24372,24373],{},"from langchain.indexes.vectorstore import VectorstoreIndexCreator\n",[78,24375,24376],{"class":124,"line":156},[78,24377,24378],{},"from langchain.vectorstores.chroma import Chroma  \n",[78,24380,24381],{"class":124,"line":162},[78,24382,24383],{},"from langchain.indexes.vectorstore import VectorStoreIndexWrapper  #\n",[78,24385,24386],{"class":124,"line":168},[78,24387,129],{"emptyLinePlaceholder":128},[78,24389,24390],{"class":124,"line":174},[78,24391,24392],{},"os.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'  # 设置模型接口位置\n",[78,24394,24395],{"class":124,"line":180},[78,24396,24397],{},"os.environ[\"OPENAI_API_KEY\"] = 'sk-~'        # 设置模型 KEY\n",[78,24399,24400],{"class":124,"line":186},[78,24401,24402],{},"file_path = \"*.pdf\"  # PDF 文件路径\n",[78,24404,24405],{"class":124,"line":192},[78,24406,24407],{},"local_persist_path = \".\u002Fvector_store\"  # 向量存储的本地持久化路径\n",[78,24409,24410],{"class":124,"line":198},[78,24411,129],{"emptyLinePlaceholder":128},[78,24413,24414],{"class":124,"line":204},[78,24415,129],{"emptyLinePlaceholder":128},[78,24417,24418],{"class":124,"line":210},[78,24419,24420],{},"# 获取索引路径\n",[78,24422,24423],{"class":124,"line":216},[78,24424,24425],{},"def get_index_path(index_name):\n",[78,24427,24428],{"class":124,"line":222},[78,24429,24430],{},"    return os.path.join(local_persist_path, index_name)\n",[78,24432,24433],{"class":124,"line":421},[78,24434,129],{"emptyLinePlaceholder":128},[78,24436,24437],{"class":124,"line":427},[78,24438,129],{"emptyLinePlaceholder":128},[78,24440,24441],{"class":124,"line":433},[78,24442,24443],{},"# 加载PDF文档并保存索引\n",[78,24445,24446],{"class":124,"line":2443},[78,24447,24448],{},"def load_pdf_and_save_index(file_path, index_name):\n",[78,24450,24451],{"class":124,"line":2448},[78,24452,24453],{},"    loader = PyPDFLoader(file_path)  # 使用 PyPDFLoader 加载PDF文档\n",[78,24455,24456],{"class":124,"line":2454},[78,24457,24458],{},"    index = VectorstoreIndexCreator(vectorstore_kwargs={\"persist_directory\": get_index_path(index_name)}). \\\n",[78,24460,24461],{"class":124,"line":2460},[78,24462,24463],{},"        from_loaders([loader])  # 创建向量存储索引\n",[78,24465,24466],{"class":124,"line":2465},[78,24467,24468],{},"    index.vectorstore.persist()  # 持久化索引\n",[78,24470,24471],{"class":124,"line":2470},[78,24472,129],{"emptyLinePlaceholder":128},[78,24474,24475],{"class":124,"line":2903},[78,24476,129],{"emptyLinePlaceholder":128},[78,24478,24479],{"class":124,"line":2909},[78,24480,24481],{},"# 加载索引\n",[78,24483,24484],{"class":124,"line":11477},[78,24485,24486],{},"def load_index(index_name):\n",[78,24488,24489],{"class":124,"line":13374},[78,24490,24491],{},"    index_path = get_index_path(index_name)  # 获取索引路径\n",[78,24493,24494],{"class":124,"line":13380},[78,24495,24496],{},"    embedding = OpenAIEmbeddings()  # 使用 OpenAIEmbeddings 加载嵌入模型\n",[78,24498,24499],{"class":124,"line":13386},[78,24500,24501],{},"    vectordb = Chroma(\n",[78,24503,24504],{"class":124,"line":13722},[78,24505,24506],{},"        persist_directory=index_path,\n",[78,24508,24509],{"class":124,"line":13727},[78,24510,24511],{},"        embedding_function=embedding\n",[78,24513,24514],{"class":124,"line":13953},[78,24515,24516],{},"    )  # 创建 Chroma 向量存储\n",[78,24518,24519],{"class":124,"line":13958},[78,24520,24521],{},"    return VectorStoreIndexWrapper(vectorstore=vectordb)  # 返回向量存储索引的包装类\n",[78,24523,24524],{"class":124,"line":13964},[78,24525,129],{"emptyLinePlaceholder":128},[78,24527,24528],{"class":124,"line":13969},[78,24529,129],{"emptyLinePlaceholder":128},[78,24531,24532],{"class":124,"line":24170},[78,24533,24534],{},"def query_index_lc(index, query):\n",[78,24536,24537],{"class":124,"line":24175},[78,24538,24539],{},"    # 使用 map_reduce 方法查询索引\n",[78,24541,24542],{"class":124,"line":24180},[78,24543,24544],{},"    ans = index.query_with_sources(query, chain_type=\"map_reduce\") \n",[78,24546,24547],{"class":124,"line":24186},[78,24548,24549],{},"    return ans['answer']\n",[49,24551,24552],{},[52,24553,24554],{},"main.py （使用 fastapi 制作的简单接口交互）",[114,24556,24558],{"className":116,"code":24557,"language":118,"meta":119,"style":119},"from fastapi import FastAPI  # 导入 FastAPI 框架\nfrom typing import Annotated  # 导入 Annotated 用于在类型提示中注释\nfrom fastapi import File, Form, UploadFile\nfrom langchain_helper import *  # 导入 langchain_helper 中的函数\nfrom pydantic import BaseModel  # 导入 BaseModel 用于定义数据模型\nimport os\n\nfile_upload_path = \".\u002Fuploads\"  # 文件上传路径\napp = FastAPI()  # 创建 FastAPI 应用\n\n\n# 定义根路径的 GET 请求处理函数，返回一个简单的 JSON 响应\n@app.get(\"\u002F\")\ndef read_root():\n    return {\"Hello\": \"World\"}  \n\n\n@app.post(\"\u002Fupload\")\ndef upload_file(file: Annotated[UploadFile, File()], \n                index_name: Annotated[str, Form(...)]):\n    # 指定文件上传目标路径\n    file_upload_target_path = os.path.join(file_upload_path, file.filename)  \n\n    with open(file_upload_target_path, \"wb\") as f:\n        contents = file.file.read()\n        f.write(contents)  # 将接收到的文件内容写入目标文件路径\n\n    # 调用 load_pdf_and_save_index 函数对上传的文件进行处理\n    load_pdf_and_save_index(file_upload_target_path, index_name)  \n    # 返回上传文件的文件名和索引名\n    return {\"filename\": file.filename, \"index_name\": index_name}  \n\n\nclass Query(BaseModel):\n    index_name: str\n    query: str\n\n\n@app.post(\"\u002Fquery\")\ndef query_index(request: Query):\n    index_name = request.index_name\n    query = request.query\n    index = load_index(index_name)  # 调用 load_index 函数加载索引\n    ans = query_index_lc(index, query)  # 使用索引进行查询\n    # 返回查询结果、索引名和查询内容\n    return {\"answer\": ans, \"index_name\": index_name, \"query\": query}  \n",[17,24559,24560,24565,24570,24575,24580,24585,24589,24593,24598,24603,24607,24611,24616,24621,24626,24631,24635,24639,24644,24649,24654,24659,24664,24668,24673,24678,24683,24687,24692,24697,24702,24707,24711,24715,24720,24725,24730,24734,24738,24743,24748,24753,24758,24763,24768,24773],{"__ignoreMap":119},[78,24561,24562],{"class":124,"line":125},[78,24563,24564],{},"from fastapi import FastAPI  # 导入 FastAPI 框架\n",[78,24566,24567],{"class":124,"line":132},[78,24568,24569],{},"from typing import Annotated  # 导入 Annotated 用于在类型提示中注释\n",[78,24571,24572],{"class":124,"line":138},[78,24573,24574],{},"from fastapi import File, Form, UploadFile\n",[78,24576,24577],{"class":124,"line":144},[78,24578,24579],{},"from langchain_helper import *  # 导入 langchain_helper 中的函数\n",[78,24581,24582],{"class":124,"line":150},[78,24583,24584],{},"from pydantic import BaseModel  # 导入 BaseModel 用于定义数据模型\n",[78,24586,24587],{"class":124,"line":156},[78,24588,7771],{},[78,24590,24591],{"class":124,"line":162},[78,24592,129],{"emptyLinePlaceholder":128},[78,24594,24595],{"class":124,"line":168},[78,24596,24597],{},"file_upload_path = \".\u002Fuploads\"  # 文件上传路径\n",[78,24599,24600],{"class":124,"line":174},[78,24601,24602],{},"app = FastAPI()  # 创建 FastAPI 应用\n",[78,24604,24605],{"class":124,"line":180},[78,24606,129],{"emptyLinePlaceholder":128},[78,24608,24609],{"class":124,"line":186},[78,24610,129],{"emptyLinePlaceholder":128},[78,24612,24613],{"class":124,"line":192},[78,24614,24615],{},"# 定义根路径的 GET 请求处理函数，返回一个简单的 JSON 响应\n",[78,24617,24618],{"class":124,"line":198},[78,24619,24620],{},"@app.get(\"\u002F\")\n",[78,24622,24623],{"class":124,"line":204},[78,24624,24625],{},"def read_root():\n",[78,24627,24628],{"class":124,"line":210},[78,24629,24630],{},"    return {\"Hello\": \"World\"}  \n",[78,24632,24633],{"class":124,"line":216},[78,24634,129],{"emptyLinePlaceholder":128},[78,24636,24637],{"class":124,"line":222},[78,24638,129],{"emptyLinePlaceholder":128},[78,24640,24641],{"class":124,"line":421},[78,24642,24643],{},"@app.post(\"\u002Fupload\")\n",[78,24645,24646],{"class":124,"line":427},[78,24647,24648],{},"def upload_file(file: Annotated[UploadFile, File()], \n",[78,24650,24651],{"class":124,"line":433},[78,24652,24653],{},"                index_name: Annotated[str, Form(...)]):\n",[78,24655,24656],{"class":124,"line":2443},[78,24657,24658],{},"    # 指定文件上传目标路径\n",[78,24660,24661],{"class":124,"line":2448},[78,24662,24663],{},"    file_upload_target_path = os.path.join(file_upload_path, file.filename)  \n",[78,24665,24666],{"class":124,"line":2454},[78,24667,129],{"emptyLinePlaceholder":128},[78,24669,24670],{"class":124,"line":2460},[78,24671,24672],{},"    with open(file_upload_target_path, \"wb\") as f:\n",[78,24674,24675],{"class":124,"line":2465},[78,24676,24677],{},"        contents = file.file.read()\n",[78,24679,24680],{"class":124,"line":2470},[78,24681,24682],{},"        f.write(contents)  # 将接收到的文件内容写入目标文件路径\n",[78,24684,24685],{"class":124,"line":2903},[78,24686,129],{"emptyLinePlaceholder":128},[78,24688,24689],{"class":124,"line":2909},[78,24690,24691],{},"    # 调用 load_pdf_and_save_index 函数对上传的文件进行处理\n",[78,24693,24694],{"class":124,"line":11477},[78,24695,24696],{},"    load_pdf_and_save_index(file_upload_target_path, index_name)  \n",[78,24698,24699],{"class":124,"line":13374},[78,24700,24701],{},"    # 返回上传文件的文件名和索引名\n",[78,24703,24704],{"class":124,"line":13380},[78,24705,24706],{},"    return {\"filename\": file.filename, \"index_name\": index_name}  \n",[78,24708,24709],{"class":124,"line":13386},[78,24710,129],{"emptyLinePlaceholder":128},[78,24712,24713],{"class":124,"line":13722},[78,24714,129],{"emptyLinePlaceholder":128},[78,24716,24717],{"class":124,"line":13727},[78,24718,24719],{},"class Query(BaseModel):\n",[78,24721,24722],{"class":124,"line":13953},[78,24723,24724],{},"    index_name: str\n",[78,24726,24727],{"class":124,"line":13958},[78,24728,24729],{},"    query: str\n",[78,24731,24732],{"class":124,"line":13964},[78,24733,129],{"emptyLinePlaceholder":128},[78,24735,24736],{"class":124,"line":13969},[78,24737,129],{"emptyLinePlaceholder":128},[78,24739,24740],{"class":124,"line":24170},[78,24741,24742],{},"@app.post(\"\u002Fquery\")\n",[78,24744,24745],{"class":124,"line":24175},[78,24746,24747],{},"def query_index(request: Query):\n",[78,24749,24750],{"class":124,"line":24180},[78,24751,24752],{},"    index_name = request.index_name\n",[78,24754,24755],{"class":124,"line":24186},[78,24756,24757],{},"    query = request.query\n",[78,24759,24760],{"class":124,"line":24192},[78,24761,24762],{},"    index = load_index(index_name)  # 调用 load_index 函数加载索引\n",[78,24764,24765],{"class":124,"line":24198},[78,24766,24767],{},"    ans = query_index_lc(index, query)  # 使用索引进行查询\n",[78,24769,24770],{"class":124,"line":24204},[78,24771,24772],{},"    # 返回查询结果、索引名和查询内容\n",[78,24774,24775],{"class":124,"line":24210},[78,24776,24777],{},"    return {\"answer\": ans, \"index_name\": index_name, \"query\": query}\n",[107,24779,24781],{"id":24780},"_3网页新闻转相声","3、网页新闻转相声",[49,24783,24784],{},[52,24785,24786],{},"html2news.py （网页新闻转相声工具类）",[114,24788,24790],{"className":116,"code":24789,"language":118,"meta":119,"style":119},"import os  # 导入os模块\n\nfrom langchain_community.document_loaders import UnstructuredURLLoader \nfrom langchain.text_splitter import RecursiveCharacterTextSplitter  \nfrom langchain.chains.summarize import load_summarize_chain  \nfrom langchain_openai import OpenAI, PromptTemplate, ChatOpenAI  \nfrom langchain.schema import HumanMessage  \nfrom langchain.output_parsers import PydanticOutputParser  \nfrom pydantic import BaseModel, Field  \n\n# 设置环境变量 OPENAI_API_BASE 和 OPENAI_API_KEY\nos.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'\nos.environ[\"OPENAI_API_KEY\"] = 'sk-~'\n\n# 定义新闻的URL（这里是当天随便找的新浪新闻，实测知乎的文章不太好用）\nurl = \"https:\u002F\u002Fnews.sina.com.cn\u002Fzx\u002Fgj\u002F2024-01-27\u002Fdoc-inaexruh3759336.shtml\"\n\n\n# 将URL转换为新闻文本\ndef url2News(url):\n    # 初始化 RecursiveCharacterTextSplitter 实例\n    # 从 “盛世 开始（包含），到 “看，这幅图 结束（不包含）\n    # 块大小为 1000，块重叠为 20，默认 len 方法计算块长度\n    text_splitter = RecursiveCharacterTextSplitter(separators=[\"“盛世\", \"“看，这幅图\"], chunk_size=1000, chunk_overlap=20, length_function=len)\n    # 初始化 UnstructuredURLLoader 实例\n    loader = UnstructuredURLLoader([url])\n    # 加载并分割文本\n    data = loader.load_and_split(text_splitter)\n    return data[1:2]\n\n\n# 将新闻文本转换为相声剧本\ndef news2script(news):\n    # 初始化 OpenAI 实例\n    llm = OpenAI(max_tokens=1500)\n\n    # 定义提示模板\n    prompt_template = \"\"\"总结这段新闻的内容：\n    \"{text}\"\n    总结:\"\"\"\n\n    # 初始化 PromptTemplate 实例\n    chinese_prompt = PromptTemplate(template=prompt_template, input_variables=[\"text\"])\n\n    # 加载相声剧本生成模型\n    chain = load_summarize_chain(llm, prompt=chinese_prompt)\n\n    # 运行模型生成相声剧本\n    summary = chain.invoke(news)\n    print(summary['output_text'])\n\n    # 初始化 ChatOpenAI 实例\n    openaichat = ChatOpenAI(model_name=\"gpt-3.5-turbo\")\n\n    # 定义相声剧本模板\n    template = \"\"\"\\\n        我将给你一段新闻的概括，请按照要求把这段新闻改写成郭德纲和于谦的对口相声剧本。\n        新闻: \"{新闻}\"\n        要求: \"{要求}\"\n        {output_instructions}\n    \"\"\"\n    # 初始化 PydanticOutputParser 实例，设置相声的数据类型\n    parser = PydanticOutputParser(pydantic_object=XiangSheng)\n    # 初始化 PromptTemplate 实例\n    prompt = PromptTemplate(\n        template=template,\n        input_variables=[\"新闻\", \"要求\"],\n        # 装载输出类型\n        partial_variables={\"output_instructions\": parser.get_format_instructions()}\n    )\n\n    # 创建人类消息列表\n    msg = [HumanMessage(\n        content=prompt.format(新闻=summary['output_text'],\n                要求=\"风趣幽默，十分讽刺，剧本对话角色为郭德纲和于谦，以他们的自我介绍为开头\"))]\n\n    # 运行对话生成相声剧本\n    res = openaichat.invoke(msg)\n    print(res.content)\n    # 解析相声剧本\n    xiangsheng = parser.parse(res.content)\n    return xiangsheng\n\n\n# 定义台词行数据模型\nclass Line(BaseModel):\n    character: str = Field(description=\"说这句台词的角色名字\")\n    content: str = Field(description=\"台词的具体内容，其中不再包括角色的名字\")\n\n\n# 定义相声剧本数据模型\nclass XiangSheng(BaseModel):\n    script: List[Line] = Field(description=\"一段相声的台词剧本\")\n\n\n# 将URL转换为相声剧本\ndef url2xiangsheng(url):\n    doc = url2News(url)\n    xiangsheng = news2script(doc)\n    return xiangsheng\n",[17,24791,24792,24797,24801,24806,24811,24816,24821,24826,24831,24836,24840,24845,24850,24855,24859,24864,24869,24873,24877,24882,24887,24892,24897,24902,24907,24912,24917,24922,24927,24932,24936,24940,24945,24950,24955,24960,24964,24969,24974,24979,24984,24988,24993,24998,25002,25007,25012,25016,25021,25026,25031,25035,25040,25045,25049,25054,25059,25064,25069,25074,25079,25084,25089,25094,25098,25103,25108,25113,25119,25125,25130,25135,25141,25147,25153,25159,25164,25170,25176,25182,25188,25194,25200,25205,25210,25216,25222,25228,25234,25239,25244,25250,25256,25262,25267,25272,25278,25284,25290,25296],{"__ignoreMap":119},[78,24793,24794],{"class":124,"line":125},[78,24795,24796],{},"import os  # 导入os模块\n",[78,24798,24799],{"class":124,"line":132},[78,24800,129],{"emptyLinePlaceholder":128},[78,24802,24803],{"class":124,"line":138},[78,24804,24805],{},"from langchain_community.document_loaders import UnstructuredURLLoader \n",[78,24807,24808],{"class":124,"line":144},[78,24809,24810],{},"from langchain.text_splitter import RecursiveCharacterTextSplitter  \n",[78,24812,24813],{"class":124,"line":150},[78,24814,24815],{},"from langchain.chains.summarize import load_summarize_chain  \n",[78,24817,24818],{"class":124,"line":156},[78,24819,24820],{},"from langchain_openai import OpenAI, PromptTemplate, ChatOpenAI  \n",[78,24822,24823],{"class":124,"line":162},[78,24824,24825],{},"from langchain.schema import HumanMessage  \n",[78,24827,24828],{"class":124,"line":168},[78,24829,24830],{},"from langchain.output_parsers import PydanticOutputParser  \n",[78,24832,24833],{"class":124,"line":174},[78,24834,24835],{},"from pydantic import BaseModel, Field  \n",[78,24837,24838],{"class":124,"line":180},[78,24839,129],{"emptyLinePlaceholder":128},[78,24841,24842],{"class":124,"line":186},[78,24843,24844],{},"# 设置环境变量 OPENAI_API_BASE 和 OPENAI_API_KEY\n",[78,24846,24847],{"class":124,"line":192},[78,24848,24849],{},"os.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'\n",[78,24851,24852],{"class":124,"line":198},[78,24853,24854],{},"os.environ[\"OPENAI_API_KEY\"] = 'sk-~'\n",[78,24856,24857],{"class":124,"line":204},[78,24858,129],{"emptyLinePlaceholder":128},[78,24860,24861],{"class":124,"line":210},[78,24862,24863],{},"# 定义新闻的URL（这里是当天随便找的新浪新闻，实测知乎的文章不太好用）\n",[78,24865,24866],{"class":124,"line":216},[78,24867,24868],{},"url = \"https:\u002F\u002Fnews.sina.com.cn\u002Fzx\u002Fgj\u002F2024-01-27\u002Fdoc-inaexruh3759336.shtml\"\n",[78,24870,24871],{"class":124,"line":222},[78,24872,129],{"emptyLinePlaceholder":128},[78,24874,24875],{"class":124,"line":421},[78,24876,129],{"emptyLinePlaceholder":128},[78,24878,24879],{"class":124,"line":427},[78,24880,24881],{},"# 将URL转换为新闻文本\n",[78,24883,24884],{"class":124,"line":433},[78,24885,24886],{},"def url2News(url):\n",[78,24888,24889],{"class":124,"line":2443},[78,24890,24891],{},"    # 初始化 RecursiveCharacterTextSplitter 实例\n",[78,24893,24894],{"class":124,"line":2448},[78,24895,24896],{},"    # 从 “盛世 开始（包含），到 “看，这幅图 结束（不包含）\n",[78,24898,24899],{"class":124,"line":2454},[78,24900,24901],{},"    # 块大小为 1000，块重叠为 20，默认 len 方法计算块长度\n",[78,24903,24904],{"class":124,"line":2460},[78,24905,24906],{},"    text_splitter = RecursiveCharacterTextSplitter(separators=[\"“盛世\", \"“看，这幅图\"], chunk_size=1000, chunk_overlap=20, length_function=len)\n",[78,24908,24909],{"class":124,"line":2465},[78,24910,24911],{},"    # 初始化 UnstructuredURLLoader 实例\n",[78,24913,24914],{"class":124,"line":2470},[78,24915,24916],{},"    loader = UnstructuredURLLoader([url])\n",[78,24918,24919],{"class":124,"line":2903},[78,24920,24921],{},"    # 加载并分割文本\n",[78,24923,24924],{"class":124,"line":2909},[78,24925,24926],{},"    data = loader.load_and_split(text_splitter)\n",[78,24928,24929],{"class":124,"line":11477},[78,24930,24931],{},"    return data[1:2]\n",[78,24933,24934],{"class":124,"line":13374},[78,24935,129],{"emptyLinePlaceholder":128},[78,24937,24938],{"class":124,"line":13380},[78,24939,129],{"emptyLinePlaceholder":128},[78,24941,24942],{"class":124,"line":13386},[78,24943,24944],{},"# 将新闻文本转换为相声剧本\n",[78,24946,24947],{"class":124,"line":13722},[78,24948,24949],{},"def news2script(news):\n",[78,24951,24952],{"class":124,"line":13727},[78,24953,24954],{},"    # 初始化 OpenAI 实例\n",[78,24956,24957],{"class":124,"line":13953},[78,24958,24959],{},"    llm = OpenAI(max_tokens=1500)\n",[78,24961,24962],{"class":124,"line":13958},[78,24963,129],{"emptyLinePlaceholder":128},[78,24965,24966],{"class":124,"line":13964},[78,24967,24968],{},"    # 定义提示模板\n",[78,24970,24971],{"class":124,"line":13969},[78,24972,24973],{},"    prompt_template = \"\"\"总结这段新闻的内容：\n",[78,24975,24976],{"class":124,"line":24170},[78,24977,24978],{},"    \"{text}\"\n",[78,24980,24981],{"class":124,"line":24175},[78,24982,24983],{},"    总结:\"\"\"\n",[78,24985,24986],{"class":124,"line":24180},[78,24987,129],{"emptyLinePlaceholder":128},[78,24989,24990],{"class":124,"line":24186},[78,24991,24992],{},"    # 初始化 PromptTemplate 实例\n",[78,24994,24995],{"class":124,"line":24192},[78,24996,24997],{},"    chinese_prompt = PromptTemplate(template=prompt_template, input_variables=[\"text\"])\n",[78,24999,25000],{"class":124,"line":24198},[78,25001,129],{"emptyLinePlaceholder":128},[78,25003,25004],{"class":124,"line":24204},[78,25005,25006],{},"    # 加载相声剧本生成模型\n",[78,25008,25009],{"class":124,"line":24210},[78,25010,25011],{},"    chain = load_summarize_chain(llm, prompt=chinese_prompt)\n",[78,25013,25014],{"class":124,"line":24215},[78,25015,129],{"emptyLinePlaceholder":128},[78,25017,25018],{"class":124,"line":24220},[78,25019,25020],{},"    # 运行模型生成相声剧本\n",[78,25022,25023],{"class":124,"line":24226},[78,25024,25025],{},"    summary = chain.invoke(news)\n",[78,25027,25028],{"class":124,"line":24232},[78,25029,25030],{},"    print(summary['output_text'])\n",[78,25032,25033],{"class":124,"line":24238},[78,25034,129],{"emptyLinePlaceholder":128},[78,25036,25037],{"class":124,"line":24244},[78,25038,25039],{},"    # 初始化 ChatOpenAI 实例\n",[78,25041,25042],{"class":124,"line":24250},[78,25043,25044],{},"    openaichat = ChatOpenAI(model_name=\"gpt-3.5-turbo\")\n",[78,25046,25047],{"class":124,"line":24256},[78,25048,129],{"emptyLinePlaceholder":128},[78,25050,25051],{"class":124,"line":24262},[78,25052,25053],{},"    # 定义相声剧本模板\n",[78,25055,25056],{"class":124,"line":24267},[78,25057,25058],{},"    template = \"\"\"\\\n",[78,25060,25061],{"class":124,"line":24273},[78,25062,25063],{},"        我将给你一段新闻的概括，请按照要求把这段新闻改写成郭德纲和于谦的对口相声剧本。\n",[78,25065,25066],{"class":124,"line":24279},[78,25067,25068],{},"        新闻: \"{新闻}\"\n",[78,25070,25071],{"class":124,"line":24284},[78,25072,25073],{},"        要求: \"{要求}\"\n",[78,25075,25076],{"class":124,"line":24290},[78,25077,25078],{},"        {output_instructions}\n",[78,25080,25081],{"class":124,"line":24296},[78,25082,25083],{},"    \"\"\"\n",[78,25085,25086],{"class":124,"line":24302},[78,25087,25088],{},"    # 初始化 PydanticOutputParser 实例，设置相声的数据类型\n",[78,25090,25091],{"class":124,"line":24308},[78,25092,25093],{},"    parser = PydanticOutputParser(pydantic_object=XiangSheng)\n",[78,25095,25096],{"class":124,"line":24314},[78,25097,24992],{},[78,25099,25100],{"class":124,"line":24320},[78,25101,25102],{},"    prompt = PromptTemplate(\n",[78,25104,25105],{"class":124,"line":24325},[78,25106,25107],{},"        template=template,\n",[78,25109,25110],{"class":124,"line":24331},[78,25111,25112],{},"        input_variables=[\"新闻\", \"要求\"],\n",[78,25114,25116],{"class":124,"line":25115},68,[78,25117,25118],{},"        # 装载输出类型\n",[78,25120,25122],{"class":124,"line":25121},69,[78,25123,25124],{},"        partial_variables={\"output_instructions\": parser.get_format_instructions()}\n",[78,25126,25128],{"class":124,"line":25127},70,[78,25129,24167],{},[78,25131,25133],{"class":124,"line":25132},71,[78,25134,129],{"emptyLinePlaceholder":128},[78,25136,25138],{"class":124,"line":25137},72,[78,25139,25140],{},"    # 创建人类消息列表\n",[78,25142,25144],{"class":124,"line":25143},73,[78,25145,25146],{},"    msg = [HumanMessage(\n",[78,25148,25150],{"class":124,"line":25149},74,[78,25151,25152],{},"        content=prompt.format(新闻=summary['output_text'],\n",[78,25154,25156],{"class":124,"line":25155},75,[78,25157,25158],{},"                要求=\"风趣幽默，十分讽刺，剧本对话角色为郭德纲和于谦，以他们的自我介绍为开头\"))]\n",[78,25160,25162],{"class":124,"line":25161},76,[78,25163,129],{"emptyLinePlaceholder":128},[78,25165,25167],{"class":124,"line":25166},77,[78,25168,25169],{},"    # 运行对话生成相声剧本\n",[78,25171,25173],{"class":124,"line":25172},78,[78,25174,25175],{},"    res = openaichat.invoke(msg)\n",[78,25177,25179],{"class":124,"line":25178},79,[78,25180,25181],{},"    print(res.content)\n",[78,25183,25185],{"class":124,"line":25184},80,[78,25186,25187],{},"    # 解析相声剧本\n",[78,25189,25191],{"class":124,"line":25190},81,[78,25192,25193],{},"    xiangsheng = parser.parse(res.content)\n",[78,25195,25197],{"class":124,"line":25196},82,[78,25198,25199],{},"    return xiangsheng\n",[78,25201,25203],{"class":124,"line":25202},83,[78,25204,129],{"emptyLinePlaceholder":128},[78,25206,25208],{"class":124,"line":25207},84,[78,25209,129],{"emptyLinePlaceholder":128},[78,25211,25213],{"class":124,"line":25212},85,[78,25214,25215],{},"# 定义台词行数据模型\n",[78,25217,25219],{"class":124,"line":25218},86,[78,25220,25221],{},"class Line(BaseModel):\n",[78,25223,25225],{"class":124,"line":25224},87,[78,25226,25227],{},"    character: str = Field(description=\"说这句台词的角色名字\")\n",[78,25229,25231],{"class":124,"line":25230},88,[78,25232,25233],{},"    content: str = Field(description=\"台词的具体内容，其中不再包括角色的名字\")\n",[78,25235,25237],{"class":124,"line":25236},89,[78,25238,129],{"emptyLinePlaceholder":128},[78,25240,25242],{"class":124,"line":25241},90,[78,25243,129],{"emptyLinePlaceholder":128},[78,25245,25247],{"class":124,"line":25246},91,[78,25248,25249],{},"# 定义相声剧本数据模型\n",[78,25251,25253],{"class":124,"line":25252},92,[78,25254,25255],{},"class XiangSheng(BaseModel):\n",[78,25257,25259],{"class":124,"line":25258},93,[78,25260,25261],{},"    script: List[Line] = Field(description=\"一段相声的台词剧本\")\n",[78,25263,25265],{"class":124,"line":25264},94,[78,25266,129],{"emptyLinePlaceholder":128},[78,25268,25270],{"class":124,"line":25269},95,[78,25271,129],{"emptyLinePlaceholder":128},[78,25273,25275],{"class":124,"line":25274},96,[78,25276,25277],{},"# 将URL转换为相声剧本\n",[78,25279,25281],{"class":124,"line":25280},97,[78,25282,25283],{},"def url2xiangsheng(url):\n",[78,25285,25287],{"class":124,"line":25286},98,[78,25288,25289],{},"    doc = url2News(url)\n",[78,25291,25293],{"class":124,"line":25292},99,[78,25294,25295],{},"    xiangsheng = news2script(doc)\n",[78,25297,25299],{"class":124,"line":25298},100,[78,25300,25199],{},[49,25302,25303],{},[52,25304,25305],{},"interface.py （gradio 绘制的简易前端）",[114,25307,25309],{"className":116,"code":25308,"language":118,"meta":119,"style":119},"import gradio as gr  # 导入 gradio 库\nfrom html2news import *  # 导入 html2news 模块，其中包含之前的函数和类定义\n\nwith gr.Blocks() as demo:  # 创建 Gradio Blocks 应用\n\n    url = gr.Textbox()  # 创建一个文本框组件，用于输入新闻的URL\n    chatbot = gr.Chatbot()  # 创建一个聊天机器人组件\n    submit_btn = gr.Button(\"生成相声\")  # 创建一个按钮组件用于提交生成相声的请求\n\n    # 定义生成对话的函数\n    def generate_conversation(url):\n        # 调用之前定义的函数，将URL转换为相声剧本\n        xiangsheng: XiangSheng = url2xiangsheng(url)  \n        chat_history = []  # 创建一个列表，用于存储对话内容\n\n        # 定义解析台词的函数\n        def parse_line(line: Line):\n            if line is None:\n                return \"\"\n            return f'{line.character}: {line.content}'\n\n        # 将生成的相声剧本转换为对话历史\n        for i in range(0, len(xiangsheng.script), 2):\n            line1 = xiangsheng.script[i]\n            line2 = xiangsheng.script[i + 1] if (i + 1) \u003C len(xiangsheng.script) \n                                             else None\n            chat_history.append((parse_line(line1), parse_line(line2)))\n\n        return chat_history  # 返回生成的对话历史\n\n    # 点击按钮时触发生成对话函数，将URL作为输入，将聊天机器人组件作为输出\n    submit_btn.click(fn=generate_conversation, inputs=url, outputs=chatbot)\n\nif __name__ == '__main__':\n    demo.launch()  # 运行 Gradio Blocks 应用\n",[17,25310,25311,25316,25321,25325,25330,25334,25339,25344,25349,25353,25358,25363,25368,25373,25378,25382,25387,25392,25397,25402,25407,25411,25416,25421,25426,25431,25436,25441,25445,25450,25454,25459,25464,25468,25473],{"__ignoreMap":119},[78,25312,25313],{"class":124,"line":125},[78,25314,25315],{},"import gradio as gr  # 导入 gradio 库\n",[78,25317,25318],{"class":124,"line":132},[78,25319,25320],{},"from html2news import *  # 导入 html2news 模块，其中包含之前的函数和类定义\n",[78,25322,25323],{"class":124,"line":138},[78,25324,129],{"emptyLinePlaceholder":128},[78,25326,25327],{"class":124,"line":144},[78,25328,25329],{},"with gr.Blocks() as demo:  # 创建 Gradio Blocks 应用\n",[78,25331,25332],{"class":124,"line":150},[78,25333,129],{"emptyLinePlaceholder":128},[78,25335,25336],{"class":124,"line":156},[78,25337,25338],{},"    url = gr.Textbox()  # 创建一个文本框组件，用于输入新闻的URL\n",[78,25340,25341],{"class":124,"line":162},[78,25342,25343],{},"    chatbot = gr.Chatbot()  # 创建一个聊天机器人组件\n",[78,25345,25346],{"class":124,"line":168},[78,25347,25348],{},"    submit_btn = gr.Button(\"生成相声\")  # 创建一个按钮组件用于提交生成相声的请求\n",[78,25350,25351],{"class":124,"line":174},[78,25352,129],{"emptyLinePlaceholder":128},[78,25354,25355],{"class":124,"line":180},[78,25356,25357],{},"    # 定义生成对话的函数\n",[78,25359,25360],{"class":124,"line":186},[78,25361,25362],{},"    def generate_conversation(url):\n",[78,25364,25365],{"class":124,"line":192},[78,25366,25367],{},"        # 调用之前定义的函数，将URL转换为相声剧本\n",[78,25369,25370],{"class":124,"line":198},[78,25371,25372],{},"        xiangsheng: XiangSheng = url2xiangsheng(url)  \n",[78,25374,25375],{"class":124,"line":204},[78,25376,25377],{},"        chat_history = []  # 创建一个列表，用于存储对话内容\n",[78,25379,25380],{"class":124,"line":210},[78,25381,129],{"emptyLinePlaceholder":128},[78,25383,25384],{"class":124,"line":216},[78,25385,25386],{},"        # 定义解析台词的函数\n",[78,25388,25389],{"class":124,"line":222},[78,25390,25391],{},"        def parse_line(line: Line):\n",[78,25393,25394],{"class":124,"line":421},[78,25395,25396],{},"            if line is None:\n",[78,25398,25399],{"class":124,"line":427},[78,25400,25401],{},"                return \"\"\n",[78,25403,25404],{"class":124,"line":433},[78,25405,25406],{},"            return f'{line.character}: {line.content}'\n",[78,25408,25409],{"class":124,"line":2443},[78,25410,129],{"emptyLinePlaceholder":128},[78,25412,25413],{"class":124,"line":2448},[78,25414,25415],{},"        # 将生成的相声剧本转换为对话历史\n",[78,25417,25418],{"class":124,"line":2454},[78,25419,25420],{},"        for i in range(0, len(xiangsheng.script), 2):\n",[78,25422,25423],{"class":124,"line":2460},[78,25424,25425],{},"            line1 = xiangsheng.script[i]\n",[78,25427,25428],{"class":124,"line":2465},[78,25429,25430],{},"            line2 = xiangsheng.script[i + 1] if (i + 1) \u003C len(xiangsheng.script) \n",[78,25432,25433],{"class":124,"line":2470},[78,25434,25435],{},"                                             else None\n",[78,25437,25438],{"class":124,"line":2903},[78,25439,25440],{},"            chat_history.append((parse_line(line1), parse_line(line2)))\n",[78,25442,25443],{"class":124,"line":2909},[78,25444,129],{"emptyLinePlaceholder":128},[78,25446,25447],{"class":124,"line":11477},[78,25448,25449],{},"        return chat_history  # 返回生成的对话历史\n",[78,25451,25452],{"class":124,"line":13374},[78,25453,129],{"emptyLinePlaceholder":128},[78,25455,25456],{"class":124,"line":13380},[78,25457,25458],{},"    # 点击按钮时触发生成对话函数，将URL作为输入，将聊天机器人组件作为输出\n",[78,25460,25461],{"class":124,"line":13386},[78,25462,25463],{},"    submit_btn.click(fn=generate_conversation, inputs=url, outputs=chatbot)\n",[78,25465,25466],{"class":124,"line":13722},[78,25467,129],{"emptyLinePlaceholder":128},[78,25469,25470],{"class":124,"line":13727},[78,25471,25472],{},"if __name__ == '__main__':\n",[78,25474,25475],{"class":124,"line":13953},[78,25476,25477],{},"    demo.launch()  # 运行 Gradio Blocks 应用\n",[107,25479,25480],{"id":25480},"总结",[13,25482,25483],{},"希望上面三个简单的 Demo 能够帮助你更好的理解 LangChain 中各个模块的关系，以及一些基础的工程实践流程。复杂的项目往往只需要拆解成简单的需求，对着官方文档一顿操作即可~",[226,25485,228],{},{"title":119,"searchDepth":144,"depth":144,"links":25487},[25488,25489,25490,25491],{"id":23980,"depth":132,"text":23981},{"id":24339,"depth":132,"text":24340},{"id":24780,"depth":132,"text":24781},{"id":25480,"depth":132,"text":25480},{},"Little Tips\u002FLangChain工程实践.md","\u002Fundergraduate\u002Fnote-1699c2c6a95c",{"title":23946,"description":119},"undergraduate\u002Fnote-1699c2c6a95c",[794,14541,10715,6380,14542],"D4uMmQ5QG0WD-NglTZolZnhGr9eX012XVPDobyxLVuQ",{"id":25500,"title":25501,"assetBase":239,"author":8,"body":25502,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":25507,"navigation":128,"originalPath":25508,"path":25509,"seo":25510,"source":23330,"stem":25511,"tags":25512,"weight":250,"__hash__":25513},"content\u002Fundergraduate\u002Fnote-191c8ab16657.md","MusicLM Generating Music From Text",{"type":10,"value":25503,"toc":25504},[],{"title":119,"searchDepth":144,"depth":144,"links":25505},[],"Paper Reading",{},"Paper Reading\u002F4. MusicLM Generating Music From Text\u002FMusicLM Generating Music From Text.md","\u002Fundergraduate\u002Fnote-191c8ab16657",{"title":25501,"description":119},"undergraduate\u002Fnote-191c8ab16657",[2708],"2wqkE87xksClGOPtCDgxKVodChrdKOwuZ370IlJTP0k",{"id":25515,"title":25516,"assetBase":239,"author":8,"body":25517,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":26774,"navigation":128,"originalPath":26775,"path":26776,"seo":26777,"source":23330,"stem":26778,"tags":26779,"weight":250,"__hash__":26780},"content\u002Fundergraduate\u002Fnote-1cf2987427d8.md","A Survey on Artificial Intelligence for Music Generation",{"type":10,"value":25518,"toc":26757},[25519,25523,25527,25531,25556,25560,25563,25566,25569,25572,25575,25595,25598,25604,25607,25611,25614,25618,25621,25625,25628,25632,25635,25639,25642,25645,25648,25652,25655,25660,25663,25669,25672,25676,25684,25687,25690,25694,25697,25700,25714,25717,25730,25733,25737,25744,25755,25758,25761,25766,25769,25774,25777,25781,25784,25789,25792,25796,25799,25802,25806,25809,25813,25816,25819,25829,25833,25836,25840,25843,25847,25850,25854,25857,25860,25865,25868,25871,25875,25878,25881,25886,25890,25893,25896,25900,25903,25906,25911,25914,25917,25928,25933,25936,25939,25944,25951,25954,25957,25962,25965,25968,25971,25976,25982,25985,25988,25993,25996,26003,26010,26022,26027,26033,26392,26395,26398,26401,26404,26408,26411,26414,26417,26420,26423,26426,26429,26432,26435,26440,26445,26448,26453,26456,26459,26464,26467,26470,26473,26476,26479,26482,26485,26489,26492,26495,26498,26504,26507,26510,26513,26516,26519,26522,26525,26528,26531,26534,26537,26540,26544,26547,26550,26554,26557,26560,26563,26566,26569,26572,26575,26578,26581,26585,26588,26591,26595,26598,26602,26605,26608,26611,26618,26644,26647,26651,26654,26657,26668,26671,26674,26677,26680,26685,26688,26691,26695,26699,26702,26706,26709,26713,26716,26720,26723,26737,26741,26744,26747,26751,26754],[107,25520,25522],{"id":25521},"音乐生成的人工智能综述智能体领域和前景","音乐生成的人工智能综述：智能体、领域和前景",[7759,25524,25526],{"id":25525},"carlos-hernandez-olivan-javier-hernandez-olivan-and-jose-r-beltran","Carlos Hernandez-Olivan, Javier Hernandez-Olivan, and Jose R. Beltran",[7759,25528,25530],{"id":25529},"department-of-electronic-engineering-and-communications-university-of-zaragoza-calle-marıa-de-luna-3-50018-zaragoza","Department of Electronic Engineering and Communications, University of Zaragoza, Calle Mar´ıa de Luna 3 50018, Zaragoza",[72,25532,25533,25538,25541,25550,25553],{},[13,25534,25535],{},[22,25536,25537],{},"观后简言：",[13,25539,25540],{},"哇哇哇！终于看完第一篇了，选择这篇作为我的入门论文属于是挑对了又挑得不对：挑得不对是因为这第一篇实在是太长了，从 7 月 8 号开始开新坑到今天已经 8 月 17 号了，足足看了 40 天（虽然中间一度搁置），但是不得不说这一篇反而是最适合新手入门的。基本上不介绍任何硬核技术相关，主要是讲述目前音乐生成领域的发展情况以及做音乐生成的主流思想。有兴趣的一定要重点看下第六节【模型】，涵盖了基本上需要考虑的参数方向。",[13,25542,25543,25544,25549],{},"虽然中间一段时间没看，但是反而是因为自己有些想法所以去尝试实现了，刚巧就在看完第五节的时候。我从自己的角度出发，构思了一个简易的音乐生成流程，并在和 ChatGPT 的对话中不断完善、推理中间的一些详细的过程。具体可以参考我新建的项目 ",[5009,25545,25548],{"href":25546,"rel":25547},"https:\u002F\u002Fgithub.com\u002FAlexie-Z-Yevich\u002FMusicInitial",[23647],"MusicInitial","，不过目前并没有把详细想法都直白的展示出来。但是有了个自己设计的过程再回头看第六节，就有了一种茅塞顿开的感觉，也是后面忽然高强度把这篇论文看完的原因（前面写得确实一般般啦~）",[13,25551,25552],{},"因此，建议大家看完第五节之后也去自己构思一下如何设计一个音乐生成流程，至少要明确你想要的音乐需要些什么参数，有需要生成什么内容。一次看完反而容易忘，同时针对想要深化的方向再去找相应的论文。（不要一开始像我一样找了 6 篇，应该根据每篇的感受不断去细化自己的方向）。不过之后的几篇都会稍短不少，所以既然找了还是会看完的。图快的 homie 可以根据我每篇的观后简言快速定位emmm不过需要有那么多量才行。",[13,25554,25555],{},"总之，这篇是非常推荐的啦！",[7759,25557,25559],{"id":25558},"_1引言","1、引言",[13,25561,25562],{},"音乐生成是音乐信息检索的一个研究领域，旨在生成新的音乐。由于最近的深度学习（DL）模型能够生成更长的相干序列，因此该领域受到了广泛关注。在图像生成领域，新的深度生成模型（如 Open  AI 的 Dalle 2 或 Stability 的 Stable  Diffusion）。AI的演变和发布吸引了更多的用户，不仅是模型本身，而且其生成的其他部分，如人机交互，成为基于AI的工具开发的关键部分。",[13,25564,25565],{},"有许多公司，如索尼、谷歌 Magenta 项目或 Spotify，以及致力于新音乐制作和生成技术以及音乐推荐系统的初创公司。这种对音乐生成的兴趣的一个证明是组织研讨会、讲座和比赛，例如从 2020 年开始每年举行的人工智能歌曲大赛，2022 年共有 46 支队伍参加。",[13,25567,25568],{},"要理解和比较音乐生成系统，就必须了解人类是如何感知、理解和创作音乐的。人类对音乐的理解和感知取决于多种因素。文化背景、音乐知识和作曲家的创造力是人类音乐创作的主要特征。创作的一种方式是发展作曲家的初步想法。这个想法不仅包含象征性的或与乐谱相关的音乐原则，还包含音色或动态等表演属性，尤其是如果作曲家是一位经验丰富的音乐家。最初想法的延续是由作曲家在创作音乐作品时所做的决定来指导的。基于分析和聆听作曲家职业生涯中获得的许多音乐片段，即经验，根据先前的知识做出的决定。这意味着，如果我们将这一过程与基于人工智能的音乐生成进行比较，那么这项任务涉及更多的MIR领域，如乐器分类或自动和弦识别（ACR）。研究和分析与音乐原理相关的其他特征可能是建立一个完整的人工智能音乐创作框架的必要条件，我们可以将其命名为通用音乐机器。这种通用模型可以基于多模式深度学习和过去通用的智能体（如 GATO）。在音乐领域，已经证明预先训练的模型可以帮助改进其他任务。这种技术节省了资源和训练时间，是通用符号音乐理解模型的第一步。尽管该领域正在朝着构建具有大量可学习参数的深度学习模型的方向发展，但音乐语言已经定义了可以与这些模型相结合的规则，以实现这种广义模型。就一首音乐的生成而言，对长期结构进行建模仍然是一个开放的研究领域，因为与文本不同，音乐依赖于相互依赖的两个轴（音高和时间）。实现这一点的一种方法是融合符号人工智能和深度学习模型，在符号人工智能中可以定义这些规则，深度学习模型可以像人类创作音乐时那样学习组合这些规则。这些符号规则的例子是一些音乐定义，例如属于某个和弦的音符，即C大三和弦中的 C、e 和 G。",[13,25570,25571],{},"基于人工智能的音乐生成过程取决于上述因素之外的其他因素，必须考虑到基于人工智能创作工作中每个代理可能出现的偏见。我们将在本文中讨论人类和人工智能作曲过程之间的相似之处，然而，在对音乐的理解和感知方面，人类和机器之间存在很大差距。",[13,25573,25574],{},"在音乐领域，选择的作曲过程或技巧将取决于我们正在使用的音乐风格。如同人类需要一些先验知识才能创作旋律，人工智能也需要接受大量旋律的训练才能从中学习。然而，当涉及到创作复杂的作品时，除了像莫扎特这样天生具有音乐能力的天才音乐家之外，人类需要强大的音乐知识来发展一首音乐的和声、结构和乐器。因此，人类和人工智能在音乐创作过程中可能有一些相似之处。不同之处在于不同的学习过程以及人类的创造力或推断能力。加德纳的多元智能理论将音乐视为人的七种智能之一。他将音乐智力定义为产生和欣赏节奏、音高和音色的能力，或对音乐表现形式的理解。但是，创作音乐的能力来自哪里？这种能力在大脑中的位置是什么？自主机器架构如何学习和理解音乐，使其像人类一样具有创造性？我们将在本文中介绍这些概念，并将其与为音乐生成提出的人工智能模型进行比较。基于人工智能的音乐生成可以从不同的角度进行研究。Briot 等人提出的分类基于五个维度：",[49,25576,25577,25580,25583,25586,25589,25592],{},[52,25578,25579],{},"Input domain. Symbolic or audio. （输入域；符号或音频挑战）",[52,25581,25582],{},"Model architecture. Sequence models, generative adversarial networks, etc. （模型架构。序列模型、生成对抗性网络等）",[52,25584,25585],{},"Generation. Autoregression, etc. （自回归等）",[52,25587,25588],{},"Purpose. Melody generation, harmonization, improvisation, etc. （旋律的生成、协调、即兴创作等）",[52,25590,25591],{},"Output-s nature. Monophonic, polyphonic melodies with or without chords, multi-instrument music. （自然界的声音；单音、复调旋律，带或不带和弦，多乐器音乐）",[52,25593,25594],{},"Challenge. Human-computer interaction.（人机交互）",[13,25596,25597],{},"在本文中，我们将首先概述人类和基于人工智能的构图过程之间的差异。然后，我们将介绍音乐创作工作中涉及的代理，例如迄今为止一直用于了解我们所处的位置、这一研究方向以及有待解决的挑战的最先进的数据集、模型和算法。请注意，这些代理可以外推到其他类型的人工智能艺术生成。在图1中，我们介绍了基于人工智能的音乐生成工作流程中最重要的部分。工作流程可以定义如下：我们选择一个领域（音频或符号音乐），我们希望专注于该领域，并对涉及该领域的音乐原理有一些了解。在选择了领域后，我们可以开始描述我们将在本文的每一节中讨论的代理，从我们训练模型到最终用户的数据开始，最终用户使用音乐生成器制作的最终产品。请注意，每个代理都应该进行评估，然而，在本文中，我们将只描述模型——评估依赖于它们生成的输出。在测量输出时，我们需要音乐原理。最后，与用户的互动或开发该技术的团队的经验可以带来音乐生成的新应用，这些应用可以在任何领域。在图1中，我们还展示了在行业应用程序中开发的管道。",[13,25599,25600],{},[617,25601],{"alt":25602,"src":25603},"图一","img\u002F1.png",[13,25605,25606],{},"【图1：基于人工智能的合成工作流中代理之间关系的一般模式。该图显示了这项工作的不同部分，其中介绍了每一个元素。】",[10548,25608,25610],{"id":25609},"a论文结构","A.论文结构",[13,25612,25613],{},"本文基于作为音乐生成系统一部分的代理组织如下：在第二节中，我们比较了基于人类和人工智能的音乐生成模型；在第三节中，介绍了音乐原理；在第四节中，引入并比较了音乐生成中的两大领域：音频和符号音乐；在第五节中，我们概述了该领域中用于音频和符号领域的数据集；在第六节中，介绍了用于构建音乐生成技术的模型和架构；在第七节中，讨论并介绍了该领域提出的人机交互工作；在第八节中，我们介绍了如何从主观和客观角度对这些模型进行评估；在第九节中，介绍了在该领域获得关注的进一步工作和研究；在第十节中，讨论了基于人工智能的音乐生成的过去、现在和未来；最后在第十一节中我们给出了总结。",[7759,25615,25617],{"id":25616},"_2基于人工智能的音乐生成","2、基于人工智能的音乐生成",[13,25619,25620],{},"了解人类大脑对于开发能够模仿认知过程的人工智能工具非常重要。NeuroAI旨在研究这些过程以提供和改进人工智能模型的领域。更好地了解人类大脑可能有助于构建创造性的人工智能工具，这些工具能够像人类一样进行推断并发挥创造性。关于基于人工智能的模型，一个大问题是它们的创造力，但创造力意味着什么？我们如何衡量它，它来自哪里？在本节中，我们介绍了创造力的概念，并概述了人类如何理解和创作音乐。",[10548,25622,25624],{"id":25623},"a创造力的概念","A.创造力的概念",[13,25626,25627],{},"Amabile 将创造力定义为“产生有价值的、有用的或令人满意的新作品的过程”。创造力的概念可以从三个不同的角度来看待：产品、产生产品的身份和过程。Amabile 对创造力的一致定义是：“……创造性可以被视为产品的质量或由合适的观察者判断为具有创意的，也可以被视是这样判断的东西产生的过程。这个定义是基于最终产品，而不是基于产生这种创造力的过程或身份。将这些定义代入到音乐领域中可知，如果新音乐被一群人接受，即被我们社会的一部分人接受，那么它可以被视为一个创造性的过程。根据这些定义，我们可以认为，如果社会接受基于人工智能的音乐，并发现它对一些事情有益，那么它可以被认为是创造性的。当谈到机器制造的艺术时，我们还可以将 Colton 和 Wiggings 定义的计算创造力的概念定义为“计算系统的科学、工程和哲学，通过承担特定的责任，表现出公正的观察者认为具有创造性的行为”。更具体地说，在MIR领域中，有一个音乐生成的子领域旨在研究和计算模拟机器创造力。这个领域被称为音乐元创作（MuMe）。",[10548,25629,25631],{"id":25630},"b量化创造力","B.量化创造力",[13,25633,25634],{},"研究人员试图用三种不同的技术来量化创造力：进行客观或主观分析，以及使用创造力测试。在基于人工智能的音乐生成或创作领域，量化生成的作品质量的最常用技术是图灵测试或一项与创造力测试有点接近的调查。Amabile 提到，由于创造力测试中可以评估的能力范围很窄，因此认为测试得到假定的创造力一般指标是不合适的。Ada Lovelace提出了一些衡量机器创造力的问题，Boden将这些问题总结为 Lovelace 问题，现在演变成了 Lovelace 创造力测试（LT）。LT比图灵测试更难通过，因为算法（被询问者）必须欺骗程序员（询问者）。在旨在产生新音乐的人工智能研究领域，通常通过主观测试来测量结果，这并不总是可靠的，因为结果取决于人群的文化和背景。我们将在第八节介绍一些已经提出了的客观评估措施，用来填补主观评估无法填补的空白，但在这一领域仍有很大的改进空间。",[10548,25636,25638],{"id":25637},"c音乐是一种语言形式","C.音乐是一种语言形式",[13,25640,25641],{},"尽管一些音乐学家由于其主观性而不将音乐视为一种语言，但另一些人则认为音乐的结构元素与其他语言之间存在联系。 Sloboda 声称“音乐语言可以像任何其他语言一样，在结构层面上被理解”。音乐通过诸如和声、节奏或音色的音乐元素唤起情感。如果我们认为音符或音符的属性是字符或单词，并将这种关系扩展到其他音乐元素，我们可以将音乐编码为文本，并将自然语言处理（NLP）技术应用于音乐。通过建立这两种结构之间的关系，我们可以将现有的语言生成模型应用于音乐生成。",[13,25643,25644],{},"大脑中负责语言理解和解释的区域是位于左半球的韦尼克区（或后言语区）。已经表明，大脑在下一个单词出现之前自发地参与预测，而不需要明确的指令。这正是深度语言自回归模型（DLMs）所做的，从而表明 DLMs 和人类对下一个单词的预测在自然环境中是相似的。另一方面，根据 Platel 等人的研究，不同的音乐相关功能也归因于大脑的这一部分。例如节奏、时间和顺序结构的识别，并且与音乐刺激的语义表示（旋律识别和鉴定）有关。然而，右颞皮层参与音色和音高的处理、识别和辨别。 Lu 等人使用功能性磁共振成像（fMRI）来探索17位专业作曲家在音乐创作过程中的功能网络。这证明了在作曲过程中，前循环皮层、右角回和双侧额上回之间存在功能连接，这意味着尽管主要视觉和运动区域在作曲时没有发挥重要作用，这些区域的神经元增加了前扣带皮层和默认模式网络之间的功能连接，以计划音符和情绪的输入。",[13,25646,25647],{},"因此，将音乐视为一种语言形式，放弃音色等解释属性，我们可以认为，大脑中负责理解和知道如何解释文本和音乐结构的部分是相同的。然而，人工智能模型所基于的数学和概率论与人脑工作和处理信息的方式不同。",[10548,25649,25651],{"id":25650},"d人类音乐创作和基于人工智能音乐创作的过程","D.人类音乐创作和基于人工智能音乐创作的过程",[13,25653,25654],{},"人类音乐创作过程涉及认知过程，例如对动作的关注、反应的产生、动作规划和监测以及对重复反应的抑制24。 LeCun 描述了一种用于自主智能或单词模型的系统架构。20世纪80年代，Jordan 等人、Widrow 等人等在工作中引入了使用神经网络对这种复杂系统进行建模。这个世界（world）模型有以下模块：获取输入的配置模块，估计世界当前状态的感知模块，预测未来可能的世界状态的世界模型模块，计算输出或能量的成本模块，记忆当前和预测的世界状态的短期记忆模块，以及计算动作序列的建议的actor模块。尽管这是一个理论“世界”模型，但它可以构建一个通用的音乐机器，能够理解不同的音乐表现（音频或乐谱），分析它们，创造新的音乐，并与创造的音乐互动。",[72,25656,25657],{},[13,25658,25659],{},"一开始我也以为World写错了，然后查了一下，发现18年Geogle Brain确实提出过一篇《World Models》的论文，在机器学习届爆火。",[13,25661,25662],{},"在图 2 中，我们展示了一个基于人类和人工智能的音乐创作过程的方案，其中人类和机器都通过记忆执行动作来与世界或音乐片段互动，比如具有更多记忆的大型递归神经网络（RNNs）或 Transformers，或者在基于人工智能的模型中可以被预训练的模型取代的先验知识用来训练机器或作曲家模型（或者可以学习分析音乐然后创作音乐的多任务模型）。这种在其他 MIR 任务中具有特定任务的预训练模型的想法将允许调节各种方式或级别的生成。然而，对于符号音乐，拥有一个可以微调以执行不同 MIR 任务的通用预训练模型已被证明是开发特定任务模型的替代方案。尽管自动音乐转录（AMT）的最新进展也可以用作生成模型，即 MT3 或 DiffRoll ，分别是基于Transformer 的模型和基于扩散（diffusion）的模型，但是仍然可能存在用于建模广义模型的其他替代方案。在任何一种情况下，输出音乐都可以从头开始创建、绘制或从给定的序列继续。",[13,25664,25665],{},[617,25666],{"alt":25667,"src":25668},"图二","img\u002F2.png",[13,25670,25671],{},"【图2：人工智能和人类创作过程的比较。在右边，人类作曲家利用他或她之前所拥有的知识创作音乐，也利用产生音乐思想的创造力，这些音乐思想可以是节奏、音符等，也可以是它们在主题或旋律中的组合。在左边，人工智能作曲家用在不同MIR任务上训练的模型（“先前的知识”）与在条件下创作音乐的模型相结合来创作音乐。未来，代表人工智能作曲家先前知识的预先训练的模型可能会被理解音乐的通才模型所取代，并且记忆可以与大型RNN相媲美。下面，我们看到了由人类或人工智能作曲家创作或完成的音乐片段（或“世界”，如果我们考虑所有现有的音乐），在后者的情况下，使用强化学习技术、序列模型等。】",[10548,25673,25675],{"id":25674},"e基于人工智能的音乐生成中的agents","E.基于人工智能的音乐生成中的Agents",[72,25677,25678,25681],{},[13,25679,25680],{},"Agents不能直接翻作代理，和上面的Transformer一样，这属于机器学习领域的一种结构，近似看成用户设计的智能体（大概）。",[13,25682,25683],{},"第一段中有不少地方翻错了还请见谅，我也是一边看一边学呜呜呜",[13,25685,25686],{},"现在，深入到音乐生成的人工智能部分，我们在音乐创作框架中发现了5个智能体或实体：训练数据集、模型、界面和用户，以及需要测量的最终作品，这些将分别在第五、第六、第七、第八节中呈现。在图1中，我们可以看到基于人工智能的音乐生成或创作过程中的智能体或实体的一般方案。音乐制作工作中可能存在的每个智能体都容易受到偏见（bias）的影响。尽管数据集和模型可能由于输入音乐的性质或模型架构而具有客观 biases ，但界面和用户由于音乐的主观性而具有主观 biases。在这篇论文中，我们不会做任何偏倚（bias）分析。",[13,25688,25689],{},"我们还可以定义与这些智能体相关的两个主要过程：训练或开发和量化。当训练发生在数据库、模型和\u002F或用户界面之间时，测量或评估阶段发生在所有智能体中，并且在更大程度上发生在用户和界面之间。如果所提出的音乐生成模型没有针对最终用户或界面，我们可以仅在数据库和模型中对训练和测量阶段进行分组。",[7759,25691,25693],{"id":25692},"_3音乐原理","3、音乐原理",[13,25695,25696],{},"到目前为止，我们已经涵盖了基于人类和人工智能的音乐创作，但它是什么？以前的音乐创作知识来自哪里？在本节中，我们将介绍作为音乐支柱的音乐原则。这些原则包含了人们在创作音乐之前需要理解的基本要素的定义。",[13,25698,25699],{},"音乐可以被视为一种层次结构的语言。层次结构与音乐原则有关，音乐原则是音乐的支柱。音乐原则是：和谐、节奏、形式或结构、旋律、音色和动力。这些原理可以在符号域和音频域中进行分析。而和声、节奏、结构和旋律更多地涉及符号领域，音色、效果或动态都是诠释的一部分，即音频领域。同样值得一提的是，如果我们考虑到旋律是如何被解读的，那么它既可以从符号域的角度考虑，也可以从音频域的角度来考虑。纹理是我们如何结合这些原则的结果。除了音乐原则之外，作曲家还使用一些作曲技巧来结合这些原则。这些过程的例子我们将在本节稍后进行讨论或编排。音乐原理或参数的定义如下：",[49,25701,25702,25705,25708,25711],{},[52,25703,25704],{},"和声（harmony）。音程中音符的叠加形成了和弦。高层次的和弦是音乐音调的关键。组成一个小节的和弦通常属于同一音调。",[52,25706,25707],{},"音乐形式或结构。它是时间维度上的最高级别。然后，小节串联组织成音乐短语，这些音乐短语发展成为作为带有主题的小音乐单元。",[52,25709,25710],{},"旋律。旋律可以是单音或复音，这取决于在同一时间段演奏的音符；也可以是同音或异音，这依赖于旋律伴奏。",[52,25712,25713],{},"音质。当音乐指令或声音以相同的强度以及相同的频率播放时，它们听起来有不同的质感。",[13,25715,25716],{},"Christensen 还增加了节拍、对位法（the counterpoint）和流派或风格，并将音色排除在音乐原则之外。然而，我们将对位法归类为一种作曲技术，并添加音色，因为它是作曲的重要组成部分，特别是在表演中，这在未来的音频生成作品中非常重要。乐器和编曲是组织和编排音乐内容的音乐工具。作曲是对音乐作品中存在的乐器的选择，编曲是根据作曲家想要达到的动态和颜色为每种乐器分配旋律部分或伴奏的技术。在符号音乐软件中，组合乐器就是像乐谱中的一样将包含每个乐器的信息和音符进行轨迹组合。",[72,25718,25719,25722],{},[13,25720,25721],{},"这一段有大量的 instrumentation 、 orchestration 、instruments，我按照个人感觉修改了下内容，如有异议请以原文为主。",[13,25723,25724,25725],{},"上面的词都有乐器、配器等意思，详细解释可以参考",[5009,25726,25729],{"href":25727,"rel":25728},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F32289315",[23647],"Making Music 第三章——Instrumentation（配器）或Orchestration（管弦乐配器）",[13,25731,25732],{},"那么，从人工智能的角度来看，我们应该把人工智能音乐创作领域称为音乐生成还是作曲？这取决于每项工作的目标。如果我们想建立生成音乐的模型，而不关心音乐是如何在音乐原理和音乐理论方面生成的，我们可以称之为音乐生成问题。但是，如果我们关心这些原则，并打算构建允许用户在相关的各个级别与模型交互的界面对音乐原理拥有更多的控制权，如果用户能用这些模型学习音乐，我们可以把这个领域称为音乐创作。",[10548,25734,25736],{"id":25735},"a人类音乐创作","A.人类音乐创作",[13,25738,25739,25740,25743],{},"正如我们在第二节中提到的，当作曲家创作一首音乐时，会做出很多决定。这种情况发生在所有音乐流派或风格中，甚至在爵士乐等流派的即兴音乐作品中，这些作品都是在演奏时做出决定的。在西方古典音乐中，创作一个被称为 ",[596,25741,25742],{},"motif"," （主题）的短音乐序列是很常见的。motif 包含了那些将发展音乐部分的音乐思想。这些想法包含节奏和和声信息，可以以不同的方式排列，创造出带有相应伴奏的旋律。另一种作曲方式可以是创作一首旋律，然后进行协调，也可以是构建一个和声进程，从而构建一首旋律。这些人类创作音乐的方式取决于作曲家和音乐流派。",[13,25745,25746,25747,25750,25751,25754],{},"在旋律、和弦进行或主题（motif）被创造出来后，作曲家完成了一个包含类似音乐思想的音乐短语。音乐短语与 ",[596,25748,25749],{},"bridges"," （桥梁）连接，bridges 是从一个短语到下一个短语的过渡。一组音乐短语组成一个小节，通常以 ",[596,25752,25753],{},"cadence"," （抑扬顿挫\u002F起落）或过渡到下一小节结束。有很多种方法可以构建音乐，就像西方古典音乐中的奏鸣曲形式一样，然而，每个作曲家都会根据自己的需要调整结构。在接下来的部分中，我们将看到人工智能系统是如何模拟这些过程的。然而，人工智能本身可以改变人类创作音乐的方式，例如，通过在潜在空间中进行声音探索。",[13,25756,25757],{},"就音乐的表现而言，它有两个维度，时间和和弦\u002F和声。两个维度相互依赖。时间维度和符号域中的音乐信息通过包含音符的度量进行分组。这允许将音乐信息与称为拍号的时间单位进行分组。在构成音乐语言的所有元素中，音符处于最低水平。小节、音乐短语或旋律可以在下一个更高的层次上表现，作品的结构可以在最高层次上表现。",[13,25759,25760],{},"在图3中，我们展示了以音乐原理为构建块的一般音乐作品的形式结构，图4表示乐谱表示中的音乐原理的模式。",[13,25762,25763],{},[617,25764],{"alt":119,"src":25765},"img\u002F3.png",[13,25767,25768],{},"【图3：音乐原理及其关系。音乐作品的结构从小节到主题都有不同的层次（这取决于音乐流派）。和声和节奏是音乐中与音乐形式相辅相成的两轴，伴奏可以用对位法技术派生或构建，并用乐器和\u002F或配器来安排。】",[13,25770,25771],{},[617,25772],{"alt":119,"src":25773},"img\u002F4.png",[13,25775,25776],{},"【图4：音乐原理的乐谱图式。我们展示了音乐原理是如何在类似乐谱的表现中相互关联的。请注意，乐谱通常没有所有的和声或结构注释，如和弦或旋律识别，但它确实有乐器、键或每种乐器的动态，以告诉音乐家或指挥家应该如何演奏这首曲子。】",[7759,25778,25780],{"id":25779},"_4符号域和音频域","4、符号域和音频域",[13,25782,25783],{},"在上一节中描述了音乐原理后，我们现在将深入研究基于人工智能的音乐生成，这将是本节到论文结尾的主要主题。在本节中，我们将描述关注输入和输出信号性质的音乐生成领域。根据数据的输入和输出性质，基于人工智能的音乐生成可以从两个角度来看：符号域和音频域。我们将描述这两个领域以及在最先进技术中使用的最常见的音乐表示。在图5中，我们展示了输入和输出的模式，如符号和音频音乐数据。",[13,25785,25786],{},[617,25787],{"alt":119,"src":25788},"img\u002F5.png",[13,25790,25791],{},"【图5：符号钢琴（上）和音频波形（下）域】",[10548,25793,25795],{"id":25794},"a象征性音乐生成","A.象征性音乐生成",[13,25797,25798],{},"符号模型处理不同级别的音乐信息，如音符持续时间（或MIDI文件中的音符打开和音符关闭事件）、音高和动态属性等。然而，由于输入MIDI文件可能不包含这些信息，输出音乐将不具有性能属性。从构建用户将使用的模型的角度来看，根据我们想要构建的应用程序，输出音乐应该与可以改变音乐感知方式的性能属性相结合。由于我们已经知道音符信息，因此在该领域中检索与音乐原理相关的特征更容易。我们可以使用概率算法和最近用于谐波识别的神经网络模型检测和弦或键，使用众所周知的自相似矩阵（SSM）检测乐曲或音符序列的结构或边界，我们可以使用这些信息对离散音乐信息进行编码，以训练和调节基于AI的模型。",[13,25800,25801],{},"符号音乐生成系统可以从头开始或通过条件调节来创作音乐。这取决于模型——我们希望它创作音乐的方式。在序列模型中，这两个选项都是合适的，因为我们可以向网络提供以前的token令牌。",[10548,25803,25805],{"id":25804},"b象征性音乐与表征","B.象征性音乐与表征",[13,25807,25808],{},"象征性音乐生成的弱点之一是缺乏这些表现所具有的表征属性。正如我们在第二节中提到的，一首完整的音乐作品不仅包含象征性的属性，还包含表征属性，这是音乐演奏和感知的关键部分。除了合成音乐的经典技术外，还出现了使用深度学习技术合成具有可控属性的符号音乐的新模型。这种模型的一个例子是MIDI-DDSP。该模型提供了一种可控的合成，其中符号音乐通过特定的演奏技术（如颤音、断奏等）转换为音频。这些模型与符号生成的集成将为与人工智能共同创作音乐提供一个完整的框架。",[10548,25810,25812],{"id":25811},"c音频生成","C.音频生成",[13,25814,25815],{},"音频音乐生成包括生成音频信号而不是符号音乐表示。这允许使用原始音频作为输入来训练模型。其优点是，我们不需要有时可能不容易找到的符号音乐，并且输出不需要后期合成来再现。一方面，这是一个优势，但另一方面，原始音频比符号音乐合成更难用性能属性进行控制。尽管如此，仍有一些技术，如通过深度学习进行效果建模的音色转移，可以改进、调节并允许控制输出波形的生成。一些生成原始音乐的模型是最初为语音设计的模型，但在音乐生成领域表现出了良好的效果。",[13,25817,25818],{},"音频生成最常见的架构是VAE和GAN。DeepMind于2016年推出的Wavenet是生成原始音频最著名的模型之一。该模型使用扩张卷积来允许感受野随着深度呈指数增长，并覆盖由一系列样本组成的数千个时间步长，在原始信号中，这些样本可以是每秒16000个样本或更多。",[72,25820,25821],{},[13,25822,25823,25824],{},"感受野（Receptive Field）的定义：卷积神经网络每一层输出的特征图（feature map）上的像素点映射回输入图像上的区域大小。通俗点的解释是，特征图上一点，相对于原图的大小，也是卷积神经网络特征所能看到输入图像的区域。",[5009,25825,25828],{"href":25826,"rel":25827},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F394917827#%E6%84%9F%E5%8F%97%E9%87%8E%E7%9A%84%E6%A6%82%E5%BF%B5",[23647],"什么是感受野（Receptive Field）？",[10548,25830,25832],{"id":25831},"d风格转换","D.风格转换",[13,25834,25835],{},"这是一个神经风格转移的例子，它是艺术生成中的一种扩展技术。在音乐领域，这可以用于两个不同的目的：音色转移、流派转移和表演转移。第一个是通过保持乐器的时频特性来改变其音色。这项任务与音乐生成没有密切关系，但随着我们将在第七节中讨论的音乐生成新界面的出现，这可能是一项可以添加到音乐生成工具中的技术，以帮助用户为其作品选择正确的声音。第二个是改变作品的流派或风格，从而改变音乐的象征信息。第三个适用于控制性能。这意味着我们可以改变乐器的演奏属性，如其动力学或演奏技术，而不仅仅是音色。最先进的音色传输模型的一个例子是DDSP。",[10548,25837,25839],{"id":25838},"e输入表示","E.输入表示",[13,25841,25842],{},"在符号音乐中，我们对存储音符或音高的值、它们的持续时间、动态和其他片段级别的数据进行格式化，如乐器、键或节奏；而在音频域中，我们通常有原始信号。根据我们获得这些文件的来源，我们可以在音频数据集中以及符号音乐中找到注释数据，例如在符号音乐格式中很难找到的高级结构标记。最常见的符号音乐格式是MIDI文件、MusicXML和ABC表示法。从这些文件中，得益于它们提供的信息，我们可以创建音乐编码或标记来训练序列模型，构建一个热门向量或pianorolls。在音频中，通常使用声谱图或任何时频表示作为输入，前提是它们是可逆的，这样它们就可以重新转换回音频。",[7759,25844,25846],{"id":25845},"_5数据集","5.数据集",[13,25848,25849],{},"我们在上一节中描述了音乐生成领域的各个领域。到目前为止，在描述了音乐原理和领域并遵循图1所示的工作流程后，我们现在将深入研究音乐生成的第一个agent：数据集和允许处理它们的软件。从数据的角度来看，我们发现了一些问题，我们将在第十节中讨论：当前用于音乐生成的数据集是否代表了所有类型的音乐流派？它们必须包含哪些注释才能在可控性方面更有用？",[10548,25851,25853],{"id":25852},"a音乐生成研究的数据集","A.音乐生成研究的数据集",[13,25855,25856],{},"在音乐生成领域的历史上，一些数据集在研究界很受欢迎。尽管如此，还没有对这些数据集及其可能包含的偏差进行全面分析，因此，在评估音乐生成系统时，模型的输出是主要的研究内容。用于符号音乐生成的一些最常用的数据集包括：\nLakh MIDI 数据集（LMD），其中包含与 Million Song 数据集对齐的MIDI文件；Bach Chorales 数据集（JSB Chorales）、MAESTRO 数据集和 Meta-MIDI 数据集（Meta-MIDI）。其中一些数据集包含多音轨音乐，而其他数据集则是专门为特定音乐类型设计的。随着新的深度生成模型的出现，新的数据集正在被创建，例如 SymphonyNet 中提出的 Symphonies 数据集。更多的数据集，如 POP909 ，涵盖了音乐生成领域的其他任务，如伴奏生成。此外，在其他领域中常用的数据集，如Slakh2100 用于自动音乐转录 ，可以用于符号和音频音乐生成，因为其中一些数据集包含符号和音频文件。在表1中，我们提供了每个数据集包含的特征的摘要。",[13,25858,25859],{},"【表I：常见音乐生成数据集】",[13,25861,25862],{},[617,25863],{"alt":119,"src":25864},"img\u002Ft1.png",[13,25866,25867],{},"在音频领域，主要的优点是我们不需要符号数据来训练模型，这有时很难找到。我们可以直接用音频信号训练我们的模型，这为音乐生成领域创造了更多的可能性，因为通常比MIDI文件更容易找到音频文件。然而，在MIR社区中，保护音频和MIDI文件的版权仍然是一个悬而未决的问题，这导致研究人员在音乐生成任务中使用了非常少的数据集。在这一领域，一些模型是用MAESTRO音频样本训练的，而另一些则是用从互联网上提取的音乐训练的。",[13,25869,25870],{},"数据集中的音频和 MIDI 文件通常都受到版权许可证的保护，用于商业目的。有一些研究试图定义谁拥有音乐，无论是构建模型的团队、专有数据集，还是与模型交互并创作最终作品的用户。我们在第九节中进一步详细介绍了基于人工智能的音乐生成系统的所有权。",[10548,25872,25874],{"id":25873},"b音乐和音频处理软件","B.音乐和音频处理软件",[13,25876,25877],{},"我们可以使用一些开源软件进行预处理，从音乐中提取特征，训练 DL 模型，并在符号和音频领域对其进行评估。一方面，在符号领域，我们可以使用 musicaiz 来生成、分析、可视化和评估符号音乐，jSymbol 用于分析目的，music21 用于分析所有形式和格式的符号音乐，Humrum 、 mido 用于低级 MIDI 处理，pretty_midi 用于处理MIDI文件，muspy 用于准备数据加载器来训练用于音乐生成的 DL 模型，miditok 用我们将在本节稍后介绍的最先进的编码来标记 MIDI 文件，或者 note_seq 来处理符号音乐并使用它来训练DL模型（ library 由谷歌的 Magenta 团队维护）。另一方面，如果我们在音频领域工作，一些最常用的软件是 librosa 。Essentia 或 madom ，它们也是用于构建音频应用程序的众所周知的软件，尽管它们具有用于商业应用的版权许可。MIR 社区中常用的测量音乐的软件是MIR-eval 。在表2中，我们展示了这些软件库之间的比较。仍然需要更多的开源框架来保存和采用 MIR 社区的良好实践，以使研究结果可用并可复制。值得一提的是，谷歌和微软分别推出的 Magenta 和 Muzic 项目，其中包含了各自团队在过去几年中提出的所有模型。",[13,25879,25880],{},"【表二：MIDI和符号音乐生成、分析和表示的框架】",[13,25882,25883],{},[617,25884],{"alt":119,"src":25885},"img\u002Ft2.png",[7759,25887,25889],{"id":25888},"_6模型","6、模型",[13,25891,25892],{},"到目前为止，我们已经看到了音乐生成任务中常用的数据集以及可以帮助我们处理它们的软件。但是，哪些方法和神经网络架构被用于生成音乐？当前基于人工智能的模型用于音乐任务是因为它们正确地表示和学习音乐信息，还是仅仅因为它们在其他任务中表现良好？在本节中，我们将介绍音乐生成领域中使用的架构和方法。",[13,25894,25895],{},"机器音乐的产生始于20世纪50年代左右。机器和项目，如1957年的 ILLIAC Suite 、1964年 Koening 的 Project1 、20世纪80年代 David Cope 的 EMI ，以及 Iannis Xe nakis 的 Analogiques A 和 B 。20世纪80年代末，第一个使用神经网络的基于人工智能的模型受到算法合成的启发。 Lewis 在1988年使用了梯度下降法的训练和创造阶段。同样在1988年和1989年，Todd 定义了用于音乐应用的顺序网络。顺序网络使用的内存与已经产生的音符有反馈连接。1994年，Mozer 使用了 Elman 的 CONCERT 网络，该网络在给定可能候选音符的概率的情况下继续了一系列音符。除了这些先前的工作之外，已经提出了几种将不同的算法方法和神经网络架构结合用于音乐生成的工作。算法合成字段内部我们可以找到马尔可夫模型、生成文法、细胞自动机、遗传算法、过渡网络或 Caos 理论。这些模型可以以不同的风格和方式创作音乐，但新的深度学习方法比这些基于规则的方法更适合泛化。",[10548,25897,25899],{"id":25898},"a模型架构","A.模型架构",[13,25901,25902],{},"考虑到为每个模型选择的神经网络架构，我们有两大组方法：序列模型和生成模型。在表III中，我们提供了一些最先进的音乐生成模型的摘要。我们可以观察到模型是如何添加多轨道功能的，以及使用的架构是如何首先是RNN，现在的模型主要基于Transformers。我们还可以看到，强化学习（RL）在该领域和图神经网络（GNN）中都没有得到深入的探索。",[13,25904,25905],{},"【表三：最先进的音乐生成模型。旋律是指单声道旋律，而复调是指一种乐器，即钢琴或多种乐器的复调音乐】",[13,25907,25908],{},[617,25909],{"alt":119,"src":25910},"img\u002Ft3.png",[13,25912,25913],{},"1） 生成模型",[13,25915,25916],{},"生成模型基于变分贝叶斯（Variational Bayesian，VB）方法。ML的这个统计部分将统计推理问题视为优化问题。这些模型用于近似未观测变量的后验概率。在这个家族中，我们可以找到变分自编码器（VAE）、生成对抗性网络（GANs）、扩散模型（DM）等。",[13,25918,25919,25920,25924,25925,25927],{},"a） 变分自动编码器（VAE）：VAE模型由 Kingma 和 Welling 于2013年引入。VAE的目标是将输入建模为连续概率分布，然后从学习的分布中解码新的数据点。该架构类似于自动编码器，在VAE的情况下，潜在变量形成了具有均值和方差的概率分布的潜在空间。编码器 q",[25921,25922,25923],"del",{},"φ","(z|x) 和解码器 p",[25921,25926,17463],{},"(x|z) 分别具有可学习参数 φ 和 θ 是概率的。在 VAE 中，编码器近似于 VB 证据下界（ELBO）中的真实后验分布 p(z|x) ，这使得能够将统计推理问题作为优化问题来面对。后验近似和似然近似由解码器参数化。在 Eq. 1 中，我们展示了 VAE 的损失函数，其对应于 ELBO 优化，并且由两个项组成：重建项和KL散度。",[13,25929,25930],{},[617,25931],{"alt":119,"src":25932},"img\u002FEq.1.png",[13,25934,25935],{},"后验推理是通过最小化编码器或近似后验之间的 Kullback-Leibler（KL）分歧来完成的，而真正的后验推理则是通过最大化证据下界（ELBO）来完成的。换句话说，这意味着我们将试图通过捕捉输入数据的分布来重建输入。在这些模型中，梯度是用所谓的重新参数化技巧计算的。原始VAE模型有一些变体，如用于音频生成的 β-VAE 或 VQ-VAE 。基于VAE的符号音乐生成模型的示例是 MusicVAE ，基于 VQ-VAE 的音频生成模型是 Jukebox 。",[13,25937,25938],{},"b） 生成对抗性网络（GANs）：Goodfellow 等人于 2014 年引入了生成对抗性网。这些模型是由两个神经网络组成的，这两个网络是按照两人的极小极大博弈（Eq.2）进行训练的。这些网络被称为生成器（G）和鉴别器（D）。生成器创建数据以试图在训练期间欺骗鉴别器，鉴别器学习区分生成器生成的真实数据和虚假数据。第一个用于音乐生成的多音轨模型 MuseGAN 就是使用 GAN 网络。",[13,25940,25941],{},[617,25942],{"alt":119,"src":25943},"img\u002FEq.2.png",[13,25945,25946,25947,25950],{},"其中，x 是数据，z 是噪声变量， p",[25921,25948,25949],{},"z","(z) 是在输入噪声变量上定义的先验，D 是判别器，G 是生成器函数。D(x) 被定义为 x 是真实数据而不是由生成器分布采样的数据的概率。",[13,25952,25953],{},"c） 扩散模型：扩散模型的灵感来自非平衡统计物理学。这些模型在2022年 DALLE 2 或 Stable Diffusion 等模型发布后开始流行。然而，与大多数 ML 研究一样，这些模型首先被用于计算机视觉领域。这些模型基于扩散步骤的马尔可夫链的构建，其中在正向过程中一步一步地将随机噪声添加到数据中，然后它们学习反向扩散过程，以在反向过程中从噪声中构建新的数据样本。扩散模型是通过固定的过程学习的，潜在变量具有与原始数据相同的高维度，这使它们不同于 VAE 和 GAN 。应用于音乐生成领域的扩散过程的一个例子是 Mittal 等人的工作。将其与 MusicVAE 相结合，以生成更长的序列。",[13,25955,25956],{},"有更多的生成模型和它们的特殊应用，但由于它们尚未在音乐生成领域中使用，我们将不再深入讨论它们。这些模型的例子是基于流的模型，其特征是构建对数据的可逆转换序列或流。",[13,25958,25959],{},[617,25960],{"alt":119,"src":25961},"img\u002F6.png",[13,25963,25964],{},"【图6:MusicVAE模型架构。我们可以观察到该模型如何呈现一个具有两个BLSTM网络的编码器和一个逐音符逐小节生成符号信息的分层解码器】",[13,25966,25967],{},"2） 自回归序列模型",[13,25969,25970],{},"序列模型与生成模型相比，通常使用自回归。自回归模型利用概率链式规则估计样本的密度（Eq.3）。",[13,25972,25973],{},[617,25974],{"alt":119,"src":25975},"img\u002FEq.3.png",[13,25977,25978,25979,25981],{},"其中， X",[25921,25980,5012],{}," 是 T 个令牌序列中的一个令牌。令牌是依赖于域（音频帧、像素等）的表示。每个新令牌可以通过估计用于预测第 t 个令牌的先前令牌的条件密度来获得。符号音乐中的记号是音符事件，如音高、速度或时间增量。",[13,25983,25984],{},"a） 递归神经网络（RNN）：递归神经网络是使用序列或时间序列数据的人工神经网络。这些网络的特点是其存储单元允许存储建模长期序列的信息，但它们存在消失梯度问题。一些常用的RNN是长短期记忆（LSTM）和门控循环单元（GRU）。在音乐生成领域，这些是第一批用于尝试生成具有长期依赖性的音乐的网络。Eck 和 Schmidhuber 在 2002 年的作品就是一个例子，该作品旨在从布鲁斯音乐中学习和弦和旋律。",[13,25986,25987],{},"b） 基于 Transformer 的模型：Transformers 由 Vaswani 等人于 2017 年推出。这些模型已经超越了以前的 RNN ，并被用于从 NLP 到计算机视觉领域的各种用途。这是因为由于作为这些模型核心的注意力机制，避免了 RNN 中常见问题的消失梯度。注意力机制是基于以前在检索系统中的工作，它是用三个矩阵计算的：键、查询和值。最初的 Transformer 使用了缩放的点积注意力或自注意力机制（Eq.4）。",[13,25989,25990],{},[617,25991],{"alt":119,"src":25992},"img\u002FEq.4.png",[13,25994,25995],{},"其中",[78,25997,26002],{"className":25998,"title":26000,"style":26001},[25999],"katex-error","ParseError: KaTeX parse error: Expected 'EOF', got '_' at position 51: …，V ∈ R^{\\text{d_̲{model}} \\times…","color:#cc0000","Q ∈ R^{d_{\\text{model}} \\times d_k}，V ∈ R^{\\text{d_{model}} \\times d_{v}} 和K ∈ R^{\\text{d_{model}} \\times d_k}",[13,26004,26005,26006,26009],{},"分别是查询、值和键，d",[25921,26007,26008],{},"model"," 是词汇表大小，在符号音乐中，它可以包含我们编码中包含的所有音高、持续时间、曲目和任何其他特征。",[13,26011,26012,26013,26015,26016,26015,26018,26021],{},"原论文还包括一个改进机制，以改进自我注意机制。多头注意力允许并行地进行注意力并关注来自不同位置的不同子空间的信息。在 Eq.5 中，我们展示了多头注意力的一般表达式。在注意力层的这种修改中，d",[25921,26014,5535],{},"=d",[25921,26017,5079],{},[25921,26019,26020],{},"model\u002Fh","，其中 h 是头的数量。",[13,26023,26024],{},[617,26025],{"alt":119,"src":26026},"img\u002FEq.5.png",[13,26028,26029,26030,26032],{},"当 h",[25921,26031,39],{}," 是 i^t^ 的 head attention ：",[78,26034,26036],{"className":26035},[4566],[78,26037,26039,26117],{"className":26038},[4570],[78,26040,26042],{"className":26041},[4574],[4576,26043,26044],{"xmlns":4578,"display":4579},[4581,26045,26046,26114],{},[4584,26047,26048,26055,26057,26059,26061,26063,26065,26067,26069,26071,26073,26075,26077,26079,26088,26090,26092,26100,26102,26104,26112],{},[4600,26049,26050,26053],{},[4596,26051,26052],{},"h",[4596,26054,39],{},[4591,26056,4609],{},[4596,26058,17143],{},[4596,26060,5012],{},[4596,26062,5012],{},[4596,26064,4618],{},[4596,26066,19],{},[4596,26068,5012],{},[4596,26070,39],{},[4596,26072,5025],{},[4596,26074,19],{},[4591,26076,4594],{"stretchy":4593},[4596,26078,5032],{},[26080,26081,26082,26084,26086],"msubsup",{},[4596,26083,6107],{},[4596,26085,39],{},[4596,26087,5032],{},[4591,26089,2066],{"separator":1419},[4596,26091,5037],{},[26080,26093,26094,26096,26098],{},[4596,26095,6107],{},[4596,26097,39],{},[4596,26099,5037],{},[4591,26101,2066],{"separator":1419},[4596,26103,5042],{},[26080,26105,26106,26108,26110],{},[4596,26107,6107],{},[4596,26109,39],{},[4596,26111,5042],{},[4591,26113,4604],{"stretchy":4593},[4647,26115,26116],{"encoding":4649},"h_i = Attention(QW^Q_i, KW^K_i, VW^V_i)",[78,26118,26120,26175],{"className":26119,"ariaHidden":1419},[4654],[78,26121,26123,26126,26166,26169,26172],{"className":26122},[4658],[78,26124],{"className":26125,"style":5260},[4662],[78,26127,26129,26132],{"className":26128},[4667],[78,26130,26052],{"className":26131},[4667,4678],[78,26133,26135],{"className":26134},[4689],[78,26136,26138,26158],{"className":26137},[4693,4694],[78,26139,26141,26155],{"className":26140},[4698],[78,26142,26144],{"className":26143,"style":4703},[4702],[78,26145,26146,26149],{"style":4706},[78,26147],{"className":26148,"style":4711},[4710],[78,26150,26152],{"className":26151},[4715,4716,4717,4718],[78,26153,39],{"className":26154},[4667,4678,4718],[78,26156,4726],{"className":26157},[4725],[78,26159,26161],{"className":26160},[4698],[78,26162,26164],{"className":26163,"style":4733},[4702],[78,26165],{},[78,26167],{"className":26168,"style":4740},[4739],[78,26170,4609],{"className":26171},[4744],[78,26173],{"className":26174,"style":4740},[4739],[78,26176,26178,26182,26185,26188,26191,26194,26197,26200,26203,26206,26209,26212,26267,26270,26273,26276,26329,26332,26335,26338,26389],{"className":26177},[4658],[78,26179],{"className":26180,"style":26181},[4662],"height:1.2361em;vertical-align:-0.2769em;",[78,26183,17143],{"className":26184},[4667,4678],[78,26186,5098],{"className":26187},[4667,4678],[78,26189,4618],{"className":26190},[4667,4678],[78,26192,19],{"className":26193},[4667,4678],[78,26195,5012],{"className":26196},[4667,4678],[78,26198,39],{"className":26199},[4667,4678],[78,26201,5025],{"className":26202},[4667,4678],[78,26204,19],{"className":26205},[4667,4678],[78,26207,4594],{"className":26208},[4674],[78,26210,5032],{"className":26211},[4667,4678],[78,26213,26215,26218],{"className":26214},[4667],[78,26216,6107],{"className":26217,"style":5219},[4667,4678],[78,26219,26221],{"className":26220},[4689],[78,26222,26224,26258],{"className":26223},[4693,4694],[78,26225,26227,26255],{"className":26226},[4698],[78,26228,26231,26243],{"className":26229,"style":26230},[4702],"height:0.9592em;",[78,26232,26234,26237],{"style":26233},"top:-2.4231em;margin-left:-0.1389em;margin-right:0.05em;",[78,26235],{"className":26236,"style":4711},[4710],[78,26238,26240],{"className":26239},[4715,4716,4717,4718],[78,26241,39],{"className":26242},[4667,4678,4718],[78,26244,26246,26249],{"style":26245},"top:-3.1809em;margin-right:0.05em;",[78,26247],{"className":26248,"style":4711},[4710],[78,26250,26252],{"className":26251},[4715,4716,4717,4718],[78,26253,5032],{"className":26254},[4667,4678,4718],[78,26256,4726],{"className":26257},[4725],[78,26259,26261],{"className":26260},[4698],[78,26262,26265],{"className":26263,"style":26264},[4702],"height:0.2769em;",[78,26266],{},[78,26268,2066],{"className":26269},[5126],[78,26271],{"className":26272,"style":4839},[4739],[78,26274,5037],{"className":26275,"style":5133},[4667,4678],[78,26277,26279,26282],{"className":26278},[4667],[78,26280,6107],{"className":26281,"style":5219},[4667,4678],[78,26283,26285],{"className":26284},[4689],[78,26286,26288,26320],{"className":26287},[4693,4694],[78,26289,26291,26317],{"className":26290},[4698],[78,26292,26294,26306],{"className":26293,"style":5206},[4702],[78,26295,26297,26300],{"style":26296},"top:-2.453em;margin-left:-0.1389em;margin-right:0.05em;",[78,26298],{"className":26299,"style":4711},[4710],[78,26301,26303],{"className":26302},[4715,4716,4717,4718],[78,26304,39],{"className":26305},[4667,4678,4718],[78,26307,26308,26311],{"style":5209},[78,26309],{"className":26310,"style":4711},[4710],[78,26312,26314],{"className":26313},[4715,4716,4717,4718],[78,26315,5037],{"className":26316,"style":5133},[4667,4678,4718],[78,26318,4726],{"className":26319},[4725],[78,26321,26323],{"className":26322},[4698],[78,26324,26327],{"className":26325,"style":26326},[4702],"height:0.247em;",[78,26328],{},[78,26330,2066],{"className":26331},[5126],[78,26333],{"className":26334,"style":4839},[4739],[78,26336,5042],{"className":26337,"style":5143},[4667,4678],[78,26339,26341,26344],{"className":26340},[4667],[78,26342,6107],{"className":26343,"style":5219},[4667,4678],[78,26345,26347],{"className":26346},[4689],[78,26348,26350,26381],{"className":26349},[4693,4694],[78,26351,26353,26378],{"className":26352},[4698],[78,26354,26356,26367],{"className":26355,"style":5206},[4702],[78,26357,26358,26361],{"style":26296},[78,26359],{"className":26360,"style":4711},[4710],[78,26362,26364],{"className":26363},[4715,4716,4717,4718],[78,26365,39],{"className":26366},[4667,4678,4718],[78,26368,26369,26372],{"style":5209},[78,26370],{"className":26371,"style":4711},[4710],[78,26373,26375],{"className":26374},[4715,4716,4717,4718],[78,26376,5042],{"className":26377,"style":5143},[4667,4678,4718],[78,26379,4726],{"className":26380},[4725],[78,26382,26384],{"className":26383},[4698],[78,26385,26387],{"className":26386,"style":26326},[4702],[78,26388],{},[78,26390,4604],{"className":26391},[4682],[13,26393,26394],{},"自注意机制的复杂性是 O(L^2^d)，其中 d 是层大小，L 是序列长度。这种二次算法最近被重新考虑，我们现在可以找到更有效的注意力实现，将算法的复杂性降低到线性。",[13,26396,26397],{},"近年来为 NLP 提出的 Transformer 模型已经用大量参数进行了训练，也可以称为大型语言模型（LLM）。这些模型的一个例子是基于 GPT 的模型、BERT 或 T5 。它们中的一些使用了原始 Transformers 提出的编码器-解码器，而其他一些（如GPT）只使用了偶尔注意（casual attention）的解码器。由于文本和音乐编码之间的关系以及我们可以用来执行从文本到音乐的迁移学习的预先训练的权重，这些LLM也是一些符号音乐生成模型的核心。",[13,26399,26400],{},"3） 强化学习",[13,26402,26403],{},"强化学习（RL）是一种基于复杂目标实现的 ML 方法。深度 RL 将深度神经网络与 RL 相结合，以近似 agent （智能体）需要学习与环境交互的函数。因此，RL 是从互动中学习的。当 agent 使用策略或规则集进行操作 a 以与环境的状态 s 进行交互并因此获得奖励 r 时，就会发生这种交互。每个交互定义一个新状态 s‘ 。agent 的目标是使奖励最大化。我们将 Q 定义为在状态 s 中采取任何行动 a 都能获得最大未来回报的最优函数。深度 Q 学习（deep Q-learning）使用深度神经网络对 Q 函数进行建模。生成音乐的 RL 模型的一个例子是 RL 调谐器。在这个模型中，LSTM 网络从 teacher 那里学习，这是一种包含音阶等音乐理论概念的 RL 算法。这允许网络学习不可微分的奖励函数。这是一种根据音乐原理控制生成音乐的好方法，但这方面的工作还不多，用于音乐生成的 RL 仍有待深入研究。RL 系统的另一个用途是在给定旋律的情况下生成伴奏，如RL Duet中所提出的。",[10548,26405,26407],{"id":26406},"b输入表示","B.输入表示",[13,26409,26410],{},"音乐表示根据我们要构建的模型的领域、用途和架构而有所不同。在符号域和音频域中，我们都可以找到输入数据的 1D 和 2D 表示。",[13,26412,26413],{},"1） 符号",[13,26415,26416],{},"符号音乐信息通常分为不同的层次：乐曲层次、曲目或乐器层次和小节层次。这种音乐组织不仅有助于训练 DL 模型，而且还允许在实际应用中进行评估、修复和通信。",[13,26418,26419],{},"a） 文件格式：我们可以找到多种存储符号音乐的文件格式。最常见的是 MIDI （乐器数字接口），因为音乐制作人和作曲家可以在数字音频工作区（DAW）中轻松修改它们。MIDI 文件包含作为事件的信息，但它们并不包含所有的音乐信息，如和弦或演奏属性，如动态。从 MIDI 编码符号音乐最常用的事件是音符打开（note on）和音符关闭（note off）（音符开始和结束的位置）、音高（音符的值从 0 到 128 ）、存储施加到音符的压力的演奏属性的速度以及表示包含音符的乐器的程序号（也从 0 到 128 ）。其他 MIDI 信息包括节奏或每分钟节拍（bpm）的变化以及按键的变化。用于训练 DL 模型的最常用数据集包含 MIDI 文件。其他符号格式是 MusicXML ，它在音乐属性方面比 MIDI 更丰富，因为它可以包含和弦等和声信息。ABC 记谱法也是一种常用的音乐记谱法。当涉及到为音乐生成开发 API 时，我们可以发送 JSON 格式或协议缓冲区（protobufs）的音乐信息。note-seq 和 musicaiz 库可以导出这种表示形式的音乐，muspy 只能导出 JSON 格式的音乐。",[13,26421,26422],{},"b） One-Hot Encoding：这种编码指的是具有基音时间维度的 2D 矩阵，其中矩阵值是二进制的。如果在某个时间步长（列），音高（行）对应于该时间步长中正在播放的任何音高，则该值等于 1，如果不是，则等于 0。",[13,26424,26425],{},"c） 钢琴独奏（pianoroll）：钢琴独奏是音符事件的一种表现，可以属于某些乐器。",[13,26427,26428],{},"d） 序列编码：当训练序列模型时，有必要将输入音乐映射到令牌。与 NLP 一样，这些标记将音乐表示为 1D 向量中的一系列事件。在这篇文章中，我们找到了关于音符、结构、乐器等的信息。符号音乐的编码方式和表达时间增量单位的方法各不相同。PerformanceRNN 在 2017 年是第一个引入类似 MIDI 的事件作为数据结构的模型。这种编码已经被许多作品采用，最近基于 Transformer 的模型使用这种类型的数据结构，但以不同的方式对 MIDI 数据进行编码。音乐变换器（music transformer）通过音符和时间事件进行训练。音符事件是指以音符长度为单位测量时间增量或音符持续时间。例如，如果我们的单位是第 16 个音符，并且我们想用 delta 来表示四分之一音符的持续时间，那么我们的时间 delta 为 8，因为一个四分之一的音符中有 8 个第 16 个音节。时间事件不使用音符长度，而是使用以毫秒为单位的时间。有时，由于 MIDI 数据的性质或来源，它没有量化，选择音符长度作为单位可能会导致近似，这会使我们失去原始文件的一些凹槽。Music Transformer 建议使用时间增量作为 10ms 的单位，这会产生良好的结果，并尊重训练数据的性质。相比之下，多音轨音乐机（MMM）提出了以符号音符长度而不是毫秒进行时间编码。这种编码基于 LakhNES，并通过将多个音轨串联成具有时间偏移的单个线性序列来定义 MIDI 事件之间的时间，从而改进了其令牌表示。此模型使用 MultiInstrument 和 BarFill 表示。\nMultiInstrument 表示包含 MMM 模型用于生成多音轨音乐的令牌，BarFill 表示用于修复小节，也就是说，将现有小节替换为模型通过保持前一小节和下一小节的音乐原理一致性生成的新小节。这是建立模型的重要一步，用户可以与之交互，并接近基于分数的表示。钢琴修复应用程序（PIA）类似于 MMM 编码，因为它也提供了类似 MIDI 的编码，但尽管定义了事件之间的时间偏移，它还是标记了音符的持续时间，因此 MMM 的 NOTE OFF 标记不存在于该编码中，并且 NOTE ON 和 time DELTA 分别由 PITCH 和 duration 标记替换。在复合词转换器（CWT）中引入的复合词根据其音乐属性将标记分组为复合词，也就是说，音符将由其属性或属性定义，即音高、持续时间和速度标记，而位置标记（如 Bar）将仅具有指示小节起始位置的 Bar 标记。",[13,26430,26431],{},"在表IV中，我们提供了训练序列模型的不同编码的摘要，在图 7 中，我们展示了用 musicaiz 提取的 MMM 标记化的示例，在图 8 中，我们展现了符号音乐编码的一般模式。请注意，需要符号音乐结构分析（MSA）来添加可能基于 SIA、SIATEC 和 COSIATEC 算法的部分标记。",[13,26433,26434],{},"【表IV：音乐生成中使用的编码——最先进的序列模型】",[13,26436,26437],{},[617,26438],{"alt":119,"src":26439},"img\u002Ft4.png",[13,26441,26442],{},[617,26443],{"alt":119,"src":26444},"img\u002F7.png",[13,26446,26447],{},"【图7：Pianooll 表示及其 MMM Track 编码的示例。在本例中，时间增量以刻度表示。我们可以观察到乐曲、音轨和第一小节是如何分别以 piece start、track start 和 bar start 标记开始的，以及音符是如何以音符的音高为值，以 NOTE ON 打开和以 NOTE OFF 关闭标记关闭的。在本例中，TIME DELTA 以记号表示】",[13,26449,26450],{},[617,26451],{"alt":119,"src":26452},"img\u002F8.png",[13,26454,26455],{},"【图8：基于 MMM 的通用编码。该图显示了如何扩展 MMM 编码以调节不同级别的生成的一般方案配置。我们通过添加一个额外的级别来扩展原始 MMM 中提出的三个级别，该级别需要音乐结构检测或结构注释的特征提取算法。级别为：乐曲、乐器、小节、小节和音符级别。添加小节级标记可以允许在不需要用户手动指定或选择的情况下修复音乐短语、主题或小节】",[13,26457,26458],{},"e） 图：图神经网络（GNN）是最近的架构，需要将输入表示为图 G(V，e)，其中 e 是边，V 是节点。在音乐生成领域，这种架构还没有得到深入的探索。Jeong 等人提出了音乐的第一个音符级图表示，其中节点表示音符，并边缘化音符之间的音乐关系。连续音符与同时演奏的音符（和弦）具有不同的边缘。在图 9 中，我们展示了Jeong等人提出的音乐图表示的例子。这种表示可以重新思考和扩展，以添加小节级别、曲目级别或乐曲级别的图，从而为音乐生成训练进一步的 GNN。请注意，此表示适用于 MusicXML 文件，其中音符的时间属性与小节中的节拍和细分完全对齐，因此为了使此表示适应 MIDI 文件，有必要量化或修改所提出的表示。",[13,26460,26461],{},[617,26462],{"alt":119,"src":26463},"img\u002F9.png",[13,26465,26466],{},"【图9：Jeong等人提出的音乐图形表示】",[13,26468,26469],{},"2） 音频",[13,26471,26472],{},"a）波形：波形是原始音频数据在时间上的幅度的 1D 表示。波形中要提到的一个重要参数是采样率或采样频率，它是信号中每秒采样的数量。",[13,26474,26475],{},"b） 声谱图：声谱图是音频生成模型中最常见的输入。频谱图是用短时傅立叶变换（STFT）获得的每个片段上的频谱的 2D 表示，短时傅立叶变换是用快速傅立叶变换（FFT）计算的。通常，使用梅尔谱图，它只是一个频率适应梅尔标度的谱图。使用对数 mel 频谱图对数地呈现高于某个阈值的频率也是常见的，因此频率比线性频谱图中的频率缩放得更好。",[13,26477,26478],{},"还有其他变换可以用于音乐生成，但其使用并不普遍。其中一个原因是，在 VAE 中，我们需要重建输入，然后执行频谱图的逆或变换以获得振幅和相位，这在诸如常数 Q 变换（CQT）的变换中是不可能的。有一些算法可以反转这些变换，但它们在数学上并不精确。小波是可逆的，但由于它们的高计算成本，它们不是音乐生成领域中常用的变换。此外，与 FFT 算法相比，这些变换中的一些变换具有较高的计算成本，FFT 算法比大多数其他变换更有效。",[13,26480,26481],{},"3） 数据增强",[13,26483,26484],{},"它包括修改输入数据以获得更多样本来训练模型。可以应用于输入数据的技术取决于域。在符号领域，我们可以通过转换乐曲的键来修改音乐数据。也就是说，在乐曲中的所有音高上加上或减去相同的半音值。其他可能的数据扩充技术是通过用其他和弦替换一些和弦来修改和弦进行。这将需要在乐曲中对当前和弦进行注释（或预测它们），并使替换连贯，以便最终的和声进程与新和弦连贯。我们应该注意这些修改，因为我们可能会放松作品的风格。例如，如果我们对一个模型进行条件处理以生成贝多芬的作品，如果我们将贝多芬的作品扩展到其他键，则模型可能输出的结果不会是我们预期的和声进行或键。然而，我们总是可以通过程序修改生成的音乐，使其遵循某些规则或将 DL 模型设置为特定的键或和弦。在音频领域，修改是基于输入的性质，而不是音乐方面。这是因为符号数据更容易修改，因为我们有关于音符、乐器等的信息，但在音频领域，我们没有这些信息（除非我们用预先训练的模型预测一些音乐特征）。因此，可以应用于音频音乐信号的最常见的技术是音高偏移、时间拉伸、噪声添加等。",[10548,26486,26488],{"id":26487},"c输出形式","C.输出形式",[13,26490,26491],{},"Briot 等人将音乐的输出性质定义为对音乐生成模型进行分类的方法之一。在这种情况下，由于在音频领域中，生成的音乐的输出形式取决于我们训练模型的数据集，我们将专注于符号音乐生成，在那里我们可以更容易地识别音乐术语中输出的性质。输出性质与音乐的结构和纹理原理有关，这取决于我们所看到的。一些音乐生成模型被训练来生成钢琴作品，而其他模型则提出了多乐器生成。一件作品中的乐器可能由模型本身或最终用户决定。这种分类是基于结构的分类，因为纹理是一个完全不同的概念。基于纹理的分类可以区分单声道和复调生成（我们可以在单乐器和多乐器作品中具有相同的纹理）。",[13,26493,26494],{},"1） 注重质感",[13,26496,26497],{},"a） 旋律生成与伴奏：旋律生成是音乐创作模式的最初目标之一。旋律是一系列音符，可以是单声道的，也可以是复调的。第一个组成旋律的模型产生了短期音符序列。随着 RNN 和语义模型的出现，提出了基于单元选择的工作。RNN 在该领域模型的开发中发挥了重要作用。自从 Eck 和 Schmidhuber 在 2002 年的工作以来，越来越多的模型使用 RNN 来创作音乐。这些模型的例子是 2016 年谷歌 Magenta 的 MelodyRNN 或 2017 年的 AnticipationRNN 。这些模型能够产生旋律，也能够产生跟随旋律的和弦，但它们并没有被开发成对位模型。对位是一种通过遵循一定的规则来组合旋律的技巧。2017 年的 DeepBach 是最早实现这一目标的模型之一。该模型是用 JSB Chorales 数据集训练的，该数据集包含 4 个在对位中机智的声音片段。DeepBach 的架构由 RNN 组成，并使用吉布斯采样（Gibbs sampling）来编写每个语音的音符，吉布斯采样是一种从多变量概率分布中获得近似观测序列的技术。此外，2017 年提出了 COCONET 。该模型由神经回归分布估计（NADE）模型与吉布斯采样相结合组成。",[13,26499,26500,26501,26503],{},"然而，这些模型无法产生新的或创造性的音乐创意，如高质量的主题。随着 VAE 等新生成模型的出现，Magenta 于 2018 年提出了 MusicVAE6。这个想法是在 VAE 的潜在空间中插入，创作 2 到 16 小节的短音乐片段。该模型是用 LMD 的旋律和三重奏（鼓，低音和旋律）进行训练的。MusicVAE 提出后，音乐生成领域旨在在新的基于 Transformer 的模型的卓越功能的指导下生成更长的序列或旋律文本生成。2018 年提出的带有螺旋式注意力机制的音乐转换器是最早使用注意力机制生成多语音音乐的模型之一。该模型是用 JSB Chorales 和 MAESTRO 数据集为精湛的钢琴进行训练的。2018 年出现了更多基于 Transformer 的模型，如 OpenAI 的 MuseNet 。2020 年发表的 PopMAG 也可以生成伴奏。对于 16 到 32 小节的音乐序列，即较长乐曲中的音乐部分，解决了长期依赖性。当涉及到上下文时，较长的序列无法记住以前的音乐想法的原因是注意力瓶颈。从 2020 年开始，有人提出了使用 VAE 和 Transformers 来生成新音乐并为长期背景建模的模型。PianoTree 、 TransformerVAE 就是这样的模型的例子。然而，这些模型中的任何一个都实现了生成具有高水平结构连贯性的长音乐片段的目标。使用扩散的模型的一个例子是 Mittal 等人提出的模型，该模型基于去噪扩散概率模型（DDPM）。该模型捕获 MusicVAE 2-bar 模型的 k＝32 的 VAE 潜伏时间 z",[25921,26502,5535],{}," 之间的时间关系。这允许将 MusicVAE 2 小节扩展到 64。然而，正如基于注意力的 mdoels 所发生的那样，这种方法既不能遵循主题或音乐理念，也不能连贯地延续它。新的基于注意力的模型，如使用交叉注意力来使用 4096 个令牌的上下文的 Perceiver AR，正在使用 MAESTRO 数据集进行训练，并且似乎可以学习和生成更长的音乐序列。",[13,26505,26506],{},"旋律生成的另一种方法是首先生成和弦序列，然后生成与和弦进行相匹配的旋律。这是一种人类也采用的创作方式。BebopNet 模型从爵士乐和弦中生成旋律，因为爵士乐和声比其他音乐流派更复杂。其他模型使用变分自动编码器（VAE）、生成对抗性网络或基于 GAN 的模型、端到端模型。ChordAL 生成一个和弦进程，该和弦进程被发送到旋律生成器，然后将输出发送到音乐风格处理器。",[13,26508,26509],{},"b） 结构：生成遵循高级结构的音乐是音乐生成领域的一个悬而未决的问题。生成结构化音乐的困难部分是模型实现这一点所需的高理解水平。更准确地说，该模型不仅需要学习节奏、旋律和和声是如何结合的，还需要记住几小节或几分钟前发生的音乐事件，以便开发或修改它们。音乐中的小节可能被建模为模板，或者可以通过模型学习。每种音乐流派都有自己的结构或部分标签，如摇滚或流行音乐的合唱和诗歌，或奏鸣曲形式的阐述、发展和重述。部分也可以用大写字母标记。过去，有一些模型提出了高层结构建模所需遵循的模板。Lattner 等人在 2018 年使用了自相似矩阵和卷积限制玻尔兹曼机（C-RBM）将结构强加给生成的音乐。其他作品试图开发自己学习音乐结构的模型。尽管使用注意力机制的新 DL 模型正在尝试生成更长的序列，但据我们所知，仍然没有能够生成结构化音乐的模型。使用交叉注意力机制或线性注意力的模型可能是实现这一目的的解决方案。使用 MAESTRO 数据集训练的 Perceiver AR 是可用于此目的的最新模型。尽管如此，它并没有根据音乐原理进行评估，这让我们怀疑它生成结构化音乐的能力。除了尝试在模型的架构中工作（这是最常见的方法）外，研究人员还可以开发检测符号数据结构的算法，以将结构标记添加到输入编码中，如我们在图 8 中提出的那样。这也将有助于修复的关注点。",[13,26511,26512],{},"c） 旋律协调：旋律协调是为现有旋律找到合适且连贯的和弦进行的过程。我们需要指出的事实是，有大量的和弦，因为我们可以从主音（半音音阶中的 12 个音符）构建它们，根据和弦的复杂性（三和弦、七和弦等），它们可以反转为一个、两个、三个或更多个反转，并且可以具有不同的质量（大、小、减、增等）。此外，一个和弦不能跟在词汇表中的所有和弦后面，因为和弦进行必须具有由每个和弦音调功能定义的连贯性。我们还必须区分旋律协调还是为多首曲目生成伴奏，但在我们看来，最后一个术语更多地与乐器有关。第一个面临这个问题的模型是基于隐马尔可夫模型（HMM）的，其性能优于 RNN。Eck 和 Schmidhuber 在 2002 年使用 LSTM 来学习旋律和和弦。最近，在 2019 年，LSTM 也被用于预测给定旋律的和弦伴奏。同样在 2019 年，巴赫涂鸦（使用 Coconet）被开发出来，以巴赫的风格为给定的旋律生成伴奏。近年来提出了更多使用 LSTM 的工作。",[13,26514,26515],{},"关于多音轨伴奏的生成，它可能被视为编排过程的一部分。旨在执行这项任务的模型是基于 GAN 的架构，用于实现引线板安排。2018 年的 MICA（多乐器联合编曲）和 2020 年的 MSMICA 是多音轨伴奏的一个例子。",[13,26517,26518],{},"d） 通过调节生成：音乐生成的一个重要特征是调节模型的能力。调节可以基于使模型遵循特定的音乐原则或继续给定的提示。由于研究人员提出的输入编码，基于 Transformer 的模型能够生成给定和弦序列的音乐。在这一领域，由于人机交互（HCI）研究的重要性，我们发现还有很多研究要做，并让用户通过将这些技术作为作曲过程的一部分来使用这些技术，例如，通过修复与用户音乐知识相匹配的不同作品级别和难度。",[13,26520,26521],{},"e） 风格转换：音乐可以有多种风格。流派是允许对音乐进行分类的东西。不同的流派有其特殊性，它们将不同的音乐原则结合在一起。在音乐生成领域，风格转换是指改变作品的流派，例如，将摇滚歌曲转换为古典歌曲。这是一项有趣的技术，因为没有每个音乐流派的数据集来训练大型 DL 模型，然而，如果我们的数据集很小，也可以进行迁移学习。在音乐生成领域，Hung 等人于 2019 年提出了爵士乐生成的递归 VAE 模型。在 DL 领域，Gatys 等人于 2016 年引入了风格转移。其目的是将样式特征应用于另一个图像中的图像。当涉及到音乐生成时，通过使用表示生成音乐的风格的嵌入或特征向量来改变音乐风格。MIDI-VAE（2018）是一个可以执行此任务的模型示例。得益于 VAE 的潜在空间，该模型将其中的风格编码为音高、动态和乐器特征的组合，使其能够生成复调音乐。正如我们之前提到的，一首音乐作品的风格是由作曲家如何结合音乐原理来定义的。除了使用音高和演奏属性对风格进行编码的 MIDI-VAE 之外，我们还可以找到其他模型，如 MusAE，它们也使用音高属性对音乐风格进行建模。除了这些使用音高属性的模型外，我们还可以找到使用和声和纹理属性对风格进行编码的模型，如 2020 年的 PianoTreeVAE、2021 年的 MuSeMorphse 和其他作品。",[13,26523,26524],{},"f） 修复：随着计算机视觉的新发展，可以组合两幅图像的风格或扩展现有的绘画，修复已成为最终用户的需求。修复是用与上一个和下一个音乐片段匹配的新颖内容替换音乐内容的能力，以保持作品的连贯性。在符号音乐中提供这种能力的模型的例子是钢琴修复应用程序（PIA）（2021）或 MMM 编码（2020）中提出的 BarFill 标记化。PIA 适用于钢琴作品，而 MMM 可以处理多音轨音乐。对模型的实验表明，对现有音乐的替换如何保持音乐方面的连贯性，如和声。然而，通过对象征音乐更好、更有力的分析和理解，我们可以修复和控制音乐原理的具体音乐方面，如和弦（和弦本身或其质量、反转等）、节奏执行（琶音、保持和弦等）或高级结构特征，如每个小节的关键。",[13,26526,26527],{},"2） 乐谱维护",[13,26529,26530],{},"a） 钢琴音乐：钢琴音乐基本上是合成复调音乐，它有一个旋律和一个与旋律连贯的伴奏或和弦序列。由于过去缺乏能够处理多乐器音乐的强大模型，研究人员一直专注于这类音乐。从这个角度来看，钢琴音乐模式与我们根据纹理分类的旋律和伴奏生成模式是一样的。这是因为钢琴是一种复调乐器，我们可以用它同时演奏旋律和伴奏，而现有的复调音乐数据集大多是钢琴数据集，蓝调或爵士乐数据集除外。",[13,26532,26533],{},"b） 多乐器音乐：多音轨或多乐器音乐是指为多个乐器创作或编排的音乐。请注意，这种分类与纹理不同，因为多乐器音乐也可以写成带有伴奏或其他纹理的旋律。多种乐器的音乐给钢琴音乐增加了额外的难度，因为作品中有更多的信息（更多的音符），而且它增加了处理每种乐器的符号和演奏属性以制作连贯作品的问题。在图 4 中，我们展示了该方案，该方案具有多种乐器的类似输出的乐谱的音乐基本原理。",[13,26535,26536],{},"多音轨生成的第一种方法是在作品中加入鼓的音轨。由于鼓是非音高的乐器，因此使用鼓就能实现与旋律的节奏相匹配。2012 年，Kang 等人提出了一个模型，该模型可以为旋律和鼓生成和弦伴奏。2017 年，Chu 等人提出了具有分级 RNN 的 PI 之歌。2017 年，第一个为多音高乐器生成连贯音乐的模型是 MuseGAN。从那时起，提出了更多基于 GAN 的模型，如 SeqGAN 或具有二元神经元的 CNN-GAN。后来，正如钢琴音乐一样，基于 Transformer 的模型被开发用于多音轨音乐。2019 年，Donahue 等人提出了 LakhNES，这是一个基于 TransformerXL 并使用 NES 音乐数据库（NES-MDB）进行训练的模型。2020 年，针对这项任务，还提出了更多具有不同编码的基于 Transformer 的模型（见表IV）。其中一些模型使用了它自己的编码，我们在本节前面的序列编码段落中对此进行了描述。Ens 等人提出了 MMM 编码，该编码通过使用 Hugging Face Transformers 库在文本上使用 GPT-2 预训练模型进行训练。2020 年发布的其他型号包括使用 MuMIDI 编码的 Pop-MAG 型号、使用 OctupleMIDI 编码的 MusicBERT 型号、使用 REMI 编码的 Pop Music Transformer 型号和使用音乐 BPE 算法获得的 MMR 编码的 SymphonyNet 型号。其他工作涉及符号音乐理解的基于 Transformer 的模型的预训练。需要注意的是，由于这些模型需要在我们从头开始训练它们的情况下训练大型数据集（如果我们查看之前提到的数据集，则需要超过 50 万个文件），因此编码算法的计算成本对于加速标记化过程非常重要。同样值得注意的是，减少了令牌的数量，并使用了不是线性的，而是以一种可以像 SymphonyNet 那样耦合令牌的方式，使训练和推理更快。值得一提的是，尽管音乐转换器的编码是为钢琴作品设计的，但它可以被修改为对多音轨音乐进行编码，或者使用预先训练的模型对多音轨数据集进行迁移学习。",[13,26538,26539],{},"c） 乐器和编排：乐器和编排可能不像旋律位置那样重要，但它们在作曲过程中发挥着重要作用。然而，在音乐生成领域，人们对这些技术的兴趣并不高，可能是因为该领域中使用的模型和数据集还没有开发到足以应对这些问题的程度。正如我们在第三节中介绍的，插入和编排是不同的技术。第一个是选择符合其音乐和演奏特性的乐器，第二个是选择和排列音乐信息的过程。关注那些试图面对和建模这些技术的 DL 模型，我们可以找到 SymphonyNet，它是在 2022 年提出的。它使用基于 BERT 的模型和标记化，以便对模型进行训练，以对音符所属的乐器进行分类。这是 DL 模型的音乐乐器和配器的第一个和成功的想法之一。然而，重要的是要注意，从模型的角度来看，它同时学习这两种技术，并且不区分它们。例如，用这些技术可以将钢琴作品转换为管弦乐队作品，但 SymphonyNet 是用管弦乐队作品直接训练的，这意味着它不能将钢琴作品转化为管弦乐队，也不能减少管弦乐队的钢琴作品。",[7759,26541,26543],{"id":26542},"_7人机交互","7、人机交互",[13,26545,26546],{},"正如我们在引言中所提到的，人机交互技术的重要性是整个人工智能音乐创作的关键概念之一。随着世界各地的活动和竞赛，如人工智能歌曲大赛，将与人工智能共同创作音乐的团队聚集在一起，共同创作变得越来越重要。在本节中，我们将深入研究在音乐生成领域和用户中提出的用户界面。在本节中，我们总结了图中所示的合成工作流的代理。让位于下一节中的评估。",[13,26548,26549],{},"HC 交互中最重要的元素之一是用户界面。随着深度生成模型的最新进展及其在计算机视觉领域的新功能，对现代用户界面的研究正在增加，这推动了人工智能音乐生成新界面的诞生。设计良好的界面不仅给用户带来更好的体验，还允许用户与模型进行不同级别的交互，尤其是在基于 AI 的艺术模型中。在这一部分中，模型通常是一个黑框，用于响应界面中的用户提示。因此，在合成工作流的这一部分中有两个重要的代理：用户和界面。",[10548,26551,26553],{"id":26552},"a界面","A.界面",[13,26555,26556],{},"界面是用户通常体验到的第一个也是唯一一个部分。具有复杂或基本的界面是取决于要构建的工具或产品的设计决策。完美的界面并不存在，但之前对目标用户的分析以及构建某个产品所用技术的知识可以帮助设计一个好的界面。",[13,26558,26559],{},"Bougueng 和 Ens（2019）的 Apollo 旨在通过创建、编辑和操纵音乐语料库来组织音乐数据。用户可以修改他们上传的音乐文件，并使用控制音符密度、小节数或音高类别的参数生成音乐。",[13,26561,26562],{},"COSMIC（2021）提出了一种用于人类人工智能音乐与聊天的交互界面，该界面使用 NLP 核心将人类输入处理为文本，并与人类交互以定义或细化输出音乐。该过程从创建元数据的开始状态开始，与人的文本输入相匹配的旋律生成，与允许在给定条件下细化旋律的 HCI 的旋律修订，也通过与人交互的歌词生成和修订，以及会话关闭时的结束状态。需要传递到自然语言理解第一模块的音乐属性是：音符密度、音高变化、节奏变化、歌词类型和歌词关键词。这些参数被转换为关键字，并传递给下一个模块对话状态跟踪器（DST）。这是一个类似聊天的界面示例，其中用户的输入是文本。",[13,26564,26565],{},"Louie 等人（2022）提出了两个接口，旨在测量用户与两种音乐生成模型的交互：收音机和转向接口。尽管无线电界面依赖于用户用来生成音乐的简单按钮，但操纵界面提供了不同级别的控制，如音高、键等，它还允许用户通过选择由先前序列制作的序列来创作作品。Louie 等人通过以下指标来衡量用户体验：表达、沟通、音乐连贯性、所有权、控制和功效。在所有这些指标中，指导界面获得了更好的结果，但用户在音乐创作方面的经验或知识水平没有得到深入研究，这就留下了一个悬而未决的问题，即专业作曲家是否更喜欢更完整的界面，而更简单的界面是否适合业余音乐家，如果接口与目标用户具有直接关系。",[13,26567,26568],{},"郭等人的 MusIAC（2022）定义了一个具有基于音乐结构的音轨级或小节级控件的控制界面。这些级别允许定义与和声或节奏相关的控制，例如张力。这些基于音乐原理的控件适用于具有一定音乐基础的用户。",[13,26570,26571],{},"SonyCSL 的其他项目，如用 Javascript 开发的 NONOTO 和 PI-ANOTO，提出了修复符号音乐的接口。而 PIANOTO 是基于一个类似钢琴的界面，用户可以通过在界面中选择区域进行修复并创建符号音乐，NONOTO 面向声音创作和符号生成，并使用 DeepBach 进行修复。",[13,26573,26574],{},"Magenta 团队还为 Ableton 开发了插件，这些插件在后端使用了该团队开发的模型。",[13,26576,26577],{},"我们看到了不同的用户界面，可以与基于人工智能的音乐生成模型交互，在某些情况下可以控制音乐主体，在其他情况下可以进行其他“探索性”控制。我们还看到了接口所具有的控件数量的差异。近年来，将会有更多的界面被提出，考虑到文本提示和语音在图像生成应用程序中的成功，可以合理地假设，其中一些类似提示的界面也将用于音乐生成，特别是对于那些可能只喜欢通过键入句子来生成音乐的初学者用户。这方面的一个例子是给出提示的音乐生成：“生成基于肖邦 C 大调夜曲的一分钟音乐，悲伤的音乐”。在音频生成领域，有一种最新的模型，AudioGen，能够在给定文本的情况下生成音频。尽管该模型不生成音乐，但它可以在音乐样本上进行训练，以实现文本引导的音乐生成。",[13,26579,26580],{},"现在，我们将深入探讨在没有提供接口的情况下，用户对模型的看法和评估。未来的研究主题将依赖于测量界面和用户水平，以根据用户在使用这些技术时的音乐知识或目标来构建更个性化的界面。",[10548,26582,26584],{"id":26583},"b用户","B.用户",[13,26586,26587],{},"最终用户是合成工作流程中的最后一个智能体，但在我们看来，它是最重要的一个。计算机视觉领域多年来一直在将知识从学术界转移到工业界。最终用户的反馈不仅是行业层面的关键部分，也是学术界的关键部分。有一些研究用户如何与音乐生成系统交互的工作，因为该领域的工作一直致力于模型，并且由于音乐生成领域与计算机视觉相比是新的，因此缺乏来自用户的反馈，无法帮助该领域朝着特定方向发展。",[13,26589,26590],{},"MuseGAN 使用主观测量来评估模型，主观测量取决于用户的音乐知识。这一点很重要，因为音乐是主观的，用户在与音乐生成的生成模型交互时的体验可能会有偏差。一个好的方法是将用户分为初级、中级和专业级别。这些级别是指没有音乐知识的用户（初学者）、学习过音乐的用户（中级）以及能够深入识别和分析音乐的专业音乐家或作曲家（专业）。我们认为，考虑到最终用户，该领域可以提出不同的模型，在界面上或多或少具有可控性，以更好地接近他们。",[7759,26592,26594],{"id":26593},"_8评估","8、评估",[13,26596,26597],{},"在 MIR 中，评估音乐生成是一个悬而未决的问题，因为这些系统中有一个难以衡量的创造性组成部分。此外，由于音乐是主观的，因此很难评估或量化音乐作品的质量。研究人员已经提出了评估和比较模型性能的指标，但仍然缺乏一种用于符号音乐和音频音乐生成的通用评估方法。这些指标中的一些在不同的领域是常见的，如计算机视觉或自然语言处理领域，如混淆（perplexity）或 F-score，其他指标是特定于研究领域的。在音乐生成领域，在我们进行评估之前，我们需要从生成的音乐中提取一些特征，这并不总是一个容易的问题。近年来，人们提出了各种各样的措施，分为客观措施和主观措施。同样重要的是要强调，在符号领域，我们可以更好地测量作品的音乐方面，而在音频领域，我们可能希望测量生成信号的质量。",[10548,26599,26601],{"id":26600},"a主观评价","A.主观评价",[13,26603,26604],{},"主观评价与用户对模型的体验有关。这种评估是由用户完成的。它的弱点在于，每个模型都由不同的人进行评估，因此结果不可重复。此外，用户的知识、文化和疲惫（个人认为这里是不感兴趣）可能会改变评估结果。Ji 等人揭露了音乐质量的定量评估与人类判断之间缺乏相关性，这使得这种评估是必要的，因为最终用户是互动和生成音乐的人，他们的意见非常有价值。",[13,26606,26607],{},"有两种常用的方法来客观评价音乐：听力测试和图灵测试。人工智能领域提出的每个模型在进行听力测试时都使用自己的调查和方法，但最近有一些工作提出了调查模板。按照用户级别划分的听力测试的一个例子是 MuseGAN 评估中使用的测试，该评估由 144 名用户完成。更多的用户参与了 DeepBach 的评估，其中 1.272 进行了听力测试，也根据他们的音乐知识进行了分组。通常情况下，听力测试包括评分从 1 到 5 的问题，这些问题符合音乐原则。在 MuseGAN 评价的案例中，提出了衡量和声柔顺性、节奏、结构、连贯性和整体评分的问题。我们可以让用户收听生成的样本，也可以为更深入的分析提供分数。",[13,26609,26610],{},"主观评估也可以被视为基于人工智能的模型的调试工具。一个例子是 MusicVAE 的监听测试，该测试使用 Kruskal-Wallis H-test 来验证模型的质量，得出的结论是，该模型在使用分层解码器时表现更好。这使研究人员能够验证哪种提出的体系结构产生了更好的音乐，尽管我们应该始终关注到客观的衡量标准。",[13,26612,26613,26614,26617],{},"我们不仅可以要求用户对作品进行评分，或要求他们区分人类或人工智能作品，还可以提出与模型的创造性或生成作品的自然度有关的非定量问题，而这在客观评估中是不可能的。关于音乐生成评估的新研究通过要求参与者在 7-point Likert 量表中测量以下标准来比较音乐生成的 DL 模型：",[22,26615,26616],{},"生成作品的整体性、旋律性、丰富性、韵律性、正确性、结构性和连贯性","。Chu 等人证明了人类希望在基于人工智能的音乐生成系统中有更多的可控性，并声称旋律性是主观衡量这些系统的最有效标准。他们将这些标准定义为：",[49,26619,26620,26623,26626,26629,26632,26635,26638,26641],{},[52,26621,26622],{},"整体。对音乐的整体满意度。",[52,26624,26625],{},"创造力。要求音乐是新颖的、有价值的和原创的。",[52,26627,26628],{},"自然。音乐听起来像是富有表现力的人类表演。",[52,26630,26631],{},"优美。和谐的乐曲。",[52,26633,26634],{},"丰富性。音乐是多样化和有趣的。",[52,26636,26637],{},"节奏性。节奏是否统一。",[52,26639,26640],{},"正确性。音乐是否存在突然停顿等技术故障。",[52,26642,26643],{},"相关性。条件音乐是否与参考音乐相似。",[13,26645,26646],{},"在进行主观研究时，考虑我们所处的领域是很重要的，因为符号音乐需要合成，合成过程可能会影响用户对音乐的感知。",[10548,26648,26650],{"id":26649},"b客观评价","B.客观评价",[13,26652,26653],{},"与音频或符号音乐生成的主观评价相似相比，由于这两个领域的性质，客观评价呈现出更多的差异。在深入研究评估音乐生成系统的具体方法之前，我们将介绍我们可以从符号音乐中提取的特征向量，以及文献中提出的一些一般措施。",[13,26655,26656],{},"a） 符号音乐：我们可以从符号音乐中提取的特征向量可以分为音乐原理：音高相关、节奏相关和和声相关。",[49,26658,26659,26662,26665],{},[52,26660,26661],{},"音高矢量是允许测量特定乐器或乐曲组成的八度音阶的音高范围，以及测量连续音高之间音高距离（通常为半音）的音程（我们应该同时考虑单声道和多声道音乐）。我们还可以计算基音类直方图（PCH）和基音类转移矩阵（PCTM）。音高等级（PC）是指转换为某个八度音阶的音高。这意味着，如果我们有 C4 和 C5，两者的 PC 将是相同的，因为它们都对应于音符 C。因此，我们将有 12 个音高类，对应于从 C 到 B 的半音音阶中的 12 个音符。",[52,26663,26664],{},"节奏向量是起始间隔（IOI），它是连续音高的起始之间的差异，音符密度是音乐序列、与音符持续时间相对应的持续时间范围以及测量音乐序列中有多少步静音的占用率。我们还可以计算音符长度直方图（NLH）和音符长度转移矩阵（NLTM）。",[52,26666,26667],{},"和声向量是复调率，复调率是我们找到复调的细分数量，或者是音乐序列中复调音符的最大数量。",[13,26669,26670],{},"这些矢量或描述符不仅可以测量音乐，还可以理解音乐，因为大多数乐器只能以特定的八度音阶演奏，并且具有人工智能模型应该建模的特定节奏特征。",[13,26672,26673],{},"我们必须考虑到这样一个事实，即这些特征适用于我们可以在乐曲级别（整个文件或带有所有乐器的乐曲）、音轨级别（只有一种乐器）和小节级别（包含所有乐器的小节或某一乐器的小节）进行解释的音乐序列。我们在评估中选择的水平将取决于我们的目标。",[13,26675,26676],{},"一旦我们计算了这些向量，我们就可以建立评估度量，并将其与训练数据进行比较。这些度量也在音乐原理中进行了划分，如表 V 所示。特征向量，这些度量可以为每个级别计算：乐曲、曲目或小节级别。",[13,26678,26679],{},"【表 V ：象征性音乐评价的常用方法】",[13,26681,26682],{},[617,26683],{"alt":119,"src":26684},"img\u002Ft5.png",[13,26686,26687],{},"随着符号音乐谐波提取的更多进展，如 Cheng 和 Su 提出的 HT 模型，我们可以测量生成音乐的和弦和键以及训练集中的样本，并提出新的度量标准对现有的进行补充和扩展。这显然是通过查看度量来了解提取的可信度，从而了解我们可以从中获得的度量。",[13,26689,26690],{},"Yang 和 Lerch（2020）提出了一种评价符号音乐的一般客观方法。首先，提取一些音高和节奏特征。然后，我们根据这些特征构建直方图，我们可以将其近似为概率密度函数（PDF）。根据这些函数，我们可以测量 Kullback-Leibler 散度（KLD）和重叠平面积，以确定 PDF 的相似程度。PDF 是从片段和条级别构建的，通过交叉验证同一数据集的样本（集内）或将训练数据集与生成的数据集（集间）进行比较。",[7759,26692,26694],{"id":26693},"_9-进一步的观点和研究","9、 进一步的观点和研究",[10548,26696,26698],{"id":26697},"a量子音乐时代","A.量子音乐时代",[13,26700,26701],{},"Eduardo Miranda 在 2021 年和 2022 年介绍了艺术与人文领域的量子计算。尽管量子机器学习是一个用于一般应用的新研究领域，但有一些研究正在定义量子音乐技术的第一步。这一新的 MIR 研究领域旨在开发创建、表演、聆听和分发音乐量子计算工具的工具。",[10548,26703,26705],{"id":26704},"b情感与主体性","B.情感与主体性",[13,26707,26708],{},"音乐中的情感已被广泛研究。从旨在检测音频信号中情绪的模型到最近旨在生成具有特定情绪的音乐的作品。音乐情感识别有专门的数据集，可以用来训练模型来自动标记或条件生成模型。尽管如此，情绪是主观的，它们取决于用户的文化、背景或音乐知识。Bao 和 Sun 提出了一个带有情感的音乐生成模型。该模型使用基于 BERT 的模型来识别情绪（在 GoEmotions 数据集上预先训练的模型），并有三个模块：用于生成歌词和旋律的编码器-解码器架构、音乐情绪分类器和使作品适应情绪调节的波束搜索算法。",[10548,26710,26712],{"id":26711},"c生成音乐的版权","C.生成音乐的版权",[13,26714,26715],{},"关于使用基于人工智能的模型获得的音乐版权的法律声明仍在进行中，这是一个令人担忧的案例。近年来，随着对使用基于人工智能工具的公司的注资，以及区块链等新技术的出现，不仅需要定义法律声明，还需要定义道德声明来控制基于人工智能的音乐产品。有几个问题需要解决，但最相关的问题之一是：版权属于谁？在使用人工智能创建音乐的过程中，有不同的智能体参与，例如创建用于训练模型的数据库的人、构建和训练模型的团队或创建音乐的用户等。尽管有人同意在版权法中应考虑该工具或程序员，但也有人声称，使用该工具的人应有权获得作者身份，因为艺术品的实例化是归属作者身份的充分条件。然而，如果音乐创作过程中没有人参与，根据 1988 年《设计和专利法》（英国）（CDPA），作者应该是为作品创作做出必要安排的人。Deltorn 和 Macrez 认为，从司法角度来看，有两种方法：现行法和拟议法。第一种是否定对计算机生成的作品的保护，并逐案分析以确定人类的贡献。第二个问题依赖于修改现有版权制度的必要性，因为软件和数据库（创作过程中的非人类智能体）已经可以受到专利保护。",[10548,26717,26719],{"id":26718},"d应用","D.应用",[13,26721,26722],{},"尽管当今音乐生成领域的趋势是在音频应用中，但音乐生成在 MIR 社区内外都越来越受到关注。不仅正在开发音乐生成界面来探索和增强 HCI，而且还出现了允许用户生成和拥有自己作品的商业应用程序。音乐生成技术还有更多的应用，我们在本文中没有涉及，尽管我们在下面展示了其中的一些：",[49,26724,26725,26728,26731,26734],{},[52,26726,26727],{},"音乐教育。随着即将到来的技术和钢琴指法等任务的最新研究，学术界或工业界可以开发工具来生成带有注释的音乐，供钢琴家演奏音乐短语或片段。如果基于人工智能的模型能够很好地控制和声、节奏、风格或时期等，这些技术也可以用作人类的作文学习系统。",[52,26729,26730],{},"内容生成。内容创作者将受益于这些为他们的项目生成新音乐的工具。然而，这需要对此类创作的版权进行强有力的法律分析。尽管这更多的是一个行业应用，但它与研究人员如何开发模型密切相关，人类可以根据自己的兴趣、目标或音乐知识与之互动。",[52,26732,26733],{},"音乐制作。新的基于深度学习的音乐制作技术可以受益于音乐生成模型，用于创建给定循环的新层或延续。",[52,26735,26736],{},"原声音乐。为视频或电影生成音乐。这将比内容生成更进一步，因为模型需要复杂而长期的关系和分析。模型应该学习（或接受）的一些东西是对人物、场景、情绪等的分析，我们希望通过创造主旋律来唤起音乐。这并不容易，因为除了主观的情感分析之外，网络还应该识别角色并记住与每个角色相关的主题。",[7759,26738,26740],{"id":26739},"_10讨论","10、讨论",[13,26742,26743],{},"我们在第二节中看到了音乐如何从技术角度被解释为一种语言，我们涵盖了人类和人工智能创作过程之间的关系。尽管人类和人工智能的音乐创作方式是相似的，因为它们都是逐音符或逐和弦创作的，但人类大脑和人工智能方法对音乐的理解和感知远没有可比性。人工智能系统是为了模拟人类过程而设计的，我们可以将大脑中理解语言的部分与 LLM 联系起来，正如我们在第二节中看到的那样，但它们既不能像人脑那样工作，也不能像人脑一样理解世界。除此之外，人类在之前的知识基础上增加了一个创造性的组成部分，这一点仍有待于基于人工智能的模型来证明。人工智能的这种创造力将伴随着可以外推而不是插值的模型而来。对我们来说，基于人工智能的模型应该被建模，以理解我们在第三章中引入的音乐原理。这将允许对音乐生成系统进行调节，并更好地对长期时间-频率依赖性进行建模。从我们在第四节中描述的领域知识边缘的角度来看，我们看到了在符号领域是如何做了很多工作的。然而，由于对语音技术的研究，新的研究似乎更多地集中在音频领域。关注我们在第五节中描述的用于训练模型的数据，还需要创建更多具有高质量注释的数据集，例如情绪、高级结构、和声或任何其他音乐原理，这些注释可以用于改进当前数据集。测量数据集的偏差也很重要，因为大多数研究都集中在模型上。第六节中描述的模型架构一直是该领域研究的重点，尽管我们需要新的模型，但未来的研究可以集中在开发可以以音乐原理为条件的模型上。目前正在使用的大型 DL 模型的替代方案是将符号 AI 与这些模型相结合，因为音乐理论包含可以预定义的定义，因此模型不需要学习，而是将它们结合起来。如果不是因为我们在第七节中暴露的用户和机器之间的交互，调节就不会是音乐创作过程的关键部分。如果我们将其与专门用于模型设计的努力进行比较，则该领域缺乏对 HCI 的研究，因为到目前为止，人工智能在音乐生成方面还没有很有希望的结果。未来对接口的长期研究可能是使用脑机接口来创造艺术。在音乐生成的生成模型的评估方面也很少有研究，音乐生成是作曲工作流程中非常重要的一部分。当涉及到“调试”生成的音乐序列时，音乐的质量是一个错误的术语。我们在本文中描述的每个智能体中都可能存在偏差，这对我们在训练模型之前和之后进行分析很重要。我们在第八节中介绍了主观和客观分析生成音乐的常见指标和方法，在这方面取得了重要进展，但仍然没有一种可推广的方法来在每个代理级别和更普遍的角度评估这些系统。",[13,26745,26746],{},"总之，音乐生成领域正在发展，正如我们在第九节中介绍的那样，仍有一些应用和未来的研究领域可以从中受益。然而，新的模型、更好的评估系统和更多的用户界面可以扩展，让工业界和学术界了解该领域将探索的新途径和兴趣。",[7759,26748,26750],{"id":26749},"_11结论和今后的工作","11、结论和今后的工作",[13,26752,26753],{},"音乐生成或作曲是一个随着艺术生成新模式的出现而不断发展的研究领域。我们已经涵盖了参与音乐创作过程的代理，我们比较了人类和人工智能创作音乐的过程，并讨论了可以从这一研究领域受益的应用。我们提出了音乐生成领域需要更多研究和关注的几个领域：为实际数据集中没有代表的音乐流派创建新的数据集，不仅分析算法的偏差，还分析数据集的偏差，开发更多的用户界面，在不同层面上根据音乐原理调节模型的新研究，音乐的长期建模研究，开发更有效的编码和模型，并创建能够使研究结果具有可复制性的评估框架。在音乐的长期建模方面仍有改进的空间，这需要在模型和音乐编码设计方面付出努力。值得注意的是，尽管该领域正朝着长期建模的方向发展，但基序等短序列的生成仍然没有解决，需要更多的关注。据我们所知，目前的模型无法生成高质量的主题，至关重要的是从它们开始，然后发展和延续它们，以创建完整的短语、主题和结构化作品。",[13,26755,26756],{},"为此，尚未深入探索音乐生成的神经网络架构（如 GNN）可能是一个有趣的起点。以更有效的形式对音乐进行编码还将允许用更少的数据、更少的训练和推理时间来训练深度学习模型，更好地对音乐生成中至关重要的长期依赖性进行建模，降低成本和对环境的影响。通过条件生成也是必要的，以使工具对用户更加灵活。这取决于在音频和符号领域对音乐进行更好的分析，以便在创作音乐之前能够理解音乐，这是人类在创作音乐前所做的事情。从这方面来看，有算法或模型其他 MIR 领域可以已经与组成模型分开训练，并且可以用于调节生成模型。整合所有这些模型或创建一个既可用于分析又可用于作曲的多任务或多面手模型可能是该领域的目标，开发新的用户界面将允许用户以不同的方式和领域共同创作音乐，并扩展当前技术的能力。除此之外，从神经科学的角度理解人类大脑对于开发 NeuroAI 中的新人工智能技术至关重要，人工智能还可以反馈神经科学来帮助理解认知过程。在我们采取的任何解决方案、领域或方法中，由于每种特定音乐流派的复杂性和形式，我们都应该始终牢记我们所使用的流派或音乐风格。",{"title":119,"searchDepth":144,"depth":144,"links":26758},[26759],{"id":25521,"depth":132,"text":25522,"children":26760},[26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773],{"id":25525,"depth":144,"text":25526},{"id":25529,"depth":144,"text":25530},{"id":25558,"depth":144,"text":25559},{"id":25616,"depth":144,"text":25617},{"id":25692,"depth":144,"text":25693},{"id":25779,"depth":144,"text":25780},{"id":25845,"depth":144,"text":25846},{"id":25888,"depth":144,"text":25889},{"id":26542,"depth":144,"text":26543},{"id":26593,"depth":144,"text":26594},{"id":26693,"depth":144,"text":26694},{"id":26739,"depth":144,"text":26740},{"id":26749,"depth":144,"text":26750},{},"Paper Reading\u002F1. A Survey on Artificial Intelligence for Music Generation\u002FA Survey on Artificial Intelligence for Music Generation.md","\u002Fundergraduate\u002Fnote-1cf2987427d8",{"title":25516,"description":119},"undergraduate\u002Fnote-1cf2987427d8",[14541,9133,7744,246,6380,14542],"5PT0MIxNfo6QQCVVE_RoedO_0LWg76gwSzjTk3MsMCE",{"id":26782,"title":26783,"assetBase":239,"author":8,"body":26784,"category":29019,"collection":23324,"date":23325,"description":26791,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":29020,"navigation":128,"originalPath":29021,"path":29022,"seo":29023,"source":23330,"stem":29024,"tags":29025,"weight":250,"__hash__":29026},"content\u002Fundergraduate\u002Fnote-25fe0357f525.md","计算机网络备考",{"type":10,"value":26785,"toc":28964},[26786,26789,26792,26796,26798,26802,26806,26809,26820,26825,26836,26840,26854,26858,26866,26870,26914,26918,26921,26938,26943,26947,26952,26957,26960,26962,26966,26970,26981,26985,27015,27019,27061,27065,27068,27090,27095,27112,27117,27120,27128,27133,27144,27147,27154,27160,27165,27170,27174,27196,27201,27206,27211,27215,27220,27225,27228,27232,27271,27275,27291,27296,27300,27303,27350,27355,27359,27363,27399,27403,27406,27411,27416,27420,27434,27438,27441,27444,27452,27455,27463,27467,27472,27485,27489,27528,27532,27537,27541,27599,27603,27608,27613,27617,27622,27626,27700,27704,27708,27749,27753,27758,27760,27764,27768,27774,27777,27788,27794,27804,27808,27812,27844,27848,27891,27895,27900,27904,27907,27912,27919,27924,27928,27933,27937,27942,27946,27951,27955,27960,27964,27969,27973,27980,27991,27995,28006,28010,28021,28025,28036,28040,28043,28048,28052,28147,28151,28162,28176,28179,28184,28188,28193,28197,28202,28206,28211,28215,28220,28222,28226,28232,28239,28242,28248,28254,28258,28262,28265,28271,28274,28295,28299,28304,28308,28312,28329,28333,28350,28354,28357,28363,28376,28380,28387,28393,28398,28400,28404,28407,28418,28428,28448,28459,28470,28474,28493,28498,28502,28543,28548,28552,28556,28570,28575,28588,28592,28605,28610,28617,28622,28626,28633,28637,28643,28651,28655,28658,28669,28673,28680,28691,28694,28700,28704,28707,28718,28721,28725,28728,28739,28744,28748,28753,28757,28763,28775,28780,28782,28786,28789,28800,28804,28808,28822,28826,28830,28845,28849,28853,28864,28867,28874,28884,28891,28895,28900,28904,28909,28913,28916,28924,28929,28933,28936,28939,28950,28955,28959],[4517,26787,26788],{"id":26788},"计算机网络",[13,26790,26791],{},"因为本专业不学习《通信原理》，故一些涉及到通信原理的知识点，如果老师上课并没有过分强调，以下大概率不会特别做笔记。",[107,26793,26795],{"id":26794},"第一章-概述","第一章 概述",[23289,26797],{},[107,26799,26801],{"id":26800},"第二章-物理层","第二章 物理层",[7759,26803,26805],{"id":26804},"_1传输媒体","1、传输媒体",[13,26807,26808],{},"传输媒体可分为导引型传输媒体（双绞线、同轴电缆、光纤）和非导引型传输媒体（微波通信）。【并不属于计算机网络的一部分，但是可以归纳在物理层】",[49,26810,26811,26814,26817],{},[52,26812,26813],{},"同轴电缆：早期局域网中的使用\u002F有线电视的使用",[52,26815,26816],{},"双绞线：8跟绝缘彩线绞合。绞合能抵御部分来自外界的电磁波干扰、减少相邻导线的电磁干扰。（现在的网线）",[52,26818,26819],{},"光纤：通信容量大；传输损耗小，远距离传输更加经济；抗雷电和电磁干扰性能好；无串音干扰，保密性好；体积小，重量轻。单数需要专用设备进行切割，且接口价格昂贵。",[13,26821,26822],{},[617,26823],{"alt":119,"src":26824},"img2\u002F2.1.png",[49,26826,26827,26830,26833],{},[52,26828,26829],{},"无线电波：低频（LF）和中频（MF）使用地面波（基站）进行传输；高频（HF）和甚高频（VHF）使用地球上方100~500千米的带电离子层反射传播",[52,26831,26832],{},"微波：采用轨道同步卫星进行传播（无线网络、GPS）；低轨道卫星通信系统用于构成空间高速链路。",[52,26834,26835],{},"红外线：点对点无线传播；直线；传输速率低。",[7759,26837,26839],{"id":26838},"_2物理层协议的主要任务","2、物理层协议的主要任务",[49,26841,26842,26845,26848,26851],{},[52,26843,26844],{},"机械特性：指明接口所引用接线器的形状和尺寸、引脚数目和排列、固定和锁定的装置。",[52,26846,26847],{},"电气特性：指明在接口电缆的各条线上出现的电压的范围。",[52,26849,26850],{},"功能特性：指明某条线上出现的某一电平的电压表示何种意义。",[52,26852,26853],{},"过程特性：指明对于不同功能的各种可能事件的出现顺序。",[7759,26855,26857],{"id":26856},"_3物理层的基本概念","3、物理层的基本概念",[49,26859,26860,26863],{},[52,26861,26862],{},"物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流。",[52,26864,26865],{},"物理层为数据链路层屏蔽了各种传输媒体的差异，使数据链路层只需要考虑如何完成本层的协议和服务，而不必考虑网络具体的传输媒体是什么。",[7759,26867,26869],{"id":26868},"_4传输方式","4、传输方式",[49,26871,26872,26875,26883,26894,26905,26908,26911],{},[52,26873,26874],{},"串行传输：一次只发送一个比特，只有一条线路。",[52,26876,26877,26878],{},"并行传输：一次发送n个比特，有多条线路。（传输速度是串行传播的n倍，但是成本高）\n",[49,26879,26880],{},[52,26881,26882],{},"计算机内部通信采用并行传输（CPU多核多进程），外部传输\u002F通信采用串行传播。",[52,26884,26885,26886],{},"同步传输：进行时钟同步\n",[49,26887,26888,26891],{},[52,26889,26890],{},"外同步：在收发双方之间添加一条单独的时钟信号线",[52,26892,26893],{},"内同步：发送端将时钟同步信号编码到发送数据中一起传输。",[52,26895,26896,26897],{},"异步传输：在传输字节前后加上起始标识和结束标识。\n",[49,26898,26899,26902],{},[52,26900,26901],{},"字节之间异步（字节之间的时间间隔不固定）",[52,26903,26904],{},"字节之间的每个比特仍然需要同步（各比特的持续时间相同）",[52,26906,26907],{},"单向通信（单工）：只有一个数据传输方向（广播）【一条信道】",[52,26909,26910],{},"双向交替通信（半双工）：数据双向传播，但是不能同时。（异步，对讲机）【两条信道】",[52,26912,26913],{},"双向同时通信（全双工）：双向同时通信（电话）【两条信道】",[7759,26915,26917],{"id":26916},"_5常用编码物理层主要解决传0还是传1的问题","5、常用编码（物理层主要解决传0还是传1的问题）",[13,26919,26920],{},"码元：一段调制好的基本波形，可以表示比特信息。",[49,26922,26923,26926,26929,26932,26935],{},[52,26924,26925],{},"不归零编码（NRZ）：码元在任一时刻都不为0，接收端为了对码元计数需要额外一根传输线来传输时钟信号才能保持发送方和接收方同步（同步问题）， 浪费资源故计算机网络不采用这种编码。",[52,26927,26928],{},"归零编码（RZ）：每个码元传输结束后信号都要“归零”。相当于将时钟信号用“归零”方式编码在了数据内（自同步）。带宽浪费在“归零”上，编码效率低。",[52,26930,26931],{},"曼彻斯特编码：在每个码元的中间时刻进行跳变（0变1、1变0），跳变既表示时钟又表示数据。",[52,26933,26934],{},"差分曼彻斯特编码：跳变仅表示时钟，用码元开始处电平是否变化表示数据。（同1异0）",[52,26936,26937],{},"反向不归零编码（NRZI）：在码元时间内不会出现零电平。若后一个码元时间内所持续的电平与前一个码元时间内所持续的电平不同（也称为电平反转）则表示0，若电平保持不变则表示1。",[13,26939,26940],{},[617,26941],{"alt":119,"src":26942},"img2\u002F2.2.png",[7759,26944,26946],{"id":26945},"_6信道常用准则公式","6、信道常用准则\u002F公式",[13,26948,26949],{},[617,26950],{"alt":119,"src":26951},"img2\u002F2.3.png",[13,26953,26954],{},[617,26955],{"alt":119,"src":26956},"img2\u002F2.4.png",[13,26958,26959],{},"在信道带宽一定的情况下，根据奈氏准则和香农公式，要想提高信息中的传输速率就必须采用多元制（更好的调制方法）和努力提高信道中的信噪比。",[23289,26961],{},[107,26963,26965],{"id":26964},"第三章-数据链路层","第三章 数据链路层",[7759,26967,26969],{"id":26968},"_1数据链路层概述","1、数据链路层概述",[49,26971,26972,26975,26978],{},[52,26973,26974],{},"链路（Link）：就是从一个结点到相邻结点的一段物理线路，而中间没有任何其他的交换节点。",[52,26976,26977],{},"数据链路（Data Link）：是指把实现通信协议的邮件和软件加到链路上，就构成了数据链路。",[52,26979,26980],{},"数据链路层以帧为单位传输数据。",[7759,26982,26984],{"id":26983},"_2封装成帧","2、封装成帧",[49,26986,26987,26998,27009,27012],{},[52,26988,26989,26990],{},"封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧。\n",[49,26991,26992,26995],{},[52,26993,26994],{},"帧头和帧尾中包含有重要的控制信息。",[52,26996,26997],{},"帧头和帧尾的作用之一就是帧定界。",[52,26999,27000,27001],{},"透明传输是指数据链路对上层交付的传输数据没有任何限制，就好像数据链路层不存在一样。\n",[49,27002,27003,27006],{},[52,27004,27005],{},"面向字节的物理链路使用字节填充（或称字符填充）的方法实现透明传输。",[52,27007,27008],{},"面向比特的物理链路使用比特填充的方法实现透明传输。",[52,27010,27011],{},"为了提高帧的传输效率，应当使帧的数据部分的长度尽可能大些。",[52,27013,27014],{},"考虑到差错控制等多种因素，每一种数据链路层协议都规定了帧的数据部分的长度上限，即最大传送单元MTU（Maximum Transfer Unit）。",[7759,27016,27018],{"id":27017},"_3差错检测","3、差错检测",[49,27020,27021,27024,27027,27030,27041,27052,27055,27058],{},[52,27022,27023],{},"比特差错：实际的通信链路都不是理想的，比特在传输过程中可能会产生差错：1可能变成0，0也可能变成1。",[52,27025,27026],{},"误码率BER（Bit Error Rate）：在一段时间内，传输错误的比特占所传输比特总数的比率。",[52,27028,27029],{},"使用差错检测码来检测数据在传输过程中是否产生了比特差错，是数据链路层所要解决的重要问题之一。",[52,27031,27032,27033],{},"奇偶校验：在待发送的数据后面添加1位奇偶校验位，使整个数据（包括所添加的校验位在内）中“1”的个数位技术（奇检验）或偶数（偶校验）。",[49,27034,27035,27038],{},[52,27036,27037],{},"如果有奇数个位发生误码，则奇偶性发生变化，可以检查出误码；",[52,27039,27040],{},"如果有偶数个位发生误码，则奇偶性不发生变化，不能检查出误码。",[52,27042,27043,27044],{},"循环冗余校验CRC（Cyclic Redundancy Check）：收发双方约定好一个生成多项式G(x)；发送方基于待发送的数据和生成多项式计算出差错检测码（冗余码），将其添加到待传输数据的后面一起传输；接收方通过生成多项式来计算收到的数据是否产生了误码。",[49,27045,27046,27049],{},[52,27047,27048],{},"检错码只能检测出帧在传输过程中出现了差错，但并不能定位错误，因此无法纠正错误。",[52,27050,27051],{},"CRC有很好的检错能力（漏检率非常低），虽然计算比较复杂，但非常易于用硬件实现，因此广泛应用于数据链路层。",[52,27053,27054],{},"要想纠正传输中的差错，可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大，在计算机网络中较少使用。",[52,27056,27057],{},"在计算机网络中通常采用检错重传方式来纠正传输中的差错（可靠传输服务【不局限于数据链路层】），或者仅仅是丢弃检测到差错的帧（不可靠传输服务）。",[52,27059,27060],{},"比特差错只是传输差错中的一种，传输差错还包括分组丢失、分组失序以及分组重复（其他传输差错一般不出现在数据链路层，而在其上层）。",[7759,27062,27064],{"id":27063},"_4可靠传输协议的实现","4、可靠传输协议的实现：",[13,27066,27067],{},"（1）停止等待协议SW（Stop-and-Wait）：",[49,27069,27070,27073,27076,27079],{},[52,27071,27072],{},"接收端检测到数据分组有误码时，将其丢弃并等待发送方的超时重传。（对于误码率较高的点对点链路，为使发送方尽早重传，也可给发送方发送NAK分组。）",[52,27074,27075],{},"为了让接收方能后判断所收到的数据分组是否重复，需要给数据分组编号。（由于停等协议的停等特性，只需一个编号表示0\u002F1）",[52,27077,27078],{},"为了让发送方能够判断所收到的ACK分组是否时重复的，需要给ACK分组编号，所用比特数量与数据分组所用比特数量一样。（数据链路层一般不会出现ACK分组迟到的情况，因此在数据链路层使用停等协议可以不用给ACK分组编号。）",[52,27080,27081,27082],{},"超时计时器设置的重传时间应仔细选择。一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。\n",[49,27083,27084,27087],{},[52,27085,27086],{},"数据链路层点对点的往返时间比较确定，重传时间比较好设定。",[52,27088,27089],{},"运输层由于端到端的往返世纪那非常不确定，设置合适的重传时间有时并不容易。",[13,27091,27092],{},[617,27093],{"alt":119,"src":27094},"img2\u002F3.1.png",[49,27096,27097],{},[52,27098,27099,27100],{},"停等协议信道利用率低。\n",[49,27101,27102,27109],{},[52,27103,27104,27105,27108],{},"当往返时延RTT远大于数据帧发送时延T",[25921,27106,27107],{},"D","时（例如使用卫星链路），信道利用率非常低；",[52,27110,27111],{},"若出现重传，则对于传送有用的数据信息来说，信道利用率还要降低。",[13,27113,27114],{},[617,27115],{"alt":119,"src":27116},"img2\u002F3.2.png",[13,27118,27119],{},"（2）回退N帧协议GBN（Go-Back_N）：",[49,27121,27122,27125],{},[52,27123,27124],{},"累计确认：接收方不一定要对收到的数据分组逐个发送确认，而是可以在收到几个数据分组后，对按序到达的最后一个数据分组发送确认。ACKn表示序号为n及以前的所有数据分组都已正确接收。",[52,27126,27127],{},"发送窗口的尺寸不能超过其上线，否则接收方无法分辨新、旧数据分组，导致重复接收。",[13,27129,27130],{},[617,27131],{"alt":119,"src":27132},"img2\u002F3.3.png",[49,27134,27135,27138,27141],{},[52,27136,27137],{},"回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量，是一种连续ARQ协议。",[52,27139,27140],{},"在协议工作过程中发送窗口和接收窗口不断向前滑动，因此这类协议又称为滑动窗口协议。",[52,27142,27143],{},"当通信线路质量不好时，信道利用率并不比停止-等待协议高。",[13,27145,27146],{},"（3）选择重传协议SR（Selective Request）",[13,27148,27149,27150,27153],{},"回退N帧协议的接收窗口尺寸W",[25921,27151,27152],{},"R","只能等于1，因此接受方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃（尽管无乱序和误码），这造成发送方对这些数据分组的超时重传是对通信资源的极大浪费。",[13,27155,27156,27157,27159],{},"选择重传协议：接收窗口尺寸W",[25921,27158,27152],{},"不再等于1（而应大于1），接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组，等到所缺分组收齐后再一并送交上层。",[49,27161,27162],{},[52,27163,27164],{},"为了使发送方仅重传出现差错的分组，接收方不能再采用累计确认，而需要对每个正确接收到的数据分组进行逐一确认。",[13,27166,27167],{},[617,27168],{"alt":119,"src":27169},"img2\u002F3.4.png",[7759,27171,27173],{"id":27172},"_5点对点协议ppppoint-to-point-protocol","5、点对点协议PPP（Point-to-Point Protocol）",[49,27175,27176,27179,27193],{},[52,27177,27178],{},"PPP协议是目前使用最广泛的点对点数据链路层协议。",[52,27180,27181,27182],{},"PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法。\n",[49,27183,27184,27187,27190],{},[52,27185,27186],{},"对各种协议数据报的封装方法（封装成帧）",[52,27188,27189],{},"链路控制LCP（用于建立、配置以及测试数据链路的连接）",[52,27191,27192],{},"一套网络控制协议NCPs（每一个协议支持不同的网络层协议）",[52,27194,27195],{},"帧格式（目前阶段不要求掌握）：",[13,27197,27198],{},[617,27199],{"alt":119,"src":27200},"img2\u002F3.5.png",[49,27202,27203],{},[52,27204,27205],{},"工作状态：",[13,27207,27208],{},[617,27209],{"alt":119,"src":27210},"img2\u002F3.6.png",[7759,27212,27214],{"id":27213},"_6媒体接入控制","6、媒体接入控制",[49,27216,27217],{},[52,27218,27219],{},"媒体接入控制MAC（Medium Access Control）：共享信道要着重考虑如何协调多个发送和接收站点对一个共享传输媒体的占用。",[13,27221,27222],{},[617,27223],{"alt":119,"src":27224},"img2\u002F3.7.png",[13,27226,27227],{},"随着技术的发展，交换技术的成熟和成本的降低，具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线领域已完全取代了共享式局域网，但由于无线信道的广播天性，无线局域网任然使用共享媒体技术。",[10548,27229,27231],{"id":27230},"_1静态划分信道信道复用","（1）静态划分信道——信道复用",[49,27233,27234,27237,27240,27257],{},[52,27235,27236],{},"复用（Multiplexing）是通信技术中的一个重要概念。服用就是通过一条物理线路同时传输多路用户的信号。",[52,27238,27239],{},"当网络中传输媒体的传输容量大于多条单一信道传输的总通信量时，可利用复用技术在一条物理线路上建立多条通信信道来充分利用传输媒体的带宽。",[52,27241,27242,27243],{},"常见的复用技术：\n",[49,27244,27245,27248,27251,27254],{},[52,27246,27247],{},"频分复用FDM：所有用户同时占用不同的频带资源进行通信。",[52,27249,27250],{},"时分复用TDM：所有用户在不同的时间占用同样的频带宽度。",[52,27252,27253],{},"波分复用WDM",[52,27255,27256],{},"码分复用CDM：另一种共享信道的方法。更常用的名词是码分多址CDMA（Code Division Multiple Access）；每一个用户可以在同样的时间使用同样的频带进行通信；使用经过特殊挑选的不同码型，抗干扰能力强（早期多用于军事通信，现在价格便宜，已广泛应用 ）",[52,27258,27259,27260],{},"复用与多址：\n",[49,27261,27262,27265,27268],{},[52,27263,27264],{},"复用是将单一媒体上的频带资源划分成很多子信道，这些子信道之间相互独立，互不干扰。从媒体的整体频带资源上看，每个子信道只占用该媒体频带资源的一部分。",[52,27266,27267],{},"多址（多点接入）处理的是动态分配信道给用户。用户仅暂时性占用信道，移动通信系统基本属于这种情况。（无线广播\u002F电视广播是信道永久分配，不需要多址）",[52,27269,27270],{},"这里并不严格区分复用和多址的概念（目前：复用 == 多址）",[10548,27272,27274],{"id":27273},"_2动态接入控制随机接入csmacd协议","（2）动态接入控制——随机接入——CSMA\u002FCD协议",[49,27276,27277],{},[52,27278,27279,27280],{},"工作原理：\n",[49,27281,27282,27285,27288],{},[52,27283,27284],{},"多址接入MA：多个主机连接在一条总线上，竞争使用总线。",[52,27286,27287],{},"载波监听CS：发送帧前先检测总线，若总线空闲96比特时间，则立即发送；若总线忙，则持续检测总线空闲96比特时间后再重新发送。",[52,27289,27290],{},"碰撞检测CD：边发送边检测碰撞。若检测到碰撞，则立即停止发送，退避一段时间后再重新发送。",[13,27292,27293],{},[617,27294],{"alt":119,"src":27295},"img2\u002F3.8.png",[10548,27297,27299],{"id":27298},"_3动态接入控制随机接入csmaca协议","（3）动态接入控制——随机接入——CSMA\u002FCA协议",[13,27301,27302],{},"载波监听多址接入\u002F碰撞避免 Carrier Sense Multiple Access\u002FCollision Avoidance",[49,27304,27305,27311,27327,27330,27333],{},[52,27306,27307,27310],{},[22,27308,27309],{},"在无线局域网中，任然可以使用载波监听多址接入CSMA","，在发送帧之前先对传输媒体进行载波监听。若发现有其他站在发送帧，就推迟发送以免发生碰撞。",[52,27312,27313,27316],{},[22,27314,27315],{},"在无线局域网中，不能使用碰撞检测CD。",[49,27317,27318,27324],{},[52,27319,27320,27321,67],{},"由于无线信道的传输条件特殊，其信号强度的动态范围非常大，无线网卡上接收到的信号强度往往会远小于发送信号的强度（可能相差百万倍）。如果",[22,27322,27323],{},"在无线网卡上实现碰撞检测CD，对硬件的要求非常高",[52,27325,27326],{},"即使能够在邮件上实现无线局域网的碰撞检测功能，但由于无线电波传播的特殊性**（存在隐蔽站问题），进行碰撞检测的意义也不大**。",[52,27328,27329],{},"802.11无线局域网使用CSMA\u002FCA协议，在CSMA的基础上增加了一个碰撞避免CA功能，而不再实现碰撞检测功能。",[52,27331,27332],{},"由于不可能避免所有碰撞，并且无线信道误码率较高，802.11标准害**使用了数据链路层确认机制（停止-等待协议）**来保证数据被正确接收。",[52,27334,27335,27336],{},"802.11的MAC层标准定义了两种不同的媒体接入控制方式：\n",[49,27337,27338,27344],{},[52,27339,27340,27343],{},[22,27341,27342],{},"分布式协调功能DCF（Distributed Coordination Function）","：在DCF方式下，没有中心控制站点，每个站点使用CSMA\u002FCA协议通过争用信道来获取发送权，这是802.11定义的默认方式。",[52,27345,27346,27349],{},[22,27347,27348],{},"点协调功能PCF（Point Coordination Function）","：PCF方式使用集中控制的接入算法（一般在接入点AP实现集中控制），是802.11定义的可选方式，在实际中较少使用。",[13,27351,27352],{},[617,27353],{"alt":119,"src":27354},"img2\u002F3.9.png",[7759,27356,27358],{"id":27357},"_7mac地址media-access-control","7、MAC地址（Media Access Control）",[10548,27360,27362],{"id":27361},"_1简述","（1）简述",[49,27364,27365,27368,27393],{},[52,27366,27367],{},"当多个主机连接在同一个广播信道上，要想实现两个主机之间的通信，则每个主机都必须有一个唯一的标识，即一个数据链路层地址；",[52,27369,27370,27371,27374,27375,11315,27378],{},"在每个主机发送的",[22,27372,27373],{},"帧中必须携带标识发送主机和接受主机的地址","。由于这类地址是用于媒体接入控制MAC，因此这类地址被称为",[22,27376,27377],{},"MAC地址",[49,27379,27380,27387],{},[52,27381,27382,27383,27386],{},"MAC地址一般被固化在网卡（网络适配器）的电可擦可编程只读存储器EEPROM中，因此MAC地址也被成为",[22,27384,27385],{},"硬件地址","；",[52,27388,27389,27390],{},"MAC地址有时也被称为",[22,27391,27392],{},"物理地址。（这并不意味着MAC地址属于网络体系结构中的物理层）",[52,27394,27395,27396],{},"一般情况下，用户主机会包含两个网络适配器：有线局域网适配器（有线网卡）和无线局域网（无线网卡）。每个网络适配器都有一个全球唯一的MAC地址。而交换机和路由器往往拥有更多的网络接口，所以会拥有更多的MAC地址。综上所述，",[22,27397,27398],{},"严格来说，MAC地址是对网络上各接口的唯一标识，而不是对网络上各设备的唯一标识。",[10548,27400,27402],{"id":27401},"_2ieee-802局域网的mac地址格式","（2）IEEE 802局域网的MAC地址格式",[13,27404,27405],{},"扩展的唯一标识符EUI（EUI-48）",[13,27407,27408],{},[617,27409],{"alt":119,"src":27410},"img2\u002F3.10.png",[13,27412,27413],{},[617,27414],{"alt":119,"src":27415},"img2\u002F3.11.png",[10548,27417,27419],{"id":27418},"_3发送顺序","（3）发送顺序",[49,27421,27422,27425],{},[52,27423,27424],{},"字节发送顺序：第一字节——》第六字节",[52,27426,27427,27428,27430,27431],{},"字节内比特发送顺序：b",[25921,27429,2949],{},"——b",[25921,27432,27433],{},"7",[7759,27435,27437],{"id":27436},"_8ip地址属于网络层","8、IP地址（属于网络层）",[10548,27439,27362],{"id":27440},"_1简述-1",[13,27442,27443],{},"IP地址是因特网（Internet）上主机和路由器所使用的地址，用于标识两部分信息：",[49,27445,27446,27449],{},[52,27447,27448],{},"网络编号：标识因特网上数以百万计的网络",[52,27450,27451],{},"主机编号：标识同一网络上不同主机（或路由器各接口）",[13,27453,27454],{},"MAC地址不具备区分不同网络的功能。",[49,27456,27457,27460],{},[52,27458,27459],{},"如果只是一个单独的网络，不接入因特网，可以只使用MAC地址",[52,27461,27462],{},"如果主机所在的网络要接入因特网，则IP地址和MAC地址都需要使用",[10548,27464,27466],{"id":27465},"_2数据包转发过程中ip地址与mac地址的变化情况","（2）数据包转发过程中IP地址与MAC地址的变化情况",[13,27468,27469],{},[617,27470],{"alt":119,"src":27471},"img2\u002F3.12.png",[49,27473,27474,27480],{},[52,27475,27476,27477],{},"数据包转发过程中",[22,27478,27479],{},"源IP地址和目的IP地址保持不变",[52,27481,27476,27482],{},[22,27483,27484],{},"源MAC地址和目的MAC地址逐个链路（或逐个网络）改变",[7759,27486,27488],{"id":27487},"_9地址解析协议arp协议","9、地址解析协议ARP协议",[49,27490,27491,27501,27508,27511,27516,27522],{},[52,27492,27493,27494,27497,27498],{},"源主机在自己的",[22,27495,27496],{},"ARP高速缓存表","中查找目的主机的IP地址所对应的MAC地址，若找到了，则可以封装MAC帧进行发送；若找不到，则发送",[22,27499,27500],{},"ARP请求（封装在广播MAC帧中）",[52,27502,27503,27504,27507],{},"目的主机收到ARP请求后，将源主机的IP地址与MAC地址记录到自己的ARP高速缓存表中，然后给源主机发送",[22,27505,27506],{},"ARP响应（封装在单播MAC帧中）","，ARP响应中包含有目的主机的IP地址和MAC地址",[52,27509,27510],{},"源主机收到ARP响应后，将目的主机的IP地址与MAC地址记录到自己的ARP高速缓存表中，然后就可以封装之前想发送的MAC帧并发送给目的主机",[52,27512,27513],{},[22,27514,27515],{},"ARP的作用范围：逐段链路或逐个网络使用",[52,27517,27518,27521],{},[22,27519,27520],{},"除ARP请求和响应外，ARP还有其它类型的报文","（例如用于检查IP地址冲突的“无故ARP、免费ARP（Gratuitous ARP）”）",[52,27523,27524,27525],{},"ARP没有安全验证机制，",[22,27526,27527],{},"存在ARP欺骗（攻击）问题",[7759,27529,27531],{"id":27530},"_10集线器与交换机的区别","10、集线器与交换机的区别",[13,27533,27534],{},[617,27535],{"alt":119,"src":27536},"img2\u002F3.13.png",[10548,27538,27540],{"id":27539},"_1以太网交换机","（1）以太网交换机",[49,27542,27543,27553,27563,27566,27577,27583],{},[52,27544,27545,27546,27549,27550],{},"以太网交换机通常都有",[22,27547,27548],{},"多个接口","。每个接口都可以直接与一台主机或另一个以太网交换机相连。一般都工作在",[22,27551,27552],{},"全双工方式",[52,27554,27555,27556,27559,27560],{},"以太网交换机具有并行性，能",[22,27557,27558],{},"同时连通多对接口","，使多对主机能同时通信，",[22,27561,27562],{},"无碰撞（不使用CSMA\u002FCD协议）",[52,27564,27565],{},"以太网交换机一般都具有多种速率的接口，例如：10Mb\u002Fs、100Mb\u002Fs、1Gb\u002Fs、10Gb\u002Fs接口的多种组合。",[52,27567,27568,27569,27572,27573,27576],{},"以太网交换机",[22,27570,27571],{},"工作在数据链路层（也包括物理层","），它收到帧后，在帧交换表中查找",[22,27574,27575],{},"帧的目的MAC地址所对应的接口号","，然后通过该接口转发帧。",[52,27578,27579,27580,67],{},"以太网交换机是一种即插即用设备，其内部的",[22,27581,27582],{},"帧交换表是通过子学习算法自动地逐渐建立起来的",[52,27584,27585,27586],{},"帧的两种转发方式",[49,27587,27588,27593],{},[52,27589,27590],{},[22,27591,27592],{},"存储转发",[52,27594,27595,27598],{},[22,27596,27597],{},"直通交换","：采用基于硬件的交叉矩阵（交换时延非常小，但不检查帧是否有差错）",[10548,27600,27602],{"id":27601},"_2对比集线器和交换机","（2）对比集线器和交换机",[13,27604,27605],{},[617,27606],{"alt":119,"src":27607},"img2\u002F3.14.png",[13,27609,27610],{},[22,27611,27612],{},"（集线器已逐步被市场淘汰）",[10548,27614,27616],{"id":27615},"_3以太网交换机自学习和转发帧的流程","（3）以太网交换机自学习和转发帧的流程",[13,27618,27619],{},[617,27620],{"alt":119,"src":27621},"img2\u002F3.15.png",[10548,27623,27625],{"id":27624},"_4以太网交换机的生成树协议stpspanning-tree-protocol","（4）以太网交换机的生成树协议STP（Spanning Tree Protocol）",[49,27627,27628,27665],{},[52,27629,27630,27631],{},"如何提高以太网的可靠性？",[49,27632,27633,27643],{},[52,27634,27635,27636,27639,27640,67],{},"添加",[22,27637,27638],{},"冗余链路","可以提高以太网的可靠性，但是，冗余链路也会带来负面效应——形成",[22,27641,27642],{},"网络环路",[52,27644,27645,27646],{},"网络环路将带来以下问题：\n",[49,27647,27648,27654,27660],{},[52,27649,27650,27653],{},[22,27651,27652],{},"广播风暴","：大量消耗网络资源，使得网络无法正常转发其他数据帧",[52,27655,27656,27659],{},[22,27657,27658],{},"主机收到重复的广播帧","：大量消耗主机资源",[52,27661,27662],{},[22,27663,27664],{},"交换机的帧交换表震荡（漂移）",[52,27666,27667,27668,27671,27672,67,27675],{},"以太网交换机使用",[22,27669,27670],{},"生成树协议STP","，可以在增加冗余链路来提高网络可靠性的同时又",[22,27673,27674],{},"避免网络环路带来的各种问题",[49,27676,27677,27684,27690],{},[52,27678,27679,27680,27683],{},"无论交换机之间采用怎样的物理连接，交换机都能够",[22,27681,27682],{},"自动计算并构建一个逻辑上没有环路的网络","，其逻辑拓扑结构必须是树型的（无逻辑环路）",[52,27685,27686,27687],{},"最终生成的树型逻辑拓扑要",[22,27688,27689],{},"确保联通整个网络",[52,27691,27692,27693,27696,27697],{},"当首次连接交换机或网络",[22,27694,27695],{},"物理拓扑发生变化","时（有可能是人为改变或故障），交换机都将进行",[22,27698,27699],{},"生成树的重新计算",[7759,27701,27703],{"id":27702},"_11虚拟局域网vlan","11、虚拟局域网VLAN",[10548,27705,27707],{"id":27706},"_1概述","（1）概述",[49,27709,27710,27716,27719,27735],{},[52,27711,27712,27713],{},"使用一个或多个以太网交换机互连起来的交换式以太网，其所有站点都属于",[22,27714,27715],{},"同一个广播域",[52,27717,27718],{},"随着交换式以太网规模的扩大，广播域相应扩大",[52,27720,27721,27722,819,27725],{},"巨大的广播域会带来很多",[22,27723,27724],{},"弊端",[49,27726,27727,27729,27732],{},[52,27728,27652],{},[52,27730,27731],{},"难以管理和维护",[52,27733,27734],{},"潜在的安全问题",[52,27736,27737,27738],{},"分割广播域的方法",[49,27739,27740,27743],{},[52,27741,27742],{},"使用路由器可以隔离广播域（成本较高）",[52,27744,27745,27746,67],{},"虚拟局域网VLAN（Virtual Local Area Network）是一种将局域网内的",[22,27747,27748],{},"设备划分成与物理位置无关的逻辑组的技术，这些逻辑组具有共同的需求",[10548,27750,27752],{"id":27751},"_2虚拟局域网vlan的实现机制考研用","（2）虚拟局域网VLAN的实现机制（考研用）",[13,27754,27755],{},[617,27756],{"alt":119,"src":27757},"img2\u002F3.16.png",[23289,27759],{},[107,27761,27763],{"id":27762},"第四章-网络层","第四章 网络层",[7759,27765,27767],{"id":27766},"_1概述-1","1、概述",[13,27769,27770,27771],{},"网络层的主要任务是",[22,27772,27773],{},"实现网络互连，进而实现数据包在各网络之间的传输。",[13,27775,27776],{},"要实现网络层的任务，需要解决以下问题：",[49,27778,27779,27782,27785],{},[52,27780,27781],{},"网络层向运输层提供怎样的服务（“可靠传输”还是“不可靠传输”）",[52,27783,27784],{},"网络寻址问题",[52,27786,27787],{},"路由选择问题",[13,27789,27790,27791,67],{},"因特网（Internet）是目前全世界用户数量最多的互联网，它",[22,27792,27793],{},"使用TCP\u002FIP协议栈",[13,27795,27796,27797,27800,27801,67],{},"由于TCP\u002FIP协议栈的网络层使用",[22,27798,27799],{},"网际协议IP","，它是整个协议栈的核心协议，因此在TCP\u002FIP协议栈中网络层常称为",[22,27802,27803],{},"网际层",[7759,27805,27807],{"id":27806},"_2网络层提供的两种服务","2、网络层提供的两种服务",[10548,27809,27811],{"id":27810},"_1面向连接的虚电路服务","（1）面向连接的虚电路服务",[49,27813,27814,27819,27826,27832,27839],{},[52,27815,27816],{},[22,27817,27818],{},"可靠通信由网络来保证",[52,27820,27821,27822,27825],{},"必须建立",[22,27823,27824],{},"网络层的连接——虚电路VC","（Virtual Circuit）",[52,27827,27828,27829],{},"通信双方",[22,27830,27831],{},"沿着已建立的虚电路发送分组",[52,27833,27834,27835,27838],{},"目的主机的地址仅在连接建立阶段使用，之后每个",[22,27836,27837],{},"分组的首部只需携带一条虚电路的编号","（构成虚电路的每一段链路都有一个虚电路编号）。这种通信方式如果再使用可靠传输的网络协议，就可使所发送的分组最终正确到达接收方（无差错按序到达、不丢失、不重复）",[52,27840,27841],{},[22,27842,27843],{},"通信结束后，需要释放之前所建立的虚电路",[10548,27845,27847],{"id":27846},"_2无连接的数据包服务","（2）无连接的数据包服务",[49,27849,27850,27855,27860,27865,27871,27877,27884],{},[52,27851,27852],{},[22,27853,27854],{},"可靠通信应当由用户主机来保证",[52,27856,27857],{},[22,27858,27859],{},"不需要建立网络层连接",[52,27861,27862],{},[22,27863,27864],{},"每个分组可走不同的路径",[52,27866,27867,27868],{},"每个分组的",[22,27869,27870],{},"首部必须携带目的主机的完整地址",[52,27872,27873,27874],{},"这种通信方式所传送的",[22,27875,27876],{},"分组可能误码、丢失、重复和失序",[52,27878,27879,27880,27883],{},"由于",[22,27881,27882],{},"网络本身不提供端到端的可靠传输服务","，这使得网络中的路由器可以做得比较简单，而且价格低廉（与电信网的交换机相比较）",[52,27885,27886,27887,27890],{},"因特网采用了这种设计思想，也就是将",[22,27888,27889],{},"复杂的网络处理功能置于因特网的边缘（用户主机和其内部的运输层）","，而将相对简单的尽最大女里的分组交付功能置于因特网核心",[10548,27892,27894],{"id":27893},"_2两种服务的比较","（2）两种服务的比较",[13,27896,27897],{},[617,27898],{"alt":119,"src":27899},"img2\u002F4.1.png",[7759,27901,27903],{"id":27902},"_3ipv4","3、IPv4",[10548,27905,27707],{"id":27906},"_1概述-2",[13,27908,27909],{},[617,27910],{"alt":119,"src":27911},"img2\u002F4.2.png",[13,27913,27914,27915,27918],{},"IPv4地址采用",[22,27916,27917],{},"点分十进制表示方法","以方便用户使用。",[13,27920,27921],{},[617,27922],{"alt":119,"src":27923},"img2\u002F4.3.png",[10548,27925,27927],{"id":27926},"_2分类编址的ipv4地址","（2）分类编址的IPv4地址",[13,27929,27930],{},[617,27931],{"alt":119,"src":27932},"img2\u002F4.4.png",[10548,27934,27936],{"id":27935},"_3划分子网的ipv4地址","（3）划分子网的IPv4地址",[13,27938,27939],{},[617,27940],{"alt":119,"src":27941},"img2\u002F4.5.png",[10548,27943,27945],{"id":27944},"_4无分类编址的ipv4地址","（4）无分类编址的IPv4地址",[13,27947,27948],{},[617,27949],{"alt":119,"src":27950},"img2\u002F4.6.png",[10548,27952,27954],{"id":27953},"_5ipv4地址的应用规划","（5）IPv4地址的应用规划",[13,27956,27957],{},[617,27958],{"alt":119,"src":27959},"img2\u002F4.7.png",[7759,27961,27963],{"id":27962},"_4ip数据报的发送和转发过程","4、IP数据报的发送和转发过程",[13,27965,27966],{},[617,27967],{"alt":119,"src":27968},"img2\u002F4.8.png",[7759,27970,27972],{"id":27971},"_5静态路由配置及其可能产生的路由环路问题","5、静态路由配置及其可能产生的路由环路问题",[10548,27974,27976,27977],{"id":27975},"_1静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表","（1）静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器",[22,27978,27979],{},"人工配置路由表",[49,27981,27982,27988],{},[52,27983,27984,27985,67],{},"这种人工配置方式简单、开销小。但",[22,27986,27987],{},"不能及时适应网络状态（流量、拓扑等）的变化",[52,27989,27990],{},"一般只在小规模网络中采用。",[10548,27992,27994],{"id":27993},"_2使用静态路由配置可能出现以下导致产生路由环路的错误","（2）使用静态路由配置可能出现以下导致产生路由环路的错误",[49,27996,27997,28000,28003],{},[52,27998,27999],{},"配置错误",[52,28001,28002],{},"聚合了不存在的网络",[52,28004,28005],{},"网络故障",[10548,28007,28009],{"id":28008},"_3路由条目类型","（3）路由条目类型",[49,28011,28012,28015,28018],{},[52,28013,28014],{},"直连网络",[52,28016,28017],{},"静态路由（人工配置）",[52,28019,28020],{},"动态路由（路由选择协议）",[10548,28022,28024],{"id":28023},"_4特殊的静态路由条目","（4）特殊的静态路由条目",[49,28026,28027,28030,28033],{},[52,28028,28029],{},"默认路由（目的网络为0.0.0.0，地址掩码为0.0.0.0）",[52,28031,28032],{},"特定主机路由（目的网络为特定主机的IP地址，地址掩码为255.255.255.255）",[52,28034,28035],{},"黑洞路由（下一跳为null0）",[7759,28037,28039],{"id":28038},"_6路由选择协议","6、路由选择协议",[10548,28041,27707],{"id":28042},"_1概述-3",[13,28044,28045],{},[617,28046],{"alt":119,"src":28047},"img2\u002F4.9.png",[10548,28049,28051],{"id":28050},"_2路由信息协议riprouting-information-protocol基本工作原理","（2）路由信息协议RIP（Routing Information Protocol）基本工作原理",[49,28053,28054,28057,28064,28088,28098,28104,28118],{},[52,28055,28056],{},"路由信息协议RIP是内部网关协议IGP中最先得到广泛使用的协议之一，其相关标准文档为RFC 1058",[52,28058,28059,28060,28063],{},"RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离，称为“",[22,28061,28062],{},"距离向量D-V（Distance-Vector）","”",[52,28065,28066,28067,28070,28071,28074],{},"RIP使用",[22,28068,28069],{},"跳数","（Hop Count）作为度量（Metric）来",[22,28072,28073],{},"衡量到达目的网络的距离",[49,28075,28076,28079,28082],{},[52,28077,28078],{},"路由器到直连网络的距离定义为1",[52,28080,28081],{},"路由器到非直连网络的距离定义为所经过的路由器数加1",[52,28083,28084,28085,67],{},"允许一条路径最多只能包含15个路由器。",[22,28086,28087],{},"“距离”等于16时相当于不可达。因此，RIP只适用于小型互联网",[52,28089,28090,28091,28094,28095],{},"RIP认为",[22,28092,28093],{},"好的路由","就是“距离短”的路由，也就是",[22,28096,28097],{},"所通过路由器数量最少的路由",[52,28099,28100,28101],{},"当到达同意目的网络有多条“距离相等”的路由时，可以进行",[22,28102,28103],{},"等价负载均衡",[52,28105,28106,28107],{},"RIP包含以下要点：\n",[49,28108,28109,28112,28115],{},[52,28110,28111],{},"和谁交换信息\t\t仅和相邻路由器交换信息",[52,28113,28114],{},"交换什么信息        自己的路由表",[52,28116,28117],{},"何时交换信息        周期性交换",[52,28119,28120,28121,28124,28125],{},"RIP存在“",[22,28122,28123],{},"坏消息传播得慢","”的问题（又称为路由环路或距离无穷计数问题，这是距离向量算法的一个故有问题。可以采取多种措施减少出现该问题的概率或减小该问题带来的危害）\n",[49,28126,28127,28133,28140],{},[52,28128,28129,28132],{},[22,28130,28131],{},"限制最大路径距离","为15（16表示不可达）",[52,28134,28135,28136,28139],{},"当路由表发生变化时就立即发送更新报文（即“",[22,28137,28138],{},"触发更新","”），而不仅是周期性发送",[52,28141,28142,28143,28146],{},"让路由器记录收到某特定路由信息的接口，而不让同一路由信息再通过此接口向反方向传送（即“",[22,28144,28145],{},"水平分割","”）",[10548,28148,28150],{"id":28149},"_3开放最短路径优先ospfopen-shortest-path-first基本工作原理","（3）开放最短路径优先OSPF（Open Shortest Path First）基本工作原理",[13,28152,28153,28154,28157,28158,28161],{},"开放最短路径优先OSPF是为了克服RIP的缺点在1989年开发出来的。“开放”表明OSPF协议不是受某一家厂商控制，而是",[22,28155,28156],{},"公开发表","的；“最短路径优先”是因为使用了Dijikstra提出的",[22,28159,28160],{},"最短路径算法","SPF。",[13,28163,28164,28165,28168,28169,28172,28173,67],{},"OSPF是",[22,28166,28167],{},"基于链路状态","的，不像RIP那样是基于距离向量的；采用SPF算法去计算路由，从算法上保证了",[22,28170,28171],{},"不会产生路由环路","。OSPF",[22,28174,28175],{},"不限制网络规模，更新效率高，收敛速度快",[13,28177,28178],{},"链路状态是指本路由器都和那些路由器相邻，以及相应链路的“代价”（cost）【“代价”用来表示费用、距离、时延、带宽，等等。这些是由网络管理人员来决定】",[13,28180,28181],{},[617,28182],{"alt":119,"src":28183},"img2\u002F4.10.png",[10548,28185,28187],{"id":28186},"_4边界网关协议bgp的基本工作原理","（4）边界网关协议BGP的基本工作原理",[13,28189,28190],{},[617,28191],{"alt":119,"src":28192},"img2\u002F4.11.png",[7759,28194,28196],{"id":28195},"_7ipv4数据报的首部格式","7、IPv4数据报的首部格式",[13,28198,28199],{},[617,28200],{"alt":119,"src":28201},"img2\u002F4.12.png",[7759,28203,28205],{"id":28204},"_8网际控制报文icmp","8、网际控制报文ICMP",[13,28207,28208],{},[617,28209],{"alt":119,"src":28210},"img2\u002F4.13.png",[7759,28212,28214],{"id":28213},"_9虚拟专用网vpn与网络地址转换nat","9、虚拟专用网VPN与网络地址转换NAT",[13,28216,28217],{},[617,28218],{"alt":119,"src":28219},"img2\u002F4.14.png",[23289,28221],{},[107,28223,28225],{"id":28224},"第五章-运输层","第五章 运输层",[13,28227,28228,28229,67],{},"物理层、数据链路层和网络层共同解决了将主机通过异构网络互联所面临的问题，实现了主机与主机之间的通信。但实际上在计算机网络中",[22,28230,28231],{},"进行通信的真正实体是位于通信两端主机中的进程",[13,28233,28234,28235,28238],{},"为",[22,28236,28237],{},"运行在不同主机上的应用进程提供直接的通信服务","是运输层的任务，运输层协议又被称为端到端协议。",[7759,28240,27767],{"id":28241},"_1概述-4",[13,28243,28244,28245,67],{},"运输层向高层用户屏蔽了下面网络核心的细节（如网络拓扑、所采用的路由选择协议等），它使应用进程看见的就好像是在",[22,28246,28247],{},"两个运输层实体之间有一条端到端的逻辑通信信道",[13,28249,28250,28251,67],{},"根据应用需求的不同，因特网的运输层为应用层提供了两种不同的运输协议，即",[22,28252,28253],{},"面向连接的TCP和无连接的UDP",[7759,28255,28257],{"id":28256},"_2运输层端口号复用与分用的概念","2、运输层端口号、复用与分用的概念",[10548,28259,28261],{"id":28260},"_1进程端口号","（1）进程端口号",[13,28263,28264],{},"运行在计算机上的进程使用进程标识符PID来标志。因特网上的计算机并不是使用统一的操作系统，不同操作系统使用不同格式的进程标识符。",[13,28266,28267,28268,67],{},"为了使不同操作系统的计算机的应用进程之间能够进行网络通信，就必须",[22,28269,28270],{},"使用统一的方法对TCP\u002FIP体系的应用进程进行标识",[13,28272,28273],{},"TCP\u002FIP体系的运输层使用端口号来区分应用层的不同应用进程。",[49,28275,28276,28290],{},[52,28277,28278,28279],{},"端口号使用16比特表示，取值范围0~65535\n",[49,28280,28281,28284,28287],{},[52,28282,28283],{},"熟知端口号：0~1023，IANA把这些端口指派给了TCP\u002FIP体系中最重要的一些应用协议，例如：FTP|21\u002F20、HTTP|80、DNS|53",[52,28285,28286],{},"登记端口号：1024~49151，为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记，以防止重复。例如：Microsoft RDP微软远程桌面|3389",[52,28288,28289],{},"短暂端口号：49152~65535，留给客户进程选择暂时使用。当服务器进程收到用户进程的报文时，就知道用户进程所使用的动态端口号。通信结束后，这个端口号可供其他客户进程以后使用。",[52,28291,28292],{},[22,28293,28294],{},"端口号只具有本地意义，即端口号只是为了表示本计算机应用层中的各进程，在因特网中，不同计算机的相同端口号是没有联系的。",[10548,28296,28298],{"id":28297},"_2复用与分用","（2）复用与分用",[13,28300,28301],{},[617,28302],{"alt":119,"src":28303},"img2\u002F5.1.png",[7759,28305,28307],{"id":28306},"_3udp和tcp的对比","3、UDP和TCP的对比",[10548,28309,28311],{"id":28310},"_1用户数据报协议udpuser-datagram-protocol","（1）用户数据报协议UDP（User Datagram Protocol）",[49,28313,28314,28317,28320,28323,28326],{},[52,28315,28316],{},"无连接",[52,28318,28319],{},"支持一对一，一对多，多对一和多对多交互通信",[52,28321,28322],{},"对应用层交付的报文直接打包",[52,28324,28325],{},"尽最大努力交付，也就是不可靠；不使用流量控制和拥塞控制",[52,28327,28328],{},"首部开销小，仅8字节",[10548,28330,28332],{"id":28331},"_2传输控制协议tcptransmission-control-protocol","（2）传输控制协议TCP（Transmission Control Protocol）",[49,28334,28335,28338,28341,28344,28347],{},[52,28336,28337],{},"面向连接",[52,28339,28340],{},"每一条TCP连接只能有两个端点EP，只能一对一通信",[52,28342,28343],{},"面向字节流",[52,28345,28346],{},"可靠传输，使用流量控制和拥塞控制",[52,28348,28349],{},"首部最小20字节，最大60字节",[7759,28351,28353],{"id":28352},"_4tcp的流量控制","4、TCP的流量控制",[13,28355,28356],{},"一般来说，我们总是希望数据传输得更快一些。但如果发送方把数据发送的过快，接收方就可能来不及接收，这就会造成数据的丢失。",[13,28358,28359,28360,67],{},"所谓流量控制（flow control）就是",[22,28361,28362],{},"让发送方的发送速率不要太快，要让接收方来得及接收",[13,28364,28365,28366,28368,28369,28372,28373,67],{},"利用",[22,28367,11676],{},"机制可以很方便地在TCP连接上实现对发送方得流量控制。TCP接收方利用自己的",[22,28370,28371],{},"接收窗口的大小来限制发送方发送窗口的大小","。TCP发送方收到接收方的零窗口通知后，应启动持续计时器。持续",[22,28374,28375],{},"计时器超时后，向接收方发送零窗口探测报文",[7759,28377,28379],{"id":28378},"_5tcp的拥塞控制","5、TCP的拥塞控制",[13,28381,28382,28383,28386],{},"在某段时间，若",[22,28384,28385],{},"对网络中的某一资源的需求超过了该资源所能提供的可用部分，网络性能就要变坏。这种情况就叫拥塞","（congesting）。计算机中的链路容量（带宽）、交换节点中的缓存和处理机等，都属于网络资源。",[13,28388,28389,28390],{},"若",[22,28391,28392],{},"出现拥塞而不进行控制，整个网络的吞吐量将随输入负荷的增大而下降。",[13,28394,28395],{},[617,28396],{"alt":119,"src":28397},"img2\u002F5.2.png",[23289,28399],{},[10548,28401,28403],{"id":28402},"_1拥塞控制算法","（1）拥塞控制算法",[13,28405,28406],{},"假定如下条件：",[49,28408,28409,28412,28415],{},[52,28410,28411],{},"数据时单方向传送，而另一个方向只传送确认。",[52,28413,28414],{},"接收方总是有足够大的缓存空间，因而发送方发送窗口的大小由网络的拥塞程度来决定。",[52,28416,28417],{},"以最大报文段MSS的个数为讨论问题的单位，而不是以字节为单位。",[13,28419,28420,28421,28424,28425,67],{},"发送方维护一个叫做",[22,28422,28423],{},"拥塞窗口cwnd","的状态变量，其值",[22,28426,28427],{},"取决于网络的拥塞程度，并且动态变化",[49,28429,28430,28437],{},[52,28431,28432,28433,28436],{},"拥塞窗口",[22,28434,28435],{},"维护原则","：只要网络没有出现拥塞，拥塞窗口就再增大一些；但只要网络出现拥塞，拥塞窗口就减少一些。",[52,28438,28439,28440,28443,28444,28447],{},"判断出现",[22,28441,28442],{},"网络拥塞的依据","：没有按时收到应当到达的确认报文（即",[22,28445,28446],{},"发生超时重传","）",[13,28449,28450,28451,28454,28455,28458],{},"发送方将拥塞窗口作为",[22,28452,28453],{},"发送窗口swnd","，即swnd=cwnd。维护一个慢开始门限",[22,28456,28457],{},"ssthresh","状态变量：",[49,28460,28461,28464,28467],{},[52,28462,28463],{},"当cwnd \u003C ssthresh时，使用慢开始算法；",[52,28465,28466],{},"当cwnd > ssthresh时，停止使用慢开始算法而改用拥塞避免算法；",[52,28468,28469],{},"当cwnd = ssthresh时，既可使用慢开始算法，也可使用拥塞避免算法。",[10548,28471,28473],{"id":28472},"_2慢开始slow-start与拥塞避免congestion-avoidance","（2）慢开始（slow-start）与拥塞避免（congestion avoidance）",[49,28475,28476,28487,28490],{},[52,28477,28478,28479],{},"重传计时器超时，判断网络可能出现了拥塞，进行以下工作：\n",[49,28480,28481,28484],{},[52,28482,28483],{},"将ssthresh值更新为发生拥塞时cwnd值的一半",[52,28485,28486],{},"将cwnd值减少为1，并重新开始执行慢开始算法",[52,28488,28489],{},"“慢开始”是指一开始向网络注入的报文段少，并不是指拥塞窗口cwnd增长速度慢；",[52,28491,28492],{},"“拥塞避免”并非完全能够避免拥塞，而是指在拥塞避免阶段将拥塞窗口控制位按线性规律增长，使网络比较不容易出现拥塞。",[13,28494,28495],{},[617,28496],{"alt":119,"src":28497},"img2\u002F5.3.png",[10548,28499,28501],{"id":28500},"_3快重传fast-retransmit与快恢复fast-recovery","（3）快重传（fast retransmit）与快恢复（fast recovery）",[49,28503,28504,28521],{},[52,28505,28506,28507],{},"快重传就是使发送方尽快进行重传，而不是等超时计时器超时再重传。\n",[49,28508,28509,28512,28515,28518],{},[52,28510,28511],{},"要求接收方不要等待自己发送数据时才捎带确认，而是立即发送确认；",[52,28513,28514],{},"及时收到了失序的报文段也要立即发出对已收到的报文段的重复确认。",[52,28516,28517],{},"发送方一旦收到3个连续的重复确认，就将相应的报文段立即重传，而不是等该报文段的超时重传计时器超时再重传。",[52,28519,28520],{},"对于个别丢失的报文段，发送方不会出现超时重传，也就不会误认为出现了拥塞（进而降低拥塞窗口cwnd为1）。使用快重传可以使整个网络的吞吐量提高约20%。",[52,28522,28523,28524],{},"发送方一旦收到3个重复确认，就知道现在只是丢失了个别的报文段。于是不启动慢开始算法，而执行快恢复算法\n",[49,28525,28526,28529],{},[52,28527,28528],{},"发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一般；开始执行拥塞避免算法。",[52,28530,28531,28532],{},"也有的快恢复实现是是把快恢复开始时的拥塞控制cwnd值在增大一些，即等于新的ssthresh+3.\n",[49,28533,28534,28537,28540],{},[52,28535,28536],{},"既然发送方收到3个重复的确认，就表明3个数据报文段已经离开了网络；",[52,28538,28539],{},"这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中；",[52,28541,28542],{},"现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些。",[13,28544,28545],{},[617,28546],{"alt":119,"src":28547},"img2\u002F5.4.png",[7759,28549,28551],{"id":28550},"_6tcp超时重传时间的选择","6、TCP超时重传时间的选择",[10548,28553,28555],{"id":28554},"_1超时重传时间的选择","（1）超时重传时间的选择",[49,28557,28558,28561],{},[52,28559,28560],{},"不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO。",[52,28562,28563,28564,28569],{},"利用每次测量得到的RTT样本，计算加权",[22,28565,28566,28567],{},"平均往返时间RTT",[25921,28568,262],{},"（又称为平滑的往返时间）",[13,28571,28572],{},[617,28573],{"alt":119,"src":28574},"img2\u002F5.5.png",[49,28576,28577],{},[52,28578,28579,28580,28582,28583,67],{},"用这种方法得出的加权平均往返时间RTT",[25921,28581,262],{},"就比测量出的RTT值更加平滑。显然，",[22,28584,28585,28586],{},"超时重传时间RTO应略大于加权平均往返时间RTT",[25921,28587,262],{},[10548,28589,28591],{"id":28590},"_2解决超时重传时无法测准往返时间rtt","（2）解决超时重传时无法测准往返时间RTT",[13,28593,28594,28595,28601,28602,28604],{},"Karn提出了一个算法：",[22,28596,28597,28598,28600],{},"在计算加权平均往返时间RTT",[25921,28599,262],{},"时，只要报文段重传了，就不采用其往返时间RTT样本","。也就是出现重传时，不重新计算RTT",[25921,28603,262],{},"，进而超时重传时间RTO也不会重新计算。",[49,28606,28607],{},[52,28608,28609],{},"这又引起了新的问题。如果报文段的实验突然增大了很多，并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内，不会收到确认报文段。于是就重传报文段。但根据Karn算法，不考虑重传的报文段的往返时间样本。这样，超时重传时间就无法更新。这会导致报文段反复被重传。",[13,28611,28612,28613,28616],{},"因此，需要对Karn算法进行修正。",[22,28614,28615],{},"报文段每重传一次，就把超时重传时间RTO增大一些","。典型的做法是将新的RTO的值渠伟旧RTO值得2被。",[13,28618,28619],{},[617,28620],{"alt":119,"src":28621},"img2\u002F5.6.png",[7759,28623,28625],{"id":28624},"_7tcp可靠传输的实现","7、TCP可靠传输的实现",[13,28627,28628,28629,28632],{},"TCP基于",[22,28630,28631],{},"以字节为单位的滑动窗口","来实现可靠传输。",[10548,28634,28636],{"id":28635},"_1","（1）",[13,28638,28639,28640,67],{},"虽然发送方的发送窗口是根据接收方的接收窗口设置的，但在同一时刻，",[22,28641,28642],{},"发送方的发送窗口并不是和接收方的接收窗口一样大",[49,28644,28645,28648],{},[52,28646,28647],{},"网络传送窗口值需要经历一定的时间滞后，并且这个时间还是不确定的。",[52,28649,28650],{},"发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸。",[10548,28652,28654],{"id":28653},"_2","（2）",[13,28656,28657],{},"对于不按序到达的数据应如何处理，TCP并无明确规定。",[49,28659,28660,28663],{},[52,28661,28662],{},"如果接收方把不按序到达的数据一律丢弃，那么接收窗口的管理将会比较简单，但这样做对网络资源的利用不利，因为发送方会重复传送较多的数据。",[52,28664,28665,28666,67],{},"TCP通常对不按序到达的数据是先临时存放在接收窗口中，等到字节流中所缺少的字节收到后，再",[22,28667,28668],{},"按序交付上层的应用进程",[10548,28670,28672],{"id":28671},"_3","（3）",[13,28674,28675,28676,28679],{},"TCP要求接收方必须有",[22,28677,28678],{},"累计确认和捎带确认机制","，这样可以减小传输开销。接收方可以在合适的时候发送确认，也可以在自己有数据要发送时把确认信息顺便捎带上。",[49,28681,28682,28688],{},[52,28683,28684,28687],{},[22,28685,28686],{},"接收方不应过分推迟发送确认","，否则会导致发送方不必要的超时重传，这反而浪费了网络的资源。",[52,28689,28690],{},"捎带确认实际上并不经常发生，因为大多数应用程序很少同时在两个方向上发送数据。",[10548,28692,28672],{"id":28693},"_3-1",[13,28695,28696,28699],{},[22,28697,28698],{},"TCP的通信是全双工通信","。通信中的每一方都是再发送和接收报文段。因此，每一方都有自己的发送窗口和接收窗口。",[7759,28701,28703],{"id":28702},"_8tcp的运输连接管理","8、TCP的运输连接管理",[13,28705,28706],{},"TCP是面向连接的协议，它基于运输链接来传送TCP报文段；TCP运输链接的建立和释放是每一次面向连接的通信中必不可少的过程；主要有以下三个阶段：",[49,28708,28709,28712,28715],{},[52,28710,28711],{},"建立TCP连接",[52,28713,28714],{},"数据传送",[52,28716,28717],{},"释放TCP连接",[13,28719,28720],{},"TCP的运输连接管理就是使运输连接的建立和释放都能正常地进行。",[10548,28722,28724],{"id":28723},"_1tcp的连接建立","（1）TCP的连接建立",[13,28726,28727],{},"TCP连接建立需要解决一下问题：",[49,28729,28730,28733,28736],{},[52,28731,28732],{},"使TCP双方能够确知对方的存在",[52,28734,28735],{},"使TCP双方能够协商一些参数（如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等）",[52,28737,28738],{},"使TCP双方能够对运输实体资源（如缓存大小、连接表中的项目等）进行分配",[13,28740,28741],{},[617,28742],{"alt":119,"src":28743},"img2\u002F5.7.png",[10548,28745,28747],{"id":28746},"_2tcp的连接释放","（2）TCP的连接释放",[13,28749,28750],{},[617,28751],{"alt":119,"src":28752},"img2\u002F5.8.png",[7759,28754,28756],{"id":28755},"_9tcp报文段的首部格式","9、TCP报文段的首部格式",[13,28758,28759,28760,28762],{},"为了实现可靠传输，TCP采用了",[22,28761,28343],{},"的方式。但TCP在发送数据时，是从发送缓存去除一部分或全部字节并给其添加一个首部使之称为TCP报文段后进行发送。",[49,28764,28765,28772],{},[52,28766,28767,28768,28771],{},"一个TCP报文段由",[22,28769,28770],{},"首部和数据载荷","两部分构成",[52,28773,28774],{},"TCP的全部功能都体现在它首部中各字段的作用",[13,28776,28777],{},[617,28778],{"alt":119,"src":28779},"img2\u002F5.10.png",[23289,28781],{},[107,28783,28785],{"id":28784},"第六章-应用层","第六章 应用层",[13,28787,28788],{},"应用层是计算网络体系的最顶层，是设计和建立计算机网络的最终目的，也是计算机网络中发展最快的部分。",[49,28790,28791,28794,28797],{},[52,28792,28793],{},"早期基于文本的应用（电子邮件、远程登录、文件传输、新闻组）",[52,28795,28796],{},"20世纪90年代万维网WWW",[52,28798,28799],{},"当今流行的即时通信、P2P文件共享及各种音视频应用",[7759,28801,28803],{"id":28802},"_1客户服务器clientservercs","（1）客户\u002F服务器（Client\u002FServer，C\u002FS）",[10548,28805,28807],{"id":28806},"_1cs方式","1、C\u002FS方式",[49,28809,28810,28813,28816,28819],{},[52,28811,28812],{},"客户和服务器是指通信中所涉及的两个应用进程。",[52,28814,28815],{},"客户\u002F服务器方式所描述的是进程之间服务和被服务的关系。",[52,28817,28818],{},"客户是服务请求方，服务器是服务提供方。",[52,28820,28821],{},"服务器总是处于运行状态，并等待客户的服务请求。服务器具有固定端口号（例如HTTP服务器的默认端口号为80），而运行服务器的主机也具有固定的IP地址。",[10548,28823,28825],{"id":28824},"_2cs方式是因特网上传统的同时也是最成熟的方式","2、C\u002FS方式是因特网上传统的、同时也是最成熟的方式。",[10548,28827,28829],{"id":28828},"_3基于cs方式的应用服务通常是服务集中型的即应用服务集中在网络中中比客户计算机少得多的服务器计算机上","3、基于C\u002FS方式的应用服务通常是服务集中型的，即应用服务集中在网络中中比客户计算机少得多的服务器计算机上。",[49,28831,28832,28838],{},[52,28833,28834,28835,67],{},"由于一台服务器计算机要为多个客户机提供服务，在C\u002FS应用中，",[22,28836,28837],{},"常会出现服务器计算机跟不上众多客户机请求的情况",[52,28839,28840,28841,28844],{},"为此，在C\u002FS应用中，常用",[22,28842,28843],{},"计算机集群","（或服务器场）构建一个强大的虚拟服务器。",[7759,28846,28848],{"id":28847},"_2对等peer-to-peerp2p","（2）对等（Peer-to-Peer，P2P）",[10548,28850,28852],{"id":28851},"_1对等方式","1、对等方式",[13,28854,28855,28856,28859,28860,28863],{},"在P2P方式中，",[22,28857,28858],{},"没有固定的服务请求者和服务提供者","，分布在网络边缘各端系统中的应用进程是对等的，被称为",[22,28861,28862],{},"对等方。对等方相互之间直接通信","，每个对等方既是服务的请求者，优势服务的提供者。",[13,28865,28866],{},"目前，在因特网上流行的P2P应用主要包括P2P文件共享、即时通信、P2P流媒体、分布式存储等。",[13,28868,28869,28870,28873],{},"基于P2P的应用是",[22,28871,28872],{},"服务分散型","的，因为服务不是集中在少数几个服务器计算机中，而是分散在大量对等计算机中，这些计算机并不为服务提供商所有，而是为个人控制的桌面计算机和笔记本电脑，它们通常位于住宅、校园和办公室中。",[13,28875,28876,28877,28880,28881,67],{},"P2P方式最突出的特性之一就是它的",[22,28878,28879],{},"可扩展性","。因为系统每增加一个对等方，不仅增加的是服务的请求者，同时增加了服务的提供者，",[22,28882,28883],{},"系统性能不会因规模的增大而降低",[13,28885,28886,28887,28890],{},"P2P方式",[22,28888,28889],{},"具有成本上的优势","，因为它通常不需要庞大的服务器设施和服务器带宽。为了降低成本，服务提供商对于将P2P方式用于应用的兴趣越来越大。",[7759,28892,28894],{"id":28893},"_3动态主机配置协议dhcp","（3）动态主机配置协议DHCP",[13,28896,28897],{},[617,28898],{"alt":119,"src":28899},"img2\u002F6.1.png",[7759,28901,28903],{"id":28902},"_4域名系统dnsdomain-name-system","（4）域名系统DNS（Domain Name System）",[13,28905,28906],{},[617,28907],{"alt":119,"src":28908},"img2\u002F6.2.png",[7759,28910,28912],{"id":28911},"_5文件传送协议ftpfile-transfer-protocol","（5）文件传送协议FTP（File Transfer Protocol）",[13,28914,28915],{},"文件传送协议FTP是因特网上使用得最广泛得文件传送协议，文件传送：将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中，是一项基本的网络应用。",[49,28917,28918,28921],{},[52,28919,28920],{},"FTP提供交互式的访问，允许客户指明文件的类型与格式（如指明是否使用ASCII码），并允许文件具有存取权限。",[52,28922,28923],{},"FTP屏蔽了各计算机系统的细节，因而适合于在异构网络中任意计算机之间传送文件。",[13,28925,28926],{},[617,28927],{"alt":119,"src":28928},"img2\u002F6.3.png",[7759,28930,28932],{"id":28931},"_6电子邮件e-mail","（6）电子邮件（E-mail）",[13,28934,28935],{},"电子邮件系统采用客户\u002F服务器方式。",[13,28937,28938],{},"电子邮件系统的三个主要组成构件：用户代理，邮件服务器，电子邮件所需的协议。",[49,28940,28941,28944,28947],{},[52,28942,28943],{},"用户代理是用户与电子邮件系统的接口，又称为电子邮件客户端软件。",[52,28945,28946],{},"邮件服务器是电子邮件系统的基础设施。因特网上所有的ISP都有邮件服务器，其功能是发送和接收邮件，同时还要负责维护用户的邮箱。",[52,28948,28949],{},"协议包括邮件发送协议（SMTP等）和邮件读取协议（POP3，IMAP等）",[13,28951,28952],{},[617,28953],{"alt":119,"src":28954},"img2\u002F6.4.png",[7759,28956,28958],{"id":28957},"_7万维网www","（7）万维网WWW",[13,28960,28961],{},[617,28962],{"alt":119,"src":28963},"img2\u002F6.5.png",{"title":119,"searchDepth":144,"depth":144,"links":28965},[28966,28967,28975,28988,28999,29010],{"id":26794,"depth":132,"text":26795},{"id":26800,"depth":132,"text":26801,"children":28968},[28969,28970,28971,28972,28973,28974],{"id":26804,"depth":144,"text":26805},{"id":26838,"depth":144,"text":26839},{"id":26856,"depth":144,"text":26857},{"id":26868,"depth":144,"text":26869},{"id":26916,"depth":144,"text":26917},{"id":26945,"depth":144,"text":26946},{"id":26964,"depth":132,"text":26965,"children":28976},[28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987],{"id":26968,"depth":144,"text":26969},{"id":26983,"depth":144,"text":26984},{"id":27017,"depth":144,"text":27018},{"id":27063,"depth":144,"text":27064},{"id":27172,"depth":144,"text":27173},{"id":27213,"depth":144,"text":27214},{"id":27357,"depth":144,"text":27358},{"id":27436,"depth":144,"text":27437},{"id":27487,"depth":144,"text":27488},{"id":27530,"depth":144,"text":27531},{"id":27702,"depth":144,"text":27703},{"id":27762,"depth":132,"text":27763,"children":28989},[28990,28991,28992,28993,28994,28995,28996,28997,28998],{"id":27766,"depth":144,"text":27767},{"id":27806,"depth":144,"text":27807},{"id":27902,"depth":144,"text":27903},{"id":27962,"depth":144,"text":27963},{"id":27971,"depth":144,"text":27972},{"id":28038,"depth":144,"text":28039},{"id":28195,"depth":144,"text":28196},{"id":28204,"depth":144,"text":28205},{"id":28213,"depth":144,"text":28214},{"id":28224,"depth":132,"text":28225,"children":29000},[29001,29002,29003,29004,29005,29006,29007,29008,29009],{"id":28241,"depth":144,"text":27767},{"id":28256,"depth":144,"text":28257},{"id":28306,"depth":144,"text":28307},{"id":28352,"depth":144,"text":28353},{"id":28378,"depth":144,"text":28379},{"id":28550,"depth":144,"text":28551},{"id":28624,"depth":144,"text":28625},{"id":28702,"depth":144,"text":28703},{"id":28755,"depth":144,"text":28756},{"id":28784,"depth":132,"text":28785,"children":29011},[29012,29013,29014,29015,29016,29017,29018],{"id":28802,"depth":144,"text":28803},{"id":28847,"depth":144,"text":28848},{"id":28893,"depth":144,"text":28894},{"id":28902,"depth":144,"text":28903},{"id":28911,"depth":144,"text":28912},{"id":28931,"depth":144,"text":28932},{"id":28957,"depth":144,"text":28958},"我的大学",{},"我的大学\u002F大三上学期\u002F计算机网络\u002F计算机网络备考.md","\u002Fundergraduate\u002Fnote-25fe0357f525",{"title":26783,"description":26791},"undergraduate\u002Fnote-25fe0357f525",[2708],"WYqUgkzl53Pe3VCX1Q6xJWIo1fK7Hsn3sG6SM44WT-M",{"id":29028,"title":29029,"assetBase":239,"author":8,"body":29030,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":30312,"navigation":128,"originalPath":30313,"path":30314,"seo":30315,"source":23330,"stem":30316,"tags":30317,"weight":250,"__hash__":30318},"content\u002Fundergraduate\u002Fnote-2ce6cc827eee.md","数据仓库与数据挖掘（上）",{"type":10,"value":29031,"toc":30286},[29032,29035,29040,29044,29049,29053,29057,29060,29067,29074,29078,29081,29085,29088,29128,29132,29135,29138,29149,29153,29156,29160,29164,29171,29181,29200,29227,29231,29338,29341,29345,29349,29352,29393,29397,29426,29430,29435,29473,29475,29479,29483,29489,29497,29500,29503,29517,29520,29523,29534,29538,29542,29548,29565,29570,29573,29577,29582,29587,29593,29598,29604,29609,29615,29620,29624,29627,29633,29638,29644,29650,29653,29656,29659,29666,29677,29684,29688,29691,29717,29721,29724,29790,29794,29797,29814,29819,29821,29825,29829,29832,29835,29840,29844,29847,29850,29864,29868,29871,29885,29889,29892,29906,29910,29913,29917,29923,29929,29933,29939,29945,29951,29955,29961,29972,29978,29989,29993,29999,30005,30011,30015,30018,30021,30024,30027,30031,30034,30038,30041,30044,30047,30051,30054,30057,30062,30066,30069,30072,30075,30078,30082,30087,30092,30097,30102,30106,30109,30112,30116,30125,30127,30131,30135,30139,30142,30146,30149,30153,30158,30162,30167,30172,30177,30182,30187,30192,30197,30202,30206,30210,30213,30217,30220,30224,30227,30235,30239,30242,30246,30249,30252,30255,30258,30261,30272,30275],[4517,29033,29029],{"id":29034},"数据仓库与数据挖掘上",[72,29036,29037],{},[13,29038,29039],{},"本来不是很想做这个文档，因为一开始以为这个课的主体是数据仓库，而之前我在Little Tips专题中做过关于离线数仓的完整流程，所以本来不准备进行补充了，但是上到一半发现这个课的主体居然是数据挖掘。。。emmmm所以这个学期所有的课程都需要学习数据挖掘的样子。（商务智能、Spark MLlib、机器学习和这个）刚巧备考商务智能的时候发现数据挖掘的内容挺多的，所以做来做去拆拆合合，还是捣鼓成两个文档了，数据仓库的部分就在文档就在下面；数据挖掘的部分就在另外一个文档。",[107,29041,29043],{"id":29042},"第一章-数据仓库的概念和体系结构","第一章 数据仓库的概念和体系结构",[72,29045,29046],{},[13,29047,29048],{},"很多基本概念在各种小文章中都有提及，所以如果有没有涉及的点，大概率是我在其他的文章中有过介绍，或者我觉得可能这已经是常识了。供大家自行补充。",[7759,29050,29052],{"id":29051},"_1数据仓库的基本概念","1、数据仓库的基本概念",[10548,29054,29056],{"id":29055},"_1元数据metadata","（1）元数据（metadata）",[13,29058,29059],{},"元数据是数据仓库不可或缺的重要部分，它是描述数据仓库中数据的数据。它可以帮助用户方便快速地找到所需的数据；元数据是描述数据仓库中数据结构和构建方法的数据。",[13,29061,29062,29063,29066],{},"对元数据的分类按照应用场合可以分为",[22,29064,29065],{},"数据元数据和过程元数据","。数据元数据又可以称为信息系统元数据，信息系统使用元数据对数据源进行描述，以按照用户的需求检索、存取和理解元数据，数据元数据保证了数据的正常使用，它支撑着系统信息结构的演进。过程元数据又可以称为软件结构元数据，它是关于应用系统的描述信息，可以帮助用户查找、评估、存取和管理数据，系统软件结构中关于各个组件接口、功能和依赖关系的元数据保证了软件组建的灵活动态配置。",[13,29068,29069,29070,29073],{},"按照用途的不同，元数据可以分为",[22,29071,29072],{},"技术元数据和业务元数据","两类。技术元数据是关于数据仓库系统各项技术实现细节、被用于开发和管理数据仓库的数据，保证了数据仓库的正常运行。业务元数据从业务角度出发，提供了介于用户和实际系统之间的语义层描述，以辅助数据仓库用户能够“读懂”数据仓库中的数据。",[10548,29075,29077],{"id":29076},"_2数据粒度","（2）数据粒度",[13,29079,29080],{},"数据仓库所存在的不同数据综合级别，一般就称之为“粒度”。不同的粒度级别代表着不同的数据细节程度和综合程度，一般粒度越大，数据的细节程度越低，综合程度越高。",[10548,29082,29084],{"id":29083},"_3数据模型","（3）数据模型",[13,29086,29087],{},"数据模型是对现实世界的抽象表达，根据抽象程度的不同，衍生了不同层次的数据模型。",[49,29089,29090,29104,29112,29120],{},[52,29091,29092,29093],{},"和数据库数据模型的主要区别\n",[49,29094,29095,29098,29101],{},[52,29096,29097],{},"数据仓库数据模型增加了时间属性以区分不同时期的历史数据",[52,29099,29100],{},"数据仓库的数据模型不含有纯操作型数据",[52,29102,29103],{},"数据仓库的数据模型中增加了一些额外的综合数据",[52,29105,29106,29107],{},"概念数据模型\n",[49,29108,29109],{},[52,29110,29111],{},"概念数据模型是连接主观世界与客观世界的桥梁，常用的概念数据模型有星型模型、雪花模型以及星系模型三种。",[52,29113,29114,29115],{},"逻辑数据模型\n",[49,29116,29117],{},[52,29118,29119],{},"逻辑数据模型是对数据仓库中主题的逻辑实现，定义了每一个主题所有关系表之间的关系模式。",[52,29121,29122,29123],{},"物理数据模型\n",[49,29124,29125],{},[52,29126,29127],{},"物理数据模型是逻辑数据模型在数据仓库中的具体实现。",[10548,29129,29131],{"id":29130},"_4etlextracttransform-and-load","（4）ETL（extract，transform and load）",[13,29133,29134],{},"原始数据源的数据经过抽取、转换并加载到数据仓库中的数据库的过程称为ETL。",[13,29136,29137],{},"数据抽取主要包括数据提取、数据清洁、数据转换以及生成衍生数据四个主要功能。",[49,29139,29140,29143,29146],{},[52,29141,29142],{},"数据提取要完成的主要工作就是确定要导入到数据仓库的数据有哪些。",[52,29144,29145],{},"数据清洁负责检查数据源中是否存在脏数据，并按照实现给定的规则对数据进行修改。",[52,29147,29148],{},"数据转换负责将数据源中的数据转换为数据仓库统一的格式，其中包括数据格式的转换，数据模式的转换时由于数据仓库和信息系统所面向的数据操作不同，所以在数据模式上也存在不同。",[10548,29150,29152],{"id":29151},"_5数据集市","（5）数据集市",[13,29154,29155],{},"数据集市在某种程度上来讲就是一个小型的数据仓库。数据集市中的数据往往是关于少数几个主题的，它的数据量远远不如数据仓库，但数据集市所使用到的技术和数据仓库是同样的，它们都是面向分析决策型应用的。",[7759,29157,29159],{"id":29158},"_2数据仓库的特点与组成","2、数据仓库的特点与组成",[10548,29161,29163],{"id":29162},"_1数据仓库的特点","（1）数据仓库的特点",[13,29165,29166,29167,29170],{},"数据仓库的定义是",[22,29168,29169],{},"面向主题的、数据集成的、数据非易失的、数据随时间变化的","一个支持管理决策的数据集合。",[49,29172,29173],{},[52,29174,29175,29176],{},"面向主题\n",[49,29177,29178],{},[52,29179,29180],{},"数据库技术是面向应用，它为每个单独的应用程序组织数据。数据仓库中数据是面向主题来进行组织的；面向主题是建立数据仓库所必须遵守的基本原则，数据仓库中的所有数据都是围绕某一主题组织、展开的。",[72,29182,29183,29188,29191,29194,29197],{},[13,29184,29185],{},[22,29186,29187],{},"何为主题？",[13,29189,29190],{},"主题是一个比较抽象的概念，它是在较高层次上对各信息系统的数据综合、归类并进行数据分析利用的抽象，在逻辑关系上，它对应着我们进行宏观分析时所涉及的数据的一个完整、一致的描述，它能够完整、统一的描述各个分析对象所涉及的各项数据，以及数据之间的关系。",[13,29192,29193],{},"从数据组织的角度来看，主题就是一些数据集合，这些数据集合对分析对象进行了比较完整的、一致的数据描述，这种描述不仅涉及数据自身，还涉及数据与数据自身的关系。",[13,29195,29196],{},"从信息系统角度来看，注意就是在一个较高的管理层次上对各信息系统中的数据按照某一具体的管理对象进行综合、归类所形成的分析对象。",[13,29198,29199],{},"数据仓库的创建、使用都是围绕主题实现的，因此，必须了解如何按照决策分析来抽取主题，所抽取的主题应该包含哪些数据内容，以及这些数据该如何组织。每一个主题要具有明确的界限，独立的内涵。在划分主题时，需要保证在对主题进行分析时所需要的数据都可以在此主题中找到，保证主题数据的完整性。",[49,29201,29202,29210,29213],{},[52,29203,29204,29205],{},"数据集成\n",[49,29206,29207],{},[52,29208,29209],{},"需要注意一致性问题",[52,29211,29212],{},"非易失的",[52,29214,29215,29216],{},"随时间不断变化的\n",[49,29217,29218,29221,29224],{},[52,29219,29220],{},"随着时间的推移数据仓库不断增加新的数据内容",[52,29222,29223],{},"随着时间的推移数据仓库中的旧数据被不断删除",[52,29225,29226],{},"数据仓库中包含大量的综合数据，这些综合数据往往和时间有某种必然的联系，数据会随着时间的推移不断进行重新综合。",[10548,29228,29230],{"id":29229},"_2数据仓库的组成","（2）数据仓库的组成",[49,29232,29233,29247,29264],{},[52,29234,29235,29236],{},"满足日常的数据分析操作，必须满足以下几点要求",[49,29237,29238,29241,29244],{},[52,29239,29240],{},"数据仓库中的数据能够动态添加",[52,29242,29243],{},"提供对数据仓库的管理和维护功能",[52,29245,29246],{},"允许用户增加需求",[52,29248,29249,29250],{},"数据仓库系统应该具备以下功能",[49,29251,29252,29255,29258,29261],{},[52,29253,29254],{},"数据抽取与加载",[52,29256,29257],{},"数据清洗",[52,29259,29260],{},"数据备份与备存",[52,29262,29263],{},"查询导向，即将所有的查询导向适合的数据源",[52,29265,29266,29267,29286,29310],{},"数据仓库主要由三大管理器组成",[49,29268,29269],{},[52,29270,29271,29272],{},"加载管理器：负责从原始信息系统中抽取数据并对抽取的数据进行简单的转换，然后将转换后的数据加载到数据暂存区\n",[49,29273,29274,29277,29280,29283],{},[52,29275,29276],{},"自源系统数据抽取",[52,29278,29279],{},"将抽取到的数据快速加载到数据暂存区",[52,29281,29282],{},"对数据进行简单的转换",[52,29284,29285],{},"将转换后的数据加载到与数据仓库类似的数据结构中",[72,29287,29288,29293],{},[13,29289,29290],{},[22,29291,29292],{},"简单数据转换操作：",[2285,29294,29295,29298,29301,29304,29307],{},[52,29296,29297],{},"删除一些不必要的字段",[52,29299,29300],{},"对数据类型进行转换",[52,29302,29303],{},"对数据格式进行转换（例如首字母大写、删除前置空格符等）",[52,29305,29306],{},"根据需求校验字段值得有效性",[52,29308,29309],{},"检验所需字段是否有空值",[49,29311,29312,29335],{},[52,29313,29314,29315],{},"仓库管理器：负责数据的转换和管理，备存与备份数据\n",[49,29316,29317,29320,29323,29326,29329,29332],{},[52,29318,29319],{},"对数据暂存区得数据进行转换与合并，加载到数据仓库数据库",[52,29321,29322],{},"为数据仓库中的数据创建索引、视图以及分区",[52,29324,29325],{},"对数据仓库进行备份（完整备份或者添加式备份）",[52,29327,29328],{},"对超过数据存储期限的数据进行备份（转移到其他存储介质）",[52,29330,29331],{},"验证各字段之间的关系与一致性",[52,29333,29334],{},"创建新的集合信息或者更新已有集合的信息",[52,29336,29337],{},"查询管理器：管理所有的数据仓库查询请求并进行数据源引导",[13,29339,29340],{},"数据仓库中的数据由事实数据和维度数据组成；事实数据是从原始数据中经过数据清洗后得数据，它能反映过去事实的数据；维度数据是为了加速数据查询速度而创建的索引数据。",[7759,29342,29344],{"id":29343},"_3数据仓库的体系结构","3、数据仓库的体系结构",[10548,29346,29348],{"id":29347},"_1传统得数据仓库体系结构","（1）传统得数据仓库体系结构",[13,29350,29351],{},"传统数据仓库基于关系型数据库，通过数据的抽取、转换、加载后进入到数据仓库，最终为上层应用提供数据支持。",[49,29353,29354],{},[52,29355,29356,29357],{},"面临的挑战：\n",[49,29358,29359,29376,29379,29390],{},[52,29360,29361,29362],{},"架构问题\n",[49,29363,29364,29367,29370,29373],{},[52,29365,29366],{},"数据移动代价过高",[52,29368,29369],{},"无法快速适应变化",[52,29371,29372],{},"海量数据与系统处理能力之间存在鸿沟",[52,29374,29375],{},"系统开放性不够",[52,29377,29378],{},"扩展性问题",[52,29380,29381,29382],{},"数据组织方式问题\n",[49,29383,29384,29387],{},[52,29385,29386],{},"关系模型描述能力有限",[52,29388,29389],{},"关系模型得扩展性支撑能力有限",[52,29391,29392],{},"容错性问题",[10548,29394,29396],{"id":29395},"_2大数据时代的数据仓库","（2）大数据时代的数据仓库",[49,29398,29399,29402,29405,29408,29411,29414,29417,29420,29423],{},[52,29400,29401],{},"高度可扩展性",[52,29403,29404],{},"高性能",[52,29406,29407],{},"高度容错",[52,29409,29410],{},"支持异构环境",[52,29412,29413],{},"较低的分析时延",[52,29415,29416],{},"易用开放的接口",[52,29418,29419],{},"自调优",[52,29421,29422],{},"较低的成本",[52,29424,29425],{},"兼容性",[10548,29427,29429],{"id":29428},"_3体系结构主要记图","（3）体系结构（主要记图）",[13,29431,29432],{},[617,29433],{"alt":119,"src":29434},"img\u002F1.1.png",[49,29436,29437,29443,29449,29455,29461,29467],{},[52,29438,29439,29442],{},[22,29440,29441],{},"可伸缩的云计算环境","：可伸缩的云计算环境由所涉及的硬件、系统软件、网络设备以及各种存储等组成，实现的方式可以基于私有云的方式，也可以基于公有云的方式，从而实现自动化、虚拟化和标准化管理等。大数据时代的数据仓库建设在可伸缩的云计算环境之上，可以实现资源的按需分配，屏蔽掉底层硬件的差异，从而使焦点聚焦于数据仓库软件的实现上。",[52,29444,29445,29448],{},[22,29446,29447],{},"数据源层","：数据源层中的数据主要包括结构化、半结构化和非结构化数据源。结构化数据源主要指各种关系型数据库，例如DB2、Oracle、MySQL等。半结构化数据源主要是指各种包含半结构化数据（例如XML、Excel、文本和日志等）的数据源。非结构化数据源主要是指包含图像、音频、视频等非结构化数据的数据源。大数据时代数据仓库的数据源与传统的数据仓库的数据源相比，数据的类型更多，结构更加复杂。",[52,29450,29451,29454],{},[22,29452,29453],{},"数据预处理层","：数据预处理层主要完成数据的抽取、清洗、集成和变换、规约、装载等工作。数据抽取从数据源层中获取与主题相关的原始数据；数据清理主要负责去除冗余数据；数据集成负责按照主题对数据进行集成并删除一些不必要的字段；数据变换负责按照统一的表现形式(格式）对所有的数据进行规范化。大数据时代的数据预处理工作与传统的数据预处理并无本质上的差别，有的只是数据预处理方法上的不同，例如，对于字段缺失，传统的数据预处理工作更多的是使用比较固定的预处理规则来进行数据的补全，而大数据时代的数据预处理引入了大数据时代的处理方法（机器学习等)来对缺失数据进行预测，使得经过预处理后的结果更加合理准确。",[52,29456,29457,29460],{},[22,29458,29459],{},"大数据存储与管理层","：大数据存储与管理层与传统数据仓库体系结构中的数据存储与管理层的功能一致，都是存储历史数据以及管理数据仓库。不同的是大数据存储与管理所采取的存储方式以及仓库管理手段与传统数据仓库有所不同，主要是由于数据的规模大、数据类别（非结构化、半结构化、结构化）多导致关系型数据库无法应对。大数据时代的数据存储组织方式不仅仅包括传统数据仓库所采用的行存储，还包括有列存储（例如NoSQL）以及混合式存储两种方式。",[52,29462,29463,29466],{},[22,29464,29465],{},"OLAP服务器层","：传统的数据仓库体系结构中的OLAP 服务器层与大数据时代的数据仓库体系结构中的OLAP服务器层从功能上来看并没有本质区别。",[52,29468,29469,29472],{},[22,29470,29471],{},"大数据处理层","：解决传统数据仓库无法处理的大规模数据计算。大数据处理采用分布式的集群，设计适合分布式集群存储的数据存储方法并设计相应的分布式并行计算算法。大规模的分布式并行化计算算法是大数据处理和传统的数据处理之间本质的区别，大数据时代的数据仓库的OLAP服务器与传统的数据仓库的OLAP服务器的设计初衷以及思路基本是一致的，只不过由于底层的数据存储方式已经发展为了大规模分布式存储，因此，数据处理算法也需要向并行化改进。",[23289,29474],{},[107,29476,29478],{"id":29477},"第二章-数据","第二章 数据",[7759,29480,29482],{"id":29481},"_1数据的概念","1、数据的概念",[13,29484,29485,29486],{},"数据是指对客观事件进行记录并可以鉴别的符号，是信息的表现形式和载体。",[22,29487,29488],{},"数据所指代的并不仅是狭义上的数字，还可以包括符号、文字、语音、图形和视频等。",[49,29490,29491,29494],{},[52,29492,29493],{},"在计算机科学中，数据是指所有能输入到计算机中并被计算机程序处理的符号和介质的总称",[52,29495,29496],{},"数据经过加工后就成为信息",[10548,29498,29499],{"id":29499},"数据的属性",[13,29501,29502],{},"数据的属性是指数据在某方面的特征，我们根据属性的性质将属性分为四种类型：",[49,29504,29505,29508,29511,29514],{},[52,29506,29507],{},"标称：如性别(男、女)、婚姻状况(已婚、未婚)、职业(教师、医生、电工)",[52,29509,29510],{},"序数：成绩等级(优、良、中、及格、不及格)、衣服尺码(S、M、L、XL)",[52,29512,29513],{},"区间：测量单位，如温度、日历日期等",[52,29515,29516],{},"比率：如绝对温度、年龄、长度、成绩分数等",[10548,29518,29519],{"id":29519},"数据集",[13,29521,29522],{},"数据集是待处理的数据对象的集合，在数据挖掘领域，数据集有三个重要的特性：维度、稀疏性和分辨率：",[49,29524,29525,29528,29531],{},[52,29526,29527],{},"维度：指数据集中的对象具有的属性个数总和",[52,29529,29530],{},"稀疏性：指在数据集中，有意义的数据的多少",[52,29532,29533],{},"分辨率：可以在不同的分辨率下或者粒度下得到数据，而且在不同的分辨率下对象的数据也不同",[7759,29535,29537],{"id":29536},"_2数据预处理","2、数据预处理",[10548,29539,29541],{"id":29540},"_1预处理的意义","（1）预处理的意义",[13,29543,29544,29545,67],{},"数据质量问题：现实世界的数据一般是",[22,29546,29547],{},"含噪声的、不完整的、不一致的，是“肮脏的”",[49,29549,29550,29553,29556,29559,29562],{},[52,29551,29552],{},"不一致数据：缺乏统一的分类标准和编码方案。",[52,29554,29555],{},"重复数据：存在相同的记录，相同的信息存储在多个数据源中。",[52,29557,29558],{},"残缺数据：空值",[52,29560,29561],{},"噪声数据：错误值或孤立点",[52,29563,29564],{},"高维数据：存在无用属性",[13,29566,29567],{},[22,29568,29569],{},"改进数据质量，提高其后的挖掘过程的精度和性能。数据预处理是知识发现过程的重要步骤。检测数据异常、尽早调整数据，并归约待分析数据，将得到较高决策回报。",[13,29571,29572],{},"数据预处理是构建数据仓库或者进行数据挖掘的工作中占工作量最大的一个步骤。",[10548,29574,29576],{"id":29575},"_2基本方法","（2）基本方法",[13,29578,29579,29581],{},[22,29580,29257],{},"：除去噪声，纠正不一致性。",[49,29583,29584],{},[52,29585,29586],{},"填写空缺的值，平滑噪声数据，识别、删除孤立点，解决不一致性",[13,29588,29589,29592],{},[22,29590,29591],{},"数据集成","：将多种数据源合并成一致的数据存储。",[49,29594,29595],{},[52,29596,29597],{},"集成多个数据库、数据立方体或文件",[13,29599,29600,29603],{},[22,29601,29602],{},"数据变换","：即规范化，可以改进距离度量的挖掘算法的精度和有效性。",[49,29605,29606],{},[52,29607,29608],{},"规范化和聚集",[13,29610,29611,29614],{},[22,29612,29613],{},"数据归约","：通过聚集、删除冗余特性或聚类方法来压缩数据。",[49,29616,29617],{},[52,29618,29619],{},"通过一些技术（概念分层上卷等）得到数据集的压缩表示，它小得多，但可以得到相同或相近的结果",[7759,29621,29623],{"id":29622},"_3数据清洗","3、数据清洗",[13,29625,29626],{},"数据清洗(Data cleaning)，就是按照一定的规则把“脏数据”“洗掉”，即填充空缺的值，识别孤立点、消除噪声，并纠正数据中的不一致。",[13,29628,29629,29630],{},"通过对数据进行重新审查和校验的过程，",[22,29631,29632],{},"发现并纠正数据文件中可识别的错误，包括检查数据一致性，处理无效值和缺失值，删除重复信息、纠正存在的错误，并提供数据一致性等。",[13,29634,29635],{},[22,29636,29637],{},"目的是提高数据质量。",[13,29639,29640,29641,67],{},"数据清理一般是",[22,29642,29643],{},"由计算机而不是人工完成",[13,29645,29646,29647,67],{},"业界对数据清洗的认识：",[22,29648,29649],{},"数据清洗是数据仓库构建中最重要的问题",[10548,29651,29652],{"id":29652},"噪声处理之分箱方法",[13,29654,29655],{},"分箱(binning):通过考察周围的值来平滑存储数据的值，存储的值被分布到一些“桶”或箱中，实现连续数据的离散化。",[13,29657,29658],{},"箱子是按照属性值划分的子区间，如果属性处于某个子区间的范围，就把属性放进该区间代表的箱子。",[13,29660,29661,29662,29665],{},"分箱方法：",[22,29663,29664],{},"统一权重、统一区间、最小熵法、自定义区间","等。",[49,29667,29668,29671,29674],{},[52,29669,29670],{},"统一权重法（等深分箱法）：将数据集按记录行数分箱，每箱具有相同的记录数，每箱记录数称为箱子的深度。",[52,29672,29673],{},"统一区间法（等宽分箱法）：使数据集在整个属性值的区间上平均分布，即每个箱的区间范围是一个常量，称为箱子宽度。",[52,29675,29676],{},"自定义区间：如将收入划分为1000元以下、1000-2000、2000-3000、3000-4000和4000以上。",[13,29678,29679,29680,29683],{},"分箱目的是对各个箱子中的数据进行处理，完成了分箱之后，就需要采用一种方法对数据进行平滑，使得箱中的数据更接近，目前通常使用的平滑方法有",[22,29681,29682],{},"按平均值平滑、按边界值平滑和按中值平滑","。下面对上例中统一区间法分箱后的结果，分别采用三种平滑方法进行处理。",[7759,29685,29687],{"id":29686},"_4数据集成","4、数据集成",[13,29689,29690],{},"数据集成是把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中。这些数据源可以包括多个数据库、数据立方体或一般文件。数据集成可能出现的问题归结为以下几类：",[49,29692,29693,29701,29709],{},[52,29694,29695,29696],{},"模式匹配：将多个数据源中的数据整合到一个一致的存储中；",[49,29697,29698],{},[52,29699,29700],{},"模式匹配即整合不同数据源中的元数据。在模式匹配过程中涉及实体识别问题。",[52,29702,29703,29704],{},"数据值冲突：来源不同的同一个实体具有不同的数据值；",[49,29705,29706],{},[52,29707,29708],{},"不同数据源中，表示同一实体的属性值可能存在不同，可能表现在单位不统一、数值类型不统一等方面。",[52,29710,29711,29712],{},"数据冗余：冗余是指重复存在的消息，在数据挖掘领域中，也指无用的信息；",[49,29713,29714],{},[52,29715,29716],{},"冗余是指重复存在的消息，在数据挖掘领域中，也指无用的信息。一个属性（例如，年收入）如果能由另一个或另一组属性“导出”，则这个属性可能是冗余的。属性或维命名的不一致也可能导致结果数据集中的冗余。",[7759,29718,29720],{"id":29719},"_5数据变换","5、数据变换",[13,29722,29723],{},"数据变换是将数据转换成适合挖掘的形式（原始数据表并不适合直接用于数据挖掘，需变换之后才能使用），主要有：",[49,29725,29726,29737,29748,29759],{},[52,29727,29728,29731,29732],{},[22,29729,29730],{},"平滑","：除去数据中的噪声，如分箱、聚类和回归。",[49,29733,29734],{},[52,29735,29736],{},"增减少属性的取值个数，减少挖掘算法的工作量",[52,29738,29739,29742,29743],{},[22,29740,29741],{},"聚集","：对数据进行汇总和聚集。",[49,29744,29745],{},[52,29746,29747],{},"avg(), count(), sum(), min(), max()…",[52,29749,29750,29753,29754],{},[22,29751,29752],{},"数据概化","：使用概念分层，用高层概念替换低层“原始”数据。",[49,29755,29756],{},[52,29757,29758],{},"使用概念分层的方式，利用高层的概念来替换低层或原始数据。",[52,29760,29761,29764,29765],{},[22,29762,29763],{},"规范化","：将属性数据按比例缩放，使之落入一个小的特定区间。",[49,29766,29767,29776],{},[52,29768,29769,29770,1011,29773,67],{},"所用的度量单位可能影响数据分析。例如，把高度的度量单位从米变成英寸，把重量的度量单位从公斤改成磅，可能导致完全不同的结果。为了帮助避免对度量单位选择的依赖性，需要对数据进行规范化，对属性数据进行缩放，使之可以落入到一个较小的特定区域之间，如",[78,29771,29772],{},"-1，1",[78,29774,29775],{},"0，1",[52,29777,29778,29779],{},"主要的数据规范化方法：\n",[49,29780,29781,29784,29787],{},[52,29782,29783],{},"最小-最大规范化（MIN-MAX ）",[52,29785,29786],{},"零-均值规范化（z-score）",[52,29788,29789],{},"小数定标规范化",[7759,29791,29793],{"id":29792},"_6数据归约","6、数据归约",[13,29795,29796],{},"数据归约的本质就是缩小数据的范围，是指在不破坏数据完整性的前提下，获得比原始数据小得多的挖掘数据集，该数据集可以得到和原始数据集相同的挖掘结果，进而减少数据挖掘所需要的时间。常用的数据归约方法：",[49,29798,29799,29802,29805,29808,29811],{},[52,29800,29801],{},"数据立方体聚集：减少数据的维度",[52,29803,29804],{},"维归约：删除不相关、弱相关或冗余属性",[52,29806,29807],{},"数据压缩：使用正确的编码压缩数据集",[52,29809,29810],{},"数值规约：用较小的数值表示数据，或采用较短的单位，或使用模型来表示数据",[52,29812,29813],{},"离散化和概念分层产生：离散化是用确定的有限个区段值代替原始值；概念分层是指用较高层次的概念替换低层次的概念",[72,29815,29816],{},[13,29817,29818],{},"用于数据归约的时间不应当超过或“抵消”在归约后的数据上挖掘节省的时间",[23289,29820],{},[107,29822,29824],{"id":29823},"第三章-数据存储","第三章 数据存储",[7759,29826,29828],{"id":29827},"_1数据模型","1、数据模型",[13,29830,29831],{},"数据模型（Data Model）是对现实世界数据特征的抽象表达，是用来描述数据的一组概念和定义。在信息管理中需要将现实世界的事物转换为信息世界的数据才能对信息进行处理与管理，这就需要依靠数据模型作为这种转换的桥梁。",[13,29833,29834],{},"现实世界中的客观对象抽象为概念模型，然后把概念模型转化为数据仓库支持的数据模型。其转化过程如下：",[13,29836,29837],{},[617,29838],{"alt":119,"src":29839},"img\u002F3.1.png",[10548,29841,29843],{"id":29842},"_1概念模型","（1）概念模型",[13,29845,29846],{},"概念模型描述的是从客观世界到主观认识的映射，它是用于我们为一定的目标设计系统、收集信息而服务的一个概念性工具。",[13,29848,29849],{},"进行概念模型设计所要完成的工作有：",[49,29851,29852,29858],{},[52,29853,29854,29857],{},[22,29855,29856],{},"界定系统边界","，即进行任务和环境评估、需求收集和分析，了解用户迫切需要解决的问题及解决这些问题所需要的信息，要对现有数据库中的内容有一个完整而清晰的认识。",[52,29859,29860,29863],{},[22,29861,29862],{},"确定主要的主题域及其内容","，即要确定系统所包含的主题域，然后对每一个主题域的公共码键、主题域之间的联系、充分代表主题的属性组进行较为明确的描述。",[10548,29865,29867],{"id":29866},"_2逻辑模型","（2）逻辑模型",[13,29869,29870],{},"逻辑模型是对数据仓库中主题的逻辑实现，从支持决策的角度去定义数据实体，更适合大量复杂查询。通常有两种逻辑模型表示法：星型模型和雪花模型。进行逻辑模型设计所要完成的主要工作有：",[49,29872,29873,29876,29879,29882],{},[52,29874,29875],{},"分析主题域，定义逻辑模型",[52,29877,29878],{},"数据粒度的层次划分",[52,29880,29881],{},"确定数据分割策略",[52,29883,29884],{},"增加导出字段",[10548,29886,29888],{"id":29887},"_3物理模型","（3）物理模型",[13,29890,29891],{},"物理模型是逻辑模型在数据仓库中的具体实现。进行逻辑模型设计所要完成的主要工作有：",[49,29893,29894,29897,29900,29903],{},[52,29895,29896],{},"确定数据的存储结构",[52,29898,29899],{},"确定数据的索引策略",[52,29901,29902],{},"确定数据的存储策略",[52,29904,29905],{},"存储分配优化",[7759,29907,29909],{"id":29908},"_2元数据存储","2、元数据存储",[13,29911,29912],{},"元数据（Metadata）就是描述数据的数据，用于建立、管理、维护和使用数据仓库。元数据管理是企业数据仓库的关键组件，贯穿与建立数据仓库的整个过程。",[10548,29914,29916],{"id":29915},"_1按类型分类","（1）按类型分类",[13,29918,29919,29922],{},[22,29920,29921],{},"基础元数据","：基础数据是指数据仓库系统中所有的数据源、数据集市、数据仓库和应用中的数据。",[13,29924,29925,29928],{},[22,29926,29927],{},"数据处理元数据","：数据处理元数据是数据仓库系统中与数据处理过程紧密相关的元数据，它包括数据加载、清理、更新、分析和管理信息。",[10548,29930,29932],{"id":29931},"_2按抽象层次分类","（2）按抽象层次分类",[13,29934,29935,29938],{},[22,29936,29937],{},"概念元数据","：应用系统、预定义查询和分析应用相关的信息",[13,29940,29941,29944],{},[22,29942,29943],{},"逻辑元数据","：应用数学语言的描述，它从某种程度是概念元数据的更深层次的描述",[13,29946,29947,29950],{},[22,29948,29949],{},"物理元数据","：关于数据仓库实现的最底层信息，包括事务规则、SQL编码、关系索引文件和分析应用代码等",[10548,29952,29954],{"id":29953},"_3按用户角度分类","（3）按用户角度分类",[13,29956,29957,29960],{},[22,29958,29959],{},"管理元数据","：是存储关于数据仓库系统技术细节的数据，用于开发和管理数据仓库。包括：",[49,29962,29963,29966,29969],{},[52,29964,29965],{},"数据仓库结构的描述",[52,29967,29968],{},"汇总用的算法",[52,29970,29971],{},"有操作环境到数据仓库环境的映射",[13,29973,29974,29977],{},[22,29975,29976],{},"用户元数据","：从最终用户角度描述数据仓库包括：",[49,29979,29980,29983,29986],{},[52,29981,29982],{},"如何连接数据仓库",[52,29984,29985],{},"可以访问数据仓库的哪些数据",[52,29987,29988],{},"数据来自哪一个源系统",[10548,29990,29992],{"id":29991},"_4按元数据来源分类","（4）按元数据来源分类",[13,29994,29995,29998],{},[22,29996,29997],{},"工具元数据","：指由ETL（数据抽取、数据转换、数据装载）组件、数据仓库设计工具等产生的元数据",[13,30000,30001,30004],{},[22,30002,30003],{},"资源元数据","：指由操作系统、数据集市、数据库和数据字典生成的元数据",[13,30006,30007,30010],{},[22,30008,30009],{},"外部数据","：指的是从本地数据仓库系统以外的其他系统输入的元数据。如业务系统数据库中的数据。",[10548,30012,30014],{"id":30013},"_5元数据的作用","（5）元数据的作用",[13,30016,30017],{},"元数据是进行数据集成所必需的",[13,30019,30020],{},"元数据定义的语义层可以帮助最终用户理解数据仓库中的数据。",[13,30022,30023],{},"元数据是保证数据质量的关键。",[13,30025,30026],{},"元数据可以支持需求变化。",[7759,30028,30030],{"id":30029},"_3数据集市","3、数据集市",[13,30032,30033],{},"为了解决灵活性和性能之间的矛盾，数据仓库的体系结构中就增加了数据集市。",[10548,30035,30037],{"id":30036},"_1定义","（1）定义",[13,30039,30040],{},"数据集市是一种小型的部门级的数据仓库，主要面向部门级业务，并且只面向某个特定的主题，是为满足特定用户（一般是部门级别的）的需求而建立的一种分析型环境。",[13,30042,30043],{},"投资规模比较小，更关注在数据中构建复杂的业务规则来支持功能强大的分析",[13,30045,30046],{},"常称为“小数据仓库”或“部门级数据仓库”",[10548,30048,30050],{"id":30049},"_2误区","（2）误区",[13,30052,30053],{},"单纯用数据量大小来区分数据集市和数据仓库",[13,30055,30056],{},"数据集市容易建立",[13,30058,30059],{},[22,30060,30061],{},"数据集市容易升级到数据仓库",[10548,30063,30065],{"id":30064},"_3特点","（3）特点",[13,30067,30068],{},"特定用户群体所需的信息通常是一个部门或一个特定组织的用户。",[13,30070,30071],{},"支持访问非易变的业务信息。",[13,30073,30074],{},"协调组织中多个运行系统的信息。",[13,30076,30077],{},"为即席分析和预定义报表提供合理的查询响应时间。",[10548,30079,30081],{"id":30080},"_4数据集市的类型","（4）数据集市的类型",[13,30083,30084],{},[22,30085,30086],{},"从属型数据集市",[49,30088,30089],{},[52,30090,30091],{},"从属型数据集市的数据来自于企业级数据仓库，是企业级数据仓库的子集。各数据集市中数据的组织、格式和结构在整个系统中保持一致一般为那些访问数据仓库十分频繁的关键业务部门建立从属型数据集市，这样可以更好地提高查询反应速度。",[13,30093,30094],{},[22,30095,30096],{},"独立型数据集市",[49,30098,30099],{},[52,30100,30101],{},"独立型数据集市，是指它的数据直接来源于各操作数据环境，当为各个部门建立相关数据集市后，这些数据集市之间相互独立，可能具有不同的数据存储类型。",[10548,30103,30105],{"id":30104},"_5建立方式","（5）建立方式",[13,30107,30108],{},"**自上而下的方法：**从属型的数据集市采用的是自上而下的方法。首先建立企业的数据仓库，然后从企业级的数据仓库中为各个部门抽取必要的数据建立部门级的数据集市。",[13,30110,30111],{},"**自下而上的方法：**自下而上的开发方法是先从数据集市入手，就某一个特定的主题，先构建独立的数据集市，当数据集市达到一定的规模，再从各个数据集市进行数据的再次抽取建立企业级的数据仓库。",[7759,30113,30115],{"id":30114},"_4数据存储","4、数据存储",[13,30117,30118,30119,30124],{},"详见我",[5009,30120,30123],{"href":30121,"rel":30122},"https:\u002F\u002Fwww.fenrisx.icu\u002F2022\u002F11\u002F30\u002F%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%8A%80%E6%9C%AF%E5%A4%87%E8%80%83\u002F",[23647],"大数据存储技术（《深入分布式缓存：从原理到实践》）","这篇博客",[23289,30126],{},[107,30128,30130],{"id":30129},"第四章-olap与数据立方体","第四章 OLAP与数据立方体",[7759,30132,30134],{"id":30133},"_1olap","1、OLAP",[10548,30136,30138],{"id":30137},"_1基本思想","（1）基本思想",[13,30140,30141],{},"联机分析处理（OLAP），又称为多维分析处理。通过对多维信息以很多种可能的观察方式进行快速、稳定、一致和交互性的访问和存取，允许管理决策人员对数据进行深入的观察。",[10548,30143,30145],{"id":30144},"_2基本目标","（2）基本目标",[13,30147,30148],{},"满足决策支持或多维环境特定的查询和报表需求，它的技术核心是“维度”这个概念，因此OLAP也可以说是多维数据分析工具的集合。",[10548,30150,30152],{"id":30151},"_3olap与oltp对比","（3）OLAP与OLTP对比",[13,30154,30155],{},[617,30156],{"alt":119,"src":30157},"img\u002F4.1.png",[10548,30159,30161],{"id":30160},"_4特征","（4）特征",[13,30163,30164],{},[22,30165,30166],{},"快速性（fast）",[49,30168,30169],{},[52,30170,30171],{},"用户对OLAP的响应速度有着很高的要求，这正是联机分析处理“在线”特征的体现。",[13,30173,30174],{},[22,30175,30176],{},"可分析性（analysis）",[49,30178,30179],{},[52,30180,30181],{},"不同的用户会存在不同的需求、不同的分析请求，面对众多种类的分析请求，需要OLAP 系统应能处理用户的任何逻辑分析请求和统计分析请求。",[13,30183,30184],{},[22,30185,30186],{},"多维性（multidimensional）",[49,30188,30189],{},[52,30190,30191],{},"要求系统在完成多维数据分析之后，同时也能够将分析结果以多维视图的形式提供给用户。",[13,30193,30194],{},[22,30195,30196],{},"信息性（information）",[49,30198,30199],{},[52,30200,30201],{},"OLAP 应具备管理大容量信息的能力。",[7759,30203,30205],{"id":30204},"_2多维分析操作","2、多维分析操作",[10548,30207,30209],{"id":30208},"_1切片","（1）切片",[13,30211,30212],{},"在给定数据立方体的一个维上进行选择一个维度成员的操作就是切片，切片的结果是得到一个二维平面数据。",[10548,30214,30216],{"id":30215},"_2切块","（2）切块",[13,30218,30219],{},"在给定数据立方体的一个维上进行选择两个或多个维成员的操作就是切块，切块的结果得到一个子立方体。",[10548,30221,30223],{"id":30222},"_3钻取","（3）钻取",[13,30225,30226],{},"改变维的层次，变换分析的粒度。它包括向下钻取（drill-down)和向上钻取(drill-up)。",[49,30228,30229,30232],{},[52,30230,30231],{},"向上钻取：向上钻取是在某一维上将低层次的细节数据概括到高层次的汇总数据，或者减少维数。",[52,30233,30234],{},"向上钻取：向上钻取是在某一维上，它从汇总数据深入到细节数据进行观察，或者增加新维。",[10548,30236,30238],{"id":30237},"_4旋转","（4）旋转",[13,30240,30241],{},"旋转就是将维的位置进行互换。旋转操作的本质就是改变观察数据立方体的视角，通过交换行和列得到不同视角的数据。",[7759,30243,30245],{"id":30244},"_3数据立方体","3、数据立方体",[10548,30247,30248],{"id":30248},"基本概念",[13,30250,30251],{},"**方体：**在数据立方体中，它的每个维度都可能存在概念分层。从这些不同的概念层上创建出的数据立方体称为方体，实质上，一个方体就相当于一个group-by。",[13,30253,30254],{},"**基本方体：**就是在抽象程度最低的层面上建立的数据立方体。基本方体的泛化程度是最小的。",[13,30256,30257],{},"**顶点方体：**与基本方体恰恰相反，顶点方体是从抽象程度最高的层面上建立出来的，它的泛化程度也是最大的。",[13,30259,30260],{},"数据立方体中的单元所存储的值，与多维空间的数据点一一对应。它可以分为基本单元和聚集单元。",[49,30262,30263,30266,30269],{},[52,30264,30265],{},"聚集值：经过处理的数据。",[52,30267,30268],{},"基本单元：不含聚集值的单元。基本方体的单元就是基本单元。",[52,30270,30271],{},"聚集单元：非基本单元的单元是聚集单元。聚集单元在一个或多个维聚集。",[13,30273,30274],{},"为了提高OLAP的查询效率，有时要预计算整个立方体，预计算的过程称为物化。物化也称为聚集。物化分为三类：",[49,30276,30277,30280,30283],{},[52,30278,30279],{},"完全物化 : 预先计算所有方体。完全物化在响应查询时会很迅速，但是需要海量的存储空间。",[52,30281,30282],{},"不物化 : 不预先计算任何“非基本方体”。在响应查询的时候会耗费大量计算资源，而且还很缓慢。",[52,30284,30285],{},"部分物化 :选择一部分进行预先计算。部分物化很好的调和了不物化的“响应慢，存储空间小”和完全物化的“响应快，存储空间大”。可以预先计算一些用户指定的维度或者单元。",{"title":119,"searchDepth":144,"depth":144,"links":30287},[30288,30293,30301,30307],{"id":29042,"depth":132,"text":29043,"children":30289},[30290,30291,30292],{"id":29051,"depth":144,"text":29052},{"id":29158,"depth":144,"text":29159},{"id":29343,"depth":144,"text":29344},{"id":29477,"depth":132,"text":29478,"children":30294},[30295,30296,30297,30298,30299,30300],{"id":29481,"depth":144,"text":29482},{"id":29536,"depth":144,"text":29537},{"id":29622,"depth":144,"text":29623},{"id":29686,"depth":144,"text":29687},{"id":29719,"depth":144,"text":29720},{"id":29792,"depth":144,"text":29793},{"id":29823,"depth":132,"text":29824,"children":30302},[30303,30304,30305,30306],{"id":29827,"depth":144,"text":29828},{"id":29908,"depth":144,"text":29909},{"id":30029,"depth":144,"text":30030},{"id":30114,"depth":144,"text":30115},{"id":30129,"depth":132,"text":30130,"children":30308},[30309,30310,30311],{"id":30133,"depth":144,"text":30134},{"id":30204,"depth":144,"text":30205},{"id":30244,"depth":144,"text":30245},{},"我的大学\u002F大三下学期\u002F数据仓库与数据挖掘\u002F数据仓库与数据挖掘（上）.md","\u002Fundergraduate\u002Fnote-2ce6cc827eee",{"title":29029,"description":119},"undergraduate\u002Fnote-2ce6cc827eee",[14968,7744,246,23378,10715,6380],"A3pZ9KlwphN3xUls0rAuHNPonp6D8NdR_3-HhY2BkXI",{"id":30320,"title":30321,"assetBase":239,"author":8,"body":30322,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":32965,"navigation":128,"originalPath":32966,"path":32967,"seo":32968,"source":23330,"stem":32969,"tags":32970,"weight":250,"__hash__":32971},"content\u002Fundergraduate\u002Fnote-2e9f33f0e18d.md","No.1大数据",{"type":10,"value":30323,"toc":32889},[30324,30327,30339,30343,30346,30350,30354,30358,30362,30365,30369,30372,30375,30378,30382,30385,30388,30392,30395,30397,30401,30405,30409,30412,30444,30448,30451,30470,30474,30508,30512,30515,30518,30521,30524,30527,30530,30533,30536,30540,30544,30547,30551,30554,30558,30563,30565,30569,30572,30576,30579,30590,30594,30597,30608,30612,30615,30623,30626,30637,30640,30651,30655,30659,30662,30665,30669,30672,30676,30679,30682,30686,30690,30693,30697,30700,30711,30714,30718,30725,30728,30732,30735,30761,30765,30768,30771,30779,30781,30785,30789,30792,30809,30813,30816,30819,30823,30826,30860,30864,30867,30872,30960,30964,30967,30970,30973,30976,30979,30982,30985,30987,30991,30994,30997,31011,31015,31019,31022,31030,31033,31041,31045,31048,31051,31054,31119,31123,31126,31130,31133,31144,31148,31151,31154,31158,31203,31207,31210,31213,31217,31220,31231,31235,31239,31243,31247,31251,31255,31257,31261,31265,31269,31274,31278,31283,31286,31294,31298,31303,31306,31309,31313,31318,31321,31324,31327,31331,31336,31339,31342,31346,31350,31391,31395,31454,31456,31460,31463,31467,31472,31476,31479,31482,31485,31488,31492,31495,31500,31514,31518,31521,31525,31529,31532,31536,31539,31556,31559,31594,31597,31605,31608,31619,31621,31625,31628,31631,31645,31649,31653,31656,31667,31670,31681,31685,31688,31702,31706,31709,31720,31723,31727,31730,31744,31746,31750,31753,31756,31761,31764,31797,31800,31804,31854,31858,31863,31866,31868,31872,31876,31880,31883,31886,31890,31904,31908,31911,31914,31959,31963,31974,31978,31982,31990,31994,32005,32009,32017,32021,32024,32027,32030,32034,32038,32049,32053,32056,32064,32067,32071,32089,32093,32104,32106,32110,32114,32117,32120,32124,32127,32130,32133,32136,32139,32142,32145,32148,32152,32155,32158,32161,32164,32167,32171,32175,32178,32182,32185,32189,32197,32201,32271,32274,32279,32283,32294,32298,32301,32315,32318,32329,32333,32337,32354,32358,32366,32370,32375,32379,32387,32391,32395,32406,32410,32413,32416,32419,32423,32431,32433,32437,32440,32443,32446,32450,32455,32459,32462,32464,32468,32472,32476,32479,32484,32516,32521,32535,32539,32542,32546,32583,32588,32596,32600,32604,32607,32612,32620,32625,32628,32631,32635,32638,32642,32653,32657,32692,32696,32699,32703,32717,32721,32724,32727,32730,32732,32736,32739,32743,32746,32750,32764,32768,32773,32777,32794,32796,32800,32804,32808,32811,32815,32818,32822,32825,32829,32834,32838,32843,32847,32850,32854,32859,32863,32866,32870,32873,32877,32880,32884,32887],[4517,30325,30326],{"id":30326},"大数据全流程",[72,30328,30329,30333,30336],{},[13,30330,30331],{},[22,30332,23957],{},[13,30334,30335],{},"简单看完了第一遍写的前言，大数据真的是一门需要知识沉淀的巨大工程，无论你看什么类型的书，对于大数据的理解都是有帮助的。这本主要是阿里系的大数据开发全套，很浅但是很真诚（当然指的是技术面很浅，思想上已经很深入了）。截至现在，我也就体验过阿里系的DataX（开源），确实解决了不同数据源之间数据结构不同步的痛点，未来肯定依旧会做大做强，咳咳扯远了。",[13,30337,30338],{},"这绝对是一本值得N刷的书，奉之为教材也不为过，虽然对接的是阿里系的企业理念，但是对于整体开发流程的阐述十分到位，尤其是第十章、十一章关于维度设计和事实表设计，让我受益匪浅，希望你也能有所收获。——Alexie-Z-Yevich 2023.3.20",[107,30340,30342],{"id":30341},"第一章-总述","第一章 总述",[13,30344,30345],{},"IT时代是以自我控制、自我管理为主，那么到了DT(Data Technology) 时代，则是以服务大众、激发生产力为主。以互联网（或者物联网）、云计算、大数据和人工智能为代表的新技术革命正在渗透至各行各业，悄悄地改变着我们的生活。",[7759,30347,30349],{"id":30348},"_1阿里巴巴大数据系统体系架构图","1、阿里巴巴大数据系统体系架构图",[13,30351,30352],{},[617,30353],{"alt":119,"src":29434},[7759,30355,30357],{"id":30356},"_2应用四大层次","2、应用四大层次",[10548,30359,30361],{"id":30360},"_1数据采集层","（1）数据采集层",[13,30363,30364],{},"Aplus.JS是Web端日志采集技术方案；UserTrack是APP端日志采集技术方案。在传输方面，采用TimeTunnel (TT），它既包括数据库的增量数据传输，也包括日志数据的传输；TT作为数据传输服务的基础架构，既支持实时流式计算，也支持各种时间窗口的批量计算。另外，也通过数据同步工具直连异构数据库（备库）来抽取各种时间窗口的数据。",[10548,30366,30368],{"id":30367},"_2数据计算层","（2）数据计算层",[13,30370,30371],{},"数据只有被整合和计算，才能被用于洞察商业规律，挖掘潜在信息，从而实现大数据价值，达到赋能于商业和创造价值的目的。从采集系统中收集到的大量原始数据，将进入数据计算层中被进一步整合与计算。",[13,30373,30374],{},"数据存储及计算云平台（离线计算平台MaxCompute和实时计算平台StreamCompute）和数据整合及管理体系（内部称之为“OneData”）。",[13,30376,30377],{},"阿里数据仓库的数据加工链路也是遵循业界的分层理念，包括操作数据层（OperationalData Store, ODS）、明细数据层（DataWa rehouse Detail, DWD）、汇总数据层（DataWarehouse Summary, DWS）和应用数据层（ApplicationData Store, ADS）。通过数据仓库不同层次之间的加工过程实现从数据资产向信息资产的转化，并且对整个过程进行有效的元数据管理及数据质量处理。",[10548,30379,30381],{"id":30380},"_3数据服务层","（3）数据服务层",[13,30383,30384],{},"当数据已被整合和计算好之后，需要提供给产品和应用进行数据消费。针对不同的需求，数据服务层的数据源架构在多种数据库之上，如MySQL和HBase等。",[13,30386,30387],{},"数据服务可以使应用对底层数据存储透明，将海量数据方便高效地放给集团内部各应用使用。数据服务层对外提供数据服务主要是通过统一的数据服务平台。OneService以数据仓库整合计算好的数据作为数据源，对外通过接口的方式提供数据服务，主要提供简单数据查询服务、复杂数据查询服务（承接集团用户识别、用户画像等复杂数据查询服务）和实时数据推送服务三大特色数据服务。",[10548,30389,30391],{"id":30390},"_4数据应用层","（4）数据应用层",[13,30393,30394],{},"数据已经准备好，需要通过合适的应用提供给用户，让数据最大化地发挥价值。数据作为新能源，为产业注人的变革是显而易见的。我们对数据新能源的探索也不仅仅停留在狭义的技术、服务和应用上。我们正在挖掘大数据更深层次的价值，为社会经济和民生基础建设等提供创新方法。",[23289,30396],{},[107,30398,30400],{"id":30399},"第二章-日志采集","第二章 日志采集",[7759,30402,30404],{"id":30403},"_1浏览器的页面日志采集","1、浏览器的页面日志采集",[10548,30406,30408],{"id":30407},"_1页面浏览展现日志采集","（1）页面浏览（展现）日志采集",[13,30410,30411],{},"最基础的互联网日志，也是目前所有互联网产品的两大基本指标：页面浏览量（PageView, PV）和访客数（UniqueVisitors, UV）的统计基础。页面浏览日志是目前成熟度和完备度最高，同时也是最具挑战性的日志来集任务。",[49,30413,30414,30427],{},[52,30415,30416,30417],{},"流程\n",[49,30418,30419,30422],{},[52,30420,30421],{},"在HTML文档内的适当位置增加一个日志采集节点，当浏览器解析到这个节点时，将自动触发一个特定的HTTP请求到日志采集服务器。如此一来，当日志采集服务器接收到这个请求时，就可以确定浏览器已经成功地接收和打开了页面。",[52,30423,30424],{},[617,30425],{"alt":119,"src":30426},"img\u002F2.1.png",[52,30428,30429,30430],{},"主要过程\n",[49,30431,30432,30435,30438,30441],{},[52,30433,30434],{},"客户端日志采集：日志采集工作一般由一小段被植人页面HTML文档内的JavaScript脚本来执行。采集脚本被浏览器加载解析后执行，在执行时采集当前页面参数、浏览行为的上下文信息（如读取用户访问当前页面时的上一步页面）以及一些运行环境信息（如当前的浏览器和分辨率等）。",[52,30436,30437],{},"客户端日志发送：采集脚本执行时，会向日志服务器发起一个日志请求，以将采集到的数据发送到日志服务器。",[52,30439,30440],{},"服务器端日志采集。",[52,30442,30443],{},"服务器端日志解析存档：服务器接收到的浏览日志进人缓冲区后，会被一段专门的日志处理程序顺序读出并按照约定的日志处理逻辑解析。",[10548,30445,30447],{"id":30446},"_2页面交互日志采集","（2）页面交互日志采集",[13,30449,30450],{},"当页面加载和渲染完成之后，用户可以在页面上执行各类操作。互动设计都要求采集用户的互动行为数据，以便通过量化获知用户的兴趣点或者体验优化点。交互日志采集就是为此类业务场景而生的。",[49,30452,30453],{},[52,30454,30455,30456],{},"“黄金令箭”采集方案：基于HTTP协议的日志服务\n",[49,30457,30458,30461,30464,30467],{},[52,30459,30460],{},"业务方在“黄金令箭”的元数据管理界面依次注册需要采集交互日志的业务、具体的业务场景以及场景下的具体交互采集点，在注册完成之后，系统将生成与之对应的交互日志来集代码模板。",[52,30462,30463],{},"业务方将交互日志采集代码植入目标页面，并将采集代码与需要监测的交互行为做绑定。",[52,30465,30466],{},"当用户在页面上产生指定行为时，采集代码和正常的业务互动响应代码一起被触发和执行。",[52,30468,30469],{},"采集代码在采集动作完成后将对应的日志通过HTTP协议发送到日志服务器，日志服务器接收到日志后原则上不做解析处理，只做简单的转储。",[10548,30471,30473],{"id":30472},"_3服务器端清洗和预处理","（3）服务器端清洗和预处理",[49,30475,30476,30484,30492,30500],{},[52,30477,30478,30479],{},"识别流量攻击、网络爬虫和流量作弊（虚假流量）\n",[49,30480,30481],{},[52,30482,30483],{},"需要对所采集的日志进行合法性校验，依托算法识别非正常的流量并归纳出对应的过滤规则集加以滤除。这是一个长期而艰苦的对抗过程。",[52,30485,30486,30487],{},"数据缺项补正\n",[49,30488,30489],{},[52,30490,30491],{},"大多数情况下，需要对日志中的一些公用且重要的数据项做取值归一、标准化处理或反向补正。反向补正，即根据新日志对稍早收集的日志中的个别数据项做回补或修订。",[52,30493,30494,30495],{},"无效数据剔除\n",[49,30496,30497],{},[52,30498,30499],{},"定时检查配置并依照配置将因业务变更或配置不当，在采集到的日志中会存在一些无意义、已经失效或者冗余的数据项剔除。",[52,30501,30502,30503],{},"日志隔离分发\n",[49,30504,30505],{},[52,30506,30507],{},"基于数据安全或者业务特性的考虑，某些日志在进入公共数据环境之前需要做隔离。",[7759,30509,30511],{"id":30510},"_2无线客户端的日志采集","2、无线客户端的日志采集",[13,30513,30514],{},"无线客户端的日志采集采用采集SDK来完成，在阿里巴巴内部，多使用名为UserTrack的SDK来进行无线客户端的日志采集。",[13,30516,30517],{},"基于常规的分析，UserTrack (UT）把事件分成了几类，常用的包括页面事件（同前述的页面浏览）和控件点击事件（同前述的页面交互）等。",[13,30519,30520],{},"在阿里系内，使用SPM(Super Position Model ，超级位置模型）进行来源去向的追踪，在无线客户端也同样使用SPM，SPM信息就可以通过透传机制带人到下一步甚至下下一步的浏览页面，这样整个用户行为路径还原就轻松实现了。",[10548,30522,30523],{"id":30523},"特殊场景",[13,30525,30526],{},"为了平衡日志大小，减小流量消耗、采集服务器压力、网络传输压力等，采集SDK提供了聚合功能，对某些场景如曝光或一些性能技术类日志，我们提倡在客户端对这类日志进行适当聚合，以减少对日志采集服务器端的请求，适当减小日志大小。总体思路就是每个曝光的元素一般都属于一个页面，利用页面的生命周期来实现适当的聚合及确定发送时机。",[10548,30528,30529],{"id":30529},"日志传输",[13,30531,30532],{},"无线客户端日志的上传，不是产生一条日志上传一条，而是无线客户端产生日志后，先存储在客户端本地，然后再伺机上传。",[13,30534,30535],{},"客户端数据上传时是向服务器发送POST请求，服务器端处理上传请求，对请求进行相关校验，将数据追加到本地文件中进行存储，存储方式使用Nginx的access_log，access_log的切分维度为天，即当天接收的日志存储到当天的日志文件中。考虑到后续的数据处理，以及特殊时期不同日志的保障级别，还对日志进行了分流。",[7759,30537,30539],{"id":30538},"_3日志处理","3、日志处理",[10548,30541,30543],{"id":30542},"_1日志分流和定制处理","（1）日志分流和定制处理",[13,30545,30546],{},"大型互联网网站的日志类型和日志规模都呈现出高速增长的态势，而且往往会出现短时间的流量热点爆发。这一特点，使得在日志服务器端采用集中统一的解析处理方案变得不可能，其要求在日志解析和处理过程中必须考虑业务分流（、日志优先级控制，以及根据业务特点实现定制处理。",[10548,30548,30550],{"id":30549},"_2采集与计算一体化设计","（2）采集与计算一体化设计",[13,30552,30553],{},"日志采集方案必须将来集与计算作为一个系统来考量，进行一体化设计。在当前的互联网环境下，互联网日志的规模化采集方案必须具备一个与终端设备的技术特点无关，具有高度扩展弹性和适应性，同时深入契合应用需求的业务逻辑模型，并基于此制定对应的采集规范交由产品开发人员执行。",[10548,30555,30557],{"id":30556},"_3数据处理全链路","（3）数据处理全链路",[13,30559,30560],{},[617,30561],{"alt":119,"src":30562},"img\u002F2.2.png",[23289,30564],{},[107,30566,30568],{"id":30567},"第三章-数据同步","第三章 数据同步",[13,30570,30571],{},"数据同步需要针对不同的数据类型及业务场景选择不同的同步方式。总的来说，同步方式可以分为三种：直连同步、数据文件同步和数据库日志解析同步。",[7759,30573,30575],{"id":30574},"_1直连同步","1、直连同步",[13,30577,30578],{},"直连同步是指通过定义好的规范接口API和基于动态链接库的方式直接连接业务库，如ODBC\u002FJDBC等规定了统一规范的标准接口（驱动）",[49,30580,30581,30584,30587],{},[52,30582,30583],{},"配置简单，实现容易",[52,30585,30586],{},"适合操作型业务系统的数据同步",[52,30588,30589],{},"业务库直连的方式对源系统的性能影响较大，当执行大批量数据同步时会降低甚至拖垮业务系统的性能（主备策略-学校二课服务器就是这种同步方式）",[7759,30591,30593],{"id":30592},"_2数据文件同步","2、数据文件同步",[13,30595,30596],{},"数据文件同步通过约定好的文件编码、大小、格式等，直接从源系统生成数据的文本文件，由专门的文件服务器，如FTP服务器传输到目标系统后，加载到目标数据库系统中。",[49,30598,30599,30602,30605],{},[52,30600,30601],{},"主要存储日志类（文本文件）数据",[52,30603,30604],{},"异构数据源（多台数据库）采用这种策略",[52,30606,30607],{},"上传下载容易造成丢包或错误，需要额外发送校验文件",[7759,30609,30611],{"id":30610},"_3数据库日志解析同步","3、数据库日志解析同步",[13,30613,30614],{},"数据文件被传输到目标系统后，可通过数据加载模块完成数据的导人，从而实现数据从源系统到目标系统的同步。（通过TCP\u002FIP协议）",[49,30616,30617,30620],{},[52,30618,30619],{},"实时与准实时同步的能力（延迟低）",[52,30621,30622],{},"对业务系统的性能影响也比较小",[10548,30624,30625],{"id":30625},"删除数据变更的三种同步方式",[49,30627,30628,30631,30634],{},[52,30629,30630],{},"不过滤删除流水。不管是否是删除操作，都获取同一主键最后变更的那条流水。",[52,30632,30633],{},"过滤最后一条删除流水。如果同一主键最后变更的那条流水是删除操作，就获取倒数第二条流水。",[52,30635,30636],{},"过滤删除流水和之前的流水。如果在同一主键变更的过程中有删除操作，则根据操作时间将该删除操作对应的流水和之前的流水都过滤掉。",[10548,30638,30639],{"id":30639},"存在的问题",[49,30641,30642,30645,30648],{},[52,30643,30644],{},"数据延迟。",[52,30646,30647],{},"投人较大。",[52,30649,30650],{},"数据漂移和遗漏。（数据漂移，一般是对增量表而言的，通常是指该表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天的变更数据。）",[7759,30652,30654],{"id":30653},"_4阿里数仓的同步策略","4、阿里数仓的同步策略",[10548,30656,30658],{"id":30657},"_1批量数据同步","（1）批量数据同步",[13,30660,30661],{},"先将数据转换为中间状态，统一数据格式。由于这类数据都是结构化的，且均支持标准的SQL语言查询，所以所有的数据类型都可以转换为字符串类型。因此，我们可以通过将各类源数据库系统的数据类型统一转换为字符串类型的方式，实现数据格式的统一。",[13,30663,30664],{},"阿里巴巴的DataX就是这样一个能满足多方向高自由度的异构数据交换服务产品。对于不同的数据源，DataX通过插件的形式提供支持，将数据从数据源读出并转换为中间状态，同时维护好数据的传输、缓存等工作。",[13,30666,30667],{},[617,30668],{"alt":119,"src":29839},[13,30670,30671],{},"DataX采用Framework+Plugin的开放式框架实现，Framework处理缓冲、流程控制、并发、上下文加载等高速数据交换的大部分技术问题，并提供简单的接口与插件接入。",[10548,30673,30675],{"id":30674},"_2实时数据同步","（2）实时数据同步",[13,30677,30678],{},"通过解析MySQL的binlog日志（相当于Oracle的归档日志）来实时获得增量的数据更新，并通过消息订阅模式来实现数据的实时同步的。具体来说，就是建立一个日志数据交换中心，通过专门的模块从每台服务器源源不断地读取日志数据，或者解析业务数据库系统的binlog或归档日志，将增量数据以数据流的方式不断同步到日志交换中心，然后通知所有订阅了这些数据的数据仓库系统来获取。",[13,30680,30681],{},"TimeTunnel（TT）是一种基于生产者、消费者和Topic消息标识的消息中间件，将消息数据持久化到HBase的高可用、分布式数据交互系统。",[7759,30683,30685],{"id":30684},"_5数据同步遇到的问题和解决办法","5、数据同步遇到的问题和解决办法",[10548,30687,30689],{"id":30688},"_1分库分表的处理","（1）分库分表的处理",[13,30691,30692],{},"阿里巴巴的TDDL( Taobao Distributed  Data Layer）是一个具备将分布在不同数据库中的不同表集成为一个表的能力，能让下游应用像访问单库单表一样方便的分布式数据库的访问引擎，通过建立中间状态的逻辑表来整合统一分库分表的访问。",[10548,30694,30696],{"id":30695},"_2高效同步和批量同步","（2）高效同步和批量同步",[13,30698,30699],{},"阿里巴巴OneClick产品：",[49,30701,30702,30705,30708],{},[52,30703,30704],{},"对不同数据源的数据同步配置透明化，可以通过库名和表名唯一定位，通过IDB接口获取元数据信息自动生成配置信息。",[52,30706,30707],{},"简化了数据同步的操作步骤，实现了与数据同步相关的建表、配置任务、发布、测试操作一键化处理，并且封装成Web接口进一步达到批量化的效果。",[52,30709,30710],{},"降低了数据同步的技能门槛，让数据需求方更加方便地获取和使用数据。",[13,30712,30713],{},"真正实现了数据的一键化和批量化同步，一键完成DDL和DML的生成、数据的冒烟测试以及在生产环境中测试等。",[10548,30715,30717],{"id":30716},"_3增量和全量同步的合并","（3）增量和全量同步的合并",[13,30719,30720,30721,30724],{},"在传统的数据整合方案中，合并技术大多采用merge方式( update+insert）：当前流行的大数据平台基本都不支持update操作，现在我们比较推荐的方式是",[22,30722,30723],{},"全外连接（full outer join)＋数据全量覆盖重新加载（insert overwrite），即如日调度","，则将当天的增量数据和前一天的全量数据做全外连接，重新加载最新的全量数据。在大数据量规模下，全量更新的性能比update要高得多。此外，如果担心数据更新错误问题，可以采用分区方式，每天保持一个最新的全量版本，保留较短的时间周期（如3～7天）。",[13,30726,30727],{},"另外，当业务系统的表有物理删除数据的操作，而数据仓库需要保留所有历史数据时，也可以选择这种方式，在数据仓库中永久保留最新的全量数据快照。",[10548,30729,30731],{"id":30730},"_4基于负载均衡思想的新型数据同步方案","（4）基于负载均衡思想的新型数据同步方案",[13,30733,30734],{},"核心思想是通过目标数据库的元数据估算同步任务的总线程数，以及通过系统预先定义的期望同步速度估算首轮同步的线程数，同时通过数据同步任务的业务优先级决定同步线程的优先级，最终提升同步任务的执行效率和稳定性。",[49,30736,30737,30740,30743,30746,30749,30752,30755,30758],{},[52,30738,30739],{},"用户创建数据同步任务，并提交该同步任务。",[52,30741,30742],{},"根据系统提前获知及设定的数据，估算该同步任务需要同步的数据量、平均同步速度、首轮运行期望的线程数、需要同步的总线程数。",[52,30744,30745],{},"根据需要同步的总线程数将待同步的数据拆分成相等数量的数据块，一个线程处理一个数据块，并将该任务对应的所有线程提交至同步控制器。",[52,30747,30748],{},"同步控制器判断需要同步的总线程数是否大于首轮运行期望的线程数，若大于，则跳转至2；若不大于，则跳转至5。",[52,30750,30751],{},"同步控制器采用多机多线程的数据同步模式，准备该任务第一轮线程的调度，优先发送等待时间最长、优先级最高且同一任务的线程。",[52,30753,30754],{},"同步控制器准备一定数据量（期望首轮线程数－总线程数）的虚拟线程，采用单机多线程的数据同步模式，准备该任务相应实体线程和虚拟线程的调度，优先发送等待时间最长、优先级最高且单机CPU剩余资源可以支持首轮所有线程数且同一任务的线程，如果没有满足条件的机器，则选择CPU剩余资源最多的机器进行首轮发送。",[52,30756,30757],{},"数据任务开始同步，并等待完成。",[52,30759,30760],{},"数据任务同步结束。",[10548,30762,30764],{"id":30763},"_5数据漂移的处理","（5）数据漂移的处理",[13,30766,30767],{},"数据漂移是ODS数据（从源系统同步进入数据仓库的第一层数据称为ODS或者staging层数据，阿里巴巴统称为ODS）的一个顽疾，通常是指ODS表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天的变更数据。",[13,30769,30770],{},"无论根据哪一个单一时间戳获取数据，都有可能导致数据漂移，处理方法如下：",[49,30772,30773,30776],{},[52,30774,30775],{},"多获取后一天的数据，保障数据只多不少（但是会存在一定的数据误差）",[52,30777,30778],{},"通过多个时间戳字段限制时间来获取相对准确的数据（限制时间范围，做全外连接回补数据）",[23289,30780],{},[107,30782,30784],{"id":30783},"第四章-离线数据开发","第四章 离线数据开发",[7759,30786,30788],{"id":30787},"_1数据开发平台","1、数据开发平台",[13,30790,30791],{},"阿里数据研发岗位的工作大致可以概括为：了解需求→模型设计→ETL开发→测试→发布上线→日常运维→任务下线。相较于传统数仓开发（ETL），有以下特点：",[49,30793,30794,30797,30800,30803,30806],{},[52,30795,30796],{},"业务变更频繁",[52,30798,30799],{},"需要快速交付",[52,30801,30802],{},"频繁发布上线",[52,30804,30805],{},"运维任务多",[52,30807,30808],{},"系统环境复杂",[10548,30810,30812],{"id":30811},"_1统一计算平台","（1）统一计算平台",[13,30814,30815],{},"大数据计算服务MaxCompute是由阿里云自主研发的海量数据处理平台，主要服务于海量数据的存储和计算，提供完善的数据导入方案，以及多种经典的分布式计算模型，提供海量数据仓库的解决方案，能够更快速地解决用户的海量数据计算问题，有效降低企业成本，并保障数据安全。",[13,30817,30818],{},"MaxCompute采用抽象的作业处理框架，将不同场景的各种计算任务统一在同一个平台之上，共享安全、存储、数据管理和资源调度，为来自不同用户需求的各种数据处理任务提供统一的编程接口和界面。它提供数据上传／下载通道、SQL、MapReduce、机器学习算法、图编程模型和流式计算模型多种计算分析服务，并且提供完善的安全解决方案。",[13,30820,30821],{},[617,30822],{"alt":119,"src":30157},[13,30824,30825],{},"MaxCompute特点：",[49,30827,30828,30831,30834,30857],{},[52,30829,30830],{},"计算性能高且更加普惠",[52,30832,30833],{},"集群规模大且稳定性高",[52,30835,30836,30837],{},"功能组件非常强大",[49,30838,30839,30842,30845,30848,30851,30854],{},[52,30840,30841],{},"MaxCompute SQL：标准SQL的语法，提供各类操作和函数来处理数据。",[52,30843,30844],{},"MaxCompute MapReduce：提供JavaMapReduce编程模型，通过接口编写MR程序处理MaxCompute中的数据。还提供基于MapReduce的扩展模型MR2，在该模型下，一个Map函数后可以接人连续多个Reduce函数，执行效率比普通的MapReduce模型高。",[52,30846,30847],{},"MaxCompute Graph ：面向迭代的图计算处理框架，典型应用有PageRank、单源最短距离算法、K-均值聚类算法。",[52,30849,30850],{},"Spark：使用Spark接口编程处理存储在MaxCompute中的数据。",[52,30852,30853],{},"RMaxCompute：使用R处理MaxCompute中的数据。",[52,30855,30856],{},"Volume: MaxCompute以Volume的形式支持文件，管理非二维表数据。",[52,30858,30859],{},"安全性高",[10548,30861,30863],{"id":30862},"_2统一开发平台","（2）统一开发平台",[13,30865,30866],{},"数据研发人员完成需求了解和模型设计之后，进入开发环节，开发工作流如下：",[13,30868,30869],{},[617,30870],{"alt":119,"src":30871},"img\u002F4.2.png",[49,30873,30874,30882,30904,30925],{},[52,30875,30876,30877],{},"在云端（D2）",[49,30878,30879],{},[52,30880,30881],{},"D2是集成任务开发、调试及发布，生产任务调度及大数据运维，数据权限申请及管理等功能的一站式数据开发平台，并能承担数据分析工作台的功能。",[52,30883,30884,30885],{},"SQLSCAN",[49,30886,30887,30890],{},[52,30888,30889],{},"SQLSCAN将在任务开发中遇到的各种问题，如用户编写的SQL质量差、性能低、不遵守规范等，总结后形成规则，并通过系统及研发流程保障，事前解决故障隐患，避免事后处理。",[52,30891,30892,30893],{},"三类规则校验\n",[49,30894,30895,30898,30901],{},[52,30896,30897],{},"代码规范类规则，如表命名规范、生命周期设置、表注释等。",[52,30899,30900],{},"代码质量类规则，如调度参数使用检查、分母为0提醒、NULL值参与计算影响结果提醒、插入字段顺序错误等。",[52,30902,30903],{},"代码性能类规则，如分区裁剪失效、扫描大表提醒、重复计算检测等。",[52,30905,30906,30907],{},"DQC",[49,30908,30909,30912],{},[52,30910,30911],{},"DQC (Data Quality Center，数据质量中心）主要关注数据质量，通过配置数据质量校验规则，自动在数据处理任务过程中进行数据质量方面的监控。",[52,30913,30914,30915],{},"DQC主要有数据监控和数据清洗两大功能。\n",[49,30916,30917,30920],{},[52,30918,30919],{},"数据清洗采用非侵入式的清洗策略，在数据同步过程中不进行数据清洗，避免影响数据同步的效率，其过程在数据进入ODS层之后执行。对于需要清洗的表，首先在DQC配置清洗规则；对于离线任务，每隔固定的时间间隔，数据入仓之后，启动清洗任务，调用DQC配置的清洗规则，将符合清洗规则的数据清洗掉，并保存至DIRTY表归档。如果清洗掉的数据量大于预设的阐值，则阻断任务的执行；否则不会阻断。",[52,30921,30922],{},[617,30923],{"alt":119,"src":30924},"img\u002F4.3.png",[52,30926,30927,30928],{},"在彼岸",[49,30929,30930,30941],{},[52,30931,30932,30933],{},"数据测试的典型测试方法是功能测试，主要验证目标数据是否符合预期。\n",[49,30934,30935,30938],{},[52,30936,30937],{},"新增业务需求",[52,30939,30940],{},"数据迁移、重构和修改",[52,30942,30943,30944],{},"在彼岸主要包含如下组件，除满足数据测试的数据对比组件之外，还有数据分布和数据脱敏组件。\n",[49,30945,30946,30949,30952,30955],{},[52,30947,30948],{},"数据对比：支持不同集群、异构数据库的表做数据对比。表级对比规则主要包括数据量和全文对比；字段级对比规则主要包括字段的统计值（如SUM、AVG、MAX、MIN等）、枚举值、空值、去重数、长度值等。",[52,30950,30951],{},"数据分布：提取表和字段的一些特征值，并将这些特征值与预期值进行比对。表级数据特征提取主要包括数据量、主键等；字段级数据特征提取主要包括字段枚举值分布、空值分布、统计值（如SUM、AVG、MAX、MIN等）、去重数、长度值等。",[52,30953,30954],{},"数据脱敏：将敏感数据模糊化。在数据安全的大前提下，实现线上数据脱敏，在保证数据安全的同时又保持数据形态的分布，以便业务联调、数据调研和数据交换。",[52,30956,30957],{},[617,30958],{"alt":119,"src":30959},"img\u002F4.4.png",[7759,30961,30963],{"id":30962},"_2任务调度系统","2、任务调度系统",[13,30965,30966],{},"度系统中的各类任务互相依赖，形成一个典型的有向无环图。在传统的数据仓库系统中，很多是依靠Crontab定时任务功能进行任务调度处理的。这种方式有很多弊端：①各任务之间的依赖基于执行时间实现，容易造成前面的任务未结束或失败而后面的任务已经运行；②任务难以并发执行，增加了整体的处理时间：③无法设置任务优先级；④任务的管理维护很不方便，无法进行执行效果分析等。",[10548,30968,30969],{"id":30969},"核心设计模型",[13,30971,30972],{},"整个调度系统共有两个核心模块：调度引擎（PhoenixEngine）和执行引擎（Alisa）。简单来说，调度引擎的作用是根据任务节点属性以及依赖关系进行实例化，生成各类参数的实值，并生成调度树z执行引擎的作用是根据调度引擎生成的具体任务实例和配置信息，分配CPU、内存、运行节点等资源，在任务对应的执行环境中运行节点代码。",[10548,30974,30975],{"id":30975},"调度引擎工作原理",[13,30977,30978],{},"调度引擎（Phoenix Engine）基于以上两个状态机模型原理，以事件驱动的方式运行，为数据任务节点生成实例，并在调度树中生成具体执行的工作流。任务节点实例在工作流状态机、任务状态机和事件处理器之间转换，其中调度引擎只涉及任务状态机的未运行和等待运行两种状态，其他5种状态存在于执行引擎中。",[10548,30980,30981],{"id":30981},"执行引擎",[13,30983,30984],{},"Alisa的用户系统包括上文的工作流服务、数据同步服务，以及调度引擎生成的各类数据处理任务的调度服务。同时其任务可以共享同一个物理集群资源，提高了资源的利用效率。",[23289,30986],{},[107,30988,30990],{"id":30989},"第五章-实时技术","第五章 实时技术",[13,30992,30993],{},"数据价值是具有时效性的，在一条数据产生的时候，如果不能及时处理并在业务系统中使用，就不能让数据保持最高的“新鲜度”和价值最大化。",[13,30995,30996],{},"相对于离线批处理技术，流式实时处理技术作为一个非常重要的技术补充，在阿里巴巴集团内被广泛使用。在大数据业界中，流计算技术的研究是近年来非常热门的课题。流式数据处理一般具有以下特征：",[49,30998,30999,31002,31005,31008],{},[52,31000,31001],{},"时效性高：数据实时采集、实时处理，延时粒度在秒级甚至毫秒级，业务方能够在第一时间拿到经过加工处理后的数据。",[52,31003,31004],{},"常驻任务：区别于离线任务的周期调度，流式任务属于常驻进程任务，一旦启动后就会一直运行，直到人为地终止，因此计算成本会相对比较高。",[52,31006,31007],{},"性能要求高：实时计算对数据处理的性能要求非常严格，如果处理吞吐量跟不上采集吞吐量，计算出来的数据就失去了实时的特性。",[52,31009,31010],{},"应用局限性：实时数据处理不能替代离线处理，除了计算成本较大这个因素外，对于业务逻辑复杂的场景（比如双流关联或者需要数据回滚的情况），其局限性导致支持不足。",[7759,31012,31014],{"id":31013},"_1流式技术架构","1、流式技术架构",[10548,31016,31018],{"id":31017},"_1数据采集","（1）数据采集",[13,31020,31021],{},"既然需要做到实时计算，那么自然就需要做到实时采集了。所采集的数据都来自于业务服务器，从所采集的数据种类来看，主要可以划分为两种：",[49,31023,31024,31027],{},[52,31025,31026],{},"数据库变更日志，比如MySQL的binlog日志、HBase的hlog日志、OceanBase的变更日志、Oracle的变更日志等。",[52,31028,31029],{},"引擎访问日志，比如用户访问网站产生的Apache引擎日志、搜索引擎的接口查询日志等。",[13,31031,31032],{},"一般情况下，基于以下原则按批次对数据进行采集：",[49,31034,31035,31038],{},[52,31036,31037],{},"数据大小限制：当达到限制条件时，把目前采集到的新数据作为一批（例如512KB写一批）。",[52,31039,31040],{},"时间阐值限制：当时间达到一定条件时，也会把目前采集到的新数据作为一批，避免在数据量少的情况下一直不采集（例如30秒写一批）。",[10548,31042,31044],{"id":31043},"_2数据处理","（2）数据处理",[13,31046,31047],{},"实时计算任务部署在流式计算系统上，通过数据中间件获取到实时源数据后进行实时加工处理。",[13,31049,31050],{},"实时数据处理应用出于性能考虑，计算任务往往是多线程的。一般会根据业务主键进行分桶处理，并且大部分计算过程需要的数据都会放在内存中，这样会大大提高应用的吞吐量。为了避免内存溢出，内存中过期的数据需要定时清理，可以按照LRU（最近最少使用）算法或者业务时间集合归类清理（比如业务时间属于T-1的，会在今天凌晨进行清理）。",[13,31052,31053],{},"典型问题：",[49,31055,31056,31089,31097],{},[52,31057,31058,31059],{},"去重指标\n",[49,31060,31061,31064,31067,31078],{},[52,31062,31063],{},"精确去重。在这种情况下，明细数据是必须要保存下来的，当遇到内存问题时，可以通过数据倾斜来进行处理，把一个节点的内存压力分到多个节点上。",[52,31065,31066],{},"模糊去重。在去重的明细数据量非常大，而业务的精度要求不高的情况下，可以使用相关的去重算法，把内存的使用量降到千分之一甚至万分之一，以提高内存的利用率。",[52,31068,31069,31070],{},"布隆过滤器\n",[49,31071,31072,31075],{},[52,31073,31074],{},"该算法是位数组算法的应用，不保存真实的明细数据，只保存明细数据对应哈希值的标记位。",[52,31076,31077],{},"适用场景：统计精度要求不高，统计维度值非常多的情况。",[52,31079,31080,31081],{},"基数估计\n",[49,31082,31083,31086],{},[52,31084,31085],{},"利用哈希的原理，按照数据的分散程度来估算现有数集的边界，从而得出大概的去重值总和。",[52,31087,31088],{},"适用场景：统计精度要求不高，统计维度非常粗的情况。",[52,31090,31091,31092],{},"数据倾斜\n",[49,31093,31094],{},[52,31095,31096],{},"在数据量非常大的时候，单个节点的处理能力是有限的，必然会遇到性能瓶颈。这时就需要对数据进行分桶处理，分桶处理和离线处理的思路是一样的。",[52,31098,31099,31100],{},"事务处理\n",[49,31101,31102,31116],{},[52,31103,31104,31105],{},"由于实时计算是分布式处理的，系统的不稳定性必然会导致数据的处理有可能出现失败的情况。个流计算系统几乎都提供了数据自动ACK、失败重发以及事务信息等机制。\n",[49,31106,31107,31110,31113],{},[52,31108,31109],{},"超时时间：由于数据处理是按照批次来进行的，当一批数据处理超时时，会从拓扑的spout端重发数据。另外，批次处理的数据量不宜过大，应该增加一个限流的功能（限定一批数据的记录数或者容量等），避免数据处理超时。",[52,31111,31112],{},"事务信息：每批数据都会附带一个事务ID的信息，在重发的情况下，让开发者自己根据事务信息去判断数据第一次到达和重发时不同的处理逻辑。",[52,31114,31115],{},"备份机制：开发人员需要保证内存数据可以通过外部存储恢复，因此在计算中用到的中间结果数据需要备份到外部存储中。",[52,31117,31118],{},"上面的这些机制都是为了保证数据的幕等性。",[10548,31120,31122],{"id":31121},"_3数据存储","（3）数据存储",[13,31124,31125],{},"数据存储系统必须能够比较好地支持多并发读写，并且延时需要在毫秒级才能满足实时的性能要求。在实践中，一般使用HBase、Tair、MongoDB等列式存储系统。由于这些系统在写数据时是先写内存再落磁盘，因此写延时在毫秒级：读请求也有缓存机制，重要的是多并发读时也可以达到毫秒级延时。",[10548,31127,31129],{"id":31128},"_4数据服务","（4）数据服务",[13,31131,31132],{},"数据服务工具例如OneService的特点：",[49,31134,31135,31138,31141],{},[52,31136,31137],{},"不需要直连数据库，数据源等信息在数据服务层维护，这样当存储系统迁移时，对下游是透明的。",[52,31139,31140],{},"调用方只需要使用服务层暴露的接口，不需要关心底层取数逻辑的实现。",[52,31142,31143],{},"屏蔽存储系统间的差异，统一的调用日志输出，便于分析和监控下游使用情况。",[7759,31145,31147],{"id":31146},"_2流式数据模型","2、流式数据模型",[13,31149,31150],{},"数据模型设计是贯通数据处理过程的，流式数据处理也一样，需要对数据流建模分层。实时建模跟离线建模非常类似，数据模型整体上分为五层（ODS、DWD、DWS、ADS、DIM）。",[13,31152,31153],{},"整体来看，实时数据模型是离线数据模型的一个子集，在实时数据处理过程中，很多模型设计就是参考离线数据模型实现的。",[10548,31155,31157],{"id":31156},"_1数据分层","（1）数据分层",[49,31159,31160,31171,31179,31187,31195],{},[52,31161,31162,31163],{},"ODS层（Operational Data Store）\n",[49,31164,31165,31168],{},[52,31166,31167],{},"ODS层属于操作数据层，是直接从业务系统采集过来的最原始数据，包含了所有业务的变更过程，数据粒度也是最细的。",[52,31169,31170],{},"在这一层，实时和离线在源头上是统一的，这样的好处是用同一份数据加工出来的指标，口径基本是统一的，可以更方便进行实时和离线间数据比对。",[52,31172,31173,31174],{},"DWD层（Data Warehouse Detail）\n",[49,31175,31176],{},[52,31177,31178],{},"DWD层是在ODS层基础上，根据业务过程建模出来的实时事实明细层，对于访问日志这种数据（没有上下文关系，并且不需要等待过程的记录），会回流到离线系统供下游使用，最大程度地保证实时和离线数据在ODS层和DWD层是一致的。",[52,31180,31181,31182],{},"DWS层（Data WareHouse Servce）\n",[49,31183,31184],{},[52,31185,31186],{},"订阅明细层的数据后，会在实时任务中计算各个维度的汇总指标。如果维度是各个垂直业务线通用的，则会放在实时通用汇总层，作为通用的数据模型使用。",[52,31188,31189,31190],{},"ADS层（Application Data Store）\n",[49,31191,31192],{},[52,31193,31194],{},"个性化维度汇总层，对于不是特别通用的统计维度数据会放在这一层中，这里计算只有自身业务才会关注的维度和指标，眼其他业务线一般没有交集，常用于一些垂直创新业务中。",[52,31196,31197,31198],{},"DIM层（Data Information Record）\n",[49,31199,31200],{},[52,31201,31202],{},"实时维表层的数据基本上都是从离线维表层导出来的，抽取到在线系统中供实时应用调用。这一层对实时应用来说是静态的，所有的ETL处理工作会在离线系统中完成。",[10548,31204,31206],{"id":31205},"_2多流关联","（2）多流关联",[13,31208,31209],{},"在流式计算中常常需要把两个实时流进行主键关联，以得到对应的实时明细表。在离线系统中两个表关联是非常简单的，因为离线计算在任务启动时已经可以获得两张表的全量数据，只要根据关联键进行分桶关联就可以了。但流式计算不一样，数据的到达是一个增量的过程，并且数据到达的时间是不确定的和无序的，因此在数据处理过程中会涉及中间状态的保存和恢复机制等细节问题。",[13,31211,31212],{},"实时采集两张表的数据，每到来一条新数据时都在内存中的对方表截至当前的全量数据中查找，如果能查找到，则说明关联成功，直接输出：如果没查找到，则把数据放在内存中的自己表数据集合中等待。另外，不管是否关联成功，内存中的数据都需要备份到外部存储系统中，在任务重启时，可以从外部存储系统中恢复内存数据，这样才能保证数据不丢失。因为在重启时，任务是续跑的，不会重新跑之前的数据。",[10548,31214,31216],{"id":31215},"_3维表使用","（3）维表使用",[13,31218,31219],{},"在离线系统中，一般是根据业务分区来关联事实表和维表的，因为在关联之前维表的数据就已经就绪了。而在实时计算中，关联维表一般会使用当前的实时数据（T）去关联T-2的维表数据，相当于在T的数据到达之前需要把维表数据准备好，并且一般是一份静态的数据。要基于以下几点的考虑：",[49,31221,31222,31225,31228],{},[52,31223,31224],{},"数据无法及时准备好",[52,31226,31227],{},"无法准确获取全量的最新数据",[52,31229,31230],{},"数据的无序性",[7759,31232,31234],{"id":31233},"_3如何进行实时任务优化","3、如何进行实时任务优化",[10548,31236,31238],{"id":31237},"_1独占资源和共享资源的策略","（1）独占资源和共享资源的策略",[10548,31240,31242],{"id":31241},"_2合理选择缓存机制尽量降低读写库次数","（2）合理选择缓存机制，尽量降低读写库次数",[10548,31244,31246],{"id":31245},"_3计算单元合并降低拓扑层次","（3）计算单元合并，降低拓扑层次",[10548,31248,31250],{"id":31249},"_4内存对象共享避免字符拷贝","（4）内存对象共享，避免字符拷贝",[10548,31252,31254],{"id":31253},"_5在高吞吐量和低延时间取平衡","（5）在高吞吐量和低延时间取平衡",[23289,31256],{},[107,31258,31260],{"id":31259},"第六章-数据服务","第六章 数据服务",[7759,31262,31264],{"id":31263},"_1服务架构演进","1、服务架构演进",[10548,31266,31268],{"id":31267},"_1阿里数据服务架构演进过程","（1）阿里数据服务架构演进过程",[13,31270,31271],{},[617,31272],{"alt":119,"src":31273},"img\u002F6.1.png",[10548,31275,31277],{"id":31276},"_2dwsoa","（2）DWSOA",[13,31279,31280],{},[617,31281],{"alt":119,"src":31282},"img\u002F6.2.png",[13,31284,31285],{},"业务方对数据的需求通过SOA服务的方式暴露出去。由需求驱动，一个需求开发一个或者几个接口，编写接口文档，开放给业务方调用。实现比较简单。缺点明显：",[49,31287,31288,31291],{},[52,31289,31290],{},"接口粒度比较粗，灵活性不高，扩展性差，复用率低。",[52,31292,31293],{},"开发效率不高，无法快速响应业务。",[10548,31295,31297],{"id":31296},"_3openapi","（3）OpenAPI",[13,31299,31300],{},[617,31301],{"alt":119,"src":31302},"img\u002F6.3.png",[13,31304,31305],{},"OpenAPI的做法就是将数据按照其统计粒度进行聚合，同样维度的数据，形成一张逻辑表，采用同样的接口描述。结果表明这种方式有效地收敛了接口数量。",[13,31307,31308],{},"（目测是通过在服务层归类成类似数据库表的模型，减少其他层的编码操作）",[10548,31310,31312],{"id":31311},"_4smartdq","（4）SmartDQ",[13,31314,31315],{},[617,31316],{"alt":119,"src":31317},"img\u002F6.4.png",[13,31319,31320],{},"着时间的推移，大家对数据的深度使用，分析数据的维度也越来越多，于是，在OpenAPI的基础上，再抽象一层，用DSL(Domain Specific Language，领域专用语言）来描述取数需求。",[13,31322,31323],{},"采用标准的SQL语法，在此基础上做了一些限制和特殊增强，以降低学习成本。同时也封装了标准DataSource，可以使用ORM(Object Relation Mapping，对象关系映射）框架（目前比较主流的框架有Hibernate、MyBatis等）来解决对象关系映射问题。至此，所有的简单查询服务减少到只有一个接口，这大大降低了数据服务的维护成本。",[13,31325,31326],{},"（提供接口模板，减少人员维护）",[10548,31328,31330],{"id":31329},"_5oneservice统一的数据服务层","（5）OneService统一的数据服务层",[13,31332,31333],{},[617,31334],{"alt":119,"src":31335},"img\u002F6.5.png",[13,31337,31338],{},"SmartDQ其实只满足了简单的查询服务需求，不能满足个性化的取数业务场景，可以使用Lego。OneService主要是提供多种服务类型来满足用户需求，分别是OneService-SmartDQ、OneService-Lego、OneService-iPush、OneService-uTiming。",[13,31340,31341],{},"（可以使用Lego进行用户画像）",[7759,31343,31345],{"id":31344},"_2最佳实践","2、最佳实践",[10548,31347,31349],{"id":31348},"_1性能","（1）性能",[49,31351,31352,31366,31380],{},[52,31353,31354,31355],{},"资源分配",[49,31356,31357,31360,31363],{},[52,31358,31359],{},"剥离计算资源：剥离复杂的计算统计逻辑，将其全部交由底层的数据公共层进行处理，只保留核心的业务处理逻辑",[52,31361,31362],{},"查询资源分配：计了两个独立的线程池：Get线程池和List线程池，分别处理Get请求和List请求，这样就不会因为某些List慢查询，而影响到Get快查询。系统的QPS（Queries-per-second，每秒查询率）比之前提升许多。",[52,31364,31365],{},"执行计划优化：查询拆分\u002F查询优化（List查询转Get查询）",[52,31367,31368,31369],{},"缓存优化",[49,31370,31371,31374,31377],{},[52,31372,31373],{},"元数据缓存",[52,31375,31376],{},"模型缓存：将解析后的模型（包括逻辑模型、物理模型）缓存在本地。节省了DSL->SQL的解析时间。",[52,31378,31379],{},"结果缓存：对查询结果进行缓存，以提高查询性能。",[52,31381,31382,31383],{},"查询能力",[49,31384,31385,31388],{},[52,31386,31387],{},"合并查询：离线数据和实时数据的数据源一般不同，调用者的查询方式完全不同。离线数据最准确，需要优先使用离线数据。如果离线数据还未产出，则改用实时数据。",[52,31389,31390],{},"推送服务：推送服务很好地解决了数据更新的实时性问题，同时也减少了对服务器的请求压力。（减少数据未更新前端不断请求的压力）",[10548,31392,31394],{"id":31393},"_2稳定性","（2）稳定性",[49,31396,31397,31426,31437,31440,31451],{},[52,31398,31399,31400],{},"发布系统",[49,31401,31402,31412],{},[52,31403,31404,31405],{},"元数据隔离：为了保障系统的稳定性，根据应用环境设计了三套元数据：日常元数据、预发元数据和线上元数据。\n",[49,31406,31407],{},[52,31408,31409],{},[617,31410],{"alt":119,"src":31411},"img\u002F6.6.png",[52,31413,31414,31415],{},"隔离发布：不同用户的发布不会相互影响。\n",[49,31416,31417,31420,31423],{},[52,31418,31419],{},"资源划分：定隔离的最小单元。由于调用者的查询请求最终都会转换成对某张逻辑表的查询。",[52,31421,31422],{},"资源独占：当用户开始修改的时候，系统会锁定其正在修改的逻辑表及其下挂的物理表等资源，禁止其他用户修改。当用户正式发布变更后，就会释放锁定的资源，这时其他用户才可以对相关元数据进行修改。",[52,31424,31425],{},"增量更新：发布时引擎是不需要重新加载全量元数据的，只需要加载所发布的逻辑表元数据即可。",[52,31427,31428,31429],{},"隔离：将系统划分为若干个独立模块，当某个模块出现问题时，整体功能仍然能保证可用。另一个作用是可以对系统资源进行有效的管理，从而提高系统的可用性。",[49,31430,31431,31434],{},[52,31432,31433],{},"机房隔离",[52,31435,31436],{},"分组隔离：据某些条件将调用者进行分层，然后将服务端的机器划分为若干个分组，每个分组都有明确的服务对象和保障等级。",[52,31438,31439],{},"安全限制",[52,31441,31442,31443],{},"监控",[49,31444,31445,31448],{},[52,31446,31447],{},"调用日志采集",[52,31449,31450],{},"调用监控（系统）",[52,31452,31453],{},"限流、降级",[23289,31455],{},[107,31457,31459],{"id":31458},"第七章-数据挖掘","第七章 数据挖掘",[13,31461,31462],{},"基于大数据的企业级数据挖掘需要包含两个要素：①面向机器学习算法的并行计算框架与算法平台；②面向企业级数据挖掘的算法资产管理体系。",[7759,31464,31466],{"id":31465},"_1机器学习算法","1、机器学习算法",[13,31468,31469],{},[617,31470],{"alt":119,"src":31471},"img\u002F7.1.png",[7759,31473,31475],{"id":31474},"_2数据挖掘中台体系","2、数据挖掘中台体系",[13,31477,31478],{},"在阿里巴巴集团，由于业务场景与商业智能分析需求的多样化，多个部门、多个商业智能及算法团队针对应用问题所提出的算法解决方案往往是独立的，通常一次数据挖掘的过程包括商业理解、数据准备、特征工程、模型训练、模型测试、模型部署、线上应用及效果反馈等环节。",[13,31480,31481],{},"就数据挖掘的商业场景而言，可以分为两大类应用：个体挖掘应用与关系挖掘应用。个体挖掘应用指对单个实体的行为特征进行预测与分析，如预测某商品的销量、划分某行业的价格区间等；关系挖掘应用指研究多个实体间的关系特征，如商品的相似关系、竞争关系等。",[13,31483,31484],{},"就数据挖掘技术而言，其包含两大要素：数据和算法。数据是数据挖掘的起源与挖掘结果最终的承载形式，可以说任何数据挖掘的过程都是从数据里来，回数据里去，源于数据而高于数据：算法是数据挖掘的神经中枢，通过算法对原始数据进行加工，得到对业务更有价值的数据。",[13,31486,31487],{},"因此，对于数据挖掘中台体系的设计也包含两大块：数据中台与算法中台；结合数据挖掘的商业场景，对这两大块的设计又分别从个体挖掘应用和关系挖掘应用两方面进行考虑。",[10548,31489,31491],{"id":31490},"_1挖掘数据中台","（1）挖掘数据中台",[13,31493,31494],{},"对结果数据进行合理的分层，有效隔离通用性强和个性化强的结果，这样可以充分发挥通用性强的算法结果的作用，提升它的复用率，减少不必要的重复建设。基于以上分析，我们把数据中台分为三层：特征层（Featural Data Mining Layer, FDM）、中间层和应用层（Application-orientedData Mining Layer, ADM），其中中间层包括个体中间层（IndividualData Mining Layer, IDM）和关系中间层（RelationalData Mining Layer, RDM）。",[13,31496,31497],{},[617,31498],{"alt":119,"src":31499},"img\u002F7.2.png",[49,31501,31502,31505,31508,31511],{},[52,31503,31504],{},"FDM层：用于存储在模型训练前常用的特征指标，并进行统一的清洗和去噪处理，提升机器学习特征工程环节的效率。",[52,31506,31507],{},"IDM层：个体挖掘指标中间层，面向个体挖掘场景，用于存储通用性强的结果数据，主要包含商品、卖家、买家、行业等维度",[52,31509,31510],{},"RDM层：关系挖掘指标中间层，面向关系挖掘场景，用于存储通用性强的结果数据，主要包含商品间的相似关系、竞争关系，店铺间的相似关系、竞争关系等。",[52,31512,31513],{},"ADM层：用来沉淀比较个性偏应用的数据挖掘指标，比如用户偏好的类目、品牌等，这些数据已经过深度的加工处理，满足某一特点业务或产品的使用。",[10548,31515,31517],{"id":31516},"_2挖掘算法中台","（2）挖掘算法中台",[13,31519,31520],{},"数据挖掘算法中台建设的目的同样在于从各种各样的挖掘场景中抽象出有代表性的几类场景，并形成相应的方法论和实操模板。",[7759,31522,31524],{"id":31523},"_3数据挖掘案例","3、数据挖掘案例",[10548,31526,31528],{"id":31527},"_1用户画像","（1）用户画像",[13,31530,31531],{},"用户画像即是为用户打上各种各样的标签，如年龄、性别、职业、商品品牌偏好、商品类别偏好等。这些标签的数目越丰富，标签越细化，对用户的刻画就越精准。",[10548,31533,31535],{"id":31534},"_2互联网反作弊","（2）互联网反作弊",[13,31537,31538],{},"业务上看，反作弊工作主要体现在以下几个方面：",[49,31540,31541,31544,31547,31550,31553],{},[52,31542,31543],{},"账户／资金安全与网络欺诈防控",[52,31545,31546],{},"非人行为和账户识别",[52,31548,31549],{},"虚假订单与信用炒作识别",[52,31551,31552],{},"广告推广与APP安装反作弊",[52,31554,31555],{},"UGC恶意信息检测",[13,31557,31558],{},"算法技术上说，反作弊方法主要包括如下几类：",[49,31560,31561,31572,31583],{},[52,31562,31563,31564],{},"基于业务规则的方法：\n",[49,31565,31566,31569],{},[52,31567,31568],{},"根据实际的业务场景，不断地发现总结作弊和获利手法，通过反作弊规则的不断拓展或产品设计的完善来识别、缓解甚至消除作弊现象。",[52,31570,31571],{},"优点是精度高、可解释性强，能准确识别老的作弊方式；缺点是人力成本高，而且对新的作弊手法滞后性较强。",[52,31573,31574,31575],{},"基于有监督学习的方法\n",[49,31576,31577,31580],{},[52,31578,31579],{},"按照有监督分类算法的流程来建模，通过正负样本标记、特征提取、模型训练及预测等过程来识别作弊行为。",[52,31581,31582],{},"优点是通用性强，人力成本主要集中在样本的标记和特征的处理上；缺点是有些算法结果的可解释性不强，容易造成错判，需要辅以其他指标和方法进行综合判断。",[52,31584,31585,31586],{},"基于无监督学习的方法\n",[49,31587,31588,31591],{},[52,31589,31590],{},"异常检测算法假设作弊行为极其罕见且在某些特征维度下和正常行为能够明显地区分开来。所以，假设检验、统计分析、聚类分析等手段常被用来做异常检测。",[52,31592,31593],{},"优点是不需要标记正负样本，而且检测到的异常行为还可以沉淀到规则系统中；缺点是特征设计和提取的工作量大，需要在所有可能的风险维度下刻画行为特征。",[13,31595,31596],{},"算法的实际应用工作主要分为以下两个方面：",[49,31598,31599,31602],{},[52,31600,31601],{},"离线反作弊系统",[52,31603,31604],{},"实时反作弊系统",[13,31606,31607],{},"未来的挑战：",[49,31609,31610,31613,31616],{},[52,31611,31612],{},"作弊手段的多样性和多变性",[52,31614,31615],{},"算法的及时性和准确性",[52,31617,31618],{},"数据及作弊手段的沉淀和逆向反馈",[23289,31620],{},[107,31622,31624],{"id":31623},"第八章-大数据领域建模综述","第八章 大数据领域建模综述",[13,31626,31627],{},"数据模型就是数据组织和存储方法，它强调从业务、数据存取和使用角度合理存储数据。Linux的创始人Torvalds有一段关于“什么才是优秀程序员”的话：“烂程序员关心的是代码，好程序员关心的是数据结构和它们之间的关系”，其阐述了数据模型的重要性。",[13,31629,31630],{},"有了适合业务和基础数据存储环境的模型，那么大数据就能获得以下好处。",[49,31632,31633,31636,31639,31642],{},[52,31634,31635],{},"性能：良好的数据模型能帮助我们快速查询所需要的数据，减少数据的I\u002FO吞吐。",[52,31637,31638],{},"成本：良好的数据模型能极大地减少不必要的数据冗余，也能实现计算结果复用，极大地降低大数据系统中的存储和计算成本。",[52,31640,31641],{},"效率：良好的数据模型能极大地改善用户使用数据的体验，提高使用数据的效率。",[52,31643,31644],{},"质量：良好的数据模型能改善数据统计口径的不一致性，减少数据计算错误的可能性。",[7759,31646,31648],{"id":31647},"_1典型的数据仓库建模方法论","1、典型的数据仓库建模方法论",[10548,31650,31652],{"id":31651},"_1er模型","（1）ER模型",[13,31654,31655],{},"用实体关系（EntityRelationship, ER）模型描述企业业务，在范式理论上符合3NF。数据仓库中的3NF与OLTP系统中的3NF的区别在于，它是站在企业角度面向主题的抽象，而不是针对某个具体业务流程的实体对象关系的抽象。其具有以下几个特点：",[49,31657,31658,31661,31664],{},[52,31659,31660],{},"需要全面了解企业业务和数据。",[52,31662,31663],{},"实施周期非常长。",[52,31665,31666],{},"对建模人员的能力要求非常高。",[13,31668,31669],{},"建模步骤分为三个阶段：",[49,31671,31672,31675,31678],{},[52,31673,31674],{},"高层模型：一个高度抽象的模型，描述主要的主题以及主题间的关系，用于描述企业的业务总体概况。",[52,31676,31677],{},"中层模型：在高层模型的基础上，细化主题的数据项。",[52,31679,31680],{},"物理模型（也叫底层模型）：在中层模型的基础上，考虑物理存储，同时基于性能和平台特点进行物理属性的设计，也可能做一些表的合并、分区的设计等。",[10548,31682,31684],{"id":31683},"_2维度模型","（2）维度模型",[13,31686,31687],{},"维度建模从分析决策的需求出发构建模型，为分析需求服务，因此它重点关注用户如何更快速地完成需求分析，同时具有较好的大规模复杂查询的响应性能。其典型的代表是星形模型，以及在一些特殊场景下使用的雪花模型。其设计分为以下几个步骤：",[49,31689,31690,31693,31696,31699],{},[52,31691,31692],{},"选择需要进行分析决策的业务过程。业务过程可以是单个业务事件，比如交易的支付、退款等；也可以是某个事件的状态，比如当前的账户余额等；还可以是一系列相关业务事件组成的业务流程，具体需要看我们分析的是某些事件发生情况，还是当前状态，或是事件流转效率。",[52,31694,31695],{},"选择粒度。在事件分析中，我们要预判所有分析需要细分的程度，从而决定选择的粒度。粒度是维度的一个组合。",[52,31697,31698],{},"识别维表。选择好粒度之后，就需要基于此粒度设计维表，包括维度属性，用于分析时进行分组和筛选。",[52,31700,31701],{},"选择事实。确定分析需要衡量的指标。",[10548,31703,31705],{"id":31704},"_3data-vault模型","（3）Data Vault模型",[13,31707,31708],{},"Data Vault是ER模型的衍生，其设计的出发点也是为了实现数据的整合，但不能直接用于数据分析决策。它强调建立一个可审计的基础数据层，也就是强调数据的历史性、可追溯性和原子性，而不要求对数据进行过度的一致性处理和整合；同时它基于主题概念将企业数据进行结构化组织，并引入了更进一步的范式处理来优化模型，以应对源系统变更的扩展性。DataVault模型由以下几部分组成：",[49,31710,31711,31714,31717],{},[52,31712,31713],{},"Hub：是企业的核心业务实体，由实体key、数据仓库序列代理键、装载时间、数据来源组成。（骨架）",[52,31715,31716],{},"Link：代表Hub之间的关系。这里与ER模型最大的区别是将关系作为一个独立的单元抽象，可以提升模型的扩展性。它可以直接描述1: 1、l:n和n:n的关系，而不需要做任何变更。它由Hub的代理键、装载时间、数据来源组成。（韧带）",[52,31718,31719],{},"Satellite：是Hub的详细描述内容，一个Hub可以有多个Satellite。它由Hub的代理键、装载时间、来源类型、详细的Hub描述信息组成。（血肉）",[13,31721,31722],{},"Data Vault模型比ER模型更容易设计和产出，它的ETL加工可实现配置化。",[10548,31724,31726],{"id":31725},"_4anchor模型","（4）Anchor模型",[13,31728,31729],{},"Anchor对DataVault模型做了进一步规范化处理规范到6NF，基本变成了k-v结构化模型。我们看一下Anchor模型的组成：",[49,31731,31732,31735,31738,31741],{},[52,31733,31734],{},"Anchors：类似于DataVault的Hub，代表业务实体，且只有主键。",[52,31736,31737],{},"Attributes：功能类似于DataVault的Satellite，但是它更加规范化，将其全部k-v结构化，一个表只有一个Anchors的属性描述。",[52,31739,31740],{},"Ties：就是Anchors之间的关系，单独用表来描述，类似于DataVault的Link，可以提升整体模型关系的扩展能力。",[52,31742,31743],{},"Knots：代表那些可能会在多个Anchors中公用的属性的提炼，比如性别、状态等这种枚举类型且被公用的属性。",[23289,31745],{},[107,31747,31749],{"id":31748},"第九章-阿里巴巴数据整合及管理体系","第九章 阿里巴巴数据整合及管理体系",[13,31751,31752],{},"阿里巴巴集团大数据建设方法论的核心是：从业务架构设计到模型设计，从数据研发到数据服务，做到数据可管理、可追溯、可规避重复建设。",[7759,31754,31755],{"id":31755},"体系架构",[13,31757,31758],{},[617,31759],{"alt":119,"src":31760},"img\u002F9.1.png",[7759,31762,31763],{"id":31763},"基本原则",[49,31765,31766,31774,31777,31785,31788,31791,31794],{},[52,31767,31768,31769],{},"高内聚和低耦合\n",[49,31770,31771],{},[52,31772,31773],{},"一个逻辑或者物理模型由哪些记录和字段组成，应该遵循最基本的软件设计方法论的高内聚和低藕合原则",[52,31775,31776],{},"核心模型与扩展模型分离",[52,31778,31779,31780],{},"公共处理逻辑下沉及单一\n",[49,31781,31782],{},[52,31783,31784],{},"越是底层公用的处理逻辑越应该在数据调度依赖的底层进行封装与实现，不要让公用的处理逻辑暴露给应用层实现，不要让公共逻辑多处同时存在。",[52,31786,31787],{},"成本与性能平衡",[52,31789,31790],{},"数据可回滚",[52,31792,31793],{},"一致性",[52,31795,31796],{},"命名清晰、可理解",[7759,31798,31799],{"id":31799},"模型实施",[10548,31801,31803],{"id":31802},"_1业界常用模型实施过程","（1）业界常用模型实施过程",[49,31805,31806,31823,31837],{},[52,31807,31808,31809],{},"Kimball模型主要探讨需求分析、高层模型、详细模型和模型审查整个过程。",[49,31810,31811,31814,31817,31820],{},[52,31812,31813],{},"高层模型：高层模型设计阶段的直接产出目标是创建高层维度模型图，它是对业务过程中的维表和事实表的图形描述。",[52,31815,31816],{},"详细模型：详细的维度建模过程是为高层模型填补缺失的信息，解决设计问题，并不断测试模型能否满足业务需求，确保模型的完备性。",[52,31818,31819],{},"模型审查、再设计和验证",[52,31821,31822],{},"提交ETL设计和开发",[52,31824,31825,31826],{},"Inmon对数据模型的定位是：扮演着通往数据仓库其他部分的智能路线图的角色。",[49,31827,31828,31831,31834],{},[52,31829,31830],{},"ERD层是数据模型的最高层，该层描述了公司业务中的实体或主题域以及它们之间的关系；",[52,31832,31833],{},"ERD层是中间层，该层描述了数据模型中的关键字、属性以及细节数据之间的关系；",[52,31835,31836],{},"物理层是数据建模的最底层，该层描述了数据模型的物理特性。",[52,31838,31839,31840],{},"其他模型",[49,31841,31842,31845,31848,31851],{},[52,31843,31844],{},"业务建模",[52,31846,31847],{},"领域建模",[52,31849,31850],{},"逻辑建模",[52,31852,31853],{},"物理建模",[10548,31855,31857],{"id":31856},"_2onedata实施过程","（2）OneData实施过程",[13,31859,31860],{},[617,31861],{"alt":119,"src":31862},"img\u002F9.2.png",[13,31864,31865],{},"OneData的实施过程是一个高度迭代和动态的过程，一般采用螺旋式实施方法。在总体架构设计完成之后，开始根据数据域进行迭代式模型设计和评审。在架构设计、规范定义和模型设计等模型实施过程中，都会引人评审机制，以确保模型实施过程的正确性。",[23289,31867],{},[107,31869,31871],{"id":31870},"第十章-维度设计","第十章 维度设计",[7759,31873,31875],{"id":31874},"_1维度设计基础","1、维度设计基础",[10548,31877,31879],{"id":31878},"_1基本概念","（1）基本概念",[13,31881,31882],{},"维度是维度建模的基础和灵魂。在维度建模中，将度量称为“事实”，将环境描述为“维度”，维度是用于分析事实所需要的多样环境。",[13,31884,31885],{},"维度所包含的表示维度的列，称为维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源，是数据易用性的关键。",[10548,31887,31889],{"id":31888},"_2基本设计方法","（2）基本设计方法",[49,31891,31892,31895,31898,31901],{},[52,31893,31894],{},"选择维度或新建维度。作为维度建模的核心，在企业级数据仓库中必须保证维度的唯一性。",[52,31896,31897],{},"确定主维表。此处的主维表一般是ODS表，直接与业务系统同步。",[52,31899,31900],{},"确定相关维表。数据仓库是业务源系统的数据整合，不同业务系统或者同一业务系统中的表之间存在关联性。根据对业务的梳理，确定哪些表和主维表存在关联关系，并选择其中的某些表用于生成维度属性。",[52,31902,31903],{},"确定维度属性。本步骤主要包括两个阶段，其中第一个阶段是从主维表中选择维度属性或生成新的维度属性；第二个阶段是从相关维表中选择维度属性或生成新的维度属性。",[10548,31905,31907],{"id":31906},"_3规范化和反规范化","（3）规范化和反规范化",[13,31909,31910],{},"当属性层次被实例化为一系列维度，而不是单一的维度时，被称为雪花模式。大多数联机事务处理系统（OLTP）的底层数据结构在设计时采用此种规范化技术，通过规范化处理将重复属性移至其自身所属的表中，删除冗余数据。（规范化）",[13,31912,31913],{},"将维度的属性层次合并到单个维度中的操作称为反规范化。分析系统的主要目的是用于数据分析和统计，如何更方便用户进行统计分析决定了分析系统的优劣。采用雪花模式，用户在统计分析的过程中需要大量的关联操作，使用复杂度高，同时查询性能很差；而采用反规范化处理，则方便、易用且性能好。（反规范化）",[8366,31915,31916,31925],{},[8369,31917,31918],{},[8372,31919,31920,31922],{},[8375,31921,29763],{"align":9247},[8375,31923,31924],{"align":9247},"反规范化",[8386,31926,31927,31935,31943,31951],{},[8372,31928,31929,31932],{},[8391,31930,31931],{"align":9247},"可读性不强",[8391,31933,31934],{"align":9247},"方便、易用（可读性强）",[8372,31936,31937,31940],{},[8391,31938,31939],{"align":9247},"性能低（需要大量关联）",[8391,31941,31942],{"align":9247},"性能高",[8372,31944,31945,31948],{},[8391,31946,31947],{"align":9247},"节约存储",[8391,31949,31950],{"align":9247},"数据冗余",[8372,31952,31953,31956],{},[8391,31954,31955],{"align":9247},"复杂性高",[8391,31957,31958],{"align":9247},"复杂性低",[10548,31960,31962],{"id":31961},"_4一致性维度","（4）一致性维度",[49,31964,31965,31968,31971],{},[52,31966,31967],{},"共享维表。比如在阿里巴巴的数据仓库中，商品、卖家、买家、类目等维度有且只有一个。所以基于这些公共维度进行的交叉探查不会存在任何问题。",[52,31969,31970],{},"一致性上卷，其中一个维度的维度属性是另一个维度的维度属性的子集，且两个维度的公共维度属性结构和内容相同。比如在阿里巴巴的商品体系中，有商品维度和类目维度，其中类目维度的维度属性是商品维度的维度属性的子集，且有相同的维度属性和维度属性值。这样基于类目维度进行不同业务过程的交叉探查也不会存在任何问题。",[52,31972,31973],{},"交叉属性，两个维度具有部分相同的维度属性。比如在商品维度中具有类目属性，在卖家维度中具有主营类目属性，两个维度具有相同的类目属性，则可以在相同的类目属性上进行不同业务过程的交叉探查。",[7759,31975,31977],{"id":31976},"_2维度设计高级主题","2、维度设计高级主题",[10548,31979,31981],{"id":31980},"_1维度整合","（1）维度整合",[49,31983,31984,31987],{},[52,31985,31986],{},"垂直整合，即不同的来源表包含相同的数据集，只是存储的信息不同。",[52,31988,31989],{},"水平整合，即不同的来源表包含不同的数据集，不同子集之间无交叉，也可以存在部分交叉。",[10548,31991,31993],{"id":31992},"_2数据模型设计过程","（2）数据模型设计过程：",[49,31995,31996,31999,32002],{},[52,31997,31998],{},"扩展性：当源系统、业务逻辑变化时，能通过较少的成本快速扩展模型，保持核心模型的相对稳定性。软件工程中的高内聚、低稠合的思想是重要的指导方针之一。",[52,32000,32001],{},"效能：在性能和成本方面取得平衡。通过牺牲一定的存储成本，达到性能和逻辑的优化。",[52,32003,32004],{},"易用性：模型可理解性高、访问复杂度低。用户能够方便地从模型中找到对应的数据表，并能够方便地查询和分析。",[10548,32006,32008],{"id":32007},"_3水平拆分","（3）水平拆分",[49,32010,32011,32014],{},[52,32012,32013],{},"维度的不同分类的属性差异情况。当维度属性随类型变化较大时，将所有可能的属性建立在一个表中是不切合实际的，也没有必要这样做，此时建议采用将维度的不同分类实例化为不同的维度，同时在主维度中保存公共属性。定义一个主维度用于存放公共属性；同时定义多个子维度，其中除了包含公共属性外，还包含各自的特殊属性。",[52,32015,32016],{},"业务的关联程度。两个相关性较低的业务，稠合在一起弊大于利，对模型的稳定性和易用性影响较大。此时建议采用维护单一维度。",[10548,32018,32020],{"id":32019},"_4垂直拆分","（4）垂直拆分",[13,32022,32023],{},"某些维度属性的来源表产出时间较早，而某些维度属性的来源表产出时间较晚；或者某些维度属性的热度高、使用频繁，而某些维度属性的热度低、较少使用；或者某些维度属性经常变化，而某些维度属性比较稳定",[13,32025,32026],{},"出于扩展性、产出时间、易用性等方面的考虑，设计主从维度。主维表存放稳定、产出时间早、热度高的属性；从维表存放变化较快、产出时间晚、热度低的属性。",[13,32028,32029],{},"通过存储的冗余和计算成本的增加，实现了商品主模型的稳定和产出时间的提前，对于整个数据仓库的稳定和下游应用的产出都有较大意义。",[7759,32031,32033],{"id":32032},"_3维度变化","3、维度变化",[10548,32035,32037],{"id":32036},"_1缓慢变化堆","（1）缓慢变化堆",[49,32039,32040,32043,32046],{},[52,32041,32042],{},"重写维度值。采用此种方式，不保留历史数据，始终取最新数据。",[52,32044,32045],{},"插人新的维度行。采用此种方式，保留历史数据，维度值变化前的事实和过去的维度值关联，维度值变化后的事实和当前的维度值关联。",[52,32047,32048],{},"添加维度列。采用第二种处理方式不能将变化前后记录的事实归一为变化前的维度或者归一为变化后的维度。",[10548,32050,32052],{"id":32051},"_2快照维表","（2）快照维表",[13,32054,32055],{},"优点：",[49,32057,32058,32061],{},[52,32059,32060],{},"简单而有效，开发和维护成本低。",[52,32062,32063],{},"使用方便，理解性好。数据使用方只需要限定日期，即可获取到当天的快照数据。任意一天的事实快照和维度快照通过维度的自然键进行关联即可。",[13,32065,32066],{},"弊端主要体现在存储的极大浪费上。比如某维度，每天的变化量占总体数据量的比例很低，在极端情况下，每天无变化，使得存储浪费很严重。此方法主要就是实现了牺牲存储获取ETL效率的优化和逻辑上的简化。但是一定要杜绝过度使用这种方法，而且必须要有对应的数据生命周期制度，清除无用的历史数据。",[10548,32068,32070],{"id":32069},"_3极限存储","（3）极限存储",[49,32072,32073,32081],{},[52,32074,32075,32076],{},"透明化\n",[49,32077,32078],{},[52,32079,32080],{},"底层的数据还是历史拉链存储，但是上层做一个视图操作或者在Hive里做一个hook，通过分析语句的语法树，把对极限存储前的表的查询转换成对极限存储表的查询。对于下游用户来说，极限存储表和全量存储方式是一样的。",[52,32082,32083,32084],{},"分月做历史拉链表\n",[49,32085,32086],{},[52,32087,32088],{},"用极限存储的处理方式，极大地压缩了全量存储的成本，又可以达到对下游用户透明的效果，是一种比较理想的存储方式。但是其本身也有一定的局限性，首先，其产出效率很低，大部分极限存储通常需要t-2；其次，对于变化频率高的数据并不能达到节约成本的效果。因此，在实际生产中，做极限存储需要进行一些额外的处理。",[10548,32090,32092],{"id":32091},"_4微型维度","（4）微型维度",[49,32094,32095,32098,32101],{},[52,32096,32097],{},"微型维度的局限性。微型维度是事先用所有可能值的组合加载的，需要考虑每个属性的基数，且必须是枚举值。很多属性可能是非枚举型，比如数值类型，如VIP分数、信用分数等；时间类型，如上架时间、下架时间、变更时间等。",[52,32099,32100],{},"ETL逻辑复杂。对于分布式系统，生成代理键和使用代理键进行ETL加工都非常复杂，ETL开发和维护成本过高。",[52,32102,32103],{},"破坏了维度的可浏览性。买家维度和微型维度通过事实表建立联系，无法基于VIP等级、信用等级进行浏览和统计。可以通过在买家维度中添加引用微型维度的外键部分来解决此问题，但带来的问题是微型维度未维护历史信息。",[23289,32105],{},[107,32107,32109],{"id":32108},"第十一章-事实表设计","第十一章 事实表设计",[7759,32111,32113],{"id":32112},"_1事实表基础","1、事实表基础",[13,32115,32116],{},"事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述：一种是维度属性组合所表示的细节程度：一种是所表示的具体业务含义。",[13,32118,32119],{},"事实表有三种类型：事务事实表、周期快照事实表和累积快照事实表。事务事实表用来描述业务过程，跟踪空间或时间上某点的度量事件，保存的是最原子的数据，也称为“原子事实表“周期快照事实表以具有规律性的、可预见的时间间隔记录事实，时间间隔如每天、每月、每年等。累积快照事实表用来表述过程开始和结束之间的关键步骤事件，覆盖过程的整个生命周期，通常具有多个日期字段来记录关键时间点，当过程随着生命周期不断变化时，记录也会随着过程的变化而被修改。",[10548,32121,32123],{"id":32122},"_1设计原则","（1）设计原则",[13,32125,32126],{},"原则1：尽可能包含所有与业务过程相关的事实",[13,32128,32129],{},"原则2：只选择与业务过程相关的事实",[13,32131,32132],{},"原则3：分解不可加性事实为可加的组件",[13,32134,32135],{},"原则4：在选择维度和事实之前必须先声明粒度",[13,32137,32138],{},"原则5：在同一个事实表中不能有多种不同粒度的事实",[13,32140,32141],{},"原则6：事实的单位要保持一致",[13,32143,32144],{},"原则7：对事实的null值要处理",[13,32146,32147],{},"原则8：使用退化维度提高事实表的易用性",[10548,32149,32151],{"id":32150},"_2设计方法","（2）设计方法",[13,32153,32154],{},"第一步：选择业务过程及确定事实表类型。",[13,32156,32157],{},"第二步：声明粒度。",[13,32159,32160],{},"第三步：确定维度。",[13,32162,32163],{},"第四步．确定事实。",[13,32165,32166],{},"第五步．冗余维度。",[7759,32168,32170],{"id":32169},"_2事务事实表","2、事务事实表",[10548,32172,32174],{"id":32173},"_1单事务事实表","（1）单事务事实表",[13,32176,32177],{},"单事务事实表，顾名思义，即针对每个业务过程设计一个事实表。这样设计的优点不言而喻，可以方便地对每个业务过程进行独立的分析研究。",[10548,32179,32181],{"id":32180},"_2多事务事实表","（2）多事务事实表",[13,32183,32184],{},"多事务事实表，将不同的事实放到同一个事实表中，即同一个事实表包含不同的业务过程。多事务事实表在设计时有两种方法进行事实的处理：①不同业务过程的事实使用不同的事实字段进行存放：①不同业务过程的事实使用同一个事实字段进行存放，但增加一个业务过程标签。",[10548,32186,32188],{"id":32187},"_3两种事务事实表得选择","（3）两种事务事实表得选择",[49,32190,32191,32194],{},[52,32192,32193],{},"当不同业务过程的度量比较相似、差异不大时，可以采用第二种多事务事实表的设计方式，使用同一个字段来表示度量数据。但这种方式存在一个问题一一在同一个周期内会存在多条记录。",[52,32195,32196],{},"当不同业务过程的度量差异较大时，可以选择第一种多事务事实表的设计方式，将不同业务过程的度量使用不同字段冗余到表中，非当前业务过程则置零表示。这种方式所存在的问题是度量字段零值较多。",[10548,32198,32200],{"id":32199},"_4对比","（4）对比",[8366,32202,32203,32215],{},[8369,32204,32205],{},[8372,32206,32207,32209,32212],{},[8375,32208],{"align":9247},[8375,32210,32211],{"align":9247},"单事务事实表",[8375,32213,32214],{"align":9247},"多事务事实表",[8386,32216,32217,32228,32239,32250,32261],{},[8372,32218,32219,32222,32225],{},[8391,32220,32221],{"align":9247},"业务过程",[8391,32223,32224],{"align":9247},"一个业务过程建立一个事实表，只反映一个业务过程的事实",[8391,32226,32227],{"align":9247},"在同一个事实表中反映多个业务过程",[8372,32229,32230,32233,32236],{},[8391,32231,32232],{"align":9247},"粒度和维度",[8391,32234,32235],{"align":9247},"粒度不同",[8391,32237,32238],{"align":9247},"不同业务过程的粒度相同，同时拥有相似的维度",[8372,32240,32241,32244,32247],{},[8391,32242,32243],{"align":9247},"事实",[8391,32245,32246],{"align":9247},"过程的事实较多，同时不同业务过程的事实不相同",[8391,32248,32249],{"align":9247},"导致零值或空值字段较多",[8372,32251,32252,32255,32258],{},[8391,32253,32254],{"align":9247},"下游业务使用",[8391,32256,32257],{"align":9247},"关注哪个业务过程就使用相应的事务事实表",[8391,32259,32260],{"align":9247},"包含多个业务过程",[8372,32262,32263,32266,32268],{},[8391,32264,32265],{"align":9247},"计算存储成本",[8391,32267],{"align":9247},[8391,32269,32270],{"align":9247},"加工计算成本较低，同时在存储上也相对节省",[13,32272,32273],{},"简表：",[13,32275,32276],{},[617,32277],{"alt":119,"src":32278},"img\u002F11.1.png",[10548,32280,32282],{"id":32281},"_5设计准则","（5）设计准则",[49,32284,32285,32288,32291],{},[52,32286,32287],{},"事实完整性：事实表包含与其描述的过程有关的所有事实，即尽可能多地获取所有的度量。",[52,32289,32290],{},"事实一致性：在确定事务事实表的事实时，明确存储每一个事实以确保度量的一致性。",[52,32292,32293],{},"事实可加性：事实表确定事实时，往往会遇到非可加性度量，比如分摊比例、利润率等，虽然它们也是下游分析的关键点，但往往在事务事实表中关注更多的是可加性事实，下游用户在聚合统计时更加方便。",[7759,32295,32297],{"id":32296},"_3周期快照事实表","3、周期快照事实表",[13,32299,32300],{},"快照事实表的设计有一些区别于事务事实表设计的性质。事务事实表的粒度能以多种方式表达，但快照事实表的粒度通常以维度形式声明；事务事实表是稀疏的，但快照事实表是稠密的；事务事实表中的事实是完全可加的，但快照模型将至少包含一个用来展示半可加性质的事实。",[49,32302,32303,32306,32309,32312],{},[52,32304,32305],{},"用快照采样状态：快照事实表以预定的间隔采样状态度量。这种间隔联合一个或多个维度，将被用来定义快照事实表的粒度，每行都将包含记录所涉及状态的事实。",[52,32307,32308],{},"快照粒度：事务事实表的粒度可以通过业务过程中所涉及的细节程度来描述，但快照事实表的粒度通常总是被多维声明，可以简单地理解为快照需要采样的周期以及什么将被采样。",[52,32310,32311],{},"密度与稀疏性：事务事实表是稀疏的，只有当天发生的业务过程，事实表才会记录该业务过程的事实，如下单、支付等；而快照事实表是稠密的，无论当天是否有业务过程发生，都会记录一行，比如针对卖家的历史至今的下单和支付金额，无论当天卖家是否有下单支付事实，都会给该卖家记录一行。",[52,32313,32314],{},"半可加性：与事务事实表的可加性事实不同，半可加性事实不能根据时间维度获得有意义的汇总结果。",[10548,32316,32317],{"id":32317},"注意事项",[49,32319,32320,32323,32326],{},[52,32321,32322],{},"事务与快照成对设计：数据仓库维度建模时，对于事务事实表和快照事实表往往都是成对设计的，互相补充，以满足更多的下游统计分析需求，特别是在事务事实表的基础上可以加工快照事实表。",[52,32324,32325],{},"附加事实：快照事实表在确定状态度量时，一般都是保存采样周期结束时的状态度量。",[52,32327,32328],{},"周期到日期度量",[7759,32330,32332],{"id":32331},"_4累计快照事实表","4、累计快照事实表",[10548,32334,32336],{"id":32335},"_1设计过程","（1）设计过程",[49,32338,32339,32342,32345,32348,32351],{},[52,32340,32341],{},"选择业务过程",[52,32343,32344],{},"确定粒度",[52,32346,32347],{},"确定维度",[52,32349,32350],{},"确定事实",[52,32352,32353],{},"退化为度",[10548,32355,32357],{"id":32356},"_2特点","（2）特点",[49,32359,32360,32363],{},[52,32361,32362],{},"数据不断更新：事务事实表记录事务发生时的状态，对于实体的某一实例不再更新z而累积快照事实表则对实体的某一实例定期更新。",[52,32364,32365],{},"多业务过程日期：累积快照事实表的典型特征是多业务过程日期，用于计算业务过程之间的时间间隔。",[7759,32367,32369],{"id":32368},"_5三种事实表的比较","5、三种事实表的比较",[13,32371,32372],{},[617,32373],{"alt":119,"src":32374},"img\u002F11.2.png",[7759,32376,32378],{"id":32377},"_6无事实的事实表","6、无事实的事实表",[49,32380,32381,32384],{},[52,32382,32383],{},"事件类的，记录事件的发生。常见的是日志类事实表。",[52,32385,32386],{},"条件、范围或资格类的，记录维度与维度多对多之间的关系。",[7759,32388,32390],{"id":32389},"_7聚集型事实表","7、聚集型事实表",[10548,32392,32394],{"id":32393},"_1基本原则","（1）基本原则",[49,32396,32397,32400,32403],{},[52,32398,32399],{},"一致性：聚集表必须提供与查询明细粒度数据一致的查询结果。",[52,32401,32402],{},"避免单一表设计：不要在同一个表中存储不同层次的聚集数据；否则将会导致双重计算或出现更糟糕的事情。",[52,32404,32405],{},"聚集粒度可不同：聚集并不需要保持与原始明细粒度数据一样的粒度，聚集只关心所需要查询的维度。",[10548,32407,32409],{"id":32408},"_2基本步骤","（2）基本步骤",[13,32411,32412],{},"第一步：确定聚集维度。",[13,32414,32415],{},"第二步：确定一致性上钻。",[13,32417,32418],{},"第三步：确定聚集事实。",[10548,32420,32422],{"id":32421},"_3补充说明","（3）补充说明",[49,32424,32425,32428],{},[52,32426,32427],{},"聚集是不跨越事实的：聚集是针对原始星形模型进行的汇总，为了获取和查询与原始模型一致的结果，聚集的维度和度量必须与原始模型保持一致，因此聚集是不跨越事实的。",[52,32429,32430],{},"聚集带来的问题：聚集会带来查询性能的提升，但聚集也会增加ETL维护的难度。当子类目对应的一级类目发生变更时，先前存在的、已经被汇总到聚集表中的数据需要被重新调整。",[23289,32432],{},[107,32434,32436],{"id":32435},"第十二章-元数据","第十二章 元数据",[13,32438,32439],{},"按照传统的定义，元数据（Metadata）是关于数据的数据。元数据打通了源数据、数据仓库、数据应用，记录了数据从产生到消费的全过程。元数据主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。在数据仓库系统中，元数据可以帮助数据仓库管理员和开发人员非常方便地找到他们所关心的数据，用于指导其进行数据管理和开发工作，提高工作效率。",[13,32441,32442],{},"将元数据按用途的不同分为两类：技术元数据（Technical Metadata) 和业务元数据（Business Metadata）。",[13,32444,32445],{},"元数据有重要的应用价值，是数据管理、数据内容、数据应用的基础，在数据管理方面为集团数据提供在计算、存储、成本、质量、安全、模型等治理领域上的数据支持。",[7759,32447,32449],{"id":32448},"_1统一元数据体系建设思路","1、统一元数据体系建设思路",[13,32451,32452],{},[617,32453],{"alt":119,"src":32454},"img\u002F12.1.png",[7759,32456,32458],{"id":32457},"_2元数据应用","2、元数据应用",[13,32460,32461],{},"数据的真正价值在于数据驱动决策，通过数据指导运营。通过数据驱动的方法，我们能够判断趋势，从而展开有效行动，帮助自己发现问题，推动创新或解决方案的产生。这就是数据化运营。同样，对于元数据，可以用于指导数据相关人员进行日常工作，实现数据化“运营”。",[23289,32463],{},[107,32465,32467],{"id":32466},"第十三章-计算管理","第十三章 计算管理",[7759,32469,32471],{"id":32470},"_1系统优化","1、系统优化",[10548,32473,32475],{"id":32474},"_1堆优化器hboheap-based-optimizer","（1）堆优化器HBO（Heap-Based Optimizer）",[13,32477,32478],{},"HBO是根据任务历史执行情况为任务分配更合理的资源，包括内存、CPU以及Instance个数。HBO是对集群资源分配的一种优化，概括起来就是：任务执行历史＋集群状态信息＋优化规则→更优的执行配置。",[13,32480,32481],{},[22,32482,32483],{},"原理：",[49,32485,32486,32497,32508],{},[52,32487,32488,32489],{},"基础资源数量的逻辑：",[49,32490,32491,32494],{},[52,32492,32493],{},"对于Map Task，系统需要初始化不同的输入数据量，根据期望的每个Map能处理的数据量，再结合用户提交任务的输入数据量，就可以估算出用户提交的任务所需要的Map数量。",[52,32495,32496],{},"对于Reduce Task，比较Hive使用Map输入数据量，MaxCompute使用最近7天Reduce对应Map的平均输出数据量作为Reduce的输入数据量，用于计算Instance的数量。对于Reduce个数的估算与Map估算基本相同。",[52,32498,32499,32500],{},"加权资源数量的逻辑",[49,32501,32502,32505],{},[52,32503,32504],{},"于Map Task，系统需要初始化期望的每个Map能处理的数据量。通过该Map在最近一段时间内的平均处理速度与系统设定的期望值做比较，如果平均处理速度小于期望值，则按照同等比例对基础资源数量进行加权，估算出该Map的加权资源数量。",[52,32506,32507],{},"对于ReduceTask，方法同上。",[52,32509,32510,32511],{},"最终的Instance个数为：基础资源估算值＋加权资源估算值。",[49,32512,32513],{},[52,32514,32515],{},"CPU／内存分配逻辑：类似于Instance分配逻辑，也是采用基础资源估算值＋加权资源估算值的方法。",[13,32517,32518],{},[22,32519,32520],{},"效果：",[49,32522,32523,32526,32529,32532],{},[52,32524,32525],{},"提高CPU利用率",[52,32527,32528],{},"提高内存利用率",[52,32530,32531],{},"提高Instance并发数",[52,32533,32534],{},"降低执行时长",[10548,32536,32538],{"id":32537},"_2基于代价的优化方式cbocost-based-optimization","（2）基于代价的优化方式CBO（Cost-Based Optimization）",[13,32540,32541],{},"根据收集的统计信息来计算每种执行方式的代价，进而选择最优的执行方式。",[13,32543,32544],{},[22,32545,32483],{},[49,32547,32548,32556,32567,32575],{},[52,32549,32550,32551],{},"Meta Manager",[49,32552,32553],{},[52,32554,32555],{},"Meta模块主要提供元数据信息，包括表的元数据、统计信息元数据等。当优化器在选择计划时，需要根据元数据的一些信息进行优化。",[52,32557,32558,32559],{},"Statistics",[49,32560,32561,32564],{},[52,32562,32563],{},"Statistics主要是帮助优化器选择计划时，提供准确的统计信息。",[52,32565,32566],{},"优化器提供了UDF来收集统计信息，包括Distinct值、TopN值等，而Count值等统计信息是由底层Meta直接提供的。",[52,32568,32569,32570],{},"Rule Set",[49,32571,32572],{},[52,32573,32574],{},"优化规则是根据不同情况选择不同的优化点，然后由优化器根据代价模型（CostModel ）来选择启用哪些优化规则。",[52,32576,32577,32578],{},"Volcano Planner Core",[49,32579,32580],{},[52,32581,32582],{},"Volcano Planner是整个优化器的灵魂，它会将所有信息（Meta信息、统计信息、规则）统一起来处理，然后根据代价模型的计算，获得一个最优计划。",[13,32584,32585],{},[22,32586,32587],{},"新特性：",[49,32589,32590,32593],{},[52,32591,32592],{},"重新排序Join：将Join的所有不同输入进行一个全排列，然后找到代价最小的一个排列。",[52,32594,32595],{},"自动MapJoin：自动MapJoin充分利用优化器的代价模型进行估算，获得更优的MapJoin方式，而不是通过Hint方式来进行处理。",[7759,32597,32599],{"id":32598},"_2任务优化","2、任务优化",[10548,32601,32603],{"id":32602},"_1map倾斜","（1）Map倾斜",[13,32605,32606],{},"在Map端读数据时，由于读入数据的文件大小分布不均匀，因此会导致有些Map Instance读取并且处理的数据特别多，而有些Map Instance处理的数据特别少，造成Map端长尾。",[13,32608,32609],{},[22,32610,32611],{},"常见的倾斜场景：",[49,32613,32614,32617],{},[52,32615,32616],{},"上游表文件的大小特别不均匀，并且小文件特别多，导致当前表Map端读取的数据分布不均匀，引起长尾。",[52,32618,32619],{},"Map端做聚合时，由于某些Map Instance读取文件的某个值特别多而引起长尾，主要是指Count Distinct操作。",[13,32621,32622],{},[22,32623,32624],{},"解决方案：",[13,32626,32627],{},"第一种情况导致的Map端长尾，可通过对上游合并小文件，同时调节本节点的小文件的参数来进行优化，即通过设置“set odps.sql. mapper.merge.limit.size=64”和“set odps.sql.mapper.split.size=256”两个参数来调节，其中第一个参数用于调节Map任务的Map Instance的个数：第二个参数用于调节单个Map Instance读取的小文件个数，防止由于小文件过多导致Map Instance读取的数据量很不均匀；两个参数配合调整。",[13,32629,32630],{},"第二种情况通过“distribute by rand()”会将Map端分发后的数据重新按照随机值再进行一次分发。原先不加随机分发函数时，Map阶段需要与使用Map Join的小表进行笛卡儿积操作，Map端完成了大小表的分发和笛卡儿积操作。使用随机分布函数后，Map端只负责数据的分发，不再有复杂的聚合或者笛卡儿积操作，因此不会导致Map端长尾。",[10548,32632,32634],{"id":32633},"_2join倾斜","（2）Join倾斜",[13,32636,32637],{},"如果某个Key上的数据量比较大，则会导致该Instance执行时间较长。其表现为：在执行日志中该Join Task的大部分Instance都已执行完成，但少数几个Instance一直处于执行中（这种现象称之为长尾）。",[13,32639,32640],{},[22,32641,32611],{},[49,32643,32644,32647,32650],{},[52,32645,32646],{},"Join的某路输入比较小，可以采用Map Join，避免分发引起长尾。",[52,32648,32649],{},"Join的每路输入都较大，且长尾是空值导致的，可以将空值处理成随机值，避免聚集。",[52,32651,32652],{},"Join的每路输入都较大，且长尾是热点值导致的，可以对热点值和非热点值分别进行处理，再合并数据。",[13,32654,32655],{},[22,32656,32624],{},[49,32658,32659,32667,32675],{},[52,32660,32661,32662],{},"MapJoin方案",[49,32663,32664],{},[52,32665,32666],{},"Join倾斜时，如果某路输入比较小，则可以采用MapJoin避免倾斜。MapJoin的原理是将Join操作提前到Map端执行，将小表读入内存，顺序扫描大表完成Join。这样可以避免因为分发key不均匀导致数据倾斜。",[52,32668,32669,32670],{},"Join因为空值导致长尾",[49,32671,32672],{},[52,32673,32674],{},"将空值处理成随机值。因为空值无法关联上，只是分发到一处，因此处理成随机值既不会影响关联结果，也能很好地避免聚焦导致长尾。",[52,32676,32677,32678],{},"Join因为热点值导致长尾",[49,32679,32680,32683,32686,32689],{},[52,32681,32682],{},"取热点key",[52,32684,32685],{},"取出非热点数据",[52,32687,32688],{},"取出热点数据",[52,32690,32691],{},"将上面取到的非热点数据和热点数据通过“unionall”合并后即得到完整的日志数据，并且关联了商品信息",[10548,32693,32695],{"id":32694},"_3reduce倾斜","（3）Reduce倾斜",[13,32697,32698],{},"Distinct操作，数据无法在Map端的Shuffle阶段根据GroupBy 先做一次聚合操作，以减少传输的数据量，而是将所有的数据都传输到Reduce端，当key的数据分发不均匀时，就会导致Reduce端长尾。",[13,32700,32701],{},[22,32702,32611],{},[49,32704,32705,32708,32711,32714],{},[52,32706,32707],{},"对同一个表按照维度对不同的列进行Count Distinct操作，造成Map端数据膨胀，从而使得下游的Join和Reduce出现链路上的长尾。",[52,32709,32710],{},"Map端直接做聚合时出现key值分布不均匀，造成Reduce端长尾。",[52,32712,32713],{},"动态分区数过多时可能造成小文件过多，从而引起Reduce端长尾。",[52,32715,32716],{},"多个Distinct同时出现在一段SQL代码中时，数据会被分发多次，不仅会造成数据膨胀N倍，还会把长尾现象放大N倍。",[13,32718,32719],{},[22,32720,32624],{},[13,32722,32723],{},"第二种情况，可以对热点key进行单独处理，然后通过“UnionAll”合并。（参考“Join倾斜”）",[13,32725,32726],{},"第三种情况，可以把符合不同条件的数据放到不同的分区，避免通过多次“InsertOverwrite，，写人表中，特别是分区数比较多时，能够很好地简化代码。",[13,32728,32729],{},"第四种情况，可以先分别进行查询，执行GroupBy原表粒度+ id，然后在子查询外GroupBy原表粒度，最后进行Join操作。（拆分再合并）",[23289,32731],{},[107,32733,32735],{"id":32734},"第十四章-存储和成本管理","第十四章 存储和成本管理",[13,32737,32738],{},"在大数据时代，移动互联、社交网络、数据分析、云服务等应用迅速普及，对数据中心提出了革命性的需求，存储管理已经成为IT核心之一。对于数据爆炸式的增长，存储管理也将面临着一系列挑战。如何有效地降低存储资源的消耗，节省存储成本，将是存储管理孜孜追求的目标。",[107,32740,32742],{"id":32741},"第十五章-数据质量","第十五章 数据质量",[13,32744,32745],{},"随着IT向DT时代的转变，数据的重要性不言而喻，数据的应用也日趋繁茂，数据正扮演着一个极其重要的角色。数据质量是数据分析结论有效性和准确性的基础，也是这一切的前提。",[7759,32747,32749],{"id":32748},"_1数据质量保障原则","1、数据质量保障原则",[49,32751,32752,32755,32758,32761],{},[52,32753,32754],{},"完整性：完整性是指数据的记录和信息是否完整，是否存在缺失的情况。",[52,32756,32757],{},"准确性：准确性是指数据中记录的信息和数据是否准确，是否存在异常或者错误的信息。",[52,32759,32760],{},"一致性：一致性一般体现在跨度很大的数据仓库体系中，对于同一份数据，必须保证一致性。",[52,32762,32763],{},"及时性：在确保数据的完整性、准确性和一致性后，接下来就要保障数据能够及时产出，这样才能体现数据的价值。",[7759,32765,32767],{"id":32766},"_2数据质量方法","2、数据质量方法",[13,32769,32770],{},[617,32771],{"alt":119,"src":32772},"img\u002F15.1.png",[7759,32774,32776],{"id":32775},"_3数据资产等级定义","3、数据资产等级定义",[49,32778,32779,32782,32785,32788,32791],{},[52,32780,32781],{},"毁灭性质，即数据一旦出错，将会引起重大资产损失，面临重大收益损失，造成重大公关风险。",[52,32783,32784],{},"全局性质，即数据直接或者间接用于集团级业务和效果的评估、重要平台的运维、对外数据产品的透露、影响用户在网站的行为等。",[52,32786,32787],{},"局部性质，即数据直接或间接用于内部一般数据产品或者运营／产品报告，如果出现问题会给事业部或业务线造成影响，或者造成工作效率损失。",[52,32789,32790],{},"一般性质，即数据主要用于小二的日常数据分析，出现问题几乎不会带来影响或者带来的影响极小。",[52,32792,32793],{},"未知性质，不能明确说出数据的应用场景，则标注为未知。",[23289,32795],{},[107,32797,32799],{"id":32798},"第十六章-数据应用","第十六章 数据应用",[7759,32801,32803],{"id":32802},"_1生意参谋","1、生意参谋",[10548,32805,32807],{"id":32806},"_1看我情","（1）看我情",[13,32809,32810],{},"在生意参谋上，“我情”的数据主要基于店铺经营全链路的各个环节进行设计。以“经营分析”为例，这个板块依次为商家提供流量、商品、交易、服务、物流、营销等不同环节的数据服务，不同服务还能再往下细分，如在“流量分析”下，还会再提供流量地图、访客分析、装修分析等更细粒度的数据。",[10548,32812,32814],{"id":32813},"_2看行情","（2）看行情",[13,32816,32817],{},"生意参谋通过市场行情，为商家提供了行业维度的大盘分析，包括行业洞察、搜索词分析、人群画像等。其中，行业洞察可以从品牌、产品、属性、商品、店铺等粒度对本行业数据进行分析：通过搜索词分析可以了解不同关键词的近日表现，从而反推消费者偏好；人群画像能从人群维度人手，直接提供买家人群、卖家人群、搜索人群三大人群的数据洞察信息。",[10548,32819,32821],{"id":32820},"_3看敌情","（3）看敌情",[13,32823,32824],{},"在保障商家隐私和数据安全的前提下提供竞争分析。",[10548,32826,32828],{"id":32827},"_4架构图","（4）架构图",[13,32830,32831],{},[617,32832],{"alt":119,"src":32833},"img\u002F16.1.png",[10548,32835,32837],{"id":32836},"_5全景图","（5）全景图",[13,32839,32840],{},[617,32841],{"alt":119,"src":32842},"img\u002F16.2.png",[7759,32844,32846],{"id":32845},"_2对内数据产品平台","2、对内数据产品平台",[13,32848,32849],{},"通过数据产品将数据转化为用户更优做决策和行动的依据。数据产品有多种形态，包括最简单常见的报表（如静态报表、Dashboard等简单统计分析）、多维分析（OLAP、即席查询分析等工具型数据产品）、专题分析型数据产品（面向某一类业务场景，沉淀分析思路）、智能型数据应用产品（如个性化搜索、推荐、广告定向推送、精准营销等，这类数据应用产品的发展较为成熟，且大都在数据外面穿了一层外衣，使非专业的用户并不能直观地感受到它是数据产品）",[10548,32851,32853],{"id":32852},"_1整体架构","（1）整体架构",[13,32855,32856],{},[617,32857],{"alt":119,"src":32858},"img\u002F16.3.png",[10548,32860,32862],{"id":32861},"_2数据监控","（2）数据监控",[13,32864,32865],{},"对于所有内部普通运营小二，都有查看或分析业务数据的需求，阿里数据平台提供最基础的报表工具，供用户自助取数、多维分析、DIY个性化数据门户。",[10548,32867,32869],{"id":32868},"_3专题分析","（3）专题分析",[13,32871,32872],{},"对于专题运营小二，如行业运营小二，对类目有强烈的分析诉求，按照分析师沉淀的成熟分析思路组织数据，实现行业运营小二自助分析行业异动原因，发现行业潜在机会，实现“人人都是分析师”，提高数据化运营的效率和质量。",[10548,32874,32876],{"id":32875},"_4应用分析","（4）应用分析",[13,32878,32879],{},"对于很多业务系统的流程，数据是其中不可缺少的一环，通过对接前台系统，实现数据的自动化。",[10548,32881,32883],{"id":32882},"_5数据决策","（5）数据决策",[13,32885,32886],{},"对于高管和决策者，既需要宏观的业务数据，又需要可下沉的数据，还需要丰富的趋势数据来辅助决策，需要通过数据了解业务进展、当前进展是否合理、接下来的业务方向等，针对此类需求提供定制化的数据产品供决策参考，为高管提供宏观决策分析支撑平台，分析历史数据规律，预测未来发展趋势，洞察全行业动态。",[23289,32888],{},{"title":119,"searchDepth":144,"depth":144,"links":32890},[32891,32895,32900,32907,32911,32916,32920,32925,32928,32933,32938,32947,32951,32955,32956,32961],{"id":30341,"depth":132,"text":30342,"children":32892},[32893,32894],{"id":30348,"depth":144,"text":30349},{"id":30356,"depth":144,"text":30357},{"id":30399,"depth":132,"text":30400,"children":32896},[32897,32898,32899],{"id":30403,"depth":144,"text":30404},{"id":30510,"depth":144,"text":30511},{"id":30538,"depth":144,"text":30539},{"id":30567,"depth":132,"text":30568,"children":32901},[32902,32903,32904,32905,32906],{"id":30574,"depth":144,"text":30575},{"id":30592,"depth":144,"text":30593},{"id":30610,"depth":144,"text":30611},{"id":30653,"depth":144,"text":30654},{"id":30684,"depth":144,"text":30685},{"id":30783,"depth":132,"text":30784,"children":32908},[32909,32910],{"id":30787,"depth":144,"text":30788},{"id":30962,"depth":144,"text":30963},{"id":30989,"depth":132,"text":30990,"children":32912},[32913,32914,32915],{"id":31013,"depth":144,"text":31014},{"id":31146,"depth":144,"text":31147},{"id":31233,"depth":144,"text":31234},{"id":31259,"depth":132,"text":31260,"children":32917},[32918,32919],{"id":31263,"depth":144,"text":31264},{"id":31344,"depth":144,"text":31345},{"id":31458,"depth":132,"text":31459,"children":32921},[32922,32923,32924],{"id":31465,"depth":144,"text":31466},{"id":31474,"depth":144,"text":31475},{"id":31523,"depth":144,"text":31524},{"id":31623,"depth":132,"text":31624,"children":32926},[32927],{"id":31647,"depth":144,"text":31648},{"id":31748,"depth":132,"text":31749,"children":32929},[32930,32931,32932],{"id":31755,"depth":144,"text":31755},{"id":31763,"depth":144,"text":31763},{"id":31799,"depth":144,"text":31799},{"id":31870,"depth":132,"text":31871,"children":32934},[32935,32936,32937],{"id":31874,"depth":144,"text":31875},{"id":31976,"depth":144,"text":31977},{"id":32032,"depth":144,"text":32033},{"id":32108,"depth":132,"text":32109,"children":32939},[32940,32941,32942,32943,32944,32945,32946],{"id":32112,"depth":144,"text":32113},{"id":32169,"depth":144,"text":32170},{"id":32296,"depth":144,"text":32297},{"id":32331,"depth":144,"text":32332},{"id":32368,"depth":144,"text":32369},{"id":32377,"depth":144,"text":32378},{"id":32389,"depth":144,"text":32390},{"id":32435,"depth":132,"text":32436,"children":32948},[32949,32950],{"id":32448,"depth":144,"text":32449},{"id":32457,"depth":144,"text":32458},{"id":32466,"depth":132,"text":32467,"children":32952},[32953,32954],{"id":32470,"depth":144,"text":32471},{"id":32598,"depth":144,"text":32599},{"id":32734,"depth":132,"text":32735},{"id":32741,"depth":132,"text":32742,"children":32957},[32958,32959,32960],{"id":32748,"depth":144,"text":32749},{"id":32766,"depth":144,"text":32767},{"id":32775,"depth":144,"text":32776},{"id":32798,"depth":132,"text":32799,"children":32962},[32963,32964],{"id":32802,"depth":144,"text":32803},{"id":32845,"depth":144,"text":32846},{},"TalkingAbout\u002F大数据\u002F1_《大数据之路：阿里巴巴大数据实践》\u002FNo.1大数据.md","\u002Fundergraduate\u002Fnote-2e9f33f0e18d",{"title":30321,"description":119},"undergraduate\u002Fnote-2e9f33f0e18d",[246,23378,10715,6380,23333],"kzV89AyNvfLlSZHnlkKiq-Rj3IKl1Xrw43rhnMica50",{"id":32973,"title":32974,"assetBase":239,"author":8,"body":32975,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":33364,"navigation":128,"originalPath":33365,"path":33366,"seo":33367,"source":23330,"stem":33368,"tags":33369,"weight":250,"__hash__":33370},"content\u002Fundergraduate\u002Fnote-32b16882c171.md","如果不由我来做决策，那么错误决策与我无关",{"type":10,"value":32976,"toc":33349},[32977,32981,32985,32988,32991,32994,33010,33013,33016,33019,33030,33033,33036,33039,33053,33056,33060,33063,33074,33079,33081,33085,33088,33091,33094,33127,33130,33133,33146,33149,33166,33169,33180,33183,33186,33189,33200,33203,33220,33223,33234,33236,33240,33243,33246,33295,33298,33312,33315,33347],[4517,32978,32980],{"id":32979},"避开错误决策的4个陷阱","《避开错误决策的4个陷阱》",[107,32982,32984],{"id":32983},"第一部分-大脑是如何做决策的","第一部分 大脑是如何做决策的",[7759,32986,32987],{"id":32987},"大脑处理决策的功能",[10548,32989,32990],{"id":32990},"模式识别",[13,32992,32993],{},"模式识别帮助我们对接收的信息进行评估，大脑的每个部位关注一种不同的信息并从过去的记忆信息中寻找匹配项。之后大脑的整合功能会接受已经发现的匹配项信号，并对缺失的信息做出估计。",[49,32995,32996,33007],{},[52,32997,32998,32999],{},"意外\n",[49,33000,33001,33004],{},[52,33002,33003],{},"假如我们面对的是不熟悉得信息输入——尤其是那些表面上看起来似曾相识的信息——我们会以为自己辨认出了什么，而事实并非如此，这叫做误导性经验。我们的大脑可能储藏了过去经验的记忆，而那些记忆又与我们接收到的信息相关联，不幸的是，过去的经验可能和当前的情况不一样，对我们造成了误导。",[52,33005,33006],{},"我们的思维在我们接受信息之前就早有判断或是决定先入为主，而之前的判断和决定与当前的情况联系起来。如果这些判断不适用于当前情况，它们就会破坏我们既有的识别功能，误判接收到的信息，这是误导性预判。",[52,33008,33009],{},"模式识别依赖于信息对称以及空缺填补，当我们经验丰富时这两个过程可以有效运作，但当我们自以为经验丰富而事实上并非如此时，错误在所难免。",[10548,33011,33012],{"id":33012},"情感标记",[13,33014,33015],{},"大脑会给我们的想法和决策打赏情感标记，这些标记被模式识别匹配项触发后会告诉我们应该对其表示关注还是忽略，并且给我们指明行动方向。",[13,33017,33018],{},"情感标记让我们迅速行动，指引我们警惕关键信息，并瞬间选择某个行动计划。",[49,33020,33021,33024,33027],{},[52,33022,33023],{},"战略决策错综复杂，因而要做出至关重要的判断。对这些判断来说，推理和事实通常不足以证明是非对错，还需要本能、第六感和直觉的帮忙，而所有的这些都依赖于我们的情感标记。",[52,33025,33026],{},"情感交织在做决策的过程中，而且是决策过程必需和重要的组成部分。情感的大多数影响是无意识的，我们只有通过直觉才能意识到它们的存在。我们可以在一定程度上控制情感的影响，比如通过更多的分析，更多对事实的考虑，或者是更清楚地认识到引导我们情感的来源。但是我们无法消除情感的影响。",[52,33028,33029],{},"没有情感，我们无法做出决策。此外，情感大多数时候对我们的潜意识而不是意识产生影响，好消息是在这一过程中我们的情感被设定为大多数时候帮助我们轻松并且有效的得到正确的答案。",[10548,33031,33032],{"id":33032},"四个陷阱",[13,33034,33035],{},"误导性经验、误导性预判、不适当的个人利益和不适当的情感依附是导致错误思维的四种根源，而错误思维会导致错误决策。",[10548,33037,33038],{"id":33038},"抵御情感的扭曲作用",[49,33040,33041,33044,33047,33050],{},[52,33042,33043],{},"强烈的情感经验。我们可能对过去经历的成功、失败、恐惧或喜悦有着深刻的记忆，大多数时候这些情感可以帮助我们。",[52,33045,33046],{},"预判及先前决策。我们会给以前做出的判断和决策打上强烈的情感标记，如果这些判断无误，那么我们的情感可以帮助我们集中注意力。但是如果这些判断具有误导性，我们的情感就会让我们紧揪着它们不放，就算其他不迷信这些判断的人已经发现了问题的所在，我们依然会沉溺其中。",[52,33048,33049],{},"个人利益。在做决策时我们的个人利益经常受到威胁，如果这些决策仅仅影响我们自身，我们的情感标记会告诉我们正确答案。但是当我们的个人利益和我们为其他人所负的责任发生冲突时，我们的判断就会失衡。",[52,33051,33052],{},"情感依附。",[7759,33054,33055],{"id":33055},"一次一计划",[13,33057,33058],{},[617,33059],{"alt":119,"src":29434},[10548,33061,33062],{"id":33062},"预警过程",[49,33064,33065,33068,33071],{},[52,33066,33067],{},"误导性经验最有可能在情况评估阶段干扰我们的思维，不管我们对模式识别错误还是模式的情感标记给我们提供了不合适的行动导向。但是误导性经验同样会导致我们选择不适当的计划或是对结果做出错误判断。",[52,33069,33070],{},"误导性判断最有可能在我们评估结果时扭曲我们的想法，它们让我们忠于错误的计划。但是它们也会让我们对情况产生误判或者是执着于某一个特定的行动计划——经常是过去有效的计划。",[52,33072,33073],{},"不适当的个人利益和不适当的情感依附最有可能影响我们对结果的评估方式：它们可以通过给错误的计划打上积极的标签让我们执迷于它。",[13,33075,33076],{},[617,33077],{"alt":119,"src":33078},"img\u002F1.2.png",[23289,33080],{},[107,33082,33084],{"id":33083},"第二部分-决策错误的原因","第二部分 决策错误的原因",[7759,33086,33087],{"id":33087},"误导性经验",[13,33089,33090],{},"当我们的记忆包含和当前情况相似又存在重大误差的经验时，我们对当前情况的看法会被误导，对行动方案的选择也会步入歧途。",[10548,33092,33093],{"id":33093},"两种偏差效应",[49,33095,33096,33113],{},[52,33097,33098,33099],{},"可得性启发法\n",[49,33100,33101,33104,33107,33110],{},[52,33102,33103],{},"我们会根据某一事件在我们记忆中轻易“可得”的次数和概率，对某一件事情的频率、可能性以及可能性的原因做出判断，我们不会评估所有的数据。一份记忆“可得”可能是因为它能激起情感、形象、容易想象、或者具象化。",[52,33105,33106],{},"新近性和形象性偏差让我们更多的获取最近的形象和形象的信息而不是那些更老的、不那么形象的信息，尽管后者可能相关性更高。",[52,33108,33109],{},"可回溯性偏差让我们更多地使用容易获取的信息和记忆，甚至在难以获取的信息相关度更高的情况下也是如此。",[52,33111,33112],{},"假设联系偏差让我们在被问到两件事是否存在联系的时候会寻找存在联系的情况而不会去寻找不存在联系的情况，因此，我们会高估两件事之间的联系。",[52,33114,33115,33116],{},"代表性启发法\n",[49,33117,33118,33121,33124],{},[52,33119,33120],{},"当我们面对一个决策时，我们倾向于寻找这一决策和自己之前所做决策的相似方面，然后，我们使用过去决策成功时用到的简化算法或是类比法。",[52,33122,33123],{},"基本比率偏差让人们作决策的时候只考虑一些可获得的信息，而忽略了情况蕴含的未凸显的背景信息。",[52,33125,33126],{},"回归均值偏差：如果人们被要求估计企业的未来表现，他们倾向于根据过去的表现做出预测。",[7759,33128,33129],{"id":33129},"误导性判断",[13,33131,33132],{},"预判通过给我们的思想打上情感标记的方式而影响决策。在决策过程中，这些情感标记帮助我们理清对各种情况的多种可能性解读，提供可采取的多种可能行动路线。情感标记加快了我们的模式识别和判断过程。",[49,33134,33135],{},[52,33136,33137,33138],{},"过度自信偏差\n",[49,33139,33140,33143],{},[52,33141,33142],{},"我们在处理陌生问题的时候，经常对自己所做的判断过度自信。",[52,33144,33145],{},"一旦你做出了预测，你会被该预测锚定，导致该预测两头所限定的范围都过于狭窄。",[10548,33147,33148],{"id":33148},"误导性预判类型",[49,33150,33151,33154,33157,33160,33163],{},[52,33152,33153],{},"对情况的判断。这会让管理者们开始对自己棉缎的情况进行界定，界定会影响他们的决策。",[52,33155,33156],{},"对备选项的判断。",[52,33158,33159],{},"对目标或者是标准的判断。发展战略经常违背发展至关重要的预判下制定出来。",[52,33161,33162],{},"对我们能力的判断。我们经常对自己的能力过度自信。",[52,33164,33165],{},"对可能结果的判断。",[10548,33167,33168],{"id":33168},"辨别误导性预判",[49,33170,33171,33174,33177],{},[52,33172,33173],{},"该决策设计的主要不确定性是什么？",[52,33175,33176],{},"主要决策人对这些不确定性是否做出了预判？",[52,33178,33179],{},"预判有客观证据支持吗？如果没有，它们可能具有误导性。",[7759,33181,33182],{"id":33182},"不适当的情感依附",[13,33184,33185],{},"个人情感依附环绕在我们周围，并且会对任何一个决策产生关键的影响，有时会给我们造成极大的损害。",[10548,33187,33188],{"id":33188},"影响决策的情感依附",[49,33190,33191,33194,33197],{},[52,33192,33193],{},"情感依附影响惊人的范围。从恋人到商标，情感依附能够形成十分广阔的范围，甚至是一系列十分奇怪的东西。",[52,33195,33196],{},"情感依附本质上可能是欢快的或险恶的。恐惧、憎恨和遗憾都能够影响到我们的决策，并且同希望、爱情以及幸福的回忆一样具有强烈的效果。",[52,33198,33199],{},"情感依附具有微妙的力量。",[10548,33201,33202],{"id":33202},"情感依附的来源",[49,33204,33205,33208,33211,33214,33217],{},[52,33206,33207],{},"同决策者一起工作的人们。",[52,33209,33210],{},"同决策者没有工作附属关系的人们。",[52,33212,33213],{},"商业元素。决策者对不同的业务单位、工厂、工地、功能发展出依附关系。",[52,33215,33216],{},"标志性的东西。",[52,33218,33219],{},"地点。决策者曾经工作过的地方、在关键时期所停留的地方，或者某一特殊经历发生的地方，能够导致明显且强有力的情感依附。",[10548,33221,33222],{"id":33222},"尝试剔除不适当的情感依附",[49,33224,33225,33228,33231],{},[52,33226,33227],{},"决策者是不是对哪些选项如：人、地点或者东西存在情感依附或者地对情感吗？",[52,33229,33230],{},"是不是有哪些情感依附可能对主要利益主体的相关利益产生冲突呢？",[52,33232,33233],{},"是否存在哪些具有冲突性的情感依附，能够强烈到显著的扭曲决策者的决策吗？",[23289,33235],{},[107,33237,33239],{"id":33238},"第三部分-红旗预警及防御策略","第三部分 红旗预警及防御策略",[13,33241,33242],{},"防御措施涉及的范围广泛，包括干预措施、过程变化、人们的选择、分析技巧以及其他机制。这些方法可以用来减少做出错误决策的风险。然而每个组织都拥有多种用于管理决策的过程，我们将防御措施定义为额外的措施，选择它们是因为它们对某一特定的决策而言是适当的。我们使用这一定义是因为它们能够为抵制错误决策提供安全保障，尽管使用它们也不能保证不犯任何错误。我们不能够消除人们的偏见，但是我们可以抵消它们所能产生的潜在影响。",[7759,33244,33245],{"id":33245},"防御措施",[49,33247,33248,33259,33273,33281],{},[52,33249,33250,33251],{},"经验、数据和分析\n",[49,33252,33253,33256],{},[52,33254,33255],{},"要为决策者提供新的体验，或新的数据及分析。这么做可以从源头上降低做错决策的风险。",[52,33257,33258],{},"在商业中，有很多用于收集数据、扩展经验的方式。与关键客户之间的探讨，能够对新产品提供许多有价值的反馈。市场调查能够评估进入新市场的风险。还可以引进顾问，一部分是因为他们的专业技能和现成的人力，再者还因为他们相对而言比较客观。",[52,33260,33261,33262],{},"团队辩论和挑战\n",[49,33263,33264,33267,33270],{},[52,33265,33266],{},"进行一场挑战偏见的辩论，并不需要设计很复杂的过程。可能就是指针对某一问题。即使对方并不是这一问题的专家，辩论的过程也可以帮助你揭示一些假设和信念。在大型的组织中，精心策划辩论和挑战的典型方式就是组建决策团队。团队规模各不相同，可能从两个人到许多人不等。虽然从通常来讲，参加辩论的人较少才是更佳的做法。",[52,33268,33269],{},"选择让谁加入团队是至关重要的，这决定着挑战的质量。",[52,33271,33272],{},"对根深蒂固的观点进行挑战是防御措施的关键来源。强有力的领导需要强有力的挑战。",[52,33274,33275,33276],{},"管理\n",[49,33277,33278],{},[52,33279,33280],{},"管咯团队是很重要的支撑，用于否决任何决策团队已通过的错误决策。少数大型组织允许由决策提案人审批重要的决策。通常是由独立的非执行董事或者由受托人进行，以此来增加决策过程的客观性。",[52,33282,33283,33284],{},"监控\n",[49,33285,33286,33289,33292],{},[52,33287,33288],{},"监控过程追踪着决策过程，能够鼓励决策者在提出建议前进行细致的思考。如果决策者知道结果将被记录和宣传，那么这就足够促使他们“三思”了。",[52,33290,33291],{},"监控对于快速修正错误决策也有帮助，例如，如果早期表现令人失望的话，后期的投入可能会减少。",[52,33293,33294],{},"额外监控是最终的防弹墙：用于抵抗做出糟糕决策的最后一道防御措施。在没有其他可以替代的措施用来提供保护时，额外监控特别有用。",[10548,33296,33297],{"id":33297},"红旗警示条件",[49,33299,33300,33303,33306,33309],{},[52,33301,33302],{},"误导性经历",[52,33304,33305],{},"误导性预判",[52,33307,33308],{},"不适当的个人利益",[52,33310,33311],{},"不适当的感情依附",[7759,33313,33314],{"id":33314},"四个建议",[49,33316,33317,33328,33336,33344],{},[52,33318,33319,33320],{},"保持简单——然后进行迭代\n",[49,33321,33322,33325],{},[52,33323,33324],{},"首先保持简单，然后在第一个回答的基础上进行迭代。如果开始使用的是一种看似合理的方法，可以稍后在这种方法上进行重构。在一些真实复杂的情景下，修改你对因素的分析。关键是你要从某个地方开始，然后再以此为基础。",[52,33326,33327],{},"遵循“保持简单”的原则，先做出一个初始的分析，然后去和其他人讨论。事实上，“一次一计划”决策过程的影响是这样的。",[52,33329,33330,33331],{},"从最担心的红旗警示开始\n",[49,33332,33333],{},[52,33334,33335],{},"一旦选定了一条红旗警示，那么就要考虑一下哪些防御措施最适合用来处理这一红旗警示。然后再回过头去挑选另一条令你担忧的红旗警示。试问一下你自己，你选择的防御措施是否能够提供充分的保护。",[52,33337,33338,33339],{},"如果有疑问，按顺序考虑防御措施\n",[49,33340,33341],{},[52,33342,33343],{},"首先对新经验和新数据进行考虑。考虑一下怎么样才能利用辩论和挑战来帮助决策者调整她或他的思路，而下一个需要寻求防御措施的领域时管理过程。如果你仍然担心所做的决策是错误的，考虑一下加强监控过程的方式，那样可以鉴定出错误决策的结果，并且尽早有效率的处理。",[52,33345,33346],{},"衡量每个防御措施的好处，抵制其副作用。",[23289,33348],{},{"title":119,"searchDepth":144,"depth":144,"links":33350},[33351,33355,33360],{"id":32983,"depth":132,"text":32984,"children":33352},[33353,33354],{"id":32987,"depth":144,"text":32987},{"id":33055,"depth":144,"text":33055},{"id":33083,"depth":132,"text":33084,"children":33356},[33357,33358,33359],{"id":33087,"depth":144,"text":33087},{"id":33129,"depth":144,"text":33129},{"id":33182,"depth":144,"text":33182},{"id":33238,"depth":132,"text":33239,"children":33361},[33362,33363],{"id":33245,"depth":144,"text":33245},{"id":33314,"depth":144,"text":33314},{},"TalkingAbout\u002F运营\u002F2_《避开错误决策的4个陷阱》\u002F如果不由我来做决策，那么错误决策与我无关.md","\u002Fundergraduate\u002Fnote-32b16882c171",{"title":32974,"description":119},"undergraduate\u002Fnote-32b16882c171",[7744,246,23333],"zfvGCd8aQHzXdhFWw0Wbaxf0IsB2x6gBC0Z-3agKuLo",{"id":33372,"title":33373,"assetBase":239,"author":8,"body":33374,"category":23371,"collection":23324,"date":23325,"description":33378,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":33384,"navigation":128,"originalPath":33385,"path":33386,"seo":33387,"source":23330,"stem":33388,"tags":33389,"weight":250,"__hash__":33390},"content\u002Fundergraduate\u002Fnote-3d7e6ba255a2.md","README",{"type":10,"value":33375,"toc":33382},[33376,33379],[13,33377,33378],{},"这是一个记录杂谈的目录，记录我整天胡思乱想的日常，哪天精神病了，多半可以从这些内容中看出端倪。",[13,33380,33381],{},"所有内容均没有依据，仅为我的臆想，如有驳者，那你对对对。",{"title":119,"searchDepth":144,"depth":144,"links":33383},[],{},"Tittle-Tattle\u002FREADME.md","\u002Fundergraduate\u002Fnote-3d7e6ba255a2",{"title":33373,"description":33378},"undergraduate\u002Fnote-3d7e6ba255a2",[23333],"AHhkgPt9CzvEK8DeYcE7ghD-ojytzIDGx7hquOmCLRA",{"id":33392,"title":33393,"assetBase":239,"author":8,"body":33394,"category":29019,"collection":23324,"date":23325,"description":33401,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":33627,"navigation":128,"originalPath":33628,"path":33629,"seo":33630,"source":23330,"stem":33631,"tags":33632,"weight":250,"__hash__":33633},"content\u002Fundergraduate\u002Fnote-3e1f81ed6db5.md","没水平的押题",{"type":10,"value":33395,"toc":33624},[33396,33399,33402,33405,33472,33476,33485,33488,33491,33502,33505,33514,33517,33526,33529,33538,33541,33550,33553,33562,33565,33574,33577,33586,33589,33598,33601,33610,33613,33622],[4517,33397,33398],{"id":33398},"押题",[13,33400,33401],{},"以下打勾的是本学期考到的，没考的基本上是剩下的了。。。挺无语的，重点是MapReduce的工作流程，甚至需要大家写Map函数的代码（那有没有可能明年考Reduce函数的代码）。",[13,33403,33404],{},"不过总体来说挺简单的，送分的地方比较多，基本上把备考文档看个两遍上个80没啥问题（但是需要自己配一遍环境！！！）",[49,33406,33409,33418,33424,33430,33436,33442,33448,33454,33460,33466],{"className":33407},[33408],"contains-task-list",[52,33410,33413,33417],{"className":33411},[33412],"task-list-item",[33414,33415],"input",{"disabled":128,"type":33416},"checkbox"," 简述大数据的内涵",[52,33419,33421,33423],{"className":33420},[33412],[33414,33422],{"disabled":128,"type":33416}," 简述大数据的4V特征",[52,33425,33427,33429],{"className":33426},[33412],[33414,33428],{"disabled":128,"type":33416}," 试述Hadoop的体系架构",[52,33431,33433,33435],{"className":33432},[33412],[33414,33434],{"checked":128,"disabled":128,"type":33416}," 试述Hadoop的运行模式及其优缺点",[52,33437,33439,33441],{"className":33438},[33412],[33414,33440],{"disabled":128,"type":33416}," 简述HDFS有哪些可靠性机制。备份节点和Secondary NameNode的区别是什么？（工作原理）",[52,33443,33445,33447],{"className":33444},[33412],[33414,33446],{"checked":128,"disabled":128,"type":33416}," 试述HDFS一个名称节点的优点、缺点",[52,33449,33451,33453],{"className":33450},[33412],[33414,33452],{"checked":128,"disabled":128,"type":33416}," 试述Shuffle机制各个阶段的主要作用（重点）",[52,33455,33457,33459],{"className":33456},[33412],[33414,33458],{"disabled":128,"type":33416}," 试述YARN体系架构中三大核心组件及各自功能",[52,33461,33463,33465],{"className":33462},[33412],[33414,33464],{"disabled":128,"type":33416}," 试述ZooKeeper如何保障数据安全",[52,33467,33469,33471],{"className":33468},[33412],[33414,33470],{"disabled":128,"type":33416}," 简述Hive和传统关系数据库的区别和联系",[7759,33473,33475],{"id":33474},"特别附加","特别附加：",[49,33477,33479],{"className":33478},[33408],[52,33480,33482,33484],{"className":33481},[33412],[33414,33483],{"disabled":128,"type":33416}," 文件系统命令（书本P64-P68）",[13,33486,33487],{},"比较常见的文件系统命令：",[13,33489,33490],{},"（1）显示文件\u002Flog\u002Ftext1.txt的基本信息",[114,33492,33496],{"className":33493,"code":33494,"language":33495,"meta":119,"style":119},"language-shell shiki shiki-themes github-dark","hadoop fs -ls \u002Flog\u002Ftext1.txt\n","shell",[17,33497,33498],{"__ignoreMap":119},[78,33499,33500],{"class":124,"line":125},[78,33501,33494],{},[13,33503,33504],{},"（2）显示test目录下包含的文件数量",[114,33506,33508],{"className":33493,"code":33507,"language":33495,"meta":119,"style":119},"hadoop fs -count \u002Ftest\n",[17,33509,33510],{"__ignoreMap":119},[78,33511,33512],{"class":124,"line":125},[78,33513,33507],{},[13,33515,33516],{},"（3）将\u002Ftest目录下文件test1.txt移动到\u002Ftxt目录",[114,33518,33520],{"className":33493,"code":33519,"language":33495,"meta":119,"style":119},"hadoop fs -mv \u002Ftext1.txt \u002Ftxt\n",[17,33521,33522],{"__ignoreMap":119},[78,33523,33524],{"class":124,"line":125},[78,33525,33519],{},[13,33527,33528],{},"（4）将文件\u002Ftest\u002Ffile1复制到\u002Ftest\u002Ffile2目录下",[114,33530,33532],{"className":33493,"code":33531,"language":33495,"meta":119,"style":119},"hadoop fs -cp \u002Ftest\u002Ffile1 \u002Ftest\u002Ffile2\n",[17,33533,33534],{"__ignoreMap":119},[78,33535,33536],{"class":124,"line":125},[78,33537,33531],{},[13,33539,33540],{},"（5）删除文件\u002Ftest\u002Ffile1.txt",[114,33542,33544],{"className":33493,"code":33543,"language":33495,"meta":119,"style":119},"hadoop fs -rm \u002Ftest\u002Ffile1.txt\n",[17,33545,33546],{"__ignoreMap":119},[78,33547,33548],{"class":124,"line":125},[78,33549,33543],{},[13,33551,33552],{},"（6）将Linux本地文件\u002Fhome\u002Fxuluhui\u002Ftext1.txt复制到HDFS目录\u002Fuser\u002Fxuluhui下面，并重命名为text2.txt",[114,33554,33556],{"className":33493,"code":33555,"language":33495,"meta":119,"style":119},"hadoop fs -put \u002Fhome\u002Fxuluhui\u002Ftext1.txt \u002Fuser\u002Fxuluhui\u002Ftext2.txt\n",[17,33557,33558],{"__ignoreMap":119},[78,33559,33560],{"class":124,"line":125},[78,33561,33555],{},[13,33563,33564],{},"（7）将HDFS目录\u002Fuser\u002Fxuluhui下的文件合并，输出到本地文件系统，保存为\u002Fhome\u002Fxuluhui\u002Ftest.txt",[114,33566,33568],{"className":33493,"code":33567,"language":33495,"meta":119,"style":119},"hadoop fs -getmerge \u002Fuser\u002Fxuluhui \u002Fhome\u002Fxuluhui\u002Ftest.txt\n",[17,33569,33570],{"__ignoreMap":119},[78,33571,33572],{"class":124,"line":125},[78,33573,33567],{},[13,33575,33576],{},"（8）输出HDFS目录\u002Fuser\u002Fxuluhui下文件test.txt到标准输出",[114,33578,33580],{"className":33493,"code":33579,"language":33495,"meta":119,"style":119},"hadoop fs -cat \u002Fuser\u002Fxuluhui\u002Ftest.txt\n",[17,33581,33582],{"__ignoreMap":119},[78,33583,33584],{"class":124,"line":125},[78,33585,33579],{},[13,33587,33588],{},"（9）在HDFS目录\u002Fuser下创建目录data1和data2",[114,33590,33592],{"className":33493,"code":33591,"language":33495,"meta":119,"style":119},"hadoop fs -mkdir \u002Fuser\u002Fdata1 \u002Fuser\u002Fdata2\n",[17,33593,33594],{"__ignoreMap":119},[78,33595,33596],{"class":124,"line":125},[78,33597,33591],{},[13,33599,33600],{},"（10）显示文件input.txt的尾部内容",[114,33602,33604],{"className":33493,"code":33603,"language":33495,"meta":119,"style":119},"hadoop fs -tail \u002Fuser\u002Finput.txt\n",[17,33605,33606],{"__ignoreMap":119},[78,33607,33608],{"class":124,"line":125},[78,33609,33603],{},[13,33611,33612],{},"（11）更改\u002Fuser\u002Fdata1的权限为766",[114,33614,33616],{"className":33493,"code":33615,"language":33495,"meta":119,"style":119},"hadoop fs -chmod 766 \u002Fuser\u002Fdata1\n",[17,33617,33618],{"__ignoreMap":119},[78,33619,33620],{"class":124,"line":125},[78,33621,33615],{},[226,33623,228],{},{"title":119,"searchDepth":144,"depth":144,"links":33625},[33626],{"id":33474,"depth":144,"text":33475},{},"我的大学\u002F大三上学期\u002F大数据平台基础\u002F没水平的押题.md","\u002Fundergraduate\u002Fnote-3e1f81ed6db5",{"title":33393,"description":33401},"undergraduate\u002Fnote-3e1f81ed6db5",[14968,23378,10715,6380],"CCeRDAHxB49TkkV1agMGBl_3NoXtNJzQ6iJuYvqhNZM",{"id":33635,"title":33636,"assetBase":239,"author":8,"body":33637,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":35719,"navigation":128,"originalPath":35720,"path":35721,"seo":35722,"source":23330,"stem":35723,"tags":35724,"weight":250,"__hash__":35726},"content\u002Fundergraduate\u002Fnote-48979c5db8d2.md","SQL小练1",{"type":10,"value":33638,"toc":35706},[33639,33681,33685,33688,33691,33728,33731,33763,33766,33771,33810,33815,33850,33857,33864,33871,33878,33880,33884,33887,33890,33910,33913,33916,33934,33936,33941,33966,33971,34004,34011,34018,34025,34027,34031,34034,34039,34048,34053,34062,34065,34067,34072,34081,34086,34095,34102,34109,34116,34118,34122,34125,34130,34139,34144,34153,34156,34158,34163,34172,34177,34186,34193,34200,34207,34209,34213,34216,34221,34230,34233,34235,34240,34249,34254,34263,34270,34277,34284,34291,34298,34305,34307,34311,34314,34323,34326,34328,34333,34348,34351,34443,34448,34463,34465,34602,34609,34616,34623,34630,34637,34639,34643,34646,34655,34658,34661,34666,34675,34678,34683,34692,34695,34702,34709,34716,34723,34730,34737,34739,34743,34746,34748,34753,34777,34782,34802,34809,34816,34823,34830,34832,34836,34839,34841,34846,34866,34871,34901,34908,34915,34922,34929,34936,34938,34942,34945,34947,34952,34977,34982,35006,35013,35020,35027,35034,35041,35043,35046,35050,35169,35173,35294,35298,35434,35438,35567,35571,35704],[72,33640,33641,33645,33648,33651,33654,33657,33660,33663,33666,33669,33672,33675,33678],{},[13,33642,33643],{},[22,33644,23957],{},[13,33646,33647],{},"这是一个快失业的大学牲为了在简历上写熟练使用SQL而做的简单练习，越写感觉自己越菜。。。很多常见的语法根本不会，所以借由New Bing进行学习记录。主要采用记录我用的很少\u002F没用过的关键词为主，同时记录了我遇到的不错的SQL题。因为篇幅不宜过长，所以SQL小练不会超过10个一文。",[13,33649,33650],{},"改文记录如下：",[13,33652,33653],{},"（1）CASE",[13,33655,33656],{},"（2）UNION",[13,33658,33659],{},"（3）CONCAT && CONCAT_WS",[13,33661,33662],{},"（4）COLLECT && COLLECT_SET 【Hive SQL】",[13,33664,33665],{},"（5）CAST",[13,33667,33668],{},"（6）ROW_NUMBER",[13,33670,33671],{},"（7）ROUND()",[13,33673,33674],{},"（8）LAG() && LEAD()",[13,33676,33677],{},"（9）LATERAL VIEW",[13,33679,33680],{},"（10）UDTF简述",[7759,33682,33684],{"id":33683},"_1sql语法case的具体操作","1、SQL语法case的具体操作",[13,33686,33687],{},"SQL语法case的具体操作是一种条件表达式，用于根据条件执行不同的操作。SQL语法case有两种形式：简单的case和搜索的case。",[13,33689,33690],{},"简单的case是将一个表达式与一组简单表达式进行比较以确定结果。其语法如下：",[114,33692,33696],{"className":33693,"code":33694,"language":33695,"meta":119,"style":119},"language-sql shiki shiki-themes github-dark","CASE 表达式\n  WHEN 值1 THEN 结果1\n  WHEN 值2 THEN 结果2\n  ...\n  ELSE 结果N\nEND\n","sql",[17,33697,33698,33703,33708,33713,33718,33723],{"__ignoreMap":119},[78,33699,33700],{"class":124,"line":125},[78,33701,33702],{},"CASE 表达式\n",[78,33704,33705],{"class":124,"line":132},[78,33706,33707],{},"  WHEN 值1 THEN 结果1\n",[78,33709,33710],{"class":124,"line":138},[78,33711,33712],{},"  WHEN 值2 THEN 结果2\n",[78,33714,33715],{"class":124,"line":144},[78,33716,33717],{},"  ...\n",[78,33719,33720],{"class":124,"line":150},[78,33721,33722],{},"  ELSE 结果N\n",[78,33724,33725],{"class":124,"line":156},[78,33726,33727],{},"END\n",[13,33729,33730],{},"搜索的case是计算一组布尔表达式以确定结果¹²。其语法如下：",[114,33732,33734],{"className":33693,"code":33733,"language":33695,"meta":119,"style":119},"CASE \n  WHEN 条件1 THEN 结果1\n  WHEN 条件2 THEN 结果2\n  ...\n  ELSE 结果N\nEND\n",[17,33735,33736,33741,33746,33751,33755,33759],{"__ignoreMap":119},[78,33737,33738],{"class":124,"line":125},[78,33739,33740],{},"CASE \n",[78,33742,33743],{"class":124,"line":132},[78,33744,33745],{},"  WHEN 条件1 THEN 结果1\n",[78,33747,33748],{"class":124,"line":138},[78,33749,33750],{},"  WHEN 条件2 THEN 结果2\n",[78,33752,33753],{"class":124,"line":144},[78,33754,33717],{},[78,33756,33757],{"class":124,"line":150},[78,33758,33722],{},[78,33760,33761],{"class":124,"line":156},[78,33762,33727],{},[13,33764,33765],{},"以下是两个例子：",[49,33767,33768],{},[52,33769,33770],{},"在OrderDetails表中，根据Quantity的大小返回不同的文本¹",[114,33772,33774],{"className":33693,"code":33773,"language":33695,"meta":119,"style":119},"SELECT OrderID, Quantity,\nCASE \n  WHEN Quantity > 30 THEN 'The quantity is greater than 30'\n  WHEN Quantity = 30 THEN 'The quantity is 30'\n  ELSE 'The quantity is under 30'\nEND AS QuantityText \nFROM OrderDetails;\n",[17,33775,33776,33781,33785,33790,33795,33800,33805],{"__ignoreMap":119},[78,33777,33778],{"class":124,"line":125},[78,33779,33780],{},"SELECT OrderID, Quantity,\n",[78,33782,33783],{"class":124,"line":132},[78,33784,33740],{},[78,33786,33787],{"class":124,"line":138},[78,33788,33789],{},"  WHEN Quantity > 30 THEN 'The quantity is greater than 30'\n",[78,33791,33792],{"class":124,"line":144},[78,33793,33794],{},"  WHEN Quantity = 30 THEN 'The quantity is 30'\n",[78,33796,33797],{"class":124,"line":150},[78,33798,33799],{},"  ELSE 'The quantity is under 30'\n",[78,33801,33802],{"class":124,"line":156},[78,33803,33804],{},"END AS QuantityText \n",[78,33806,33807],{"class":124,"line":162},[78,33808,33809],{},"FROM OrderDetails;\n",[49,33811,33812],{},[52,33813,33814],{},"在Customers表中，按照City排序，如果City为空，则按照Country排序¹",[114,33816,33818],{"className":33693,"code":33817,"language":33695,"meta":119,"style":119},"SELECT CustomerName, City, Country \nFROM Customers \nORDER BY (CASE \n            WHEN City IS NULL THEN Country \n            ELSE City \n          END);\n",[17,33819,33820,33825,33830,33835,33840,33845],{"__ignoreMap":119},[78,33821,33822],{"class":124,"line":125},[78,33823,33824],{},"SELECT CustomerName, City, Country \n",[78,33826,33827],{"class":124,"line":132},[78,33828,33829],{},"FROM Customers \n",[78,33831,33832],{"class":124,"line":138},[78,33833,33834],{},"ORDER BY (CASE \n",[78,33836,33837],{"class":124,"line":144},[78,33838,33839],{},"            WHEN City IS NULL THEN Country \n",[78,33841,33842],{"class":124,"line":150},[78,33843,33844],{},"            ELSE City \n",[78,33846,33847],{"class":124,"line":156},[78,33848,33849],{},"          END);\n",[13,33851,33852,33853],{},"(1) SQL CASE Expression - W3Schools. ",[5009,33854,33855],{"href":33855,"rel":33856},"https:\u002F\u002Fwww.w3schools.com\u002Fsql\u002Fsql_case.asp",[23647],[13,33858,33859,33860],{},"(2) SQL CASE 语句. ",[5009,33861,33862],{"href":33862,"rel":33863},"https:\u002F\u002Fwww.w3schools.cn\u002Fsql\u002Fsql_case.asp",[23647],[13,33865,33866,33867],{},"(3) CASE statement in SQL - SQL Shack. ",[5009,33868,33869],{"href":33869,"rel":33870},"https:\u002F\u002Fwww.sqlshack.com\u002Fcase-statement-in-sql\u002F",[23647],[13,33872,33873,33874],{},"(4) SQL CASE - 1Keydata SQL 語法教學. ",[5009,33875,33876],{"href":33876,"rel":33877},"https:\u002F\u002Fwww.1keydata.com\u002Ftw\u002Fsql\u002Fsql-case.html",[23647],[23289,33879],{},[7759,33881,33883],{"id":33882},"_2sql语法union的具体操作","2、SQL语法UNION的具体操作",[13,33885,33886],{},"SQL语法Union的具体操作是一种集合运算符，用于合并两个或多个SELECT语句的结果集。SQL语法Union有两种形式：Union和Union All。",[13,33888,33889],{},"Union是将两个或多个SELECT语句的结果集合并起来，并去除重复的记录。其语法如下：",[114,33891,33893],{"className":33693,"code":33892,"language":33695,"meta":119,"style":119},"SELECT 列名 FROM 表名1\nUNION\nSELECT 列名 FROM 表名2\n",[17,33894,33895,33900,33905],{"__ignoreMap":119},[78,33896,33897],{"class":124,"line":125},[78,33898,33899],{},"SELECT 列名 FROM 表名1\n",[78,33901,33902],{"class":124,"line":132},[78,33903,33904],{},"UNION\n",[78,33906,33907],{"class":124,"line":138},[78,33908,33909],{},"SELECT 列名 FROM 表名2\n",[13,33911,33912],{},"请注意，Union内部的每个SELECT语句必须拥有相同数量的列，列也必须拥有相似的数据类型，同时，每条SELECT语句中的列的顺序必须相同。",[13,33914,33915],{},"Union All是将两个或多个SELECT语句的结果集合并起来，并保留重复的记录¹²。其语法如下：",[114,33917,33919],{"className":33693,"code":33918,"language":33695,"meta":119,"style":119},"SELECT 列名 FROM 表名1\nUNION ALL\nSELECT 列名 FROM 表名2\n",[17,33920,33921,33925,33930],{"__ignoreMap":119},[78,33922,33923],{"class":124,"line":125},[78,33924,33899],{},[78,33926,33927],{"class":124,"line":132},[78,33928,33929],{},"UNION ALL\n",[78,33931,33932],{"class":124,"line":138},[78,33933,33909],{},[13,33935,33765],{},[49,33937,33938],{},[52,33939,33940],{},"在Websites表和apps表中，选取所有不同的country",[114,33942,33944],{"className":33693,"code":33943,"language":33695,"meta":119,"style":119},"SELECT country FROM Websites \nUNION \nSELECT country FROM apps \nORDER BY country;\n",[17,33945,33946,33951,33956,33961],{"__ignoreMap":119},[78,33947,33948],{"class":124,"line":125},[78,33949,33950],{},"SELECT country FROM Websites \n",[78,33952,33953],{"class":124,"line":132},[78,33954,33955],{},"UNION \n",[78,33957,33958],{"class":124,"line":138},[78,33959,33960],{},"SELECT country FROM apps \n",[78,33962,33963],{"class":124,"line":144},[78,33964,33965],{},"ORDER BY country;\n",[49,33967,33968],{},[52,33969,33970],{},"在Websites表和apps表中，选取所有中国(CN)的数据，并保留重复值",[114,33972,33974],{"className":33693,"code":33973,"language":33695,"meta":119,"style":119},"SELECT country, name FROM Websites \nWHERE country='CN' \nUNION ALL \nSELECT country, app_name FROM apps \nWHERE country='CN' \nORDER BY country;\n",[17,33975,33976,33981,33986,33991,33996,34000],{"__ignoreMap":119},[78,33977,33978],{"class":124,"line":125},[78,33979,33980],{},"SELECT country, name FROM Websites \n",[78,33982,33983],{"class":124,"line":132},[78,33984,33985],{},"WHERE country='CN' \n",[78,33987,33988],{"class":124,"line":138},[78,33989,33990],{},"UNION ALL \n",[78,33992,33993],{"class":124,"line":144},[78,33994,33995],{},"SELECT country, app_name FROM apps \n",[78,33997,33998],{"class":124,"line":150},[78,33999,33985],{},[78,34001,34002],{"class":124,"line":156},[78,34003,33965],{},[13,34005,34006,34007],{},"(1) SQL UNION 操作符 | 菜鸟教程. ",[5009,34008,34009],{"href":34009,"rel":34010},"https:\u002F\u002Fwww.runoob.com\u002Fsql\u002Fsql-union.html",[23647],[13,34012,34013,34014],{},"(2) SQL UNION 和 UNION ALL 操作符. ",[5009,34015,34016],{"href":34016,"rel":34017},"https:\u002F\u002Fwww.w3school.com.cn\u002Fsql\u002Fsql_union.asp",[23647],[13,34019,34020,34021],{},"(3) SQL UNION - 1Keydata SQL 語法教學. ",[5009,34022,34023],{"href":34023,"rel":34024},"https:\u002F\u002Fwww.1keydata.com\u002Ftw\u002Fsql\u002Fsqlunion.html",[23647],[23289,34026],{},[7759,34028,34030],{"id":34029},"_3sql语法concat和concat_ws的区别和具体操作","3、SQL语法concat和concat_ws的区别和具体操作",[13,34032,34033],{},"SQL语法concat和concat_ws的区别和具体操作是：",[49,34035,34036],{},[52,34037,34038],{},"concat函数是将多个字符串连接成一个字符串，如果有任何一个参数为null，则返回值为null。其语法如下：",[114,34040,34042],{"className":33693,"code":34041,"language":33695,"meta":119,"style":119},"CONCAT(string1, string2, ..., stringN)\n",[17,34043,34044],{"__ignoreMap":119},[78,34045,34046],{"class":124,"line":125},[78,34047,34041],{},[49,34049,34050],{},[52,34051,34052],{},"concat_ws函数是一种特殊形式的concat函数，也是将多个字符串连接成一个字符串，但是可以一次性指定分隔符（concat_ws就是concat with separator）。其语法如下：",[114,34054,34056],{"className":33693,"code":34055,"language":33695,"meta":119,"style":119},"CONCAT_WS(separator, string1, string2, ..., stringN)\n",[17,34057,34058],{"__ignoreMap":119},[78,34059,34060],{"class":124,"line":125},[78,34061,34055],{},[13,34063,34064],{},"请注意，concat_ws函数的第一个参数是其它参数间的分隔符，不能为null，如果为null，则返回值为null。",[13,34066,33765],{},[49,34068,34069],{},[52,34070,34071],{},"在employee_tbl表中，选取id和name列，并用空格连接起来，使用concat函数",[114,34073,34075],{"className":33693,"code":34074,"language":33695,"meta":119,"style":119},"SELECT CONCAT(id,' ',name) AS id_name FROM employee_tbl;\n",[17,34076,34077],{"__ignoreMap":119},[78,34078,34079],{"class":124,"line":125},[78,34080,34074],{},[49,34082,34083],{},[52,34084,34085],{},"在employee_tbl表中，选取id和name列，并用空格连接起来，使用concat_ws函数",[114,34087,34089],{"className":33693,"code":34088,"language":33695,"meta":119,"style":119},"SELECT CONCAT_WS(' ',id,name) AS id_name FROM employee_tbl;\n",[17,34090,34091],{"__ignoreMap":119},[78,34092,34093],{"class":124,"line":125},[78,34094,34088],{},[13,34096,34097,34098],{},"(1) SQL里的concat() 以及concat_ws() 函数的使用_concat_ws函数_一个学习Java的小菜鸟的博客-CSDN博客. ",[5009,34099,34100],{"href":34100,"rel":34101},"https:\u002F\u002Fblog.csdn.net\u002Fweixin_48633655\u002Farticle\u002Fdetails\u002F106838028",[23647],[13,34103,34104,34105],{},"(2) concat和 concat_ws 区别以及踩出来的坑骑白马de图图的博客-CSDN博客. ",[5009,34106,34107],{"href":34107,"rel":34108},"https:\u002F\u002Fblog.csdn.net\u002Fliusuoyin\u002Farticle\u002Fdetails\u002F108110718",[23647],[13,34110,34111,34112],{},"(3) MySQL中concat()、concat_ws()、group_concat()函数使用技巧与心得 - 知乎. ",[5009,34113,34114],{"href":34114,"rel":34115},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F257399676",[23647],[23289,34117],{},[7759,34119,34121],{"id":34120},"_4hive-sql语法collect和collect_set的区别和具体操作","4、Hive SQL语法collect和collect_set的区别和具体操作",[13,34123,34124],{},"SQL语法collect和collect_set的区别和具体操作是：",[49,34126,34127],{},[52,34128,34129],{},"collect函数是一个Hive函数，用于将分组中的某列转为一个数组返回。其语法如下：",[114,34131,34133],{"className":33693,"code":34132,"language":33695,"meta":119,"style":119},"COLLECT(column)\n",[17,34134,34135],{"__ignoreMap":119},[78,34136,34137],{"class":124,"line":125},[78,34138,34132],{},[49,34140,34141],{},[52,34142,34143],{},"collect_set函数也是一个Hive函数，用于将分组中的某列转为一个数组返回，但是会去除重复的值。其语法如下：",[114,34145,34147],{"className":33693,"code":34146,"language":33695,"meta":119,"style":119},"COLLECT_SET(column)\n",[17,34148,34149],{"__ignoreMap":119},[78,34150,34151],{"class":124,"line":125},[78,34152,34146],{},[13,34154,34155],{},"请注意，collect函数和collect_set函数一般搭配group by使用，并且可以和concat_ws函数连用，以指定分隔符。",[13,34157,33765],{},[49,34159,34160],{},[52,34161,34162],{},"在student表中，按照class分组，将每个班级的name列转为一个数组，并用逗号连接起来，使用collect函数",[114,34164,34166],{"className":33693,"code":34165,"language":33695,"meta":119,"style":119},"SELECT class, CONCAT_WS(',', COLLECT(name)) AS names FROM student GROUP BY class;\n",[17,34167,34168],{"__ignoreMap":119},[78,34169,34170],{"class":124,"line":125},[78,34171,34165],{},[49,34173,34174],{},[52,34175,34176],{},"在student表中，按照class分组，将每个班级的name列转为一个数组，并用逗号连接起来，使用collect_set函数",[114,34178,34180],{"className":33693,"code":34179,"language":33695,"meta":119,"style":119},"SELECT class, CONCAT_WS(',', COLLECT_SET(name)) AS names FROM student GROUP BY class;\n",[17,34181,34182],{"__ignoreMap":119},[78,34183,34184],{"class":124,"line":125},[78,34185,34179],{},[13,34187,34188,34189],{},"(1) 数仓工具—Hive语法之collect_set 和 collect_list(17)浊酒南街的博客-CSDN博客. ",[5009,34190,34191],{"href":34191,"rel":34192},"https:\u002F\u002Fblog.csdn.net\u002Fweixin_43597208\u002Farticle\u002Fdetails\u002F117450304",[23647],[13,34194,34195,34196],{},"(2) SQL小知识点系列-3-collect_list\u002Fcollect_set（列转行） - 知乎. ",[5009,34197,34198],{"href":34198,"rel":34199},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F440574505",[23647],[13,34201,34202,34203],{},"(3) Spark SQL里concat_ws和collect_set的作用 - 大葱拌豆腐 - 博客园. ",[5009,34204,34205],{"href":34205,"rel":34206},"https:\u002F\u002Fwww.cnblogs.com\u002Fitboys\u002Fp\u002F11217815.html",[23647],[23289,34208],{},[7759,34210,34212],{"id":34211},"_5sql语法cast的具体操作","5、SQL语法cast的具体操作",[13,34214,34215],{},"SQL语法cast的具体操作是：",[49,34217,34218],{},[52,34219,34220],{},"cast函数用于将某种数据类型的表达式显式转换为另一种数据类型。其语法如下：",[114,34222,34224],{"className":33693,"code":34223,"language":33695,"meta":119,"style":119},"CAST(expression AS data_type)\n",[17,34225,34226],{"__ignoreMap":119},[78,34227,34228],{"class":124,"line":125},[78,34229,34223],{},[13,34231,34232],{},"请注意，expression可以是任何有效的SQL表达式，data_type可以是以下类型之一：BINARY，CHAR，DATE，DATETIME，TIME，DECIMAL，SIGNED，UNSIGNED。",[13,34234,33765],{},[49,34236,34237],{},[52,34238,34239],{},"将文本字符串'12'转换为整型",[114,34241,34243],{"className":33693,"code":34242,"language":33695,"meta":119,"style":119},"SELECT CAST('12' AS INT);\n",[17,34244,34245],{"__ignoreMap":119},[78,34246,34247],{"class":124,"line":125},[78,34248,34242],{},[49,34250,34251],{},[52,34252,34253],{},"将日期时间2021-01-01 12:34:56转换为日期",[114,34255,34257],{"className":33693,"code":34256,"language":33695,"meta":119,"style":119},"SELECT CAST('2021-01-01 12:34:56' AS DATE);\n",[17,34258,34259],{"__ignoreMap":119},[78,34260,34261],{"class":124,"line":125},[78,34262,34256],{},[13,34264,34265,34266],{},"(1) SQL之CAST函数用法-百度经验. ",[5009,34267,34268],{"href":34268,"rel":34269},"https:\u002F\u002Fjingyan.baidu.com\u002Farticle\u002F90808022fab5dbfd91c80f35.html",[23647],[13,34271,34272,34273],{},"(2) SQL CAST() - SQL. ",[5009,34274,34275],{"href":34275,"rel":34276},"https:\u002F\u002Fsql.sh\u002Ffonctions\u002Fcast",[23647],[13,34278,34279,34280],{},"(3) SQL Server CAST() Function - W3Schools. ",[5009,34281,34282],{"href":34282,"rel":34283},"https:\u002F\u002Fwww.w3schools.com\u002Fsql\u002Ffunc_sqlserver_cast.asp",[23647],[13,34285,34286,34287],{},"(4) SQL-cast()函数 - 知乎. ",[5009,34288,34289],{"href":34289,"rel":34290},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F343703794",[23647],[13,34292,34293,34294],{},"(5) MySQL cast()函数 - MySQL教程. ",[5009,34295,34296],{"href":34296,"rel":34297},"https:\u002F\u002Fwww.yiibai.com\u002Fmysql\u002Fcast.html",[23647],[13,34299,34300,34301],{},"(6) sql CAST用法 - 水狼一族 - 博客园. ",[5009,34302,34303],{"href":34303,"rel":34304},"https:\u002F\u002Fwww.cnblogs.com\u002Fshuilangyizu\u002Fp\u002F5952526.html",[23647],[23289,34306],{},[7759,34308,34310],{"id":34309},"_6sql语法row_number的具体操作","6、SQL语法row_number()的具体操作",[13,34312,34313],{},"row_number()是一个窗口函数，它为查询结果集中的每一行分配一个连续的整数。它的语法如下：",[114,34315,34317],{"className":33693,"code":34316,"language":33695,"meta":119,"style":119},"row_number() over (partition by column order by column)\n",[17,34318,34319],{"__ignoreMap":119},[78,34320,34321],{"class":124,"line":125},[78,34322,34316],{},[13,34324,34325],{},"其中，partition by子句用于指定分组依据，order by子句用于指定排序依据。如果没有partition by子句，则对整个结果集进行编号；如果没有order by子句，则按照任意顺序进行编号。",[13,34327,33765],{},[49,34329,34330],{},[52,34331,34332],{},"例1：从employee表中选择name、salary、department三列，并按照department分组，在每个分组内按照salary降序排序，给每一行添加一个序号rank。",[114,34334,34336],{"className":33693,"code":34335,"language":33695,"meta":119,"style":119},"select name, salary, department, row_number() over (partition by department order by salary desc) as rank\nfrom employee;\n",[17,34337,34338,34343],{"__ignoreMap":119},[78,34339,34340],{"class":124,"line":125},[78,34341,34342],{},"select name, salary, department, row_number() over (partition by department order by salary desc) as rank\n",[78,34344,34345],{"class":124,"line":132},[78,34346,34347],{},"from employee;\n",[13,34349,34350],{},"这样就会得到类似如下的表格：",[8366,34352,34353,34369],{},[8369,34354,34355],{},[8372,34356,34357,34360,34363,34366],{},[8375,34358,34359],{},"name",[8375,34361,34362],{},"salary",[8375,34364,34365],{},"department",[8375,34367,34368],{},"rank",[8386,34370,34371,34384,34396,34408,34421,34432],{},[8372,34372,34373,34376,34379,34382],{},[8391,34374,34375],{},"Alice",[8391,34377,34378],{},"8000",[8391,34380,34381],{},"IT",[8391,34383,469],{},[8372,34385,34386,34389,34392,34394],{},[8391,34387,34388],{},"Bob",[8391,34390,34391],{},"7000",[8391,34393,34381],{},[8391,34395,472],{},[8372,34397,34398,34401,34404,34406],{},[8391,34399,34400],{},"Cathy",[8391,34402,34403],{},"6000",[8391,34405,34381],{},[8391,34407,1025],{},[8372,34409,34410,34413,34416,34419],{},[8391,34411,34412],{},"David",[8391,34414,34415],{},"9000",[8391,34417,34418],{},"HR",[8391,34420,469],{},[8372,34422,34423,34426,34428,34430],{},[8391,34424,34425],{},"Eva",[8391,34427,34378],{},[8391,34429,34418],{},[8391,34431,472],{},[8372,34433,34434,34437,34439,34441],{},[8391,34435,34436],{},"Frank",[8391,34438,34391],{},[8391,34440,34418],{},[8391,34442,1025],{},[49,34444,34445],{},[52,34446,34447],{},"例2：从student表中选择name、score、class三列，并按照class分组，在每个分组内按照score降序排序，给每一行添加一个序号rank。",[114,34449,34451],{"className":33693,"code":34450,"language":33695,"meta":119,"style":119},"select name, score, class, row_number() over (partition by class order by score desc) as rank\nfrom student;\n",[17,34452,34453,34458],{"__ignoreMap":119},[78,34454,34455],{"class":124,"line":125},[78,34456,34457],{},"select name, score, class, row_number() over (partition by class order by score desc) as rank\n",[78,34459,34460],{"class":124,"line":132},[78,34461,34462],{},"from student;\n",[13,34464,34350],{},[8366,34466,34467,34481],{},[8369,34468,34469],{},[8372,34470,34471,34473,34476,34479],{},[8375,34472,34359],{},[8375,34474,34475],{},"score",[8375,34477,34478],{},"class",[8375,34480,34368],{},[8386,34482,34483,34495,34507,34519,34531,34543,34555,34567,34579,34590],{},[8372,34484,34485,34488,34491,34493],{},[8391,34486,34487],{},"Amy",[8391,34489,34490],{},"95",[8391,34492,17143],{},[8391,34494,469],{},[8372,34496,34497,34500,34503,34505],{},[8391,34498,34499],{},"Ben",[8391,34501,34502],{},"90",[8391,34504,17143],{},[8391,34506,472],{},[8372,34508,34509,34512,34515,34517],{},[8391,34510,34511],{},"Carl",[8391,34513,34514],{},"85",[8391,34516,17143],{},[8391,34518,1025],{},[8372,34520,34521,34524,34527,34529],{},[8391,34522,34523],{},"Dan",[8391,34525,34526],{},"80",[8391,34528,17143],{},[8391,34530,1014],{},[8372,34532,34533,34536,34539,34541],{},[8391,34534,34535],{},"Eve",[8391,34537,34538],{},"75",[8391,34540,17143],{},[8391,34542,11047],{},[8372,34544,34545,34548,34551,34553],{},[8391,34546,34547],{},"Fay",[8391,34549,34550],{},"92",[8391,34552,17148],{},[8391,34554,469],{},[8372,34556,34557,34560,34563,34565],{},[8391,34558,34559],{},"Glen",[8391,34561,34562],{},"88",[8391,34564,17148],{},[8391,34566,472],{},[8372,34568,34569,34572,34575,34577],{},[8391,34570,34571],{},"Hank",[8391,34573,34574],{},"84",[8391,34576,17148],{},[8391,34578,1025],{},[8372,34580,34581,34584,34586,34588],{},[8391,34582,34583],{},"Iris",[8391,34585,34526],{},[8391,34587,17148],{},[8391,34589,1014],{},[8372,34591,34592,34595,34598,34600],{},[8391,34593,34594],{},"Jack",[8391,34596,34597],{},"76",[8391,34599,17148],{},[8391,34601,11047],{},[13,34603,34604,34605],{},"(1) SQL ROW_NUMBER() Function - SQL Tutorial. ",[5009,34606,34607],{"href":34607,"rel":34608},"https:\u002F\u002Fwww.sqltutorial.org\u002Fsql-window-functions\u002Fsql-row_number\u002F",[23647],[13,34610,34611,34612],{},"(2) SQL Server Row_number()函数 - SQL Server教程. ",[5009,34613,34614],{"href":34614,"rel":34615},"https:\u002F\u002Fwww.yiibai.com\u002Fsqlserver\u002Fsql-server-row_number-function.html",[23647],[13,34617,34618,34619],{},"(3) 【SQL】連番を振るROW_NUMBER関数を解説！一番よく使う順位付け関数をマスターしよう | ポテパンスタイル. ",[5009,34620,34621],{"href":34621,"rel":34622},"https:\u002F\u002Fstyle.potepan.com\u002Farticles\u002F23566.html",[23647],[13,34624,34625,34626],{},"(4) ROW_NUMBER (Transact-SQL) - SQL Server | Microsoft Learn. ",[5009,34627,34628],{"href":34628,"rel":34629},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Ft-sql\u002Ffunctions\u002Frow-number-transact-sql?view=sql-server-ver16",[23647],[13,34631,34632,34633],{},"(5) SQL中row_number函数用法_sql的rownumber_sharon@zhang的博客-CSDN博客. ",[5009,34634,34635],{"href":34635,"rel":34636},"https:\u002F\u002Fblog.csdn.net\u002Fbaidu_41797613\u002Farticle\u002Fdetails\u002F120489521",[23647],[23289,34638],{},[7759,34640,34642],{"id":34641},"_7sql语法round的具体操作","7、SQL语法round()的具体操作",[13,34644,34645],{},"SQL round()函数用于把数值字段舍入为指定的小数位数。它的语法是：",[114,34647,34649],{"className":33693,"code":34648,"language":33695,"meta":119,"style":119},"round(number, decimals [, operation])\n",[17,34650,34651],{"__ignoreMap":119},[78,34652,34653],{"class":124,"line":125},[78,34654,34648],{},[13,34656,34657],{},"其中，number是要舍入的数值，decimals是要保留的小数位数，operation是可选的参数，表示是否进行截断而不是四舍五入。如果operation为0或省略，则进行四舍五入；如果operation为非0，则进行截断。",[13,34659,34660],{},"举两个例子：",[49,34662,34663],{},[52,34664,34665],{},"如果要把3.14159舍入为两位小数，可以使用：",[114,34667,34669],{"className":33693,"code":34668,"language":33695,"meta":119,"style":119},"select round(3.14159, 2);\n",[17,34670,34671],{"__ignoreMap":119},[78,34672,34673],{"class":124,"line":125},[78,34674,34668],{},[13,34676,34677],{},"结果是3.14。",[49,34679,34680],{},[52,34681,34682],{},"如果要把1234.5678截断为个位数，可以使用：",[114,34684,34686],{"className":33693,"code":34685,"language":33695,"meta":119,"style":119},"select round(1234.5678, 0, 1);\n",[17,34687,34688],{"__ignoreMap":119},[78,34689,34690],{"class":124,"line":125},[78,34691,34685],{},[13,34693,34694],{},"结果是1230。",[13,34696,34697,34698],{},"(1) SQL ROUND() 函数. ",[5009,34699,34700],{"href":34700,"rel":34701},"https:\u002F\u002Fwww.w3school.com.cn\u002Fsql\u002Fsql_func_round.asp",[23647],[13,34703,34704,34705],{},"(2) SQL Server ROUND() Function - W3Schools. ",[5009,34706,34707],{"href":34707,"rel":34708},"https:\u002F\u002Fwww.w3schools.com\u002FSQL\u002Ffunc_sqlserver_round.asp",[23647],[13,34710,34711,34712],{},"(3) SQL Server ROUND() Function - TutorialsTeacher. ",[5009,34713,34714],{"href":34714,"rel":34715},"https:\u002F\u002Fwww.tutorialsteacher.com\u002Fsqlserver\u002Fround-function",[23647],[13,34717,34718,34719],{},"(4) How to Use the ROUND() Function in SQL | LearnSQL.com. ",[5009,34720,34721],{"href":34721,"rel":34722},"https:\u002F\u002Flearnsql.com\u002Fblog\u002Fround-function-sql\u002F",[23647],[13,34724,34725,34726],{},"(5) SQL ROUND() 函數 \u002F Function - SQL 語法教學 Tutorial. ",[5009,34727,34728],{"href":34728,"rel":34729},"https:\u002F\u002Fwww.fooish.com\u002Fsql\u002Fround-function.html",[23647],[13,34731,34732,34733],{},"(6) ROUND (Transact-SQL) - SQL Server | Microsoft Learn. ",[5009,34734,34735],{"href":34735,"rel":34736},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Ft-sql\u002Ffunctions\u002Fround-transact-sql?view=sql-server-ver16",[23647],[23289,34738],{},[7759,34740,34742],{"id":34741},"_8sql语法lag和lead的具体操作","8、SQL语法lag()和lead()的具体操作",[13,34744,34745],{},"SQL语法中的lag()和lead()函数是两种窗口分析函数，可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。这两个函数有三个参数，第一个参数是列名，第二个参数是偏移的行数，第三个参数是超出记录窗口时的默认值。",[13,34747,34660],{},[2285,34749,34750],{},[52,34751,34752],{},"查询每个员工的姓名、部门、工资以及比他工资高的下一个员工的姓名和工资。",[114,34754,34756],{"className":33693,"code":34755,"language":33695,"meta":119,"style":119},"select name, dept, salary,\nlead(name) over (partition by dept order by salary desc) as next_name,\nlead(salary) over (partition by dept order by salary desc) as next_salary\nfrom employee;\n",[17,34757,34758,34763,34768,34773],{"__ignoreMap":119},[78,34759,34760],{"class":124,"line":125},[78,34761,34762],{},"select name, dept, salary,\n",[78,34764,34765],{"class":124,"line":132},[78,34766,34767],{},"lead(name) over (partition by dept order by salary desc) as next_name,\n",[78,34769,34770],{"class":124,"line":138},[78,34771,34772],{},"lead(salary) over (partition by dept order by salary desc) as next_salary\n",[78,34774,34775],{"class":124,"line":144},[78,34776,34347],{},[2285,34778,34779],{"start":132},[52,34780,34781],{},"查询每个商品的名称、价格以及与上一个商品价格的差异。",[114,34783,34785],{"className":33693,"code":34784,"language":33695,"meta":119,"style":119},"select product, price,\nprice - lag(price) over (order by price asc) as diff\nfrom goods;\n",[17,34786,34787,34792,34797],{"__ignoreMap":119},[78,34788,34789],{"class":124,"line":125},[78,34790,34791],{},"select product, price,\n",[78,34793,34794],{"class":124,"line":132},[78,34795,34796],{},"price - lag(price) over (order by price asc) as diff\n",[78,34798,34799],{"class":124,"line":138},[78,34800,34801],{},"from goods;\n",[13,34803,34804,34805],{},"(1) 关于SQL的LAG()和LEAD()函数_lag sql_一碗烫烫的汤圆的博客-CSDN博客. ",[5009,34806,34807],{"href":34807,"rel":34808},"https:\u002F\u002Fblog.csdn.net\u002Fa5276957\u002Farticle\u002Fdetails\u002F103808997",[23647],[13,34810,34811,34812],{},"(2) Sql窗口分析函数【lead、lag详解】 - 知乎. ",[5009,34813,34814],{"href":34814,"rel":34815},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F466752301",[23647],[13,34817,34818,34819],{},"(3) lag lead分析函数 - 知乎. ",[5009,34820,34821],{"href":34821,"rel":34822},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F347444265",[23647],[13,34824,34825,34826],{},"(4) SQL中lag()和lead()函数使用_lag函数_Schafferyy的博客-CSDN博客. ",[5009,34827,34828],{"href":34828,"rel":34829},"https:\u002F\u002Fblog.csdn.net\u002FSchaffer_W\u002Farticle\u002Fdetails\u002F109029630",[23647],[23289,34831],{},[7759,34833,34835],{"id":34834},"_9sql语法lateral-view的具体操作","9、SQL语法lateral view的具体操作",[13,34837,34838],{},"SQL语法中的lateral view子句是用于和split、explode等UDTF（用户自定义表生成函数）一起使用的，它能够将一行数据拆成多行数据，在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF，UTDF会把一行拆分成一或者多行，lateral view再把结果组合，产生一个支持别名表的虚拟表。",[13,34840,34660],{},[2285,34842,34843],{},[52,34844,34845],{},"查询每个学生的姓名、年龄以及选修的课程名称。",[114,34847,34849],{"className":33693,"code":34848,"language":33695,"meta":119,"style":119},"select name, age, course\nfrom student\nlateral view explode(split(courses, ',')) t as course;\n",[17,34850,34851,34856,34861],{"__ignoreMap":119},[78,34852,34853],{"class":124,"line":125},[78,34854,34855],{},"select name, age, course\n",[78,34857,34858],{"class":124,"line":132},[78,34859,34860],{},"from student\n",[78,34862,34863],{"class":124,"line":138},[78,34864,34865],{},"lateral view explode(split(courses, ',')) t as course;\n",[2285,34867,34868],{"start":132},[52,34869,34870],{},"查询每个订单的编号、金额以及包含的商品名称和数量。",[114,34872,34874],{"className":33693,"code":34873,"language":33695,"meta":119,"style":119},"select order_id, amount, product, quantity\nfrom order\nlateral view explode(items) t as item\nlateral view explode(map_keys(item)) k as product\nlateral view explode(map_values(item)) v as quantity;\n",[17,34875,34876,34881,34886,34891,34896],{"__ignoreMap":119},[78,34877,34878],{"class":124,"line":125},[78,34879,34880],{},"select order_id, amount, product, quantity\n",[78,34882,34883],{"class":124,"line":132},[78,34884,34885],{},"from order\n",[78,34887,34888],{"class":124,"line":138},[78,34889,34890],{},"lateral view explode(items) t as item\n",[78,34892,34893],{"class":124,"line":144},[78,34894,34895],{},"lateral view explode(map_keys(item)) k as product\n",[78,34897,34898],{"class":124,"line":150},[78,34899,34900],{},"lateral view explode(map_values(item)) v as quantity;\n",[13,34902,34903,34904],{},"(1) SQL 之 lateral view explode()_hankl1990的博客-CSDN博客. ",[5009,34905,34906],{"href":34906,"rel":34907},"https:\u002F\u002Fblog.csdn.net\u002Fweixin_36630761\u002Farticle\u002Fdetails\u002F76146842",[23647],[13,34909,34910,34911],{},"(2) Lateral View语法 - 简书. ",[5009,34912,34913],{"href":34913,"rel":34914},"https:\u002F\u002Fwww.jianshu.com\u002Fp\u002F4804db6a3677",[23647],[13,34916,34917,34918],{},"(3) LATERAL VIEW 子句 - Azure Databricks - Databricks SQL. ",[5009,34919,34920],{"href":34920,"rel":34921},"https:\u002F\u002Flearn.microsoft.com\u002Fzh-cn\u002Fazure\u002Fdatabricks\u002Fsql\u002Flanguage-manual\u002Fsql-ref-syntax-qry-select-lateral-view",[23647],[13,34923,34924,34925],{},"(4) SQL: lateral view & explode & split (分割&侧视图) - 知乎. ",[5009,34926,34927],{"href":34927,"rel":34928},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F538641683",[23647],[13,34930,34931,34932],{},"(5) LATERAL VIEW clause - Azure Databricks - Databricks SQL. ",[5009,34933,34934],{"href":34934,"rel":34935},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fdatabricks\u002Fsql\u002Flanguage-manual\u002Fsql-ref-syntax-qry-select-lateral-view",[23647],[23289,34937],{},[7759,34939,34941],{"id":34940},"_10sql-udtf-常见操作","10、SQL UDTF 常见操作",[13,34943,34944],{},"SQL UDTF（用户自定义表值函数）是一种可以返回多行数据的函数，它可以接受0个、1个或多个标量值作为输入参数。UDTF可以在查询的FROM子句中使用，也可以和lateral view子句结合使用。",[13,34946,34660],{},[2285,34948,34949],{},[52,34950,34951],{},"创建一个UDTF，用于将一个字符串按照指定的分隔符拆分成多行。",[114,34953,34955],{"className":33693,"code":34954,"language":33695,"meta":119,"style":119},"create function split_string(str string, sep string)\nreturns table (word string)\nas\nreturn select value as word from unnest(string_to_array(str, sep));\n",[17,34956,34957,34962,34967,34972],{"__ignoreMap":119},[78,34958,34959],{"class":124,"line":125},[78,34960,34961],{},"create function split_string(str string, sep string)\n",[78,34963,34964],{"class":124,"line":132},[78,34965,34966],{},"returns table (word string)\n",[78,34968,34969],{"class":124,"line":138},[78,34970,34971],{},"as\n",[78,34973,34974],{"class":124,"line":144},[78,34975,34976],{},"return select value as word from unnest(string_to_array(str, sep));\n",[2285,34978,34979],{"start":132},[52,34980,34981],{},"创建一个UDTF，用于将一个日期范围转换成每一天的日期。",[114,34983,34985],{"className":33693,"code":34984,"language":33695,"meta":119,"style":119},"create function date_range(start_date date, end_date date)\nreturns table (day date)\nas\nreturn select generate_series(start_date, end_date, interval '1 day')::date as day;\n",[17,34986,34987,34992,34997,35001],{"__ignoreMap":119},[78,34988,34989],{"class":124,"line":125},[78,34990,34991],{},"create function date_range(start_date date, end_date date)\n",[78,34993,34994],{"class":124,"line":132},[78,34995,34996],{},"returns table (day date)\n",[78,34998,34999],{"class":124,"line":138},[78,35000,34971],{},[78,35002,35003],{"class":124,"line":144},[78,35004,35005],{},"return select generate_series(start_date, end_date, interval '1 day')::date as day;\n",[13,35007,35008,35009],{},"(1) Flink自定义表值函数UDTF开发、注册和使用流程_实时计算 Flink版-阿里云帮助中心. ",[5009,35010,35011],{"href":35011,"rel":35012},"https:\u002F\u002Fhelp.aliyun.com\u002Fdocument_detail\u002F188055.html",[23647],[13,35014,35015,35016],{},"(2) Tabular SQL UDFs (UDTFs) | Snowflake Documentation. ",[5009,35017,35018],{"href":35018,"rel":35019},"https:\u002F\u002Fdocs.snowflake.com\u002Fen\u002Fdeveloper-guide\u002Fudf\u002Fsql\u002Fudf-sql-tabular-functions",[23647],[13,35021,35022,35023],{},"(3) mySql的UDF是什么 - 洪福必成 - 博客园. ",[5009,35024,35025],{"href":35025,"rel":35026},"https:\u002F\u002Fwww.cnblogs.com\u002Fghc666\u002Fp\u002F8609067.html",[23647],[13,35028,35029,35030],{},"(4) Udf in SQL Server: Create UDF (User Defined Function) in SQL Database. ",[5009,35031,35032],{"href":35032,"rel":35033},"https:\u002F\u002Fwww.webtrainingroom.com\u002Fsql\u002Fudf",[23647],[13,35035,35036,35037],{},"(5) User-Defined Functions - SQL Server | Microsoft Learn. ",[5009,35038,35039],{"href":35039,"rel":35040},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fuser-defined-functions\u002Fuser-defined-functions?view=sql-server-ver16",[23647],[23289,35042],{},[7759,35044,35045],{"id":35045},"课后小练",[10548,35047,35049],{"id":35048},"_1常见sql行列转换","（1）常见SQL——行列转换",[114,35051,35053],{"className":33693,"code":35052,"language":33695,"meta":119,"style":119},"描述：表中记录了各年份各部门的平均绩效考核成绩。 \n表名：t1 \n表结构： a -- 年份 \n        b -- 部门 \n        c -- 绩效得分 \n表内容： a  b  c \n      2014 B  9 \n      2015 A  8 \n      2014 A  10 \n      2015 B  7 \n问题一：多行转多列 \n问题描述：将上述表内容转为如下输出结果所示： \n     a col_A col_B \n   2014   10   9 \n   2015   8    7 \n   \n   \n参考答案： \nselect a, \n       max(case when b=\"A\" then c end) col_A, \n       max(case when b=\"B\" then c end) col_B\nfrom t1 \ngroup by a;\n",[17,35054,35055,35060,35065,35070,35075,35080,35085,35090,35095,35100,35105,35110,35115,35120,35125,35130,35135,35139,35144,35149,35154,35159,35164],{"__ignoreMap":119},[78,35056,35057],{"class":124,"line":125},[78,35058,35059],{},"描述：表中记录了各年份各部门的平均绩效考核成绩。 \n",[78,35061,35062],{"class":124,"line":132},[78,35063,35064],{},"表名：t1 \n",[78,35066,35067],{"class":124,"line":138},[78,35068,35069],{},"表结构： a -- 年份 \n",[78,35071,35072],{"class":124,"line":144},[78,35073,35074],{},"        b -- 部门 \n",[78,35076,35077],{"class":124,"line":150},[78,35078,35079],{},"        c -- 绩效得分 \n",[78,35081,35082],{"class":124,"line":156},[78,35083,35084],{},"表内容： a  b  c \n",[78,35086,35087],{"class":124,"line":162},[78,35088,35089],{},"      2014 B  9 \n",[78,35091,35092],{"class":124,"line":168},[78,35093,35094],{},"      2015 A  8 \n",[78,35096,35097],{"class":124,"line":174},[78,35098,35099],{},"      2014 A  10 \n",[78,35101,35102],{"class":124,"line":180},[78,35103,35104],{},"      2015 B  7 \n",[78,35106,35107],{"class":124,"line":186},[78,35108,35109],{},"问题一：多行转多列 \n",[78,35111,35112],{"class":124,"line":192},[78,35113,35114],{},"问题描述：将上述表内容转为如下输出结果所示： \n",[78,35116,35117],{"class":124,"line":198},[78,35118,35119],{},"     a col_A col_B \n",[78,35121,35122],{"class":124,"line":204},[78,35123,35124],{},"   2014   10   9 \n",[78,35126,35127],{"class":124,"line":210},[78,35128,35129],{},"   2015   8    7 \n",[78,35131,35132],{"class":124,"line":216},[78,35133,35134],{},"   \n",[78,35136,35137],{"class":124,"line":222},[78,35138,35134],{},[78,35140,35141],{"class":124,"line":421},[78,35142,35143],{},"参考答案： \n",[78,35145,35146],{"class":124,"line":427},[78,35147,35148],{},"select a, \n",[78,35150,35151],{"class":124,"line":433},[78,35152,35153],{},"       max(case when b=\"A\" then c end) col_A, \n",[78,35155,35156],{"class":124,"line":2443},[78,35157,35158],{},"       max(case when b=\"B\" then c end) col_B\n",[78,35160,35161],{"class":124,"line":2448},[78,35162,35163],{},"from t1 \n",[78,35165,35166],{"class":124,"line":2454},[78,35167,35168],{},"group by a;\n",[10548,35170,35172],{"id":35171},"_2多行转多列背景和第一题相同","（2）多行转多列（背景和第一题相同）",[114,35174,35176],{"className":33693,"code":35175,"language":33695,"meta":119,"style":119},"问题描述：2014 年公司组织架构调整，导致部门出现多个绩效，业务及人员不同，\n无法合并算绩效，源表内容如下：\n    2014 B 9\n    2015 A 8\n    2014 A 10\n    2015 B 7\n    2014 B 6\n输出结果如下所示：\n    a col_A col_B\n   2014 10  6,9\n   2015  8   7\n   \n   \n参考答案:\nselect a,\n       max(case when b=\"A\" then c end) col_A,\n       max(case when b=\"B\" then c end) col_B\nfrom (\n       select a, b,\n              concat_ws(\",\",collect_set(cast(c as string))) as c       # 将相同部门数字转换为字符串后进行拼接\n       from t1\n       group by a,b\n)tmp\ngroup by a;\n",[17,35177,35178,35183,35188,35193,35198,35203,35208,35213,35218,35223,35228,35233,35237,35241,35246,35251,35256,35260,35265,35270,35275,35280,35285,35290],{"__ignoreMap":119},[78,35179,35180],{"class":124,"line":125},[78,35181,35182],{},"问题描述：2014 年公司组织架构调整，导致部门出现多个绩效，业务及人员不同，\n",[78,35184,35185],{"class":124,"line":132},[78,35186,35187],{},"无法合并算绩效，源表内容如下：\n",[78,35189,35190],{"class":124,"line":138},[78,35191,35192],{},"    2014 B 9\n",[78,35194,35195],{"class":124,"line":144},[78,35196,35197],{},"    2015 A 8\n",[78,35199,35200],{"class":124,"line":150},[78,35201,35202],{},"    2014 A 10\n",[78,35204,35205],{"class":124,"line":156},[78,35206,35207],{},"    2015 B 7\n",[78,35209,35210],{"class":124,"line":162},[78,35211,35212],{},"    2014 B 6\n",[78,35214,35215],{"class":124,"line":168},[78,35216,35217],{},"输出结果如下所示：\n",[78,35219,35220],{"class":124,"line":174},[78,35221,35222],{},"    a col_A col_B\n",[78,35224,35225],{"class":124,"line":180},[78,35226,35227],{},"   2014 10  6,9\n",[78,35229,35230],{"class":124,"line":186},[78,35231,35232],{},"   2015  8   7\n",[78,35234,35235],{"class":124,"line":192},[78,35236,35134],{},[78,35238,35239],{"class":124,"line":198},[78,35240,35134],{},[78,35242,35243],{"class":124,"line":204},[78,35244,35245],{},"参考答案:\n",[78,35247,35248],{"class":124,"line":210},[78,35249,35250],{},"select a,\n",[78,35252,35253],{"class":124,"line":216},[78,35254,35255],{},"       max(case when b=\"A\" then c end) col_A,\n",[78,35257,35258],{"class":124,"line":222},[78,35259,35158],{},[78,35261,35262],{"class":124,"line":421},[78,35263,35264],{},"from (\n",[78,35266,35267],{"class":124,"line":427},[78,35268,35269],{},"       select a, b,\n",[78,35271,35272],{"class":124,"line":433},[78,35273,35274],{},"              concat_ws(\",\",collect_set(cast(c as string))) as c       # 将相同部门数字转换为字符串后进行拼接\n",[78,35276,35277],{"class":124,"line":2443},[78,35278,35279],{},"       from t1\n",[78,35281,35282],{"class":124,"line":2448},[78,35283,35284],{},"       group by a,b\n",[78,35286,35287],{"class":124,"line":2454},[78,35288,35289],{},")tmp\n",[78,35291,35292],{"class":124,"line":2460},[78,35293,35168],{},[10548,35295,35297],{"id":35296},"_3按a分组取b字段排最小时对应的c字段","（3）按a分组取b字段排最小时对应的c字段",[114,35299,35301],{"className":33693,"code":35300,"language":33695,"meta":119,"style":119},"表名：t2\n表字段及内容：\n    a   b  c\n  2014  A  3\n  2014  B  1\n  2014  C  2\n  2015  A  4\n  2015  D  3\n问题一：按 a 分组取 b 字段最小时对应的 c 字段\n输出结果如下所示：\n   a   min_c\n  2014   3\n  2015   4\n  \n  \n参考答案:\nselect a, c as min_c\nfrom\n(\n       select a, b, c,\n              row_number() over(partition by a order by b) as rn\n       from t2\n) a\nwhere rn = 1;\n\nSQL解释：\n从t2表中选择a、b、c三列，按照a列进行分组，然后在每个分组内按照b列进行排序，给每一行添加一个序号rn。然后从这个结果中选择a、c两列，并将c列重命名为min_c。最后只保留rn等于1的行，也就是每个分组内b列最小的那一行。\n",[17,35302,35303,35308,35313,35318,35323,35328,35333,35338,35343,35348,35352,35357,35362,35367,35372,35376,35380,35385,35390,35395,35400,35405,35410,35415,35420,35424,35429],{"__ignoreMap":119},[78,35304,35305],{"class":124,"line":125},[78,35306,35307],{},"表名：t2\n",[78,35309,35310],{"class":124,"line":132},[78,35311,35312],{},"表字段及内容：\n",[78,35314,35315],{"class":124,"line":138},[78,35316,35317],{},"    a   b  c\n",[78,35319,35320],{"class":124,"line":144},[78,35321,35322],{},"  2014  A  3\n",[78,35324,35325],{"class":124,"line":150},[78,35326,35327],{},"  2014  B  1\n",[78,35329,35330],{"class":124,"line":156},[78,35331,35332],{},"  2014  C  2\n",[78,35334,35335],{"class":124,"line":162},[78,35336,35337],{},"  2015  A  4\n",[78,35339,35340],{"class":124,"line":168},[78,35341,35342],{},"  2015  D  3\n",[78,35344,35345],{"class":124,"line":174},[78,35346,35347],{},"问题一：按 a 分组取 b 字段最小时对应的 c 字段\n",[78,35349,35350],{"class":124,"line":180},[78,35351,35217],{},[78,35353,35354],{"class":124,"line":186},[78,35355,35356],{},"   a   min_c\n",[78,35358,35359],{"class":124,"line":192},[78,35360,35361],{},"  2014   3\n",[78,35363,35364],{"class":124,"line":198},[78,35365,35366],{},"  2015   4\n",[78,35368,35369],{"class":124,"line":204},[78,35370,35371],{},"  \n",[78,35373,35374],{"class":124,"line":210},[78,35375,35371],{},[78,35377,35378],{"class":124,"line":216},[78,35379,35245],{},[78,35381,35382],{"class":124,"line":222},[78,35383,35384],{},"select a, c as min_c\n",[78,35386,35387],{"class":124,"line":421},[78,35388,35389],{},"from\n",[78,35391,35392],{"class":124,"line":427},[78,35393,35394],{},"(\n",[78,35396,35397],{"class":124,"line":433},[78,35398,35399],{},"       select a, b, c,\n",[78,35401,35402],{"class":124,"line":2443},[78,35403,35404],{},"              row_number() over(partition by a order by b) as rn\n",[78,35406,35407],{"class":124,"line":2448},[78,35408,35409],{},"       from t2\n",[78,35411,35412],{"class":124,"line":2454},[78,35413,35414],{},") a\n",[78,35416,35417],{"class":124,"line":2460},[78,35418,35419],{},"where rn = 1;\n",[78,35421,35422],{"class":124,"line":2465},[78,35423,129],{"emptyLinePlaceholder":128},[78,35425,35426],{"class":124,"line":2470},[78,35427,35428],{},"SQL解释：\n",[78,35430,35431],{"class":124,"line":2903},[78,35432,35433],{},"从t2表中选择a、b、c三列，按照a列进行分组，然后在每个分组内按照b列进行排序，给每一行添加一个序号rn。然后从这个结果中选择a、c两列，并将c列重命名为min_c。最后只保留rn等于1的行，也就是每个分组内b列最小的那一行。\n",[10548,35435,35437],{"id":35436},"_4按a分组按b字段排序对b取累计排名比例","（4）按a分组按b字段排序，对b取累计排名比例",[114,35439,35441],{"className":33693,"code":35440,"language":33695,"meta":119,"style":119},"表名：t3\n表字段及内容：\n    a   b   c\n  2014  A   3\n  2014  B   1\n  2014  C   2\n  2015  A   4\n  2015  D   7\n输出结果如下所示：\n    a  b  ratio_c\n  2014 A   0.33\n  2014 B   0.67\n  2014 C   1.00\n  2015 A   0.50\n  2015 D   1.00\n\n\n参考答案：\nselect a, b,\n       round(row_number() over(partition by a order by b) \n             \u002F (count(c) over(partition by a)),2) as ratio_c\nfrom t3\norder by a,b\n\nSQL解释：\n从t3表中选择a、b两列，并计算一个新的列ratio_c，它表示每个a分组内的行号与该分组内c列的总数的比值，保留两位小数。然后按照a、b两列进行排序。\n",[17,35442,35443,35448,35452,35457,35462,35467,35472,35477,35482,35486,35491,35496,35501,35506,35511,35516,35520,35524,35529,35534,35539,35544,35549,35554,35558,35562],{"__ignoreMap":119},[78,35444,35445],{"class":124,"line":125},[78,35446,35447],{},"表名：t3\n",[78,35449,35450],{"class":124,"line":132},[78,35451,35312],{},[78,35453,35454],{"class":124,"line":138},[78,35455,35456],{},"    a   b   c\n",[78,35458,35459],{"class":124,"line":144},[78,35460,35461],{},"  2014  A   3\n",[78,35463,35464],{"class":124,"line":150},[78,35465,35466],{},"  2014  B   1\n",[78,35468,35469],{"class":124,"line":156},[78,35470,35471],{},"  2014  C   2\n",[78,35473,35474],{"class":124,"line":162},[78,35475,35476],{},"  2015  A   4\n",[78,35478,35479],{"class":124,"line":168},[78,35480,35481],{},"  2015  D   7\n",[78,35483,35484],{"class":124,"line":174},[78,35485,35217],{},[78,35487,35488],{"class":124,"line":180},[78,35489,35490],{},"    a  b  ratio_c\n",[78,35492,35493],{"class":124,"line":186},[78,35494,35495],{},"  2014 A   0.33\n",[78,35497,35498],{"class":124,"line":192},[78,35499,35500],{},"  2014 B   0.67\n",[78,35502,35503],{"class":124,"line":198},[78,35504,35505],{},"  2014 C   1.00\n",[78,35507,35508],{"class":124,"line":204},[78,35509,35510],{},"  2015 A   0.50\n",[78,35512,35513],{"class":124,"line":210},[78,35514,35515],{},"  2015 D   1.00\n",[78,35517,35518],{"class":124,"line":216},[78,35519,129],{"emptyLinePlaceholder":128},[78,35521,35522],{"class":124,"line":222},[78,35523,129],{"emptyLinePlaceholder":128},[78,35525,35526],{"class":124,"line":421},[78,35527,35528],{},"参考答案：\n",[78,35530,35531],{"class":124,"line":427},[78,35532,35533],{},"select a, b,\n",[78,35535,35536],{"class":124,"line":433},[78,35537,35538],{},"       round(row_number() over(partition by a order by b) \n",[78,35540,35541],{"class":124,"line":2443},[78,35542,35543],{},"             \u002F (count(c) over(partition by a)),2) as ratio_c\n",[78,35545,35546],{"class":124,"line":2448},[78,35547,35548],{},"from t3\n",[78,35550,35551],{"class":124,"line":2454},[78,35552,35553],{},"order by a,b\n",[78,35555,35556],{"class":124,"line":2460},[78,35557,129],{"emptyLinePlaceholder":128},[78,35559,35560],{"class":124,"line":2465},[78,35561,35428],{},[78,35563,35564],{"class":124,"line":2470},[78,35565,35566],{},"从t3表中选择a、b两列，并计算一个新的列ratio_c，它表示每个a分组内的行号与该分组内c列的总数的比值，保留两位小数。然后按照a、b两列进行排序。\n",[10548,35568,35570],{"id":35569},"_5按a分组按b字段排序对c取平均值","（5）按a分组按b字段排序，对c取平均值",[114,35572,35574],{"className":33693,"code":35573,"language":33695,"meta":119,"style":119},"表名：t4\n表字段及内容：\n    a   b   c\n   2014 A   3\n   2014 B   1\n   2014 C   2\n   2015 A   4\n   2015 D   3\n问题描述：前一行与当前行的均值！\n输出结果如下所示：\n    a   b avg_c\n   2014 A   3\n   2014 B   2\n   2014 C  1.5\n   2015 A   4\n   2015 D  3.5\n   \n   \n参考答案：\nselect a, b,\n       case when lag_c is null then c\n       else (c+lag_c)\u002F2 end as avg_c\nfrom\n(\n       select a, b, c,\n              lag(c,1) over(partition by a order by b) as lag_c\n       from t4\n)temp;\n",[17,35575,35576,35581,35585,35589,35594,35599,35604,35609,35614,35619,35623,35628,35632,35637,35642,35646,35651,35655,35659,35663,35667,35672,35677,35681,35685,35689,35694,35699],{"__ignoreMap":119},[78,35577,35578],{"class":124,"line":125},[78,35579,35580],{},"表名：t4\n",[78,35582,35583],{"class":124,"line":132},[78,35584,35312],{},[78,35586,35587],{"class":124,"line":138},[78,35588,35456],{},[78,35590,35591],{"class":124,"line":144},[78,35592,35593],{},"   2014 A   3\n",[78,35595,35596],{"class":124,"line":150},[78,35597,35598],{},"   2014 B   1\n",[78,35600,35601],{"class":124,"line":156},[78,35602,35603],{},"   2014 C   2\n",[78,35605,35606],{"class":124,"line":162},[78,35607,35608],{},"   2015 A   4\n",[78,35610,35611],{"class":124,"line":168},[78,35612,35613],{},"   2015 D   3\n",[78,35615,35616],{"class":124,"line":174},[78,35617,35618],{},"问题描述：前一行与当前行的均值！\n",[78,35620,35621],{"class":124,"line":180},[78,35622,35217],{},[78,35624,35625],{"class":124,"line":186},[78,35626,35627],{},"    a   b avg_c\n",[78,35629,35630],{"class":124,"line":192},[78,35631,35593],{},[78,35633,35634],{"class":124,"line":198},[78,35635,35636],{},"   2014 B   2\n",[78,35638,35639],{"class":124,"line":204},[78,35640,35641],{},"   2014 C  1.5\n",[78,35643,35644],{"class":124,"line":210},[78,35645,35608],{},[78,35647,35648],{"class":124,"line":216},[78,35649,35650],{},"   2015 D  3.5\n",[78,35652,35653],{"class":124,"line":222},[78,35654,35134],{},[78,35656,35657],{"class":124,"line":421},[78,35658,35134],{},[78,35660,35661],{"class":124,"line":427},[78,35662,35528],{},[78,35664,35665],{"class":124,"line":433},[78,35666,35533],{},[78,35668,35669],{"class":124,"line":2443},[78,35670,35671],{},"       case when lag_c is null then c\n",[78,35673,35674],{"class":124,"line":2448},[78,35675,35676],{},"       else (c+lag_c)\u002F2 end as avg_c\n",[78,35678,35679],{"class":124,"line":2454},[78,35680,35389],{},[78,35682,35683],{"class":124,"line":2460},[78,35684,35394],{},[78,35686,35687],{"class":124,"line":2465},[78,35688,35399],{},[78,35690,35691],{"class":124,"line":2470},[78,35692,35693],{},"              lag(c,1) over(partition by a order by b) as lag_c\n",[78,35695,35696],{"class":124,"line":2903},[78,35697,35698],{},"       from t4\n",[78,35700,35701],{"class":124,"line":2909},[78,35702,35703],{},")temp;\n",[226,35705,228],{},{"title":119,"searchDepth":144,"depth":144,"links":35707},[35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718],{"id":33683,"depth":144,"text":33684},{"id":33882,"depth":144,"text":33883},{"id":34029,"depth":144,"text":34030},{"id":34120,"depth":144,"text":34121},{"id":34211,"depth":144,"text":34212},{"id":34309,"depth":144,"text":34310},{"id":34641,"depth":144,"text":34642},{"id":34741,"depth":144,"text":34742},{"id":34834,"depth":144,"text":34835},{"id":34940,"depth":144,"text":34941},{"id":35045,"depth":144,"text":35045},{},"Little Tips\u002FSQL小练1.md","\u002Fundergraduate\u002Fnote-48979c5db8d2",{"title":33636,"description":119},"undergraduate\u002Fnote-48979c5db8d2",[23378,10715,35725],"求职","QCkYBCvDfrBbtE6nZFryokch4ktuGlu1uHl7G11j3uk",{"id":35728,"title":246,"assetBase":239,"author":8,"body":35729,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":36088,"navigation":128,"originalPath":36089,"path":36090,"seo":36091,"source":23330,"stem":36092,"tags":36093,"weight":250,"__hash__":36094},"content\u002Fundergraduate\u002Fnote-50f66f7fb2b0.md",{"type":10,"value":35730,"toc":36083},[35731,35735,35820,35824,35915,35919,35997,36000,36081],[7759,35732,35734],{"id":35733},"_21-最长递归子序列","2.1 最长递归子序列",[114,35736,35738],{"className":23652,"code":35737,"language":23654,"meta":119,"style":119},"    public int lengthOfLIS(int[] nums) {\n        \u002F\u002F 初始化dp数组为1\n        int[] dp = new int[nums.length];\n        Arrays.fill(dp,1);\n        for (int i = 0; i \u003C nums.length; i++) {\n            for (int j = 0; j \u003C i; j++) {\n                if(nums[i] > nums[j])\n                    dp[i] = Math.max(dp[i], dp[j] + 1);\n            }\n        }\n\n        int res = 0;\n        for (int i = 0; i \u003C dp.length; i++) {\n            res = Math.max(res, dp[i]);\n        }\n        return res;\n    }\n",[17,35739,35740,35745,35750,35755,35760,35765,35770,35775,35780,35784,35788,35792,35797,35802,35807,35811,35816],{"__ignoreMap":119},[78,35741,35742],{"class":124,"line":125},[78,35743,35744],{},"    public int lengthOfLIS(int[] nums) {\n",[78,35746,35747],{"class":124,"line":132},[78,35748,35749],{},"        \u002F\u002F 初始化dp数组为1\n",[78,35751,35752],{"class":124,"line":138},[78,35753,35754],{},"        int[] dp = new int[nums.length];\n",[78,35756,35757],{"class":124,"line":144},[78,35758,35759],{},"        Arrays.fill(dp,1);\n",[78,35761,35762],{"class":124,"line":150},[78,35763,35764],{},"        for (int i = 0; i \u003C nums.length; i++) {\n",[78,35766,35767],{"class":124,"line":156},[78,35768,35769],{},"            for (int j = 0; j \u003C i; j++) {\n",[78,35771,35772],{"class":124,"line":162},[78,35773,35774],{},"                if(nums[i] > nums[j])\n",[78,35776,35777],{"class":124,"line":168},[78,35778,35779],{},"                    dp[i] = Math.max(dp[i], dp[j] + 1);\n",[78,35781,35782],{"class":124,"line":174},[78,35783,9615],{},[78,35785,35786],{"class":124,"line":180},[78,35787,10054],{},[78,35789,35790],{"class":124,"line":186},[78,35791,129],{"emptyLinePlaceholder":128},[78,35793,35794],{"class":124,"line":192},[78,35795,35796],{},"        int res = 0;\n",[78,35798,35799],{"class":124,"line":198},[78,35800,35801],{},"        for (int i = 0; i \u003C dp.length; i++) {\n",[78,35803,35804],{"class":124,"line":204},[78,35805,35806],{},"            res = Math.max(res, dp[i]);\n",[78,35808,35809],{"class":124,"line":210},[78,35810,10054],{},[78,35812,35813],{"class":124,"line":216},[78,35814,35815],{},"        return res;\n",[78,35817,35818],{"class":124,"line":222},[78,35819,15810],{},[7759,35821,35823],{"id":35822},"_22-信封嵌套","2.2 信封嵌套",[114,35825,35827],{"className":23652,"code":35826,"language":23654,"meta":119,"style":119},"    public int maxEnvelopes (int[][] envelopes) {\n        int n = envelopes.length;\n        \u002F\u002F 重写排序规则\n        Arrays.sort(envelopes, new Comparator\u003Cint[]>() {\n            @Override\n            public int compare(int[] o1, int[] o2) {\n                \u002F\u002F 按照第一个元素递增、相同情况下第二个元素递减排序\n                return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];\n            }\n        });\n\n        int[] height = new int[n];\n        for (int i = 0; i \u003C n; i++) {\n            \u002F\u002F 第一个元素有序，第二个元素无序，寻找最长递增子序列\n            height[i] = envelopes[i][1];\n        }\n        return lengthOfLIS(height);\n    }\n",[17,35828,35829,35834,35839,35844,35849,35854,35859,35864,35869,35873,35878,35882,35887,35892,35897,35902,35906,35911],{"__ignoreMap":119},[78,35830,35831],{"class":124,"line":125},[78,35832,35833],{},"    public int maxEnvelopes (int[][] envelopes) {\n",[78,35835,35836],{"class":124,"line":132},[78,35837,35838],{},"        int n = envelopes.length;\n",[78,35840,35841],{"class":124,"line":138},[78,35842,35843],{},"        \u002F\u002F 重写排序规则\n",[78,35845,35846],{"class":124,"line":144},[78,35847,35848],{},"        Arrays.sort(envelopes, new Comparator\u003Cint[]>() {\n",[78,35850,35851],{"class":124,"line":150},[78,35852,35853],{},"            @Override\n",[78,35855,35856],{"class":124,"line":156},[78,35857,35858],{},"            public int compare(int[] o1, int[] o2) {\n",[78,35860,35861],{"class":124,"line":162},[78,35862,35863],{},"                \u002F\u002F 按照第一个元素递增、相同情况下第二个元素递减排序\n",[78,35865,35866],{"class":124,"line":168},[78,35867,35868],{},"                return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];\n",[78,35870,35871],{"class":124,"line":174},[78,35872,9615],{},[78,35874,35875],{"class":124,"line":180},[78,35876,35877],{},"        });\n",[78,35879,35880],{"class":124,"line":186},[78,35881,129],{"emptyLinePlaceholder":128},[78,35883,35884],{"class":124,"line":192},[78,35885,35886],{},"        int[] height = new int[n];\n",[78,35888,35889],{"class":124,"line":198},[78,35890,35891],{},"        for (int i = 0; i \u003C n; i++) {\n",[78,35893,35894],{"class":124,"line":204},[78,35895,35896],{},"            \u002F\u002F 第一个元素有序，第二个元素无序，寻找最长递增子序列\n",[78,35898,35899],{"class":124,"line":210},[78,35900,35901],{},"            height[i] = envelopes[i][1];\n",[78,35903,35904],{"class":124,"line":216},[78,35905,10054],{},[78,35907,35908],{"class":124,"line":222},[78,35909,35910],{},"        return lengthOfLIS(height);\n",[78,35912,35913],{"class":124,"line":421},[78,35914,15810],{},[7759,35916,35918],{"id":35917},"_23-最大子数组","2.3 最大子数组",[114,35920,35922],{"className":23652,"code":35921,"language":23654,"meta":119,"style":119},"    public int maxSubArray(int[] nums) {\n        int n = nums.length;\n        if (n == 0) return 0;\n        int[] dp = new int[n];\n\n        dp[0] = nums[0];\n        for (int i = 1; i \u003C n; i++) {\n            \u002F\u002F 即使有负数也不影响，新的正数发现补不回前面的缺口就会断尾\n            dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);\n        }\n        int res = Integer.MIN_VALUE;\n        for (int i = 0; i \u003C n; i++) {\n            res = Math.max(res, dp[i]);\n        }\n        return res;\n    }\n",[17,35923,35924,35929,35934,35939,35944,35948,35953,35958,35963,35968,35972,35977,35981,35985,35989,35993],{"__ignoreMap":119},[78,35925,35926],{"class":124,"line":125},[78,35927,35928],{},"    public int maxSubArray(int[] nums) {\n",[78,35930,35931],{"class":124,"line":132},[78,35932,35933],{},"        int n = nums.length;\n",[78,35935,35936],{"class":124,"line":138},[78,35937,35938],{},"        if (n == 0) return 0;\n",[78,35940,35941],{"class":124,"line":144},[78,35942,35943],{},"        int[] dp = new int[n];\n",[78,35945,35946],{"class":124,"line":150},[78,35947,129],{"emptyLinePlaceholder":128},[78,35949,35950],{"class":124,"line":156},[78,35951,35952],{},"        dp[0] = nums[0];\n",[78,35954,35955],{"class":124,"line":162},[78,35956,35957],{},"        for (int i = 1; i \u003C n; i++) {\n",[78,35959,35960],{"class":124,"line":168},[78,35961,35962],{},"            \u002F\u002F 即使有负数也不影响，新的正数发现补不回前面的缺口就会断尾\n",[78,35964,35965],{"class":124,"line":174},[78,35966,35967],{},"            dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);\n",[78,35969,35970],{"class":124,"line":180},[78,35971,10054],{},[78,35973,35974],{"class":124,"line":186},[78,35975,35976],{},"        int res = Integer.MIN_VALUE;\n",[78,35978,35979],{"class":124,"line":192},[78,35980,35891],{},[78,35982,35983],{"class":124,"line":198},[78,35984,35806],{},[78,35986,35987],{"class":124,"line":204},[78,35988,10054],{},[78,35990,35991],{"class":124,"line":210},[78,35992,35815],{},[78,35994,35995],{"class":124,"line":216},[78,35996,15810],{},[10548,35998,35999],{"id":35999},"空间优化",[114,36001,36003],{"className":23652,"code":36002,"language":23654,"meta":119,"style":119},"    public int maxSubArray(int[] nums) {\n        int n = nums.length;\n        if (n == 0) return 0;\n        int dp_0 = nums[0];\n        \u002F\u002F 化数组为两个数滚动\n        int dp_1 = 0;\n        int res = dp_0;\n\n        for (int i = 1; i \u003C n; i++) {\n            dp_1 = Math.max(nums[i], nums[i] + dp_0);\n            dp_0 = dp_1;\n            \u002F\u002F 直接比较减少循环\n            res = Math.max(res, dp_1);\n        }\n        \n        return res;\n    }\n",[17,36004,36005,36009,36013,36017,36022,36027,36032,36037,36041,36045,36050,36055,36060,36065,36069,36073,36077],{"__ignoreMap":119},[78,36006,36007],{"class":124,"line":125},[78,36008,35928],{},[78,36010,36011],{"class":124,"line":132},[78,36012,35933],{},[78,36014,36015],{"class":124,"line":138},[78,36016,35938],{},[78,36018,36019],{"class":124,"line":144},[78,36020,36021],{},"        int dp_0 = nums[0];\n",[78,36023,36024],{"class":124,"line":150},[78,36025,36026],{},"        \u002F\u002F 化数组为两个数滚动\n",[78,36028,36029],{"class":124,"line":156},[78,36030,36031],{},"        int dp_1 = 0;\n",[78,36033,36034],{"class":124,"line":162},[78,36035,36036],{},"        int res = dp_0;\n",[78,36038,36039],{"class":124,"line":168},[78,36040,129],{"emptyLinePlaceholder":128},[78,36042,36043],{"class":124,"line":174},[78,36044,35957],{},[78,36046,36047],{"class":124,"line":180},[78,36048,36049],{},"            dp_1 = Math.max(nums[i], nums[i] + dp_0);\n",[78,36051,36052],{"class":124,"line":186},[78,36053,36054],{},"            dp_0 = dp_1;\n",[78,36056,36057],{"class":124,"line":192},[78,36058,36059],{},"            \u002F\u002F 直接比较减少循环\n",[78,36061,36062],{"class":124,"line":198},[78,36063,36064],{},"            res = Math.max(res, dp_1);\n",[78,36066,36067],{"class":124,"line":204},[78,36068,10054],{},[78,36070,36071],{"class":124,"line":210},[78,36072,1359],{},[78,36074,36075],{"class":124,"line":216},[78,36076,35815],{},[78,36078,36079],{"class":124,"line":222},[78,36080,15810],{},[226,36082,228],{},{"title":119,"searchDepth":144,"depth":144,"links":36084},[36085,36086,36087],{"id":35733,"depth":144,"text":35734},{"id":35822,"depth":144,"text":35823},{"id":35917,"depth":144,"text":35918},{},"我的大学\u002Fbranch\u002Fresearch\u002F专业\u002F算法.md","\u002Fundergraduate\u002Fnote-50f66f7fb2b0",{"title":246,"description":119},"undergraduate\u002Fnote-50f66f7fb2b0",[246],"uDHcWKYhEudpp1CExCD4kXE_imbC1sJvncp7EES3beI",{"id":36096,"title":36097,"assetBase":239,"author":8,"body":36098,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":36466,"navigation":128,"originalPath":36467,"path":36468,"seo":36469,"source":23330,"stem":36470,"tags":36471,"weight":250,"__hash__":36472},"content\u002Fundergraduate\u002Fnote-52cdb3e6ea46.md","2023.10.26 shopee虾皮大数据开发工程师笔试",{"type":10,"value":36099,"toc":36458},[36100,36104,36108,36111,36114,36118,36122,36282,36286,36289,36293,36296,36305,36456],[4517,36101,36103],{"id":36102},"shopee虾皮笔试","Shopee虾皮笔试",[107,36105,36107],{"id":36106},"_10单选5多选","10单选+5多选",[13,36109,36110],{},"TCP三次握手、线程、设计模式、平衡二叉树、数组和链表的区别、左中序遍历建树、栈进出",[13,36112,36113],{},"SQL：group by having的使用、binlog日志特点、join的用法",[107,36115,36117],{"id":36116},"_3编程","3编程",[7759,36119,36121],{"id":36120},"_1string-非负大数相乘solution","（1）String 非负大数相乘（Solution）",[114,36123,36125],{"className":23652,"code":36124,"language":23654,"meta":119,"style":119},"public static String Solution(String num1, String num2) {\n    int m = num1.length();\n    int n = num2.length();\n    int[] product = new int[m + n]; \u002F\u002F 保存乘积的数组\n        \n    \u002F\u002F 从个位数开始逐位相乘\n    for (int i = m - 1; i >= 0; i--) {\n        for (int j = n - 1; j >= 0; j--) {\n            int digit1 = num1.charAt(i) - '0';\n            int digit2 = num2.charAt(j) - '0';\n            int currProduct = digit1 * digit2;\n                \n            \u002F\u002F 将当前位的乘积结果加到对应的位置\n            int p1 = i + j; \u002F\u002F 十位数的位置\n            int p2 = i + j + 1; \u002F\u002F 个位数的位置\n            int sum = currProduct + product[p2];\n                \n            \u002F\u002F 更新十位数和个位数\n            product[p1] += sum \u002F 10;\n            product[p2] = sum % 10;\n        }\n    }\n        \n    \u002F\u002F 构建结果字符串\n    StringBuilder sb = new StringBuilder();\n    for (int digit : product) {\n        if (sb.length() != 0 || digit != 0) {\n            sb.append(digit);\n        }\n    }\n        \n    return sb.length() == 0 ? \"0\" : sb.toString();\n}\n",[17,36126,36127,36132,36137,36142,36147,36151,36156,36161,36166,36171,36176,36181,36185,36190,36195,36200,36205,36209,36214,36219,36224,36228,36232,36236,36241,36246,36251,36256,36261,36265,36269,36273,36278],{"__ignoreMap":119},[78,36128,36129],{"class":124,"line":125},[78,36130,36131],{},"public static String Solution(String num1, String num2) {\n",[78,36133,36134],{"class":124,"line":132},[78,36135,36136],{},"    int m = num1.length();\n",[78,36138,36139],{"class":124,"line":138},[78,36140,36141],{},"    int n = num2.length();\n",[78,36143,36144],{"class":124,"line":144},[78,36145,36146],{},"    int[] product = new int[m + n]; \u002F\u002F 保存乘积的数组\n",[78,36148,36149],{"class":124,"line":150},[78,36150,1359],{},[78,36152,36153],{"class":124,"line":156},[78,36154,36155],{},"    \u002F\u002F 从个位数开始逐位相乘\n",[78,36157,36158],{"class":124,"line":162},[78,36159,36160],{},"    for (int i = m - 1; i >= 0; i--) {\n",[78,36162,36163],{"class":124,"line":168},[78,36164,36165],{},"        for (int j = n - 1; j >= 0; j--) {\n",[78,36167,36168],{"class":124,"line":174},[78,36169,36170],{},"            int digit1 = num1.charAt(i) - '0';\n",[78,36172,36173],{"class":124,"line":180},[78,36174,36175],{},"            int digit2 = num2.charAt(j) - '0';\n",[78,36177,36178],{"class":124,"line":186},[78,36179,36180],{},"            int currProduct = digit1 * digit2;\n",[78,36182,36183],{"class":124,"line":192},[78,36184,1790],{},[78,36186,36187],{"class":124,"line":198},[78,36188,36189],{},"            \u002F\u002F 将当前位的乘积结果加到对应的位置\n",[78,36191,36192],{"class":124,"line":204},[78,36193,36194],{},"            int p1 = i + j; \u002F\u002F 十位数的位置\n",[78,36196,36197],{"class":124,"line":210},[78,36198,36199],{},"            int p2 = i + j + 1; \u002F\u002F 个位数的位置\n",[78,36201,36202],{"class":124,"line":216},[78,36203,36204],{},"            int sum = currProduct + product[p2];\n",[78,36206,36207],{"class":124,"line":222},[78,36208,1790],{},[78,36210,36211],{"class":124,"line":421},[78,36212,36213],{},"            \u002F\u002F 更新十位数和个位数\n",[78,36215,36216],{"class":124,"line":427},[78,36217,36218],{},"            product[p1] += sum \u002F 10;\n",[78,36220,36221],{"class":124,"line":433},[78,36222,36223],{},"            product[p2] = sum % 10;\n",[78,36225,36226],{"class":124,"line":2443},[78,36227,10054],{},[78,36229,36230],{"class":124,"line":2448},[78,36231,15810],{},[78,36233,36234],{"class":124,"line":2454},[78,36235,1359],{},[78,36237,36238],{"class":124,"line":2460},[78,36239,36240],{},"    \u002F\u002F 构建结果字符串\n",[78,36242,36243],{"class":124,"line":2465},[78,36244,36245],{},"    StringBuilder sb = new StringBuilder();\n",[78,36247,36248],{"class":124,"line":2470},[78,36249,36250],{},"    for (int digit : product) {\n",[78,36252,36253],{"class":124,"line":2903},[78,36254,36255],{},"        if (sb.length() != 0 || digit != 0) {\n",[78,36257,36258],{"class":124,"line":2909},[78,36259,36260],{},"            sb.append(digit);\n",[78,36262,36263],{"class":124,"line":11477},[78,36264,10054],{},[78,36266,36267],{"class":124,"line":13374},[78,36268,15810],{},[78,36270,36271],{"class":124,"line":13380},[78,36272,1359],{},[78,36274,36275],{"class":124,"line":13386},[78,36276,36277],{},"    return sb.length() == 0 ? \"0\" : sb.toString();\n",[78,36279,36280],{"class":124,"line":13722},[78,36281,23518],{},[7759,36283,36285],{"id":36284},"_2反转语句solution","（2）反转语句（Solution）",[13,36287,36288],{},"将hello world反转成olleh dlrow，太简单了就不多说了",[7759,36290,36292],{"id":36291},"_3层次遍历格式转换acm","（3）层次遍历格式转换（ACM）",[13,36294,36295],{},"输入{3,9,20,#,#,15,7}",[13,36297,36298,36299,2066,36302,17857],{},"输出[[3],",[78,36300,36301],{},"9,20",[78,36303,36304],{},"15,7",[114,36306,36308],{"className":23652,"code":36307,"language":23654,"meta":119,"style":119},"import java.util.Objects;\nimport java.util.Scanner;\n\npublic class Main {\n    public static void main(String[] args) {\n        Scanner sc = new Scanner(System.in);\n        \u002F\u002F {3,9,20,#,#,15,7}\n        String str = sc.nextLine();\n        str = str.substring(1, str.length() - 1);\n        String[] str2 = str.split(\",\");\n        int count = 0;\n        while((int)Math.pow(2, count) - 1 \u003C str2.length) count++;\n\n        StringBuilder result = new StringBuilder();\n        result.append(\"[\");\n\n        for(int i = 1; i \u003C= count; i++) {\n            result.append(\"[\");\n            for (int j = 0; j \u003C Math.pow(2, i - 1) && j + (int)Math.pow(2, i - 1) - 1 \u003C str2.length; j++) {\n                if(!Objects.equals(str2[j + (int) Math.pow(2, i - 1) - 1], \"#\")){\n                    result.append(str2[j + (int)Math.pow(2, i - 1) - 1]);\n                    if(j + 1 \u003C Math.pow(2, i - 1)) result.append(\",\");\n                }\n            }\n            if(i + 1 \u003C= count)result.append(\"],\");\n            else result.append(\"]\");\n        }\n        result.append(\"]\");\n        System.out.println(result.toString());\n    }\n}\n",[17,36309,36310,36315,36320,36324,36329,36333,36338,36343,36348,36353,36358,36363,36368,36372,36377,36382,36386,36391,36396,36401,36406,36411,36416,36420,36424,36429,36434,36438,36443,36448,36452],{"__ignoreMap":119},[78,36311,36312],{"class":124,"line":125},[78,36313,36314],{},"import java.util.Objects;\n",[78,36316,36317],{"class":124,"line":132},[78,36318,36319],{},"import java.util.Scanner;\n",[78,36321,36322],{"class":124,"line":138},[78,36323,129],{"emptyLinePlaceholder":128},[78,36325,36326],{"class":124,"line":144},[78,36327,36328],{},"public class Main {\n",[78,36330,36331],{"class":124,"line":150},[78,36332,23558],{},[78,36334,36335],{"class":124,"line":156},[78,36336,36337],{},"        Scanner sc = new Scanner(System.in);\n",[78,36339,36340],{"class":124,"line":162},[78,36341,36342],{},"        \u002F\u002F {3,9,20,#,#,15,7}\n",[78,36344,36345],{"class":124,"line":168},[78,36346,36347],{},"        String str = sc.nextLine();\n",[78,36349,36350],{"class":124,"line":174},[78,36351,36352],{},"        str = str.substring(1, str.length() - 1);\n",[78,36354,36355],{"class":124,"line":180},[78,36356,36357],{},"        String[] str2 = str.split(\",\");\n",[78,36359,36360],{"class":124,"line":186},[78,36361,36362],{},"        int count = 0;\n",[78,36364,36365],{"class":124,"line":192},[78,36366,36367],{},"        while((int)Math.pow(2, count) - 1 \u003C str2.length) count++;\n",[78,36369,36370],{"class":124,"line":198},[78,36371,129],{"emptyLinePlaceholder":128},[78,36373,36374],{"class":124,"line":204},[78,36375,36376],{},"        StringBuilder result = new StringBuilder();\n",[78,36378,36379],{"class":124,"line":210},[78,36380,36381],{},"        result.append(\"[\");\n",[78,36383,36384],{"class":124,"line":216},[78,36385,129],{"emptyLinePlaceholder":128},[78,36387,36388],{"class":124,"line":222},[78,36389,36390],{},"        for(int i = 1; i \u003C= count; i++) {\n",[78,36392,36393],{"class":124,"line":421},[78,36394,36395],{},"            result.append(\"[\");\n",[78,36397,36398],{"class":124,"line":427},[78,36399,36400],{},"            for (int j = 0; j \u003C Math.pow(2, i - 1) && j + (int)Math.pow(2, i - 1) - 1 \u003C str2.length; j++) {\n",[78,36402,36403],{"class":124,"line":433},[78,36404,36405],{},"                if(!Objects.equals(str2[j + (int) Math.pow(2, i - 1) - 1], \"#\")){\n",[78,36407,36408],{"class":124,"line":2443},[78,36409,36410],{},"                    result.append(str2[j + (int)Math.pow(2, i - 1) - 1]);\n",[78,36412,36413],{"class":124,"line":2448},[78,36414,36415],{},"                    if(j + 1 \u003C Math.pow(2, i - 1)) result.append(\",\");\n",[78,36417,36418],{"class":124,"line":2454},[78,36419,9912],{},[78,36421,36422],{"class":124,"line":2460},[78,36423,9615],{},[78,36425,36426],{"class":124,"line":2465},[78,36427,36428],{},"            if(i + 1 \u003C= count)result.append(\"],\");\n",[78,36430,36431],{"class":124,"line":2470},[78,36432,36433],{},"            else result.append(\"]\");\n",[78,36435,36436],{"class":124,"line":2903},[78,36437,10054],{},[78,36439,36440],{"class":124,"line":2909},[78,36441,36442],{},"        result.append(\"]\");\n",[78,36444,36445],{"class":124,"line":11477},[78,36446,36447],{},"        System.out.println(result.toString());\n",[78,36449,36450],{"class":124,"line":13374},[78,36451,15810],{},[78,36453,36454],{"class":124,"line":13380},[78,36455,23518],{},[226,36457,228],{},{"title":119,"searchDepth":144,"depth":144,"links":36459},[36460,36461],{"id":36106,"depth":132,"text":36107},{"id":36116,"depth":132,"text":36117,"children":36462},[36463,36464,36465],{"id":36120,"depth":144,"text":36121},{"id":36284,"depth":144,"text":36285},{"id":36291,"depth":144,"text":36292},{},"我的大学\u002Fbranch\u002Finterview\u002F2023.10.26 shopee虾皮大数据开发工程师笔试.md","\u002Fundergraduate\u002Fnote-52cdb3e6ea46",{"title":36097,"description":119},"undergraduate\u002Fnote-52cdb3e6ea46",[246,23378,10715,6380,35725],"qJ4DdcdNEKgQP0fb4nEn4RSK14iU9aJKyQiznBS8GGQ",{"id":36474,"title":36475,"assetBase":239,"author":8,"body":36476,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":39441,"navigation":128,"originalPath":39442,"path":39443,"seo":39444,"source":23330,"stem":39445,"tags":39446,"weight":250,"__hash__":39447},"content\u002Fundergraduate\u002Fnote-546c7b33704a.md","人工智能导论",{"type":10,"value":36477,"toc":39410},[36478,36480,36489,36493,36497,36517,36519,36523,36554,36556,36560,36563,36566,36568,36572,36575,36578,36580,36584,36654,36656,36660,36757,36759,36763,36766,36771,36797,36802,36833,36837,36841,36844,36847,36850,36853,36856,36859,36873,36879,36883,36886,36889,36892,36896,36899,36902,36905,36908,36911,36915,36917,36919,36921,36924,36927,36931,36933,36935,36937,36939,36941,36944,36948,36950,36952,36954,36956,36958,36961,36965,36968,36970,36972,36974,36977,36980,36982,36986,36990,36996,37002,37006,37012,37018,37020,37024,37028,37032,37038,37042,37048,37052,37055,37057,37061,37064,37067,37071,39199,39205,39207,39211,39215,39218,39221,39227,39233,39236,39239,39242,39245,39248,39252,39255,39258,39262,39266,39274,39278,39281,39292,39296,39299,39303,39308,39312,39315,39320,39324,39328,39330,39334,39337,39340,39346,39352,39357,39359,39363,39367,39370,39372,39376,39380,39383,39389,39395,39398,39401,39403,39407],[4517,36479,36475],{"id":36475},[72,36481,36482,36486],{},[13,36483,36484],{},[22,36485,23957],{},[13,36487,36488],{},"文档完善于考试之后，考试之前天真的认为东西没有多少，所以文档只做了我觉得重点的一小部分，但是考试的时候被噗噗噗打脸了：大题全在我的掌握之中，但是30分选择题真的一个不会，所以在放假初决定还是把这个文档完善一下。但是写到一半发现如果真的全写完实在是太多了，很多东西需要手敲太花时间了，如果不想敲直接贴图又太没有诚意了，所以只完善前五章的内容。之后的内容会在附录中附上页码供大家自行学习参考。——By Alexie-Z-Yevich 2022.7.1",[107,36490,36492],{"id":36491},"第一章-概述与工具","第一章 概述与工具",[7759,36494,36496],{"id":36495},"_1什么是人工智能人工智能得研究意义目标和策略是什么","1、什么是人工智能？人工智能得研究意义、目标和策略是什么？",[49,36498,36499,36505,36511],{},[52,36500,36501,36502,36504],{},"概念",[2996,36503],{},"人工智能就是人造智能。具体来讲，目前“人工智能”一词是指用计算机模拟或实现的智能。因此，人工智能又称机器智能。",[52,36506,36507,36508,36510],{},"研究目标",[2996,36509],{},"研究目标是制造智能机器和智能系统，实现智能化社会，使计算机不仅具有脑智能和群智能，还要具有看、听、说、写等感知、理解和交流能力。要使计算机具有自主发现规律、解决问题和发明创造的能力，从而大大扩展和延伸人的智能，实现人类社会的全面智能化。",[52,36512,36513,36514,36516],{},"研究策略",[2996,36515],{},"先部分地或某种程度地实现机器的智能，并运用智能技术解决各种实际问题特别是工程问题，从而使现有的计算机更灵活、更好用和更有用，成为人类的智能化信息处理工具，进而逐步扩展和延伸人的智能，实现智能化。",[23289,36518],{},[7759,36520,36522],{"id":36521},"_2人工智能有哪些研究途径和方法他们的关系如何","2、人工智能有哪些研究途径和方法？他们的关系如何？",[49,36524,36525,36548],{},[52,36526,36527,36528],{},"研究途径和方法\n基于脑智能的符号智能和基于群智能的计算智能是人工智能的两种研究途径与方法，但仍可细分：",[49,36529,36530,36533,36536,36539,36542,36545],{},[52,36531,36532],{},"心理模拟，符号推演：从人脑的宏观心理层面入手，以智能行为的心理模型为依据，将问题或知识表示成某种逻辑网络，采用符号推演的方法，模拟人脑的逻辑思维过程，实现人工智能。",[52,36534,36535],{},"生物模拟，神经计算：从人脑的生理层面，即微观结构和工作机理入手，以智能行为的生理模型为依据，采用数值计算的方法，模拟脑神经网络工作的过程，实现人工智能。人工神经网络作为信息和知识的载体，用称为神经计算的数值计算方法来实现网络的学习、记忆、联想、识别和推理等功能。",[52,36537,36538],{},"行为模拟，控制进化：模拟人和动物在与环境的交互、控制过程中的智能活动和行为特性，如反应、适应、学习、寻优等，来研究和实现人工智能。",[52,36540,36541],{},"群体模拟，仿生计算：模拟生物群落的群体智能行为，从而实现人工智能。",[52,36543,36544],{},"博采广鉴，自然计算：模拟自然智能。",[52,36546,36547],{},"着眼数据，统计建模：着眼于事务或问题的外部表现和关系，收集、采集、整理相关信息并做成样本数据，然后基于样本数据用统计学、概率论和其他数学理论和方法建立数学模型，并采用适当的算法和策略进行计算，以期从事务外在表现的样本数据中推测事物的内在模式或规律，并用之于解决相关实际问题。",[52,36549,36550,36551,36553],{},"关系",[2996,36552],{},"并不能互相取代，而是并存和互补的关系。",[23289,36555],{},[7759,36557,36559],{"id":36558},"_3人工智能有哪些研究内容考试简答5分","3、人工智能有哪些研究内容？（考试简答5分）",[13,36561,36562],{},"研究内容归纳为：搜索与求解、知识与推理、学习和发现、发明和创造、感知与相应、理解与交流、记忆与联想、竞争与协作、",[13,36564,36565],{},"系统与建造、应用与工程等十个方面。（具体内容书P8-P11）",[23289,36567],{},[7759,36569,36571],{"id":36570},"_4人工智能有哪些分支领域和研究方向","4、人工智能有哪些分支领域和研究方向？",[13,36573,36574],{},"从研究内容上看，人工智能可分为搜索与求解、知识与推理、学习和发现等十大分支领域（它们构成了人工智能学科的总体方向）。",[13,36576,36577],{},"从研究途径和智能层次来看，人工智能可分为符号智能、计算智能、统计智能和交互智能等四大分支领域。",[23289,36579],{},[7759,36581,36583],{"id":36582},"_5人工智能有哪些应用领域或课题","5、人工智能有哪些应用领域或课题？",[49,36585,36586,36589,36592,36595,36598,36601,36604,36607,36610,36613,36616,36619,36622,36625,36628,36631,36634,36637,36640,36642,36645,36648,36651],{},[52,36587,36588],{},"难题求解",[52,36590,36591],{},"自动规划、调度与配置",[52,36593,36594],{},"机器博弈",[52,36596,36597],{},"机器翻译与机器写作",[52,36599,36600],{},"机器定理证明",[52,36602,36603],{},"自动程序设计",[52,36605,36606],{},"智能控制",[52,36608,36609],{},"智能管理",[52,36611,36612],{},"智能决策",[52,36614,36615],{},"智能通信",[52,36617,36618],{},"智能预测",[52,36620,36621],{},"智能仿真",[52,36623,36624],{},"智能设计与制造",[52,36626,36627],{},"智能车辆与智能交通",[52,36629,36630],{},"智能诊断与治疗",[52,36632,36633],{},"智能生物信息处理",[52,36635,36636],{},"智能教育",[52,36638,36639],{},"智能人-机接口",[52,36641,32990],{},[52,36643,36644],{},"智能机器人",[52,36646,36647],{},"数据挖掘与知识发现",[52,36649,36650],{},"计算机辅助创新",[52,36652,36653],{},"计算机文艺创作",[23289,36655],{},[7759,36657,36659],{"id":36658},"_6简述人工智能的发展概况","6、简述人工智能的发展概况",[49,36661,36662,36668,36683,36704,36725,36728,36731,36734],{},[52,36663,36664,36665,36667],{},"孕育与诞生",[2996,36666],{},"正式诞生于1956年。",[52,36669,36670,36671,36673,36674,36676,36677,36679,36680,36682],{},"符号主义先声夺人",[2996,36672],{},"1956年，逻辑理论机的计算机程序系统，模拟了人用数理逻辑证明定理时的思维逻辑规律；研制成功具有自学习、自组织、自适应能力的跳棋程序；",[2996,36675],{},"1959年，证明平面几何问题的程序；模式识别程序；",[2996,36678],{},"1960年，通用问题求解程序；面向人工智能程序设计的表处理语言LISP；",[2996,36681],{},"1965年，可以分辨积木构造的程序；消解原理；基于领域知识和专家知识的名为DENDRL的程序系统（专家系统）",[52,36684,36685,36686,36688,36689,36691,36692,36694,36695,36697,36698,36700,36701,36703],{},"连接主义不畏坎坷",[2996,36687],{},"1943年，形式神经元的数学模型（MP模型）；",[2996,36690],{},"1944年，改变神经元连接强度的Hebb规则；",[2996,36693],{},"1957年，称为感知器的单层神经网络；",[2996,36696],{},"1962年，自适应线性元件；",[2996,36699],{},"1985年，开发了名为NETtalk英语读音学习用的神经网络处理器；",[2996,36702],{},"1987年6月，第一届国际神经网络会议召开。",[52,36705,36706,36707,36709,36710,36712,36713,36715,36716,36718,36719,36721,36722,36724],{},"计算智能异军突起",[2996,36708],{},"1962年，进化程序设计（进化规划的概念和方法）；",[2996,36711],{},"1964年，进化策略的搜索算法；",[2996,36714],{},"1967年，遗传算法的初步思想；",[2996,36717],{},"1975年，遗传算法的理论基础；",[2996,36720],{},"1980年，实现基于遗传算法的机器学习系统——分类器系统；",[2996,36723],{},"1994年，首届计算智能大会。",[52,36726,36727],{},"统计智能默默奉献",[52,36729,36730],{},"智能主体一统江湖，Agent&Robot",[52,36732,36733],{},"知识工程东山再起，机器学习领衔高歌",[52,36735,36736,36737],{},"现状与趋势",[49,36738,36739,36742,36745,36748,36751,36754],{},[52,36740,36741],{},"多种方法齐头并进，多种方法协作互补",[52,36743,36744],{},"新思想、新技术不断涌现，新领域、新方向不断开拓",[52,36746,36747],{},"理论研究更加深入，应用研究愈发广泛",[52,36749,36750],{},"企业公司进军AI，协作竞争你追我赶",[52,36752,36753],{},"研究队伍日益壮大，AI教育蔚然成风",[52,36755,36756],{},"各类活动空前活跃，社会影响与日俱增",[23289,36758],{},[107,36760,36762],{"id":36761},"第三章-图搜索于问题求解","第三章 图搜索于问题求解",[13,36764,36765],{},"下文所提到的OPEN表和CLOSE表样式：",[49,36767,36768],{},[52,36769,36770],{},"OPEN表",[8366,36772,36773,36783],{},[8369,36774,36775],{},[8372,36776,36777,36780],{},[8375,36778,36779],{"align":9247},"节点",[8375,36781,36782],{"align":9247},"父节点编号",[8386,36784,36785,36791],{},[8372,36786,36787,36789],{},[8391,36788],{"align":9247},[8391,36790],{"align":9247},[8372,36792,36793,36795],{},[8391,36794],{"align":9247},[8391,36796],{"align":9247},[49,36798,36799],{},[52,36800,36801],{},"CLOSE表",[8366,36803,36804,36815],{},[8369,36805,36806],{},[8372,36807,36808,36811,36813],{},[8375,36809,36810],{"align":9247},"编号",[8375,36812,36779],{"align":9247},[8375,36814,36782],{"align":9247},[8386,36816,36817,36825],{},[8372,36818,36819,36821,36823],{},[8391,36820],{"align":9247},[8391,36822],{"align":9247},[8391,36824],{"align":9247},[8372,36826,36827,36829,36831],{},[8391,36828],{"align":9247},[8391,36830],{"align":9247},[8391,36832],{"align":9247},[7759,36834,36836],{"id":36835},"_1状态图搜索","1、状态图搜索",[10548,36838,36840],{"id":36839},"_1树式搜索算法","（1）树式搜索算法",[13,36842,36843],{},"【1】把初始节点S0放入OPEN表中。",[13,36845,36846],{},"【2】若OPEN表为空，则搜索失败，退出。",[13,36848,36849],{},"【3】移出OPEN表中的第一个节点N放入CLOSE表中，并冠以顺序序号n。",[13,36851,36852],{},"【4】若目标节点Sg = N，则搜索成功，结束。",[13,36854,36855],{},"【5】若N不可扩展，则转【2】。",[13,36857,36858],{},"【6】扩展N，生成一组子节点，对这组子节点做如下处理：",[49,36860,36861,36864,36867,36870],{},[52,36862,36863],{},"删除N的先辈节点（如果有的话）。",[52,36865,36866],{},"对已存在OPEN表的节点（如果有的话）也删除之；但删除之前要比较其返回初始节点的新路径与原路径，如果新路径”短“，则修改这些节点在OPEN表中的原返回指针，使其沿新路径返回。",[52,36868,36869],{},"对已存在于CLOSE表中的节点（如果有的话）做与上面一样的处理，并且再将其移出CLOSE表，放入OPEN表重新扩展（为了重新计算代价）。",[52,36871,36872],{},"对其余子节点配上指向N的返回指针后放入OPEN表中某处，或对OPEN表进行重新排序，转【2】.",[13,36874,36875],{},[617,36876],{"alt":36877,"src":36878},"状态图搜索过程中修改返回指针示例","%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA\u002F%E7%8A%B6%E6%80%81%E5%9B%BE%E6%90%9C%E7%B4%A2%E8%BF%87%E7%A8%8B%E4%B8%AD%E4%BF%AE%E6%94%B9%E8%BF%94%E5%9B%9E%E6%8C%87%E9%92%88%E7%A4%BA%E4%BE%8B.jpg",[13,36880,36881],{},[22,36882,2047],{},[13,36884,36885],{},"【1】这里的返回指针也就是父节点在CLOSE表中的编号。",[13,36887,36888],{},"【2】步骤【6】中修改返回指针的原因是，这些节点又被二次生成，所以他们返回初始路径的节点已有两条，但这两条路径的”长度“可能不同。当新路径短时就会走新路径。",[13,36890,36891],{},"【3】这里路径的长短是按路径上的节点数来衡量的,后面将会看到路径的长短也可以按其“代价”(如距离﹑费用,时间等)衡量。若按其代价衡量,则在需修改返回指针的同时修改相应的代价值,或者不修改返回指针但要修改代价值(为了实现代价小者优先扩展)。",[10548,36893,36895],{"id":36894},"_2不回溯的线式搜索","（2）不回溯的线式搜索",[13,36897,36898],{},"【1】把初始节点S0。放入CLOSED表中。",[13,36900,36901],{},"【2】令N=S0。",[13,36903,36904],{},"【3】若N是目标节点,则搜索成功,结束。",[13,36906,36907],{},"【4】若N不可扩展,则搜索失败,退出。",[13,36909,36910],{},"【5】扩展N,选取其一个未在CLOSED表中出现过的子节点N1放入CLOSED表中,令N=N1，转步骤【3】。",[10548,36912,36914],{"id":36913},"_3可回溯的线式搜索","（3）可回溯的线式搜索",[13,36916,36898],{},[13,36918,36901],{},[13,36920,36904],{},[13,36922,36923],{},"【4】若N不可扩展,则移出CLOSED表的末端节点Ne,若Ne=S0,则搜索失败,退出。否则,以CLOSED表新的末端节点N。作为N,即令N=Ne。,转步骤(3)。",[13,36925,36926],{},"【5】扩展N,选取其一个未在CLOSED表中出现过的子节点N,,放人CLOSED 表中,令N=N1，转步骤【3】。",[10548,36928,36930],{"id":36929},"_4广度优先搜索算法","（4）广度优先搜索算法",[13,36932,36843],{},[13,36934,36846],{},[13,36936,36849],{},[13,36938,36852],{},[13,36940,36855],{},[13,36942,36943],{},"【6】扩展N，将其所有的子节点配上指向N的指针依次放入OPEN表尾部，转步骤【2】。",[10548,36945,36947],{"id":36946},"_5深度优先搜索","（5）深度优先搜索",[13,36949,36843],{},[13,36951,36846],{},[13,36953,36849],{},[13,36955,36852],{},[13,36957,36855],{},[13,36959,36960],{},"【6】扩展N，将其所有的子节点配上指向N的返回指针依次放入OPEN表的首部，转步骤【2】。",[10548,36962,36964],{"id":36963},"_6有界深度优先搜索","（6）有界深度优先搜索",[13,36966,36967],{},"【1】把初始节点S0放入OPEN表中，置S0的深度d（S0）=0。",[13,36969,36846],{},[13,36971,36849],{},[13,36973,36852],{},[13,36975,36976],{},"【5】若N的深度d（N）= dm（深度限制值），或者N无子节点，则转【2】。",[13,36978,36979],{},"【6】扩展N，将其所有的子节点配上指向N的返回指针依次放入OPEN表中前部，置d（Ni） = d（N）+ 1，转步骤【2】。",[23289,36981],{},[7759,36983,36985],{"id":36984},"_2启发式搜索","2、启发式搜索",[10548,36987,36989],{"id":36988},"_1全局择优搜索考试大题10分","（1）全局择优搜索（考试大题10分）",[13,36991,36992],{},[617,36993],{"alt":36994,"src":36995},"全局择优搜索算法","%E5%85%A8%E5%B1%80%E6%8B%A9%E4%BC%98%E6%90%9C%E7%B4%A2%E7%AE%97%E6%B3%95.png",[13,36997,36998],{},[617,36999],{"alt":37000,"src":37001},"大题1","%E5%A4%A7%E9%A2%981.png",[10548,37003,37005],{"id":37004},"_2a算法","（2）A算法",[13,37007,37008],{},[617,37009],{"alt":37010,"src":37011},"A算法1","A%E7%AE%97%E6%B3%951.png",[13,37013,37014],{},[617,37015],{"alt":37016,"src":37017},"A算法2","A%E7%AE%97%E6%B3%952.png",[23289,37019],{},[107,37021,37023],{"id":37022},"第四章-基于遗传算法的随即优化搜索","第四章 基于遗传算法的随即优化搜索",[7759,37025,37027],{"id":37026},"_1基本遗传算法","1、基本遗传算法",[10548,37029,37031],{"id":37030},"_1流程图","（1）流程图",[13,37033,37034],{},[617,37035],{"alt":37036,"src":37037},"基本遗传算法流程图","%E5%9F%BA%E6%9C%AC%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95%E6%B5%81%E7%A8%8B%E5%9B%BE.png",[10548,37039,37041],{"id":37040},"_2具体描述","（2）具体描述",[13,37043,37044],{},[617,37045],{"alt":37046,"src":37047},"基本遗传算法具体描述","%E5%9F%BA%E6%9C%AC%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95%E5%85%B7%E4%BD%93%E6%8F%8F%E8%BF%B0.png",[10548,37049,37051],{"id":37050},"_3具体实例","（3）具体实例",[13,37053,37054],{},"详情见书P90-P93例题4-1、4-2，要求理解两个例题的具体步骤，实操要求在老师上机课时基本了解数据集内容以及调用库作用。",[23289,37056],{},[107,37058,37060],{"id":37059},"第五章-基于一阶谓词的机器推理","第五章 基于一阶谓词的机器推理",[13,37062,37063],{},"基于一阶谓词的机器推理也称自动推理，它是早期人工智能的主要研究内容之一。一阶谓词是一种表达力很强的形式语言，而且这种语言很适合数字计算机处理，因而称为知识表示的首选。",[13,37065,37066],{},"简单的知识介绍还请各位参照书本，这里不做过多讲解。",[7759,37068,37070],{"id":37069},"_1常用逻辑等价式","1、常用逻辑等价式",[78,37072,37074],{"className":37073},[4566],[78,37075,37077,37867],{"className":37076},[4570],[78,37078,37080],{"className":37079},[4574],[4576,37081,37082],{"xmlns":4578,"display":4579},[4581,37083,37084,37864],{},[37085,37086,37090,37141,37187,37230,37299,37365,37420,37472,37523,37575,37661,37744,37806],"mtable",{"rowspacing":37087,"columnalign":37088,"columnspacing":37089},"0.25em","right left","0em",[37091,37092,37093,37098,37111,37134,37137],"mtr",{},[37094,37095],"mtd",{"className":37096},[37097],"mtr-glue",[37094,37099,37100],{},[37101,37102,37103],"mstyle",{"scriptlevel":2949,"displaystyle":1419},[4584,37104,37105,37107,37109],{},[4591,37106,4594],{"stretchy":4593},[7077,37108,469],{},[4591,37110,4604],{"stretchy":4593},[37094,37112,37113],{},[37101,37114,37115],{"scriptlevel":2949,"displaystyle":1419},[4584,37116,37117,37119,37122,37124,37126,37129,37131],{},[4584,37118],{},[4596,37120,37121],{"mathvariant":7101},"¬",[4596,37123,37121],{"mathvariant":7101},[4596,37125,7062],{},[4591,37127,37128],{},"⇔",[4596,37130,7062],{},[4587,37132,37133],{},"【双重否定律】",[37094,37135],{"className":37136},[37097],[37094,37138],{"className":37139},[37140],"mml-eqn-num",[37091,37142,37143,37146,37158,37181,37184],{},[37094,37144],{"className":37145},[37097],[37094,37147,37148],{},[37101,37149,37150],{"scriptlevel":2949,"displaystyle":1419},[4584,37151,37152,37154,37156],{},[4591,37153,4594],{"stretchy":4593},[7077,37155,472],{},[4591,37157,4604],{"stretchy":4593},[37094,37159,37160],{},[37101,37161,37162],{"scriptlevel":2949,"displaystyle":1419},[4584,37163,37164,37166,37168,37171,37173,37175,37177,37179],{},[4584,37165],{},[4596,37167,7062],{},[4591,37169,37170],{},"∧",[4596,37172,5032],{},[4591,37174,37128],{},[4596,37176,5032],{},[4591,37178,37170],{},[4596,37180,7062],{},[37094,37182],{"className":37183},[37097],[37094,37185],{"className":37186},[37140],[37091,37188,37189,37192,37198,37224,37227],{},[37094,37190],{"className":37191},[37097],[37094,37193,37194],{},[37101,37195,37196],{"scriptlevel":2949,"displaystyle":1419},[4584,37197],{},[37094,37199,37200],{},[37101,37201,37202],{"scriptlevel":2949,"displaystyle":1419},[4584,37203,37204,37206,37208,37211,37213,37215,37217,37219,37221],{},[4584,37205],{},[4596,37207,7062],{},[4591,37209,37210],{},"∨",[4596,37212,5032],{},[4591,37214,37128],{},[4596,37216,5032],{},[4591,37218,37210],{},[4596,37220,7062],{},[4587,37222,37223],{},"【交换律】",[37094,37225],{"className":37226},[37097],[37094,37228],{"className":37229},[37140],[37091,37231,37232,37235,37247,37293,37296],{},[37094,37233],{"className":37234},[37097],[37094,37236,37237],{},[37101,37238,37239],{"scriptlevel":2949,"displaystyle":1419},[4584,37240,37241,37243,37245],{},[4591,37242,4594],{"stretchy":4593},[7077,37244,1025],{},[4591,37246,4604],{"stretchy":4593},[37094,37248,37249],{},[37101,37250,37251],{"scriptlevel":2949,"displaystyle":1419},[4584,37252,37253,37255,37257,37259,37261,37263,37265,37267,37269,37271,37273,37275,37277,37279,37281,37283,37285,37287,37289,37291],{},[4584,37254],{},[4596,37256,7062],{},[4591,37258,37170],{},[4591,37260,4594],{"stretchy":4593},[4596,37262,5032],{},[4591,37264,37210],{},[4596,37266,27152],{},[4591,37268,4604],{"stretchy":4593},[4591,37270,37128],{},[4591,37272,4594],{"stretchy":4593},[4596,37274,7062],{},[4591,37276,37170],{},[4596,37278,5032],{},[4591,37280,4604],{"stretchy":4593},[4591,37282,37210],{},[4591,37284,4594],{"stretchy":4593},[4596,37286,7062],{},[4591,37288,37170],{},[4596,37290,27152],{},[4591,37292,4604],{"stretchy":4593},[37094,37294],{"className":37295},[37097],[37094,37297],{"className":37298},[37140],[37091,37300,37301,37304,37310,37359,37362],{},[37094,37302],{"className":37303},[37097],[37094,37305,37306],{},[37101,37307,37308],{"scriptlevel":2949,"displaystyle":1419},[4584,37309],{},[37094,37311,37312],{},[37101,37313,37314],{"scriptlevel":2949,"displaystyle":1419},[4584,37315,37316,37318,37320,37322,37324,37326,37328,37330,37332,37334,37336,37338,37340,37342,37344,37346,37348,37350,37352,37354,37356],{},[4584,37317],{},[4596,37319,7062],{},[4591,37321,37210],{},[4591,37323,4594],{"stretchy":4593},[4596,37325,5032],{},[4591,37327,37170],{},[4596,37329,27152],{},[4591,37331,4604],{"stretchy":4593},[4591,37333,37128],{},[4591,37335,4594],{"stretchy":4593},[4596,37337,7062],{},[4591,37339,37210],{},[4596,37341,5032],{},[4591,37343,4604],{"stretchy":4593},[4591,37345,37170],{},[4591,37347,4594],{"stretchy":4593},[4596,37349,7062],{},[4591,37351,37210],{},[4596,37353,27152],{},[4591,37355,4604],{"stretchy":4593},[4587,37357,37358],{},"【分配律】",[37094,37360],{"className":37361},[37097],[37094,37363],{"className":37364},[37140],[37091,37366,37367,37370,37382,37414,37417],{},[37094,37368],{"className":37369},[37097],[37094,37371,37372],{},[37101,37373,37374],{"scriptlevel":2949,"displaystyle":1419},[4584,37375,37376,37378,37380],{},[4591,37377,4594],{"stretchy":4593},[7077,37379,1014],{},[4591,37381,4604],{"stretchy":4593},[37094,37383,37384],{},[37101,37385,37386],{"scriptlevel":2949,"displaystyle":1419},[4584,37387,37388,37390,37392,37394,37396,37398,37400,37402,37404,37406,37408,37410,37412],{},[4584,37389],{},[4596,37391,37121],{"mathvariant":7101},[4591,37393,4594],{"stretchy":4593},[4596,37395,7062],{},[4591,37397,37170],{},[4596,37399,5032],{},[4591,37401,4604],{"stretchy":4593},[4591,37403,37128],{},[4596,37405,37121],{"mathvariant":7101},[4596,37407,7062],{},[4591,37409,37210],{},[4596,37411,37121],{"mathvariant":7101},[4596,37413,5032],{},[37094,37415],{"className":37416},[37097],[37094,37418],{"className":37419},[37140],[37091,37421,37422,37425,37431,37466,37469],{},[37094,37423],{"className":37424},[37097],[37094,37426,37427],{},[37101,37428,37429],{"scriptlevel":2949,"displaystyle":1419},[4584,37430],{},[37094,37432,37433],{},[37101,37434,37435],{"scriptlevel":2949,"displaystyle":1419},[4584,37436,37437,37439,37441,37443,37445,37447,37449,37451,37453,37455,37457,37459,37461,37463],{},[4584,37438],{},[4596,37440,37121],{"mathvariant":7101},[4591,37442,4594],{"stretchy":4593},[4596,37444,7062],{},[4591,37446,37210],{},[4596,37448,5032],{},[4591,37450,4604],{"stretchy":4593},[4591,37452,37128],{},[4596,37454,37121],{"mathvariant":7101},[4596,37456,7062],{},[4591,37458,37170],{},[4596,37460,37121],{"mathvariant":7101},[4596,37462,5032],{},[4587,37464,37465],{},"【摩根律】",[37094,37467],{"className":37468},[37097],[37094,37470],{"className":37471},[37140],[37091,37473,37474,37477,37489,37517,37520],{},[37094,37475],{"className":37476},[37097],[37094,37478,37479],{},[37101,37480,37481],{"scriptlevel":2949,"displaystyle":1419},[4584,37482,37483,37485,37487],{},[4591,37484,4594],{"stretchy":4593},[7077,37486,11047],{},[4591,37488,4604],{"stretchy":4593},[37094,37490,37491],{},[37101,37492,37493],{"scriptlevel":2949,"displaystyle":1419},[4584,37494,37495,37497,37499,37502,37504,37506,37508,37510,37512,37514],{},[4584,37496],{},[4596,37498,7062],{},[4591,37500,37501],{},"⟶",[4596,37503,5032],{},[4591,37505,37128],{},[4596,37507,37121],{"mathvariant":7101},[4596,37509,7062],{},[4591,37511,37210],{},[4596,37513,5032],{},[4587,37515,37516],{},"【蕴含表达式】",[37094,37518],{"className":37519},[37097],[37094,37521],{"className":37522},[37140],[37091,37524,37525,37528,37540,37569,37572],{},[37094,37526],{"className":37527},[37097],[37094,37529,37530],{},[37101,37531,37532],{"scriptlevel":2949,"displaystyle":1419},[4584,37533,37534,37536,37538],{},[4591,37535,4594],{"stretchy":4593},[7077,37537,1861],{},[4591,37539,4604],{"stretchy":4593},[37094,37541,37542],{},[37101,37543,37544],{"scriptlevel":2949,"displaystyle":1419},[4584,37545,37546,37548,37550,37552,37554,37556,37558,37560,37562,37564,37566],{},[4584,37547],{},[4596,37549,7062],{},[4591,37551,37501],{},[4596,37553,5032],{},[4591,37555,37128],{},[4596,37557,37121],{"mathvariant":7101},[4596,37559,5032],{},[4591,37561,37501],{},[4596,37563,37121],{"mathvariant":7101},[4596,37565,7062],{},[4587,37567,37568],{},"【逆否式】",[37094,37570],{"className":37571},[37097],[37094,37573],{"className":37574},[37140],[37091,37576,37577,37580,37592,37655,37658],{},[37094,37578],{"className":37579},[37097],[37094,37581,37582],{},[37101,37583,37584],{"scriptlevel":2949,"displaystyle":1419},[4584,37585,37586,37588,37590],{},[4591,37587,4594],{"stretchy":4593},[7077,37589,27433],{},[4591,37591,4604],{"stretchy":4593},[37094,37593,37594],{},[37101,37595,37596],{"scriptlevel":2949,"displaystyle":1419},[4584,37597,37598,37600,37603,37605,37607,37609,37611,37613,37615,37617,37619,37621,37623,37625,37627,37629,37631,37633,37635,37637,37639,37641,37643,37645,37647,37649,37651,37653],{},[4584,37599],{},[4596,37601,37602],{"mathvariant":7101},"∀",[4596,37604,4598],{},[4591,37606,4594],{"stretchy":4593},[4596,37608,17143],{},[4591,37610,4594],{"stretchy":4593},[4596,37612,4598],{},[4591,37614,4604],{"stretchy":4593},[4591,37616,37170],{},[4596,37618,17148],{},[4591,37620,4594],{"stretchy":4593},[4596,37622,4598],{},[4591,37624,4604],{"stretchy":4593},[4591,37626,4604],{"stretchy":4593},[4591,37628,37128],{},[4596,37630,37602],{"mathvariant":7101},[4596,37632,4598],{},[4596,37634,17143],{},[4591,37636,4594],{"stretchy":4593},[4596,37638,4598],{},[4591,37640,4604],{"stretchy":4593},[4591,37642,37170],{},[4596,37644,37602],{"mathvariant":7101},[4596,37646,4598],{},[4596,37648,17148],{},[4591,37650,4594],{"stretchy":4593},[4596,37652,4598],{},[4591,37654,4604],{"stretchy":4593},[37094,37656],{"className":37657},[37097],[37094,37659],{"className":37660},[37140],[37091,37662,37663,37666,37672,37738,37741],{},[37094,37664],{"className":37665},[37097],[37094,37667,37668],{},[37101,37669,37670],{"scriptlevel":2949,"displaystyle":1419},[4584,37671],{},[37094,37673,37674],{},[37101,37675,37676],{"scriptlevel":2949,"displaystyle":1419},[4584,37677,37678,37680,37683,37685,37687,37689,37691,37693,37695,37697,37699,37701,37703,37705,37707,37709,37711,37713,37715,37717,37719,37721,37723,37725,37727,37729,37731,37733,37735],{},[4584,37679],{},[4596,37681,37682],{"mathvariant":7101},"∃",[4596,37684,4598],{},[4591,37686,4594],{"stretchy":4593},[4596,37688,17143],{},[4591,37690,4594],{"stretchy":4593},[4596,37692,4598],{},[4591,37694,4604],{"stretchy":4593},[4591,37696,37210],{},[4596,37698,17148],{},[4591,37700,4594],{"stretchy":4593},[4596,37702,4598],{},[4591,37704,4604],{"stretchy":4593},[4591,37706,4604],{"stretchy":4593},[4591,37708,37128],{},[4596,37710,37682],{"mathvariant":7101},[4596,37712,4598],{},[4596,37714,17143],{},[4591,37716,4594],{"stretchy":4593},[4596,37718,4598],{},[4591,37720,4604],{"stretchy":4593},[4591,37722,37210],{},[4596,37724,37682],{"mathvariant":7101},[4596,37726,4598],{},[4596,37728,17148],{},[4591,37730,4594],{"stretchy":4593},[4596,37732,4598],{},[4591,37734,4604],{"stretchy":4593},[4587,37736,37737],{},"【量词分配律】",[37094,37739],{"className":37740},[37097],[37094,37742],{"className":37743},[37140],[37091,37745,37746,37749,37762,37800,37803],{},[37094,37747],{"className":37748},[37097],[37094,37750,37751],{},[37101,37752,37753],{"scriptlevel":2949,"displaystyle":1419},[4584,37754,37755,37757,37760],{},[4591,37756,4594],{"stretchy":4593},[7077,37758,37759],{},"8",[4591,37761,4604],{"stretchy":4593},[37094,37763,37764],{},[37101,37765,37766],{"scriptlevel":2949,"displaystyle":1419},[4584,37767,37768,37770,37772,37774,37776,37778,37780,37782,37784,37786,37788,37790,37792,37794,37796,37798],{},[4584,37769],{},[4596,37771,37121],{"mathvariant":7101},[4596,37773,37602],{"mathvariant":7101},[4596,37775,4598],{},[4596,37777,17143],{},[4591,37779,4594],{"stretchy":4593},[4596,37781,4598],{},[4591,37783,4604],{"stretchy":4593},[4591,37785,37128],{},[4596,37787,37682],{"mathvariant":7101},[4596,37789,4598],{},[4596,37791,37121],{"mathvariant":7101},[4596,37793,17143],{},[4591,37795,4594],{"stretchy":4593},[4596,37797,4598],{},[4591,37799,4604],{"stretchy":4593},[37094,37801],{"className":37802},[37097],[37094,37804],{"className":37805},[37140],[37091,37807,37808,37811,37817,37858,37861],{},[37094,37809],{"className":37810},[37097],[37094,37812,37813],{},[37101,37814,37815],{"scriptlevel":2949,"displaystyle":1419},[4584,37816],{},[37094,37818,37819],{},[37101,37820,37821],{"scriptlevel":2949,"displaystyle":1419},[4584,37822,37823,37825,37827,37829,37831,37833,37835,37837,37839,37841,37843,37845,37847,37849,37851,37853,37855],{},[4584,37824],{},[4596,37826,37121],{"mathvariant":7101},[4596,37828,37682],{"mathvariant":7101},[4596,37830,4598],{},[4596,37832,17143],{},[4591,37834,4594],{"stretchy":4593},[4596,37836,4598],{},[4591,37838,4604],{"stretchy":4593},[4591,37840,37128],{},[4596,37842,37602],{"mathvariant":7101},[4596,37844,4598],{},[4596,37846,37121],{"mathvariant":7101},[4596,37848,17143],{},[4591,37850,4594],{"stretchy":4593},[4596,37852,4598],{},[4591,37854,4604],{"stretchy":4593},[4587,37856,37857],{},"【量词转换律】",[37094,37859],{"className":37860},[37097],[37094,37862],{"className":37863},[37140],[4647,37865,37866],{"encoding":4649},"\\begin{align}\n(1) &\\neg \\neg P \\Leftrightarrow P 【双重否定律】 \\\\\n(2) &P \\land Q \\Leftrightarrow Q \\land P \\\\\n&P \\lor Q \\Leftrightarrow Q \\lor P 【交换律】\\\\\n(3) & P \\land (Q \\lor R) \\Leftrightarrow (P \\land Q) \\lor (P \\land R) \\\\\n& P \\lor (Q \\land R) \\Leftrightarrow (P \\lor Q) \\land (P \\lor R) 【分配律】\\\\\n(4) & \\neg (P \\land Q) \\Leftrightarrow \\neg P \\lor \\neg Q \\\\\n& \\neg (P \\lor Q) \\Leftrightarrow \\neg P \\land \\neg Q 【摩根律】\\\\\n(5) & P \\longrightarrow Q \\Leftrightarrow \\neg P \\lor Q 【蕴含表达式】\\\\\n(6) & P \\longrightarrow Q \\Leftrightarrow \\neg Q \\longrightarrow \\neg P 【逆否式】\\\\\n(7) & \\forall x (A(x) \\land B(x)) \\Leftrightarrow \\forall x A(x) \\land \\forall x B(x) \\\\\n& \\exists x (A(x) \\lor B(x)) \\Leftrightarrow \\exists x A(x) \\lor \\exists x B(x) 【量词分配律】\\\\\n(8) & \\neg \\forall xA(x) \\Leftrightarrow \\exists x \\neg A(x) \\\\\n& \\neg \\exists xA(x) \\Leftrightarrow \\forall x \\neg A(x) 【量词转换律】\\\\\n\\end{align}",[78,37868,37870,39056],{"className":37869,"ariaHidden":1419},[4654],[78,37871,37873,37877],{"className":37872},[4658],[78,37874],{"className":37875,"style":37876},[4662],"height:19.2em;vertical-align:-9.35em;",[78,37878,37880,38095],{"className":37879},[37085],[78,37881,37884],{"className":37882},[37883],"col-align-r",[78,37885,37887,38086],{"className":37886},[4693,4694],[78,37888,37890,38083],{"className":37889},[4698],[78,37891,37894,37912,37930,37939,37957,37966,37984,37993,38011,38029,38047,38056,38074],{"className":37892,"style":37893},[4702],"height:9.85em;",[78,37895,37897,37900],{"style":37896},"top:-12.01em;",[78,37898],{"className":37899,"style":4781},[4710],[78,37901,37903,37906,37909],{"className":37902},[4667],[78,37904,4594],{"className":37905},[4674],[78,37907,469],{"className":37908},[4667],[78,37910,4604],{"className":37911},[4682],[78,37913,37915,37918],{"style":37914},"top:-10.51em;",[78,37916],{"className":37917,"style":4781},[4710],[78,37919,37921,37924,37927],{"className":37920},[4667],[78,37922,4594],{"className":37923},[4674],[78,37925,472],{"className":37926},[4667],[78,37928,4604],{"className":37929},[4682],[78,37931,37933,37936],{"style":37932},"top:-9.01em;",[78,37934],{"className":37935,"style":4781},[4710],[78,37937],{"className":37938},[4667],[78,37940,37942,37945],{"style":37941},"top:-7.51em;",[78,37943],{"className":37944,"style":4781},[4710],[78,37946,37948,37951,37954],{"className":37947},[4667],[78,37949,4594],{"className":37950},[4674],[78,37952,1025],{"className":37953},[4667],[78,37955,4604],{"className":37956},[4682],[78,37958,37960,37963],{"style":37959},"top:-6.01em;",[78,37961],{"className":37962,"style":4781},[4710],[78,37964],{"className":37965},[4667],[78,37967,37969,37972],{"style":37968},"top:-4.51em;",[78,37970],{"className":37971,"style":4781},[4710],[78,37973,37975,37978,37981],{"className":37974},[4667],[78,37976,4594],{"className":37977},[4674],[78,37979,1014],{"className":37980},[4667],[78,37982,4604],{"className":37983},[4682],[78,37985,37987,37990],{"style":37986},"top:-3.01em;",[78,37988],{"className":37989,"style":4781},[4710],[78,37991],{"className":37992},[4667],[78,37994,37996,37999],{"style":37995},"top:-1.51em;",[78,37997],{"className":37998,"style":4781},[4710],[78,38000,38002,38005,38008],{"className":38001},[4667],[78,38003,4594],{"className":38004},[4674],[78,38006,11047],{"className":38007},[4667],[78,38009,4604],{"className":38010},[4682],[78,38012,38014,38017],{"style":38013},"top:-0.01em;",[78,38015],{"className":38016,"style":4781},[4710],[78,38018,38020,38023,38026],{"className":38019},[4667],[78,38021,4594],{"className":38022},[4674],[78,38024,1861],{"className":38025},[4667],[78,38027,4604],{"className":38028},[4682],[78,38030,38032,38035],{"style":38031},"top:1.49em;",[78,38033],{"className":38034,"style":4781},[4710],[78,38036,38038,38041,38044],{"className":38037},[4667],[78,38039,4594],{"className":38040},[4674],[78,38042,27433],{"className":38043},[4667],[78,38045,4604],{"className":38046},[4682],[78,38048,38050,38053],{"style":38049},"top:2.99em;",[78,38051],{"className":38052,"style":4781},[4710],[78,38054],{"className":38055},[4667],[78,38057,38059,38062],{"style":38058},"top:4.49em;",[78,38060],{"className":38061,"style":4781},[4710],[78,38063,38065,38068,38071],{"className":38064},[4667],[78,38066,4594],{"className":38067},[4674],[78,38069,37759],{"className":38070},[4667],[78,38072,4604],{"className":38073},[4682],[78,38075,38077,38080],{"style":38076},"top:5.99em;",[78,38078],{"className":38079,"style":4781},[4710],[78,38081],{"className":38082},[4667],[78,38084,4726],{"className":38085},[4725],[78,38087,38089],{"className":38088},[4698],[78,38090,38093],{"className":38091,"style":38092},[4702],"height:9.35em;",[78,38094],{},[78,38096,38099],{"className":38097},[38098],"col-align-l",[78,38100,38102,39048],{"className":38101},[4693,4694],[78,38103,38105,39045],{"className":38104},[4698],[78,38106,38108,38141,38191,38244,38349,38456,38521,38589,38645,38704,38812,38922,38982],{"className":38107,"style":37893},[4702],[78,38109,38110,38113],{"style":37896},[78,38111],{"className":38112,"style":4781},[4710],[78,38114,38116,38119,38123,38126,38129,38132,38135,38138],{"className":38115},[4667],[78,38117],{"className":38118},[4667],[78,38120,38122],{"className":38121},[4667],"¬¬",[78,38124,7062],{"className":38125,"style":5219},[4667,4678],[78,38127],{"className":38128,"style":4740},[4739],[78,38130,37128],{"className":38131},[4744],[78,38133],{"className":38134,"style":4740},[4739],[78,38136,7062],{"className":38137,"style":5219},[4667,4678],[78,38139,37133],{"className":38140},[4667,6184],[78,38142,38143,38146],{"style":37914},[78,38144],{"className":38145,"style":4781},[4710],[78,38147,38149,38152,38155,38158,38161,38164,38167,38170,38173,38176,38179,38182,38185,38188],{"className":38148},[4667],[78,38150],{"className":38151},[4667],[78,38153,7062],{"className":38154,"style":5219},[4667,4678],[78,38156],{"className":38157,"style":5143},[4739],[78,38159,37170],{"className":38160},[7450],[78,38162],{"className":38163,"style":5143},[4739],[78,38165,5032],{"className":38166},[4667,4678],[78,38168],{"className":38169,"style":4740},[4739],[78,38171,37128],{"className":38172},[4744],[78,38174],{"className":38175,"style":4740},[4739],[78,38177,5032],{"className":38178},[4667,4678],[78,38180],{"className":38181,"style":5143},[4739],[78,38183,37170],{"className":38184},[7450],[78,38186],{"className":38187,"style":5143},[4739],[78,38189,7062],{"className":38190,"style":5219},[4667,4678],[78,38192,38193,38196],{"style":37932},[78,38194],{"className":38195,"style":4781},[4710],[78,38197,38199,38202,38205,38208,38211,38214,38217,38220,38223,38226,38229,38232,38235,38238,38241],{"className":38198},[4667],[78,38200],{"className":38201},[4667],[78,38203,7062],{"className":38204,"style":5219},[4667,4678],[78,38206],{"className":38207,"style":5143},[4739],[78,38209,37210],{"className":38210},[7450],[78,38212],{"className":38213,"style":5143},[4739],[78,38215,5032],{"className":38216},[4667,4678],[78,38218],{"className":38219,"style":4740},[4739],[78,38221,37128],{"className":38222},[4744],[78,38224],{"className":38225,"style":4740},[4739],[78,38227,5032],{"className":38228},[4667,4678],[78,38230],{"className":38231,"style":5143},[4739],[78,38233,37210],{"className":38234},[7450],[78,38236],{"className":38237,"style":5143},[4739],[78,38239,7062],{"className":38240,"style":5219},[4667,4678],[78,38242,37223],{"className":38243},[4667,6184],[78,38245,38246,38249],{"style":37941},[78,38247],{"className":38248,"style":4781},[4710],[78,38250,38252,38255,38258,38261,38264,38267,38270,38273,38276,38279,38282,38286,38289,38292,38295,38298,38301,38304,38307,38310,38313,38316,38319,38322,38325,38328,38331,38334,38337,38340,38343,38346],{"className":38251},[4667],[78,38253],{"className":38254},[4667],[78,38256,7062],{"className":38257,"style":5219},[4667,4678],[78,38259],{"className":38260,"style":5143},[4739],[78,38262,37170],{"className":38263},[7450],[78,38265],{"className":38266,"style":5143},[4739],[78,38268,4594],{"className":38269},[4674],[78,38271,5032],{"className":38272},[4667,4678],[78,38274],{"className":38275,"style":5143},[4739],[78,38277,37210],{"className":38278},[7450],[78,38280],{"className":38281,"style":5143},[4739],[78,38283,27152],{"className":38284,"style":38285},[4667,4678],"margin-right:0.0077em;",[78,38287,4604],{"className":38288},[4682],[78,38290],{"className":38291,"style":4740},[4739],[78,38293,37128],{"className":38294},[4744],[78,38296],{"className":38297,"style":4740},[4739],[78,38299,4594],{"className":38300},[4674],[78,38302,7062],{"className":38303,"style":5219},[4667,4678],[78,38305],{"className":38306,"style":5143},[4739],[78,38308,37170],{"className":38309},[7450],[78,38311],{"className":38312,"style":5143},[4739],[78,38314,5032],{"className":38315},[4667,4678],[78,38317,4604],{"className":38318},[4682],[78,38320],{"className":38321,"style":5143},[4739],[78,38323,37210],{"className":38324},[7450],[78,38326],{"className":38327,"style":5143},[4739],[78,38329,4594],{"className":38330},[4674],[78,38332,7062],{"className":38333,"style":5219},[4667,4678],[78,38335],{"className":38336,"style":5143},[4739],[78,38338,37170],{"className":38339},[7450],[78,38341],{"className":38342,"style":5143},[4739],[78,38344,27152],{"className":38345,"style":38285},[4667,4678],[78,38347,4604],{"className":38348},[4682],[78,38350,38351,38354],{"style":37959},[78,38352],{"className":38353,"style":4781},[4710],[78,38355,38357,38360,38363,38366,38369,38372,38375,38378,38381,38384,38387,38390,38393,38396,38399,38402,38405,38408,38411,38414,38417,38420,38423,38426,38429,38432,38435,38438,38441,38444,38447,38450,38453],{"className":38356},[4667],[78,38358],{"className":38359},[4667],[78,38361,7062],{"className":38362,"style":5219},[4667,4678],[78,38364],{"className":38365,"style":5143},[4739],[78,38367,37210],{"className":38368},[7450],[78,38370],{"className":38371,"style":5143},[4739],[78,38373,4594],{"className":38374},[4674],[78,38376,5032],{"className":38377},[4667,4678],[78,38379],{"className":38380,"style":5143},[4739],[78,38382,37170],{"className":38383},[7450],[78,38385],{"className":38386,"style":5143},[4739],[78,38388,27152],{"className":38389,"style":38285},[4667,4678],[78,38391,4604],{"className":38392},[4682],[78,38394],{"className":38395,"style":4740},[4739],[78,38397,37128],{"className":38398},[4744],[78,38400],{"className":38401,"style":4740},[4739],[78,38403,4594],{"className":38404},[4674],[78,38406,7062],{"className":38407,"style":5219},[4667,4678],[78,38409],{"className":38410,"style":5143},[4739],[78,38412,37210],{"className":38413},[7450],[78,38415],{"className":38416,"style":5143},[4739],[78,38418,5032],{"className":38419},[4667,4678],[78,38421,4604],{"className":38422},[4682],[78,38424],{"className":38425,"style":5143},[4739],[78,38427,37170],{"className":38428},[7450],[78,38430],{"className":38431,"style":5143},[4739],[78,38433,4594],{"className":38434},[4674],[78,38436,7062],{"className":38437,"style":5219},[4667,4678],[78,38439],{"className":38440,"style":5143},[4739],[78,38442,37210],{"className":38443},[7450],[78,38445],{"className":38446,"style":5143},[4739],[78,38448,27152],{"className":38449,"style":38285},[4667,4678],[78,38451,4604],{"className":38452},[4682],[78,38454,37358],{"className":38455},[4667,6184],[78,38457,38458,38461],{"style":37968},[78,38459],{"className":38460,"style":4781},[4710],[78,38462,38464,38467,38470,38473,38476,38479,38482,38485,38488,38491,38494,38497,38500,38503,38506,38509,38512,38515,38518],{"className":38463},[4667],[78,38465],{"className":38466},[4667],[78,38468,37121],{"className":38469},[4667],[78,38471,4594],{"className":38472},[4674],[78,38474,7062],{"className":38475,"style":5219},[4667,4678],[78,38477],{"className":38478,"style":5143},[4739],[78,38480,37170],{"className":38481},[7450],[78,38483],{"className":38484,"style":5143},[4739],[78,38486,5032],{"className":38487},[4667,4678],[78,38489,4604],{"className":38490},[4682],[78,38492],{"className":38493,"style":4740},[4739],[78,38495,37128],{"className":38496},[4744],[78,38498],{"className":38499,"style":4740},[4739],[78,38501,37121],{"className":38502},[4667],[78,38504,7062],{"className":38505,"style":5219},[4667,4678],[78,38507],{"className":38508,"style":5143},[4739],[78,38510,37210],{"className":38511},[7450],[78,38513],{"className":38514,"style":5143},[4739],[78,38516,37121],{"className":38517},[4667],[78,38519,5032],{"className":38520},[4667,4678],[78,38522,38523,38526],{"style":37986},[78,38524],{"className":38525,"style":4781},[4710],[78,38527,38529,38532,38535,38538,38541,38544,38547,38550,38553,38556,38559,38562,38565,38568,38571,38574,38577,38580,38583,38586],{"className":38528},[4667],[78,38530],{"className":38531},[4667],[78,38533,37121],{"className":38534},[4667],[78,38536,4594],{"className":38537},[4674],[78,38539,7062],{"className":38540,"style":5219},[4667,4678],[78,38542],{"className":38543,"style":5143},[4739],[78,38545,37210],{"className":38546},[7450],[78,38548],{"className":38549,"style":5143},[4739],[78,38551,5032],{"className":38552},[4667,4678],[78,38554,4604],{"className":38555},[4682],[78,38557],{"className":38558,"style":4740},[4739],[78,38560,37128],{"className":38561},[4744],[78,38563],{"className":38564,"style":4740},[4739],[78,38566,37121],{"className":38567},[4667],[78,38569,7062],{"className":38570,"style":5219},[4667,4678],[78,38572],{"className":38573,"style":5143},[4739],[78,38575,37170],{"className":38576},[7450],[78,38578],{"className":38579,"style":5143},[4739],[78,38581,37121],{"className":38582},[4667],[78,38584,5032],{"className":38585},[4667,4678],[78,38587,37465],{"className":38588},[4667,6184],[78,38590,38591,38594],{"style":37995},[78,38592],{"className":38593,"style":4781},[4710],[78,38595,38597,38600,38603,38606,38609,38612,38615,38618,38621,38624,38627,38630,38633,38636,38639,38642],{"className":38596},[4667],[78,38598],{"className":38599},[4667],[78,38601,7062],{"className":38602,"style":5219},[4667,4678],[78,38604],{"className":38605,"style":4740},[4739],[78,38607,37501],{"className":38608},[4744],[78,38610],{"className":38611,"style":4740},[4739],[78,38613,5032],{"className":38614},[4667,4678],[78,38616],{"className":38617,"style":4740},[4739],[78,38619,37128],{"className":38620},[4744],[78,38622],{"className":38623,"style":4740},[4739],[78,38625,37121],{"className":38626},[4667],[78,38628,7062],{"className":38629,"style":5219},[4667,4678],[78,38631],{"className":38632,"style":5143},[4739],[78,38634,37210],{"className":38635},[7450],[78,38637],{"className":38638,"style":5143},[4739],[78,38640,5032],{"className":38641},[4667,4678],[78,38643,37516],{"className":38644},[4667,6184],[78,38646,38647,38650],{"style":38013},[78,38648],{"className":38649,"style":4781},[4710],[78,38651,38653,38656,38659,38662,38665,38668,38671,38674,38677,38680,38683,38686,38689,38692,38695,38698,38701],{"className":38652},[4667],[78,38654],{"className":38655},[4667],[78,38657,7062],{"className":38658,"style":5219},[4667,4678],[78,38660],{"className":38661,"style":4740},[4739],[78,38663,37501],{"className":38664},[4744],[78,38666],{"className":38667,"style":4740},[4739],[78,38669,5032],{"className":38670},[4667,4678],[78,38672],{"className":38673,"style":4740},[4739],[78,38675,37128],{"className":38676},[4744],[78,38678],{"className":38679,"style":4740},[4739],[78,38681,37121],{"className":38682},[4667],[78,38684,5032],{"className":38685},[4667,4678],[78,38687],{"className":38688,"style":4740},[4739],[78,38690,37501],{"className":38691},[4744],[78,38693],{"className":38694,"style":4740},[4739],[78,38696,37121],{"className":38697},[4667],[78,38699,7062],{"className":38700,"style":5219},[4667,4678],[78,38702,37568],{"className":38703},[4667,6184],[78,38705,38706,38709],{"style":38031},[78,38707],{"className":38708,"style":4781},[4710],[78,38710,38712,38715,38718,38721,38724,38727,38730,38733,38736,38739,38742,38745,38748,38751,38754,38758,38761,38764,38767,38770,38773,38776,38779,38782,38785,38788,38791,38794,38797,38800,38803,38806,38809],{"className":38711},[4667],[78,38713],{"className":38714},[4667],[78,38716,37602],{"className":38717},[4667],[78,38719,4598],{"className":38720},[4667,4678],[78,38722,4594],{"className":38723},[4674],[78,38725,17143],{"className":38726},[4667,4678],[78,38728,4594],{"className":38729},[4674],[78,38731,4598],{"className":38732},[4667,4678],[78,38734,4604],{"className":38735},[4682],[78,38737],{"className":38738,"style":5143},[4739],[78,38740,37170],{"className":38741},[7450],[78,38743],{"className":38744,"style":5143},[4739],[78,38746,17148],{"className":38747,"style":17276},[4667,4678],[78,38749,4594],{"className":38750},[4674],[78,38752,4598],{"className":38753},[4667,4678],[78,38755,38757],{"className":38756},[4682],"))",[78,38759],{"className":38760,"style":4740},[4739],[78,38762,37128],{"className":38763},[4744],[78,38765],{"className":38766,"style":4740},[4739],[78,38768,37602],{"className":38769},[4667],[78,38771,4598],{"className":38772},[4667,4678],[78,38774,17143],{"className":38775},[4667,4678],[78,38777,4594],{"className":38778},[4674],[78,38780,4598],{"className":38781},[4667,4678],[78,38783,4604],{"className":38784},[4682],[78,38786],{"className":38787,"style":5143},[4739],[78,38789,37170],{"className":38790},[7450],[78,38792],{"className":38793,"style":5143},[4739],[78,38795,37602],{"className":38796},[4667],[78,38798,4598],{"className":38799},[4667,4678],[78,38801,17148],{"className":38802,"style":17276},[4667,4678],[78,38804,4594],{"className":38805},[4674],[78,38807,4598],{"className":38808},[4667,4678],[78,38810,4604],{"className":38811},[4682],[78,38813,38814,38817],{"style":38049},[78,38815],{"className":38816,"style":4781},[4710],[78,38818,38820,38823,38826,38829,38832,38835,38838,38841,38844,38847,38850,38853,38856,38859,38862,38865,38868,38871,38874,38877,38880,38883,38886,38889,38892,38895,38898,38901,38904,38907,38910,38913,38916,38919],{"className":38819},[4667],[78,38821],{"className":38822},[4667],[78,38824,37682],{"className":38825},[4667],[78,38827,4598],{"className":38828},[4667,4678],[78,38830,4594],{"className":38831},[4674],[78,38833,17143],{"className":38834},[4667,4678],[78,38836,4594],{"className":38837},[4674],[78,38839,4598],{"className":38840},[4667,4678],[78,38842,4604],{"className":38843},[4682],[78,38845],{"className":38846,"style":5143},[4739],[78,38848,37210],{"className":38849},[7450],[78,38851],{"className":38852,"style":5143},[4739],[78,38854,17148],{"className":38855,"style":17276},[4667,4678],[78,38857,4594],{"className":38858},[4674],[78,38860,4598],{"className":38861},[4667,4678],[78,38863,38757],{"className":38864},[4682],[78,38866],{"className":38867,"style":4740},[4739],[78,38869,37128],{"className":38870},[4744],[78,38872],{"className":38873,"style":4740},[4739],[78,38875,37682],{"className":38876},[4667],[78,38878,4598],{"className":38879},[4667,4678],[78,38881,17143],{"className":38882},[4667,4678],[78,38884,4594],{"className":38885},[4674],[78,38887,4598],{"className":38888},[4667,4678],[78,38890,4604],{"className":38891},[4682],[78,38893],{"className":38894,"style":5143},[4739],[78,38896,37210],{"className":38897},[7450],[78,38899],{"className":38900,"style":5143},[4739],[78,38902,37682],{"className":38903},[4667],[78,38905,4598],{"className":38906},[4667,4678],[78,38908,17148],{"className":38909,"style":17276},[4667,4678],[78,38911,4594],{"className":38912},[4674],[78,38914,4598],{"className":38915},[4667,4678],[78,38917,4604],{"className":38918},[4682],[78,38920,37737],{"className":38921},[4667,6184],[78,38923,38924,38927],{"style":38058},[78,38925],{"className":38926,"style":4781},[4710],[78,38928,38930,38933,38937,38940,38943,38946,38949,38952,38955,38958,38961,38964,38967,38970,38973,38976,38979],{"className":38929},[4667],[78,38931],{"className":38932},[4667],[78,38934,38936],{"className":38935},[4667],"¬∀",[78,38938,4598],{"className":38939},[4667,4678],[78,38941,17143],{"className":38942},[4667,4678],[78,38944,4594],{"className":38945},[4674],[78,38947,4598],{"className":38948},[4667,4678],[78,38950,4604],{"className":38951},[4682],[78,38953],{"className":38954,"style":4740},[4739],[78,38956,37128],{"className":38957},[4744],[78,38959],{"className":38960,"style":4740},[4739],[78,38962,37682],{"className":38963},[4667],[78,38965,4598],{"className":38966},[4667,4678],[78,38968,37121],{"className":38969},[4667],[78,38971,17143],{"className":38972},[4667,4678],[78,38974,4594],{"className":38975},[4674],[78,38977,4598],{"className":38978},[4667,4678],[78,38980,4604],{"className":38981},[4682],[78,38983,38984,38987],{"style":38076},[78,38985],{"className":38986,"style":4781},[4710],[78,38988,38990,38993,38997,39000,39003,39006,39009,39012,39015,39018,39021,39024,39027,39030,39033,39036,39039,39042],{"className":38989},[4667],[78,38991],{"className":38992},[4667],[78,38994,38996],{"className":38995},[4667],"¬∃",[78,38998,4598],{"className":38999},[4667,4678],[78,39001,17143],{"className":39002},[4667,4678],[78,39004,4594],{"className":39005},[4674],[78,39007,4598],{"className":39008},[4667,4678],[78,39010,4604],{"className":39011},[4682],[78,39013],{"className":39014,"style":4740},[4739],[78,39016,37128],{"className":39017},[4744],[78,39019],{"className":39020,"style":4740},[4739],[78,39022,37602],{"className":39023},[4667],[78,39025,4598],{"className":39026},[4667,4678],[78,39028,37121],{"className":39029},[4667],[78,39031,17143],{"className":39032},[4667,4678],[78,39034,4594],{"className":39035},[4674],[78,39037,4598],{"className":39038},[4667,4678],[78,39040,4604],{"className":39041},[4682],[78,39043,37857],{"className":39044},[4667,6184],[78,39046,4726],{"className":39047},[4725],[78,39049,39051],{"className":39050},[4698],[78,39052,39054],{"className":39053,"style":38092},[4702],[78,39055],{},[78,39057,39060],{"className":39058},[39059],"tag",[78,39061,39063,39191],{"className":39062},[4693,4694],[78,39064,39066,39188],{"className":39065},[4698],[78,39067,39069,39080,39089,39098,39107,39116,39125,39134,39143,39152,39161,39170,39179],{"className":39068,"style":37893},[4702],[78,39070,39072,39076],{"style":39071},"top:-11.85em;",[78,39073],{"className":39074,"style":39075},[4710],"height:2.84em;",[78,39077],{"className":39078},[39079],"eqn-num",[78,39081,39083,39086],{"style":39082},"top:-10.35em;",[78,39084],{"className":39085,"style":39075},[4710],[78,39087],{"className":39088},[39079],[78,39090,39092,39095],{"style":39091},"top:-8.85em;",[78,39093],{"className":39094,"style":39075},[4710],[78,39096],{"className":39097},[39079],[78,39099,39101,39104],{"style":39100},"top:-7.35em;",[78,39102],{"className":39103,"style":39075},[4710],[78,39105],{"className":39106},[39079],[78,39108,39110,39113],{"style":39109},"top:-5.85em;",[78,39111],{"className":39112,"style":39075},[4710],[78,39114],{"className":39115},[39079],[78,39117,39119,39122],{"style":39118},"top:-4.35em;",[78,39120],{"className":39121,"style":39075},[4710],[78,39123],{"className":39124},[39079],[78,39126,39128,39131],{"style":39127},"top:-2.85em;",[78,39129],{"className":39130,"style":39075},[4710],[78,39132],{"className":39133},[39079],[78,39135,39137,39140],{"style":39136},"top:-1.35em;",[78,39138],{"className":39139,"style":39075},[4710],[78,39141],{"className":39142},[39079],[78,39144,39146,39149],{"style":39145},"top:0.15em;",[78,39147],{"className":39148,"style":39075},[4710],[78,39150],{"className":39151},[39079],[78,39153,39155,39158],{"style":39154},"top:1.65em;",[78,39156],{"className":39157,"style":39075},[4710],[78,39159],{"className":39160},[39079],[78,39162,39164,39167],{"style":39163},"top:3.15em;",[78,39165],{"className":39166,"style":39075},[4710],[78,39168],{"className":39169},[39079],[78,39171,39173,39176],{"style":39172},"top:4.65em;",[78,39174],{"className":39175,"style":39075},[4710],[78,39177],{"className":39178},[39079],[78,39180,39182,39185],{"style":39181},"top:6.15em;",[78,39183],{"className":39184,"style":39075},[4710],[78,39186],{"className":39187},[39079],[78,39189,4726],{"className":39190},[4725],[78,39192,39194],{"className":39193},[4698],[78,39195,39197],{"className":39196,"style":38092},[4702],[78,39198],{},[13,39200,39201,39202,28447],{},"具体的使用参见书上例题5-5~5-7（",[22,39203,39204],{},"一定要看",[23289,39206],{},[7759,39208,39210],{"id":39209},"_2归结演绎推理","2、归结演绎推理",[10548,39212,39214],{"id":39213},"_1子句与子句集","1、子句与子句集",[13,39216,39217],{},"原子谓词公式及其否定称为文字，若干个文字的一个析取式称为一个子句，由r个文字组成的子句叫r-文字子句，l-文字子句叫单元子句，不含任何文字的子句称为空子句，记为□或NIL。",[13,39219,39220],{},"对一个谓词公式G，通过一下步骤得到的子句集和S称为G的子句集：",[13,39222,39223,39224],{},"【1】消去蕴含式→和等值词↔。",[22,39225,39226],{},"（去箭头）",[13,39228,39229,39230],{},"【2】缩小否定词的作用范围，直到其仅作用于原子公式。",[22,39231,39232],{},"（消括号&将┐放在存在量词和全称量词里面）",[13,39234,39235],{},"【3】适当改名，使量词间不含同名指导变元和约束变元。\n【4】消去存在量词。",[13,39237,39238],{},"【5】消去所有全称量词。",[13,39240,39241],{},"【6】化公式为合取范式。",[13,39243,39244],{},"【7】适当改名，使子句间无同名变元。",[13,39246,39247],{},"【8】消去合取词∧，以子句为元素组成一个集合S。",[10548,39249,39251],{"id":39250},"_2归结原理","2、归结原理",[13,39253,39254],{},"归结演绎推理是基于一种称为归结原理（也称为消解原理）的推理规则的推理方法。它是谓词逻辑中一个相当有效的机械化推理方法。归结原理的出现，被认为是自动推理，特别是定理机器证明领域的重大突破。",[107,39256,39257],{"id":39257},"附录",[7759,39259,39261],{"id":39260},"大题部分考试前参考","大题部分（考试前参考）",[10548,39263,39265],{"id":39264},"_1遗传算法参照p90例4-1考试大题10分","1、遗传算法（参照P90例4-1）（考试大题10分）",[49,39267,39268,39271],{},[52,39269,39270],{},"适应度计算（根据公式）",[52,39272,39273],{},"选择-复制（根据概率）、交叉（交换部分）、变异（变化部分）",[10548,39275,39277],{"id":39276},"_2一阶谓词推理考试大题20分","2、一阶谓词推理（考试大题20分）",[13,39279,39280],{},"详见第五章部分内容，例题可以参考课后习题。",[49,39282,39283,39286,39289],{},[52,39284,39285],{},"将句子用一阶谓词表示；",[52,39287,39288],{},"求解谓词公式的子句集；",[52,39290,39291],{},"利用归结原理证明。",[10548,39293,39295],{"id":39294},"_3产生式规则","3、产生式规则",[13,39297,39298],{},"简单概率问题，能看懂图会画就行。",[10548,39300,39302],{"id":39301},"_4决策树p210考试大题15分","4、决策树（P210）（考试大题15分）",[49,39304,39305],{},[52,39306,39307],{},"信息熵和条件熵公式",[10548,39309,39311],{"id":39310},"_5k-均值聚类算法p261-p268考试大题5分","5、K-均值聚类算法（P261-P268）（考试大题5分）",[7759,39313,39314],{"id":39314},"未补全章节",[39316,39317,39319],"h5",{"id":39318},"第七章-几种结构化知识表示及其推理","第七章 几种结构化知识表示及其推理",[10548,39321,39323],{"id":39322},"_1元组的概念p143","1、元组的概念（P143）",[10548,39325,39327],{"id":39326},"_2框架的概念p144","2、框架的概念（P144）",[23289,39329],{},[39316,39331,39333],{"id":39332},"第八章-不确定和不确定性知识的表示与推理","第八章 不确定和不确定性知识的表示与推理",[13,39335,39336],{},"######　基于贝叶斯网络的概率推理（P172-P176）",[13,39338,39339],{},"重点在于P175的诊断推理中的计算：（考试原题）",[13,39341,39342],{},[617,39343],{"alt":39344,"src":39345},"贝叶斯网络1","%E8%B4%9D%E5%8F%B6%E6%96%AF%E7%BD%91%E7%BB%9C1.png",[13,39347,39348],{},[617,39349],{"alt":39350,"src":39351},"贝叶斯网络2","%E8%B4%9D%E5%8F%B6%E6%96%AF%E7%BD%91%E7%BB%9C2.png",[13,39353,39354],{},[617,39355],{"alt":39350,"src":39356},"%E8%B4%9D%E5%8F%B6%E6%96%AF%E7%BD%91%E7%BB%9C3.png",[23289,39358],{},[39316,39360,39362],{"id":39361},"第九章-机器学习符号学习与交互学习","第九章 机器学习：符号学习与交互学习",[10548,39364,39366],{"id":39365},"决策树学习p205-p212","决策树学习（P205-P212）",[13,39368,39369],{},"重点在于P210决策树的ID3算法，需要了解整个流程，能够独立写出P211的所有内容并得出最终结论。",[23289,39371],{},[39316,39373,39375],{"id":39374},"第十二章-数据挖掘与知识发现","第十二章 数据挖掘与知识发现",[10548,39377,39379],{"id":39378},"k-均值聚类算法p261关联规则开始到p268","k-均值聚类算法（P261关联规则开始到P268）",[13,39381,39382],{},"重点不在书本上，建议自学的话直接在B站上搜索k-均值聚类算法。推荐一个我当时学习的视频：",[13,39384,39385],{},[5009,39386,39387],{"href":39387,"rel":39388},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1py4y1r7DN?spm_id_from=333.337.search-card.all.click&vd_source=a81ef8427e696b92de364d833142bd10",[23647],[13,39390,39391],{},[617,39392],{"alt":39393,"src":39394},"k-均值聚类算法视频推荐","k-%E5%9D%87%E5%80%BC%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95%E8%A7%86%E9%A2%91%E6%8E%A8%E8%8D%90.png",[13,39396,39397],{},"笔记鲨UP主的这一系列非常适合算法类（单指人工智能导论中常用的几个）的入门，有时间的话可以都看一下，讲的比较简单也十分容易懂，完成考试内容是完全没有问题的。",[13,39399,39400],{},"k-均值聚类算法主要还是了解一下算法的具体流程以及簇心的更新、选择流程，考试中占的分值并不大。",[23289,39402],{},[39316,39404,39406],{"id":39405},"第十六章-专家知识系统","第十六章 专家（知识）系统",[13,39408,39409],{},"这里我的建议是都看，选择题至少出了三个专家系统，包括专家系统的概念结构、黑板模型等一系列问题，因为我只是粗略的看了下所以考试时选择题基本都不会，全靠大题拉分。所以我的建议是All In。专家系统也是很多学科都会介绍的内容，这里多看点，深入了解绝对不亏的啦！",{"title":119,"searchDepth":144,"depth":144,"links":39411},[39412,39420,39424,39427,39431],{"id":36491,"depth":132,"text":36492,"children":39413},[39414,39415,39416,39417,39418,39419],{"id":36495,"depth":144,"text":36496},{"id":36521,"depth":144,"text":36522},{"id":36558,"depth":144,"text":36559},{"id":36570,"depth":144,"text":36571},{"id":36582,"depth":144,"text":36583},{"id":36658,"depth":144,"text":36659},{"id":36761,"depth":132,"text":36762,"children":39421},[39422,39423],{"id":36835,"depth":144,"text":36836},{"id":36984,"depth":144,"text":36985},{"id":37022,"depth":132,"text":37023,"children":39425},[39426],{"id":37026,"depth":144,"text":37027},{"id":37059,"depth":132,"text":37060,"children":39428},[39429,39430],{"id":37069,"depth":144,"text":37070},{"id":39209,"depth":144,"text":39210},{"id":39257,"depth":132,"text":39257,"children":39432},[39433,39434],{"id":39260,"depth":144,"text":39261},{"id":39314,"depth":144,"text":39314,"children":39435},[39436,39437,39438,39439,39440],{"id":39318,"depth":150,"text":39319},{"id":39332,"depth":150,"text":39333},{"id":39361,"depth":150,"text":39362},{"id":39374,"depth":150,"text":39375},{"id":39405,"depth":150,"text":39406},{},"我的大学\u002F大二下学期\u002F人工智能导论\u002F人工智能导论.md","\u002Fundergraduate\u002Fnote-546c7b33704a",{"title":36475,"description":119},"undergraduate\u002Fnote-546c7b33704a",[9133,7744,246,14542],"7ErargYjLJqCoa11UR1nKQWP9DMmUbcbSa2cb_ZN1QY",{"id":39449,"title":39450,"assetBase":239,"author":8,"body":39451,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":41592,"navigation":128,"originalPath":41593,"path":41594,"seo":41595,"source":23330,"stem":41596,"tags":41597,"weight":250,"__hash__":41598},"content\u002Fundergraduate\u002Fnote-562cd86ca0b0.md","校招投递记录",{"type":10,"value":39452,"toc":41586},[39453,39456,41100,41103,41245,41247,41539,41542],[7759,39454,39455],{"id":39455},"网投",[8366,39457,39458,39480],{},[8369,39459,39460],{},[8372,39461,39462,39465,39468,39471,39474,39477],{},[8375,39463,39464],{},"时间",[8375,39466,39467],{},"企业",[8375,39469,39470],{},"岗位",[8375,39472,39473],{},"操作",[8375,39475,39476],{},"任职要求",[8375,39478,39479],{},"状态",[8386,39481,39482,39516,39543,39577,39604,39634,39675,39709,39739,39768,39803,39849,39878,39905,39936,39966,40008,40037,40094,40127,40157,40187,40208,40234,40272,40302,40328,40352,40370,40394,40425,40441,40459,40476,40526,40552,40577,40610,40638,40667,40703,40751,40780,40839,40869,40912,40941,40967,40999,41025,41057,41086],{},[8372,39483,39484,39487,39490,39493,39495,39513],{},[8391,39485,39486],{},"9.10",[8391,39488,39489],{},"shein",[8391,39491,39492],{},"数据开发工程师",[8391,39494],{},[8391,39496,39497,39498,39500,39501,39503,39504,39506,39507,39509,39510,39512],{},"1.2024届本科及以上学历，计算机相关专业； ",[2996,39499],{},"2.掌握数据结构与算法，有java或scala研发经验；理解基本的设计模式，能将业务需求快速理解成技术需求；",[2996,39502],{},"3.至少熟悉使用一种脚本语言shell或python；",[2996,39505],{},"4.熟悉Hadoop架构和工作原理，MapReduce编程；熟悉Hive，有HQL优化经验优先；",[2996,39508],{},"5.熟练掌握spark及spark streaming开发，有实际项目研发经验更佳；",[2996,39511],{},"6.有其他数据研发相关工具经验优先，例如HBase.Kylin.ES.Kudu.Redis。",[8391,39514,39515],{},"暂不匹配",[8372,39517,39518,39520,39523,39526,39528,39540],{},[8391,39519,39486],{},[8391,39521,39522],{},"快手",[8391,39524,39525],{},"数据工程师",[8391,39527],{},[8391,39529,39530,39531,39533,39534,39536,39537,39539],{},"1、本科及以上学历，计算机、数学、统计、数据科学、大数据技术等相关专业；",[2996,39532],{},"2、有较强的动手能力和学习能力，熟悉一门数据处理语言，如SQL、Java、Python等；",[2996,39535],{},"3、有较强的逻辑思维、解决问题的能力，有较强的沟通和团队协作能力；",[2996,39538],{},"4、对Hadoop相关分布式平台及生态有一定的理解，参与过数据处理、挖掘等相关项目的优先。",[8391,39541,39542],{},"HR初筛挂",[8372,39544,39545,39548,39551,39554,39556,39574],{},[8391,39546,39547],{},"9.11",[8391,39549,39550],{},"阿里大文娱集团",[8391,39552,39553],{},"数据研发工程师",[8391,39555],{},[8391,39557,39558,39559,39561,39562,39564,39565,39567,39568,39570,39571,39573],{},"1、较强的动手能力和学习能力，熟悉一门数据处理语言，如SQL、JAVA、Python、Perl等，熟悉unix或者linux操作；",[2996,39560],{},"2、具备扎实的专业基础，良好的沟通能力和团队合作，主动积极，乐于面对挑战；",[2996,39563],{},"3、学习能力强，对新事物保有好奇心，并能快速适应新环境。",[2996,39566],{},"【加分项】",[2996,39569],{},"1、有参与数据处理、分析、挖掘等相关项目的经验； ",[2996,39572],{},"2、对Hadoop、Hive、Hbase等分布式平台有一定的理解。",[8391,39575,39576],{},"简历挂",[8372,39578,39579,39582,39585,39588,39590,39602],{},[8391,39580,39581],{},"9.14",[8391,39583,39584],{},"知乎",[8391,39586,39587],{},"大数据平台开发工程师",[8391,39589],{},[8391,39591,39592,39593,39595,39596,39598,39599,39601],{},"* 熟悉 Java\u002FPython\u002FC++\u002FRust\u002FGolang 中的一种或多种编程语言",[2996,39594],{},"* 熟悉 MySQL、Redis、HBase 等存储系统的原理和使用，有大数据量处理经验",[2996,39597],{},"* 了解并使用过 Hive、Spark、Presto、ClickHouse、Doris等计算引擎中的任意几种",[2996,39600],{},"* 能够进行复杂大规模分布式系统开发维护，有高并发、多线程等场景丰富的应用经验",[8391,39603,39515],{},[8372,39605,39606,39608,39611,39614,39616,39631],{},[8391,39607,39581],{},[8391,39609,39610],{},"哔哩哔哩",[8391,39612,39613],{},"开发工程师（数据产品部）",[8391,39615],{},[8391,39617,39618,39619,39621,39622,39624,39625,39627,39628,39630],{},"1、本科及以上学历，计算机相关专业，或具备同等计算机知识水平和学习能力的其他专业应届生； ",[2996,39620],{},"2、计算机基础（操作系统、数据库、算法与数据结构、网络、概率统计等）扎实，有优秀的编码能力; ",[2996,39623],{},"3、熟练掌握至少一种主流编程语言（包括但不限于 Java\u002FGolang\u002FC++）； ",[2996,39626],{},"3、对数据开发、分析 相关领域有兴趣和热情，有志于长期在大数据领域发展； ",[2996,39629],{},"4、有分布式系统\u002F数仓模型建设等相关领域论文发表，或参与过大数据社区开源项目者加分。",[8391,39632,39633],{},"初筛阶段不匹配",[8372,39635,39636,39638,39641,39644,39646,39673],{},[8391,39637,39581],{},[8391,39639,39640],{},"星环科技",[8391,39642,39643],{},"大数据开发工程师",[8391,39645],{},[8391,39647,39648,39649,39651,39652,39654,39655,39657,39658,39660,39661,39663,39664,39666,39667,39669,39670,39672],{},"1) 计算机专业，本科及以上学历，",[2996,39650],{},"2) 理解分布式技术基础原理和架构设计，了解过Hadoop、Spark、Flink等一种或多种框架；",[2996,39653],{},"3) 具备数据库系统的理论基础，了解数据库和SQL性能调优基础知识；熟练使用SQL语言，掌握Oracle、DB2、MySQL、SQL Server、GP、HiveQL、SparkSQL、FlinkSQL等至少一种数据库系统的使用；",[2996,39656],{},"4) 熟悉Linux系统的基本原理，熟练掌握常用的运维监控命令；",[2996,39659],{},"5) 至少熟练使用Java\u002FPython\u002FScala一种开发语言；",[2996,39662],{},"6) 使用过Markdown、Office等工具编写过博客\u002F技术文档等，乐于总结思路和经验",[2996,39665],{},"7) 善于独立分析、定位和解决问题问题，并能拆分出问题的微观方面；",[2996,39668],{},"8) 具备良好的需求理解、技术分析、沟通协调能力以及团队合作精神；性格积极乐观，诚信，有较强的技术表达能力；具备强烈的进取心，求知欲和合作精神。",[2996,39671],{},"9) 能接受Base所属区域范围内的出差；",[8391,39674,39515],{},[8372,39676,39677,39680,39683,39686,39688,39706],{},[8391,39678,39679],{},"9.18",[8391,39681,39682],{},"科大讯飞",[8391,39684,39685],{},"大数据工程师",[8391,39687],{},[8391,39689,39690,39691,39693,39694,39696,39697,39699,39700,39702,39703,39705],{},"1、重点院校本科及以上学历，计算机、数学、统计学等相关专业，具备Hadoop相关开发经验；",[2996,39692],{},"2、熟悉主流的云计算、大数据产品（Hadoop、Spark、Flume等）和数据分析技术，具有数据挖掘、海量数据处理等相关项目经验者优先；",[2996,39695],{},"3、熟练使用Python\u002FScala\u002FR或者SQL语言编程；",[2996,39698],{},"4、熟悉Linux\u002FUnix平台上的开发环境；",[2996,39701],{},"5、思路敏捷清晰，良好的表达和理解能力，具备团队合作精神和主动沟通意识。",[2996,39704],{},"此岗位为科大讯飞集团统一招聘岗位，人员通过简历筛选、笔试、初试、复试、终审等环节后录用",[8391,39707,39708],{},"简历初筛挂",[8372,39710,39711,39713,39716,39718,39721,39736],{},[8391,39712,39679],{},[8391,39714,39715],{},"FunPlus",[8391,39717,39643],{},[8391,39719,39720],{},"笔试",[8391,39722,39723,39724,39726,39727,39729,39730,39732,39733,39735],{},"1. 全日制统招本科及以上学历，计算机、数据等相关专业；",[2996,39725],{},"2. 熟悉数据仓库、数据体系和数据价值的建设及优化；了解大数据架构，具备实时和离线数据研发能力，熟悉Hive、Spark、Flink等相关技术，熟练掌握Python、SQL和Java；",[2996,39728],{},"3. 具备一定的机器学习\u002F人工智能基础，参与过AI相关的竞赛\u002F实习\u002F项目等相关经验；",[2996,39731],{},"4. 具备快速学习能力、跨团队沟通协作能力，有较强的逻辑思维能力和解决问题能力；",[2996,39734],{},"5. Snowflake、阿里云、AWS等云平台使用经验者优先，有数据质量管理、元数据管理等数据治理实施经验者优先。",[8391,39737,39738],{},"笔试挂",[8372,39740,39741,39743,39746,39748,39750,39765],{},[8391,39742,39679],{},[8391,39744,39745],{},"网易互联网",[8391,39747,39643],{},[8391,39749],{},[8391,39751,39752,39753,39755,39756,39758,39759,39761,39762,39764],{},"1、计算机或电信、网络等相关专业，本科以上的学历。 ",[2996,39754],{},"2、熟练掌握Java 编程语言，并熟悉Shell，Python等一门以上脚本语言； ",[2996,39757],{},"3、熟悉Linux／Unix环境，有Hadoop框架开发经验者帅气值加五分； ",[2996,39760],{},"4、了解Hive\u002FHbase\u002FSpark\u002FStorm等一种以上大数据处理工具和技术者帅气值加五分； ",[2996,39763],{},"5、抗压能力强，责任心又重，遇到难题冲上去就是干，关键还能和团队打得一手好配合。",[8391,39766,39767],{},"筛选不通过",[8372,39769,39770,39772,39775,39777,39779,39800],{},[8391,39771,39679],{},[8391,39773,39774],{},"好未来",[8391,39776,39492],{},[8391,39778,39720],{},[8391,39780,39781,39782,39784,39785,39787,39788,39790,39791,39793,39794,39796,39797,39799],{},"1. 全日制统招本科及以上学历，计算机、信息管理、数学等相关专业。",[2996,39783],{},"2. 熟悉数据库相关操作，熟悉SQL、HiveSQL、Spark语句;",[2996,39786],{},"3. 熟练使用linux，熟悉Python、Scala、Java等其中一种语言;",[2996,39789],{},"4. 了解Hadoop生态圈相关组件：Hdfs、MR、Hive、Spark、HBase等;",[2996,39792],{},"5. 了解企业数据仓库（EDW）设计理论与技术、Kimball维度建模理论与技术;",[2996,39795],{},"6. 具备良好的沟通能力和团队合作精神，能够与业务部门和数据分析师紧密合作。",[2996,39798],{},"7. 具备较强的学习能力和自我驱动力，能够不断学习和掌握新技术和工具。",[8391,39801,39802],{},"本轮淘汰",[8372,39804,39805,39808,39811,39814,39816,39846],{},[8391,39806,39807],{},"9.19",[8391,39809,39810],{},"百度",[8391,39812,39813],{},"大数据研发工程师",[8391,39815,39720],{},[8391,39817,39818,39819,39821,39822,39824,39825,39827,39828,39830,39831,39833,39834,39836,39837,39839,39840,39842,39843,39845],{},"-计算机相关专业应届毕业生 ",[2996,39820],{},"-对Spark及Hadoop技术有深入了解 ",[2996,39823],{},"-熟悉Python\u002FJava\u002FScala\u002FPhp等编程语言，熟练使用SQL，有良好的编码习惯，对分布式有深刻理解 ",[2996,39826],{},"-了解Windows、Unix、Linux等主流操作系统原理，熟练运用系统层支持应用开发 ",[2996,39829],{},"-技术视野开阔，有强烈的上进心和求知欲，善于学习和运用新知识，勇于解决难题  ",[2996,39832],{},"-善于沟通和逻辑表达，拥有优秀的分析问题和解决问题的能力，良好的团队合作精神和积极主动的沟通意识  ",[2996,39835],{},"-有激情，具有自我驱动力，追求卓越 具有以下条件者优先：  ",[2996,39838],{},"-计算机领域相关的编程大赛获奖、专业期刊发表文章或者有发明专利等 ",[2996,39841],{},"-具备大数据云平台、计算存储平台、可视化开发平台经验，熟悉软件工程开发流程 ",[2996,39844],{},"-具备专业领域的计算机知识和技能： Storm\u002FHive\u002FHbase\u002FStorm\u002FKafka等",[8391,39847,39848],{},"笔试稀烂，直接挂",[8372,39850,39851,39853,39856,39858,39860,39876],{},[8391,39852,39807],{},[8391,39854,39855],{},"阿里国际集团",[8391,39857,39553],{},[8391,39859],{},[8391,39861,39862,39863,39558,39865,39561,39867,39564,39869,39567,39871,39873,39874,39573],{},"【必备项】",[2996,39864],{},[2996,39866],{},[2996,39868],{},[2996,39870],{},[2996,39872],{},"1、有参与数据处理、分析、挖掘等相关项目的经验；",[2996,39875],{},[8391,39877,39576],{},[8372,39879,39880,39883,39886,39888,39890,39902],{},[8391,39881,39882],{},"9.20",[8391,39884,39885],{},"宁德时代",[8391,39887,39492],{},[8391,39889],{},[8391,39891,39892,39893,39895,39896,39898,39899,39901],{},"1.硕士及以上学历；",[2996,39894],{},"2.数学类、计算机专业与科学、软件工程、信息类等相关专业；3.英语CET-4及以上；",[2996,39897],{},"4.熟悉前后端开发技术，包括：python、java、C#、html、javascript、Jquery等编程开发语言及其相关框架；熟练运用Django框架及相关微服务框架；熟练应用mysql、GP、HANA等数据库应用；具备数据挖掘及大数据处理能力；",[2996,39900],{},"5.善于沟通表达，具备较强的自主学习能力。",[8391,39903,39904],{},"学历不够",[8372,39906,39907,39909,39912,39915,39918,39933],{},[8391,39908,39882],{},[8391,39910,39911],{},"吉利",[8391,39913,39914],{},"新能源智能网联大数据开发工程师",[8391,39916,39917],{},"HR转推荐",[8391,39919,39920,39921,39923,39924,39926,39927,39929,39930,39932],{},"1、本科以上学历，计算机相关专业，对数据处理、数据建模、数据分析等有深刻认识和实战经验；",[2996,39922],{},"2、熟悉Hive SQL语言，熟悉shell, python等脚本语言；",[2996,39925],{},"3、有hadoop、spark、flink等大数据平台的使用经验；",[2996,39928],{},"4、掌握Hadoop及Map-Reduce应用开发，掌握HBase、Hive、Storm、spark等大数据开发工具；",[2996,39931],{},"5、熟悉至少一种实时计算引擎。",[8391,39934,39935],{},"转到工业岗去了",[8372,39937,39938,39941,39944,39946,39948,39963],{},[8391,39939,39940],{},"9.21",[8391,39942,39943],{},"蔚来",[8391,39945,39492],{},[8391,39947],{},[8391,39949,39950,39951,39953,39954,39956,39957,39959,39960,39962],{},"1、计算机或相关专业本科及以上学历； ",[2996,39952],{},"2、熟悉常用的数据结构和算法，有信息学竞赛或数学建模竞赛相关经验尤佳； ",[2996,39955],{},"3、熟悉 Hadoop \u002F Cassandra \u002F Spark \u002F Flink \u002F Presto \u002F Hive \u002F Kafka \u002F Flume 等大数据技术框架以及使用经验； ",[2996,39958],{},"4、扎实的 Java 开发能力，有 Python \u002F Scala 开发经验或具备一定的算法能力尤佳； 业务理解力强，对数据敏感； ",[2996,39961],{},"5、具有良好的沟通能力和团队合作精神，优秀的分析问题和解决问题的能力，对技术有热情 。",[8391,39964,39965],{},"流程终止",[8372,39967,39968,39971,39974,39976,39978,40005],{},[8391,39969,39970],{},"9.27",[8391,39972,39973],{},"多益网络",[8391,39975,39813],{},[8391,39977,39738],{},[8391,39979,39980,39981,39983,39984,39986,39987,39989,39990,39992,39993,39995,39996,39998,39999,40001,40002,40004],{},"1、计算机软件、应用数学和统计、自动化等相关专业；",[2996,39982],{},"2、有扎实的操作系统、数据结构、网络工程等计算机基础；",[2996,39985],{},"3、掌握常用的算法和数据结构；",[2996,39988],{},"4、掌握C++\u002FJava等开发语言，了解MySQL和常用SQL写法；",[2996,39991],{},"加分项：",[2996,39994],{},"1、有Scala或Python语言开发经验；",[2996,39997],{},"2、了解和使用过Hadoop、Spark、Redis、ElasticSearch等任一的开源系统；",[2996,40000],{},"3、熟悉Linux操作系统，了解常用命令和shell脚本；",[2996,40003],{},"4、有数理专业知识基础，了解常见的建模方法和流程。",[8391,40006,40007],{},"未录用",[8372,40009,40010,40012,40015,40017,40019,40034],{},[8391,40011,39970],{},[8391,40013,40014],{},"OPPO",[8391,40016,39492],{},[8391,40018],{},[8391,40020,40021,40022,40024,40025,40027,40028,40030,40031,40033],{},"1.数学、计算机、软件工程等相关专业； ",[2996,40023],{},"2.熟悉大数据相关技术，有数据仓库、数据开发相关经验； ",[2996,40026],{},"3.熟练掌握SQL语法，了解Hadoop原理，有Hive\u002FSpark相关数据处理经验； ",[2996,40029],{},"4.熟悉Flink、Redis、Kafka、Flume等数据技术，熟悉到少一门脚本语言； ",[2996,40032],{},"5.熟悉数据仓库建设方法，熟悉维度建模方法论。",[8391,40035,40036],{},"初筛不通过",[8372,40038,40039,40042,40045,40047,40049,40092],{},[8391,40040,40041],{},"10.4",[8391,40043,40044],{},"蚂蚁集团",[8391,40046,39553],{},[8391,40048],{},[8391,40050,40051,40052,40054,40055,40057,40058,40060,40061,40063,40065,40066,40068,40069,40071,40073,40074,40076,40077,40079,40080,40082,40083,40085,40086,40088,40089,40091],{},"必须具备的：",[2996,40053],{},"所学专业是计算机、数学、统计、数据科学与大数据技术等相关专业；",[2996,40056],{},"有强的动手能力和学习能力，熟悉一门数据处理语言，如SQL、JAVA、Python、Perl等，熟悉unix或者linux操作；",[2996,40059],{},"具备扎实的专业基础，良好的沟通能力和团队合作，主动积极，乐于面对挑战。",[2996,40062],{},[2996,40064],{},"有一定了解的：",[2996,40067],{},"对于常用的数据建模理论、方法有一定了解。",[2996,40070],{},[2996,40072],{},"可以加分的：",[2996,40075],{},"有参与过数据处理、分析、挖掘等相关项目；",[2996,40078],{},"对Hadoop、Hive、Hbase等分布式平台有一定的理解；",[2996,40081],{},"在Github等开源社区具备有较大影响力的技术项目，作为Collaborator\u002FCommitter\u002FMember优先；",[2996,40084],{},"作为重要角色参与领域内有含金量的比赛并取得成绩（比如ACM）；",[2996,40087],{},"发表顶刊顶会（参考CCF-A），担当一作\u002F并列\u002F二作；",[2996,40090],{},"获得过业界有影响力的专利。",[8391,40093,39576],{},[8372,40095,40096,40099,40102,40105,40107,40125],{},[8391,40097,40098],{},"10.9",[8391,40100,40101],{},"中邮消费金融",[8391,40103,40104],{},"大数据开发工程师（工作地点：广州）",[8391,40106],{},[8391,40108,40109,40110,40112,40113,40115,40116,40118,40119,40121,40122,40124],{},"1、计算机或软件类相关专业，国民教育系列全日制大学本科及以上学历，留学人员应取得教育部留学服务中心的学历学位认证； ",[2996,40111],{},"2、熟悉至少一种编程语言（Java,Python,C\u002FC++等）； ",[2996,40114],{},"3、熟悉MySQL，ORACLE，PostgreSQL等数据库的运行机制和体系架构经验,熟悉sql语句； ",[2996,40117],{},"4、熟悉Linux\u002FUnix平台上的开发环境，了解各种脚本的开发； ",[2996,40120],{},"5、熟悉分布式文件系统HDFS，有MR、Spartk、Storm等分布式编程模型的经验，了解主流的Hadoop生态数据采集框架，了解Spark编程原理和运行结构； ",[2996,40123],{},"6、思路敏捷清晰，良好的表达和理解能力，良好的学习能力，强烈的创新意识。",[8391,40126,39965],{},[8372,40128,40129,40132,40135,40138,40140,40155],{},[8391,40130,40131],{},"10.11",[8391,40133,40134],{},"字节跳动",[8391,40136,40137],{},"大数据开发工程师-商业产品与技术",[8391,40139],{},[8391,40141,40142,40143,40145,40146,40148,40149,40151,40152,40154],{},"1、2024届获得本科及以上学历，计算机相关专业；",[2996,40144],{},"2、热爱计算机科学和互联网技术，优秀的编码能力，乐于快速学习和尝试新技术、新工具；",[2996,40147],{},"3、对数据敏感，掌握量化分析方法，善于从数据中发现问题，提出假设并使用数据进行验证；",[2996,40150],{},"4、对至少一项分布式计算平台有使用经验，例如 Hadoop，Spark，Hive，Storm，Kafka 等；",[2996,40153],{},"5、有参与开源项目对社区有贡献的经历，有互联网公司实习经历，有大数据处理或用户行为数据分析经验者优先。",[8391,40156,39965],{},[8372,40158,40159,40162,40165,40167,40169,40184],{},[8391,40160,40161],{},"10.13",[8391,40163,40164],{},"北京长亭科技有限公司",[8391,40166,39813],{},[8391,40168],{},[8391,40170,40171,40172,40174,40175,40177,40178,40180,40181,40183],{},"1.本科及以上学历，计算机、软件工程、网络安全、信息安全等相关专业；",[2996,40173],{},"2.熟练掌握一种或多种语言Scala,Java,Python等；",[2996,40176],{},"3.熟悉大数据平台安装，了解Docker,kubernetes优先；",[2996,40179],{},"4.熟悉Hadoop生态组件，包括但不限于Flink,Spark,Hadoop,Hive,Elasticsearch等；",[2996,40182],{},"5.分析问题逻辑清晰，善于解决疑难问题，有较好的抗压能力。",[8391,40185,40186],{},"秒挂",[8372,40188,40189,40192,40195,40197,40199,40205],{},[8391,40190,40191],{},"10.16",[8391,40193,40194],{},"美的",[8391,40196,39492],{},[8391,40198],{},[8391,40200,40201,40202,40204],{},"必备项： 1、本科及以上学历，英语四级及以上； 2、计算机类、电子信息类、机械类、机械工程类、数学类等相关专业； 3、熟悉Linux操作系统，能编写简单的Shell脚本，有一定的计算机编程能力，熟悉一门编程语言，熟悉数据库理论，能熟练的进行数据库的相关操作。 ",[2996,40203],{},"加分项： 1、熟悉常用的数据挖掘相关理论知识，有动手实践者； 2、了解Hadoop，Spark的相关理论知识，有动手实践者。",[8391,40206,40207],{},"筛选未通过",[8372,40209,40210,40212,40215,40217,40219,40231],{},[8391,40211,40191],{},[8391,40213,40214],{},"丰巢",[8391,40216,39685],{},[8391,40218],{},[8391,40220,40221,40222,40224,40225,40227,40228,40230],{},"1、本科及以上学历，计算机、统计学相关专业；",[2996,40223],{},"2、掌握基本的概率与统计学名词概念、数据类型、数据预处理（过滤、排序、排重、合并等）、常用统计量计算公式（频度、中值、方差等）和数据展现的常见形式；",[2996,40226],{},"3、熟练使用SQL进行数据处理分析；",[2996,40229],{},"4、有Python，R等语言编程能力。",[8391,40232,40233],{},"不通过",[8372,40235,40236,40239,40242,40244,40246,40270],{},[8391,40237,40238],{},"10.17",[8391,40240,40241],{},"掌阅",[8391,40243,39813],{},[8391,40245],{},[8391,40247,40248,40249,40251,40252,40254,40255,40257,40258,40260,40261,40263,40264,40266,40267,40269],{},"1. 全日制统招本科及以上，统计学、计算机专业优先；",[2996,40250],{},"2. 扎实的数学基础、对数字敏感、具备良好的分析能力，能高效与相关团队进行沟通；",[2996,40253],{},"3. 熟练使用SQL、EXCEL、finebi等数据分析工具;",[2996,40256],{},"4. 熟悉数据仓库体系，熟悉hadoop、flink数据体系，擅长实时或离线计算的实施优化；",[2996,40259],{},"5. 思维逻辑清晰，有较强的分析和解决问题的能力，有一定的抗压能力；",[2996,40262],{},"6. 具有良好的沟通能力和团队合作精神，具备结构化思维和强逻辑性，工作积极主动，有较好的学习能力；",[2996,40265],{},"7. 有一定的数据开发基础或Java、Python开发基础优先；",[2996,40268],{},"8. 能够长期实习（有转正机会），一周4天及以上，全勤实习6个月及以上者优先。",[8391,40271,39738],{},[8372,40273,40274,40277,40280,40283,40285,40300],{},[8391,40275,40276],{},"10.19",[8391,40278,40279],{},"美亚柏科",[8391,40281,40282],{},"大数据运维工程师（厦门）",[8391,40284],{},[8391,40286,40287,40288,40290,40291,40293,40294,40296,40297,40299],{},"1、本科及以上学历，计算机相关专业；",[2996,40289],{},"2、熟练掌握并使用linux等相关命令和操作；",[2996,40292],{},"3、了解大数据组件的相关问题排查和性能调优；",[2996,40295],{},"4、有大数据组件知识、相关大数据研发工作、性能优化等优先；",[2996,40298],{},"5、具有团队合作精神和责任心，有较强的学习能力，沟通能力以及分析与解决问题能力。",[8391,40301,39576],{},[8372,40303,40304,40307,40310,40312,40314,40326],{},[8391,40305,40306],{},"10.25",[8391,40308,40309],{},"完美世界",[8391,40311,39643],{},[8391,40313],{},[8391,40315,40316,40317,40319,40320,40322,40323,40325],{},"1、计算机、统计学或应用数学相关专业，本科以上学历；",[2996,40318],{},"2、熟练掌握数据结构和算法，熟悉Java或者Python语言；",[2996,40321],{},"3、熟练掌握Hadoop，Hive，Spark，Hbase，Storm的一种或多种大数据框架，有实际的代码经验优先；",[2996,40324],{},"4、良好的沟通能力，快速理解业务。",[8391,40327,39515],{},[8372,40329,40330,40333,40336,40338,40340,40349],{},[8391,40331,40332],{},"10.26",[8391,40334,40335],{},"联想",[8391,40337,39492],{},[8391,40339],{},[8391,40341,40342,40343,40345,40346,40348],{},"1.毕业时间为2023年9月至2024年8月的海内外应届毕业生，计算机或数学等相关专业；",[2996,40344],{},"2.有大数据相关工具框架经验者优先，如Hadoop,Hive,Spark,kafka,sqoop等；",[2996,40347],{},"3.熟悉Mysql、Redis、Nosql等数据库，了解数据库的运行机制，性能优化技术，熟练使用SQL或其他数据分析工具。",[8391,40350,40351],{},"岗位已下架",[8372,40353,40354,40357,40360,40363,40365,40368],{},[8391,40355,40356],{},"10.27",[8391,40358,40359],{},"百川智能",[8391,40361,40362],{},"数据工程师(数据仓库方向)",[8391,40364],{},[8391,40366,40367],{},"1、对生成式语言大模型和AGI有热情，热爱挑战，喜欢进行未知领域的探索； 2、数据库基本功扎实，热衷于应用AI技术提高自己的工作效率； 3、具有良好的逻辑思维和语言表达能力，能够处理跨团队的沟通协作问，能够应对工作压力和新事物的不确定性。",[8391,40369,39738],{},[8372,40371,40372,40374,40377,40380,40382,40391],{},[8391,40373,40356],{},[8391,40375,40376],{},"金蝶国际",[8391,40378,40379],{},"软件开发-大数据",[8391,40381,39720],{},[8391,40383,40384,40385,40387,40388,40390],{},"1、2024届应届毕业，计算机软件相关专业本科及以上学历；",[2996,40386],{},"2、熟练掌握Java，有相关编程项目经验优先；",[2996,40389],{},"3、具备良好的沟通能力、逻辑思维能力，有较强的团队协作意识，能承受一定工作压力。",[8391,40392,40393],{},"没时间线下面试",[8372,40395,40396,40398,40401,40403,40405,40423],{},[8391,40397,40356],{},[8391,40399,40400],{},"Momenta",[8391,40402,39643],{},[8391,40404],{},[8391,40406,40407,40408,40410,40411,40413,40414,40416,40417,40419,40420,40422],{},"1、本科及以上学历，计算机、软件工程、数学、自动化等相关专业；",[2996,40409],{},"2、熟悉数据仓库建设方法论，熟悉Spark\u002FSparkSQL开发；",[2996,40412],{},"3、熟悉Java开发，了解微服务生态主流技术如：如SpringCloud、SpringBoot；",[2996,40415],{},"4、至少使用过MySQL、Oralce等其中一种数据库，熟练掌握SQL编程, 使用过Apache Doris、Clickhouse者优先；",[2996,40418],{},"5、熟悉Linux系统环境，熟悉Shell\u002FPython等至少一种脚本语言；",[2996,40421],{},"6、具备良好的学习能力、沟通表达能力及业务理解能力。",[8391,40424,39576],{},[8372,40426,40427,40430,40433,40435,40437,40439],{},[8391,40428,40429],{},"11.2",[8391,40431,40432],{},"中国电信\u002F汤臣倍健",[8391,40434],{},[8391,40436],{},[8391,40438],{},[8391,40440],{},[8372,40442,40443,40446,40449,40451,40453,40456],{},[8391,40444,40445],{},"11.8",[8391,40447,40448],{},"小米",[8391,40450],{},[8391,40452],{},[8391,40454,40455],{},"1、数据挖掘、统计学、数学、计算机相关专业本科以上学历； 2、熟悉主流机器学习、数据挖掘基本算法和数学模型，并有实际的项目经验； 3、精通一种开发语言（Python、Scala、Java、C等），并具有快速学习其他开发语言的能力； 4、熟悉Hadoop(HDFS\u002FMapReduce\u002FHive\u002FHBase)、Spark、Kafka的使用，熟悉Mysql等关系型数据库和NoSql技术； 5、对数据敏感、能熟练预估数据量以及数据项之间关系，善于从数据中发现问题； 6、具有良好的沟通协作能力，具有较强的分享意愿。",[8391,40457,40458],{},"笔试之后排序挂",[8372,40460,40461,40464,40467,40469,40471,40473],{},[8391,40462,40463],{},"11.10",[8391,40465,40466],{},"恒生",[8391,40468],{},[8391,40470],{},[8391,40472],{},[8391,40474,40475],{},"招满",[8372,40477,40478,40480,40483,40486,40488,40524],{},[8391,40479],{},[8391,40481,40482],{},"腾讯",[8391,40484,40485],{},"软件开发-数据工程",[8391,40487,39720],{},[8391,40489,40051,40490,40492,40493,40495,40496,40498,40499,40501,40502,40504,40505,40507,40508,40510,40073,40512,40514,40515,40517,40518,40520,40521,40523],{},[2996,40491],{},"本科以上学历，数学、统计、运筹学、计算机等相关专业；",[2996,40494],{},"了解至少一种大数据常用组件，如MapReduce，Spark，Flink、Tensorflow等；",[2996,40497],{},"熟悉至少一种编程语言，如java、c++、python、shell等；",[2996,40500],{},"能够清晰沟通表达，有对事物完成抽象与概述的能力；",[2996,40503],{},"具备逻辑推理思维和分析问题能力；",[2996,40506],{},"热爱数据领域，面对技术难点，能主动学习相关知识。",[2996,40509],{},[2996,40511],{},[2996,40513],{},"在相关领域的顶会或核心刊物上发表过高水平论文；",[2996,40516],{},"有相关实习经历，并具有数据仓库、数据处理项目经验；",[2996,40519],{},"GitHub上参与过开源项目并做出过代码贡献；",[2996,40522],{},"在业界公认的主流竞赛中取得过排名靠前的比赛成绩。",[8391,40525],{},[8372,40527,40528,40530,40533,40535,40538,40550],{},[8391,40529],{},[8391,40531,40532],{},"58",[8391,40534,39492],{},[8391,40536,40537],{},"BP业务筛选",[8391,40539,40540,40541,40543,40544,40546,40547,40549],{},"只要你，所学专业是计算机、数学、软件工程等相关专业； ",[2996,40542],{},"只要你，熟练掌握一种编程语言，例如java\u002FC++等。熟悉linux\u002Funix操作系统； ",[2996,40545],{},"只要你，有优秀的学习能力，对数据结构、基础算法、操作系统、计算机网络等计算机基础知识具备扎实的功底； ",[2996,40548],{},"只要你，对Hadoop、Hive、Hbase等分布式平台有一定的理解。",[8391,40551],{},[8372,40553,40554,40556,40559,40561,40563,40575],{},[8391,40555],{},[8391,40557,40558],{},"虎牙",[8391,40560,39492],{},[8391,40562],{},[8391,40564,40565,40566,40568,40569,40571,40572,40574],{},"1.2024届本科及以上学历，计算机、数据统计、信息系统等相关专业； ",[2996,40567],{},"2.精通Hive,Spark等技术，具备大数据计算性能优化经验和能力；",[2996,40570],{},"3.能快速学习和理解业务，具备数据需求分析、数据模型设计和开发能力；",[2996,40573],{},"4.有Python\\flink编程经验者优先。",[8391,40576],{},[8372,40578,40579,40582,40585,40587,40589,40604],{},[8391,40580,40581],{},"11.12",[8391,40583,40584],{},"同程",[8391,40586,39492],{},[8391,40588,39720],{},[8391,40590,40591,40592,40594,40595,40597,40598,40600,40601,40603],{},"1、本科及以上学历，统计学\u002F计算机相关专业优先；",[2996,40593],{},"2、熟练使用sql编写脚本(必须)，能进行简单的数据清洗；",[2996,40596],{},"3、性格稳重乐观，有耐心，能承受较大的工作压力；",[2996,40599],{},"4、良好的沟通能力和团队协作能力；",[2996,40602],{},"5、热爱数据开发工作，有较强的数据敏感性和数据分析能力。",[8391,40605,40606,40607,40609],{},"未通过",[2996,40608],{},"别灰心，未来我们仍有机会在一起。再次感谢您对同程旅行的关注。",[8372,40611,40612,40614,40617,40619,40621,40636],{},[8391,40613],{},[8391,40615,40616],{},"滴滴",[8391,40618,39553],{},[8391,40620],{},[8391,40622,40623,40624,40626,40627,40629,40630,40632,40633,40635],{},"1、2024届毕业生，计算机及其相关专业，本科以上学历",[2996,40625],{},"2、熟练掌握Java，有扎实的编程功底，具备良好的编码规范，熟悉面向对象和数据结构；",[2996,40628],{},"3、了解Hadoop\u002FSpark\u002FHudi\u002FRay等大数据引擎优先；",[2996,40631],{},"4、熟悉SQL\u002FJava\u002Fscala等一门及以上语言；",[2996,40634],{},"5、具备快速学习能力、沟通协调能力及团队精神，有较强的责任心和学习积极性。",[8391,40637],{},[8372,40639,40640,40642,40645,40648,40650,40665],{},[8391,40641],{},[8391,40643,40644],{},"360",[8391,40646,40647],{},"大数据开发工程师-分布式存储",[8391,40649,39720],{},[8391,40651,40652,40653,40655,40656,40658,40659,40661,40662,40664],{},"1.本科或研究生学历，计算机科学、软件工程等相关专业; ",[2996,40654],{},"2.熟练掌握Java、go或C++编程语言，扎实的代码开发能力; ",[2996,40657],{},"3.具备扎实的计算机操作系统和网络基础知识，熟悉分布式系统的设计原理和实现方法，对分布式存储的相关技术了解过，具备较强的trouble shooting能力; ",[2996,40660],{},"4.具备开源社区经验，了解或者熟悉一种业界主流开源分布式存储或者数据库者优先; ",[2996,40663],{},"5.有较强的学习能力，有良好的团队合作精神，善于沟通和交流。",[8391,40666],{},[8372,40668,40669,40671,40673,40675,40677,40701],{},[8391,40670],{},[8391,40672,40466],{},[8391,40674,39643],{},[8391,40676,39720],{},[8391,40678,40679,40680,40682,40683,40685,40686,40688,40689,40691,40692,40694,40695,40697,40698,40700],{},"1、2024届毕业生，硕士以上学历，喜欢大数据技术；  ",[2996,40681],{},"2、了解Java主流开源框架SpringBoot、SpringMVC、SpringCloud等，有相应项目经验优先；  ",[2996,40684],{},"3、了解Hadoop、spark等生态相关技术； ",[2996,40687],{},"4、了解HDFS，Hbase，hive，kafka，ZK等多种组件；  ",[2996,40690],{},"5、了解MySQL数据库，会基本SQL语法，能根据要求独立编写相应SQL语句；  ",[2996,40693],{},"6、阅读英文技术文档和书籍无障碍； ",[2996,40696],{},"7、具备良好的主动学习能力和沟通能力，以及较强的抗压能力；  ",[2996,40699],{},"8、具有良好责任心和团队精神，能够和大家打成一片。",[8391,40702],{},[8372,40704,40705,40707,40710,40713,40715,40749],{},[8391,40706],{},[8391,40708,40709],{},"腾讯云智",[8391,40711,40712],{},"数据工程",[8391,40714],{},[8391,40716,40051,40717,40719,40720,40722,40723,40725,40726,40728,40729,40731,40732,40734,40735,40073,40737,40739,40740,40742,40743,40745,40746,40748],{},[2996,40718],{},"1、本科及以上学历，数学、统计、运筹学、计算机等相关专业；",[2996,40721],{},"2、熟悉关系型数据库和常见非关系数据库；",[2996,40724],{},"3、熟练使用至少如下一门编程语言： C\u002FC++\u002FJava\u002FGo；",[2996,40727],{},"4、了解至少一种大数据常用组件，如MapReduce，Spark，Flink、Tensorflow等；",[2996,40730],{},"5、熟悉数据结构和算法、MySQL及SQL语言、编程；",[2996,40733],{},"6、动手能力较强，有责任感,  有良好的团队协作精神。",[2996,40736],{},[2996,40738],{},"1、有学术研究成果发表或相关实习经历；",[2996,40741],{},"2、熟悉开源框架；",[2996,40744],{},"3、有海量数据处理经验；",[2996,40747],{},"4、通过腾讯云从业资格证认证或同等资格认证。",[8391,40750],{},[8372,40752,40753,40755,40758,40760,40763,40778],{},[8391,40754],{},[8391,40756,40757],{},"京东",[8391,40759,39492],{},[8391,40761,40762],{},"待筛选",[8391,40764,40765,40766,40768,40769,40771,40772,40774,40775,40777],{},"1-2023年10月1日至2024年9月30日期间毕业，统招本科及以上学历；",[2996,40767],{},"2-对大数据处理、分布式存储等技术有热情，能主动跟踪最新的技术进展；",[2996,40770],{},"3-扎实的计算机专业基础知识，编程基础和数据结构算法基础，Java基础扎实；",[2996,40773],{},"4-熟练掌握Java语言，熟悉Flink、Spark、Kafka、Redis、HDFS、Storm等大数据组件；",[2996,40776],{},"5-熟悉Hadoop生态，如Hive，MapReduce等。",[8391,40779],{},[8372,40781,40782,40784,40787,40790,40792,40837],{},[8391,40783],{},[8391,40785,40786],{},"第四范式",[8391,40788,40789],{},"后端开发工程师",[8391,40791],{},[8391,40793,40794,40795,40797,40798,40800,40801,40803,40804,40806,40807,40809,40810,40812,40813,40815,40816,40818,40819,40821,40822,40824,40825,40827,40828,40830,40831,40833,40834,40836],{},"1、计算机或相关专业，本科或以上学历；",[2996,40796],{},"2、独立完成过中等规模的项目；",[2996,40799],{},"3、熟练掌握Go\u002FC++\u002FJava语言及其生态；",[2996,40802],{},"4、熟悉Linux系统原理，熟练运用Linux命令、脚本、开发工具；",[2996,40805],{},"5、熟悉关系型数据库原理及SQL语言；",[2996,40808],{},"6、良好的数据结构和算法设计基础；",[2996,40811],{},"7、理解软件开发、测试、交付的流程和方法论；",[2996,40814],{},"8、热爱技术，具有很强的学习能力、分析解决问题能力；",[2996,40817],{},"9、责任心强、自驱力强，热于接受挑战，善于沟通和团队写作。",[2996,40820],{},"加分项（满足任意一项即可）",[2996,40823],{},"1、熟悉分布式系统原理，并有相关开发经验；",[2996,40826],{},"2、熟悉主流大数据技术(如Hadoop\u002FSpark\u002FFlink)，并有实际使用或开发经验；",[2996,40829],{},"3、熟悉机器学习算法及其应用；",[2996,40832],{},"4、有ACM等计算机竞赛参赛或获奖经历；",[2996,40835],{},"5、作为主要负责人参与过校内或校外的重要项目开发，或有重要开源项目的代码贡献。",[8391,40838],{},[8372,40840,40841,40843,40845,40847,40849,40867],{},[8391,40842],{},[8391,40844,40448],{},[8391,40846,39643],{},[8391,40848],{},[8391,40850,40851,40852,40854,40855,40857,40858,40860,40861,40863,40864,40866],{},"1、数据挖掘、统计学、数学、计算机相关专业本科以上学历； ",[2996,40853],{},"2、熟悉主流机器学习、数据挖掘基本算法和数学模型，并有实际的项目经验； ",[2996,40856],{},"3、精通一种开发语言（Python、Scala、Java、C等），并具有快速学习其他开发语言的能力； ",[2996,40859],{},"4、熟悉Hadoop(HDFS\u002FMapReduce\u002FHive\u002FHBase)、Spark、Kafka的使用，熟悉Mysql等关系型数据库和NoSql技术； ",[2996,40862],{},"5、对数据敏感、能熟练预估数据量以及数据项之间关系，善于从数据中发现问题； ",[2996,40865],{},"6、具有良好的沟通协作能力，具有较强的分享意愿。",[8391,40868],{},[8372,40870,40871,40873,40876,40878,40880,40910],{},[8391,40872],{},[8391,40874,40875],{},"雅迪",[8391,40877,39643],{},[8391,40879],{},[8391,40881,40882,40883,40885,40886,40888,40889,40891,40892,40894,40895,40897,40898,40900,40901,40903,40904,40906,40907,40909],{},"1.计算机相关专业",[2996,40884],{},"2.熟悉java、Scala、python等至少语法。",[2996,40887],{},"3.了解Hadoop生态相关技术，如Hive、yarn、saprk、kafka等",[2996,40890],{},"4.了解数据建模及ETL设计开发，对数据仓库、数据加工、数据分析有理解。",[2996,40893],{},"5.了解大数据应用全流程，包括数据的采集、解析、清洗、预处理、存储、可视化和系统集成。",[2996,40896],{},"6.了解离线和实时架构经验，有实际项目设计、落地、优化方案。",[2996,40899],{},"7.了解主流的OLAP查询引擎，基于不同查询场景有相关经验。",[2996,40902],{},"8.具备良好的业务理解、沟通和协作能力，具备良好的学习和总结能力。",[2996,40905],{},"9.优秀的团队合作精神、诚实、勤奋、严谨，敢于接受挑战。",[2996,40908],{},"10.有企业级大数据项目经验，如数据中台、MDM、DQC（不局限数据仓库）优先",[8391,40911],{},[8372,40913,40914,40916,40919,40922,40924,40939],{},[8391,40915],{},[8391,40917,40918],{},"顺丰",[8391,40920,40921],{},"大数据平台研发工程师",[8391,40923],{},[8391,40925,40926,40927,40929,40930,40932,40933,40935,40936,40938],{},"1. 2024届应届硕士毕业生及以上学历，计算机类相关专业；",[2996,40928],{},"2. 熟悉Java语言和SQL语言，具有一定的编程基础；",[2996,40931],{},"3. 了解多种大数据项目，Hive、Pig、HBase、Spark、Hue、Zookeeper、Accumulo、Sqoop、Flink、Giraph、Knox、Oozie、Phoenix、Storm、Kafka、Tez等，有实际部署和运维经验的优先；",[2996,40934],{},"4. 熟悉软件开发的流程,熟悉Maven，git\u002FSVN等工具优先；",[2996,40937],{},"5. 热爱编程，逻辑思维清晰；乐于表达，拥有良好的沟通能力。",[8391,40940],{},[8372,40942,40943,40945,40948,40951,40953,40965],{},[8391,40944],{},[8391,40946,40947],{},"小红书",[8391,40949,40950],{},"数据开发工程师-广告架构",[8391,40952],{},[8391,40954,40955,40956,40958,40959,40961,40962,40964],{},"1、2023年9月至2024年8月期间毕业，统招研究生及以上学历；计算机等相关专业优先； ",[2996,40957],{},"2、扎实的计算机专业基础知识，编程基础和数据结构算法基础，Java基础扎实； ",[2996,40960],{},"3、对大数据处理、分布式存储等技术有热情，能主动跟踪最新的技术进展； ",[2996,40963],{},"4、具备快速学习能力，积极主动，有较强的逻辑思维能力和解决问题能力。",[8391,40966],{},[8372,40968,40969,40971,40974,40977,40979,40997],{},[8391,40970],{},[8391,40972,40973],{},"得物",[8391,40975,40976],{},"数仓开发工程师",[8391,40978],{},[8391,40980,40981,40982,40984,40985,40987,40988,40990,40991,40993,40994,40996],{},"1、2024届毕业生，本科及以上学历，计算机、通信、统计学等相关专业优先；",[2996,40983],{},"2、熟悉掌握MySQL, hadoop、hive、hbase、MapReduce、Flink、Kafaka、Kylin等大数据相关技术；",[2996,40986],{},"3、熟悉数仓维度建模；",[2996,40989],{},"4、精通各类SQL，熟悉性能调优。",[2996,40992],{},"5、熟悉Python编程，掌握Java\u002FScala其中至少一种，能够编写脚本解决日常问题；",[2996,40995],{},"6、熟悉阿里云dataworks优先。",[8391,40998],{},[8372,41000,41001,41003,41006,41009,41011,41023],{},[8391,41002],{},[8391,41004,41005],{},"微众银行",[8391,41007,41008],{},"数据开发",[8391,41010,39720],{},[8391,41012,41013,41014,41016,41017,41019,41020,41022],{},"1、统计学、数学与应用数学、信息与计算科学等专业本科及以上学历；",[2996,41015],{},"2、熟悉数据分析和数据挖掘的过程，对常用数据挖掘算法有较深入理解，熟悉Hadoop者优先；",[2996,41018],{},"3、了解大数据技术，熟练使用SQL，掌握至少一种数据分析\u002F挖掘工具，如Python、R、Shell、Scala、SAS等，了解Linux常见命令；",[2996,41021],{},"7、较强的学习能力，优秀的逻辑思维和创新能力，积极主动，对数据敏感，热爱数据分析。",[8391,41024],{},[8372,41026,41027,41029,41032,41035,41037,41055],{},[8391,41028],{},[8391,41030,41031],{},"喜马拉雅",[8391,41033,41034],{},"管培生-数仓方向",[8391,41036],{},[8391,41038,41039,41040,41042,41043,41045,41046,41048,41049,41051,41052,41054],{},"1、2024届应届毕业生，本科及以上学历，计算机科学、软件工程、数据科学或相关专业背景；",[2996,41041],{},"2、具备扎实的数据库和数据仓库知识，熟悉数仓建模和数据架构设计；",[2996,41044],{},"3、精通SQL编程和至少一门主流编程语言（如Python、Java等）；",[2996,41047],{},"4、对大数据处理技术（如Hadoop、Flink、Spark、clickhouse、hudi等）有基本了解，并有相关项目经验者优先考虑；",[2996,41050],{},"5、具备良好的沟通表达能力、团队协作能力和解决问题的能力，能在快节奏的工作环境中高效工作；",[2996,41053],{},"6、积极主动，有很强的求知欲和学习能力，具备极客精神。",[8391,41056],{},[8372,41058,41059,41061,41064,41067,41069,41084],{},[8391,41060],{},[8391,41062,41063],{},"度小满",[8391,41065,41066],{},"数据研发工程师-技术体系",[8391,41068],{},[8391,41070,41071,41072,41074,41075,41077,41078,41080,41081,41083],{},"1、本科及以上学历，计算机、自动化、通信、电子等理工科相关专业",[2996,41073],{},"2、计算机基础扎实，掌握至少一种编程语言（Scala\u002FJava\u002FPython等），熟悉Linux系统及常用Shell命令",[2996,41076],{},"3、了解常见的Hadoop、Hive、Spark等实时和离线大数据处理工具",[2996,41079],{},"4、有过大数据开发实习经验者优先",[2996,41082],{},"5、拥有技术激情、创新意识、协同落地能力，表达能力优秀，乐观向上，自我驱动力强",[8391,41085],{},[8372,41087,41088,41090,41092,41094,41096,41098],{},[8391,41089],{},[8391,41091],{},[8391,41093],{},[8391,41095],{},[8391,41097],{},[8391,41099],{},[7759,41101,41102],{"id":41102},"校招",[8366,41104,41105,41124],{},[8369,41106,41107],{},[8372,41108,41109,41111,41113,41115,41118,41120,41122],{},[8375,41110,39464],{},[8375,41112,39467],{},[8375,41114,39470],{},[8375,41116,41117],{},"薪资待遇",[8375,41119,39473],{},[8375,41121,39476],{},[8375,41123,39479],{},[8386,41125,41126,41149,41170,41188,41207,41229],{},[8372,41127,41128,41131,41134,41137,41140,41143,41146],{},[8391,41129,41130],{},"9.13",[8391,41132,41133],{},"株洲齿轮",[8391,41135,41136],{},"大数据开发",[8391,41138,41139],{},"6K",[8391,41141,41142],{},"现场面试",[8391,41144,41145],{},"无要求，包吃住",[8391,41147,41148],{},"技术面",[8372,41150,41151,41153,41156,41158,41161,41164,41167],{},[8391,41152,41130],{},[8391,41154,41155],{},"拓维股份",[8391,41157,40712],{},[8391,41159,41160],{},"7k",[8391,41162,41163],{},"简历投递",[8391,41165,41166],{},"薪资太低不匹配，放弃",[8391,41168,41169],{},"无后续",[8372,41171,41172,41174,41177,41180,41182,41184,41186],{},[8391,41173,41130],{},[8391,41175,41176],{},"CVTE",[8391,41178,41179],{},"Java后端",[8391,41181],{},[8391,41183,41163],{},[8391,41185],{},[8391,41187],{},[8372,41189,41190,41192,41195,41197,41199,41201,41204],{},[8391,41191,39940],{},[8391,41193,41194],{},"中国电信",[8391,41196,41136],{},[8391,41198],{},[8391,41200,41163],{},[8391,41202,41203],{},"总部二级单位，卡学历",[8391,41205,41206],{},"HR直说希望不大",[8372,41208,41209,41212,41215,41218,41221,41224,41226],{},[8391,41210,41211],{},"9.26",[8391,41213,41214],{},"兴盛优选",[8391,41216,41217],{},"后端开发",[8391,41219,41220],{},"年包13W",[8391,41222,41223],{},"现场笔试",[8391,41225],{},[8391,41227,41228],{},"简历都没收就说笔试挂了",[8372,41230,41231,41233,41235,41237,41239,41241,41243],{},[8391,41232],{},[8391,41234],{},[8391,41236],{},[8391,41238],{},[8391,41240],{},[8391,41242],{},[8391,41244],{},[7759,41246,39720],{"id":39720},[8366,41248,41249,41263],{},[8369,41250,41251],{},[8372,41252,41253,41255,41257,41260],{},[8375,41254,39467],{},[8375,41256,39464],{},[8375,41258,41259],{},"内容",[8375,41261,41262],{},"结果",[8386,41264,41265,41277,41289,41307,41322,41337,41353,41368,41386,41401,41419,41433,41448,41463,41477,41494,41506,41523],{},[8372,41266,41267,41269,41272,41275],{},[8391,41268,40482],{},[8391,41270,41271],{},"2023-09-10 20:00:00 -- 22:00:00",[8391,41273,41274],{},"5算法（做出3个）",[8391,41276],{},[8372,41278,41279,41281,41284,41287],{},[8391,41280,41005],{},[8391,41282,41283],{},"2023-09-13 20:00:00 -- 21:30:00",[8391,41285,41286],{},"20选择+2算法（AK）",[8391,41288],{},[8372,41290,41291,41293,41296,41305],{},[8391,41292,40584],{},[8391,41294,41295],{},"2023-09-14 19:00:00 -- 19:45:00",[8391,41297,41298,41299,41301,41302,41304],{},"5单选+5多选+5填空+5问答",[2996,41300],{},"（主考数据库SQL\u002F索引、",[2996,41303],{},"Flink、Spark、数据湖）",[8391,41306],{},[8372,41308,41309,41311,41314,41320],{},[8391,41310,40376],{},[8391,41312,41313],{},"2023-09-14 21:00:00 -- 22:00:00",[8391,41315,41316,41317,41319],{},"50选择+1问答",[2996,41318],{},"（Java+Javascript基础题但是答得稀烂）",[8391,41321],{},[8372,41323,41324,41326,41329,41335],{},[8391,41325,39715],{},[8391,41327,41328],{},"2023-09-15 19:00:00 -- 20:30:00",[8391,41330,41331,41332,41334],{},"9单选+1编程+4问答",[2996,41333],{},"（SQL为主，编程dp回文，AK）",[8391,41336,39738],{},[8372,41338,41339,41341,41344,41350],{},[8391,41340,39774],{},[8391,41342,41343],{},"2023-09-15 20:00:00 -- 22:00:00",[8391,41345,41346,41347,41349],{},"10单选题+2多选题+2编程题",[2996,41348],{},"（一SQL一子结构，AK）",[8391,41351,41352],{},"二轮筛选简历挂",[8372,41354,41355,41357,41360,41366],{},[8391,41356,40757],{},[8391,41358,41359],{},"2023-09-16 10:00:00 -- 12:00:00",[8391,41361,41362,41363,41365],{},"20单选+3编程",[2996,41364],{},"（单选较难，1SQL，中等难度建树没写出来）",[8391,41367],{},[8372,41369,41370,41372,41375,41384],{},[8391,41371,40532],{},[8391,41373,41374],{},"2023-09-16 19:00:00 -- 20:30:00",[8391,41376,41377,41378,41380,41381,41383],{},"14单选+6多选+3编程",[2996,41379],{},"（二分没写出来、第二题暴力没写出，",[2996,41382],{},"第三题滑动窗口）",[8391,41385],{},[8372,41387,41388,41390,41393,41398],{},[8391,41389,39810],{},[8391,41391,41392],{},"2023-09-19 19:00:00 -- 21:00:00",[8391,41394,41377,41395,41397],{},[2996,41396],{},"（见识到了SQL+算法，震撼离场）",[8391,41399,41400],{},"肯定挂",[8372,41402,41403,41405,41408,41417],{},[8391,41404,40448],{},[8391,41406,41407],{},"2023-09-23 16:00:00 -- 17:30:00",[8391,41409,41410,41411,41413,41414,41416],{},"40单多选混合+2编程",[2996,41412],{},"（一道基站通信求最优点暴力过了86%",[2996,41415],{},"一道有向无环不会但过了56%",[8391,41418],{},[8372,41420,41421,41423,41426,41431],{},[8391,41422,40644],{},[8391,41424,41425],{},"2023-09-23 15:00:00 -- 20:00:00",[8391,41427,41410,41428,41430],{},[2996,41429],{},"（一道map排序A一道计算机取模不会写）",[8391,41432],{},[8372,41434,41435,41437,41440,41446],{},[8391,41436,39973],{},[8391,41438,41439],{},"2023-09-23 10:00:00 -- 22:00:00",[8391,41441,41442,41443,41445],{},"15单选+5填空+1编程",[2996,41444],{},"（编程有点小抽象，填空还有英语翻译）",[8391,41447,40007],{},[8372,41449,41450,41452,41455,41461],{},[8391,41451,40241],{},[8391,41453,41454],{},"2023-09-27 14:00:00 -- 24:00:00",[8391,41456,41457,41458,41460],{},"21单选+2SQL编程",[2996,41459],{},"（SQL不给测试，体验极差）",[8391,41462,39738],{},[8372,41464,41465,41468,41471,41474],{},[8391,41466,41467],{},"美团",[8391,41469,41470],{},"2023-10-07 19:00:00 -- 21:00:00",[8391,41472,41473],{},"5编程题",[8391,41475,41476],{},"直接吓跑",[8372,41478,41479,41482,41485,41491],{},[8391,41480,41481],{},"恒生电子",[8391,41483,41484],{},"2023-10-13 19:00:00 -- 22:00:00",[8391,41486,41487,41488,41490],{},"20多选+3SQL+2算法",[2996,41489],{},"（SQL全开窗，算法为实现SQL部分）",[8391,41492,41493],{},"一个没写出",[8372,41495,41496,41498,41501,41504],{},[8391,41497,41194],{},[8391,41499,41500],{},"2023-10-14 14:30:00 -- 16:30:00",[8391,41502,41503],{},"和测评差不多",[8391,41505],{},[8372,41507,41508,41511,41514,41520],{},[8391,41509,41510],{},"信也科技",[8391,41512,41513],{},"2023-10-19 19:00:00 -- 20:00:00",[8391,41515,41516,41517,41519],{},"8单选+4问答+1编程",[2996,41518],{},"（不难但是技术栈是go+mongodb，编程题是【简单】合并两个有序数组）",[8391,41521,41522],{},"技术栈不对应",[8372,41524,41525,41528,41531,41537],{},[8391,41526,41527],{},"shopee虾皮",[8391,41529,41530],{},"2023-10-26 19:00:00 -- 21:00:00",[8391,41532,41533,41534,41536],{},"10单选+5问答+3编程",[2996,41535],{},"（见文档AK）",[8391,41538],{},[7759,41540,41541],{"id":41541},"面试",[8366,41543,41544,41555],{},[8369,41545,41546],{},[8372,41547,41548,41550,41552],{},[8375,41549,39464],{},[8375,41551,39467],{},[8375,41553,41554],{},"反馈",[8386,41556,41557,41570,41578],{},[8372,41558,41559,41562,41564],{},[8391,41560,41561],{},"9.25",[8391,41563,41133],{},[8391,41565,41566],{},[617,41567],{"alt":41568,"src":41569},"image-20231012115424240","..\u002FAppData\u002FRoaming\u002FTypora\u002Ftypora-user-images\u002Fimage-20231012115424240.png",[8372,41571,41572,41574,41576],{},[8391,41573],{},[8391,41575],{},[8391,41577],{},[8372,41579,41580,41582,41584],{},[8391,41581],{},[8391,41583],{},[8391,41585],{},{"title":119,"searchDepth":144,"depth":144,"links":41587},[41588,41589,41590,41591],{"id":39455,"depth":144,"text":39455},{"id":41102,"depth":144,"text":41102},{"id":39720,"depth":144,"text":39720},{"id":41541,"depth":144,"text":41541},{},"我的大学\u002Fbranch\u002Finterview\u002F校招投递记录.md","\u002Fundergraduate\u002Fnote-562cd86ca0b0",{"title":39450,"description":119},"undergraduate\u002Fnote-562cd86ca0b0",[7744,246,23378,10715,6380,14542,35725],"iLHrYu-1XVukIFPggz8TIVn0UOxikZopWb35g7Zz_2I",{"id":41600,"title":41601,"assetBase":239,"author":8,"body":41602,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":42724,"navigation":128,"originalPath":42725,"path":42726,"seo":42727,"source":23330,"stem":42728,"tags":42729,"weight":250,"__hash__":42730},"content\u002Fundergraduate\u002Fnote-595d0c134f11.md","Vue Router（基础）",{"type":10,"value":41603,"toc":42707},[41604,41608,41613,41677,41683,41976,41979,41990,41995,41997,42000,42086,42089,42103,42109,42243,42246,42356,42359,42362,42366,42369,42373,42463,42466,42470,42485,42488,42492,42539,42546,42549,42553,42556,42560,42619,42625,42629,42686,42689,42704],[4517,41605,41607],{"id":41606},"vue-router","Vue Router",[107,41609,41611],{"id":41610},"常规html中使用路由",[22,41612,41610],{},[114,41614,41618],{"className":41615,"code":41616,"language":41617,"meta":119,"style":119},"language-html shiki shiki-themes github-dark","\u003C!-- 通过设置router-link标签实现链接的跳转 -->\n\u003Crouter-link to=\"\u002F\">Go to Home\u003C\u002Frouter-link>\n    \n\u003C!-- 启动router-link跳转 -->\n\u003Crouter-view>\u003C\u002Frouter-view>\n","html",[17,41619,41620,41626,41654,41658,41663],{"__ignoreMap":119},[78,41621,41622],{"class":124,"line":125},[78,41623,41625],{"class":41624},"sAwPA","\u003C!-- 通过设置router-link标签实现链接的跳转 -->\n",[78,41627,41628,41632,41636,41640,41642,41646,41649,41651],{"class":124,"line":132},[78,41629,41631],{"class":41630},"s95oV","\u003C",[78,41633,41635],{"class":41634},"s4JwU","router-link",[78,41637,41639],{"class":41638},"svObZ"," to",[78,41641,4609],{"class":41630},[78,41643,41645],{"class":41644},"sU2Wk","\"\u002F\"",[78,41647,41648],{"class":41630},">Go to Home\u003C\u002F",[78,41650,41635],{"class":41634},[78,41652,41653],{"class":41630},">\n",[78,41655,41656],{"class":124,"line":138},[78,41657,6942],{"class":41630},[78,41659,41660],{"class":124,"line":144},[78,41661,41662],{"class":41624},"\u003C!-- 启动router-link跳转 -->\n",[78,41664,41665,41667,41670,41673,41675],{"class":124,"line":150},[78,41666,41631],{"class":41630},[78,41668,41669],{"class":41634},"router-view",[78,41671,41672],{"class":41630},">\u003C\u002F",[78,41674,41669],{"class":41634},[78,41676,41653],{"class":41630},[107,41678,41680],{"id":41679},"常规项目中router文件夹下js文件的书写方式",[22,41681,41682],{},"常规项目中router文件夹下.js文件的书写方式",[114,41684,41688],{"className":41685,"code":41686,"language":41687,"meta":119,"style":119},"language-js shiki shiki-themes github-dark","import {createRouter, createWebHashHistory} from 'vue-router'\nimport Home from '..\u002Fviews\u002FHome.vue'\nimport Login from '..\u002Fviews\u002FLogin.vue'\nimport User from '..\u002Fviews\u002FIndex.vue'  \u002F\u002F 引入视图文件\n\nconst routes = [\n  {\n    path: '\u002F',\n    redirect: '\u002Fhome'  \u002F\u002F 重定向\n  },\n  {\n    path: '\u002Fhome',  \u002F\u002F 路由地址\n    name: 'Home',  \u002F\u002F 路由名称\n    component: Home,  \u002F\u002F 对应组件\n    children: [  \u002F\u002F 子路由（嵌套路由）\n      {\n        path: '\u002Findex',\n        name: 'Index',\n        component: Index\n      }\n    ]\n  },\n\n  {\n    path: '\u002Flogin',\n    name: 'Login',\n    component: Login\n  }\n]\n\nconst router = createRouter({\n  history: createWebHashHistory(),\n  routes\n})\n\nexport default router\n","js",[17,41689,41690,41705,41717,41729,41744,41748,41763,41768,41779,41790,41795,41799,41811,41824,41832,41840,41845,41855,41865,41870,41874,41878,41882,41886,41890,41899,41908,41913,41917,41921,41925,41940,41951,41956,41961,41965],{"__ignoreMap":119},[78,41691,41692,41696,41699,41702],{"class":124,"line":125},[78,41693,41695],{"class":41694},"snl16","import",[78,41697,41698],{"class":41630}," {createRouter, createWebHashHistory} ",[78,41700,41701],{"class":41694},"from",[78,41703,41704],{"class":41644}," 'vue-router'\n",[78,41706,41707,41709,41712,41714],{"class":124,"line":132},[78,41708,41695],{"class":41694},[78,41710,41711],{"class":41630}," Home ",[78,41713,41701],{"class":41694},[78,41715,41716],{"class":41644}," '..\u002Fviews\u002FHome.vue'\n",[78,41718,41719,41721,41724,41726],{"class":124,"line":138},[78,41720,41695],{"class":41694},[78,41722,41723],{"class":41630}," Login ",[78,41725,41701],{"class":41694},[78,41727,41728],{"class":41644}," '..\u002Fviews\u002FLogin.vue'\n",[78,41730,41731,41733,41736,41738,41741],{"class":124,"line":144},[78,41732,41695],{"class":41694},[78,41734,41735],{"class":41630}," User ",[78,41737,41701],{"class":41694},[78,41739,41740],{"class":41644}," '..\u002Fviews\u002FIndex.vue'",[78,41742,41743],{"class":41624},"  \u002F\u002F 引入视图文件\n",[78,41745,41746],{"class":124,"line":150},[78,41747,129],{"emptyLinePlaceholder":128},[78,41749,41750,41753,41757,41760],{"class":124,"line":156},[78,41751,41752],{"class":41694},"const",[78,41754,41756],{"class":41755},"sDLfK"," routes",[78,41758,41759],{"class":41694}," =",[78,41761,41762],{"class":41630}," [\n",[78,41764,41765],{"class":124,"line":162},[78,41766,41767],{"class":41630},"  {\n",[78,41769,41770,41773,41776],{"class":124,"line":168},[78,41771,41772],{"class":41630},"    path: ",[78,41774,41775],{"class":41644},"'\u002F'",[78,41777,41778],{"class":41630},",\n",[78,41780,41781,41784,41787],{"class":124,"line":174},[78,41782,41783],{"class":41630},"    redirect: ",[78,41785,41786],{"class":41644},"'\u002Fhome'",[78,41788,41789],{"class":41624},"  \u002F\u002F 重定向\n",[78,41791,41792],{"class":124,"line":180},[78,41793,41794],{"class":41630},"  },\n",[78,41796,41797],{"class":124,"line":186},[78,41798,41767],{"class":41630},[78,41800,41801,41803,41805,41808],{"class":124,"line":192},[78,41802,41772],{"class":41630},[78,41804,41786],{"class":41644},[78,41806,41807],{"class":41630},",  ",[78,41809,41810],{"class":41624},"\u002F\u002F 路由地址\n",[78,41812,41813,41816,41819,41821],{"class":124,"line":198},[78,41814,41815],{"class":41630},"    name: ",[78,41817,41818],{"class":41644},"'Home'",[78,41820,41807],{"class":41630},[78,41822,41823],{"class":41624},"\u002F\u002F 路由名称\n",[78,41825,41826,41829],{"class":124,"line":204},[78,41827,41828],{"class":41630},"    component: Home,  ",[78,41830,41831],{"class":41624},"\u002F\u002F 对应组件\n",[78,41833,41834,41837],{"class":124,"line":210},[78,41835,41836],{"class":41630},"    children: [  ",[78,41838,41839],{"class":41624},"\u002F\u002F 子路由（嵌套路由）\n",[78,41841,41842],{"class":124,"line":216},[78,41843,41844],{"class":41630},"      {\n",[78,41846,41847,41850,41853],{"class":124,"line":222},[78,41848,41849],{"class":41630},"        path: ",[78,41851,41852],{"class":41644},"'\u002Findex'",[78,41854,41778],{"class":41630},[78,41856,41857,41860,41863],{"class":124,"line":421},[78,41858,41859],{"class":41630},"        name: ",[78,41861,41862],{"class":41644},"'Index'",[78,41864,41778],{"class":41630},[78,41866,41867],{"class":124,"line":427},[78,41868,41869],{"class":41630},"        component: Index\n",[78,41871,41872],{"class":124,"line":433},[78,41873,23499],{"class":41630},[78,41875,41876],{"class":124,"line":2443},[78,41877,8971],{"class":41630},[78,41879,41880],{"class":124,"line":2448},[78,41881,41794],{"class":41630},[78,41883,41884],{"class":124,"line":2454},[78,41885,129],{"emptyLinePlaceholder":128},[78,41887,41888],{"class":124,"line":2460},[78,41889,41767],{"class":41630},[78,41891,41892,41894,41897],{"class":124,"line":2465},[78,41893,41772],{"class":41630},[78,41895,41896],{"class":41644},"'\u002Flogin'",[78,41898,41778],{"class":41630},[78,41900,41901,41903,41906],{"class":124,"line":2470},[78,41902,41815],{"class":41630},[78,41904,41905],{"class":41644},"'Login'",[78,41907,41778],{"class":41630},[78,41909,41910],{"class":124,"line":2903},[78,41911,41912],{"class":41630},"    component: Login\n",[78,41914,41915],{"class":124,"line":2909},[78,41916,23513],{"class":41630},[78,41918,41919],{"class":124,"line":11477},[78,41920,2070],{"class":41630},[78,41922,41923],{"class":124,"line":13374},[78,41924,129],{"emptyLinePlaceholder":128},[78,41926,41927,41929,41932,41934,41937],{"class":124,"line":13380},[78,41928,41752],{"class":41694},[78,41930,41931],{"class":41755}," router",[78,41933,41759],{"class":41694},[78,41935,41936],{"class":41638}," createRouter",[78,41938,41939],{"class":41630},"({\n",[78,41941,41942,41945,41948],{"class":124,"line":13386},[78,41943,41944],{"class":41630},"  history: ",[78,41946,41947],{"class":41638},"createWebHashHistory",[78,41949,41950],{"class":41630},"(),\n",[78,41952,41953],{"class":124,"line":13722},[78,41954,41955],{"class":41630},"  routes\n",[78,41957,41958],{"class":124,"line":13727},[78,41959,41960],{"class":41630},"})\n",[78,41962,41963],{"class":124,"line":13953},[78,41964,129],{"emptyLinePlaceholder":128},[78,41966,41967,41970,41973],{"class":124,"line":13958},[78,41968,41969],{"class":41694},"export",[78,41971,41972],{"class":41694}," default",[78,41974,41975],{"class":41630}," router\n",[7759,41977,41978],{"id":41978},"关于嵌套路由",[13,41980,41981,41984,41985,41987,41988,67],{},[17,41982,41983],{},"\u003Crouter-view>"," 是一个顶层的 ",[17,41986,41983],{},"。它渲染顶层路由匹配的组件。同样地，一个被渲染的组件也可以包含自己嵌套的 ",[17,41989,41983],{},[49,41991,41992],{},[52,41993,41994],{},"如果只是应付项目作业，那么到这里基本已经够用了，以下是对于官方文档的一点点不成熟见解与引用。",[23289,41996],{},[107,41998,41999],{"id":41999},"编程式导航",[13,42001,42002],{},[22,42003,42004,42005,42085],{},"注意：在 Vue 实例中，你可以通过 ",[78,42006,42008,42045],{"className":42007},[4570],[78,42009,42011],{"className":42010},[4574],[4576,42012,42013],{"xmlns":4578},[4581,42014,42015,42042],{},[4584,42016,42017,42019,42021,42023,42025,42027,42029,42032,42034,42036,42038,42040],{},[4596,42018,17132],{},[4596,42020,5025],{},[4596,42022,18038],{},[4596,42024,5012],{},[4596,42026,4618],{},[4596,42028,17132],{},[4587,42030,42031],{},"访问路由实例。因此你可以调用",[4596,42033,5012],{},[4596,42035,26052],{},[4596,42037,39],{},[4596,42039,262],{},[4596,42041,21291],{"mathvariant":7101},[4647,42043,42044],{"encoding":4649},"router 访问路由实例。因此你可以调用 this.",[78,42046,42048],{"className":42047,"ariaHidden":1419},[4654],[78,42049,42051,42054,42057,42060,42063,42066,42069,42072,42075,42079,42082],{"className":42050},[4658],[78,42052],{"className":42053,"style":16794},[4662],[78,42055,17132],{"className":42056,"style":17251},[4667,4678],[78,42058,5025],{"className":42059},[4667,4678],[78,42061,18038],{"className":42062},[4667,4678],[78,42064,5012],{"className":42065},[4667,4678],[78,42067,18081],{"className":42068,"style":17251},[4667,4678],[78,42070,42031],{"className":42071},[4667,6184],[78,42073,5012],{"className":42074},[4667,4678],[78,42076,42078],{"className":42077},[4667,4678],"hi",[78,42080,262],{"className":42081},[4667,4678],[78,42083,21291],{"className":42084},[4667],"router.push。",[13,42087,42088],{},"想要导航到不同的 URL，可以使用 router.push 方法。这个方法会向 history 栈添加一个新的记录，所以，当用户点击浏览器后退按钮时，会回到之前的 URL。",[13,42090,42091,42092,42095,42096,42099,42100,67],{},"当你点击 ",[17,42093,42094],{},"\u003Crouter-link>"," 时，内部会调用这个方法，所以点击 ",[17,42097,42098],{},"\u003Crouter-link :to=\"...\">"," 相当于调用 ",[17,42101,42102],{},"router.push(...)",[13,42104,42105],{},[617,42106],{"alt":42107,"src":42108},"编程式导航-1","https:\u002F\u002Fraw.githubusercontent.com\u002FAlexie-Z-Yevich\u002FMyLearningNotes\u002Fmaster\u002Fimg\u002Fimage-20220506105927372.png",[114,42110,42112],{"className":41685,"code":42111,"language":41687,"meta":119,"style":119},"\u002F\u002F 字符串路径\nrouter.push('\u002Fusers\u002Feduardo')\n\n\u002F\u002F 带有路径的对象\nrouter.push({ path: '\u002Fusers\u002Feduardo' })\n\n\u002F\u002F 命名的路由，并加上参数，让路由建立 url\nrouter.push({ name: 'user', params: { username: 'eduardo' } })\n\n\u002F\u002F 带查询参数，结果是 \u002Fregister?plan=private\nrouter.push({ path: '\u002Fregister', query: { plan: 'private' } })\n\n\u002F\u002F 带 hash，结果是 \u002Fabout#team\nrouter.push({ path: '\u002Fabout', hash: '#team' })\n",[17,42113,42114,42119,42134,42138,42143,42157,42161,42166,42187,42191,42196,42215,42219,42224],{"__ignoreMap":119},[78,42115,42116],{"class":124,"line":125},[78,42117,42118],{"class":41624},"\u002F\u002F 字符串路径\n",[78,42120,42121,42124,42127,42129,42132],{"class":124,"line":132},[78,42122,42123],{"class":41630},"router.",[78,42125,42126],{"class":41638},"push",[78,42128,4594],{"class":41630},[78,42130,42131],{"class":41644},"'\u002Fusers\u002Feduardo'",[78,42133,8041],{"class":41630},[78,42135,42136],{"class":124,"line":138},[78,42137,129],{"emptyLinePlaceholder":128},[78,42139,42140],{"class":124,"line":144},[78,42141,42142],{"class":41624},"\u002F\u002F 带有路径的对象\n",[78,42144,42145,42147,42149,42152,42154],{"class":124,"line":150},[78,42146,42123],{"class":41630},[78,42148,42126],{"class":41638},[78,42150,42151],{"class":41630},"({ path: ",[78,42153,42131],{"class":41644},[78,42155,42156],{"class":41630}," })\n",[78,42158,42159],{"class":124,"line":156},[78,42160,129],{"emptyLinePlaceholder":128},[78,42162,42163],{"class":124,"line":162},[78,42164,42165],{"class":41624},"\u002F\u002F 命名的路由，并加上参数，让路由建立 url\n",[78,42167,42168,42170,42172,42175,42178,42181,42184],{"class":124,"line":168},[78,42169,42123],{"class":41630},[78,42171,42126],{"class":41638},[78,42173,42174],{"class":41630},"({ name: ",[78,42176,42177],{"class":41644},"'user'",[78,42179,42180],{"class":41630},", params: { username: ",[78,42182,42183],{"class":41644},"'eduardo'",[78,42185,42186],{"class":41630}," } })\n",[78,42188,42189],{"class":124,"line":174},[78,42190,129],{"emptyLinePlaceholder":128},[78,42192,42193],{"class":124,"line":180},[78,42194,42195],{"class":41624},"\u002F\u002F 带查询参数，结果是 \u002Fregister?plan=private\n",[78,42197,42198,42200,42202,42204,42207,42210,42213],{"class":124,"line":186},[78,42199,42123],{"class":41630},[78,42201,42126],{"class":41638},[78,42203,42151],{"class":41630},[78,42205,42206],{"class":41644},"'\u002Fregister'",[78,42208,42209],{"class":41630},", query: { plan: ",[78,42211,42212],{"class":41644},"'private'",[78,42214,42186],{"class":41630},[78,42216,42217],{"class":124,"line":192},[78,42218,129],{"emptyLinePlaceholder":128},[78,42220,42221],{"class":124,"line":198},[78,42222,42223],{"class":41624},"\u002F\u002F 带 hash，结果是 \u002Fabout#team\n",[78,42225,42226,42228,42230,42232,42235,42238,42241],{"class":124,"line":204},[78,42227,42123],{"class":41630},[78,42229,42126],{"class":41638},[78,42231,42151],{"class":41630},[78,42233,42234],{"class":41644},"'\u002Fabout'",[78,42236,42237],{"class":41630},", hash: ",[78,42239,42240],{"class":41644},"'#team'",[78,42242,42156],{"class":41630},[13,42244,42245],{},"**注意：**如果提供了 path，params 会被忽略，上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法，你需要提供路由的 name 或手写完整的带有参数的 path:",[114,42247,42249],{"className":41685,"code":42248,"language":41687,"meta":119,"style":119},"const username = 'eduardo'\n\u002F\u002F 我们可以手动建立 url，但我们必须自己处理编码\nrouter.push(`\u002Fuser\u002F${username}`) \u002F\u002F -> \u002Fuser\u002Feduardo\n\u002F\u002F 同样\nrouter.push({ path: `\u002Fuser\u002F${username}` }) \u002F\u002F -> \u002Fuser\u002Feduardo\n\u002F\u002F 如果可能的话，使用 `name` 和 `params` 从自动 URL 编码中获益\nrouter.push({ name: 'user', params: { username } }) \u002F\u002F -> \u002Fuser\u002Feduardo\n\u002F\u002F `params` 不能与 `path` 一起使用\nrouter.push({ path: '\u002Fuser', params: { username } }) \u002F\u002F -> \u002Fuser\n",[17,42250,42251,42263,42268,42291,42296,42315,42320,42335,42340],{"__ignoreMap":119},[78,42252,42253,42255,42258,42260],{"class":124,"line":125},[78,42254,41752],{"class":41694},[78,42256,42257],{"class":41755}," username",[78,42259,41759],{"class":41694},[78,42261,42262],{"class":41644}," 'eduardo'\n",[78,42264,42265],{"class":124,"line":132},[78,42266,42267],{"class":41624},"\u002F\u002F 我们可以手动建立 url，但我们必须自己处理编码\n",[78,42269,42270,42272,42274,42276,42279,42282,42285,42288],{"class":124,"line":138},[78,42271,42123],{"class":41630},[78,42273,42126],{"class":41638},[78,42275,4594],{"class":41630},[78,42277,42278],{"class":41644},"`\u002Fuser\u002F${",[78,42280,42281],{"class":41630},"username",[78,42283,42284],{"class":41644},"}`",[78,42286,42287],{"class":41630},") ",[78,42289,42290],{"class":41624},"\u002F\u002F -> \u002Fuser\u002Feduardo\n",[78,42292,42293],{"class":124,"line":144},[78,42294,42295],{"class":41624},"\u002F\u002F 同样\n",[78,42297,42298,42300,42302,42304,42306,42308,42310,42313],{"class":124,"line":150},[78,42299,42123],{"class":41630},[78,42301,42126],{"class":41638},[78,42303,42151],{"class":41630},[78,42305,42278],{"class":41644},[78,42307,42281],{"class":41630},[78,42309,42284],{"class":41644},[78,42311,42312],{"class":41630}," }) ",[78,42314,42290],{"class":41624},[78,42316,42317],{"class":124,"line":156},[78,42318,42319],{"class":41624},"\u002F\u002F 如果可能的话，使用 `name` 和 `params` 从自动 URL 编码中获益\n",[78,42321,42322,42324,42326,42328,42330,42333],{"class":124,"line":162},[78,42323,42123],{"class":41630},[78,42325,42126],{"class":41638},[78,42327,42174],{"class":41630},[78,42329,42177],{"class":41644},[78,42331,42332],{"class":41630},", params: { username } }) ",[78,42334,42290],{"class":41624},[78,42336,42337],{"class":124,"line":168},[78,42338,42339],{"class":41624},"\u002F\u002F `params` 不能与 `path` 一起使用\n",[78,42341,42342,42344,42346,42348,42351,42353],{"class":124,"line":174},[78,42343,42123],{"class":41630},[78,42345,42126],{"class":41638},[78,42347,42151],{"class":41630},[78,42349,42350],{"class":41644},"'\u002Fuser'",[78,42352,42332],{"class":41630},[78,42354,42355],{"class":41624},"\u002F\u002F -> \u002Fuser\n",[13,42357,42358],{},"可以看出，路径使用的是动态的$占位符，能很大程度降低代码的耦合。",[107,42360,42361],{"id":42361},"基础知识点",[23090,42363,42365],{"id":42364},"_1name-的优势","1、name 的优势",[13,42367,42368],{},"（1）没有硬编码的 URL。\n（2）params 的自动编码\u002F解码。\n（3）防止你在 url 中出现打字错误。\n（4）绕过路径排序（如显示一个）。",[23090,42370,42372],{"id":42371},"_2redict重定向","2、redict重定向",[114,42374,42376],{"className":41685,"code":42375,"language":41687,"meta":119,"style":119},"\u002F\u002F 直接重定向到地址\nredirect: '\u002F'\n\n\u002F\u002F 重定向到名称，通过名称定位地址（有效降低耦合）\nredirect: { name: 'homepage' }\n\n\u002F\u002F 重定向也可以是方法，动态返回重定向目标\nredirect: to => {\n      return { path: '\u002Fsearch', query: { q: to.params.searchText } }\n}\n",[17,42377,42378,42383,42394,42398,42403,42420,42424,42429,42445,42459],{"__ignoreMap":119},[78,42379,42380],{"class":124,"line":125},[78,42381,42382],{"class":41624},"\u002F\u002F 直接重定向到地址\n",[78,42384,42385,42388,42391],{"class":124,"line":132},[78,42386,42387],{"class":41638},"redirect",[78,42389,42390],{"class":41630},": ",[78,42392,42393],{"class":41644},"'\u002F'\n",[78,42395,42396],{"class":124,"line":138},[78,42397,129],{"emptyLinePlaceholder":128},[78,42399,42400],{"class":124,"line":144},[78,42401,42402],{"class":41624},"\u002F\u002F 重定向到名称，通过名称定位地址（有效降低耦合）\n",[78,42404,42405,42407,42410,42412,42414,42417],{"class":124,"line":150},[78,42406,42387],{"class":41638},[78,42408,42409],{"class":41630},": { ",[78,42411,34359],{"class":41638},[78,42413,42390],{"class":41630},[78,42415,42416],{"class":41644},"'homepage'",[78,42418,42419],{"class":41630}," }\n",[78,42421,42422],{"class":124,"line":156},[78,42423,129],{"emptyLinePlaceholder":128},[78,42425,42426],{"class":124,"line":162},[78,42427,42428],{"class":41624},"\u002F\u002F 重定向也可以是方法，动态返回重定向目标\n",[78,42430,42431,42433,42435,42439,42442],{"class":124,"line":168},[78,42432,42387],{"class":41638},[78,42434,42390],{"class":41630},[78,42436,42438],{"class":42437},"s9osk","to",[78,42440,42441],{"class":41694}," =>",[78,42443,42444],{"class":41630}," {\n",[78,42446,42447,42450,42453,42456],{"class":124,"line":174},[78,42448,42449],{"class":41694},"      return",[78,42451,42452],{"class":41630}," { path: ",[78,42454,42455],{"class":41644},"'\u002Fsearch'",[78,42457,42458],{"class":41630},", query: { q: to.params.searchText } }\n",[78,42460,42461],{"class":124,"line":180},[78,42462,23518],{"class":41630},[13,42464,42465],{},"**注意：**导航守卫并没有应用在跳转路由上，而仅仅应用在其目标上。",[23090,42467,42469],{"id":42468},"_3别名","3、别名",[114,42471,42473],{"className":41685,"code":42472,"language":41687,"meta":119,"style":119},"alias: '\u002Fhome'\n",[17,42474,42475],{"__ignoreMap":119},[78,42476,42477,42480,42482],{"class":124,"line":125},[78,42478,42479],{"class":41638},"alias",[78,42481,42390],{"class":41630},[78,42483,42484],{"class":41644},"'\u002Fhome'\n",[13,42486,42487],{},"通过别名，你可以自由地将 UI 结构映射到一个任意的 URL，而不受配置的嵌套结构的限制。",[23090,42489,42491],{"id":42490},"_4props","4、props",[114,42493,42495],{"className":41685,"code":42494,"language":41687,"meta":119,"style":119},"const routes = [{ path: '\u002Fuser\u002F:id', component: User }]\n\u002F\u002F 替换成如下\nconst routes = [{ path: '\u002Fuser\u002F:id', component: User, props: true }]\n",[17,42496,42497,42514,42519],{"__ignoreMap":119},[78,42498,42499,42501,42503,42505,42508,42511],{"class":124,"line":125},[78,42500,41752],{"class":41694},[78,42502,41756],{"class":41755},[78,42504,41759],{"class":41694},[78,42506,42507],{"class":41630}," [{ path: ",[78,42509,42510],{"class":41644},"'\u002Fuser\u002F:id'",[78,42512,42513],{"class":41630},", component: User }]\n",[78,42515,42516],{"class":124,"line":132},[78,42517,42518],{"class":41624},"\u002F\u002F 替换成如下\n",[78,42520,42521,42523,42525,42527,42529,42531,42534,42536],{"class":124,"line":138},[78,42522,41752],{"class":41694},[78,42524,41756],{"class":41755},[78,42526,41759],{"class":41694},[78,42528,42507],{"class":41630},[78,42530,42510],{"class":41644},[78,42532,42533],{"class":41630},", component: User, props: ",[78,42535,1419],{"class":41755},[78,42537,42538],{"class":41630}," }]\n",[13,42540,42541,42542,42545],{},"通过加入",[22,42543,42544],{},"props: true","，你可以在多个地方使用该路由，使得该组件更容易重用和测试。",[13,42547,42548],{},"当 props 设置为 true 时，route.params 将被设置为组件的 props。",[23090,42550,42552],{"id":42551},"_5历史模式","*5、历史模式",[13,42554,42555],{},"history 配置允许我们在不同的历史模式中进行选择。",[7759,42557,42559],{"id":42558},"_1hash-模式","（1）Hash 模式",[114,42561,42563],{"className":41685,"code":42562,"language":41687,"meta":119,"style":119},"import { createRouter, createWebHashHistory } from 'vue-router'\n\nconst router = createRouter({\n  history: createWebHashHistory(),\n  routes: [\n    \u002F\u002F...\n  ],\n})\n",[17,42564,42565,42576,42580,42592,42600,42605,42610,42615],{"__ignoreMap":119},[78,42566,42567,42569,42572,42574],{"class":124,"line":125},[78,42568,41695],{"class":41694},[78,42570,42571],{"class":41630}," { createRouter, createWebHashHistory } ",[78,42573,41701],{"class":41694},[78,42575,41704],{"class":41644},[78,42577,42578],{"class":124,"line":132},[78,42579,129],{"emptyLinePlaceholder":128},[78,42581,42582,42584,42586,42588,42590],{"class":124,"line":138},[78,42583,41752],{"class":41694},[78,42585,41931],{"class":41755},[78,42587,41759],{"class":41694},[78,42589,41936],{"class":41638},[78,42591,41939],{"class":41630},[78,42593,42594,42596,42598],{"class":124,"line":144},[78,42595,41944],{"class":41630},[78,42597,41947],{"class":41638},[78,42599,41950],{"class":41630},[78,42601,42602],{"class":124,"line":150},[78,42603,42604],{"class":41630},"  routes: [\n",[78,42606,42607],{"class":124,"line":156},[78,42608,42609],{"class":41624},"    \u002F\u002F...\n",[78,42611,42612],{"class":124,"line":162},[78,42613,42614],{"class":41630},"  ],\n",[78,42616,42617],{"class":124,"line":168},[78,42618,41960],{"class":41630},[13,42620,42621,42622,67],{},"由于这部分 URL 从未被发送到服务器，所以它不需要在服务器层面上进行任何特殊处理。不过，它在 ",[22,42623,42624],{},"SEO 中确实有不好的影响",[7759,42626,42628],{"id":42627},"_2html5-模式推荐","（2）HTML5 模式（推荐）",[114,42630,42632],{"className":41685,"code":42631,"language":41687,"meta":119,"style":119},"import { createRouter, createWebHistory } from 'vue-router'\n\nconst router = createRouter({\n  history: createWebHistory(),\n  routes: [\n    \u002F\u002F...\n  ],\n})\n",[17,42633,42634,42645,42649,42661,42670,42674,42678,42682],{"__ignoreMap":119},[78,42635,42636,42638,42641,42643],{"class":124,"line":125},[78,42637,41695],{"class":41694},[78,42639,42640],{"class":41630}," { createRouter, createWebHistory } ",[78,42642,41701],{"class":41694},[78,42644,41704],{"class":41644},[78,42646,42647],{"class":124,"line":132},[78,42648,129],{"emptyLinePlaceholder":128},[78,42650,42651,42653,42655,42657,42659],{"class":124,"line":138},[78,42652,41752],{"class":41694},[78,42654,41931],{"class":41755},[78,42656,41759],{"class":41694},[78,42658,41936],{"class":41638},[78,42660,41939],{"class":41630},[78,42662,42663,42665,42668],{"class":124,"line":144},[78,42664,41944],{"class":41630},[78,42666,42667],{"class":41638},"createWebHistory",[78,42669,41950],{"class":41630},[78,42671,42672],{"class":124,"line":150},[78,42673,42604],{"class":41630},[78,42675,42676],{"class":124,"line":156},[78,42677,42609],{"class":41624},[78,42679,42680],{"class":124,"line":162},[78,42681,42614],{"class":41630},[78,42683,42684],{"class":124,"line":168},[78,42685,41960],{"class":41630},[13,42687,42688],{},"使用这种历史配置，URL会看起来干净漂亮。但是需要适当的服务器配置，如果直接访问单页地址，就会出现404错误。",[49,42690,42691],{},[52,42692,42693,42694,42696,42390,42699,42703],{},"详细的服务器配置请参考",[2996,42695],{},[78,42697,42698],{},"官方文档",[5009,42700,42701],{"href":42701,"rel":42702},"https:\u002F\u002Frouter.vuejs.org\u002Fzh\u002Fguide\u002Fessentials\u002Fhistory-mode.html#caddy-v2",[23647],"\t\"\"在这\"\"",[226,42705,42706],{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":119,"searchDepth":144,"depth":144,"links":42708},[42709,42710,42713,42714],{"id":41610,"depth":132,"text":41610},{"id":41679,"depth":132,"text":41682,"children":42711},[42712],{"id":41978,"depth":144,"text":41978},{"id":41999,"depth":132,"text":41999},{"id":42361,"depth":132,"text":42361,"children":42715},[42716,42717,42718,42719,42720],{"id":42364,"depth":138,"text":42365},{"id":42371,"depth":138,"text":42372},{"id":42468,"depth":138,"text":42469},{"id":42490,"depth":138,"text":42491},{"id":42551,"depth":138,"text":42552,"children":42721},[42722,42723],{"id":42558,"depth":144,"text":42559},{"id":42627,"depth":144,"text":42628},{},"TalkingAbout\u002F前端\u002F1_关于Vue\u002FVue Router（基础）.md","\u002Fundergraduate\u002Fnote-595d0c134f11",{"title":41601,"description":119},"undergraduate\u002Fnote-595d0c134f11",[23333],"1k0GZDLMXSiXOKxK0yENPMqqT8f5O7jSBQTE54m8UHA",{"id":42732,"title":42733,"assetBase":239,"author":8,"body":42734,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":46178,"navigation":128,"originalPath":46179,"path":46180,"seo":46181,"source":23330,"stem":46182,"tags":46183,"weight":250,"__hash__":46184},"content\u002Fundergraduate\u002Fnote-6722326c1bdc.md","离线数仓总结（上）",{"type":10,"value":42735,"toc":46154},[42736,42740,42743,42747,42750,42753,42756,42759,42762,42765,42794,42798,42801,42949,42953,43247,43249,43253,43257,43265,43271,43274,43277,43281,43284,43288,43292,43295,43306,43310,43312,43320,43324,43425,43429,43432,43436,43543,43547,43567,43571,43939,43943,43946,43950,43983,43987,44007,44011,44014,44017,44020,44038,44041,44061,44065,44284,44288,44291,44296,44300,44303,44327,44332,44336,44445,44460,44464,44467,44492,44496,44499,44502,44505,44677,44680,44709,44739,44743,44750,44753,44756,44829,44833,44836,44841,44845,44848,44900,44905,44908,44911,44914,44919,44922,44926,44929,44932,44935,45255,45259,45262,45266,45269,45272,45280,45284,45408,45412,45415,45419,45455,45459,45476,45480,45861,45865,45980,45985,45989,45994,45998,46090,46093,46128,46132,46141,46146,46152],[107,42737,42739],{"id":42738},"第一章-数据仓库的概念及架构选型","第一章 数据仓库的概念及架构选型",[13,42741,42742],{},"数据仓库（Data Warehouse），是为企业制定决策，提供数据支持的。可以帮助企业，改进业务流程、提高产品质量等。",[7759,42744,42746],{"id":42745},"_1数据仓库的输入数据","1、数据仓库的输入数据",[10548,42748,42749],{"id":42749},"业务数据",[13,42751,42752],{},"就是各行业在处理事务过程中产生的数据。比如用户在电商网站中登录、下单、支付等过程中，需要和网站后台数据库进行增删改查交互，产生的数据就是业务数据。业务数据通常存储在MySQL、Oracle等数据库中。",[10548,42754,42755],{"id":42755},"用户行为数据",[13,42757,42758],{},"用户在使用产品过程中，通过埋点收集与客户端产品交互过程中产生的数据，并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。用户行为数据通常存储在日志文件中。",[10548,42760,42761],{"id":42761},"爬虫数据",[13,42763,42764],{},"通常是通过技术手段获取其他公司网站的数据。不建议同学们这样去做。",[72,42766,42767,42770,42773,42780,42787],{},[13,42768,42769],{},"通常来说，业务数据就是后端持久化到数据库的日志记录，例如Mysql的Binlog日志；用户行为数据主要是前端进行埋点采集到的数据，嗯，简单让new bing来介绍下采集流程吧：",[13,42771,42772],{},"前端埋点到大数据采集的完整流程包括数据采集层、数据接入层、数据处理层、数据应用层这四个层次。在数据采集层，可以通过传统的埋点方式，在需要上报的位置组织数据、调用API、将数据传给后端，也可以通过“无埋点”概念，在底层hook所有的点击事件，自动采集全部事件并上报埋点数据。在数据接入层，可以通过Flume、Kafka等工具将数据接入到Hadoop生态圈中。在数据处理层，可以使用Hive、Spark SQL等工具进行数据清洗、转换和计算。在数据应用层，可以使用Tableau、Echarts等工具进行可视化展示。",[13,42774,42775,42776],{},"(1) 一个埋点的求生之路——数据处理全流程解析 - 知乎. ",[5009,42777,42778],{"href":42778,"rel":42779},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F133090030",[23647],[13,42781,42782,42783],{},"(2) 数据采集：埋点、采集、存储及分析 - Hider1214 - 博客园. ",[5009,42784,42785],{"href":42785,"rel":42786},"https:\u002F\u002Fwww.cnblogs.com\u002Fhider\u002Fp\u002F13967167.html",[23647],[13,42788,42789,42790],{},"(3) 前端埋点简单实现方式 - 掘金. ",[5009,42791,42792],{"href":42792,"rel":42793},"https:\u002F\u002Fjuejin.cn\u002Fpost\u002F7047710777507053582",[23647],[7759,42795,42797],{"id":42796},"_2项目框架","2、项目框架",[13,42799,42800],{},"关于选用版本的详细解释，组件详细介绍单开一栏说明。",[8366,42802,42803,42816],{},[8369,42804,42805],{},[8372,42806,42807,42810,42813],{},[8375,42808,42809],{},"框架",[8375,42811,42812],{},"版本",[8375,42814,42815],{},"说明",[8386,42817,42818,42829,42840,42850,42866,42877,42888,42898,42907,42916,42929,42939],{},[8372,42819,42820,42823,42826],{},[8391,42821,42822],{},"jdk",[8391,42824,42825],{},"1.8",[8391,42827,42828],{},"Java版本，Hadoop体系建议使用1.8，虽然兼容Java11但是Hive除了最新的4.0.0alpha版本以外，其他的都只支持到1.8。Java11以上不支持。",[8372,42830,42831,42834,42837],{},[8391,42832,42833],{},"Hadoop",[8391,42835,42836],{},"3.1.3",[8391,42838,42839],{},"选用视频配套版本，选择太旧的2.x可能出现依赖缺失，最新的3.4.3则存在依赖改名的问题",[8372,42841,42842,42845,42848],{},[8391,42843,42844],{},"Zookeeper",[8391,42846,42847],{},"3.5.7",[8391,42849],{},[8372,42851,42852,42855,42858],{},[8391,42853,42854],{},"Mysql",[8391,42856,42857],{},"5.7.16",[8391,42859,42860,42861],{},"可以选用8系列，但是不能低于5.7版本，5.7.8之后支持Json，同时对InnoDB和一些强政策进行了更改。详情可看",[5009,42862,42865],{"href":42863,"rel":42864},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F29726382",[23647],"数据库MySQL 5.7版本介绍",[8372,42867,42868,42871,42874],{},[8391,42869,42870],{},"Hive",[8391,42872,42873],{},"3.1.2",[8391,42875,42876],{},"Hive和Spark以及Hadoop版本要互相兼容，采用自编译等方式可以自定义版本",[8372,42878,42879,42882,42885],{},[8391,42880,42881],{},"Flume",[8391,42883,42884],{},"1.9.0",[8391,42886,42887],{},"不建议选用2.0.0以上版本，配置文件有点改动（大概是.properties->.xml）",[8372,42889,42890,42893,42896],{},[8391,42891,42892],{},"Kafka",[8391,42894,42895],{},"3.0.0",[8391,42897],{},[8372,42899,42900,42903,42905],{},[8391,42901,42902],{},"Spark",[8391,42904,42895],{},[8391,42906],{},[8372,42908,42909,42912,42914],{},[8391,42910,42911],{},"DataX",[8391,42913,42895],{},[8391,42915],{},[8372,42917,42918,42921,42926],{},[8391,42919,42920],{},"Superset",[8391,42922,42923],{},[22,42924,42925],{},"1.4.2",[8391,42927,42928],{},"推荐版本很搞，更新之后很多依赖都没了，不建议使用2.0.0，如果需要2.0.0+可以使用网上的一键部署版本，不然自己调整配置会很麻烦（需要一定conda、python知识）",[8372,42930,42931,42934,42937],{},[8391,42932,42933],{},"DolphinScheduler",[8391,42935,42936],{},"2.0.3",[8391,42938],{},[8372,42940,42941,42944,42947],{},[8391,42942,42943],{},"Maxwell",[8391,42945,42946],{},"1.29.2",[8391,42948],{},[7759,42950,42952],{"id":42951},"_3测试集群服务器规划","3、测试集群服务器规划",[8366,42954,42955,42974],{},[8369,42956,42957],{},[8372,42958,42959,42962,42965,42968,42971],{},[8375,42960,42961],{},"服务名称",[8375,42963,42964],{},"子服务",[8375,42966,42967],{},"服务器hadoop102",[8375,42969,42970],{},"服务器hadoop1",[8375,42972,42973],{},"服务器hadoop104",[8386,42975,42976,42991,43004,43017,43031,43044,43057,43070,43082,43095,43108,43120,43133,43145,43157,43170,43183,43196,43209,43222,43234],{},[8372,42977,42978,42981,42984,42987,42989],{},[8391,42979,42980],{},"HDFS",[8391,42982,42983],{},"NameNode",[8391,42985,42986],{},"√",[8391,42988],{},[8391,42990],{},[8372,42992,42993,42995,42998,43000,43002],{},[8391,42994],{},[8391,42996,42997],{},"DataNode",[8391,42999,42986],{},[8391,43001,42986],{},[8391,43003,42986],{},[8372,43005,43006,43008,43011,43013,43015],{},[8391,43007],{},[8391,43009,43010],{},"SecondaryNameNode",[8391,43012],{},[8391,43014],{},[8391,43016,42986],{},[8372,43018,43019,43022,43025,43027,43029],{},[8391,43020,43021],{},"Yarn",[8391,43023,43024],{},"NodeManager",[8391,43026,42986],{},[8391,43028,42986],{},[8391,43030,42986],{},[8372,43032,43033,43035,43038,43040,43042],{},[8391,43034],{},[8391,43036,43037],{},"Resourcemanager",[8391,43039],{},[8391,43041,42986],{},[8391,43043],{},[8372,43045,43046,43048,43051,43053,43055],{},[8391,43047,42844],{},[8391,43049,43050],{},"Zookeeper Server",[8391,43052,42986],{},[8391,43054,42986],{},[8391,43056,42986],{},[8372,43058,43059,43062,43064,43066,43068],{},[8391,43060,43061],{},"Flume（采集日志）",[8391,43063,42881],{},[8391,43065,42986],{},[8391,43067,42986],{},[8391,43069],{},[8372,43071,43072,43074,43076,43078,43080],{},[8391,43073,42892],{},[8391,43075,42892],{},[8391,43077,42986],{},[8391,43079,42986],{},[8391,43081,42986],{},[8372,43083,43084,43087,43089,43091,43093],{},[8391,43085,43086],{},"Flume（消费Kafka日志）",[8391,43088,42881],{},[8391,43090],{},[8391,43092],{},[8391,43094,42986],{},[8372,43096,43097,43100,43102,43104,43106],{},[8391,43098,43099],{},"Flume（消费Kafka业务）",[8391,43101,42881],{},[8391,43103],{},[8391,43105],{},[8391,43107,42986],{},[8372,43109,43110,43112,43114,43116,43118],{},[8391,43111,42870],{},[8391,43113],{},[8391,43115,42986],{},[8391,43117,42986],{},[8391,43119,42986],{},[8372,43121,43122,43125,43127,43129,43131],{},[8391,43123,43124],{},"MySQL",[8391,43126,43124],{},[8391,43128,42986],{},[8391,43130],{},[8391,43132],{},[8372,43134,43135,43137,43139,43141,43143],{},[8391,43136,42911],{},[8391,43138],{},[8391,43140,42986],{},[8391,43142,42986],{},[8391,43144,42986],{},[8372,43146,43147,43149,43151,43153,43155],{},[8391,43148,42902],{},[8391,43150],{},[8391,43152,42986],{},[8391,43154,42986],{},[8391,43156,42986],{},[8372,43158,43159,43161,43164,43166,43168],{},[8391,43160,42933],{},[8391,43162,43163],{},"ApiApplicationServer",[8391,43165,42986],{},[8391,43167],{},[8391,43169],{},[8372,43171,43172,43174,43177,43179,43181],{},[8391,43173],{},[8391,43175,43176],{},"AlertServer",[8391,43178,42986],{},[8391,43180],{},[8391,43182],{},[8372,43184,43185,43187,43190,43192,43194],{},[8391,43186],{},[8391,43188,43189],{},"MasterServer",[8391,43191,42986],{},[8391,43193],{},[8391,43195],{},[8372,43197,43198,43200,43203,43205,43207],{},[8391,43199],{},[8391,43201,43202],{},"WorkerServer",[8391,43204,42986],{},[8391,43206,42986],{},[8391,43208,42986],{},[8372,43210,43211,43213,43216,43218,43220],{},[8391,43212],{},[8391,43214,43215],{},"LoggerServer",[8391,43217,42986],{},[8391,43219,42986],{},[8391,43221,42986],{},[8372,43223,43224,43226,43228,43230,43232],{},[8391,43225,42920],{},[8391,43227,42920],{},[8391,43229,42986],{},[8391,43231],{},[8391,43233],{},[8372,43235,43236,43239,43241,43243,43245],{},[8391,43237,43238],{},"服务数总计",[8391,43240],{},[8391,43242,1021],{},[8391,43244,1028],{},[8391,43246,1044],{},[23289,43248],{},[107,43250,43252],{"id":43251},"第二章-组件及常见问题","第二章 组件及常见问题",[7759,43254,43256],{"id":43255},"_0虚拟机","0、虚拟机",[13,43258,43259,43260,67],{},"能上哪个版本的VMware就上那个版本的VMware，虚拟机版本选用对环境影响并不大，不同Linux发行版之间基本是配置相同，包管理工具不同罢了，值得注意的是：选用CentOS Stream 9的配置项会和CentOS7之类的差别较大，在配置CentOS Stream 9作为虚拟机的时候可以参考以下文章：",[5009,43261,43264],{"href":43262,"rel":43263},"https:\u002F\u002Fwww.hxstrive.com\u002Farticle\u002F1053.htm",[23647],"CentOS Stream9 设置静态IP",[13,43266,43267,43270],{},[22,43268,43269],{},"！！注意一下内存分配","：HiveServer2启动查询功能大概率是将结果暂存在内存中，开8G很容易OOM，而DolphinScheduler更加离谱，全节点启动的情况下，8G内存甚至任务都无法执行，推荐配置16G、8G、8G，最低配置如下：",[13,43272,43273],{},"Hadoop102：8G+（我配的10G，结束时约空闲1~2G）",[13,43275,43276],{},"Hadoop103\u002FHadoop104：6G+（我配的8G，结束时约空闲1~3G）",[7759,43278,43280],{"id":43279},"_01jdk","0.1、Jdk",[13,43282,43283],{},"版本选择1.8，以所有组件中要求版本最高的那个作为适配版本，所有组件中Hive只能在1.8中启动，故选择1.8版本；当然如果想采用最新版本体验或是仍然想用更高级Java版本中的语法糖，那么可以安装多个Java，让Hive执行其他Java即可。",[7759,43285,43287],{"id":43286},"_02mock模拟数据准备","0.2、Mock模拟数据准备",[10548,43289,43291],{"id":43290},"_1生成日志数据","（1）生成日志数据",[13,43293,43294],{},"这里使用文档中准备的Java程序执行即可，使用基本流程是：",[49,43296,43297,43300,43303],{},[52,43298,43299],{},"依次启动Zookeeper、Kafka、Flume（采集日志）；",[52,43301,43302],{},"执行Java程序，在选定目录下生成Json日志；",[52,43304,43305],{},"Flume将生成的日志数据采集到HDFS上。",[10548,43307,43309],{"id":43308},"_2生成业务数据","（2）生成业务数据",[13,43311,43294],{},[49,43313,43314,43317],{},[52,43315,43316],{},"修改application.properties中的mock.clear和mock.clear.user数据",[52,43318,43319],{},"执行Java程序，在MySQL数据库中生成业务数据",[7759,43321,43323],{"id":43322},"_03source环境总览","0.3、Source环境总览",[114,43325,43327],{"className":33493,"code":43326,"language":33495,"meta":119,"style":119},"#JAVA_HOME\nexport JAVA_HOME=\u002Fopt\u002Fmodule\u002Fjdk\nexport PATH=$PATH:$JAVA_HOME\u002Fbin\n\n#HADOOP_HOME\nexport HADOOP_HOME=\u002Fopt\u002Fmodule\u002Fhadoop\nexport PATH=$PATH:$HADOOP_HOME\u002Fbin\nexport PATH=$PATH:$HADOOP_HOME\u002Fsbin\n\n#KAFKA_HOME\nexport KAFKA_HOME=\u002Fopt\u002Fmodule\u002Fkafka\nexport PATH=$PATH:$KAFKA_HOME\u002Fbin\n\n#HIVE_HOME\nexport HIVE_HOME=\u002Fopt\u002Fmodule\u002Fhive\nexport PATH=$PATH:$HIVE_HOME\u002Fbin\n\n# SPARK_HOME\nexport SPARK_HOME=\u002Fopt\u002Fmodule\u002Fspark\nexport PATH=$PATH:$SPARK_HOME\u002Fbin\n",[17,43328,43329,43334,43339,43344,43348,43353,43358,43363,43368,43372,43377,43382,43387,43391,43396,43401,43406,43410,43415,43420],{"__ignoreMap":119},[78,43330,43331],{"class":124,"line":125},[78,43332,43333],{},"#JAVA_HOME\n",[78,43335,43336],{"class":124,"line":132},[78,43337,43338],{},"export JAVA_HOME=\u002Fopt\u002Fmodule\u002Fjdk\n",[78,43340,43341],{"class":124,"line":138},[78,43342,43343],{},"export PATH=$PATH:$JAVA_HOME\u002Fbin\n",[78,43345,43346],{"class":124,"line":144},[78,43347,129],{"emptyLinePlaceholder":128},[78,43349,43350],{"class":124,"line":150},[78,43351,43352],{},"#HADOOP_HOME\n",[78,43354,43355],{"class":124,"line":156},[78,43356,43357],{},"export HADOOP_HOME=\u002Fopt\u002Fmodule\u002Fhadoop\n",[78,43359,43360],{"class":124,"line":162},[78,43361,43362],{},"export PATH=$PATH:$HADOOP_HOME\u002Fbin\n",[78,43364,43365],{"class":124,"line":168},[78,43366,43367],{},"export PATH=$PATH:$HADOOP_HOME\u002Fsbin\n",[78,43369,43370],{"class":124,"line":174},[78,43371,129],{"emptyLinePlaceholder":128},[78,43373,43374],{"class":124,"line":180},[78,43375,43376],{},"#KAFKA_HOME\n",[78,43378,43379],{"class":124,"line":186},[78,43380,43381],{},"export KAFKA_HOME=\u002Fopt\u002Fmodule\u002Fkafka\n",[78,43383,43384],{"class":124,"line":192},[78,43385,43386],{},"export PATH=$PATH:$KAFKA_HOME\u002Fbin\n",[78,43388,43389],{"class":124,"line":198},[78,43390,129],{"emptyLinePlaceholder":128},[78,43392,43393],{"class":124,"line":204},[78,43394,43395],{},"#HIVE_HOME\n",[78,43397,43398],{"class":124,"line":210},[78,43399,43400],{},"export HIVE_HOME=\u002Fopt\u002Fmodule\u002Fhive\n",[78,43402,43403],{"class":124,"line":216},[78,43404,43405],{},"export PATH=$PATH:$HIVE_HOME\u002Fbin\n",[78,43407,43408],{"class":124,"line":222},[78,43409,129],{"emptyLinePlaceholder":128},[78,43411,43412],{"class":124,"line":421},[78,43413,43414],{},"# SPARK_HOME\n",[78,43416,43417],{"class":124,"line":427},[78,43418,43419],{},"export SPARK_HOME=\u002Fopt\u002Fmodule\u002Fspark\n",[78,43421,43422],{"class":124,"line":433},[78,43423,43424],{},"export PATH=$PATH:$SPARK_HOME\u002Fbin\n",[7759,43426,43428],{"id":43427},"_1hadoop","1、Hadoop",[13,43430,43431],{},"Hadoop是一个由Apache基金会所开发的分布式系统基础架构，是一个存储系统 + 计算框架的软件框架。主要解决海量数据存储与计算的问题，是大数据技术中的基石。Hadoop以一种可靠、高效、可伸缩的方式进行数据处理，用户可以在不了解分布式底层细节的情况下，开发出分布式程序。",[10548,43433,43435],{"id":43434},"_1配置流程","（1）配置流程：",[49,43437,43438,43461,43475,43507,43521,43524,43527],{},[52,43439,43440,43441],{},"核心配置文件core-site.xml",[49,43442,43443,43446,43449,43452,43455,43458],{},[52,43444,43445],{},"配置NameNode地址",[52,43447,43448],{},"指定Hadoop数据存储目录",[52,43450,43451],{},"配置HDFS网页登录使用的静态用户",[52,43453,43454],{},"配置用户允许通过代理访问的主机节点",[52,43456,43457],{},"配置用户允许通过代理用户所属组",[52,43459,43460],{},"配置用户允许通过代理的用户",[52,43462,43463,43464],{},"HDFS配置文件hdfs-site.xml",[49,43465,43466,43469,43472],{},[52,43467,43468],{},"配置NameNode Web端访问端口",[52,43470,43471],{},"配置Secondary NameNode Web端访问端口",[52,43473,43474],{},"指定HDFS副本的数量",[52,43476,43477,43478],{},"YARN配置文件yarn-site.xml",[49,43479,43480,43483,43486,43489,43492,43495,43498,43501,43504],{},[52,43481,43482],{},"指定MapReduce走shuffle",[52,43484,43485],{},"指定ResourceManager地址",[52,43487,43488],{},"配置环境变量继承",[52,43490,43491],{},"配置YARN单个容器允许分配的最大最小内存",[52,43493,43494],{},"配置YARN容器允许管理的物理内存大小",[52,43496,43497],{},"关闭YARN对物理内存和虚拟内存的限制检查",[52,43499,43500],{},"开启日志聚集功能",[52,43502,43503],{},"设置日志聚集服务器地址",[52,43505,43506],{},"设置日志保留时间为7天",[52,43508,43509,43510],{},"MapReduce配置文件mapred-site.xml",[49,43511,43512,43515,43518],{},[52,43513,43514],{},"指定MapReduce程序运行在YARN上",[52,43516,43517],{},"配置历史服务器端地址",[52,43519,43520],{},"配置历史服务器Web端地址",[52,43522,43523],{},"配置workers（集群）",[52,43525,43526],{},"分发到所有集群机器上",[52,43528,43529,43530],{},"初始化NameNode节点",[49,43531,43532],{},[52,43533,43534],{},[114,43535,43537],{"className":33493,"code":43536,"language":33495,"meta":119,"style":119},"hdfs namenode -format\n",[17,43538,43539],{"__ignoreMap":119},[78,43540,43541],{"class":124,"line":125},[78,43542,43536],{},[10548,43544,43546],{"id":43545},"_2常见启停命令","（2）常见启停命令",[114,43548,43550],{"className":33493,"code":43549,"language":33495,"meta":119,"style":119},"start-dfs.sh                        # 启动HDFS\nstart-yarn.sh                       # 启动YARN\nmapred --daemon start historyserver # 启动历史日志采集\n",[17,43551,43552,43557,43562],{"__ignoreMap":119},[78,43553,43554],{"class":124,"line":125},[78,43555,43556],{},"start-dfs.sh                        # 启动HDFS\n",[78,43558,43559],{"class":124,"line":132},[78,43560,43561],{},"start-yarn.sh                       # 启动YARN\n",[78,43563,43564],{"class":124,"line":138},[78,43565,43566],{},"mapred --daemon start historyserver # 启动历史日志采集\n",[10548,43568,43570],{"id":43569},"_3参数调优","（3）参数调优",[49,43572,43573,43922],{},[52,43574,43575,43576],{},"hdfs-site.xml",[49,43577,43578,43581,43589],{},[52,43579,43580],{},"NameNode有一个工作线程池，用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说，通常需要增大参数dfs.namenode.handler.count的默认值10。",[52,43582,43583],{},[114,43584,43587],{"className":43585,"code":43586,"language":299},[297],"\u003Cproperty>\n    \u003Cname>dfs.namenode.handler.count\u003C\u002Fname>\n    \u003Cvalue>10\u003C\u002Fvalue>\n\u003C\u002Fproperty>\n",[17,43588,43586],{"__ignoreMap":119},[52,43590,43591],{},[78,43592,43594],{"className":43593},[4566],[78,43595,43597,43716],{"className":43596},[4570],[78,43598,43600],{"className":43599},[4574],[4576,43601,43602],{"xmlns":4578,"display":4579},[4581,43603,43604,43713],{},[4584,43605,43606,43608,43610,43612,43614,43616,43618,43620,43622,43624,43626,43628,43630,43632,43634,43636,43638,43640,43642,43644,43646,43648,43650,43652,43654,43656,43658,43660,43662,43665,43667,43669,43679,43681,43683,43685,43687,43689,43691,43694,43696,43698,43700,43703,43705,43708,43711],{},[4596,43607,5245],{},[4596,43609,5053],{},[4596,43611,262],{},[4596,43613,21291],{"mathvariant":7101},[4596,43615,19],{},[4596,43617,5009],{},[4596,43619,5058],{},[4596,43621,4618],{},[4596,43623,19],{},[4596,43625,5025],{},[4596,43627,5245],{},[4596,43629,4618],{},[4596,43631,21291],{"mathvariant":7101},[4596,43633,26052],{},[4596,43635,5009],{},[4596,43637,19],{},[4596,43639,5245],{},[4596,43641,7132],{},[4596,43643,4618],{},[4596,43645,17132],{},[4596,43647,21291],{"mathvariant":7101},[4596,43649,7360],{},[4596,43651,5025],{},[4596,43653,18038],{},[4596,43655,19],{},[4596,43657,5012],{},[4591,43659,4609],{},[7077,43661,22822],{},[4591,43663,43664],{},"×",[4596,43666,7132],{},[4596,43668,5025],{},[26080,43670,43671,43674,43676],{},[4596,43672,43673],{},"g",[4596,43675,4618],{},[4596,43677,43678],{},"C",[4596,43680,7132],{},[4596,43682,18038],{},[4596,43684,262],{},[4596,43686,5012],{},[4596,43688,4618],{},[4596,43690,17132],{},[4596,43692,43693],{},"S",[4596,43695,39],{},[4596,43697,25949],{},[4596,43699,4618],{},[4587,43701,43702],{},"，比如集群规模为",[7077,43704,37759],{},[4587,43706,43707],{},"台时，此参数设置为",[7077,43709,43710],{},"41",[4587,43712,67],{},[4647,43714,43715],{"encoding":4649},"dfs.namenode.handler.count=20 × log_e^ClusterSize，比如集群规模为8台时，此参数设置为41。",[78,43717,43719,43796,43814],{"className":43718,"ariaHidden":1419},[4654],[78,43720,43722,43726,43730,43733,43736,43740,43743,43746,43749,43752,43755,43758,43762,43765,43768,43771,43774,43778,43781,43784,43787,43790,43793],{"className":43721},[4658],[78,43723],{"className":43724,"style":43725},[4662],"height:0.8889em;vertical-align:-0.1944em;",[78,43727,43729],{"className":43728,"style":5170},[4667,4678],"df",[78,43731,262],{"className":43732},[4667,4678],[78,43734,21291],{"className":43735},[4667],[78,43737,43739],{"className":43738},[4667,4678],"nam",[78,43741,4618],{"className":43742},[4667,4678],[78,43744,19],{"className":43745},[4667,4678],[78,43747,5025],{"className":43748},[4667,4678],[78,43750,5245],{"className":43751},[4667,4678],[78,43753,4618],{"className":43754},[4667,4678],[78,43756,21291],{"className":43757},[4667],[78,43759,43761],{"className":43760},[4667,4678],"han",[78,43763,5245],{"className":43764},[4667,4678],[78,43766,7132],{"className":43767,"style":7300},[4667,4678],[78,43769,18081],{"className":43770,"style":17251},[4667,4678],[78,43772,21291],{"className":43773},[4667],[78,43775,43777],{"className":43776},[4667,4678],"co",[78,43779,18038],{"className":43780},[4667,4678],[78,43782,19],{"className":43783},[4667,4678],[78,43785,5012],{"className":43786},[4667,4678],[78,43788],{"className":43789,"style":4740},[4739],[78,43791,4609],{"className":43792},[4744],[78,43794],{"className":43795,"style":4740},[4739],[78,43797,43799,43802,43805,43808,43811],{"className":43798},[4658],[78,43800],{"className":43801,"style":17949},[4662],[78,43803,22822],{"className":43804},[4667],[78,43806],{"className":43807,"style":5143},[4739],[78,43809,43664],{"className":43810},[7450],[78,43812],{"className":43813,"style":5143},[4739],[78,43815,43817,43821,43824,43827,43879,43882,43885,43888,43891,43894,43897,43900,43904,43907,43910,43913,43916,43919],{"className":43816},[4658],[78,43818],{"className":43819,"style":43820},[4662],"height:1.1383em;vertical-align:-0.247em;",[78,43822,7132],{"className":43823,"style":7300},[4667,4678],[78,43825,5025],{"className":43826},[4667,4678],[78,43828,43830,43833],{"className":43829},[4667],[78,43831,43673],{"className":43832,"style":5187},[4667,4678],[78,43834,43836],{"className":43835},[4689],[78,43837,43839,43871],{"className":43838},[4693,4694],[78,43840,43842,43868],{"className":43841},[4698],[78,43843,43845,43857],{"className":43844,"style":5206},[4702],[78,43846,43848,43851],{"style":43847},"top:-2.453em;margin-left:-0.0359em;margin-right:0.05em;",[78,43849],{"className":43850,"style":4711},[4710],[78,43852,43854],{"className":43853},[4715,4716,4717,4718],[78,43855,4618],{"className":43856},[4667,4678,4718],[78,43858,43859,43862],{"style":5209},[78,43860],{"className":43861,"style":4711},[4710],[78,43863,43865],{"className":43864},[4715,4716,4717,4718],[78,43866,43678],{"className":43867,"style":5133},[4667,4678,4718],[78,43869,4726],{"className":43870},[4725],[78,43872,43874],{"className":43873},[4698],[78,43875,43877],{"className":43876,"style":26326},[4702],[78,43878],{},[78,43880,7132],{"className":43881,"style":7300},[4667,4678],[78,43883,18038],{"className":43884},[4667,4678],[78,43886,262],{"className":43887},[4667,4678],[78,43889,5012],{"className":43890},[4667,4678],[78,43892,18081],{"className":43893,"style":17251},[4667,4678],[78,43895,43693],{"className":43896,"style":7153},[4667,4678],[78,43898,39],{"className":43899},[4667,4678],[78,43901,25949],{"className":43902,"style":43903},[4667,4678],"margin-right:0.044em;",[78,43905,4618],{"className":43906},[4667,4678],[78,43908,43702],{"className":43909},[4667,6184],[78,43911,37759],{"className":43912},[4667],[78,43914,43707],{"className":43915},[4667,6184],[78,43917,43710],{"className":43918},[4667],[78,43920,67],{"className":43921},[4667,6184],[52,43923,43924,43925],{},"yarn-site.xml",[49,43926,43927,43930],{},[52,43928,43929],{},"数据统计主要用HiveSQL，没有数据倾斜，小文件已经做了合并处理，开启的JVM重用，而且IO没有阻塞，内存用了不到50%。但是还是跑的非常慢，而且数据量洪峰过来时，整个集群都会宕掉。",[52,43931,43932,43933],{},"内存利用率不够。这个一般是Yarn的2个配置造成的，单个任务可以申请的最大内存大小，和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。",[114,43934,43937],{"className":43935,"code":43936,"language":299},[297],"（a）yarn.nodemanager.resource.memory-mb\n表示该节点上YARN可使用的物理内存总量，默认是8192（MB），注意，如果你的节点内存资源不够8GB，则需要调减小这个值，而YARN不会智能的探测节点的物理内存总量。\n（b）yarn.scheduler.maximum-allocation-mb\n单个任务可申请的最多物理内存量，默认是8192（MB）。\n",[17,43938,43936],{"__ignoreMap":119},[7759,43940,43942],{"id":43941},"_2zookeeper","2、Zookeeper",[13,43944,43945],{},"ZooKeeper是一个分布式的，开放源码的分布式应用程序协调服务，它包含一个简单的原语集，分布式应用程序可以基于它实现同步服务，配置维护和命名服务等。ZooKeeper作为一个分布式的服务框架，主要用来解决分布式集群中应用系统的一致性问题，它能提供基于类似于文件系统的目录节点树方式的数据存储，Zookeeper作用主要是用来维护和监控存储的数据的状态变化，通过监控这些数据状态的变化，从而达到基于数据的集群管理。",[10548,43947,43949],{"id":43948},"_1配置流程-1","（1）配置流程",[49,43951,43952,43955,43980],{},[52,43953,43954],{},"配置myid文件，每个服务器上的myid是唯一编号，代表单独的Zookeeper server。",[52,43956,43957,43958],{},"配置*\u002Fconf目录下的zoo_sample.cfg文件",[49,43959,43960,43963,43966],{},[52,43961,43962],{},"改名，去掉sample启用配置",[52,43964,43965],{},"修改数据存储路径，配置到myid对应的目录",[52,43967,43968,43969],{},"增加server.*配置。例：",[114,43970,43974],{"className":43971,"code":43972,"language":43973,"meta":119,"style":119},"language-cfg shiki shiki-themes github-dark","server.2=hadoop102:2888:3888 # .2就是myid中的server编号\n","cfg",[17,43975,43976],{"__ignoreMap":119},[78,43977,43978],{"class":124,"line":125},[78,43979,43972],{},[52,43981,43982],{},"同步配置到其他服务器（一定记得修改myid）",[10548,43984,43986],{"id":43985},"_2常见启停脚本","（2）常见启停脚本",[114,43988,43990],{"className":33493,"code":43989,"language":33495,"meta":119,"style":119},"zkServer.sh start  # 启动Zookeeper\nzkServer.sh status # 查看Zookeeper状态\nzkServer.sh stop   # 停止Zookeeper进程\n",[17,43991,43992,43997,44002],{"__ignoreMap":119},[78,43993,43994],{"class":124,"line":125},[78,43995,43996],{},"zkServer.sh start  # 启动Zookeeper\n",[78,43998,43999],{"class":124,"line":132},[78,44000,44001],{},"zkServer.sh status # 查看Zookeeper状态\n",[78,44003,44004],{"class":124,"line":138},[78,44005,44006],{},"zkServer.sh stop   # 停止Zookeeper进程\n",[7759,44008,44010],{"id":44009},"_3kafka","3、Kafka",[13,44012,44013],{},"Kafka是一种高吞吐量的分布式发布订阅消息系统，它可以处理消费者在网站中的所有动作流数据。Kafka最初由LinkedIn公司发布，使用Scala语言编写，与2010年12月份开源，成为Apache的顶级子项目。",[13,44015,44016],{},"Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统。它可以在廉价的PC Server上搭建起大规模消息系统。",[10548,44018,43949],{"id":44019},"_1配置流程-2",[49,44021,44022,44035],{},[52,44023,44024,44025],{},"配置*\u002Fconfig\u002F目录下的server.properties文件",[49,44026,44027],{},[52,44028,44029],{},[114,44030,44033],{"className":44031,"code":44032,"language":299},[297],"#broker的全局唯一编号，不能重复，只能是数字。每个服务器上的数字不能一样。\nbroker.id=0\n#kafka运行日志(数据)存放的路径，路径不需要提前创建，kafka自动帮你创建，可以配置多个磁盘路径，路径与路径之间可以用\",\"分隔\nlog.dirs=\u002Fopt\u002Fmodule\u002Fkafka\u002Fdatas\n#配置连接Zookeeper集群地址（在zk根目录下创建\u002Fkafka，方便管理）\nzookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181\u002Fkafka\n",[17,44034,44032],{"__ignoreMap":119},[52,44036,44037],{},"分发软件包，记得修改broker.id",[10548,44039,43986],{"id":44040},"_2常见启停脚本-1",[114,44042,44044],{"className":33493,"code":44043,"language":33495,"meta":119,"style":119},"# 配置过zookeeper.connect之后需要先启动Zookeeper服务\nkafka-server-start.sh -daemon config\u002Fserver.properties  # 根据配置文件启动Kafka\nkafka-server-stop.sh                                    # 关闭Kafka\n",[17,44045,44046,44051,44056],{"__ignoreMap":119},[78,44047,44048],{"class":124,"line":125},[78,44049,44050],{},"# 配置过zookeeper.connect之后需要先启动Zookeeper服务\n",[78,44052,44053],{"class":124,"line":132},[78,44054,44055],{},"kafka-server-start.sh -daemon config\u002Fserver.properties  # 根据配置文件启动Kafka\n",[78,44057,44058],{"class":124,"line":138},[78,44059,44060],{},"kafka-server-stop.sh                                    # 关闭Kafka\n",[10548,44062,44064],{"id":44063},"_3常见命令行操作","（3）常见命令行操作",[49,44066,44067,44182,44225],{},[52,44068,44069,44070],{},"主题命令操作",[49,44071,44072,44078],{},[52,44073,44074,44075,44077],{},"Kafka中的数据单元是消息，可以把它当作数据库里的一行“数据”或者一条“记录”来理解。Kafka通过主题来进行分类，主题就好比数据库中的表，每个主题包含多个分区，分区可以分布在不同的服务器上，也就是说通过这种方式来实现分布式数据的存储和读取。",[2996,44076],{},"主题是Kafka中的基础概念，是一切消息处理的基础。主题属于Kafka元数据的一部分，会存储在Zookeeper中。生产者发布消息到某一特定主题上，由消费者去消费特定主题的消息。消费者可以订阅一个或多个主题。",[52,44079,44080,44089],{},[114,44081,44083],{"className":33493,"code":44082,"language":33495,"meta":119,"style":119},"kafka-topics.sh  # 查看操作命令主题\n",[17,44084,44085],{"__ignoreMap":119},[78,44086,44087],{"class":124,"line":125},[78,44088,44082],{},[8366,44090,44091,44100],{},[8369,44092,44093],{},[8372,44094,44095,44098],{},[8375,44096,44097],{},"参数",[8375,44099,9251],{},[8386,44101,44102,44110,44118,44126,44134,44142,44150,44158,44166,44174],{},[8372,44103,44104,44107],{},[8391,44105,44106],{},"--bootstrap-server \u003CString: server toconnect to>",[8391,44108,44109],{},"连接的Kafka Broker主机名称和端口号。",[8372,44111,44112,44115],{},[8391,44113,44114],{},"--topic \u003CString: topic>",[8391,44116,44117],{},"操作的topic名称。",[8372,44119,44120,44123],{},[8391,44121,44122],{},"--create",[8391,44124,44125],{},"创建主题。",[8372,44127,44128,44131],{},[8391,44129,44130],{},"--delete",[8391,44132,44133],{},"删除主题。",[8372,44135,44136,44139],{},[8391,44137,44138],{},"--alter",[8391,44140,44141],{},"修改主题。",[8372,44143,44144,44147],{},[8391,44145,44146],{},"--list",[8391,44148,44149],{},"查看所有主题。",[8372,44151,44152,44155],{},[8391,44153,44154],{},"--describe",[8391,44156,44157],{},"查看主题详细描述。",[8372,44159,44160,44163],{},[8391,44161,44162],{},"--partitions \u003CInteger: # of partitions>",[8391,44164,44165],{},"设置分区数。",[8372,44167,44168,44171],{},[8391,44169,44170],{},"--replication-factor\u003CInteger: replication factor>",[8391,44172,44173],{},"设置分区副本。",[8372,44175,44176,44179],{},[8391,44177,44178],{},"--config \u003CString: name=value>",[8391,44180,44181],{},"更新系统默认的配置。",[52,44183,44184,44185],{},"生产者命令操作",[49,44186,44187,44190],{},[52,44188,44189],{},"Kafka生产者是指向Kafka集群发送消息的客户端应用程序。生产者将消息封装成一个ProducerRecord向Kafka集群中的某个主题发送消息。发送的消息首先会经过序列化器进行序列化，以便在网络中传输。发送的消息需要经过分区器来决定该消息会分发到主题对应的分区，当然如果指定了分区，那么就不需要分区器来决定。",[52,44191,44192,44201],{},[114,44193,44195],{"className":33493,"code":44194,"language":33495,"meta":119,"style":119},"kafka-console-producer.sh  # 查看操作生产者\n",[17,44196,44197],{"__ignoreMap":119},[78,44198,44199],{"class":124,"line":125},[78,44200,44194],{},[8366,44202,44203,44211],{},[8369,44204,44205],{},[8372,44206,44207,44209],{},[8375,44208,44097],{},[8375,44210,9251],{},[8386,44212,44213,44219],{},[8372,44214,44215,44217],{},[8391,44216,44106],{},[8391,44218,44109],{},[8372,44220,44221,44223],{},[8391,44222,44114],{},[8391,44224,44117],{},[52,44226,44227,44228],{},"消费者命令操作",[49,44229,44230,44233],{},[52,44231,44232],{},"Kafka消费者是指从Kafka集群中读取消息的客户端应用程序。消费者将从一个或多个主题订阅消息，并在消费者组中进行组织。当多个消费者形成一个消费组来消费主题时，每个消费者会收到不同分区的消息。消费者可以控制消息的读取位置，从而实现对消息的重复读取或跳过。",[52,44234,44235,44244],{},[114,44236,44238],{"className":33493,"code":44237,"language":33495,"meta":119,"style":119},"kafka-console-consumer.sh  # 查看操作消费者\n",[17,44239,44240],{"__ignoreMap":119},[78,44241,44242],{"class":124,"line":125},[78,44243,44237],{},[8366,44245,44246,44254],{},[8369,44247,44248],{},[8372,44249,44250,44252],{},[8375,44251,44097],{},[8375,44253,9251],{},[8386,44255,44256,44262,44268,44276],{},[8372,44257,44258,44260],{},[8391,44259,44106],{},[8391,44261,44109],{},[8372,44263,44264,44266],{},[8391,44265,44114],{},[8391,44267,44117],{},[8372,44269,44270,44273],{},[8391,44271,44272],{},"--from-beginning",[8391,44274,44275],{},"从头开始消费。",[8372,44277,44278,44281],{},[8391,44279,44280],{},"--group \u003CString: consumer group id>",[8391,44282,44283],{},"指定消费者组名称。",[7759,44285,44287],{"id":44286},"_4flume","4、Flume",[13,44289,44290],{},"Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。它的主要作用是将数据从各种数据源（如Web服务器）收集到Hadoop的HDFS中，或者将数据从一个地方传输到另一个地方。Flume的核心概念包括：Source、Channel和Sink。Source是数据源，可以是Avro、Thrift、JMS、Netcat、Exec等；Channel是缓存区，用于存储Source产生的数据；Sink是数据目的地，可以是HDFS、HBase、Solr、Elasticsearch等。",[49,44292,44293],{},[52,44294,44295],{},"删除lib目录下的guava.jar以兼容Hadoop",[10548,44297,44299],{"id":44298},"_1整体流程","（1）整体流程",[13,44301,44302],{},"日志采集Flume需要采集日志文件内容，并对日志格式（JSON）进行校验，然后将校验通过的日志发送到Kafka。此处可选择TaildirSource和KafkaChannel，并配置日志校验拦截器。",[49,44304,44305,44319],{},[52,44306,44307,44308],{},"TailDirSource相比ExecSource、SpoolingDirectorySource的优势\n",[49,44309,44310,44313,44316],{},[52,44311,44312],{},"TailDirSource：断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置，实现断点续传。",[52,44314,44315],{},"ExecSource可以实时搜集数据，但是在Flume不运行或者Shell命令出错的情况下，数据将会丢失。",[52,44317,44318],{},"SpoolingDirectorySource监控目录，支持断点续传。",[52,44320,44321,44322],{},"Kafka Channel\n",[49,44323,44324],{},[52,44325,44326],{},"采用Kafka Channel，省去了Sink，提高了效率。",[72,44328,44329],{},[13,44330,44331],{},"Flume执行job实现日志的采集，因此无需就行过多的原生配置，只需要针对每个任务写对应的job即可。",[10548,44333,44335],{"id":44334},"_2配置实操","（2）配置实操",[114,44337,44341],{"className":44338,"code":44339,"language":44340,"meta":119,"style":119},"language-conf shiki shiki-themes github-dark","# job\u002Ffile_to_kafka.conf\n# 定义组件\na1.sources = r1\na1.channels = c1\n\n# 配置source\na1.sources.r1.type = TAILDIR\na1.sources.r1.filegroups = f1\na1.sources.r1.filegroups.f1 = \u002Fopt\u002Fmodule\u002Fapplog\u002Flog\u002Fapp.*\na1.sources.r1.positionFile = \u002Fopt\u002Fmodule\u002Fflume\u002Ftaildir_position.json\na1.sources.r1.interceptors =  i1\na1.sources.r1.interceptors.i1.type = xxx.ETLInterceptor$Builder  # 自定义拦截器jar包\n\n# 配置channel\na1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel\na1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092\na1.channels.c1.kafka.topic = topic_log\na1.channels.c1.parseAsFlumeEvent = false\n\n# 组装 \na1.sources.r1.channels = c1\n","conf",[17,44342,44343,44348,44353,44358,44363,44367,44372,44377,44382,44387,44392,44397,44402,44406,44411,44416,44421,44426,44431,44435,44440],{"__ignoreMap":119},[78,44344,44345],{"class":124,"line":125},[78,44346,44347],{},"# job\u002Ffile_to_kafka.conf\n",[78,44349,44350],{"class":124,"line":132},[78,44351,44352],{},"# 定义组件\n",[78,44354,44355],{"class":124,"line":138},[78,44356,44357],{},"a1.sources = r1\n",[78,44359,44360],{"class":124,"line":144},[78,44361,44362],{},"a1.channels = c1\n",[78,44364,44365],{"class":124,"line":150},[78,44366,129],{"emptyLinePlaceholder":128},[78,44368,44369],{"class":124,"line":156},[78,44370,44371],{},"# 配置source\n",[78,44373,44374],{"class":124,"line":162},[78,44375,44376],{},"a1.sources.r1.type = TAILDIR\n",[78,44378,44379],{"class":124,"line":168},[78,44380,44381],{},"a1.sources.r1.filegroups = f1\n",[78,44383,44384],{"class":124,"line":174},[78,44385,44386],{},"a1.sources.r1.filegroups.f1 = \u002Fopt\u002Fmodule\u002Fapplog\u002Flog\u002Fapp.*\n",[78,44388,44389],{"class":124,"line":180},[78,44390,44391],{},"a1.sources.r1.positionFile = \u002Fopt\u002Fmodule\u002Fflume\u002Ftaildir_position.json\n",[78,44393,44394],{"class":124,"line":186},[78,44395,44396],{},"a1.sources.r1.interceptors =  i1\n",[78,44398,44399],{"class":124,"line":192},[78,44400,44401],{},"a1.sources.r1.interceptors.i1.type = xxx.ETLInterceptor$Builder  # 自定义拦截器jar包\n",[78,44403,44404],{"class":124,"line":198},[78,44405,129],{"emptyLinePlaceholder":128},[78,44407,44408],{"class":124,"line":204},[78,44409,44410],{},"# 配置channel\n",[78,44412,44413],{"class":124,"line":210},[78,44414,44415],{},"a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel\n",[78,44417,44418],{"class":124,"line":216},[78,44419,44420],{},"a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092\n",[78,44422,44423],{"class":124,"line":222},[78,44424,44425],{},"a1.channels.c1.kafka.topic = topic_log\n",[78,44427,44428],{"class":124,"line":421},[78,44429,44430],{},"a1.channels.c1.parseAsFlumeEvent = false\n",[78,44432,44433],{"class":124,"line":427},[78,44434,129],{"emptyLinePlaceholder":128},[78,44436,44437],{"class":124,"line":433},[78,44438,44439],{},"# 组装 \n",[78,44441,44442],{"class":124,"line":2443},[78,44443,44444],{},"a1.sources.r1.channels = c1\n",[114,44446,44448],{"className":33493,"code":44447,"language":33495,"meta":119,"style":119},"flume-ng agent -n a1 -c conf\u002F -f job\u002Ffile_to_kafka.conf -Dflume.root.logger=info,console\n# 这段代码是用于启动Flume的命令行。其中，`flume-ng`是启动Flume的命令，`agent`表示启动的是一个agent，`-n a1`表示agent的名称为a1，`-c conf\u002F`表示配置文件所在的目录为conf，`-f job\u002Ffile_to_kafka.conf`表示使用名为file_to_kafka.conf的配置文件，`-Dflume.root.logger=info,console`表示设置日志级别为info，并将日志输出到控制台。\n",[17,44449,44450,44455],{"__ignoreMap":119},[78,44451,44452],{"class":124,"line":125},[78,44453,44454],{},"flume-ng agent -n a1 -c conf\u002F -f job\u002Ffile_to_kafka.conf -Dflume.root.logger=info,console\n",[78,44456,44457],{"class":124,"line":132},[78,44458,44459],{},"# 这段代码是用于启动Flume的命令行。其中，`flume-ng`是启动Flume的命令，`agent`表示启动的是一个agent，`-n a1`表示agent的名称为a1，`-c conf\u002F`表示配置文件所在的目录为conf，`-f job\u002Ffile_to_kafka.conf`表示使用名为file_to_kafka.conf的配置文件，`-Dflume.root.logger=info,console`表示设置日志级别为info，并将日志输出到控制台。\n",[7759,44461,44463],{"id":44462},"_5mysql","5、MySQL",[10548,44465,44466],{"id":44466},"配置流程",[49,44468,44469,44472,44475,44478],{},[52,44470,44471],{},"安装MySQL依赖",[52,44473,44474],{},"安装mysql-client",[52,44476,44477],{},"安装mysql-server",[52,44479,44480,44481],{},"配置MySQL\n",[49,44482,44483,44486,44489],{},[52,44484,44485],{},"设置复杂密码",[52,44487,44488],{},"更改MySQL密码策略",[52,44490,44491],{},"设置简单密码",[7759,44493,44495],{"id":44494},"_6maxwell","6、Maxwell",[13,44497,44498],{},"Maxwell是一个能实时读取MySQL二进制日志binlog，并生成 JSON 格式的消息，作为生产者发送给 Kafka、Kinesis、RabbitMQ、Redis、Google Cloud Pub\u002FSub、文件或其它平台的应用程序³。它的主要作用是将MySQL数据库中的数据变更事件转换成JSON格式的消息，以便于在分布式系统中进行数据同步。Maxwell可以通过配置文件来指定需要同步的表，以及需要过滤掉的字段等信息。",[13,44500,44501],{},"**原理：**将自己伪装成slave，并遵循MySQL主从复制的协议，从master同步数据。",[10548,44503,43949],{"id":44504},"_1配置流程-3",[49,44506,44507,44601],{},[52,44508,44509,44510],{},"修改MySQL配置，启用Binglog日志（默认不开启）后重启MySQL服务。",[49,44511,44512,44570,44596],{},[52,44513,44514],{},[114,44515,44519],{"className":44516,"code":44517,"language":44518,"meta":119,"style":119},"language-cnf shiki shiki-themes github-dark","[mysqld]\n\n#数据库id\nserver-id = 1\n#启动binlog，该参数的值会作为binlog的文件名\nlog-bin=mysql-bin\n#binlog类型，maxwell要求为row类型\nbinlog_format=row\n#启用binlog的数据库，需根据实际情况作出修改\nbinlog-do-db=gmall\n","cnf",[17,44520,44521,44526,44530,44535,44540,44545,44550,44555,44560,44565],{"__ignoreMap":119},[78,44522,44523],{"class":124,"line":125},[78,44524,44525],{},"[mysqld]\n",[78,44527,44528],{"class":124,"line":132},[78,44529,129],{"emptyLinePlaceholder":128},[78,44531,44532],{"class":124,"line":138},[78,44533,44534],{},"#数据库id\n",[78,44536,44537],{"class":124,"line":144},[78,44538,44539],{},"server-id = 1\n",[78,44541,44542],{"class":124,"line":150},[78,44543,44544],{},"#启动binlog，该参数的值会作为binlog的文件名\n",[78,44546,44547],{"class":124,"line":156},[78,44548,44549],{},"log-bin=mysql-bin\n",[78,44551,44552],{"class":124,"line":162},[78,44553,44554],{},"#binlog类型，maxwell要求为row类型\n",[78,44556,44557],{"class":124,"line":168},[78,44558,44559],{},"binlog_format=row\n",[78,44561,44562],{"class":124,"line":174},[78,44563,44564],{},"#启用binlog的数据库，需根据实际情况作出修改\n",[78,44566,44567],{"class":124,"line":180},[78,44568,44569],{},"binlog-do-db=gmall\n",[52,44571,44572,44573],{},"几种常见的Binlog模式",[49,44574,44575,44584,44593],{},[52,44576,44577,44578,44580,44581,44583],{},"**Statement-based：**基于语句，Binlog会记录所有写操作的SQL语句，包括insert、update、delete等。",[2996,44579],{},"优点： 节省空间",[2996,44582],{},"缺点： 有可能造成数据不一致，例如insert语句中包含now()函数。",[52,44585,44586,44587,44589,44590,44592],{},"**Row-based：**基于行，Binlog会记录每次写操作后被操作行记录的变化。",[2996,44588],{},"优点：保持数据的绝对一致性。",[2996,44591],{},"缺点：占用较大空间。",[52,44594,44595],{},"**mixed：**混合模式，默认是Statement-based，如果SQL语句可能导致数据不一致，就自动切换到Row-based。",[52,44597,44598],{},[22,44599,44600],{},"Maxwell要求Binlog采用Row-based模式。",[52,44602,44603,44604],{},"配置maxwell目录下的config.properties.example文件（元数据库、生产者、集群配置）",[49,44605,44606,44609],{},[52,44607,44608],{},"重命名为config.properties",[52,44610,44611],{},[114,44612,44616],{"className":44613,"code":44614,"language":44615,"meta":119,"style":119},"language-properties shiki shiki-themes github-dark","#Maxwell数据发送目的地，可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis\nproducer=kafka\n#目标Kafka集群地址\nkafka.bootstrap.servers=hadoop102:9092,hadoop103:9092\n#目标Kafka topic，可静态配置，例如:maxwell，也可动态配置，例如：%{database}_%{table}\nkafka_topic=maxwell\n\n#MySQL相关配置\nhost=hadoop102\nuser=maxwell\npassword=maxwell\njdbc_options=useSSL=false&serverTimezone=Asia\u002FShanghai\n","properties",[17,44617,44618,44623,44628,44633,44638,44643,44648,44652,44657,44662,44667,44672],{"__ignoreMap":119},[78,44619,44620],{"class":124,"line":125},[78,44621,44622],{},"#Maxwell数据发送目的地，可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis\n",[78,44624,44625],{"class":124,"line":132},[78,44626,44627],{},"producer=kafka\n",[78,44629,44630],{"class":124,"line":138},[78,44631,44632],{},"#目标Kafka集群地址\n",[78,44634,44635],{"class":124,"line":144},[78,44636,44637],{},"kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092\n",[78,44639,44640],{"class":124,"line":150},[78,44641,44642],{},"#目标Kafka topic，可静态配置，例如:maxwell，也可动态配置，例如：%{database}_%{table}\n",[78,44644,44645],{"class":124,"line":156},[78,44646,44647],{},"kafka_topic=maxwell\n",[78,44649,44650],{"class":124,"line":162},[78,44651,129],{"emptyLinePlaceholder":128},[78,44653,44654],{"class":124,"line":168},[78,44655,44656],{},"#MySQL相关配置\n",[78,44658,44659],{"class":124,"line":174},[78,44660,44661],{},"host=hadoop102\n",[78,44663,44664],{"class":124,"line":180},[78,44665,44666],{},"user=maxwell\n",[78,44668,44669],{"class":124,"line":186},[78,44670,44671],{},"password=maxwell\n",[78,44673,44674],{"class":124,"line":192},[78,44675,44676],{},"jdbc_options=useSSL=false&serverTimezone=Asia\u002FShanghai\n",[10548,44678,43986],{"id":44679},"_2常见启停脚本-2",[114,44681,44683],{"className":33493,"code":44682,"language":33495,"meta":119,"style":119},"maxwell --config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties --daemon                         # 启动maxwell\nps -ef | grep maxwell | grep -v grep | grep maxwell | awk '{print $2}' | xargs kill -9  # 停止maxwell\n```\n\n###### （3）增量同步和全量同步\n\n",[17,44684,44685,44690,44695,44700,44704],{"__ignoreMap":119},[78,44686,44687],{"class":124,"line":125},[78,44688,44689],{},"maxwell --config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties --daemon                         # 启动maxwell\n",[78,44691,44692],{"class":124,"line":132},[78,44693,44694],{},"ps -ef | grep maxwell | grep -v grep | grep maxwell | awk '{print $2}' | xargs kill -9  # 停止maxwell\n",[78,44696,44697],{"class":124,"line":138},[78,44698,44699],{},"```\n",[78,44701,44702],{"class":124,"line":144},[78,44703,129],{"emptyLinePlaceholder":128},[78,44705,44706],{"class":124,"line":150},[78,44707,44708],{},"###### （3）增量同步和全量同步\n",[49,44710,44711,44714],{},[52,44712,44713],{},"增量同步：启用Kafka消费者、maxwell，Mock业务数据即可在Kafka中观察到生成的数据；",[52,44715,44716,44717],{},"全量同步：",[49,44718,44719,44722],{},[52,44720,44721],{},"Maxwell提供了bootstrap功能来进行历史数据的全量同步，输出结果为Json格式",[52,44723,44724],{},[114,44725,44727],{"className":33493,"code":44726,"language":33495,"meta":119,"style":119},"maxwell-bootstrap --database gmall --table user_info --config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties\n# 这段代码是在运行maxwell-bootstrap命令，它会将gmall数据库中的user_info表的数据导入到另一个数据库中。其中，--config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties是指定了配置文件的路径。\n",[17,44728,44729,44734],{"__ignoreMap":119},[78,44730,44731],{"class":124,"line":125},[78,44732,44733],{},"maxwell-bootstrap --database gmall --table user_info --config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties\n",[78,44735,44736],{"class":124,"line":132},[78,44737,44738],{},"# 这段代码是在运行maxwell-bootstrap命令，它会将gmall数据库中的user_info表的数据导入到另一个数据库中。其中，--config \u002Fopt\u002Fmodule\u002Fmaxwell\u002Fconfig.properties是指定了配置文件的路径。\n",[7759,44740,44742],{"id":44741},"_7datax","7、DataX",[13,44744,44745,44746],{},"DataX 是阿里巴巴开源的一个异构数据源离线同步工具，致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。源码地址：",[5009,44747,44748],{"href":44748,"rel":44749},"https:\u002F\u002Fgithub.com\u002Falibaba\u002FDataX",[23647],[13,44751,44752],{},"为了解决异构数据源同步问题，DataX将复杂的网状的同步链路变成了星型数据链路，DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候，只需要将此数据源对接到DataX，便能跟已有的数据源做到无缝数据同步。",[10548,44754,43949],{"id":44755},"_1配置流程-4",[49,44757,44758],{},[52,44759,44760,44761],{},"解压自检",[49,44762,44763],{},[52,44764,44765],{},[114,44766,44768],{"className":33493,"code":44767,"language":33495,"meta":119,"style":119},"python \u002Fopt\u002Fmodule\u002Fdatax\u002Fbin\u002Fdatax.py \u002Fopt\u002Fmodule\u002Fdatax\u002Fjob\u002Fjob.json\n\n# 出现如下反馈代表安装成功\n……\n2021-10-12 21:51:12.335 [job-0] INFO  JobContainer - \n任务启动时刻                    : 2021-10-12 21:51:02\n任务结束时刻                    : 2021-10-12 21:51:12\n任务总计耗时                    :                 10s\n任务平均流量                    :          253.91KB\u002Fs\n记录写入速度                    :          10000rec\u002Fs\n读出记录总数                    :              100000\n读写失败总数                    :                   0\n",[17,44769,44770,44775,44779,44784,44789,44794,44799,44804,44809,44814,44819,44824],{"__ignoreMap":119},[78,44771,44772],{"class":124,"line":125},[78,44773,44774],{},"python \u002Fopt\u002Fmodule\u002Fdatax\u002Fbin\u002Fdatax.py \u002Fopt\u002Fmodule\u002Fdatax\u002Fjob\u002Fjob.json\n",[78,44776,44777],{"class":124,"line":132},[78,44778,129],{"emptyLinePlaceholder":128},[78,44780,44781],{"class":124,"line":138},[78,44782,44783],{},"# 出现如下反馈代表安装成功\n",[78,44785,44786],{"class":124,"line":144},[78,44787,44788],{},"……\n",[78,44790,44791],{"class":124,"line":150},[78,44792,44793],{},"2021-10-12 21:51:12.335 [job-0] INFO  JobContainer - \n",[78,44795,44796],{"class":124,"line":156},[78,44797,44798],{},"任务启动时刻                    : 2021-10-12 21:51:02\n",[78,44800,44801],{"class":124,"line":162},[78,44802,44803],{},"任务结束时刻                    : 2021-10-12 21:51:12\n",[78,44805,44806],{"class":124,"line":168},[78,44807,44808],{},"任务总计耗时                    :                 10s\n",[78,44810,44811],{"class":124,"line":174},[78,44812,44813],{},"任务平均流量                    :          253.91KB\u002Fs\n",[78,44815,44816],{"class":124,"line":180},[78,44817,44818],{},"记录写入速度                    :          10000rec\u002Fs\n",[78,44820,44821],{"class":124,"line":186},[78,44822,44823],{},"读出记录总数                    :              100000\n",[78,44825,44826],{"class":124,"line":192},[78,44827,44828],{},"读写失败总数                    :                   0\n",[10548,44830,44832],{"id":44831},"_2配置说明","（2）配置说明",[13,44834,44835],{},"配置文件模板为json，json最外层是一个job，job包含setting和content两部分，其中setting用于对整个job进行配置，content用户配置数据源和目的地。",[13,44837,44838],{},[617,44839],{"alt":119,"src":44840},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F1.png",[10548,44842,44844],{"id":44843},"_3datax优化","（3）DataX优化",[13,44846,44847],{},"DataX3.0提供了包括通道(并发)、记录流、字节流三种流控模式，可以随意控制你的作业速度，让你的作业在数据库可以承受的范围内达到最佳的同步速度。",[8366,44849,44850,44858],{},[8369,44851,44852],{},[8372,44853,44854,44856],{},[8375,44855,44097],{},[8375,44857,42815],{},[8386,44859,44860,44868,44876,44884,44892],{},[8372,44861,44862,44865],{},[8391,44863,44864],{},"job.setting.speed.channel",[8391,44866,44867],{},"并发数",[8372,44869,44870,44873],{},[8391,44871,44872],{},"job.setting.speed.record",[8391,44874,44875],{},"总record限速",[8372,44877,44878,44881],{},[8391,44879,44880],{},"job.setting.speed.byte",[8391,44882,44883],{},"总byte限速",[8372,44885,44886,44889],{},[8391,44887,44888],{},"core.transport.channel.speed.record",[8391,44890,44891],{},"单个channel的record限速，默认值为10000（10000条\u002Fs）",[8372,44893,44894,44897],{},[8391,44895,44896],{},"core.transport.channel.speed.byte",[8391,44898,44899],{},"单个channel的byte限速，默认值1024*1024（1M\u002Fs）",[13,44901,44902],{},[22,44903,44904],{},"注意事项：",[13,44906,44907],{},"1.若配置了总record限速，则必须配置单个channel的record限速",[13,44909,44910],{},"2.若配置了总byte限速，则必须配置单个channe的byte限速",[13,44912,44913],{},"3.若配置了总record限速和总byte限速，channel并发数参数就会失效。因为配置了总record限速和总byte限速之后，实际channel并发数是通过计算得到的：",[13,44915,44916],{},[22,44917,44918],{},"计算公式为:",[13,44920,44921],{},"min(总byte限速\u002F单个channel的byte限速，总record限速\u002F单个channel的record限速)",[7759,44923,44925],{"id":44924},"_8hive","8、Hive",[13,44927,44928],{},"Hive是一个基于Hadoop的数据仓库工具，用于处理结构化数据。它可以将结构化的数据文件映射为一张数据库表，并提供类SQL查询功能。Hive的操作接口采用类SQL语法，提供快速开发的能力，避免了写MapReduce，减少开发人员的学习成本，功能扩展很方便。",[13,44930,44931],{},"你可以使用Hive来进行数据提取、转化、加载，这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。你可以在Hive中使用类SQL语句来查询数据，这些语句会被转换成MapReduce任务来执行。你需要安装Hive并配置它以便使用它。你可以在网上找到很多关于如何使用Hive的教程和指南。",[10548,44933,44466],{"id":44934},"配置流程-1",[49,44936,44937,44940,44943,45215,45218,45230],{},[52,44938,44939],{},"解决日志包冲突，删除lib下的log4j-slf4j-impl.jar包",[52,44941,44942],{},"拷贝对应版本的mysql驱动到lib目录 mysql-connector-java-5.1.27-bin.jar",[52,44944,44945,44946],{},"新建hive-site.xml",[49,44947,44948],{},[52,44949,44950],{},[114,44951,44955],{"className":44952,"code":44953,"language":44954,"meta":119,"style":119},"language-xml shiki shiki-themes github-dark","\u003C?xml version=\"1.0\"?>\n\u003C?xml-stylesheet type=\"text\u002Fxsl\" href=\"configuration.xsl\"?>\n\u003Cconfiguration>\n    \u003Cproperty>\n        \u003Cname>javax.jdo.option.ConnectionURL\u003C\u002Fname>\n        \u003Cvalue>jdbc:mysql:\u002F\u002Fhadoop102:3306\u002Fmetastore?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>javax.jdo.option.ConnectionDriverName\u003C\u002Fname>\n        \u003Cvalue>com.mysql.jdbc.Driver\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>javax.jdo.option.ConnectionUserName\u003C\u002Fname>\n        \u003Cvalue>root\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>javax.jdo.option.ConnectionPassword\u003C\u002Fname>\n        \u003Cvalue>000000\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>hive.metastore.warehouse.dir\u003C\u002Fname>\n        \u003Cvalue>\u002Fuser\u002Fhive\u002Fwarehouse\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>hive.metastore.schema.verification\u003C\u002Fname>\n        \u003Cvalue>false\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n    \u003Cname>hive.server2.thrift.port\u003C\u002Fname>\n    \u003Cvalue>10000\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>hive.server2.thrift.bind.host\u003C\u002Fname>\n        \u003Cvalue>hadoop102\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>hive.metastore.event.db.notification.api.auth\u003C\u002Fname>\n        \u003Cvalue>false\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \n    \u003Cproperty>\n        \u003Cname>hive.cli.print.header\u003C\u002Fname>\n        \u003Cvalue>true\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\n    \u003Cproperty>\n        \u003Cname>hive.cli.print.current.db\u003C\u002Fname>\n        \u003Cvalue>true\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\u003C\u002Fconfiguration>\n","xml",[17,44956,44957,44962,44967,44972,44977,44982,44987,44992,44996,45000,45005,45010,45014,45018,45022,45027,45032,45036,45040,45044,45049,45054,45058,45062,45066,45071,45076,45080,45084,45088,45093,45098,45102,45106,45110,45115,45120,45124,45128,45132,45137,45142,45146,45150,45154,45159,45163,45167,45171,45175,45180,45185,45189,45193,45197,45202,45206,45210],{"__ignoreMap":119},[78,44958,44959],{"class":124,"line":125},[78,44960,44961],{},"\u003C?xml version=\"1.0\"?>\n",[78,44963,44964],{"class":124,"line":132},[78,44965,44966],{},"\u003C?xml-stylesheet type=\"text\u002Fxsl\" href=\"configuration.xsl\"?>\n",[78,44968,44969],{"class":124,"line":138},[78,44970,44971],{},"\u003Cconfiguration>\n",[78,44973,44974],{"class":124,"line":144},[78,44975,44976],{},"    \u003Cproperty>\n",[78,44978,44979],{"class":124,"line":150},[78,44980,44981],{},"        \u003Cname>javax.jdo.option.ConnectionURL\u003C\u002Fname>\n",[78,44983,44984],{"class":124,"line":156},[78,44985,44986],{},"        \u003Cvalue>jdbc:mysql:\u002F\u002Fhadoop102:3306\u002Fmetastore?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8\u003C\u002Fvalue>\n",[78,44988,44989],{"class":124,"line":162},[78,44990,44991],{},"    \u003C\u002Fproperty>\n",[78,44993,44994],{"class":124,"line":168},[78,44995,129],{"emptyLinePlaceholder":128},[78,44997,44998],{"class":124,"line":174},[78,44999,44976],{},[78,45001,45002],{"class":124,"line":180},[78,45003,45004],{},"        \u003Cname>javax.jdo.option.ConnectionDriverName\u003C\u002Fname>\n",[78,45006,45007],{"class":124,"line":186},[78,45008,45009],{},"        \u003Cvalue>com.mysql.jdbc.Driver\u003C\u002Fvalue>\n",[78,45011,45012],{"class":124,"line":192},[78,45013,44991],{},[78,45015,45016],{"class":124,"line":198},[78,45017,129],{"emptyLinePlaceholder":128},[78,45019,45020],{"class":124,"line":204},[78,45021,44976],{},[78,45023,45024],{"class":124,"line":210},[78,45025,45026],{},"        \u003Cname>javax.jdo.option.ConnectionUserName\u003C\u002Fname>\n",[78,45028,45029],{"class":124,"line":216},[78,45030,45031],{},"        \u003Cvalue>root\u003C\u002Fvalue>\n",[78,45033,45034],{"class":124,"line":222},[78,45035,44991],{},[78,45037,45038],{"class":124,"line":421},[78,45039,129],{"emptyLinePlaceholder":128},[78,45041,45042],{"class":124,"line":427},[78,45043,44976],{},[78,45045,45046],{"class":124,"line":433},[78,45047,45048],{},"        \u003Cname>javax.jdo.option.ConnectionPassword\u003C\u002Fname>\n",[78,45050,45051],{"class":124,"line":2443},[78,45052,45053],{},"        \u003Cvalue>000000\u003C\u002Fvalue>\n",[78,45055,45056],{"class":124,"line":2448},[78,45057,44991],{},[78,45059,45060],{"class":124,"line":2454},[78,45061,129],{"emptyLinePlaceholder":128},[78,45063,45064],{"class":124,"line":2460},[78,45065,44976],{},[78,45067,45068],{"class":124,"line":2465},[78,45069,45070],{},"        \u003Cname>hive.metastore.warehouse.dir\u003C\u002Fname>\n",[78,45072,45073],{"class":124,"line":2470},[78,45074,45075],{},"        \u003Cvalue>\u002Fuser\u002Fhive\u002Fwarehouse\u003C\u002Fvalue>\n",[78,45077,45078],{"class":124,"line":2903},[78,45079,44991],{},[78,45081,45082],{"class":124,"line":2909},[78,45083,129],{"emptyLinePlaceholder":128},[78,45085,45086],{"class":124,"line":11477},[78,45087,44976],{},[78,45089,45090],{"class":124,"line":13374},[78,45091,45092],{},"        \u003Cname>hive.metastore.schema.verification\u003C\u002Fname>\n",[78,45094,45095],{"class":124,"line":13380},[78,45096,45097],{},"        \u003Cvalue>false\u003C\u002Fvalue>\n",[78,45099,45100],{"class":124,"line":13386},[78,45101,44991],{},[78,45103,45104],{"class":124,"line":13722},[78,45105,129],{"emptyLinePlaceholder":128},[78,45107,45108],{"class":124,"line":13727},[78,45109,44976],{},[78,45111,45112],{"class":124,"line":13953},[78,45113,45114],{},"    \u003Cname>hive.server2.thrift.port\u003C\u002Fname>\n",[78,45116,45117],{"class":124,"line":13958},[78,45118,45119],{},"    \u003Cvalue>10000\u003C\u002Fvalue>\n",[78,45121,45122],{"class":124,"line":13964},[78,45123,44991],{},[78,45125,45126],{"class":124,"line":13969},[78,45127,129],{"emptyLinePlaceholder":128},[78,45129,45130],{"class":124,"line":24170},[78,45131,44976],{},[78,45133,45134],{"class":124,"line":24175},[78,45135,45136],{},"        \u003Cname>hive.server2.thrift.bind.host\u003C\u002Fname>\n",[78,45138,45139],{"class":124,"line":24180},[78,45140,45141],{},"        \u003Cvalue>hadoop102\u003C\u002Fvalue>\n",[78,45143,45144],{"class":124,"line":24186},[78,45145,44991],{},[78,45147,45148],{"class":124,"line":24192},[78,45149,129],{"emptyLinePlaceholder":128},[78,45151,45152],{"class":124,"line":24198},[78,45153,44976],{},[78,45155,45156],{"class":124,"line":24204},[78,45157,45158],{},"        \u003Cname>hive.metastore.event.db.notification.api.auth\u003C\u002Fname>\n",[78,45160,45161],{"class":124,"line":24210},[78,45162,45097],{},[78,45164,45165],{"class":124,"line":24215},[78,45166,44991],{},[78,45168,45169],{"class":124,"line":24220},[78,45170,6942],{},[78,45172,45173],{"class":124,"line":24226},[78,45174,44976],{},[78,45176,45177],{"class":124,"line":24232},[78,45178,45179],{},"        \u003Cname>hive.cli.print.header\u003C\u002Fname>\n",[78,45181,45182],{"class":124,"line":24238},[78,45183,45184],{},"        \u003Cvalue>true\u003C\u002Fvalue>\n",[78,45186,45187],{"class":124,"line":24244},[78,45188,44991],{},[78,45190,45191],{"class":124,"line":24250},[78,45192,129],{"emptyLinePlaceholder":128},[78,45194,45195],{"class":124,"line":24256},[78,45196,44976],{},[78,45198,45199],{"class":124,"line":24262},[78,45200,45201],{},"        \u003Cname>hive.cli.print.current.db\u003C\u002Fname>\n",[78,45203,45204],{"class":124,"line":24267},[78,45205,45184],{},[78,45207,45208],{"class":124,"line":24273},[78,45209,44991],{},[78,45211,45212],{"class":124,"line":24279},[78,45213,45214],{},"\u003C\u002Fconfiguration>\n",[52,45216,45217],{},"在MySQL创建Hive元数据库metastore",[52,45219,45220,45221],{},"初始化Hive元数据库",[114,45222,45224],{"className":33693,"code":45223,"language":33695,"meta":119,"style":119},"schematool -initSchema -dbType mysql -verbose\n",[17,45225,45226],{"__ignoreMap":119},[78,45227,45228],{"class":124,"line":125},[78,45229,45223],{},[52,45231,45232,45233],{},"修改元数据库字符集",[49,45234,45235,45238],{},[52,45236,45237],{},"Hive元数据库的字符集默认为Latin1，由于其不支持中文字符，故若建表语句中包含中文注释，会出现乱码现象。修改Hive元数据库中存储注释的字段的字符集为utf-8。",[52,45239,45240],{},[114,45241,45243],{"className":33693,"code":45242,"language":33695,"meta":119,"style":119},"alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;\nalter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;\n",[17,45244,45245,45250],{"__ignoreMap":119},[78,45246,45247],{"class":124,"line":125},[78,45248,45249],{},"alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;\n",[78,45251,45252],{"class":124,"line":132},[78,45253,45254],{},"alter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;\n",[7759,45256,45258],{"id":45257},"_9spark","9、Spark",[13,45260,45261],{},"Spark是一个快速的、通用的、基于内存的分布式计算系统，用于大规模数据处理。它是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架，拥有Hadoop MapReduce所具有的优点；但不同于MapReduce的是Job中间输出和结果可以保存在内存中，从而不再需要读写HDFS，因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。",[10548,45263,45265],{"id":45264},"_1兼容性说明","（1）兼容性说明",[13,45267,45268],{},"官网下载的Hive3.1.2和Spark3.0.0默认是不兼容的。因为Hive3.1.2支持的Spark版本是2.4.5，所以需要我们重新编译Hive3.1.2版本。",[13,45270,45271],{},"编译步骤：官网下载Hive3.1.2源码，修改pom文件中引用的Spark版本为3.0.0，如果编译通过，直接打包获取jar包。如果报错，就根据提示，修改相关方法，直到不报错，打包获取jar包。",[72,45273,45274,45277],{},[13,45275,45276],{},"这里我试过了hive4.0.0alpha去兼容jdk11，但是无疾而终（默认启动的是beeline不是hive，这个时候我还没学hive，不太好大刀阔斧上手）。spark也试了从3.0.0到最新版中的几个版本，但是hive没有自编译，所以总会报错。",[13,45278,45279],{},"另外，hadoop版本也要考虑，Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. RPC channel is closed.这个问题在YARN日志报的$GetFileInfoRequestProto无法强制转换为com.google.protobuf.Message，主要就是hadoop版本导致的。",[10548,45281,45283],{"id":45282},"_2配置流程","（2）配置流程",[49,45285,45286,45328,45392],{},[52,45287,45288,45289],{},"在hive中创建spark配置文件",[49,45290,45291],{},[52,45292,45293],{},[114,45294,45296],{"className":44338,"code":45295,"language":44340,"meta":119,"style":119},"# spark-defaults.conf\nspark.master                             yarn\nspark.eventLog.enabled                   true\nspark.eventLog.dir              hdfs:\u002F\u002Fhadoop102:8020\u002Fspark-history\nspark.executor.memory                    1g\nspark.driver.memory                      1g\n",[17,45297,45298,45303,45308,45313,45318,45323],{"__ignoreMap":119},[78,45299,45300],{"class":124,"line":125},[78,45301,45302],{},"# spark-defaults.conf\n",[78,45304,45305],{"class":124,"line":132},[78,45306,45307],{},"spark.master                             yarn\n",[78,45309,45310],{"class":124,"line":138},[78,45311,45312],{},"spark.eventLog.enabled                   true\n",[78,45314,45315],{"class":124,"line":144},[78,45316,45317],{},"spark.eventLog.dir              hdfs:\u002F\u002Fhadoop102:8020\u002Fspark-history\n",[78,45319,45320],{"class":124,"line":150},[78,45321,45322],{},"spark.executor.memory                    1g\n",[78,45324,45325],{"class":124,"line":156},[78,45326,45327],{},"spark.driver.memory                      1g\n",[52,45329,45330,45331],{},"修改hive-site.xml文件，更改为spark引擎",[49,45332,45333],{},[52,45334,45335],{},[114,45336,45338],{"className":44952,"code":45337,"language":44954,"meta":119,"style":119},"\u003C!--Spark依赖位置（注意：端口号8020必须和namenode的端口号一致）-->\n\u003Cproperty>\n    \u003Cname>spark.yarn.jars\u003C\u002Fname>\n    \u003Cvalue>hdfs:\u002F\u002Fhadoop102:8020\u002Fspark-jars\u002F*\u003C\u002Fvalue>\n\u003C\u002Fproperty>\n  \n\u003C!--Hive执行引擎-->\n\u003Cproperty>\n    \u003Cname>hive.execution.engine\u003C\u002Fname>\n    \u003Cvalue>spark\u003C\u002Fvalue>\n\u003C\u002Fproperty>\n",[17,45339,45340,45345,45350,45355,45360,45365,45369,45374,45378,45383,45388],{"__ignoreMap":119},[78,45341,45342],{"class":124,"line":125},[78,45343,45344],{},"\u003C!--Spark依赖位置（注意：端口号8020必须和namenode的端口号一致）-->\n",[78,45346,45347],{"class":124,"line":132},[78,45348,45349],{},"\u003Cproperty>\n",[78,45351,45352],{"class":124,"line":138},[78,45353,45354],{},"    \u003Cname>spark.yarn.jars\u003C\u002Fname>\n",[78,45356,45357],{"class":124,"line":144},[78,45358,45359],{},"    \u003Cvalue>hdfs:\u002F\u002Fhadoop102:8020\u002Fspark-jars\u002F*\u003C\u002Fvalue>\n",[78,45361,45362],{"class":124,"line":150},[78,45363,45364],{},"\u003C\u002Fproperty>\n",[78,45366,45367],{"class":124,"line":156},[78,45368,35371],{},[78,45370,45371],{"class":124,"line":162},[78,45372,45373],{},"\u003C!--Hive执行引擎-->\n",[78,45375,45376],{"class":124,"line":168},[78,45377,45349],{},[78,45379,45380],{"class":124,"line":174},[78,45381,45382],{},"    \u003Cname>hive.execution.engine\u003C\u002Fname>\n",[78,45384,45385],{"class":124,"line":180},[78,45386,45387],{},"    \u003Cvalue>spark\u003C\u002Fvalue>\n",[78,45389,45390],{"class":124,"line":186},[78,45391,45364],{},[52,45393,45394,45395],{},"增加Application Master资源比例",[49,45396,45397,45400],{},[52,45398,45399],{},"修改YARN配置文件yarn-site.xml",[52,45401,45402],{},[114,45403,45406],{"className":45404,"code":45405,"language":299},[297],"\u003Cproperty>\n    \u003Cname>yarn.scheduler.capacity.maximum-am-resource-percent\u003C\u002Fname>\n    \u003Cvalue>0.8\u003C\u002Fvalue>\n\u003C\u002Fproperty\n",[17,45407,45405],{"__ignoreMap":119},[7759,45409,45411],{"id":45410},"_10dolphinscheduler","10、DolphinScheduler",[13,45413,45414],{},"Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系，使调度系统在数据处理流程中开箱即用。",[10548,45416,45418],{"id":45417},"_1核心架构","（1）核心架构",[49,45420,45421,45426,45431,45437,45443,45449],{},[52,45422,45423,45425],{},[22,45424,43189],{},"采用分布式无中心设计理念，MasterServer主要负责 DAG 任务切分、任务提交、任务监控，并同时监听其它MasterServer和WorkerServer的健康状态。",[52,45427,45428,45430],{},[22,45429,43202],{},"也采用分布式无中心设计理念，WorkerServer主要负责任务的执行和提供日志服务。",[52,45432,45433,45436],{},[22,45434,45435],{},"ZooKeeper","服务，系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。",[52,45438,45439,45442],{},[22,45440,45441],{},"Alert","服务，提供告警相关服务。",[52,45444,45445,45448],{},[22,45446,45447],{},"API","接口层，主要负责处理前端UI层的请求。",[52,45450,45451,45454],{},[22,45452,45453],{},"UI","，系统的前端页面，提供系统的各种可视化操作界面。",[10548,45456,45458],{"id":45457},"_2前置准备","（2）前置准备",[49,45460,45461,45464,45467,45470,45473],{},[52,45462,45463],{},"三台节点均需部署JDK（1.8+），并配置相关环境变量。",[52,45465,45466],{},"需部署数据库，支持MySQL（5.7+）或者PostgreSQL（8.2.15+）。如 MySQL 则需要 JDBC Driver 8.0.16。",[52,45468,45469],{},"需部署Zookeeper（3.4.6+）。",[52,45471,45472],{},"如果启用 HDFS 文件系统，则需要 Hadoop（2.6+）环境。",[52,45474,45475],{},"三台节点均需安装进程管理工具包psmisc。",[10548,45477,45479],{"id":45478},"_3配置流程","（3）配置流程",[49,45481,45482,45799],{},[52,45483,45484,45485],{},"配置一键部署脚本",[49,45486,45487],{},[52,45488,45489,45490],{},"修改解压目录下的conf\u002Fconfig目录下的install_config.conf文件",[114,45491,45493],{"className":44338,"code":45492,"language":44340,"meta":119,"style":119},"ips=\"hadoop102,hadoop103,hadoop104\" \n# 将要部署任一 DolphinScheduler 服务的服务器主机名或 ip 列表\n\nmasters=\"hadoop102\" \n# master 所在主机名列表，必须是 ips 的子集\n\nworkers=\"hadoop102:default,hadoop103:default,hadoop104:default\" \n# worker主机名及队列，此处的 ip 必须在 ips 列表中\n\nalertServer=\"hadoop102\"\n# 告警服务所在服务器主机名\n\napiServers=\"hadoop102\"\n# api服务所在服务器主机名\n\ninstallPath=\"\u002Fopt\u002Fmodule\u002Fdolphinscheduler\"\n# DS 安装路径，如果不存在会创建\n\ndeployUser=\"atguigu\"\n# 部署用户，任务执行服务是以 sudo -u {linux-user} 切换不同 Linux 用户的方式来实现多租户运行作业，因此该用户必须有免密的 sudo 权限。\n\njavaHome=\"\u002Fopt\u002Fmodule\u002Fjdk\"\n# JAVA_HOME 路径\n\nDATABASE_TYPE=\"mysql\"\n# 数据库类型\n\nSPRING_DATASOURCE_URL=\"jdbc:mysql:\u002F\u002Fhadoop102:3306\u002Fdolphinscheduler?useUnicode=true&characterEncoding=UTF-8\"\n# 数据库 URL\n\nSPRING_DATASOURCE_USERNAME=\"dolphinscheduler\"\n# 数据库用户名\n\nSPRING_DATASOURCE_PASSWORD=\"dolphinscheduler\"\n# 数据库密码\n\nregistryPluginName=\"zookeeper\"\n# 注册中心插件名称，DS 通过注册中心来确保集群配置的一致性\n\nregistryServers=\"hadoop102:2181,hadoop103:2181,hadoop104:2181\"\n# 注册中心地址，即 Zookeeper 集群的地址\n\nregistryNamespace=\"dolphinscheduler\"\n# DS 在 Zookeeper 的结点名称\n\nresourceStorageType=\"HDFS\"  \n# 资源存储类型\n\nresourceUploadPath=\"\u002Fdolphinscheduler\"\n# 资源上传路径\n\ndefaultFS=\"hdfs:\u002F\u002Fhadoop102:8020\"\n# 默认文件系统\n\nresourceManagerHttpAddressPort=\"8088\"\n# yarn RM http 访问端口\n\nyarnHaIps=\n# Yarn RM 高可用 ip，若未启用 RM 高可用，则将该值置空\n\nsingleYarnIp=\"hadoop103\"\n# Yarn RM 主机名，若启用了 HA 或未启用 RM，保留默认值\n\nhdfsRootUser=\"atguigu\"\n# 拥有 HDFS 根目录操作权限的用户\n",[17,45494,45495,45500,45505,45509,45514,45519,45523,45528,45533,45537,45542,45547,45551,45556,45561,45565,45570,45575,45579,45584,45589,45593,45598,45603,45607,45612,45617,45621,45626,45631,45635,45640,45645,45649,45654,45659,45663,45668,45673,45677,45682,45687,45691,45696,45701,45705,45710,45715,45719,45724,45729,45733,45738,45743,45747,45752,45757,45761,45766,45771,45775,45780,45785,45789,45794],{"__ignoreMap":119},[78,45496,45497],{"class":124,"line":125},[78,45498,45499],{},"ips=\"hadoop102,hadoop103,hadoop104\" \n",[78,45501,45502],{"class":124,"line":132},[78,45503,45504],{},"# 将要部署任一 DolphinScheduler 服务的服务器主机名或 ip 列表\n",[78,45506,45507],{"class":124,"line":138},[78,45508,129],{"emptyLinePlaceholder":128},[78,45510,45511],{"class":124,"line":144},[78,45512,45513],{},"masters=\"hadoop102\" \n",[78,45515,45516],{"class":124,"line":150},[78,45517,45518],{},"# master 所在主机名列表，必须是 ips 的子集\n",[78,45520,45521],{"class":124,"line":156},[78,45522,129],{"emptyLinePlaceholder":128},[78,45524,45525],{"class":124,"line":162},[78,45526,45527],{},"workers=\"hadoop102:default,hadoop103:default,hadoop104:default\" \n",[78,45529,45530],{"class":124,"line":168},[78,45531,45532],{},"# worker主机名及队列，此处的 ip 必须在 ips 列表中\n",[78,45534,45535],{"class":124,"line":174},[78,45536,129],{"emptyLinePlaceholder":128},[78,45538,45539],{"class":124,"line":180},[78,45540,45541],{},"alertServer=\"hadoop102\"\n",[78,45543,45544],{"class":124,"line":186},[78,45545,45546],{},"# 告警服务所在服务器主机名\n",[78,45548,45549],{"class":124,"line":192},[78,45550,129],{"emptyLinePlaceholder":128},[78,45552,45553],{"class":124,"line":198},[78,45554,45555],{},"apiServers=\"hadoop102\"\n",[78,45557,45558],{"class":124,"line":204},[78,45559,45560],{},"# api服务所在服务器主机名\n",[78,45562,45563],{"class":124,"line":210},[78,45564,129],{"emptyLinePlaceholder":128},[78,45566,45567],{"class":124,"line":216},[78,45568,45569],{},"installPath=\"\u002Fopt\u002Fmodule\u002Fdolphinscheduler\"\n",[78,45571,45572],{"class":124,"line":222},[78,45573,45574],{},"# DS 安装路径，如果不存在会创建\n",[78,45576,45577],{"class":124,"line":421},[78,45578,129],{"emptyLinePlaceholder":128},[78,45580,45581],{"class":124,"line":427},[78,45582,45583],{},"deployUser=\"atguigu\"\n",[78,45585,45586],{"class":124,"line":433},[78,45587,45588],{},"# 部署用户，任务执行服务是以 sudo -u {linux-user} 切换不同 Linux 用户的方式来实现多租户运行作业，因此该用户必须有免密的 sudo 权限。\n",[78,45590,45591],{"class":124,"line":2443},[78,45592,129],{"emptyLinePlaceholder":128},[78,45594,45595],{"class":124,"line":2448},[78,45596,45597],{},"javaHome=\"\u002Fopt\u002Fmodule\u002Fjdk\"\n",[78,45599,45600],{"class":124,"line":2454},[78,45601,45602],{},"# JAVA_HOME 路径\n",[78,45604,45605],{"class":124,"line":2460},[78,45606,129],{"emptyLinePlaceholder":128},[78,45608,45609],{"class":124,"line":2465},[78,45610,45611],{},"DATABASE_TYPE=\"mysql\"\n",[78,45613,45614],{"class":124,"line":2470},[78,45615,45616],{},"# 数据库类型\n",[78,45618,45619],{"class":124,"line":2903},[78,45620,129],{"emptyLinePlaceholder":128},[78,45622,45623],{"class":124,"line":2909},[78,45624,45625],{},"SPRING_DATASOURCE_URL=\"jdbc:mysql:\u002F\u002Fhadoop102:3306\u002Fdolphinscheduler?useUnicode=true&characterEncoding=UTF-8\"\n",[78,45627,45628],{"class":124,"line":11477},[78,45629,45630],{},"# 数据库 URL\n",[78,45632,45633],{"class":124,"line":13374},[78,45634,129],{"emptyLinePlaceholder":128},[78,45636,45637],{"class":124,"line":13380},[78,45638,45639],{},"SPRING_DATASOURCE_USERNAME=\"dolphinscheduler\"\n",[78,45641,45642],{"class":124,"line":13386},[78,45643,45644],{},"# 数据库用户名\n",[78,45646,45647],{"class":124,"line":13722},[78,45648,129],{"emptyLinePlaceholder":128},[78,45650,45651],{"class":124,"line":13727},[78,45652,45653],{},"SPRING_DATASOURCE_PASSWORD=\"dolphinscheduler\"\n",[78,45655,45656],{"class":124,"line":13953},[78,45657,45658],{},"# 数据库密码\n",[78,45660,45661],{"class":124,"line":13958},[78,45662,129],{"emptyLinePlaceholder":128},[78,45664,45665],{"class":124,"line":13964},[78,45666,45667],{},"registryPluginName=\"zookeeper\"\n",[78,45669,45670],{"class":124,"line":13969},[78,45671,45672],{},"# 注册中心插件名称，DS 通过注册中心来确保集群配置的一致性\n",[78,45674,45675],{"class":124,"line":24170},[78,45676,129],{"emptyLinePlaceholder":128},[78,45678,45679],{"class":124,"line":24175},[78,45680,45681],{},"registryServers=\"hadoop102:2181,hadoop103:2181,hadoop104:2181\"\n",[78,45683,45684],{"class":124,"line":24180},[78,45685,45686],{},"# 注册中心地址，即 Zookeeper 集群的地址\n",[78,45688,45689],{"class":124,"line":24186},[78,45690,129],{"emptyLinePlaceholder":128},[78,45692,45693],{"class":124,"line":24192},[78,45694,45695],{},"registryNamespace=\"dolphinscheduler\"\n",[78,45697,45698],{"class":124,"line":24198},[78,45699,45700],{},"# DS 在 Zookeeper 的结点名称\n",[78,45702,45703],{"class":124,"line":24204},[78,45704,129],{"emptyLinePlaceholder":128},[78,45706,45707],{"class":124,"line":24210},[78,45708,45709],{},"resourceStorageType=\"HDFS\"  \n",[78,45711,45712],{"class":124,"line":24215},[78,45713,45714],{},"# 资源存储类型\n",[78,45716,45717],{"class":124,"line":24220},[78,45718,129],{"emptyLinePlaceholder":128},[78,45720,45721],{"class":124,"line":24226},[78,45722,45723],{},"resourceUploadPath=\"\u002Fdolphinscheduler\"\n",[78,45725,45726],{"class":124,"line":24232},[78,45727,45728],{},"# 资源上传路径\n",[78,45730,45731],{"class":124,"line":24238},[78,45732,129],{"emptyLinePlaceholder":128},[78,45734,45735],{"class":124,"line":24244},[78,45736,45737],{},"defaultFS=\"hdfs:\u002F\u002Fhadoop102:8020\"\n",[78,45739,45740],{"class":124,"line":24250},[78,45741,45742],{},"# 默认文件系统\n",[78,45744,45745],{"class":124,"line":24256},[78,45746,129],{"emptyLinePlaceholder":128},[78,45748,45749],{"class":124,"line":24262},[78,45750,45751],{},"resourceManagerHttpAddressPort=\"8088\"\n",[78,45753,45754],{"class":124,"line":24267},[78,45755,45756],{},"# yarn RM http 访问端口\n",[78,45758,45759],{"class":124,"line":24273},[78,45760,129],{"emptyLinePlaceholder":128},[78,45762,45763],{"class":124,"line":24279},[78,45764,45765],{},"yarnHaIps=\n",[78,45767,45768],{"class":124,"line":24284},[78,45769,45770],{},"# Yarn RM 高可用 ip，若未启用 RM 高可用，则将该值置空\n",[78,45772,45773],{"class":124,"line":24290},[78,45774,129],{"emptyLinePlaceholder":128},[78,45776,45777],{"class":124,"line":24296},[78,45778,45779],{},"singleYarnIp=\"hadoop103\"\n",[78,45781,45782],{"class":124,"line":24302},[78,45783,45784],{},"# Yarn RM 主机名，若启用了 HA 或未启用 RM，保留默认值\n",[78,45786,45787],{"class":124,"line":24308},[78,45788,129],{"emptyLinePlaceholder":128},[78,45790,45791],{"class":124,"line":24314},[78,45792,45793],{},"hdfsRootUser=\"atguigu\"\n",[78,45795,45796],{"class":124,"line":24320},[78,45797,45798],{},"# 拥有 HDFS 根目录操作权限的用户\n",[52,45800,45801,45802],{},"初始化数据库",[49,45803,45804,45816,45828,45846,45849],{},[52,45805,45806,45807],{},"创建数据库",[114,45808,45810],{"className":33693,"code":45809,"language":33695,"meta":119,"style":119},"CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;\n",[17,45811,45812],{"__ignoreMap":119},[78,45813,45814],{"class":124,"line":125},[78,45815,45809],{},[52,45817,45818,45819],{},"创建用户",[114,45820,45822],{"className":33693,"code":45821,"language":33695,"meta":119,"style":119},"CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY 'dolphinscheduler';\n",[17,45823,45824],{"__ignoreMap":119},[78,45825,45826],{"class":124,"line":125},[78,45827,45821],{},[52,45829,45830,45831],{},"赋予用户相应权限",[114,45832,45834],{"className":33693,"code":45833,"language":33695,"meta":119,"style":119},"GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';\nflush privileges;\n",[17,45835,45836,45841],{"__ignoreMap":119},[78,45837,45838],{"class":124,"line":125},[78,45839,45840],{},"GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';\n",[78,45842,45843],{"class":124,"line":132},[78,45844,45845],{},"flush privileges;\n",[52,45847,45848],{},"拷贝MySQL驱动到DolphinScheduler的解压目录下的lib中",[52,45850,45851,45852],{},"执行数据库初始化脚本",[114,45853,45855],{"className":33493,"code":45854,"language":33495,"meta":119,"style":119},"script\u002Fcreate-dolphinscheduler.sh\n",[17,45856,45857],{"__ignoreMap":119},[78,45858,45859],{"class":124,"line":125},[78,45860,45854],{},[10548,45862,45864],{"id":45863},"_3常见启停脚本","（3）常见启停脚本",[114,45866,45868],{"className":33493,"code":45867,"language":33495,"meta":119,"style":119},".\u002Finstall.sh  # 一键部署并启动\n.\u002Fbin\u002Fstart-all.sh  # 启动所有服务（区别于Hadoop）\n.\u002Fbin\u002Fstop-all.sh  # 关闭所有服务（区别于Hadoop）\n\n# 启停Master\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh start master-server\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh stop master-server\n\n# 启停Worker\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh start worker-server\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh stop worker-server\n\n# 启停Api\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh start api-server\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh stop api-server\n\n# 启动Logger\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh start logger-server\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh stop logger-server\n\n# 启停Alert\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh start alert-server\n.\u002Fbin\u002Fdolphinscheduler-daemon.sh stop alert-server\n",[17,45869,45870,45875,45880,45885,45889,45894,45899,45904,45908,45913,45918,45923,45927,45932,45937,45942,45946,45951,45956,45961,45965,45970,45975],{"__ignoreMap":119},[78,45871,45872],{"class":124,"line":125},[78,45873,45874],{},".\u002Finstall.sh  # 一键部署并启动\n",[78,45876,45877],{"class":124,"line":132},[78,45878,45879],{},".\u002Fbin\u002Fstart-all.sh  # 启动所有服务（区别于Hadoop）\n",[78,45881,45882],{"class":124,"line":138},[78,45883,45884],{},".\u002Fbin\u002Fstop-all.sh  # 关闭所有服务（区别于Hadoop）\n",[78,45886,45887],{"class":124,"line":144},[78,45888,129],{"emptyLinePlaceholder":128},[78,45890,45891],{"class":124,"line":150},[78,45892,45893],{},"# 启停Master\n",[78,45895,45896],{"class":124,"line":156},[78,45897,45898],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh start master-server\n",[78,45900,45901],{"class":124,"line":162},[78,45902,45903],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh stop master-server\n",[78,45905,45906],{"class":124,"line":168},[78,45907,129],{"emptyLinePlaceholder":128},[78,45909,45910],{"class":124,"line":174},[78,45911,45912],{},"# 启停Worker\n",[78,45914,45915],{"class":124,"line":180},[78,45916,45917],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh start worker-server\n",[78,45919,45920],{"class":124,"line":186},[78,45921,45922],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh stop worker-server\n",[78,45924,45925],{"class":124,"line":192},[78,45926,129],{"emptyLinePlaceholder":128},[78,45928,45929],{"class":124,"line":198},[78,45930,45931],{},"# 启停Api\n",[78,45933,45934],{"class":124,"line":204},[78,45935,45936],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh start api-server\n",[78,45938,45939],{"class":124,"line":210},[78,45940,45941],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh stop api-server\n",[78,45943,45944],{"class":124,"line":216},[78,45945,129],{"emptyLinePlaceholder":128},[78,45947,45948],{"class":124,"line":222},[78,45949,45950],{},"# 启动Logger\n",[78,45952,45953],{"class":124,"line":421},[78,45954,45955],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh start logger-server\n",[78,45957,45958],{"class":124,"line":427},[78,45959,45960],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh stop logger-server\n",[78,45962,45963],{"class":124,"line":433},[78,45964,129],{"emptyLinePlaceholder":128},[78,45966,45967],{"class":124,"line":2443},[78,45968,45969],{},"# 启停Alert\n",[78,45971,45972],{"class":124,"line":2448},[78,45973,45974],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh start alert-server\n",[78,45976,45977],{"class":124,"line":2454},[78,45978,45979],{},".\u002Fbin\u002Fdolphinscheduler-daemon.sh stop alert-server\n",[72,45981,45982],{},[13,45983,45984],{},"对于每个节点的配置在部署后的目录中，针对每个进程都有一个conf文件",[7759,45986,45988],{"id":45987},"_11superset","11、Superset",[72,45990,45991],{},[13,45992,45993],{},"强烈斥责Superset的开发人员，兼容性屌差，我曾经尝试过用Docker、Miniconda安装过Superset，但是安装成功的次数寥寥无几，所以在这里着重介绍下。尤其我大一的时候，那时候B站UP主鱼皮还介绍过十分钟搭建Superset，结果放到现在这种方式不太行了（看着官方文档还是可以，但是那个依赖版本维护极差，对小白其实很不友好，尤其当时我还没学数据库），现在Superset最新版都2.0.0+了，不胜唏嘘啊。",[10548,45995,45997],{"id":45996},"_1安装流程","（1）安装流程",[49,45999,46000,46003,46018,46030,46042,46054,46063,46066,46078],{},[52,46001,46002],{},"安装Miniconda",[52,46004,46005,46006],{},"创建虚拟环境",[49,46007,46008,46011],{},[52,46009,46010],{},"配置conda国内镜像",[52,46012,46013,46014,46017],{},"创建",[22,46015,46016],{},"Python3.8","环境",[52,46019,46020,46021],{},"安装依赖",[114,46022,46024],{"className":33493,"code":46023,"language":33495,"meta":119,"style":119},"sudo yum install -y gcc gcc-c++ libffi-devel python-devel python-pip python-wheel python-setuptools openssl-devel cyrus-sasl-devel openldap-devel\n",[17,46025,46026],{"__ignoreMap":119},[78,46027,46028],{"class":124,"line":125},[78,46029,46023],{},[52,46031,46032,46033],{},"安装（更新）setuptools和pip",[114,46034,46036],{"className":33493,"code":46035,"language":33495,"meta":119,"style":119},"pip install --upgrade setuptools pip -i https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F\n",[17,46037,46038],{"__ignoreMap":119},[78,46039,46040],{"class":124,"line":125},[78,46041,46035],{},[52,46043,46044,46045],{},"指定安装版本：",[114,46046,46048],{"className":33493,"code":46047,"language":33495,"meta":119,"style":119},"pip install apache-superset==1.4.2 -i https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F\n",[17,46049,46050],{"__ignoreMap":119},[78,46051,46052],{"class":124,"line":125},[78,46053,46047],{},[52,46055,46056,46057],{},"依赖降级：",[114,46058,46061],{"className":46059,"code":46060,"language":299},[297],"pip uninstall werkzeyg\npip uninstall markupsafe\npip install markupsafe==2.0.1\npip install flask==1.1.2\npip install Werkzeug==1.0.1\npip install --upgrade cryptography==3.2\n",[17,46062,46060],{"__ignoreMap":119},[52,46064,46065],{},"初始化数据库之前先执行：export FLASK_APP=superset",[52,46067,46068,46069],{},"初始化Superset",[114,46070,46072],{"className":33493,"code":46071,"language":33495,"meta":119,"style":119},"superset db upgrade\n",[17,46073,46074],{"__ignoreMap":119},[78,46075,46076],{"class":124,"line":125},[78,46077,46071],{},[52,46079,46080,46081],{},"安装gunicorn",[114,46082,46084],{"className":33493,"code":46083,"language":33495,"meta":119,"style":119},"pip install gunicorn -i https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F\n",[17,46085,46086],{"__ignoreMap":119},[78,46087,46088],{"class":124,"line":125},[78,46089,46083],{},[10548,46091,43986],{"id":46092},"_2常见启停脚本-3",[114,46094,46096],{"className":33493,"code":46095,"language":33495,"meta":119,"style":119},"gunicorn --workers 5 --timeout 120 --bind hadoop102:8787  \"superset.app:create_app()\" --daemon\n# 启动Superset\n# workers：指定进程个数\n# timeout：worker进程超时时间，超时会自动重启\n# bind：绑定本机地址，即为Superset访问地址\n# daemon：后台运行\n",[17,46097,46098,46103,46108,46113,46118,46123],{"__ignoreMap":119},[78,46099,46100],{"class":124,"line":125},[78,46101,46102],{},"gunicorn --workers 5 --timeout 120 --bind hadoop102:8787  \"superset.app:create_app()\" --daemon\n",[78,46104,46105],{"class":124,"line":132},[78,46106,46107],{},"# 启动Superset\n",[78,46109,46110],{"class":124,"line":138},[78,46111,46112],{},"# workers：指定进程个数\n",[78,46114,46115],{"class":124,"line":144},[78,46116,46117],{},"# timeout：worker进程超时时间，超时会自动重启\n",[78,46119,46120],{"class":124,"line":150},[78,46121,46122],{},"# bind：绑定本机地址，即为Superset访问地址\n",[78,46124,46125],{"class":124,"line":156},[78,46126,46127],{},"# daemon：后台运行\n",[10548,46129,46131],{"id":46130},"_3安装mysql依赖项","（3）安装MySQL依赖项",[114,46133,46135],{"className":33493,"code":46134,"language":33495,"meta":119,"style":119},"conda install mysqlclient\n",[17,46136,46137],{"__ignoreMap":119},[78,46138,46139],{"class":124,"line":125},[78,46140,46134],{},[13,46142,46143],{},[22,46144,46145],{},"对接不同的数据源，需安装不同的依赖，以下地址为官网说明。",[13,46147,46148],{},[5009,46149,46150],{"href":46150,"rel":46151},"https:\u002F\u002Fsuperset.apache.org\u002Fdocs\u002Fdatabases\u002Finstalling-database-drivers",[23647],[226,46153,228],{},{"title":119,"searchDepth":144,"depth":144,"links":46155},[46156,46161],{"id":42738,"depth":132,"text":42739,"children":46157},[46158,46159,46160],{"id":42745,"depth":144,"text":42746},{"id":42796,"depth":144,"text":42797},{"id":42951,"depth":144,"text":42952},{"id":43251,"depth":132,"text":43252,"children":46162},[46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177],{"id":43255,"depth":144,"text":43256},{"id":43279,"depth":144,"text":43280},{"id":43286,"depth":144,"text":43287},{"id":43322,"depth":144,"text":43323},{"id":43427,"depth":144,"text":43428},{"id":43941,"depth":144,"text":43942},{"id":44009,"depth":144,"text":44010},{"id":44286,"depth":144,"text":44287},{"id":44462,"depth":144,"text":44463},{"id":44494,"depth":144,"text":44495},{"id":44741,"depth":144,"text":44742},{"id":44924,"depth":144,"text":44925},{"id":45257,"depth":144,"text":45258},{"id":45410,"depth":144,"text":45411},{"id":45987,"depth":144,"text":45988},{},"Little Tips\u002F离线数仓总结（上）.md","\u002Fundergraduate\u002Fnote-6722326c1bdc",{"title":42733,"description":119},"undergraduate\u002Fnote-6722326c1bdc",[23378,10715,6380],"IFxNgudabnqA8PtHoerFfINKSAUzkI-XHQ0459wErto",{"id":46186,"title":46187,"assetBase":239,"author":8,"body":46188,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":47831,"navigation":128,"originalPath":47832,"path":47833,"seo":47834,"source":23330,"stem":47835,"tags":47836,"weight":250,"__hash__":47837},"content\u002Fundergraduate\u002Fnote-677ab4a41aa2.md","LangChain入门与避坑",{"type":10,"value":46189,"toc":47811},[46190,46194,46201,46205,46222,46224,46228,46231,46235,46238,46246,46328,46333,46395,46400,46564,46567,46571,46574,46579,46584,46587,46590,46711,46715,46718,46726,46734,46743,46745,46749,46753,46756,46759,46763,46770,46773,46778,46781,46784,46787,46790,46793,46797,46800,46855,46862,46864,46868,46871,46874,46878,46881,46884,47054,47057,47067,47074,47094,47097,47100,47143,47146,47150,47154,47157,47177,47188,47198,47217,47220,47238,47241,47245,47259,47262,47386,47389,47393,47396,47399,47407,47465,47468,47473,47535,47538,47543,47552,47555,47559,47562,47565,47600,47603,47606,47609,47612,47617,47622,47625,47628,47633,47638,47641,47644,47649,47652,47657,47661,47664,47667,47709,47712,47788,47791,47793,47797,47800,47803,47806,47809],[4517,46191,46193],{"id":46192},"langchain-入门与避坑指北","LangChain 入门与避坑指北",[72,46195,46196,46198],{},[13,46197,23957],{},[13,46199,46200],{},"本文对最近学习 LangChain 的过程进行一个简单的概述，介绍基本的概念、简述需要注意的问题，并提供我觉得当下还不错的学习方法。",[107,46202,46204],{"id":46203},"_1-前期准备","1 前期准备",[49,46206,46207,46210,46213,46216],{},[52,46208,46209],{},"Python 基础，a little 就行，或者拥有基本的 debug 能力即可上手",[52,46211,46212],{},"shell 基础，环境问题是所有问题中最头疼的问题，有 shell 命令的基础能快速复现环境即可",[52,46214,46215],{},"面向对象思想。可有可无，这是后面自己查看工程结构的必须，减少重复编程。",[52,46217,46218,46219],{},"6g+ 的显存 or OPENAI_API_KEY，显卡要求其实不大，以 ChatGLM-6B 为例，6g 显存跑模型没有问题，但是我在实践中出现了刚好吃满 6g，导致写的 langchain 提交不上去的情况，建议使用 6g+ 的显存。对显卡没要求",[25921,46220,46221],{},"毕竟跑 1 分钟和跑 5 分钟区别不大。\nOPENAI_API_KEY 不需要买 GPT 4.0 的，GPT 3.5 的完全够用了，后面会详细讲配置问题。KEY 也不贵，超过 5 块钱先斟酌下，我买的时候只花了 3.2 哦",[23289,46223],{},[107,46225,46227],{"id":46226},"_2-避坑指北","2 避坑指北",[13,46229,46230],{},"下面是在开始前先给大家描述下我遇到的一些错误，以防开始学习之后报错找了一圈发现就在该文档下面 emmmm。",[7759,46232,46234],{"id":46233},"_1环境问题","（1）环境问题",[13,46236,46237],{},"建议使用 conda 对环境进行管理，如果你想用本地显存跑模型，强烈建议**模型和 langchain 使用两套环境！！！**以防止中途因为一些必要插件关联导致的版本变动，以至于程序无法启动。",[49,46239,46240],{},[52,46241,46242,46245],{},[22,46243,46244],{},"torch && torchvision","（据说有80%的小笨蛋在开始就栽在了版本上，然后~就没有然后了）",[114,46247,46249],{"className":116,"code":46248,"language":118,"meta":119,"style":119},"# 如果不清楚自己的版本的，可以使用如下代码进行确认：\nimport torch\nprint(torch.__version__)\nimport torchvision\nprint(torchvision.__version__)\n\n# 我使用的版本如下：\n# torch 1.13.1+cu117\n# torchvision 0.14.1+cu117\n\n# 版本基本没有优劣之分（因为我也不清楚）\n# 在博客 https:\u002F\u002Fblog.csdn.net\u002Fshiwanghualuo\u002Farticle\u002Fdetails\u002F122860521 可以看到对照\n# 也可以直接访问：\n# https:\u002F\u002Fgitcode.com\u002Fpytorch\u002Fvision?utm_source=csdn_github_accelerator&isLogin=1\n\n# 安装版本命令 emmm，不教了，不会我觉得可能你不适合学这个\n",[17,46250,46251,46256,46261,46266,46271,46276,46280,46285,46290,46295,46299,46304,46309,46314,46319,46323],{"__ignoreMap":119},[78,46252,46253],{"class":124,"line":125},[78,46254,46255],{},"# 如果不清楚自己的版本的，可以使用如下代码进行确认：\n",[78,46257,46258],{"class":124,"line":132},[78,46259,46260],{},"import torch\n",[78,46262,46263],{"class":124,"line":138},[78,46264,46265],{},"print(torch.__version__)\n",[78,46267,46268],{"class":124,"line":144},[78,46269,46270],{},"import torchvision\n",[78,46272,46273],{"class":124,"line":150},[78,46274,46275],{},"print(torchvision.__version__)\n",[78,46277,46278],{"class":124,"line":156},[78,46279,129],{"emptyLinePlaceholder":128},[78,46281,46282],{"class":124,"line":162},[78,46283,46284],{},"# 我使用的版本如下：\n",[78,46286,46287],{"class":124,"line":168},[78,46288,46289],{},"# torch 1.13.1+cu117\n",[78,46291,46292],{"class":124,"line":174},[78,46293,46294],{},"# torchvision 0.14.1+cu117\n",[78,46296,46297],{"class":124,"line":180},[78,46298,129],{"emptyLinePlaceholder":128},[78,46300,46301],{"class":124,"line":186},[78,46302,46303],{},"# 版本基本没有优劣之分（因为我也不清楚）\n",[78,46305,46306],{"class":124,"line":192},[78,46307,46308],{},"# 在博客 https:\u002F\u002Fblog.csdn.net\u002Fshiwanghualuo\u002Farticle\u002Fdetails\u002F122860521 可以看到对照\n",[78,46310,46311],{"class":124,"line":198},[78,46312,46313],{},"# 也可以直接访问：\n",[78,46315,46316],{"class":124,"line":204},[78,46317,46318],{},"# https:\u002F\u002Fgitcode.com\u002Fpytorch\u002Fvision?utm_source=csdn_github_accelerator&isLogin=1\n",[78,46320,46321],{"class":124,"line":210},[78,46322,129],{"emptyLinePlaceholder":128},[78,46324,46325],{"class":124,"line":216},[78,46326,46327],{},"# 安装版本命令 emmm，不教了，不会我觉得可能你不适合学这个\n",[49,46329,46330],{},[52,46331,46332],{},"langchain 环境使用主要包体如下：",[114,46334,46338],{"className":46335,"code":46336,"language":46337,"meta":119,"style":119},"language-requirement.txt shiki shiki-themes github-dark","chromadb         # 存储和查询程式语言片段的数据库\nlangchain[all]\n# 如果报错需要继续补齐 langchain_community langchain_openai等，按报错信息来\nfastapi          # web api 工具\ngradio           # 将模型、数据集、文本、图像等内容部署成简单的界面\nopenai\npydantic         # 数据验证和设置库\npypdf            # 处理 PDF 文件的库\ntransformers     # Hugging Face 开发的自然语言处理任务的库\nunstructured     # 处理非结构化数据\nuvicorn          # 快速的 ASGI 服务器\n","requirement.txt",[17,46339,46340,46345,46350,46355,46360,46365,46370,46375,46380,46385,46390],{"__ignoreMap":119},[78,46341,46342],{"class":124,"line":125},[78,46343,46344],{},"chromadb         # 存储和查询程式语言片段的数据库\n",[78,46346,46347],{"class":124,"line":132},[78,46348,46349],{},"langchain[all]\n",[78,46351,46352],{"class":124,"line":138},[78,46353,46354],{},"# 如果报错需要继续补齐 langchain_community langchain_openai等，按报错信息来\n",[78,46356,46357],{"class":124,"line":144},[78,46358,46359],{},"fastapi          # web api 工具\n",[78,46361,46362],{"class":124,"line":150},[78,46363,46364],{},"gradio           # 将模型、数据集、文本、图像等内容部署成简单的界面\n",[78,46366,46367],{"class":124,"line":156},[78,46368,46369],{},"openai\n",[78,46371,46372],{"class":124,"line":162},[78,46373,46374],{},"pydantic         # 数据验证和设置库\n",[78,46376,46377],{"class":124,"line":168},[78,46378,46379],{},"pypdf            # 处理 PDF 文件的库\n",[78,46381,46382],{"class":124,"line":174},[78,46383,46384],{},"transformers     # Hugging Face 开发的自然语言处理任务的库\n",[78,46386,46387],{"class":124,"line":180},[78,46388,46389],{},"unstructured     # 处理非结构化数据\n",[78,46391,46392],{"class":124,"line":186},[78,46393,46394],{},"uvicorn          # 快速的 ASGI 服务器\n",[49,46396,46397],{},[52,46398,46399],{},"模型环境尽量不要图方便使用人家自带的 python，不是很好管理，new 一个环境然后读取 requirement.txt即可，以 chatglm3 为例，他的文件如下：",[114,46401,46403],{"className":46335,"code":46402,"language":46337,"meta":119,"style":119},"# basic requirements\n\nprotobuf>=4.25.2\ntransformers>=4.37.1\ntokenizers>=0.15.0\ncpm_kernels>=1.0.11\ntorch>=2.1.0\ngradio>=4.16.0\nsentencepiece>=0.1.99\nsentence_transformers>=2.2.2\naccelerate>=0.26.1\nstreamlit>=1.30.0\nfastapi>=0.109.0\nloguru~=0.7.2\nmdtex2html>=1.3.0\nlatex2mathml>=3.77.0\n\n# for openai demo\n\nopenai>=1.10.0\nzhipuai>=2.0.1\n\npydantic>=2.5.3\nsse-starlette>=2.0.0\nuvicorn>=0.27.0\ntimm>=0.9.12\ntiktoken>=0.5.2\n\n# for langchain demo\n\nlangchain>=0.1.4\nlangchainhub>=0.1.14\narxiv>=2.1.0\n",[17,46404,46405,46410,46414,46419,46424,46429,46434,46439,46444,46449,46454,46459,46464,46469,46474,46479,46484,46488,46493,46497,46502,46507,46511,46516,46521,46526,46531,46536,46540,46545,46549,46554,46559],{"__ignoreMap":119},[78,46406,46407],{"class":124,"line":125},[78,46408,46409],{},"# basic requirements\n",[78,46411,46412],{"class":124,"line":132},[78,46413,129],{"emptyLinePlaceholder":128},[78,46415,46416],{"class":124,"line":138},[78,46417,46418],{},"protobuf>=4.25.2\n",[78,46420,46421],{"class":124,"line":144},[78,46422,46423],{},"transformers>=4.37.1\n",[78,46425,46426],{"class":124,"line":150},[78,46427,46428],{},"tokenizers>=0.15.0\n",[78,46430,46431],{"class":124,"line":156},[78,46432,46433],{},"cpm_kernels>=1.0.11\n",[78,46435,46436],{"class":124,"line":162},[78,46437,46438],{},"torch>=2.1.0\n",[78,46440,46441],{"class":124,"line":168},[78,46442,46443],{},"gradio>=4.16.0\n",[78,46445,46446],{"class":124,"line":174},[78,46447,46448],{},"sentencepiece>=0.1.99\n",[78,46450,46451],{"class":124,"line":180},[78,46452,46453],{},"sentence_transformers>=2.2.2\n",[78,46455,46456],{"class":124,"line":186},[78,46457,46458],{},"accelerate>=0.26.1\n",[78,46460,46461],{"class":124,"line":192},[78,46462,46463],{},"streamlit>=1.30.0\n",[78,46465,46466],{"class":124,"line":198},[78,46467,46468],{},"fastapi>=0.109.0\n",[78,46470,46471],{"class":124,"line":204},[78,46472,46473],{},"loguru~=0.7.2\n",[78,46475,46476],{"class":124,"line":210},[78,46477,46478],{},"mdtex2html>=1.3.0\n",[78,46480,46481],{"class":124,"line":216},[78,46482,46483],{},"latex2mathml>=3.77.0\n",[78,46485,46486],{"class":124,"line":222},[78,46487,129],{"emptyLinePlaceholder":128},[78,46489,46490],{"class":124,"line":421},[78,46491,46492],{},"# for openai demo\n",[78,46494,46495],{"class":124,"line":427},[78,46496,129],{"emptyLinePlaceholder":128},[78,46498,46499],{"class":124,"line":433},[78,46500,46501],{},"openai>=1.10.0\n",[78,46503,46504],{"class":124,"line":2443},[78,46505,46506],{},"zhipuai>=2.0.1\n",[78,46508,46509],{"class":124,"line":2448},[78,46510,129],{"emptyLinePlaceholder":128},[78,46512,46513],{"class":124,"line":2454},[78,46514,46515],{},"pydantic>=2.5.3\n",[78,46517,46518],{"class":124,"line":2460},[78,46519,46520],{},"sse-starlette>=2.0.0\n",[78,46522,46523],{"class":124,"line":2465},[78,46524,46525],{},"uvicorn>=0.27.0\n",[78,46527,46528],{"class":124,"line":2470},[78,46529,46530],{},"timm>=0.9.12\n",[78,46532,46533],{"class":124,"line":2903},[78,46534,46535],{},"tiktoken>=0.5.2\n",[78,46537,46538],{"class":124,"line":2909},[78,46539,129],{"emptyLinePlaceholder":128},[78,46541,46542],{"class":124,"line":11477},[78,46543,46544],{},"# for langchain demo\n",[78,46546,46547],{"class":124,"line":13374},[78,46548,129],{"emptyLinePlaceholder":128},[78,46550,46551],{"class":124,"line":13380},[78,46552,46553],{},"langchain>=0.1.4\n",[78,46555,46556],{"class":124,"line":13386},[78,46557,46558],{},"langchainhub>=0.1.14\n",[78,46560,46561],{"class":124,"line":13722},[78,46562,46563],{},"arxiv>=2.1.0\n",[13,46565,46566],{},"**注意：**如果和本文发布时间很近的话不建议使用 GLM3 作为本地模型，目前 LangChain 还没有将 GLM3 的接口放入，需要自己编写。（不过能让你快速了解源码）",[7759,46568,46570],{"id":46569},"_2langchain-问题","（2）LangChain 问题",[13,46572,46573],{},"新技术的到来总是让人兴奋的，langchain 在最近迎来了它的 0.1.0 版本。md学起来贼辛苦好吧~放两张今天写文的时候的截图：",[13,46575,46576],{},[617,46577],{"alt":119,"src":46578},"img\u002Flangchain\u002F%E7%89%88%E6%9C%AC1.png",[13,46580,46581],{},[617,46582],{"alt":119,"src":46583},"img\u002Flangchain\u002F%E7%89%88%E6%9C%AC2.png",[13,46585,46586],{},"哥们我学的时候还只有 0.1.3 呢艹。",[13,46588,46589],{},"言归正传，langchain 0.0 系列和 0.1 系列最大的差别就是以往很多接口因为它的模块化设计进行了调整。在下面进行简单的举例：",[114,46591,46593],{"className":116,"code":46592,"language":118,"meta":119,"style":119},"# 部分包名由 langchain 下放到 langchain_community\u002Flangchain_openai\n# 下面是常见的最新的引用（含变动）\n\nfrom langchain_community.document_loaders import UnstructuredURLLoader\nfrom langchain_openai import OpenAI\nfrom langchain_openai import ChatOpenAI\n\n# invoke(Any) 代替执行语句\n# 在实操中有两个地方遇到了这个问题：\n# eg.1\nopenaichat = ChatOpenAI(model_name=\"gpt-3.5-turbo\")\n# 原 res = openaichat(msg)\nres = openaichat.invoke(msg)  # 输出内容不影响\n\n# eg.2\nllm = OpenAI(max_tokens=1500)\nchain = load_summarize_chain(llm, prompt=chinese_prompt)\n# 原 summary = chain.run(news)\nsummary = chain.invoke(news)  \n# 实测 invoke 返回内容会包含'output_text'、'input_text'等，'output_text'为原 run 返回内容\n\n# 会不会影响使用我目前无法下定论，因为我所处物理环境问题可变参数太多了，\n# 但是建议大家依据新的规范来写，因为控制台在执行的时候会报 warning，且格式真的很丑\n# 有因为不从 langchain_openai 引入导致程序执行不下去的经历，但尚不确认是否为网络问题\n",[17,46594,46595,46600,46605,46609,46614,46619,46624,46628,46633,46638,46643,46648,46653,46658,46662,46667,46672,46677,46682,46687,46692,46696,46701,46706],{"__ignoreMap":119},[78,46596,46597],{"class":124,"line":125},[78,46598,46599],{},"# 部分包名由 langchain 下放到 langchain_community\u002Flangchain_openai\n",[78,46601,46602],{"class":124,"line":132},[78,46603,46604],{},"# 下面是常见的最新的引用（含变动）\n",[78,46606,46607],{"class":124,"line":138},[78,46608,129],{"emptyLinePlaceholder":128},[78,46610,46611],{"class":124,"line":144},[78,46612,46613],{},"from langchain_community.document_loaders import UnstructuredURLLoader\n",[78,46615,46616],{"class":124,"line":150},[78,46617,46618],{},"from langchain_openai import OpenAI\n",[78,46620,46621],{"class":124,"line":156},[78,46622,46623],{},"from langchain_openai import ChatOpenAI\n",[78,46625,46626],{"class":124,"line":162},[78,46627,129],{"emptyLinePlaceholder":128},[78,46629,46630],{"class":124,"line":168},[78,46631,46632],{},"# invoke(Any) 代替执行语句\n",[78,46634,46635],{"class":124,"line":174},[78,46636,46637],{},"# 在实操中有两个地方遇到了这个问题：\n",[78,46639,46640],{"class":124,"line":180},[78,46641,46642],{},"# eg.1\n",[78,46644,46645],{"class":124,"line":186},[78,46646,46647],{},"openaichat = ChatOpenAI(model_name=\"gpt-3.5-turbo\")\n",[78,46649,46650],{"class":124,"line":192},[78,46651,46652],{},"# 原 res = openaichat(msg)\n",[78,46654,46655],{"class":124,"line":198},[78,46656,46657],{},"res = openaichat.invoke(msg)  # 输出内容不影响\n",[78,46659,46660],{"class":124,"line":204},[78,46661,129],{"emptyLinePlaceholder":128},[78,46663,46664],{"class":124,"line":210},[78,46665,46666],{},"# eg.2\n",[78,46668,46669],{"class":124,"line":216},[78,46670,46671],{},"llm = OpenAI(max_tokens=1500)\n",[78,46673,46674],{"class":124,"line":222},[78,46675,46676],{},"chain = load_summarize_chain(llm, prompt=chinese_prompt)\n",[78,46678,46679],{"class":124,"line":421},[78,46680,46681],{},"# 原 summary = chain.run(news)\n",[78,46683,46684],{"class":124,"line":427},[78,46685,46686],{},"summary = chain.invoke(news)  \n",[78,46688,46689],{"class":124,"line":433},[78,46690,46691],{},"# 实测 invoke 返回内容会包含'output_text'、'input_text'等，'output_text'为原 run 返回内容\n",[78,46693,46694],{"class":124,"line":2443},[78,46695,129],{"emptyLinePlaceholder":128},[78,46697,46698],{"class":124,"line":2448},[78,46699,46700],{},"# 会不会影响使用我目前无法下定论，因为我所处物理环境问题可变参数太多了，\n",[78,46702,46703],{"class":124,"line":2454},[78,46704,46705],{},"# 但是建议大家依据新的规范来写，因为控制台在执行的时候会报 warning，且格式真的很丑\n",[78,46707,46708],{"class":124,"line":2460},[78,46709,46710],{},"# 有因为不从 langchain_openai 引入导致程序执行不下去的经历，但尚不确认是否为网络问题\n",[10548,46712,46714],{"id":46713},"如何解决-langchain-问题","如何解决 langchain 问题？",[13,46716,46717],{},"目前来看应该还没有很好且直观的途径去查看文档，英文、中文文档的更新都有一定的滞后性。",[13,46719,46720,46721],{},"入门了解架构的话推荐中文文档：",[5009,46722,46725],{"href":46723,"rel":46724},"https:\u002F\u002Fwww.langchain.com.cn\u002F",[23647],"LangChain中文网",[13,46727,46728,46729],{},"英文文档会稍微快一点：",[5009,46730,46733],{"href":46731,"rel":46732},"https:\u002F\u002Fpython.langchain.com\u002Fdocs\u002Fget_started\u002Fintroduction",[23647],"Introduction | 🦜️🔗 Langchain",[13,46735,46736,46737,46742],{},"解决问题直接 github issue 区，基本上萌新开发者遇到的问题 CSDN 可能还没同步但是 issue 区已经有了：",[5009,46738,46741],{"href":46739,"rel":46740},"https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Flangchain\u002Fissues",[23647],"Issues · langchain-ai\u002Flangchain (github.com)"," 社区比较活跃，实在没有就提问吧。",[23289,46744],{},[107,46746,46748],{"id":46747},"_3-langchain-很扯淡的入门介绍","3 LangChain 很扯淡的入门介绍",[7759,46750,46752],{"id":46751},"_1关于-langchain","（1）关于 LangChain",[13,46754,46755],{},"为什么要叫 langchain 呢？拆开来就是 lang & chain，lang 的话如果在之前你接触过 SpringBoot 之类的项目，很多后端会把一些国际化、语言化的东西放在一个 lang 文件夹下；而 chain 的话则更好理解，langchain 本质上是一个中间件，类似于你和数据库交互需要用到的无论是 Mybatis、Navicat 等程序，langchain 是方便你和 LLM 大模型交互的工具。",[13,46757,46758],{},"所以我们有理由猜测，如同现在喜欢将 datax 等组件封装一层作为中台自动化中间层，假使 langchain 保持如今的热度继续发展，之后也会变成一个开箱即用的 UI 组件。",[7759,46760,46762],{"id":46761},"_2langchain-的主要工作","（2）LangChain 的主要工作",[13,46764,46765,46766],{},"援引自 B 站视频 ",[5009,46767,46769],{"href":23972,"rel":46768},[23647],"九天玩转Langchain",[13,46771,46772],{},"LangChain 你看下面有 6 大模块怎么怎么样，其实也就那样 emmm，搞清楚流程机制以及你可以在什么地方使用，工具就是要用的时候再看说明书。",[13,46774,46775],{},[617,46776],{"alt":119,"src":46777},"img\u002Flangchain\u002F%E6%B5%81%E7%A8%8B%E5%9B%BE.png",[13,46779,46780],{},"我认为 longchain 主要做的就是 ETL 工作，论点如下：看见上图的 langchain 的主要工作了吗？从数据源抽取、转换、加载，妥妥的 ETL。当然，深入的说，langchain 主要用来对非结构化数据也就是语言、文本等有很好的支持，它的转换也不仅仅是常规的格式转换，而是对输入的量化。（业内人士喜欢称其为文本词嵌入（Word Embedding），这个稍后再说）",[13,46782,46783],{},"store 过程则是将数据写库，使用 chromadb，这是个轻量级且对文本向量支持友好的数据库转换器，retrieve 则是对 store 中的内容进行一个提炼输出。",[13,46785,46786],{},"一句话概括就是：**langchain 完成了对数据一个提炼、查找的完全链路。**它并不能提供数据源、查找理由，只是一种方法的凝练。",[13,46788,46789],{},"数据源支持由用户等自行提供，因此它支持本地知识库的搭建，合理想象未来的学生课设系统将会是：金融知识系统（使用 langchain 爬取金融网站提取摘要凝练成知识）、图书简介系统（使用 langchain 对图书提取摘要进行展示）……",[13,46791,46792],{},"关于查找理由这一段我是有端联想的，并非考据：在学习视频的过程中发现使用 GLM-6B 本地运行对小文本处理性能并不优秀，但是换上 OPENAI_API_KEY 之后的效果却让人满意。我认为是模型在输出过程中占据主导地位，且越大训练的模型处理小微数据的效果可能会更好（但目前我还没读源码）。而 langchain 在这过程中主要还是扮演一个助手的身份，对输入进行修修补补以及对输出进行修修补补。",[7759,46794,46796],{"id":46795},"_3文本词嵌入word-embedding","（3）文本词嵌入（Word Embedding）",[13,46798,46799],{},"这里我直接使用上面视频中的例子进行简单介绍，详细大家可以自己找资料或者看视频~",[114,46801,46805],{"className":46802,"code":46803,"language":46804,"meta":119,"style":119},"language-markdown shiki shiki-themes github-dark","词嵌入是词语的一种数值化表示方式，一般情况下会将一个词映射到一个高维的向量中（词向量vector）\n\n- 例子：\n  - “我” --> [0, 0.3, -0.1]\n  - “你” --> [-0.6, 0.12, 0.16]\n  - “俺” --> [0.01, 0.298, -0.99]\n\n向量化的意义：\n将低维的词\u002F句子转换为高维的向量，方便进行数字化表达\n换言之：接近的语义=接近的高维距离\n","markdown",[17,46806,46807,46812,46816,46821,46826,46831,46836,46840,46845,46850],{"__ignoreMap":119},[78,46808,46809],{"class":124,"line":125},[78,46810,46811],{},"词嵌入是词语的一种数值化表示方式，一般情况下会将一个词映射到一个高维的向量中（词向量vector）\n",[78,46813,46814],{"class":124,"line":132},[78,46815,129],{"emptyLinePlaceholder":128},[78,46817,46818],{"class":124,"line":138},[78,46819,46820],{},"- 例子：\n",[78,46822,46823],{"class":124,"line":144},[78,46824,46825],{},"  - “我” --> [0, 0.3, -0.1]\n",[78,46827,46828],{"class":124,"line":150},[78,46829,46830],{},"  - “你” --> [-0.6, 0.12, 0.16]\n",[78,46832,46833],{"class":124,"line":156},[78,46834,46835],{},"  - “俺” --> [0.01, 0.298, -0.99]\n",[78,46837,46838],{"class":124,"line":162},[78,46839,129],{"emptyLinePlaceholder":128},[78,46841,46842],{"class":124,"line":168},[78,46843,46844],{},"向量化的意义：\n",[78,46846,46847],{"class":124,"line":174},[78,46848,46849],{},"将低维的词\u002F句子转换为高维的向量，方便进行数字化表达\n",[78,46851,46852],{"class":124,"line":180},[78,46853,46854],{},"换言之：接近的语义=接近的高维距离\n",[13,46856,46857,46858,46861],{},"B 站有很多不错的 embedding 介绍，附上我很喜欢的一句话：",[22,46859,46860],{},"“万物皆可 embedding”","，可见，embed主要是对非结构化数据进行的升维操作，对事物建立起关联。",[23289,46863],{},[107,46865,46867],{"id":46866},"_4-模块简介","4 模块简介",[13,46869,46870],{},"看到这了，我觉得你可以动手实践下了，关于模块的部分我认为亲手实践一次会比干巴巴的讲解有效很多，如果你也认同我说的，可以去我的另一篇文章《LangChain 实践》做一个本地的知识库问答，很短的代码却能让你有全新的体悟，或者跟着下面的几个模块，我粗略的讲解。",[13,46872,46873],{},"我并不准备按照官方顺序或者译文顺序来介绍模块，说实话既然有官方文档那么很多东西其实应该侧重于以工程的角度去科普介绍，而非润色下译文直接照搬（如此我建议可以去译文的 github 提 pr）",[7759,46875,46877],{"id":46876},"_0transformers-乱入","（0）Transformers 乱入",[13,46879,46880],{},"我们最先想到用 langchain 一定是我们需要和模型进行交互了，那么模型在哪来？模型是怎么启动的？模型的构成是什么？这些~我都还不知道 emmm，之后会抽时间研究 Transformers 的源码，再写个《初探 Transformers》的入门吐槽。",[13,46882,46883],{},"言归正传，模型的启动如下：",[114,46885,46887],{"className":116,"code":46886,"language":118,"meta":119,"style":119},"# 导入 AutoTokenizer 和 AutoModel，用于从预训练模型中加载模型和分词器\nfrom transformers import AutoTokenizer, AutoModel\n\n# 从本地加载 chatglm-6b 预训练模型的分词器，trust_remote_code=True 表示信任远程代码\ntokenizer = AutoTokenizer.from_pretrained(\".\u002FChatGML\u002Fmodel\u002Fchatglm-6b\", trust_remote_code=True)\n\n# 从本地加载 chatglm-6b 预训练模型，trust_remote_code=True 表示信任远程代码\nmodel = AutoModel.from_pretrained(\".\u002FChatGML\u002Fmodel\u002Fchatglm-6b\", trust_remote_code=True).quantize(4).half().cuda()\n\n# 将模型设置为评估模式\nmodel = model.eval()\n\n# 使用模型进行对话，初始对话内容为 \"你好\"，history=[] 表示初始对话历史为空\nresponse, history = model.chat(tokenizer, \"你好\", history=[])\n# 打印模型给出的回复\nprint(response)\n\n# 使用模型进行对话，对话内容为 \"晚上睡不着怎么办\"，使用之前的对话历史作为上下文\nresponse, history = model.chat(tokenizer, \"晚上睡不着怎么办\", history=history)\n# 打印模型给出的回复\nprint(response)\n\n\"\"\"\nLoading checkpoint shards: 100%|██████████| 8\u002F8 [00:22\u003C00:00,  2.81s\u002Fit]\n你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。\n以下时是一些有用的技巧,可以帮助在晚上入睡:\n1. 保持放松:尝试进行深呼吸、冥想或放松练习,减轻压力和焦虑。\n2. 创造舒适的睡眠环境:确保卧室安静、黑暗、凉爽和舒适,可能需要使用耳塞、眼罩等。\n3. 制定规律的睡眠时间表:每天在同一时间上床,保持相同的起床时间,帮助身体建立一个正常的睡眠节律。\n4. 避免刺激:在睡觉前几个小时内避免饮用咖啡因、酒精或尼古丁,并避免在睡前进行刺激性的活动,如看电视或使用电脑。\n5. 暴露于光线下:在睡觉前几个小时内,将手机或电脑屏幕调暗,并尽可能让光线暴露于室外,如阳光或户外夜景,帮助身体暴露于光线下,提高入睡所需的光线水平。\n6. 尝试进行冥想或深度呼吸练习:这些技巧可以帮助放松身体和思维,提高入睡的能力。\n如果这些方法不起作用,也可以尝试咨询医生或睡眠专家,获取更具体的建议和帮助。\n进程已结束,退出代码0\n\"\"\"\n",[17,46888,46889,46894,46899,46903,46908,46913,46917,46922,46927,46931,46936,46941,46945,46950,46955,46960,46964,46968,46973,46978,46982,46986,46990,46995,47000,47005,47010,47015,47020,47025,47030,47035,47040,47045,47050],{"__ignoreMap":119},[78,46890,46891],{"class":124,"line":125},[78,46892,46893],{},"# 导入 AutoTokenizer 和 AutoModel，用于从预训练模型中加载模型和分词器\n",[78,46895,46896],{"class":124,"line":132},[78,46897,46898],{},"from transformers import AutoTokenizer, AutoModel\n",[78,46900,46901],{"class":124,"line":138},[78,46902,129],{"emptyLinePlaceholder":128},[78,46904,46905],{"class":124,"line":144},[78,46906,46907],{},"# 从本地加载 chatglm-6b 预训练模型的分词器，trust_remote_code=True 表示信任远程代码\n",[78,46909,46910],{"class":124,"line":150},[78,46911,46912],{},"tokenizer = AutoTokenizer.from_pretrained(\".\u002FChatGML\u002Fmodel\u002Fchatglm-6b\", trust_remote_code=True)\n",[78,46914,46915],{"class":124,"line":156},[78,46916,129],{"emptyLinePlaceholder":128},[78,46918,46919],{"class":124,"line":162},[78,46920,46921],{},"# 从本地加载 chatglm-6b 预训练模型，trust_remote_code=True 表示信任远程代码\n",[78,46923,46924],{"class":124,"line":168},[78,46925,46926],{},"model = AutoModel.from_pretrained(\".\u002FChatGML\u002Fmodel\u002Fchatglm-6b\", trust_remote_code=True).quantize(4).half().cuda()\n",[78,46928,46929],{"class":124,"line":174},[78,46930,129],{"emptyLinePlaceholder":128},[78,46932,46933],{"class":124,"line":180},[78,46934,46935],{},"# 将模型设置为评估模式\n",[78,46937,46938],{"class":124,"line":186},[78,46939,46940],{},"model = model.eval()\n",[78,46942,46943],{"class":124,"line":192},[78,46944,129],{"emptyLinePlaceholder":128},[78,46946,46947],{"class":124,"line":198},[78,46948,46949],{},"# 使用模型进行对话，初始对话内容为 \"你好\"，history=[] 表示初始对话历史为空\n",[78,46951,46952],{"class":124,"line":204},[78,46953,46954],{},"response, history = model.chat(tokenizer, \"你好\", history=[])\n",[78,46956,46957],{"class":124,"line":210},[78,46958,46959],{},"# 打印模型给出的回复\n",[78,46961,46962],{"class":124,"line":216},[78,46963,7818],{},[78,46965,46966],{"class":124,"line":222},[78,46967,129],{"emptyLinePlaceholder":128},[78,46969,46970],{"class":124,"line":421},[78,46971,46972],{},"# 使用模型进行对话，对话内容为 \"晚上睡不着怎么办\"，使用之前的对话历史作为上下文\n",[78,46974,46975],{"class":124,"line":427},[78,46976,46977],{},"response, history = model.chat(tokenizer, \"晚上睡不着怎么办\", history=history)\n",[78,46979,46980],{"class":124,"line":433},[78,46981,46959],{},[78,46983,46984],{"class":124,"line":2443},[78,46985,7818],{},[78,46987,46988],{"class":124,"line":2448},[78,46989,129],{"emptyLinePlaceholder":128},[78,46991,46992],{"class":124,"line":2454},[78,46993,46994],{},"\"\"\"\n",[78,46996,46997],{"class":124,"line":2460},[78,46998,46999],{},"Loading checkpoint shards: 100%|██████████| 8\u002F8 [00:22\u003C00:00,  2.81s\u002Fit]\n",[78,47001,47002],{"class":124,"line":2465},[78,47003,47004],{},"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。\n",[78,47006,47007],{"class":124,"line":2470},[78,47008,47009],{},"以下时是一些有用的技巧,可以帮助在晚上入睡:\n",[78,47011,47012],{"class":124,"line":2903},[78,47013,47014],{},"1. 保持放松:尝试进行深呼吸、冥想或放松练习,减轻压力和焦虑。\n",[78,47016,47017],{"class":124,"line":2909},[78,47018,47019],{},"2. 创造舒适的睡眠环境:确保卧室安静、黑暗、凉爽和舒适,可能需要使用耳塞、眼罩等。\n",[78,47021,47022],{"class":124,"line":11477},[78,47023,47024],{},"3. 制定规律的睡眠时间表:每天在同一时间上床,保持相同的起床时间,帮助身体建立一个正常的睡眠节律。\n",[78,47026,47027],{"class":124,"line":13374},[78,47028,47029],{},"4. 避免刺激:在睡觉前几个小时内避免饮用咖啡因、酒精或尼古丁,并避免在睡前进行刺激性的活动,如看电视或使用电脑。\n",[78,47031,47032],{"class":124,"line":13380},[78,47033,47034],{},"5. 暴露于光线下:在睡觉前几个小时内,将手机或电脑屏幕调暗,并尽可能让光线暴露于室外,如阳光或户外夜景,帮助身体暴露于光线下,提高入睡所需的光线水平。\n",[78,47036,47037],{"class":124,"line":13386},[78,47038,47039],{},"6. 尝试进行冥想或深度呼吸练习:这些技巧可以帮助放松身体和思维,提高入睡的能力。\n",[78,47041,47042],{"class":124,"line":13722},[78,47043,47044],{},"如果这些方法不起作用,也可以尝试咨询医生或睡眠专家,获取更具体的建议和帮助。\n",[78,47046,47047],{"class":124,"line":13727},[78,47048,47049],{},"进程已结束,退出代码0\n",[78,47051,47052],{"class":124,"line":13953},[78,47053,46994],{},[13,47055,47056],{},"这就是一个基本的模型加载启动并问答的流程。详细参数的示意如下（由 GPT 提供）：",[13,47058,47059,47060,47063,47064,47066],{},"在深度学习框架中，",[17,47061,47062],{},"model.eval()"," 的作用是将模型设置为评估模式。在评估模式下，模型通常会关闭一些训练中会用到但在评估时不需要的功能，比如 dropout 和 batch normalization 的计算，这有助于提高评估时的计算效率。此外，",[17,47065,47062],{}," 还会影响某些模型，比如在使用 PyTorch 框架时，会影响 BatchNorm 和 Dropout 层等。",[13,47068,47069,47070,47073],{},"对于 ",[17,47071,47072],{},".quantize(4).half().cuda()"," 这一方法链，它包含了以下几个操作：",[49,47075,47076,47082,47088],{},[52,47077,47078,47081],{},[17,47079,47080],{},"quantize(4)","：这一操作是对模型进行量化（Quantization），将模型中的参数从浮点数格式转换为定点数格式。括号中的参数 4 表示将参数量化为 4 位，从而减少模型的存储空间和计算量。量化通常用于优化模型的推理效率。",[52,47083,47084,47087],{},[17,47085,47086],{},"half()","：这一操作将模型中的数据类型从 32 位浮点数（float32）转换为 16 位浮点数（float16），这种操作被称为半精度浮点数计算。这样做可以显著减少模型在 GPU 上的内存占用，并提高计算速度。",[52,47089,47090,47093],{},[17,47091,47092],{},"cuda()","：这一操作将模型转移到 GPU 上进行计算，如果 GPU 可用的话。这样可以利用 GPU 的并行计算能力来加速模型的推理过程。",[13,47095,47096],{},"如上所见，HF 的 Transformers 提供了便捷的方式启动模型，但是 langchain 并非抢了 transformers 的活，而是很好的对接了 chat 接口，提供更高效和便捷的预处理或是优化方式。",[13,47098,47099],{},"下面是 ChatGLM3 的 api_server.py 文件中的部分，本质上是启动模型后开放了一个可访问的接口：",[114,47101,47103],{"className":116,"code":47102,"language":118,"meta":119,"style":119},"if __name__ == \"__main__\":\n    # Load LLM\n    tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)\n    model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map=\"auto\").eval()\n\n    # load Embedding\n    embedding_model = SentenceTransformer(EMBEDDING_PATH, device=\"cuda\")\n    uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)\n",[17,47104,47105,47109,47114,47119,47124,47128,47133,47138],{"__ignoreMap":119},[78,47106,47107],{"class":124,"line":125},[78,47108,23224],{},[78,47110,47111],{"class":124,"line":132},[78,47112,47113],{},"    # Load LLM\n",[78,47115,47116],{"class":124,"line":138},[78,47117,47118],{},"    tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)\n",[78,47120,47121],{"class":124,"line":144},[78,47122,47123],{},"    model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map=\"auto\").eval()\n",[78,47125,47126],{"class":124,"line":150},[78,47127,129],{"emptyLinePlaceholder":128},[78,47129,47130],{"class":124,"line":156},[78,47131,47132],{},"    # load Embedding\n",[78,47134,47135],{"class":124,"line":162},[78,47136,47137],{},"    embedding_model = SentenceTransformer(EMBEDDING_PATH, device=\"cuda\")\n",[78,47139,47140],{"class":124,"line":168},[78,47141,47142],{},"    uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)\n",[13,47144,47145],{},"那么现在我们就能开始真正进入 langchain，看看他对这个接口提供了些什么？又对返回进行了什么样的处理~",[7759,47147,47149],{"id":47148},"_1模块一模型-models","（1）模块一：模型 Models",[10548,47151,47153],{"id":47152},"_1加载-llm","【1】加载 LLM",[13,47155,47156],{},"因为目前 ChatGLM3 还比较新，我使用的 langchain 版本还未更新 3 的接口，所以测试的时候是使用的自己的ChatGLM3 类~",[114,47158,47160],{"className":116,"code":47159,"language":118,"meta":119,"style":119},"from langchain_chatglm3 import ChatGLM3\nllm = ChatGLM3(endpoint_url=\"http:\u002F\u002Flocalhost:8000\u002F\")\nresponse = llm.invoke('你好')\n",[17,47161,47162,47167,47172],{"__ignoreMap":119},[78,47163,47164],{"class":124,"line":125},[78,47165,47166],{},"from langchain_chatglm3 import ChatGLM3\n",[78,47168,47169],{"class":124,"line":132},[78,47170,47171],{},"llm = ChatGLM3(endpoint_url=\"http:\u002F\u002Flocalhost:8000\u002F\")\n",[78,47173,47174],{"class":124,"line":138},[78,47175,47176],{},"response = llm.invoke('你好')\n",[13,47178,47179,47180,47183,47184,47187],{},"当然，",[17,47181,47182],{},"langchain_chatglm3"," 并不是官方的类，这里只是使用本地简单方法打个样，后续的启动将使用 ",[17,47185,47186],{},"OPENAI_API_KEY "," 的方式进行。",[13,47189,47190,47191,47193,47194,47197],{},"so，首先需要将 ",[17,47192,47186],{}," 导入环境，你可以选择直接写入环境变量，抑或是在项目下配置 ",[17,47195,47196],{},".env"," 文件，我采用的是最老土的方式：",[114,47199,47201],{"className":116,"code":47200,"language":118,"meta":119,"style":119},"import os\nos.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'  # 接口网址\nos.environ[\"OPENAI_API_KEY\"] = 'sk-~'  # Key 值\n",[17,47202,47203,47207,47212],{"__ignoreMap":119},[78,47204,47205],{"class":124,"line":125},[78,47206,7771],{},[78,47208,47209],{"class":124,"line":132},[78,47210,47211],{},"os.environ[\"OPENAI_API_BASE\"] = 'https:\u002F\u002F~'  # 接口网址\n",[78,47213,47214],{"class":124,"line":138},[78,47215,47216],{},"os.environ[\"OPENAI_API_KEY\"] = 'sk-~'  # Key 值\n",[13,47218,47219],{},"写入到了环境之后自然就不需要启动模型的时候配置 endpoint_url 了，那么代码如下：",[114,47221,47223],{"className":116,"code":47222,"language":118,"meta":119,"style":119},"from langchain_openai import OpenAI\nllm = OpenAI()\nresponse = llm.invoke('你好')\n",[17,47224,47225,47229,47234],{"__ignoreMap":119},[78,47226,47227],{"class":124,"line":125},[78,47228,46618],{},[78,47230,47231],{"class":124,"line":132},[78,47232,47233],{},"llm = OpenAI()\n",[78,47235,47236],{"class":124,"line":138},[78,47237,47176],{},[13,47239,47240],{},"那么到这里，就是 Model 模块的一半内容了，作为一个初学者，你现在应该掌握了使用一个模型，并接收返回的能力，关于其他什么异步啊、自定义啊，那需要在工程实践中掌握，有需求看文档就行。",[10548,47242,47244],{"id":47243},"_2文本嵌入-text-embedding","【2】文本嵌入 text embedding",[72,47246,47247,47250,47253,47256],{},[13,47248,47249],{},"Embedding 类是一个用于与嵌入进行交互的类。有许多嵌入提供商（OpenAI、Cohere、Hugging Face等)，这个类旨在为所有这些提供商提供一个标准接口。",[13,47251,47252],{},"嵌入会创建文本的向量表示。这很有用，因为这意味着我们可以在向量空间中考虑文本，并执行诸如语义搜索之类的操作，其中我们在向量空间中寻找最相似的文本片段。",[13,47254,47255],{},"LangChain 中的基本 Embedding 类公开了两种方法：embed_documents 和 embed_query。最大的区别在于这两种方法具有不同的接口：一个适用于多个文档，而另一个适用于单个文档。除此之外，将这两个方法作为两个单独的方法的另一个原因是，某些嵌入提供商针对要搜索的文档与查询本身具有不同的嵌入方法。",[13,47257,47258],{},"——摘自 langchain 中文网",[13,47260,47261],{},"还记得写在前面的文本词嵌入吗？简单来说就是将文字向量化，这当然不是一个函数就能解决的问题，具体实现原理的话可能 emmm 需要开个单章去研究下模型实现，现在我们只需要知道：执行的过程已经封装好了，告诉 langchain 你选择的 embedding 模型即可，有请 VCR：",[114,47263,47265],{"className":116,"code":47264,"language":118,"meta":119,"style":119},"from langchain.embeddings.huggingface import HuggingFaceEmbeddings\n# 一个 embedding 列表，记录常用的 embedding 对照关系\nembeddings_model_dict = {\n    \"ernie-tiny\": \"nghuyong\u002Fernie-3.0-nano-zh\",\n    \"ernie-base\": \"nghuyong\u002Fernie-3.0-base-zh\",\n    \"text2vec\": \"GranymeNil\u002Ftext2vec-large-chinese\",\n    \"text2vec2\": \"uer\u002Fsbert-base-chinese-nil\",\n    \"text2vec3\": \"shibing624\u002Ftext2vec-base-chinese\",\n}\n\ndef load_embedding_mode(model_name=\"ernie-tiny\"):\n    encode_kwargs = {\"normalize_embeddings\": False}\n    model_kwargs = {\"device\": \"cuda:0\"}\n    return HuggingFaceEmbeddings(\n        model_name=embeddings_model_dict[model_name],\n        encode_kwargs=encode_kwargs,\n        model_kwargs=model_kwargs\n    )\n\nembeddings = load_embedding_mode('text2vec3')\nprint(embeddings)\n\n\"\"\"\nclient=SentenceTransformer(\n  (0): Transformer({'max_seq_length': 128, 'do_lower_case': False}) with Transformer model: BertModel \n  (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False})\n) model_name='shibing624\u002Ftext2vec-base-chinese' cache_folder=None model_kwargs={'device': 'cuda:0'} encode_kwargs={'normalize_embeddings': False} multi_process=False\n\"\"\"\n",[17,47266,47267,47271,47276,47280,47284,47288,47292,47296,47300,47304,47308,47312,47316,47320,47324,47328,47332,47336,47340,47344,47349,47354,47358,47362,47367,47372,47377,47382],{"__ignoreMap":119},[78,47268,47269],{"class":124,"line":125},[78,47270,24004],{},[78,47272,47273],{"class":124,"line":132},[78,47274,47275],{},"# 一个 embedding 列表，记录常用的 embedding 对照关系\n",[78,47277,47278],{"class":124,"line":138},[78,47279,24042],{},[78,47281,47282],{"class":124,"line":144},[78,47283,24047],{},[78,47285,47286],{"class":124,"line":150},[78,47287,24052],{},[78,47289,47290],{"class":124,"line":156},[78,47291,24057],{},[78,47293,47294],{"class":124,"line":162},[78,47295,24062],{},[78,47297,47298],{"class":124,"line":168},[78,47299,24067],{},[78,47301,47302],{"class":124,"line":174},[78,47303,23518],{},[78,47305,47306],{"class":124,"line":180},[78,47307,129],{"emptyLinePlaceholder":128},[78,47309,47310],{"class":124,"line":186},[78,47311,24132],{},[78,47313,47314],{"class":124,"line":192},[78,47315,24137],{},[78,47317,47318],{"class":124,"line":198},[78,47319,24142],{},[78,47321,47322],{"class":124,"line":204},[78,47323,24147],{},[78,47325,47326],{"class":124,"line":210},[78,47327,24152],{},[78,47329,47330],{"class":124,"line":216},[78,47331,24157],{},[78,47333,47334],{"class":124,"line":222},[78,47335,24162],{},[78,47337,47338],{"class":124,"line":421},[78,47339,24167],{},[78,47341,47342],{"class":124,"line":427},[78,47343,129],{"emptyLinePlaceholder":128},[78,47345,47346],{"class":124,"line":433},[78,47347,47348],{},"embeddings = load_embedding_mode('text2vec3')\n",[78,47350,47351],{"class":124,"line":2443},[78,47352,47353],{},"print(embeddings)\n",[78,47355,47356],{"class":124,"line":2448},[78,47357,129],{"emptyLinePlaceholder":128},[78,47359,47360],{"class":124,"line":2454},[78,47361,46994],{},[78,47363,47364],{"class":124,"line":2460},[78,47365,47366],{},"client=SentenceTransformer(\n",[78,47368,47369],{"class":124,"line":2465},[78,47370,47371],{},"  (0): Transformer({'max_seq_length': 128, 'do_lower_case': False}) with Transformer model: BertModel \n",[78,47373,47374],{"class":124,"line":2470},[78,47375,47376],{},"  (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False})\n",[78,47378,47379],{"class":124,"line":2903},[78,47380,47381],{},") model_name='shibing624\u002Ftext2vec-base-chinese' cache_folder=None model_kwargs={'device': 'cuda:0'} encode_kwargs={'normalize_embeddings': False} multi_process=False\n",[78,47383,47384],{"class":124,"line":2909},[78,47385,46994],{},[13,47387,47388],{},"可以看到：embedding 返回的是一大堆参数，一些可以自定义，一些由模型给出。看不懂也没关系，它相当于定义了文字向量化的框架，这为我们下一个模块打下了基础。",[7759,47390,47392],{"id":47391},"_2模块二索引-indexes","（2）模块二：索引 Indexes",[13,47394,47395],{},"书接上文，我拿到了 embedding 给我的规则如何将我要的内容向量化呢？向量化之后我又该如何使用呢？因此第二步，我们就需要对数据进行处理~",[13,47397,47398],{},"索引下一共分为四个部分：",[49,47400,47401,47404],{},[52,47402,47403],{},"文档加载器（Document Loaders）",[52,47405,47406],{},"文本分割器（Text Splitters）",[114,47408,47410],{"className":116,"code":47409,"language":118,"meta":119,"style":119},"from langchain_community.document_loaders import DirectoryLoader\nfrom langchain.text_splitter import CharacterTextSplitter\n# 这里参数默认是同级目录下 data 文件夹中的文件\ndef load_document(directory=\"data\"):\n    loader = DirectoryLoader(directory)\n    documents = loader.load()\n    # 初始化，指定每个拆分块的大小和块之间的重叠量\n    text_splitter = CharacterTextSplitter(chunk_size=256, chunk_overlap=0)\n    split_docs = text_splitter.split_documents(documents)\n    return split_docs\n\ndocuments = load_document()\n",[17,47411,47412,47416,47420,47425,47429,47434,47438,47443,47447,47452,47456,47460],{"__ignoreMap":119},[78,47413,47414],{"class":124,"line":125},[78,47415,24014],{},[78,47417,47418],{"class":124,"line":132},[78,47419,24009],{},[78,47421,47422],{"class":124,"line":138},[78,47423,47424],{},"# 这里参数默认是同级目录下 data 文件夹中的文件\n",[78,47426,47427],{"class":124,"line":144},[78,47428,24089],{},[78,47430,47431],{"class":124,"line":150},[78,47432,47433],{},"    loader = DirectoryLoader(directory)\n",[78,47435,47436],{"class":124,"line":156},[78,47437,24099],{},[78,47439,47440],{"class":124,"line":162},[78,47441,47442],{},"    # 初始化，指定每个拆分块的大小和块之间的重叠量\n",[78,47444,47445],{"class":124,"line":168},[78,47446,24104],{},[78,47448,47449],{"class":124,"line":174},[78,47450,47451],{},"    split_docs = text_splitter.split_documents(documents)\n",[78,47453,47454],{"class":124,"line":180},[78,47455,24119],{},[78,47457,47458],{"class":124,"line":186},[78,47459,129],{"emptyLinePlaceholder":128},[78,47461,47462],{"class":124,"line":192},[78,47463,47464],{},"documents = load_document()\n",[13,47466,47467],{},"由上面的代码可见，非常的见名知意，最多就是初期照着文档熟悉下接口~",[49,47469,47470],{},[52,47471,47472],{},"向量存储（Vectorstores）",[114,47474,47476],{"className":116,"code":47475,"language":118,"meta":119,"style":119},"from langchain_community.vectorstores import Chroma\n# 将向量数据写入向量数据库 chromadb\ndef store_chroma(docs, embeddings, persist_directory='VectorStore'):\n    # 从 docs（document）文本文件写入\n    db = Chroma.from_documents(docs, embeddings, persist_directory=persist_directory)\n    # 持久化目录\n    db.persist()\n    return db\n# 如果没有 Vectorstore，依 embedding 创建\nif not os.path.exists(\"Vectorstore\"):\n    db = store_chroma(documents, embeddings)\nelse:\n    db = Chroma(persist_directory='VectorStore', embedding_function=embeddings)\n",[17,47477,47478,47482,47487,47491,47496,47500,47505,47509,47513,47518,47522,47527,47531],{"__ignoreMap":119},[78,47479,47480],{"class":124,"line":125},[78,47481,24019],{},[78,47483,47484],{"class":124,"line":132},[78,47485,47486],{},"# 将向量数据写入向量数据库 chromadb\n",[78,47488,47489],{"class":124,"line":138},[78,47490,24183],{},[78,47492,47493],{"class":124,"line":144},[78,47494,47495],{},"    # 从 docs（document）文本文件写入\n",[78,47497,47498],{"class":124,"line":150},[78,47499,24195],{},[78,47501,47502],{"class":124,"line":156},[78,47503,47504],{},"    # 持久化目录\n",[78,47506,47507],{"class":124,"line":162},[78,47508,24201],{},[78,47510,47511],{"class":124,"line":168},[78,47512,24207],{},[78,47514,47515],{"class":124,"line":174},[78,47516,47517],{},"# 如果没有 Vectorstore，依 embedding 创建\n",[78,47519,47520],{"class":124,"line":180},[78,47521,24229],{},[78,47523,47524],{"class":124,"line":186},[78,47525,47526],{},"    db = store_chroma(documents, embeddings)\n",[78,47528,47529],{"class":124,"line":192},[78,47530,24247],{},[78,47532,47533],{"class":124,"line":198},[78,47534,24259],{},[13,47536,47537],{},"这里使用了 chromadb 对向量化的数据进行保存~",[49,47539,47540],{},[52,47541,47542],{},"检索器（Retrievers）",[114,47544,47546],{"className":116,"code":47545,"language":118,"meta":119,"style":119},"retriever = db.as_retriever()\n",[17,47547,47548],{"__ignoreMap":119},[78,47549,47550],{"class":124,"line":125},[78,47551,47545],{},[13,47553,47554],{},"这里直接将 db 转化为检索器，一行就搞定了~",[7759,47556,47558],{"id":47557},"_3模块三-四链-chains-代理-agent","（3）模块三 && 四：链 Chains && 代理 Agent",[13,47560,47561],{},"Chains 绝对说得上是 langchain 的核心，但是并不准备花很多篇幅来讲他。在前两个模块里，我们已经能加载上模型、存储上向量化的数据并且准备好检索了。以人来比喻，这个时候你拥有了一个具有表达能力且大脑中有一定知识，并且你能让他依据知识进行回答。（下面我的例子和说法可能并不准确）",[13,47563,47564],{},"Chains 模块允许我们将之前的人组装起来：",[114,47566,47568],{"className":116,"code":47567,"language":118,"meta":119,"style":119},"from langchain.chains import RetrievalQA\nqa = RetrievalQA.from_chain_type(\n    llm=llm,\n    # 组装模式，可选 stuff | Refine | Map reduce | Map rerank\n    chain_type='stuff',\n    retriever=retriever\n)\n",[17,47569,47570,47575,47579,47583,47588,47592,47596],{"__ignoreMap":119},[78,47571,47572],{"class":124,"line":125},[78,47573,47574],{},"from langchain.chains import RetrievalQA\n",[78,47576,47577],{"class":124,"line":132},[78,47578,24293],{},[78,47580,47581],{"class":124,"line":138},[78,47582,24299],{},[78,47584,47585],{"class":124,"line":144},[78,47586,47587],{},"    # 组装模式，可选 stuff | Refine | Map reduce | Map rerank\n",[78,47589,47590],{"class":124,"line":150},[78,47591,24305],{},[78,47593,47594],{"class":124,"line":156},[78,47595,24311],{},[78,47597,47598],{"class":124,"line":162},[78,47599,8041],{},[13,47601,47602],{},"当然你也可以在这条 Chain 上延展，原则上一个人有两个大脑、四种检索方式、八个表达语句并不是什么奇怪的事，Chains 模块就是保证这条流水线能够正常执行。",[13,47604,47605],{},"而 Agents 模块允许这个人使用点工具来帮助操作，比如我需要计算 10000 x 10000，明明计算器能算的东西让我用大脑算岂不是太折磨了吗（我想到了现在 GPU 和 CPU 的爱恨情仇），因此，代理模块通过提供代理执行器 Agent Executors 简化了一些不必要的计算，或者说，通过给予一些人”职业“，来让处理效果更加高效且准确。",[13,47607,47608],{},"如同最近看了解到的 XAgent，多个 Agent 协作能把效率最大化（什么赛博奴隶）",[13,47610,47611],{},"然后最后介绍下 Chains 的类型：",[49,47613,47614],{},[52,47615,47616],{},"Stuff",[13,47618,47619],{},[617,47620],{"alt":119,"src":47621},"img\u002Flangchain\u002FStuff.png",[13,47623,47624],{},"stuff 无优化，就是一条直链。",[13,47626,47627],{},"eg. 假如 token 只有 8000，输入 10000 就会 oom",[49,47629,47630],{},[52,47631,47632],{},"Refine",[13,47634,47635],{},[617,47636],{"alt":119,"src":47637},"img\u002Flangchain\u002FRefine.png",[13,47639,47640],{},"refine 循环（loop）调用，对文档内容分片，并将上一轮的结果作为下一轮的输入放入。",[13,47642,47643],{},"eg. token 8000，分片假如 2000，就会将 10000 的文本转换成 2000 + 上一轮循环结果进行输入",[49,47645,47646],{},[52,47647,47648],{},"Map reduce",[13,47650,47651],{},"这个就不用介绍了吧，学大数据都写烂了~我其他文章至少介绍过 3 遍 MapReduce 了 emmmm",[49,47653,47654],{},[52,47655,47656],{},"Map rerank（没了解，有机会再补）",[7759,47658,47660],{"id":47659},"_4模块五-六-记忆存储memory-提示工程prompts","（4）模块五 && 六 记忆存储（Memory） &&  提示工程（Prompts）",[13,47662,47663],{},"Memory 模块没用过，基本是对内存、向量空间、知识图谱等进行操作，目前我还没用过就不班门弄斧了。",[13,47665,47666],{},"Prompts 模块可能会是用得最多的模块，也是”伪“调优、糊弄上司的一把好手：langchain 的默认提示词都是英文的，即使你给他的都是中文语料，但是可能因为提示词是英文的导致输出是英文 or 四不像。因此，对于输出进行规范的第一步就是使用自己的提示词。",[114,47668,47670],{"className":116,"code":47669,"language":118,"meta":119,"style":119},"from langchain.prompts import PromptTemplate\nprompt_template = \"\"\"总结这段新闻的内容：\n    \"{text}\"\n    总结:\"\"\"\n# 将输入内容填充进 prompt 模板\nchinese_prompt = PromptTemplate(template=prompt_template, input_variables=[\"text\"])\n# prompt 也是 chain play 的一环啊\nchain = load_summarize_chain(llm, prompt=chinese_prompt)\n",[17,47671,47672,47677,47682,47686,47690,47695,47700,47705],{"__ignoreMap":119},[78,47673,47674],{"class":124,"line":125},[78,47675,47676],{},"from langchain.prompts import PromptTemplate\n",[78,47678,47679],{"class":124,"line":132},[78,47680,47681],{},"prompt_template = \"\"\"总结这段新闻的内容：\n",[78,47683,47684],{"class":124,"line":138},[78,47685,24978],{},[78,47687,47688],{"class":124,"line":144},[78,47689,24983],{},[78,47691,47692],{"class":124,"line":150},[78,47693,47694],{},"# 将输入内容填充进 prompt 模板\n",[78,47696,47697],{"class":124,"line":156},[78,47698,47699],{},"chinese_prompt = PromptTemplate(template=prompt_template, input_variables=[\"text\"])\n",[78,47701,47702],{"class":124,"line":162},[78,47703,47704],{},"# prompt 也是 chain play 的一环啊\n",[78,47706,47707],{"class":124,"line":168},[78,47708,46676],{},[13,47710,47711],{},"可见，prompt 操作其实是针对批量化处理等操作的一个简化步骤，例如你使用爬虫的时候就能很好的控制输出而不必过于担心内容的差异性。当然也有专门对输出格式进行规约的，比如：",[114,47713,47715],{"className":116,"code":47714,"language":118,"meta":119,"style":119},"from langchain.output_parsers import PydanticOutputParser\ntemplate = \"\"\"\\\n        我将给你一段新闻的概括，请按照要求把这段新闻改写成郭德纲和于谦的对口相声剧本。\n    \n        新闻: \"{新闻}\"\n        要求: \"{要求}\"\n        {output_instructions}\n    \"\"\"\nparser = PydanticOutputParser(pydantic_object=XiangSheng)\nprompt = PromptTemplate(\n    template=template,\n    input_variables=[\"新闻\", \"要求\"],\n    partial_variables={\"output_instructions\": parser.get_format_instructions()}\n)\nclass XiangSheng(BaseModel):\n    script: List[Line] = Field(description=\"一段相声的台词剧本\")\n",[17,47716,47717,47722,47727,47731,47735,47739,47743,47747,47751,47756,47761,47766,47771,47776,47780,47784],{"__ignoreMap":119},[78,47718,47719],{"class":124,"line":125},[78,47720,47721],{},"from langchain.output_parsers import PydanticOutputParser\n",[78,47723,47724],{"class":124,"line":132},[78,47725,47726],{},"template = \"\"\"\\\n",[78,47728,47729],{"class":124,"line":138},[78,47730,25063],{},[78,47732,47733],{"class":124,"line":144},[78,47734,6942],{},[78,47736,47737],{"class":124,"line":150},[78,47738,25068],{},[78,47740,47741],{"class":124,"line":156},[78,47742,25073],{},[78,47744,47745],{"class":124,"line":162},[78,47746,25078],{},[78,47748,47749],{"class":124,"line":168},[78,47750,25083],{},[78,47752,47753],{"class":124,"line":174},[78,47754,47755],{},"parser = PydanticOutputParser(pydantic_object=XiangSheng)\n",[78,47757,47758],{"class":124,"line":180},[78,47759,47760],{},"prompt = PromptTemplate(\n",[78,47762,47763],{"class":124,"line":186},[78,47764,47765],{},"    template=template,\n",[78,47767,47768],{"class":124,"line":192},[78,47769,47770],{},"    input_variables=[\"新闻\", \"要求\"],\n",[78,47772,47773],{"class":124,"line":198},[78,47774,47775],{},"    partial_variables={\"output_instructions\": parser.get_format_instructions()}\n",[78,47777,47778],{"class":124,"line":204},[78,47779,8041],{},[78,47781,47782],{"class":124,"line":210},[78,47783,25255],{},[78,47785,47786],{"class":124,"line":216},[78,47787,25261],{},[13,47789,47790],{},"格式的规约主要还是用在后期的数据处理上，因此 parser 这个操作完全可以看作 prompt 的 prompt，一个是从语言层面上的约束，一个是从代码层面上的约束，本质上并无特别大的区别。",[23289,47792],{},[107,47794,47796],{"id":47795},"_5-总结","5 总结",[13,47798,47799],{},"到这里，其实看似好像啥都讲了，但是又好像啥都没讲。不过把上面模块中介绍的代码拼凑起来，你已经能够实现一个”本地知识库问答“的功能，自己在写几个 api 调用，已经遥遥领先于过去千篇一律的系统了（然而实际上代码只有 60 行不到）。",[13,47801,47802],{},"这几个小实践的代码会在之后的《LangChain 实践》中，其实也没啥，都是照着我前面提到的几个非常棒的 B 站教学操作的。不过为了方便不想看课以及 debug 的同学操作，到时候会把注释打好再发出来（如果不想 debug 建议还是别学了，新技术要的就是不停的 debug）",[13,47804,47805],{},"总之，langchain 其实就是一个人类与 LLMs 交互的中间件，不过它的可玩性很足，支持包括 B 站视频等输入源的数据输入（因此，我有理由怀疑最近 B 站的一大堆 AI 视频助手多少都使用了 langchain）。工具想要熟练只能是多实践，不要因为环境的限制而停下脚步~",[13,47807,47808],{},"本实践在 P106-100 6G ≈ 1060 6G 完成 T_T，啥时候有富婆支援一块 4090 炼丹啊~",[226,47810,228],{},{"title":119,"searchDepth":144,"depth":144,"links":47812},[47813,47814,47818,47823,47830],{"id":46203,"depth":132,"text":46204},{"id":46226,"depth":132,"text":46227,"children":47815},[47816,47817],{"id":46233,"depth":144,"text":46234},{"id":46569,"depth":144,"text":46570},{"id":46747,"depth":132,"text":46748,"children":47819},[47820,47821,47822],{"id":46751,"depth":144,"text":46752},{"id":46761,"depth":144,"text":46762},{"id":46795,"depth":144,"text":46796},{"id":46866,"depth":132,"text":46867,"children":47824},[47825,47826,47827,47828,47829],{"id":46876,"depth":144,"text":46877},{"id":47148,"depth":144,"text":47149},{"id":47391,"depth":144,"text":47392},{"id":47557,"depth":144,"text":47558},{"id":47659,"depth":144,"text":47660},{"id":47795,"depth":132,"text":47796},{},"Little Tips\u002FLangChain入门与避坑.md","\u002Fundergraduate\u002Fnote-677ab4a41aa2",{"title":46187,"description":119},"undergraduate\u002Fnote-677ab4a41aa2",[794,14541,10715,6380,14542],"FD0UtwoiwHnNhksfTXQJbdnlM-6FME0pK0lK3VWaVKg",{"id":47839,"title":47840,"assetBase":239,"author":8,"body":47841,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":48333,"navigation":128,"originalPath":48334,"path":48335,"seo":48336,"source":23330,"stem":48337,"tags":48338,"weight":250,"__hash__":48339},"content\u002Fundergraduate\u002Fnote-6d119ee287c4.md","大数据案例分析备考",{"type":10,"value":47842,"toc":48304},[47843,47847,47851,47861,47864,47867,47871,47876,47879,47893,47900,47904,47910,47913,47927,47930,47934,47941,47944,47970,47973,47977,47980,47983,47997,48004,48007,48011,48020,48023,48043,48046,48050,48056,48059,48079,48082,48086,48092,48095,48109,48111,48115,48119,48122,48125,48128,48132,48135,48138,48142,48146,48150,48154,48158,48162,48165,48168,48171,48174,48178,48181,48184,48187,48189,48193,48197,48200,48204,48207,48210,48214,48264,48268,48272,48276,48280,48283,48286,48289,48292,48296,48300],[107,47844,47846],{"id":47845},"名词解释-10","名词解释 10",[7759,47848,47850],{"id":47849},"_1数据湖","1、数据湖",[13,47852,47853,47854,47857,47858,67],{},"数据湖是一个",[22,47855,47856],{},"数据存储和管理平台","，它允许企业集中存储各种类型和格式的数据，包括结构化数据、非结构化数据和半结构化数据。数据湖通常采用云存储技术，以",[22,47859,47860],{},"实现高可扩展性、高吞吐量和低成本的数据存储",[13,47862,47863],{},"与传统的数据仓库不同，数据湖不会对数据进行转换或规范化，并且不会将数据划分为预定义的模式或模板。相反，数据湖会将数据以原始格式保存，并在需要时通过查询和分析工具进行处理、转换和规范化。",[13,47865,47866],{},"由于其灵活性和高可扩展性，数据湖已成为当今大数据处理和分析领域中的一种重要解决方案。通过使用数据湖，企业可以更轻松地管理和分析大量的数据，以发现隐藏的业务见解、趋势和机会。",[7759,47868,47870],{"id":47869},"_2数据血缘","2、数据血缘",[13,47872,47873],{},[22,47874,47875],{},"数据血缘是指数据元素之间的关系和来源的追溯。它描述了数据在整个信息系统中从输入到输出的流动和变化过程，以及数据元素之间的依赖关系。",[13,47877,47878],{},"数据血缘可以帮助人们理解数据的来源、转换和用途，提供关于数据质量和可信度的信息。通过追踪数据的血缘，可以回答以下问题：",[2285,47880,47881,47884,47887,47890],{},[52,47882,47883],{},"数据的来源是什么？数据是从哪个系统、哪个表格或哪个数据源中获取的？",[52,47885,47886],{},"数据是如何被处理和转换的？是否经过了加工、整合、清洗或转换等操作？",[52,47888,47889],{},"数据被用于哪些目的？哪些报表、分析或决策依赖于这个数据？",[52,47891,47892],{},"数据的变更和更新如何影响其他数据和报表？如果某个数据发生变化，会对其他数据造成什么影响？",[13,47894,47895,47896,47899],{},"数据血缘可以",[22,47897,47898],{},"通过记录元数据和使用特定的工具和技术来实现","。元数据是描述数据和数据元素的数据，可以包括数据的源头、数据的转换规则、业务规则和数据的消费者等信息。数据管理和数据治理工具可以帮助收集、维护和分析数据血缘信息，以帮助企业更好地理解和管理数据。",[7759,47901,47903],{"id":47902},"_3用户画像","3、用户画像",[13,47905,47906,47907],{},"用户画像是对特定用户群体进行综合描述和分类的方法，旨在更好地理解和洞察用户的特征、需求、偏好和行为。",[22,47908,47909],{},"用户画像是基于数据和分析构建的，通过收集、整理和分析用户的基本信息、在线行为、消费习惯、兴趣爱好等数据，来形成对用户的描述和刻画。",[13,47911,47912],{},"用户画像的主要目的是帮助企业更好地了解他们的目标用户，从而能够更有针对性地进行产品开发、市场营销、广告投放和客户服务等活动。通过用户画像，企业可以进行以下方面的分析和决策：",[2285,47914,47915,47918,47921,47924],{},[52,47916,47917],{},"目标市场定位：通过用户画像，企业可以确定目标用户的特征和需求，以便更好地定位自己的产品和服务。",[52,47919,47920],{},"产品改进和个性化：用户画像可以揭示用户的偏好和需求，帮助企业了解用户对产品的评价和反馈，从而进行产品改进和个性化设计。",[52,47922,47923],{},"客户关系管理：用户画像可以帮助企业了解用户的行为和消费习惯，更好地进行客户分类和关系管理，提供个性化的客户服务和沟通。",[52,47925,47926],{},"营销和广告策略：通过用户画像，企业可以了解用户的兴趣爱好和消费特点，以便更精准地进行营销和广告推送，提高广告投放的效果和回报。",[13,47928,47929],{},"用户画像的建立需要收集和分析大量的用户数据，包括用户注册信息、用户行为数据、社交媒体数据等。企业可以通过调研、用户调查、网站分析工具等方式来获取这些数据，并使用数据分析和挖掘技术来构建用户画像模型。",[7759,47931,47933],{"id":47932},"_4大数据可视化","4、大数据可视化",[13,47935,47936,47937,47940],{},"大数据可视化是指",[22,47938,47939],{},"将大量、复杂的数据集合通过图表、图像、地图等视觉化手段呈现出来，以帮助人们更直观地理解和分析数据","。大数据可视化旨在从海量数据中发现变化、趋势和关联信息，以便更好地做出商业决策。",[13,47942,47943],{},"大数据可视化的优点包括：",[2285,47945,47946,47952,47958,47964],{},[52,47947,47948,47951],{},[22,47949,47950],{},"提供更直观的信息","：通过视觉化手段呈现数据，可以更容易地找出关键信息和特征，实现数据的快速理解和分析。",[52,47953,47954,47957],{},[22,47955,47956],{},"支持交互式分析","：大数据可视化可以支持用户交互和操作，让用户可以自行探索和发现数据的关系和规律。",[52,47959,47960,47963],{},[22,47961,47962],{},"增强数据的可信度","：通过视觉化方式呈现数据，可以强化数据的可信度和说服力，用户可以更加信任和理解数据。",[52,47965,47966,47969],{},[22,47967,47968],{},"改进决策过程","：通过视觉化方式呈现数据，可以减少决策的错误和偏差，提高决策的准确性和效率。",[13,47971,47972],{},"大数据可视化可以通过多种工具和技术来实现，如可视化编程语言、可视化软件、图形库和API等。常用的可视化类型包括条形图、折线图、饼图、热力图、地图和雷达图等。",[7759,47974,47976],{"id":47975},"_5etl","5、ETL",[13,47978,47979],{},"**ETL是指将数据从源系统中提取（Extract）、经过清洗和转换（Transform），然后加载（Load）至目标系统的过程。**ETL是数据仓库和商业智能系统中常用的数据集成和数据处理方法。",[13,47981,47982],{},"在ETL过程中，各个步骤的主要任务如下：",[2285,47984,47985,47988,47991],{},[52,47986,47987],{},"**提取（Extract）：从源系统中获取需要的数据。**这可能涉及到不同的数据源，如关系数据库、文件、Web服务、API等。数据提取的目标是获取源系统中的原始数据，通常使用特定的提取方法和查询语言进行操作。",[52,47989,47990],{},"**转换（Transform）：对提取的数据进行清洗、整合、加工和转换。**在这个阶段，数据被清洗、校验、筛选、聚合和转换为目标系统所需的格式和结构。这可能包括数据的过滤、排序、删除重复值、数据变换和计算衍生指标等操作。",[52,47992,47993,47996],{},[22,47994,47995],{},"加载（Load）：将转换后的数据加载至目标系统","，通常是数据仓库、数据湖、数据集市或其他用于分析和决策的数据存储系统。加载过程可能涉及到数据的更新、插入、覆盖、合并等操作，以确保数据的完整性和一致性。",[13,47998,47999,48000,48003],{},"ETL的",[22,48001,48002],{},"主要目的是将散乱的、异构的数据整合为一致性和可用性的数据集，以支持数据分析、报表生成、决策支持、业务洞察和其他商业智能应用","。通过ETL，可以清理和准备数据，提供高质量和可信度的数据供给。",[13,48005,48006],{},"ETL工具是用于自动化和简化ETL过程的软件工具。它们提供了可视化的界面和功能，支持数据源连接、数据抽取、数据转换和数据加载等操作，以及调度、监控和错误处理等任务。一些常见的ETL工具包括Informatica PowerCenter、Microsoft SQL Server Integration Services（SSIS）、Apache NiFi和Talend等。",[7759,48008,48010],{"id":48009},"_6半结构化数据","6、半结构化数据",[13,48012,48013,67],{},[22,48014,48015,48016,48019],{},"半结构化数据是指具有一定结构特征但不符合传统关系型数据库的严格结构规则的数据。",[22,48017,48018],{},"与结构化数据（如表格形式的数据）相比，半结构化数据","没有固定的模式和统一的数据模型",[13,48021,48022],{},"半结构化数据的特点包括：",[2285,48024,48025,48031,48037],{},[52,48026,48027,48030],{},[22,48028,48029],{},"可以存在不同的数据类型和格式","：半结构化数据可以包含文本、XML、JSON、HTML、日志文件等多种数据类型和格式。每个数据实例可以具有不同的字段和属性，并且字段的顺序和层次结构可以变化。",[52,48032,48033,48036],{},[22,48034,48035],{},"可以具有重复的数据","：半结构化数据中的某些字段和元素可以重复出现，相同的字段可以存在于不同的层次结构中。这使得半结构化数据在存储和处理时更加灵活和自由。",[52,48038,48039,48042],{},[22,48040,48041],{},"缺乏严格的模式和约束","：与关系型数据库中定义的结构不同，半结构化数据没有严格的模式和约束条件。数据的结构和规则可能在不同的实例之间或数据源之间有所差异。",[13,48044,48045],{},"半结构化数据的处理和管理通常需要使用专门的工具和技术，例如XML解析器、JSON解析器、XPath查询、XSLT转换等。半结构化数据的应用场景包括网页抓取和分析、日志文件处理、传感器数据处理、大数据分析等。",[7759,48047,48049],{"id":48048},"_7结构化数据","7、结构化数据",[13,48051,48052,48055],{},[22,48053,48054],{},"结构化数据是指具有明确定义和规范化的格式和结构的数据","。这种类型的数据通常以表格形式呈现，其中数据存储在行和列中，并通过列头和数据类型定义了数据的结构。",[13,48057,48058],{},"常见的结构化数据包括关系数据库中的数据、电子表格中的数据和类似格式的数据文件等。其主要特点包括：",[2285,48060,48061,48067,48073],{},[52,48062,48063,48066],{},[22,48064,48065],{},"具有固定的模式和结构","：结构化数据使用预定义的模式和格式来存储和组织数据。这使得数据可以轻松访问和查找，并易于分析和处理。",[52,48068,48069,48072],{},[22,48070,48071],{},"可以使用SQL进行查询","：关系型数据库使用SQL（Structured Query Language）进行查询和检索数据。使用SQL可以轻松找到所需的数据，从而进行进一步分析和处理。",[52,48074,48075,48078],{},[22,48076,48077],{},"可以进行规范化和约束","：按照规范化和约束规则，可以对结构化数据进行限制和验证，以确保数据的一致性和完整性。这有助于减少数据冗余和错误，并合理使用存储空间。",[13,48080,48081],{},"结构化数据通常用于各种业务和科学应用程序中，如金融、医疗、科学研究、人力资源等。处理和管理结构化数据通常需要使用专门的软件和技术，如关系数据库管理系统（RDBMS）、SQL查询、数据仓库、ETL工具等。",[7759,48083,48085],{"id":48084},"_8数据仓库","8、数据仓库",[13,48087,48088,48091],{},[22,48089,48090],{},"数据仓库是一个集成、主题导向的、面向分析的数据存储系统，用于支持企业级的决策制定和业务洞察","。它是将各种来源的数据整合到一个统一的、一致性的、易于访问和分析的数据存储中。",[13,48093,48094],{},"数据仓库的主要特点包括：",[2285,48096,48097,48100,48103,48106],{},[52,48098,48099],{},"集成性：数据仓库收集来自多个源系统的数据，并将它们整合到一个统一的环境中。这包括来自关系数据库、文件系统、Web服务等各种数据源的数据。",[52,48101,48102],{},"主题导向：数据仓库以特定的主题为导向，例如销售分析、客户洞察、市场趋势等。每个主题都包含了相关的数据、维度和度量指标，以支持特定的业务分析需求。",[52,48104,48105],{},"面向分析：数据仓库的目的是支持大规模数据分析和决策制定。它提供了丰富的分析功能，包括数据聚合、切片和切块、数据挖掘、预测和模型建立等。",[52,48107,48108],{},"一致性和稳定性：数据仓库通过数据清洗、转换和标准化等过程，确保数据的一致性和质量。它提供了可靠的数据存储和管理机制，以确保数据的完整性和稳定性。",[23289,48110],{},[107,48112,48114],{"id":48113},"简答题-30","简答题 30",[7759,48116,48118],{"id":48117},"_1东方航空为什么做数据中心","1、（东方航空）为什么做数据中心",[13,48120,48121],{},"（1）早年大量的xml等半结构化数据没有得到有效的利用；",[13,48123,48124],{},"（2）业务上，常规情况下实时数据是报文形式的非结构化数据，刷库解析后再分析有数小时延迟，无法做到及时使用，难以得到决策支持；",[13,48126,48127],{},"（3）系统上，在系统层面关系复杂、难拓展、难以满足业务发展需求，在订座、离港、电商三大平台之间相互割裂、无法融合。",[7759,48129,48131],{"id":48130},"_2科大讯飞如何实现精准营销","2、（科大讯飞）如何实现精准营销",[13,48133,48134],{},"凭借自身独一无二的大数据来源，并结合自身的处理技术，为大数据精准营销提供了可靠的支持。",[13,48136,48137],{},"科大讯飞开放自己的人工智能开放平台，从合作伙伴处得到相应的用户数据，从而不断拓展数据的容量和覆盖面。以平台上的大数据为基础进行有针对性的用户画像后，得以实现多种形式的大数据精准营销。",[7759,48139,48141],{"id":48140},"_3海尔架构图","3、（海尔）架构图",[13,48143,48144],{},[617,48145],{"alt":119,"src":25668},[7759,48147,48149],{"id":48148},"_4科大讯飞架构图","4、（科大讯飞）架构图",[13,48151,48152],{},[617,48153],{"alt":119,"src":25603},[7759,48155,48157],{"id":48156},"_5京东平台架构的目的","5、（京东）平台架构的目的",[13,48159,48160],{},[617,48161],{"alt":119,"src":25765},[13,48163,48164],{},"（1）实时感知业务运营情况，实现实时决策支持，如营销策略调整、库房排班等；",[13,48166,48167],{},"（2）根据客户的位置、实时的浏览轨迹、商品的价格变化等提供精准推荐和广告推送等；",[13,48169,48170],{},"（3）动态产生Top排行榜，提供销量排行、热度排行等实时数据；",[13,48172,48173],{},"（4）优化离线数据仓库数据抽取环节，彻底改变过去“T + 1”模式的数据仓库必须等到每天凌晨以增量或全量抽取业务数据的方式进行数据处理的做法。",[7759,48175,48177],{"id":48176},"_6实时数据平台解决的问题3个","6、实时数据平台解决的问题（3个）",[13,48179,48180],{},"（1）实时数据采集——数据来源渠道是什么，怎么确保数据完整和低延迟；",[13,48182,48183],{},"（2）实时数据存储——数据如何存储，怎样做到存储统一、方便使用和满足高吞吐量的要求；",[13,48185,48186],{},"（3）实时数据计算——数据如何计算，怎样确保及时性，并支持高复杂度场景。",[23289,48188],{},[107,48190,48192],{"id":48191},"数据中台-50","数据中台 50",[7759,48194,48196],{"id":48195},"_1背景","1、背景",[13,48198,48199],{},"遵循阿里的“OneData”数据流转设计，实现对项目数据的完整流程监控，我们组的主要业务方向是电商运营，所以从这个角度阐述背景。（简称现场编）",[7759,48201,48203],{"id":48202},"_2数据资产管理","2、数据资产管理",[13,48205,48206],{},"数据资产管理的内容主要包括：数据标准管理、元数据管理、主数据管理、数据质量管理、数据安全管理、数据交换管理（数据共享管理）、数据生命周期管理七个方面。",[13,48208,48209],{},"在代码中以元数据管理、数据质量管理、数据安全管理、数据交换管理为主要体现。比如使用MySQL作为Hive数仓的元数据管理、Atlas+Solr做整个项目的元数据管理；Datax作为不同数据源之间的数据交换管理、Azkaban作为项目调度工具实现数据交换管理。",[7759,48211,48213],{"id":48212},"_3数据库管理","3、数据库管理",[2285,48215,48216,48222,48228,48234,48240,48246,48252,48258],{},[52,48217,48218,48221],{},[22,48219,48220],{},"数据库规划","：确定需要管理的数据库类型和结构，选择适合业务需求的数据库技术，例如关系型数据库（如MySQL、Oracle）或非关系型数据库（如MongoDB、Redis）。",[52,48223,48224,48227],{},[22,48225,48226],{},"数据库建模与设计","：根据业务需求设计数据库的表结构，包括表关系、字段定义、主键、外键等。",[52,48229,48230,48233],{},[22,48231,48232],{},"数据库创建与维护","：根据数据库设计，创建数据库实例，并进行数据库的安装、配置和初始化工作。定期进行数据库维护，包括备份、性能优化、容量规划等。",[52,48235,48236,48239],{},[22,48237,48238],{},"数据库安全性管理","：通过权限控制、身份验证、数据加密等措施确保数据库的安全性。设置合理的用户权限，限制敏感数据的访问，并监控数据库的操作和访问情况。",[52,48241,48242,48245],{},[22,48243,48244],{},"数据库性能优化","：根据实际需求和访问模式，对数据库进行性能优化，包括索引优化、SQL查询优化、数据分区、缓存策略等。",[52,48247,48248,48251],{},[22,48249,48250],{},"数据库监控与故障处理","：使用监控工具对数据库进行实时监控，及时发现和解决潜在的性能问题和故障。建立数据库的备份和恢复策略，防止数据丢失和灾难发生。",[52,48253,48254,48257],{},[22,48255,48256],{},"数据库升级与迁移","：根据业务需要，定期升级数据库软件版本，并确保兼容性和数据的无损迁移。",[52,48259,48260,48263],{},[22,48261,48262],{},"数据库文档化与元数据管理","：及时记录和更新数据库的技术文档和元数据信息，包括数据字典、数据流程和数据模型等，以便后续维护和追踪。",[7759,48265,48267],{"id":48266},"_4数仓模型","4、数仓模型",[13,48269,48270],{},[617,48271],{"alt":119,"src":25961},[7759,48273,48275],{"id":48274},"_5支持的业务","5、支持的业务",[13,48277,48278],{},[617,48279],{"alt":119,"src":25773},[13,48281,48282],{},"电商的业务流程可以以一个普通用户的浏览足迹为例进行说明，用户点开电商首页开始浏览，可能会通过分类查询也可能通过全文搜索寻找自己中意的商品，这些商品无疑都是存储在后台的管理系统中的。",[13,48284,48285],{},"当用户寻找到自己中意的商品，可能会想要购买，将商品添加到购物车后发现需要登录，登录后对商品进行结算，这时候购物车的管理和商品订单信息的生成都会对业务数据库产生影响，会生成相应的订单数据和支付数据。",[13,48287,48288],{},"订单正式生成之后，还会对订单进行跟踪处理，直到订单全部完成。",[13,48290,48291],{},"电商的主要业务流程包括用户前台浏览商品时的商品详情的管理，用户商品加入购物车进行支付时用户个人中心&支付服务的管理，用户支付完成后订单后台服务的管理，这些流程涉及到了十几个甚至几十个业务数据表，甚至更多。",[7759,48293,48295],{"id":48294},"_6算法","6、算法",[7759,48297,48299],{"id":48298},"_7平台架构","7、平台架构",[13,48301,48302],{},[617,48303],{"alt":119,"src":25788},{"title":119,"searchDepth":144,"depth":144,"links":48305},[48306,48316,48324],{"id":47845,"depth":132,"text":47846,"children":48307},[48308,48309,48310,48311,48312,48313,48314,48315],{"id":47849,"depth":144,"text":47850},{"id":47869,"depth":144,"text":47870},{"id":47902,"depth":144,"text":47903},{"id":47932,"depth":144,"text":47933},{"id":47975,"depth":144,"text":47976},{"id":48009,"depth":144,"text":48010},{"id":48048,"depth":144,"text":48049},{"id":48084,"depth":144,"text":48085},{"id":48113,"depth":132,"text":48114,"children":48317},[48318,48319,48320,48321,48322,48323],{"id":48117,"depth":144,"text":48118},{"id":48130,"depth":144,"text":48131},{"id":48140,"depth":144,"text":48141},{"id":48148,"depth":144,"text":48149},{"id":48156,"depth":144,"text":48157},{"id":48176,"depth":144,"text":48177},{"id":48191,"depth":132,"text":48192,"children":48325},[48326,48327,48328,48329,48330,48331,48332],{"id":48195,"depth":144,"text":48196},{"id":48202,"depth":144,"text":48203},{"id":48212,"depth":144,"text":48213},{"id":48266,"depth":144,"text":48267},{"id":48274,"depth":144,"text":48275},{"id":48294,"depth":144,"text":48295},{"id":48298,"depth":144,"text":48299},{},"我的大学\u002F大四上学期\u002F大数据案例分析\u002F大数据案例分析备考.md","\u002Fundergraduate\u002Fnote-6d119ee287c4",{"title":47840,"description":119},"undergraduate\u002Fnote-6d119ee287c4",[14968,7744,23378,10715,6380,14542],"DWV8a18rfsb6nI48tFG4MMs_tca6_klOlM898qrxbhU",{"id":48341,"title":48342,"assetBase":239,"author":8,"body":48343,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":51059,"navigation":128,"originalPath":51060,"path":51061,"seo":51062,"source":23330,"stem":51063,"tags":51064,"weight":250,"__hash__":51065},"content\u002Fundergraduate\u002Fnote-70730b92c3fb.md","我的网络安全入门",{"type":10,"value":48344,"toc":50948},[48345,48348,48357,48360,48369,48372,48376,48381,48385,48388,48391,48394,48398,48401,48404,48407,48410,48413,48417,48422,48426,48429,48432,48437,48443,48446,48449,48453,48458,48461,48464,48468,48471,48475,48478,48482,48485,48489,48496,48500,48503,48507,48510,48513,48517,48528,48533,48537,48540,48544,48550,48553,48558,48562,48565,48572,48576,48579,48582,48592,48598,48603,48607,48611,48616,48619,48624,48627,48630,48634,48640,48643,48648,48652,48655,48659,48662,48665,48667,48671,48674,48678,48685,48693,48697,48700,48707,48710,48714,48717,48720,48722,48726,48729,48733,48736,48743,48746,48766,48770,48774,48777,48780,48820,48824,48827,48853,48860,48864,48867,48873,48877,48880,48916,48920,48944,48948,48951,48955,48958,48962,48965,48968,48972,48975,48981,48984,48988,49001,49005,49008,49012,49019,49026,49031,49035,49042,49045,49077,49080,49099,49103,49106,49109,49111,49115,49118,49122,49128,49131,49134,49138,49141,49144,49147,49151,49154,49161,49165,49169,49172,49178,49182,49185,49188,49192,49219,49221,49225,49231,49235,49238,49241,49245,49252,49256,49259,49273,49276,49280,49284,49287,49291,49294,49305,49308,49310,49314,49317,49321,49325,49328,49336,49340,49343,49357,49361,49364,49367,49401,49405,49408,49411,49415,49419,49422,49426,49429,49432,49440,49443,49447,49453,49456,49458,49462,49465,49469,49472,49476,49482,49486,49489,49492,49496,49500,49503,49506,49512,49516,49519,49527,49532,49536,49539,49543,49546,49556,49560,49563,49566,49570,49573,49577,49584,49588,49591,49595,49598,49602,49606,49609,49613,49616,49619,49623,49626,49633,49637,49643,49646,49648,49652,49654,49657,49671,49674,49685,49689,49692,49696,49699,49705,49708,49712,49715,49719,49722,49726,49730,49733,49737,49740,49744,49747,49751,49754,49756,49760,49763,49767,49773,49776,49782,49786,49789,49796,49800,49806,49810,49813,49816,49823,49827,49830,49834,49837,49840,49843,49847,49850,49853,49856,49858,49862,49865,49868,49871,49874,49878,49884,49887,49893,49901,49908,49911,49915,49918,49924,49928,49934,49936,49940,49943,49945,49948,49956,49959,49963,49966,49970,49973,49977,49980,49984,49987,49991,49994,49998,50001,50005,50008,50015,50019,50022,50026,50029,50049,50053,50056,50059,50063,50066,50069,50075,50079,50085,50088,50093,50101,50111,50115,50118,50121,50125,50128,50132,50138,50142,50145,50149,50152,50163,50166,50170,50173,50177,50181,50185,50189,50193,50197,50201,50204,50208,50212,50216,50218,50222,50225,50233,50237,50240,50246,50249,50253,50256,50259,50263,50266,50273,50287,50291,50301,50309,50313,50316,50318,50322,50325,50329,50336,50339,50342,50345,50350,50361,50364,50367,50373,50377,50380,50384,50387,50394,50397,50401,50408,50411,50415,50428,50431,50435,50438,50442,50448,50452,50455,50458,50467,50471,50474,50477,50480,50484,50487,50490,50496,50499,50504,50507,50510,50512,50516,50520,50523,50529,50532,50540,50544,50551,50555,50558,50562,50566,50569,50573,50576,50597,50600,50603,50607,50618,50622,50624,50628,50631,50635,50638,50641,50648,50651,50659,50662,50666,50669,50672,50675,50679,50682,50685,50689,50692,50695,50699,50702,50708,50711,50717,50720,50722,50726,50729,50735,50742,50746,50751,50754,50758,50761,50769,50772,50775,50777,50781,50784,50787,50790,50795,50801,50805,50808,50819,50823,50826,50846,50849,50853,50856,50859,50863,50866,50874,50878,50885,50893,50896,50907,50909,50913,50920,50925,50927,50930,50933,50936,50939,50942,50945],[107,48346,48347],{"id":48347},"一些浅显的起步",[13,48349,48350,48351,48356],{},"在我开始读这本书之前，对于网络安全的感受就是两个：DDOS和SQL注入。DDOS是因为我喜欢玩一些偏门的新游戏，比如说猫灵相册、四叶草剧场都有过被DDOS攻击的经历，当时稍微从UP主epcdiy了解了下DDOS操作“肉鸡”攻击的方式【",[5009,48352,48355],{"href":48353,"rel":48354},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1cY411x7k8\u002F?is_story_h5=false&p=1&share_from=ugc&share_medium=android&share_plat=android&share_session_id=386178ae-bb4d-477e-b817-3da6c775ef42&share_source=QQ&share_tag=s_i&timestamp=1671463997&unique_k=UrQmcxP&vd_source=a81ef8427e696b92de364d833142bd10",[23647],"网络霸凌者只会DDoS欺负小网站？我让高防服务器教你做人！","】，感叹了下服务器还是选阿里云啥的好。。。咳咳，扯远了；SQL注入主要是在工作室一次技术沙龙听学长分享的时候偶然之间听到的，觉得有意思也想自己试试，但是用来攻击自己的网站都不能成功，不过在读完这本书后我也明白了为什么（不过是因为现在的框架已经将大部分常见的攻击已经过滤掉了）。",[13,48358,48359],{},"说起读这本书的契机，实际上是因为工作室的老师在20大之前召开了一次关于网络安全的会议，告诉我们写系统要注意网络安全。当时我完全没考虑过网络安全的事情，浅显的认为网络安全就是所谓系统中的Spring Security以及使用的Jwt，当然这些的确是网络安全的一部分，但是只是实现的工具罢了。对于网络安全我并没有一个完整的理念\u002F体系，当时真的天真的认为一个系统配了个Authorization\u002FToken就差不多安全了，现在再回过头来看确实是挺肤浅的。",[13,48361,48362,48363,48368],{},"总而言之，就这样我就开始了这本书的阅读。也愈发关注起了网络安全，经常有意识的在B站看看有意思的网安视频，催使我更新文档的就是其中之一：",[5009,48364,48367],{"href":48365,"rel":48366},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1i14y157YV\u002F?spm_id_from=333.337.search-card.all.click&vd_source=a81ef8427e696b92de364d833142bd10",[23647],"电子监听、全国断网，棱镜门背后，中国如何从末路狂奔到世界之巅","，未来没准从大数据转到网安了呢？（笑）",[13,48370,48371],{},"因为不是很会做总结归纳，所以我就从本书的总结开始，对每一章的总结进行一个排疑，借此也巩固我自己的一个理解。我并没有很深入的阅读，相反，我阅读得相当简单，这里面设计的代码面太广，我也无法对书中的每一段代码进行推敲，因此文档里面肯定有很多问题，毕竟这本书也是有一定年限\u002F自己的技术也不是很硬\u002F读的内容还是过浅，加上我总是喜欢加上个人的理解。如果你找到了任何文档的错误，欢迎在issue上留言，我会及时修改哒！",[107,48373,48375],{"id":48374},"第一章-安全世界观","第一章 安全世界观",[13,48377,48378],{},[22,48379,48380],{},"互联网本来是安全的，自从有了研究安全的人之后，互联网就变得不安全了。",[7759,48382,48384],{"id":48383},"_1为什么是web安全","1、为什么是Web安全？",[13,48386,48387],{},"在早期互联网中，Web并非互联网的主流应用，相对来说，基于SMTP、POP3、FTP、IRC等协议的服务拥有着绝大多数的用户。因此黑客们主要的攻击目标是网络、操作系统以及软件等领域，Web安全领域的攻击与防御技术均处于非常原始的阶段。",[13,48389,48390],{},"时代在发展，防火墙技术的兴起改变了互联网安全的格局。尤其是以Cisco、华为等为代表的网络设备厂商，开始在网络产品中更加重视网络安全，最终改变了互联网安全的走向。防火墙、ACL技术的兴起，使得直接暴露在互联网上的系统得到了保护。",[13,48392,48393],{},"运营商、防火墙对于网络的封锁，使得暴露在互联网上的非Web服务越来越少，且Web技术的成熟使得Web应用的功能越来越强大，最终成为了互联网的主流。黑客们的目光，也渐渐转移到了Web这块大蛋糕上。",[7759,48395,48397],{"id":48396},"_2web攻击技术的发展","2、Web攻击技术的发展",[13,48399,48400],{},"Web 1.0时代，人们更多的是关注服务器端动态脚本的安全问题，比如将一个可执行脚本（俗称webshell）上传到服务器上，从而获得权限。动态脚本语言的普及，以及Web技术发展初期对安全问题认知的不足导致很多“血案”的发生，同时也遗留下很多历史问题。",[13,48402,48403],{},"SQL注入的出现是Web安全史上的一个里程碑，它最早出现大概是在1999年，并很快就成为Web安全的头号大敌。黑客们发现通过SQL注入攻击，可以获取很多重要的、敏感的数据，甚至能够通过数据库获取系统访问权限，这种效果并不比直接攻击系统软件差，Web攻击一下子就流行起来。SQL注入漏洞至今仍然是Web安全领域中的一个重要组成部分。",[13,48405,48406],{},"XSS（跨站脚本攻击）的出现则是Web安全史上的另一个里程碑。",[13,48408,48409],{},"Web 2.0的兴起，XSS、CSRF等攻击已经变得更为强大。Web攻击的思路也从服务器端转向了客户端，转向了浏览器和用户。",[13,48411,48412],{},"Web技术发展到今天，构建出了丰富多彩的互联网。互联网业务的蓬勃发展，也催生出了许多新兴的脚本语言，比如Python、Ruby、NodeJS等，敏捷开发成为互联网的主旋律。而手机技术、移动互联网的兴起，也给HTML 5带来了新的机遇和挑战。与此同时，Web安全技术，也将紧跟着互联网发展的脚步，不断地演化出新的变化。",[7759,48414,48416],{"id":48415},"_3安全问题的本质","3、安全问题的本质",[13,48418,48419],{},[22,48420,48421],{},"安全是什么？什么样的情况下会产生安全问题？我们要如何看待安全问题？",[10548,48423,48425],{"id":48424},"_1一个安全问题是如何产生的","（1）一个安全问题是如何产生的？",[13,48427,48428],{},"我们不妨先从现实世界入手。火车站、机场里，在乘客们开始正式旅程之前，都有一个必要的程序：安全检查。",[13,48430,48431],{},"安全检查的过程按照需要进行过滤。通过一个安全检查（过滤、净化）的过程，可以梳理未知的人或物，使其变得可信任。被划分出来的具有不同信任级别的区域，我们称为信任域，划分两个不同信任域之间的边界，我们称为信任边界。",[13,48433,48434],{},[22,48435,48436],{},"数据从高等级的信任域流向低等级的信任域，是不需要经过安全检查的；数据从低等级的信任域流向高等级的信任域，则需要经过信任边界的安全检查。",[13,48438,48439,48440,67],{},"因此，",[22,48441,48442],{},"安全问题的本质是信任的问题",[13,48444,48445],{},"一切的安全方案设计的基础，都是建立在信任关系上的。我们必须相信一些东西，必须有一些最基本的假设，安全方案才能得以建立；如果我们否定一切，安全方案就会如无源之水，无根之木，无法设计，也无法完成。",[13,48447,48448],{},"从另一个角度来说，一旦我们作为决策依据的条件被打破、被绕过，那么就会导致安全假设的前提条件不再可靠，变成一个伪命题。因此，把握住信任条件的度，使其恰到好处，正是设计安全方案的难点所在，也是安全这门学问的艺术魅力所在。",[10548,48450,48452],{"id":48451},"_2安全问题没有一劳永逸","（2）安全问题没有一劳永逸",[13,48454,48455],{},[22,48456,48457],{},"安全是一个持续的过程。",[13,48459,48460],{},"自从互联网有了安全问题以来，攻击和防御技术就在不断碰撞和对抗的过程中得到发展。从微观上来说，在某一时期可能某一方占了上风；但是从宏观上来看，某一时期的攻击或防御技术，都不可能永远有效，永远用下去。这是因为防御技术在发展的同时，攻击技术也在不断发展，两者是互相促进的辩证关系。以不变的防御手段对抗不断发展的攻击技术，就犯了刻舟求剑的错误。",[13,48462,48463],{},"安全产品本身也需要不断地升级，也需要有人来运营。产品本身也需要一个新陈代谢的过程，否则就会被淘汰。在现代的互联网产品中，自动升级功能已经成为一个标准配置，一个有活力的产品总是会不断地改进自身。",[7759,48465,48467],{"id":48466},"_4安全三要素","4、安全三要素",[13,48469,48470],{},"设计安全方案之前，要正确、全面地看待安全问题，首先要理解安全问题的组成属性。前人通过无数实践，最后将安全的属性总结为安全三要素，简称CIA。后来还有人想扩充这些要素，增加了诸如可审计性、不可抵赖性等，但最最重要的还是以上三个要素。在设计安全方案时，也要以这三个要素为基本的出发点，去全面地思考所面对的问题。",[10548,48472,48474],{"id":48473},"_1机密性confidentiality","（1）机密性（Confidentiality）",[13,48476,48477],{},"机密性要求保护数据内容不能泄露，加密是实现机密性要求的常见手段。",[10548,48479,48481],{"id":48480},"_2完整性integrity","（2）完整性（Integrity）",[13,48483,48484],{},"完整性要求保护数据内容是完整、没有被篡改的。常见的保证一致性的技术手段是数字签名。",[10548,48486,48488],{"id":48487},"_3可用性availability","（3）可用性（Availability）",[13,48490,48491,48492,48495],{},"可用性要求保护资源是“随需而得”。（不能盲目响应请求，这样会造成DDOS攻击",[78,48493,48494],{},"拒绝服务","，但又要保证正常的请求不能被过滤掉）",[7759,48497,48499],{"id":48498},"_5安全评估","5、安全评估",[13,48501,48502],{},"安全评估的过程，可以简单地分为4个阶段：资产等级划分、威胁分析、风险分析、确认解决方案。",[10548,48504,48506],{"id":48505},"_1资产等级划分","（1）资产等级划分",[13,48508,48509],{},"资产等级划分是所有工作的基础，这项工作能够帮助我们明确目标是什么，要保护什么。",[13,48511,48512],{},"**互联网安全的核心问题，是数据安全的问题。**完成资产等级划分后，对要保护的目标已经有了一个大概的了解，接下来就是要划分信任域和信任边界了。通常我们用一种最简单的划分方式，就是从网络逻辑上来划分。比如最重要的数据放在数据库里，那么把数据库的服务器圈起来；Web应用可以从数据库中读\u002F写数据，并对外提供服务，那再把Web服务器圈起来；最外面是不可信任的Internet。",[10548,48514,48516],{"id":48515},"_2威胁分析","（2）威胁分析",[13,48518,48519,48520,48523,48524,48527],{},"在安全领域里，我们把可能造成危害的来源称为",[22,48521,48522],{},"威胁（Threat）","，而把可能会出现的损失称为",[22,48525,48526],{},"风险（Risk）","。风险一定是和损失联系在一起的。",[49,48529,48530],{},[52,48531,48532],{},"STRIDE模型：STRIDE是6个单词的首字母缩写，我们在分析威胁时，可以从以下6个方面去考虑。",[13,48534,48535],{},[617,48536],{"alt":119,"src":29434},[13,48538,48539],{},"威胁分析是非常重要的一件事情，很多时候还需要经常回顾和更新现有的模型。可能存在很多威胁，但并非每个威胁都会造成难以承受的损失。一个威胁到底能够造成多大的危害，如何去衡量它？这就要考虑到风险了。我们判断风险高低的过程，就是风险分析的过程。",[10548,48541,48543],{"id":48542},"_3风险分析","（3）风险分析",[13,48545,48546,48547],{},"风险由以下因素组成：",[22,48548,48549],{},"Risk = Probability * Damage Potential",[13,48551,48552],{},"影响风险高低的因素，除了造成损失的大小外，还需要考虑到发生的可能性。我们在考虑安全问题时，要结合具体情况，权衡事件发生的可能性，才能正确地判断出风险。",[49,48554,48555],{},[52,48556,48557],{},"DREAD模型：由微软提出。DREAD也是几个单词的首字母缩写，它指导我们应该从哪些方面去判断一个威胁的风险程度。",[13,48559,48560],{},[617,48561],{"alt":119,"src":33078},[13,48563,48564],{},"在DREAD模型里，每一个因素都可以分为高、中、低三个等级。在上表中，高、中、低三个等级分别以3、2、1的分数代表其权重值，因此，我们可以具体计算出某一个威胁的风险值。",[13,48566,48567,48568,48571],{},"任何时候都应该记住——",[22,48569,48570],{},"模型是死的，人是活的，再好的模型也是需要人来使用的","，在确定攻击面，以及判断风险高低时，都需要有一定的经验，这也是安全工程师的价值所在。类似STRIDE和DREAD的模型可能还有很多，不同的标准会对应不同的模型，只要我们觉得这些模型是科学的，能够帮到我们，就可以使用。但模型只能起到一个辅助的作用，最终做出决策的还是人。",[10548,48573,48575],{"id":48574},"_4确认解决方案","（4）确认解决方案",[13,48577,48578],{},"安全评估的产出物，就是安全解决方案。解决方案一定要有针对性，这种针对性是由资产等级划分、威胁分析、风险分析等阶段的结果给出的。",[13,48580,48581],{},"设计解决方案不难，难的是如何设计一个好的解决方案。设计一个好的解决方案，是真正考验安全工程师水平的时候。",[13,48583,48584,48585,48588,48589],{},"对于互联网来说，",[22,48586,48587],{},"安全是要为产品的发展与成长保驾护航的","。我们不能使用“粗暴”的安全方案去阻碍产品的正常发展，所以应该形成这样一种观点：",[22,48590,48591],{},"没有不安全的业务，只有不安全的实现方式。好的安全方案对用户应该是透明的，尽可能地不要改变用户的使用习惯。",[13,48593,48594,48595,67],{},"好的安全产品或模块除了要兼顾用户体验外，还要易于持续改进。一个好的安全模块，同时也应该是一个优秀的程序，从设计上也需要做到",[22,48596,48597],{},"高聚合、低耦合、易于扩展",[49,48599,48600],{},[52,48601,48602],{},"一个优秀安全方案的特点：能够有效解决问题；用户体验好；高性能；低耦合；易于扩展和升级。",[7759,48604,48606],{"id":48605},"_6具体设计安全方案的技巧","6、具体设计安全方案的技巧",[10548,48608,48610],{"id":48609},"_1secure-by-default原则","（1）Secure By Default原则",[49,48612,48613],{},[52,48614,48615],{},"黑名单、白名单",[13,48617,48618],{},"按照白名单的思想，应该根据业务需求，列出一个允许使用的软件以及软件版本的清单，在此清单外的软件则禁止使用。选择白名单的思想，基于白名单来设计安全方案，其实就是信任白名单是好的，是安全的。但是一旦这个信任基础不存在了，那么安全就荡然无存。",[49,48620,48621],{},[52,48622,48623],{},"最小权限原则",[13,48625,48626],{},"最小权限原则要求系统只授予主体必要的权限，而不要过度授权，这样能有效地减少系统、网络、应用、数据库出错的机会。",[13,48628,48629],{},"（在使用最小权限原则时，需要认真梳理业务所需要的权限，在很多时候，开发者并不会意识到业务授予用户的权限过高。在通过访谈了解业务时，可以多设置一些反问句，比如：您确定您的程序一定需要访问Internet吗？通过此类问题，来确定业务所需的最小权限。）",[10548,48631,48633],{"id":48632},"_2纵深防御原则defense-indepth","（2）纵深防御原则（Defense inDepth）",[13,48635,48636,48637],{},"纵深防御包含两层含义：首先，要在各个不同层面、不同方面实施安全方案，避免出现疏漏，不同安全方案之间需要相互配合，构成一个整体；其次，要在正确的地方做正确的事情，即：",[22,48638,48639],{},"在解决根本问题的地方实施针对性的安全方案。",[13,48641,48642],{},"纵深防御并不是同一个安全方案要做两遍或多遍，而是要从不同的层面、不同的角度对系统做出整体的解决方案。它要求我们深入理解威胁的本质，从而做出正确的应对措施。",[49,48644,48645],{},[52,48646,48647],{},"“统一威胁管理”（Uni-fied Threat Management）：UTM几乎集成了所有主流安全产品的功能，比如防火墙、VPN、反垃圾邮件、IDS、反病毒等。UTM的定位是当中小企业没有精力自己做安全方案时，可以在一定程度上提高安全门槛。但是UTM并不是万能药，很多问题并不应该在网络层、网关处解决，所以实际使用时效果未必好，它更多的是给用户买个安心。",[10548,48649,48651],{"id":48650},"_3数据与代码分离原则","（3）数据与代码分离原则",[13,48653,48654],{},"在Web安全中，由“注入”引起的问题比比皆是，如XSS、SQL Injection、CRLF Injection、X-Path Injection等。此类问题均可以根据“数据与代码分离原则”设计出真正安全的解决方案，因为这个原则抓住了漏洞形成的本质原因。",[10548,48656,48658],{"id":48657},"_4不可预测性原则unpredictable","（4）不可预测性原则（Unpredictable）",[13,48660,48661],{},"从克服攻击方法的角度看问题，能有效地对抗基于篡改、伪造的攻击。",[13,48663,48664],{},"不可预测性的实现往往需要用到加密算法、随机数算法、哈希算法，好好使用这条原则，在设计安全方案时往往会事半功倍。",[23289,48666],{},[107,48668,48670],{"id":48669},"第二章-浏览器安全","第二章 浏览器安全",[13,48672,48673],{},"浏览器是互联网最大的入口，绝大多数用户使用互联网的工具是浏览器。一方面，浏览器天生就是一个客户端，如果具备了安全功能，就可以像安全软件一样对用户上网起到很好的保护作用；另一方面，浏览器安全也成为浏览器厂商之间竞争的一张底牌，浏览器厂商希望能够针对安全建立起技术门槛，以获得竞争优势。因此近年来随着浏览器版本的不断更新，浏览器安全功能变得越来越强大。",[7759,48675,48677],{"id":48676},"_1同源策略same-origin-policy","1、同源策略（Same Origin Policy）",[13,48679,48680,48681,48684],{},"同源策略（Same Origin Policy）是一种约定，它是浏览器最核心也最基本的安全功能，如果缺少了同源策略，则浏览器的正常功能可能都会受到影响。可以说",[22,48682,48683],{},"Web是构建在同源策略的基础之上的，浏览器只是针对同源策略的一种实现","。浏览器的同源策略，限制了来自不同源的“document”或脚本，对当前“document”读取或设置某些属性。",[49,48686,48687],{},[52,48688,48689,48692],{},[22,48690,48691],{},"XMLHttpRequest受到同源策略的约束，不能跨域访问资源","（这就是常见的开发中需要配置跨域的原因）。如果XMLHttpRequest能够跨域访问资源，则可能会导致一些敏感数据泄露，比如CSRF的token，从而导致发生安全问题。",[7759,48694,48696],{"id":48695},"_2浏览器沙箱","2、浏览器沙箱",[13,48698,48699],{},"在网页中插入一段恶意代码，利用浏览器漏洞执行任意代码的攻击方式，在黑客圈子里被形象地称为“挂马”。“挂马”是浏览器需要面对的一个主要威胁。浏览器的多进程架构，将浏览器的各个功能模块分开，各个浏览器实例分开，当一个进程崩溃时，也不会影响到其他的进程。",[13,48701,48702,48703,48706],{},"Sandbox即沙箱，计算机技术发展到今天，Sandbox已经成为泛指“",[22,48704,48705],{},"资源隔离类模块","”的代名词。Sandbox的设计目的一般是为了让不可信任的代码运行在一定的环境中，限制不可信任的代码访问隔离区之外的资源。如果一定要跨越Sandbox边界产生数据交换，则只能通过指定的数据通道，比如经过封装的API来完成，在这些API中会严格检查请求的合法性。",[13,48708,48709],{},"Sandbox的应用范围非常广泛。采用Sandbox技术，无疑可以让不受信任的网页代码、JavaScript代码运行在一个受到限制的环境中，从而保护本地桌面系统的安全。",[7759,48711,48713],{"id":48712},"_3恶意网址拦截","3、恶意网址拦截",[13,48715,48716],{},"恶意网址拦截的工作原理很简单，一般都是浏览器周期性地从服务器端获取一份最新的恶意网址黑名单，如果用户上网时访问的网址存在于此黑名单中，浏览器就会弹出一个警告页面。",[13,48718,48719],{},"常见的恶意网址分为两类：一类是挂马网站，这些网站通常包含有恶意的脚本如JavaScript或Flash，通过利用浏览器的漏洞（包括一些插件、控件漏洞）执行shellcode，在用户电脑中植入木马；另一类是钓鱼网站，通过模仿知名网站的相似页面来欺骗用户。",[23289,48721],{},[107,48723,48725],{"id":48724},"第三章-跨站脚本攻击xss","第三章 跨站脚本攻击（XSS）",[13,48727,48728],{},"跨站脚本攻击（XSS）是客户端脚本安全中的头号大敌。",[7759,48730,48732],{"id":48731},"_1简介","1、简介",[13,48734,48735],{},"跨站脚本攻击，英文全称是Cross Site Script，本来缩写是CSS，但是为了和层叠样式表（Cas-cading Style Sheet，CSS）有所区别，所以在安全领域叫做“XSS”。",[13,48737,48738,48739,48742],{},"XSS攻击，通常指黑客通过“",[22,48740,48741],{},"HTML注入","”篡改了网页，插入了恶意的脚本，从而在用户浏览网页时，控制用户浏览器的一种攻击。在一开始，这种攻击的演示案例是跨域的，所以叫做“跨站脚本”。但是发展到今天，由于JavaScript的强大功能以及网站前端应用的复杂化，是否跨域已经不再重要。但是由于历史原因，XSS这个名字却一直保留下来。",[13,48744,48745],{},"XSS长期以来被列为客户端Web安全中的头号大敌。因为XSS破坏力强大，且产生的场景复杂，难以一次性解决。现在业内达成的共识是：针对各种不同场景产生的XSS，需要区分情景对待。即便如此，复杂的应用环境仍然是XSS滋生的温床。",[49,48747,48748,48754,48760],{},[52,48749,48750,48751],{},"反射型XSS：简单地把用户输入的数据“反射”给浏览器。也就是说，黑客往往需要诱使用户“点击”一个恶意链接，才能攻击成功。反射型XSS也叫做“非持久型XSS”（Non-persistent XSS）。",[22,48752,48753],{},"（诱使进入钓鱼网站的过程）",[52,48755,48756,48757],{},"存储型XSS：存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。存储型XSS通常也叫做“持久型XSS”(Persistent XSS)，因为从效果上来说，它存在的时间是比较长的。",[22,48758,48759],{},"（钓鱼网站内操作的过程）",[52,48761,48762,48763],{},"DOM Based XSS：从效果上来说也是反射型XSS。单独划分出来，是因为DOM Based XSS的形成原因比较特别，是通过修改页面的DOM节点形成的XSS。",[22,48764,48765],{},"（利用组件执行的函数将攻击代码植入执行）",[7759,48767,48769],{"id":48768},"_2xss攻击","2、XSS攻击",[10548,48771,48773],{"id":48772},"_1xss-payload","（1）XSS Payload",[13,48775,48776],{},"XSS攻击成功后，攻击者能够对用户当前浏览的页面植入恶意脚本，通过恶意脚本，控制用户的浏览器。这些用以完成各种具体功能的恶意脚本，被称为“XSS Payload”。实际上就是JavaScript脚本（还可以是Flash或其他富客户端的脚本），所以任何JavaScript脚本能实现的功能，XSS Payload都能做到。",[13,48778,48779],{},"一个最常见的XSS Payload，就是通过读取浏览器的Cookie对象，从而发起“Cookie劫持”攻击。（Cookie的“HttpOnly”标识可以防止“Cookie劫持”）下面是几个常见的XSS Payload方式：",[49,48781,48782,48787,48793,48799,48805,48811],{},[52,48783,48784],{},[22,48785,48786],{},"构造GET与POST请求",[52,48788,48789,48792],{},[22,48790,48791],{},"XSS钓鱼","（对于验证码，XSS Payload可以通过读取页面内容，将验证码的图片URL发送到远程服务器上来实施——攻击者可以在远程XSS后台接收当前验证码，并将验证码的值返回给当前的XSS Payload，从而绕过验证码。 || 对于修改密码，可以利用JavaScript在当前页面上“画出”一个伪造的登录框，当用户在登录框中输入用户名与密码后，其密码将被发送至黑客的服务器上。）",[52,48794,48795,48798],{},[22,48796,48797],{},"识别用户浏览器","（通过XSS读取浏览器的UserAgent对象）",[52,48800,48801,48804],{},[22,48802,48803],{},"标识用户安装的软件","（知道了用户使用的浏览器、操作系统后，进一步可以识别用户安装的软件。黑客通过判断用户安装的软件，选择对应的浏览器漏洞，最终达到植入木马的目的。）",[52,48806,48807,48810],{},[22,48808,48809],{},"CSS History Hack","（利用style的visited属性——如果用户曾经访问过某个链接，那么这个链接的颜色会变得与众不同）",[52,48812,48813,48816,48817],{},[22,48814,48815],{},"获取用户真实IP地址","（JavaScript本身并没有提供获取本地IP地址的能力，一般来说，XSS攻击需要借助第三方软件来完成。比如，客户端安装了Java环境（JRE），那么XSS就可以通过调用JavaApplet的接口获取客户端的本地IP地址。）",[22,48818,48819],{},"【这一条告诉我们，不要觉得代理翻墙就安全了，黑客能做到的，要相信网安也能做到，小心网警来敲门】",[10548,48821,48823],{"id":48822},"_2xss攻击平台","（2）XSS攻击平台",[13,48825,48826],{},"XSS Payload如此强大，为了使用方便，有安全研究者将许多功能封装起来，成为XSS攻击平台。这些攻击平台的主要目的是为了演示XSS的危害，以及方便渗透测试使用。下面就介绍几个常见的XSS攻击平台。",[49,48828,48829,48837,48845],{},[52,48830,48831,48832,28447],{},"Attack API是安全研究者pdp所主导的一个项目，它总结了很多能够直接使用XSS Payload，归纳为API的方式。（",[5009,48833,48836],{"href":48834,"rel":48835},"https:\u002F\u002Fgithub.com\u002FCyb3rWard0g\u002FInvoke-ATTACKAPI",[23647],"Cyb3rWard0g\u002FInvoke-ATTACKAPI: A PowerShell script to interact with the MITRE ATT&CK Framework via its own API (github.com)",[52,48838,48839,48840,28447],{},"BeEF曾经是最好的XSS演示平台。不同于Attack API，BeEF所演示的是一个完整的XSS攻击过程。BeEF有一个控制后台，攻击者可以在后台控制前端的一切。（",[5009,48841,48844],{"href":48842,"rel":48843},"https:\u002F\u002Fgithub.com\u002Fbeefproject\u002Fbeef",[23647],"beefproject\u002Fbeef: The Browser Exploitation Framework Project (github.com)",[52,48846,48847,48848,28447],{},"XSS-Proxy是一个轻量级的XSS攻击平台，通过嵌套iframe的方式可以实时地远程控制被XSS攻击的浏览器。（",[5009,48849,48852],{"href":48850,"rel":48851},"https:\u002F\u002Fxss-proxy.sourceforge.net\u002F",[23647],"XSS-Proxy: A tool for realtime XSS hijacking and control (sourceforge.net)",[13,48854,48855,48856,48859],{},"这些XSS攻击平台有助于",[22,48857,48858],{},"深入理解XSS的原理和危害","。（可以直接在Github上找到开源项目【大部分已经作为时代历程而落幕了】，CSDN也有新手教程，不过XSS主要是面对前端和PHP的【个人感觉】，要求先有比较高的水准才能自己写脚本，我不会所以就没下着玩玩）",[10548,48861,48863],{"id":48862},"_3终极武器xss-worm","（3）终极武器XSS Worm",[13,48865,48866],{},"XSS Worm是XSS的一种终极利用方式，它的破坏力和影响力是巨大的。但是发起XSS Worm攻击也有一定的条件。一般来说，用户之间发生交互行为的页面，如果存在存储型XSS，则比较容易发起XSS Worm攻击。",[13,48868,48869,48870,67],{},"比如，发送站内信、用户留言等页面，都是XSS Worm的高发区，需要重点关注。而相对的，如果一个页面只能由用户个人查看，比如“用户个人资料设置”页面，因为缺乏用户之间互动的功能，所以即使存在XSS，也不能被用于XSS Worm的传播。攻击者想要通过XSS做坏事是很容易的，而XSS Worm则能够把这种",[22,48871,48872],{},"破坏无限扩大",[10548,48874,48876],{"id":48875},"_4调试javascript","（4）调试JavaScript",[13,48878,48879],{},"要想写好XSS Payload，需要有很好的JavaScript功底，调试JavaScript是必不可少的技能。",[49,48881,48882,48893,48905],{},[52,48883,48884,48887,48888,28447],{},[22,48885,48886],{},"Firebug：这是最常用的脚本调试工具","，前端工程师与Web Hacking必备，被喻为“居家旅行的瑞士军刀”。（可以查看页面DOM节点）（",[5009,48889,48892],{"href":48890,"rel":48891},"https:\u002F\u002Fgithub.com\u002Ffirebug\u002Ffirebug",[23647],"firebug\u002Ffirebug: Web Development Evolved - The Firebug you have known and loved (github.com)",[52,48894,48895,48898,48899,48904],{},[22,48896,48897],{},"Fiddler：是一个本地代理服务器","，需要将浏览器设置为使用本地代理服务器上网才可使用。Fiddler会监控所有的浏览器请求，并有能力在浏览器请求中插入数据。（支持脚本编程）（",[5009,48900,48903],{"href":48901,"rel":48902},"https:\u002F\u002Fwww.telerik.com\u002F",[23647],"Telerik & Kendo UI - .NET Components Suites & JavaScript UI Libraries","【现在已经是比较成熟的商业化开发产品了】）",[52,48906,48907,48910,48911,28447],{},[22,48908,48909],{},"HttpWatch","：是一个商业软件，它以插件的形式内嵌在浏览器中。（",[5009,48912,48915],{"href":48913,"rel":48914},"https:\u002F\u002Fwww.httpwatch.com\u002F",[23647],"HttpWatch: An Advanced Network Debugger and HTTP Sniffer for Chrome, Edge and IE",[10548,48917,48919],{"id":48918},"_5xss构造技巧","（5）XSS构造技巧",[49,48921,48922,48928,48933,48938],{},[52,48923,48924,48927],{},[22,48925,48926],{},"利用字符编码","（转义字符\u002F浏览器不同）",[52,48929,48930],{},[22,48931,48932],{},"绕过长度限制",[52,48934,48935],{},[22,48936,48937],{},"使用\u003Cbase>标签",[52,48939,48940,48943],{},[22,48941,48942],{},"windows.name","（对当前窗口的window.name对象赋值，没有特殊字符的限制。因为window对象是浏览器的窗体，而并非document对象，因此很多时候window对象不受同源策略的限制。攻击者利用这个对象，可以实现跨域、跨页面传递数据。在某些环境下，这种特性将变得非常有用。）",[10548,48945,48947],{"id":48946},"_6flash-xss","（6）Flash XSS",[13,48949,48950],{},"Flash的时代已经落幕了，所以感兴趣的同学可以自己去看看书（狗头）。",[7759,48952,48954],{"id":48953},"_3xss防御","3、XSS防御",[13,48956,48957],{},"XSS的防御是复杂的。",[10548,48959,48961],{"id":48960},"_1httponly","（1）HttpOnly",[13,48963,48964],{},"浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。严格地说，HttpOnly并非为了对抗XSS——HttpOnly解决的是XSS后的Cookie劫持攻击。需要注意的是，服务器可能会设置多个Cookie（多个key-value对），而HttpOnly可以有选择性地加在任何一个Cookie值上。",[13,48966,48967],{},"使用HttpOnly有助于缓解XSS攻击，但仍然需要其他能够解决XSS漏洞的方案。",[10548,48969,48971],{"id":48970},"_2输入检查","（2）输入检查",[13,48973,48974],{},"输入检查，在很多时候也被用于格式检查。例如，用户在网站注册时填写的用户名，会被要求只能为字母、数字的组合。这些格式检查，有点像一种“白名单”，也可以让一些基于特殊字符的攻击失效。",[13,48976,48977,48980],{},[22,48978,48979],{},"输入检查的逻辑，必须放在服务器端代码中实现","。如果只是在客户端使用JavaScript进行输入检查，是很容易被攻击者绕过的。目前Web开发的普遍做法，是同时在客户端JavaScript中和服务器端代码中实现相同的输入检查。客户端JavaScript的输入检查，可以阻挡大部分误操作的正常用户，从而节约服务器资源。",[13,48982,48983],{},"在XSS的防御上，输入检查一般是检查用户输入的数据中是否包含一些特殊字符，如\u003C、>、’、”等。如果发现存在特殊字符，则将这些字符过滤或者编码。比较智能的“输入检查”，可能还会匹配XSS的特征。比如查找用户数据中是否包含了“\u003Cscript>”、“javascript”等敏感字符。这种输入检查的方式，可以称为“XSS Filter”。互联网上有很多开源的“XSS Filter”的实现。",[10548,48985,48987],{"id":48986},"_3输出检查","（3）输出检查",[49,48989,48990,48996],{},[52,48991,48992,48995],{},[22,48993,48994],{},"安全的编码函数","：编码分为很多种，针对HTML代码的编码方式是HtmlEncode。HtmlEncode并非专用名词，它只是一种函数实现。它的作用是将字符转换成HTMLEntities，对应的标准是ISO-8859-1。在PHP中，有htmlentities()和htmlspe-cialchars()两个函数可以满足安全要求。JavaScript的编码方式可以使用JavascriptEncode。",[52,48997,48998],{},[22,48999,49000],{},"在正确的地方使用正确的编码",[10548,49002,49004],{"id":49003},"_4xss产生的本质原因","（4）XSS产生的本质原因",[13,49006,49007],{},"XSS的本质是一种**“HTML注入”**，用户的数据被当成了HTML代码一部分来执行，从而混淆了原本的语义，产生了新的语义。",[10548,49009,49011],{"id":49010},"_5处理富文本","（5）处理富文本",[13,49013,49014,49015,49018],{},"HTML是一种结构化的语言，比较好分析。通过htmlparser可以解析出HTML代码的标签、标签属性和事件。在过滤富文本时，",[22,49016,49017],{},"“事件”应该被严格禁止","，因为“富文本”的展示需求里不应该包括“事件”这种动态效果。而一些危险的标签，比如\u003Ciframe>、\u003Cscript>、\u003Cbase>、\u003Cform>等，也是应该严格禁止的。",[13,49020,49021,49022,49025],{},"在标签的选择上，应该",[22,49023,49024],{},"使用白名单，避免使用黑名单","。比如，只允许\u003Ca>、\u003Cimg>、\u003Cdiv>等比较“安全”的标签存在。“白名单原则”不仅仅用于标签的选择，同样应该用于属性与事件的选择。",[13,49027,49028],{},[22,49029,49030],{},"尽可能地禁止用户自定义CSS与style。",[10548,49032,49034],{"id":49033},"_6防御dom-based-xss","（6）防御DOM Based XSS",[13,49036,49037,49038,49041],{},"DOM Based XSS是一种比较特别的XSS漏洞，前文提到的几种防御方法都不太适用，需要特别对待。DOM Based XSS是从",[22,49039,49040],{},"JavaScript中输出数据到HTML页面里","。之前提到的方法都是针对“从服务器应用直接输出到HTML页面”的XSS漏洞，因此并不适用于DOM Based XSS。",[13,49043,49044],{},"会触发DOM Based XSS的地方有很多，以下几个地方是JavaScript输出到HTML页面的必经之路。",[49,49046,49047,49050,49053,49056,49059,49062,49065,49068,49071,49074],{},[52,49048,49049],{},"document.write()",[52,49051,49052],{},"document.writeln()",[52,49054,49055],{},"xxx.innerHTML=",[52,49057,49058],{},"xxx.outerHTML=",[52,49060,49061],{},"innerHTML.replace",[52,49063,49064],{},"document.attachEvent()",[52,49066,49067],{},"window.attachEvent()",[52,49069,49070],{},"document.location.replace()",[52,49072,49073],{},"document.location.assign()",[52,49075,49076],{},"……",[13,49078,49079],{},"除了服务器端直接输出变量到JavaScript外，还有以下几个地方可能会成为DOM Based XSS的输入点，也需要重点关注。",[49,49081,49082,49085,49088,49091,49094,49097],{},[52,49083,49084],{},"页面中所有的inputs框",[52,49086,49087],{},"window.location(href、hash等)",[52,49089,49090],{},"window.name ?document.referrer",[52,49092,49093],{},"document.cookie ?localstorage",[52,49095,49096],{},"XMLHttpRequest返回的数据",[52,49098,49076],{},[7759,49100,49102],{"id":49101},"_4业务风险角度看xss攻击","4、业务风险角度看XSS攻击",[13,49104,49105],{},"从风险的角度看，用户之间有互动的页面，是可能发起XSS Worm攻击的地方。而根据不同页面的PageView高低，也可以分析出哪些页面受XSS攻击后的影响会更大。比如在网站首页发生的XSS攻击，肯定比网站合作伙伴页面的XSS攻击要严重得多。",[13,49107,49108],{},"在修补XSS漏洞时遇到的最大挑战之一是漏洞数量太多，因此开发者可能来不及，也不愿意修补这些漏洞。从业务风险的角度来重新定位每个XSS漏洞，就具有了重要的意义。",[23289,49110],{},[107,49112,49114],{"id":49113},"第四章-跨站点请求伪造csrf","第四章 跨站点请求伪造（CSRF）",[13,49116,49117],{},"CSRF的全名是Cross Site RequestForgery，翻译成中文就是跨站点请求伪造。它是一种常见的Web攻击，也是Web安全中最容易被忽略的一种攻击方式，在某些时候能够产生强大的破坏性。",[7759,49119,49121],{"id":49120},"_1浏览器的cookie策略","1、浏览器的Cookie策略",[13,49123,49124,49125,67],{},"浏览器所持有的Cookie分为两种：",[22,49126,49127],{},"一种是“Session Cookie”，又称“临时Cookie”；另一种是“Third-party Cookie”，也称为“本地Cookie”",[13,49129,49130],{},"两者的区别在于，Third-party Cookie是服务器在Set-Cookie时指定了Expire时间，只有到了Expire时间后Cookie才会失效，所以这种Cookie会保存在本地；而Session Cookie则没有指定Expire时间，所以浏览器关闭后，Session Cookie就失效了。在浏览网站的过程中，若是一个网站设置了Session Cookie，那么在浏览器进程的生命周期内，即使浏览器新打开了Tab页，Session Cookie也都是有效的。Session Cookie保存在浏览器进程的内存空间中；而Third-party Cookie则保存在本地。",[13,49132,49133],{},"常见的CSRF攻击在于利用浏览器策略发送了第三方Cookie用于认证。",[7759,49135,49137],{"id":49136},"_2p3p头","2、P3P头",[13,49139,49140],{},"P3P Header是W3C制定的一项关于隐私的标准，全称是The Platform for Privacy Preferences。",[13,49142,49143],{},"在网站的业务中，P3P头主要用于类似广告等需要跨域访问的页面。P3P头设置后，对于Cookie的影响将扩大到整个域中的所有页面，因为Cookie是以域和path为单位的，这并不符合“最小权限”原则。",[13,49145,49146],{},"P3P头的介入改变了a.com的隐私策略，从而使得\u003Ciframe>、\u003Cscript>等标签在浏览器中不再拦截第三方Cookie的发送。P3P头只需要由网站设置一次即可，之后每次请求都会遵循此策略，而不需要再重复设置。",[7759,49148,49150],{"id":49149},"_3get-post","3、GET & POST",[13,49152,49153],{},"大多数CSRF攻击发起时，使用的HTML标签都是\u003Cimg>、\u003Ciframe>、\u003Cscript>等带“src”属性的标签，这类标签只能够发起一次GET请求，而不能发起POST请求。",[13,49155,49156,49157,49160],{},"但是实际上，",[22,49158,49159],{},"CSRF攻击不只是GET请求","，对于攻击者来说，有若干种方法可以构造出一个POST请求。攻击者甚至可以将这个页面隐藏在一个不可见的iframe窗口中，那么整个自动提交表单的过程，对于用户来说也是不可见的。",[7759,49162,49164],{"id":49163},"_4csrf的防御","4、CSRF的防御",[10548,49166,49168],{"id":49167},"_1验证码","（1）验证码",[13,49170,49171],{},"**验证码被认为是对抗CSRF攻击最简洁而有效的防御方法。**CSRF攻击的过程，往往是在用户不知情的情况下构造了网络请求。而验证码，则强制用户必须与应用进行交互，才能完成最终请求。因此在通常情况下，验证码能够很好地遏制CSRF攻击。",[13,49173,49174,49175,67],{},"但是验证码并非万能。很多时候，出于用户体验考虑，网站不能给所有的操作都加上验证码。因此，验证码只能作为防御CSRF的一种",[22,49176,49177],{},"辅助手段，而不能作为最主要的解决方案",[10548,49179,49181],{"id":49180},"_2referer-check","（2）Referer Check",[13,49183,49184],{},"Referer Check在互联网中最常见的应用就是**“防止图片盗链”**。同理，Referer Check也可以被用于检查请求是否来自合法的“源”。",[13,49186,49187],{},"Referer Check的缺陷在于，服务器并非什么时候都能取到Referer。很多用户出于隐私保护的考虑，限制了Referer的发送。在某些情况下，浏览器也不会发送Referer，比如从HTTPS跳转到HTTP，出于安全的考虑，浏览器也不会发送Referer。",[10548,49189,49191],{"id":49190},"_3anti-csrf-token","（3）Anti CSRF Token",[49,49193,49194,49197],{},[52,49195,49196],{},"**CSRF的本质：重要操作的所有参数都是可以被攻击者猜测到的。**出于这个原因，可以想到一个解决方案：把参数加密，或者使用一些随机数，从而让攻击者无法猜测到参数值。这是“不可预测性原则”的一种应用。（加密过程可以详见第十一章）**但是！！！**加密或混淆后的URL将变得非常难读，对用户非常不友好。其次，如果加密的参数每次都改变，则某些URL将无法再被用户收藏。最后，普通的参数如果也被加密或哈希，将会给数据分析工作带来很大的困扰，因为数据分析工作常常需要用到参数的明文。",[52,49198,49199,49202,49203,49206,49207,49210,49211,49214,49215,49218],{},[22,49200,49201],{},"Token的使用原则","：防御CSRF的Token，是根据“不可预测性原则”设计的方案，所以",[22,49204,49205],{},"Token的生成一定要足够随机，需要使用安全的随机数生成器生成Token","。此外，这个Token的目的不是为了防止重复提交。所以为了使用方便，",[22,49208,49209],{},"可以允许在一个用户的有效生命周期内，在Token消耗掉前都使用同一个Token","。但是如果用户已经提交了表单，则这个Token已经消耗掉，应该再次重新生成一个新的To-ken。如果Token保存在Cookie中，而不是服务器端的Session中，则会带来一个新的问题。如果一个用户打开几个相同的页面同时操作，当某个页面消耗掉Token后，其他页面的表单内保存的还是被消耗掉的那个Token，因此其他页面的表单再次提交时，会出现Token错误。在这种情况下，可以考虑",[22,49212,49213],{},"生成多个有效的Token，以解决多页面共存的场景","。最后，使用Token时应该",[22,49216,49217],{},"注意Token的保密性","。Token如果出现在某个页面的URL中，则可能会通过Referer的方式泄露。",[23289,49220],{},[107,49222,49224],{"id":49223},"第五章-点击劫持clickjacking","第五章 点击劫持（ClickJacking）",[13,49226,49227,49228],{},"点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe，覆盖在一个网页上，然后诱使用户在该网页上进行操作，此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置，可以诱使用户恰好点击在iframe页面的一些功能性按钮上。",[22,49229,49230],{},"（现在是2023年1月，最大的“点击劫持”其实就在我们的日常生活中，那些找不到关闭按钮的小广告，正是点击劫持的典型代表）",[7759,49232,49234],{"id":49233},"_1图片覆盖攻击","1、图片覆盖攻击",[13,49236,49237],{},"点击劫持的本质是一种视觉欺骗。顺着这个思路，还有一些攻击方法也可以起到类似的作用，比如图片覆盖。Cross Site Image Overlaying攻击，简称XSIO，通过调整图片的style使得图片能够覆盖在所指定的任意位置。",[13,49239,49240],{},"XSIO不同于XSS，它利用的是图片的style，或者能够控制CSS。如果应用没有限制style的po-sition为absolute的话，图片就可以覆盖到页面上的任意位置，形成点击劫持。图片还可以伪装得像一个正常的链接、按钮；或者在图片中构造一些文字，覆盖在关键的位置，就有可能完全改变页面中想表达的意思，在这种情况下，不需要用户点击，也能达到欺骗的目的。",[7759,49242,49244],{"id":49243},"_2拖拽劫持与数据窃取","2、拖拽劫持与数据窃取",[13,49246,49247,49248,49251],{},"很多浏览器都开始支持Drag & Drop 的API。对于用户来说，拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接，也可以是一段文字，还可以从一个窗口拖拽到另外一个窗口，因此拖拽是不受同源策略限制的。“拖拽劫持”的思路是",[22,49249,49250],{},"诱使用户从隐藏的不可见iframe中“拖拽”出攻击者希望得到的数据，然后放到攻击者能控制的另外一个页面中，从而窃取数据","。在JavaScript或者Java API的支持下，这个攻击过程会变得非常隐蔽。因为它突破了传统Click-Jacking一些先天的局限，所以这种新型的“拖拽劫持”能够造成更大的破坏。",[7759,49253,49255],{"id":49254},"_3clickjacking-30触屏劫持","3、ClickJacking 3.0：触屏劫持",[13,49257,49258],{},"触屏操作通常对应一下几个事件：",[49,49260,49261,49264,49267,49270],{},[52,49262,49263],{},"touchstart，手指触摸屏幕时发生；",[52,49265,49266],{},"touchend，手指离开屏幕时发生；",[52,49268,49269],{},"touchmove，手指滑动时发生；",[52,49271,49272],{},"touchcancel，系统可取消touch事件。",[13,49274,49275],{},"手机上的屏幕范围有限，手机浏览器为了节约空间，甚至隐藏了地址栏，因此手机上的视觉欺骗可能会变得更加容易实施。",[7759,49277,49279],{"id":49278},"_4防御clickjacking","4、防御ClickJacking",[10548,49281,49283],{"id":49282},"_1frame-busting","（1）frame busting",[13,49285,49286],{},"写一段JavaScript代码，以禁止iframe的嵌套。这种方法叫frame busting。",[10548,49288,49290],{"id":49289},"_2x-frame-options","（2）X-Frame-Options",[13,49292,49293],{},"frame busting存在被绕过的可能，所以我们需要寻找其他更好的解决方案。一个比较好的方案是使用一个HTTP头——X-Frame-Options。它有三个可选的值：",[49,49295,49296,49299,49302],{},[52,49297,49298],{},"DENY",[52,49300,49301],{},"SAMEORIGIN",[52,49303,49304],{},"ALLOW-FROM origin",[13,49306,49307],{},"当值为DENY时，浏览器会拒绝当前页面加载任何frame页面；若值为SAMEORIGIN，则frame页面的地址只能为同源域名下的页面；若值为AL-LOW-FROM，则可以定义允许frame加载的页面地址。",[23289,49309],{},[107,49311,49313],{"id":49312},"第六章-html-5安全","第六章 HTML 5安全",[13,49315,49316],{},"HTML 5是W3C制定的新一代HTML语言的标准。（也就是现在常说的H5）",[7759,49318,49320],{"id":49319},"_1html-5新标签","1、HTML 5新标签",[10548,49322,49324],{"id":49323},"_1新标签的xss","（1）新标签的XSS",[13,49326,49327],{},"一些XSS Filter如果建立了一个黑名单的话，则可能就不会覆盖到HTML 5新增的标签和功能，从而避免发生XSS。",[13,49329,49330,49331,28447],{},"HTML 5中新增的一些标签和属性，使得XSS等Web攻击产生了新的变化，为了总结这些变化，有安全研究者建立了一个HTML5 Security Cheat-sheet项目。（虽然并没有找到该项目，但是都23年了，不少备忘录已经趋于成熟，例举一个我找到的：",[5009,49332,49335],{"href":49333,"rel":49334},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FHTML5_Security_Cheat_Sheet.html",[23647],"HTML5 安全 - OWASP 备忘单系列",[10548,49337,49339],{"id":49338},"_2iframe的sandbox","（2）iframe的sandbox",[13,49341,49342],{},"在HTML 5中，专门为iframe定义了一个新的属性，叫sandbox。使用sandbox这一个属性后，\u003Ciframe>标签加载的内容将被视为一个独立的“源”，其中的脚本将被禁止执行，表单被禁止提交，插件被禁止加载，指向其他浏览对象的链接也会被禁止。sandbox属性可以通过参数来支持更精确的控制。有以下几个值可以选择：",[49,49344,49345,49348,49351,49354],{},[52,49346,49347],{},"allow-same-origin：允许同源访问；",[52,49349,49350],{},"allow-top-navigation：允许访问顶层窗口；",[52,49352,49353],{},"allow-forms：允许提交表单；",[52,49355,49356],{},"allow-scripts：允许执行脚本。",[10548,49358,49360],{"id":49359},"_3link-typesnoreferrer","（3）Link Types：noreferrer",[13,49362,49363],{},"在HTML 5中为\u003Ca>标签和\u003Carea>标签定义了一个新的Link Types：noreferrer。顾名思义，标签指定了noreferrer后，浏览器在请求该标签指定的地址时将不再发送Referer。",[13,49365,49366],{},"这种设计是出于保护敏感信息和隐私的考虑。因为通过Referer，可能会泄露一些敏感信息。这个标签需要开发者手动添加到页面的标签中，对于有需求的标签可以选择使用noreferrer。代码如下：",[114,49368,49370],{"className":41615,"code":49369,"language":41617,"meta":119,"style":119},"\u003Ca href=\"xxx\" rel=\"noreferrer\" >test\u003C\u002Fa>\n",[17,49371,49372],{"__ignoreMap":119},[78,49373,49374,49376,49378,49381,49383,49386,49389,49391,49394,49397,49399],{"class":124,"line":125},[78,49375,41631],{"class":41630},[78,49377,5009],{"class":41634},[78,49379,49380],{"class":41638}," href",[78,49382,4609],{"class":41630},[78,49384,49385],{"class":41644},"\"xxx\"",[78,49387,49388],{"class":41638}," rel",[78,49390,4609],{"class":41630},[78,49392,49393],{"class":41644},"\"noreferrer\"",[78,49395,49396],{"class":41630}," >test\u003C\u002F",[78,49398,5009],{"class":41634},[78,49400,41653],{"class":41630},[10548,49402,49404],{"id":49403},"_4canvas","（4）Canvas",[13,49406,49407],{},"不同于\u003Cimg>标签只是远程加载一个图片，\u003Ccanvas>标签让JavaScript可以在页面中直接操作图片对象，也可以直接操作像素，构造出图片区域。Canvas的出现极大地挑战了传统富客户端插件的地位，开发者甚至可以用Canvas在浏览器上写一个小游戏。",[13,49409,49410],{},"通过Canvas自动破解验证码，最大的好处是可以在浏览器环境中实现在线破解，大大降低了攻击的门槛。HTML 5使得过去难以做到的事情，变为可能。",[7759,49412,49414],{"id":49413},"_2其他安全问题","2、其他安全问题",[10548,49416,49418],{"id":49417},"_1cross-origin-resource-sharing","（1）Cross-Origin Resource Sharing",[13,49420,49421],{},"浏览器实现的同源策略（Same Origin Policy）限制了脚本的跨域请求。但互联网的发展趋势是越来越开放的，因此跨域访问的需求也变得越来越迫切。同源策略给Web开发者带来了很多困扰，他们不得不想方设法地实现一些“合法”的跨域技术，由此诞生了jsonp、iframe跨域等技巧。",[10548,49423,49425],{"id":49424},"_2postmessage跨窗口传递","（2）postMessage跨窗口传递",[13,49427,49428],{},"window这个对象几乎是不受同源策略限制的，很多脚本攻击都巧妙地利用了window对象的这一特点。在HTML 5中，为了丰富Web开发者的能力，制定了一个新的API：postMessage。postMessage允许每一个window（包括当前窗口、弹出窗口、iframes等）对象往其他的窗口发送文本消息，从而实现跨窗口的消息传递。这个功能是不受同源策略限制的。",[13,49430,49431],{},"在使用postMessage()时，有两个安全问题需要注意：",[49,49433,49434,49437],{},[52,49435,49436],{},"在必要时，可以在接收窗口验证 Domain，甚至验证URL，以防止来自非法页面的消息。这实际上是在代码中实现一次同源策略的验证过程。",[52,49438,49439],{},"实际应用中，如果将消息写入innerHTML，甚至直接写入script中，则可能会导致DOMbased XSS的产生。根据“Secure By Default”原则，在接收窗口不应该信任接收到的消息，而需要对消息进行安全检查。",[13,49441,49442],{},"使用postMessage，会使XSS Payload变得更加的灵活。",[10548,49444,49446],{"id":49445},"_3web-storage","（3）Web Storage",[13,49448,49449,49450,67],{},"Web Storage分为Session Storage 和 LocalStorage。Session Storage关闭浏览器就会失效，而Local Storage则会一直存在。",[22,49451,49452],{},"Web Storage就像一个非关系型数据库，由Key-Value对组成，可以通过JavaScript对其进行操作",[13,49454,49455],{},"Web Storage也受到同源策略的约束，每个域所拥有的信息只会保存在自己的域下，跨域时无法读取localStorage。Web Storage让Web开发更加的灵活多变，它的强大功能也为XSS Payload大开方便之门。攻击者有可能将恶意代码保存在Web Storage中，从而实现跨页面攻击。当Web Storage中保存有敏感信息时，也可能会成为攻击的目标，而XSS攻击可以完成这一过程。",[23289,49457],{},[107,49459,49461],{"id":49460},"第七章-注入攻击","第七章 注入攻击",[13,49463,49464],{},"注入攻击是Web安全领域中一种最为常见的攻击方式。**注入攻击的本质，是把用户输入的数据当做代码执行。**这里有两个关键条件，第一个是用户能够控制输入；第二个是原本程序要执行的代码，拼接了用户输入的数据。",[7759,49466,49468],{"id":49467},"_1sql注入","1、SQL注入",[13,49470,49471],{},"在SQL注入的过程中，如果网站的Web服务器开启了错误回显，则会为攻击者提供极大的便利，比如攻击者在参数中输入一个单引号“'”，引起执行查询语句的语法错误，服务器直接返回了错误信息。错误回显披露了敏感信息，对于攻击者来说，构造SQL注入的语句就可以更加得心应手了。",[10548,49473,49475],{"id":49474},"_1盲注blind-injection","（1）盲注（Blind Injection）",[13,49477,49478,49479],{},"“盲注”就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显，对于攻击者来说缺少了非常重要的“调试信息”，所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。",[22,49480,49481],{},"最常见的盲注验证方法是，构造简单的条件语句，根据返回页面是否发生变化，来判断SQL语句是否得到执行。",[10548,49483,49485],{"id":49484},"_2timing-attack","（2）Timing Attack",[13,49487,49488],{},"利用BENCHMARK()函数，可以让同一个函数执行若干次，使得结果返回的时间比平时要长；通过时间长短的变化，可以判断出注入语句是否执行成功。这是一种边信道攻击，这个技巧在盲注中被称为Timing Attack。",[13,49490,49491],{},"Timing Attack是盲注的一种高级技巧。在不同的数据库中，都有着类似于BENCHMARK()的函数，可以被Timing Attack所利用。",[7759,49493,49495],{"id":49494},"_2数据库攻击技巧","2、数据库攻击技巧",[10548,49497,49499],{"id":49498},"_1常见的攻击技巧","（1）常见的攻击技巧",[13,49501,49502],{},"在注入攻击的过程中，常常会用到一些读写文件的技巧。比如在MySQL中，就可以通过LOAD_FILE()读取系统文件，并通过INTODUMPFILE写入本地文件。当然这要求当前数据库用户有读写系统相应文件或目录的权限。",[13,49504,49505],{},"如果当前数据库用户有创建表的权限：首先通过LOAD_FILE()将系统文件读出，再通过INTODUMPFILE将该文件写入系统中，然后通过LOAD DATA INFILE将文件导入创建的表中，最后就可以通过一般的注入技巧直接操作表数据了。",[13,49507,49508,49509,67],{},"除了可以使用INTO DUMPFILE外，还可以使用INTO OUTFILE，两者的区别是DUMPFILE适用于二进制文件，它会将目标文件写入同一行内；而OUTFILE则更适用于文本文件。写入文件的技巧，经常被用于导出一个Web-shell，为攻击者的进一步攻击做铺垫。因此在设计数据库安全方案时，可以",[22,49510,49511],{},"禁止普通数据库用户具备操作文件的权限",[10548,49513,49515],{"id":49514},"_2命令执行","（2）命令执行",[13,49517,49518],{},"通过lib_mysqludf_sys提供的几个函数执行系统命令，其中最主要的函数是sys_eval()和sys_exec()。在攻击过程中，将lib_mysqludf_sys.so上传到数据库能访问到的路径下。在创建UDF（User-Defined Functions）之后，就可以使用sys_eval()等函数执行系统命令了。 ?sys_eval，执行任意命令，并将输出返回。",[49,49520,49521,49524],{},[52,49522,49523],{},"sys_exec，执行任意命令，并将退出码返回。 ?sys_get，获取一个环境变量。",[52,49525,49526],{},"sys_set，创建或修改一个环境变量。",[13,49528,49529],{},[22,49530,49531],{},"在建立数据库账户时应该遵循“最小权限原则”，尽量避免给Web应用使用数据库的管理员权限。",[10548,49533,49535],{"id":49534},"_3攻击存储过程","（3）攻击存储过程",[13,49537,49538],{},"存储过程为数据库提供了强大的功能，它与UDF很像，但存储过程必须使用CALL或者EXE-CUTE来执行。除了利用存储过程直接攻击外，存储过程本身也可能会存在注入漏洞。",[10548,49540,49542],{"id":49541},"_4编码问题","（4）编码问题",[13,49544,49545],{},"在有些时候，不同的字符编码也可能会导致一些安全问题。注入攻击中常常会用到单引号“’”、双引号“””等特殊字符。在应用中，开发者为了安全，经常会使用转义字符“\\”来转义这些特殊字符。但当数据库使用了“宽字符集”时，可能会产生一些意想不到的漏洞。比如，当MySQL使用了GBK编码时，0xbf27 和 0xbf5c都会被认为是一个字符（双字节字符）。",[13,49547,49548,49549,49552,49553,67],{},"要解决这种问题，需要",[22,49550,49551],{},"统一数据库、操作系统、Web应用所使用的字符集，以避免各层对字符的理解存在差异","。统一设置为UTF-8是一个很好的方法。如果因为种种原因无法统一字符编码，则需要",[22,49554,49555],{},"单独实现一个用于过滤或转义的安全函数，在其中需要考虑到字符的可能范围",[10548,49557,49559],{"id":49558},"_5sql-column-truncation","（5）SQL Column Truncation",[13,49561,49562],{},"在MySQL的配置选项中，有一个sql_mode选项。当MySQL的sql-mode设置为default时，即没有开启STRICT_ALL_TABLES选项时，MySQL对于用户插入的超长值只会提示warning，而不是error（如果是error则插入不成功），这可能会导致发生一些“截断”问题。",[13,49564,49565],{},"简单来说就是当插入的数据超过设置长度时，只把限制内的长度存入。比如说：如果用户名只允许存8位，管理员名称为admin，那么创建名字的时候这是为admin___x（其中_代表空格），那么将存入的是admin___，经过一些处理（比如说过滤空格）可以实现和admin一样的效果。",[7759,49567,49569],{"id":49568},"_3防御sql注入","3、防御SQL注入",[13,49571,49572],{},"SQL注入的防御并不是一件简单的事情，开发者常常会走入一些误区。比如只对用户输入做一些escape处理，这是不够的。",[10548,49574,49576],{"id":49575},"_1使用预编译语句","（1）使用预编译语句",[13,49578,49579,49580,49583],{},"防御SQL注入的最佳方式，就是使用预编译语句，",[22,49581,49582],{},"绑定变量","。使用预编译的SQL语句，SQL语句的语义不会发生改变。在SQL语句中，变量用?表示，攻击者无法改变SQL的结构，即使攻击者插入类似于tom' or '1'='1的字符串，也只会将此字符串当做username来查询。",[10548,49585,49587],{"id":49586},"_2使用存储过程","（2）使用存储过程",[13,49589,49590],{},"使用安全的存储过程对抗SQL注入。使用存储过程的效果和使用预编语句译类似，其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是，存储过程中也可能会存在注入问题，因此应该尽量避免在存储过程内使用动态的SQL语句。如果无法避免，则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。",[10548,49592,49594],{"id":49593},"_3检查数据类型","（3）检查数据类型",[13,49596,49597],{},"检查输入数据的数据类型，在很大程度上可以对抗SQL注入。但数据类型检查并非万能，如果需求就是需要用户提交字符串，比如一段短文，则需要依赖其他的方法防范SQL注入。",[10548,49599,49601],{"id":49600},"_4使用安全函数","（4）使用安全函数",[7759,49603,49605],{"id":49604},"_4其他注入攻击","4、其他注入攻击",[13,49607,49608],{},"除了SQL注入外，在Web安全领域还有其他的注入攻击，这些注入攻击都有相同的特点，就是应用违背了**“数据与代码分离”原则**。",[10548,49610,49612],{"id":49611},"_1xml注入","（1）XML注入",[13,49614,49615],{},"XML是一种常用的标记语言，通过标签对数据进行结构化表示。XML与HTML都是SGML（Standard Generalized Markup Language，标准通用标记语言）。",[13,49617,49618],{},"XML注入，也需要满足注入攻击的两大条件：用户能控制数据的输入；程序拼凑了数据。在修补方案上，与HTML注入的修补方案也是类似的，对用户输入数据中包含的“语言本身的保留字符”进行转义即可。",[10548,49620,49622],{"id":49621},"_2代码注入","（2）代码注入",[13,49624,49625],{},"代码注入与命令注入往往都是由一些不安全的函数或者方法引起的，其中的典型代表就是eval()。**存在代码注入漏洞的地方，与“后门”没有区别。**Java的脚本引擎、PHP、JSP的动态include（文件包含漏洞）导致的代码执行，都可以算是一种代码注入。代码注入多见于脚本语言，有时候代码注入可以造成命令注入（Command Injection）。",[13,49627,49628,49629,49632],{},"对抗代码注入、命令注入时，需要",[22,49630,49631],{},"禁用eval()、system()等可以执行命令的函数。如果一定要使用这些函数，则需要对用户的输入数据进行处理","。此外，在PHP\u002FJSP中避免动态include远程文件，或者安全地处理它。",[10548,49634,49636],{"id":49635},"_3crlf注入","（3）CRLF注入",[13,49638,49639,49640],{},"CRLF实际上是两个字符：CR是Carriage Re-turn(ASCII 13, \\r)，LF是Line Feed(ASCII 10,\\n)。\\r\\n这两个字符是用于表示换行的，其十六进制编码分别为0x0d、0x0a。",[22,49641,49642],{},"CRLF常被用做不同语义之间的分隔符。因此通过“注入CRLF字符”，就有可能改变原有的语义。",[13,49644,49645],{},"对抗CRLF的方法非常简单，只需要处理好“\\r”、“\\n”这两个保留字符即可，尤其是那些使用“换行符”作为分隔符的应用。",[23289,49647],{},[107,49649,49651],{"id":49650},"第八章-文件上传漏洞","第八章 文件上传漏洞",[7759,49653,27767],{"id":27706},[13,49655,49656],{},"文件上传漏洞是指用户上传了一个可执行的脚本文件，并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的，有时候几乎没有什么技术门槛。文件上传后导致的常见安全问题一般有：",[49,49658,49659,49662,49665,49668],{},[52,49660,49661],{},"上传文件是Web脚本语言，服务器的Web容器解释并执行了用户上传的脚本，导致代码执行；",[52,49663,49664],{},"上传文件是Flash的策略文件crossdomain.xml，黑客用以控制Flash在该域下的行为（其他通过类似方式控制策略文件的情况类似）；",[52,49666,49667],{},"上传文件是病毒、木马文件，黑客用以诱骗用户或者管理员下载执行；",[52,49669,49670],{},"上传文件是钓鱼图片或为包含了脚本的图片，在某些版本的浏览器中会被作为脚本执行，被用于钓鱼和欺诈。",[13,49672,49673],{},"除此之外，还有一些不常见的利用方法，比如将上传文件作为一个入口，溢出服务器的后台处理程序，如图片解析模块；或者上传一个合法的文本文件，其内容包含了PHP脚本，再通过“本地文件包含漏洞（Local File Include）”执行此脚本；等等。在大多数情况下，文件上传漏洞一般都是指“上传Web脚本能够被服务器解析”的问题，也就是通常所说的webshell的问题。要完成这个攻击，要满足如下几个条件：",[49,49675,49676,49679,49682],{},[52,49677,49678],{},"首先，上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。",[52,49680,49681],{},"其次，用户能够从Web上访问这个文件。如果文件上传了，但用户无法通过Web访问，或者无法使得Web容器解释这个脚本，那么也不能称之为漏洞。",[52,49683,49684],{},"最后，用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容，则也可能导致攻击不成功。",[7759,49686,49688],{"id":49687},"_2功能导致的漏洞","2、功能导致的漏洞",[13,49690,49691],{},"在文件上传漏洞的利用过程中，攻击者发现一些和Web Server本身特性相关的功能，如果加以利用，就会变成威力巨大的武器。",[10548,49693,49695],{"id":49694},"_1apache文件解析问题","（1）Apache文件解析问题",[13,49697,49698],{},"在Apache 1.x、2.x中，对文件名的解析就存在这种特性：Apache对于文件名的解析是从后往前解析的，直到遇见一个Apache认识的文件类型为止。",[114,49700,49703],{"className":49701,"code":49702,"language":299},[297],"Phpshell.php.rar.rar.rar.rar.rar\n",[17,49704,49702],{"__ignoreMap":119},[13,49706,49707],{},"Apache不认识.rar这个文件类型，所以会一直遍历后缀到.php，然后认为这是一个PHP类型的文件。",[10548,49709,49711],{"id":49710},"_2iis文件解析问题","（2）IIS文件解析问题",[13,49713,49714],{},"IIS 6在处理文件解析时，也出过一些漏洞。前面提到的0x00字符截断文件名，在IIS和Windows环境下曾经出过非常类似的漏洞，不过截断字符变成了分号“;”。当文件名为abc.asp;xx.jpg时，IIS 6会将此文件解析为abc.asp，文件名被截断了，从而导致脚本被执行。",[10548,49716,49718],{"id":49717},"_3php-cgi路径解析问题-利用上传文件钓鱼","（3）PHP CGI路径解析问题 && 利用上传文件钓鱼",[13,49720,49721],{},"自己看书吧这个就。",[7759,49723,49725],{"id":49724},"_3安全的文件上传功能","3、安全的文件上传功能",[10548,49727,49729],{"id":49728},"_1文件上传的目录设置为不可执行","（1）文件上传的目录设置为不可执行",[13,49731,49732],{},"只要Web容器无法解析该目录下的文件，即使攻击者上传了脚本文件，服务器本身也不会受到影响，因此此点至关重要。在实际应用中，很多大型网站的上传应用，文件上传后会放到独立的存储上，做静态文件处理，一方面方便使用缓存加速，降低性能损耗；另一方面也杜绝了脚本执行的可能。",[10548,49734,49736],{"id":49735},"_2判断文件类型","（2）判断文件类型",[13,49738,49739],{},"在判断文件类型时，可以结合使用MIMEType、后缀检查等方式。在文件类型检查中，强烈推荐白名单的方式，黑名单的方式已经无数次被证明是不可靠的。此外，对于图片的处理，可以使用压缩函数或者resize函数，在处理图片的同时破坏图片中可能包含的HTML代码。（前端过滤文件类型）",[10548,49741,49743],{"id":49742},"_3使用随机数改写文件名和文件路径","（3）使用随机数改写文件名和文件路径",[13,49745,49746],{},"文件上传如果要执行代码，则需要用户能够访问到这个文件。在某些环境中，用户能上传，但不能访问。如果应用使用随机数改写了文件名和路径，将极大地增加攻击的成本。与此同时，像shell.php.rar.rar这种文件，或者是crossdo-main.xml这种文件，都将因为文件名被改写而无法成功实施攻击。（这也是为什么现在主流的后端保存图片的时候文件会在后端规格化命名）",[10548,49748,49750],{"id":49749},"_4单独设置文件服务器的域名","（4）单独设置文件服务器的域名",[13,49752,49753],{},"由于浏览器同源策略的关系，一系列客户端攻击将失效，比如上传crossdomain.xml、上传包含JavaScript的XSS利用等问题将得到解决。但能否如此设置，还需要看具体的业务环境。（也可以使用一些云端存储设备【收费但是更安全】，比如说七牛云、阿里云OSS）",[23289,49755],{},[107,49757,49759],{"id":49758},"第九章-认证和会话管理","第九章 认证和会话管理",[13,49761,49762],{},"“认证”是最容易理解的一种安全。如果一个系统缺乏认证手段，明眼人都能看出来这是“不安全”的。最常见的认证方式就是用户名与密码，但认证的手段却远远不止于此。",[7759,49764,49766],{"id":49765},"_1认证与授权","1、“认证”与“授权”",[13,49768,49769,49770],{},"“认证”和“授权”是两件事情，认证的英文是Authentication，授权则是Authorization。分清楚这两个概念其实很简单，只需要记住下面这个事实：",[22,49771,49772],{},"认证的目的是为了认出用户是谁，而授权的目的是为了决定用户能够做什么。",[13,49774,49775],{},"证的手段是多样化的，其目的就是为了能够识别出正确的人。如何才能准确地判断一个人是谁呢？这是一个哲学问题，在被哲学家们搞清楚之前，我们只能够依据人的不同“凭证”来确定一个人的身份。钥匙仅仅是一个很脆弱的凭证，其他诸如指纹、虹膜、人脸、声音等生物特征也能够作为识别一个人的凭证。认证实际上就是一个验证凭证的过程。",[13,49777,49778,49779,67],{},"如果只有一个凭证被用于认证，则称为“单因素认证”；如果有两个或多个凭证被用于认证，则称为“双因素（Two Factors）认证”或“多因素认证”。一般来说，多因素认证的强度要高于单因素认证，但是在",[22,49780,49781],{},"用户体验上，多因素认证或多或少都会带来一些不方便的地方",[7759,49783,49785],{"id":49784},"_2密码","2、密码",[13,49787,49788],{},"密码是最常见的一种认证手段，持有正确密码的人被认为是可信的。长期以来，桌面软件、互联网都普遍以密码作为最基础的认证手段。",[13,49790,49791,49792,49795],{},"密码的",[22,49793,49794],{},"优点是使用成本低，认证过程实现起来很简单；缺点是密码认证是一种比较弱的安全方案","，可能会被猜解，要实现一个足够安全的密码认证方案，也不是一件轻松的事情。“密码强度”是设计密码认证方案时第一个需要考虑的问题。在用户密码强度的选择上，每个网站都有自己的策略。",[7759,49797,49799],{"id":49798},"_3多因素认证","3、多因素认证",[13,49801,49802,49803],{},"除了支付密码外，手机动态口令、数字证书、宝令、支付盾、第三方证书等都可用于用户认证。这些不同的认证手段可以互相结合，使得认证的过程更加安全。密码不再是唯一的认证手段，在用户密码丢失的情况下，也有可能有效地保护用户账户的安全。",[22,49804,49805],{},"多因素认证提高了攻击的门槛。",[7759,49807,49809],{"id":49808},"_4session与认证","4、Session与认证",[13,49811,49812],{},"密码与证书等认证手段，一般仅仅用于登录（Login）的过程。当登录完成后，用户访问网站的页面，不可能每次浏览器请求页面时都再使用密码认证一次。因此，当认证成功后，就需要替换一个对用户透明的凭证。这个凭证，就是SessionID。最常见的做法就是把SessionID加密后保存在Cookie中，因为Cookie会随着HTTP请求头发送，且受到浏览器同源策略的保护。",[13,49814,49815],{},"**SessionID一旦在生命周期内被窃取，就等同于账户失窃。**同时由于SessionID是用户登录之后才持有的认证凭证，因此黑客不需要再攻击登录过程（比如密码），在设计安全方案时需要意识到这一点。",[13,49817,49818,49819,49822],{},"在生成SessionID时，需要",[22,49820,49821],{},"保证足够的随机性，比如采用足够强的伪随机数生成算法","。现在的网站开发中，都有很多成熟的开发框架可以使用。这些成熟的开发框架一般都会提供Cookie管理、Session管理的函数，可以善用这些函数和功能。",[7759,49824,49826],{"id":49825},"_5session-fixation攻击","5、Session Fixation攻击",[13,49828,49829],{},"在用户登录网站的过程中，如果登录前后用户的SessionID没有发生变化，则会存在Session Fixation问题。具体攻击的过程是，用户X（攻击者）先获取到一个未经认证的SessionID，然后将这个SessionID交给用户Y去认证，Y完成认证后，服务器并未更新此SessionID的值（注意是未改变SessionID，而不是未改变Session），所以X可以直接凭借此SessionID登录进Y的账户。",[7759,49831,49833],{"id":49832},"_6session保持攻击","6、Session保持攻击",[13,49835,49836],{},"一般的应用都会给session设置一个失效时间，当到达失效时间后，Session将被销毁。但有一些系统，出于用户体验的考虑，只要这个用户还“活着”，就不会让这个用户的Session失效。从而攻击者可以通过不停地发起访问请求，让Session一直“活”下去。",[13,49838,49839],{},"对抗这种攻击，常见的做法是在一定时间后，强制销毁Session。这个时间可以是从用户登录的时间算起，设定一个阈值，比如3天后就强制Session过期。但强制销毁Session可能会影响到一些正常的用户，还可以选择的方法是当用户客户端发生变化时，要求用户重新登录。比如用户的IP、UserA-gent等信息发生了变化，就可以强制销毁当前的Session，并要求用户重新登录。",[13,49841,49842],{},"最后，还需要考虑的是同一用户可以同时拥有几个有效Session。若每个用户只允许拥有一个Session，则攻击者想要一直保持一个Session也是不太可能的。当用户再次登录时，攻击者所保持的Session将被“踢出”。",[7759,49844,49846],{"id":49845},"_7单点登录single-sign-on","7、单点登录（Single Sign On）",[13,49848,49849],{},"用户只需要登录一次，就可以访问所有的系统。从用户体验的角度看，SSO无疑让用户的使用更加的方便；从安全的角度看，SSO把风险集中在单点上，这样做是有利有弊的。",[13,49851,49852],{},"**SSO的优点在于风险集中化，就只需要保护好这一个点。**如果让每个系统各自实现登录功能，由于各系统的产品需求、应用环境、开发工程师的水平都存在差异，登录功能的安全标准难以统一。而SSO解决了这个问题，它把用户登录的过程集中在一个地方。在单点处设计安全方案，甚至可以考虑使用一些较“重”的方法，比如双因素认证。此外对于一些中小网站来说，维护一份用户名、密码也是没有太大必要的开销，所以如果能将这个工作委托给一个可以信任的第三方，就可以将精力集中在业务上。",[13,49854,49855],{},"**SSO的缺点同样也很明显，因为风险集中了，所以单点一旦被攻破的话，后果会非常严重，影响的范围将涉及所有使用单点登录的系统。**降低这种风险的办法是在一些敏感的系统里，再单独实现一些额外的认证机制。比如网上支付平台，在付款前要求用户再输入一次密码，或者通过手机短信验证用户身份等。",[23289,49857],{},[107,49859,49861],{"id":49860},"第十章-访问控制","第十章 访问控制",[13,49863,49864],{},"“权限”一词在安全领域出现的频率很高。“权限”实际上是一种“能力”。对于权限的合理分配，一直是安全设计中的核心问题。但“权限”一词的中文含义过于广泛，因此本章中将使用“访问控制”代替。在互联网安全领域，尤其是Web安全领域中，“权限控制”的问题都可以归结为“访问控制”的问题，这种描述也更精确一些。",[13,49866,49867],{},"权限控制，或者说访问控制，广泛应用于各个系统中。抽象地说，都是某个主体（subject）对某个客体（object）需要实施某种操作（operation），而系统对这种操作的限制就是权限控制。",[13,49869,49870],{},"在网络中，为了保护网络资源的安全，一般是通过路由设备或者防火墙建立基于IP的访问控制。这种访问控制的“主体”是网络请求的发起方（比如一台PC），“客体”是网络请求的接收方（比如一台服务器），主体对客体的“操作”是对客体的某个端口发起网络请求。这个操作能否执行成功，是受到防火墙ACL策略限制的。",[13,49872,49873],{},"在操作系统中，对文件的访问也有访问控制。此时“主体”是系统的用户，“客体”是被访问的文件，能否访问成功，将由操作系统给文件设置的ACL（访问控制列表）决定。比如在Linux系统中，一个文件可以执行的操作分为“读”、“写”、“执行”三种，分别由r、w、x表示。这三种操作同时对应着三种主体：文件拥有者、文件拥有者所在的用户组、其他用户。主体、客体、操作这三者之间的对应关系，构成了访问控制列表。",[7759,49875,49877],{"id":49876},"_1垂直管理权限","1、垂直管理权限",[13,49879,49880,49883],{},[22,49881,49882],{},"访问控制实际上是建立用户与权限之间的对应关系","，现在应用广泛的一种方法，就是“基于角色的访问控制（Role-Based Access Control）”，简称RBAC。",[13,49885,49886],{},"RBAC事先会在系统中定义出不同的角色，不同的角色拥有不同的权限，一个角色实际上就是一个权限的集合。而系统的所有用户都会被分配到不同的角色中，一个用户可能拥有多个角色，角色之间有高低之分（权限高低）。在系统验证权限时，只需要验证用户所属的角色，然后就可以根据该角色所拥有的权限进行授权了。",[13,49888,49889,49892],{},[22,49890,49891],{},"Spring Security中的权限管理，就是RBAC模型的一个实现","。Spring Security基于SpringMVC框架，它的前身是Acegi，是一套较为全面的Web安全解决方案。在Spring Security中提供了认证、授权等功能。在这里我们只关注Spring Security的授权功能。",[49,49894,49895,49898],{},[52,49896,49897],{},"Spring Security提供了一系列的“FilterChain”，每个安全检查的功能都会插入在这个链条中。在与Web系统集成时，开发者只需要将所有用户请求的URL都引入到Filter Chain即可。",[52,49899,49900],{},"Spring Security提供两种权限管理方式，一种是“基于URL的访问控制”，一种是“基于method的访问控制”。这两种访问控制都是RBAC模型的实现，换言之，在Spring Security中都是验证该用户所属的角色，以决定是否授权。",[13,49902,49903,49904,49907],{},"权限管理其实是业务需求上的一个问题，需要根据业务的不同需求来实现不同的权限管理。因此很多时候，系统都需要自己定制权限管理。这种",[22,49905,49906],{},"基于角色的权限管理（RBAC模型）","，我们可以称之为“垂直权限管理”。",[13,49909,49910],{},"不同角色的权限有高低之分。高权限角色访问低权限角色的资源往往是被允许的，而低权限角色访问高权限角色的资源往往则被禁止。如果一个本属于低权限角色的用户通过一些方法能够获得高权限角色的能力，则发生了“越权访问”。",[7759,49912,49914],{"id":49913},"_2水平权限管理","2、水平权限管理",[13,49916,49917],{},"RBAC这种“基于角色的访问控制”模型下，系统只会验证用户A是否属于角色RoleX，而不会判断用户A是否能访问只属于用户B的数据DataB，因此，发生了越权访问。这种问题，我们就称之为“水平权限管理问题”。",[13,49919,49920,49921,67],{},"相对于垂直权限管理来说，水平权限问题出在同一个角色上。系统只验证了能访问数据的角色，既没有对角色内的用户做细分，也没有对数据的子集做细分，因此缺乏一个用户到数据之间的对应关系。由于水平权限管理是系统缺乏一个数据级的访问控制所造成的，因此",[22,49922,49923],{},"水平权限管理又可以称之为“基于数据的访问控制”",[7759,49925,49927],{"id":49926},"_3oauth","3、OAuth",[13,49929,49930,49931,67],{},"OAuth是一个在不提供用户名和密码的情况下，授权第三方应用访问Web资源的安全协议。OAuth 与 OpenID都致力于让互联网变得更加的开放。OpenID解决的是认证问题，OAuth则更注重授权。认证与授权的关系其实是一脉相承的，后来人们发现，其实更多的时候真正需要的是",[22,49932,49933],{},"对资源的授权",[23289,49935],{},[107,49937,49939],{"id":49938},"第十一章-加密算法与随机数","第十一章 加密算法与随机数",[13,49941,49942],{},"加密算法与伪随机数算法是开发中经常会用到的东西，但加密算法的专业性非常强，在Web开发中，如果对加密算法和伪随机数算法缺乏一定的了解，则很可能会错误地使用它们，最终导致应用出现安全问题。",[7759,49944,27767],{"id":27766},[13,49946,49947],{},"常见的加密算法通常分为分组加密算法与流密码加密算法两种，两者的实现原理不同。",[49,49949,49950,49953],{},[52,49951,49952],{},"分组加密算法基于“分组”（block）进行操作，根据算法的不同，每个分组的长度可能不同。分组加密算法的代表有DES、3-DES、Blowfish、IDEA、AES等。",[52,49954,49955],{},"流密码加密算法，则每次只处理一个字节，密钥独立于消息之外，两者通过异或实现加密与解密。流密码加密算法的代表有RC4、ORYX、SEAL等。",[13,49957,49958],{},"针对加密算法的攻击，一般根据攻击者能获得的信息，可以分为：",[10548,49960,49962],{"id":49961},"_1唯密文攻击","（1）唯密文攻击",[13,49964,49965],{},"攻击者有一些密文，它们是使用同一加密算法和同一密钥加密的。这种攻击是最难的。",[10548,49967,49969],{"id":49968},"_2已知明文攻击","（2）已知明文攻击",[13,49971,49972],{},"攻击者除了能得到一些密文外，还能得到这些密文对应的明文。本章中针对流密码的一些攻击为已知明文攻击。",[10548,49974,49976],{"id":49975},"_3选择明文攻击","（3）选择明文攻击",[13,49978,49979],{},"攻击者不仅能得到一些密文和明文，还能选择用于加密的明文。",[10548,49981,49983],{"id":49982},"_4选择密文攻击","（4）选择密文攻击",[13,49985,49986],{},"攻击者可以选择不同的密文来解密。",[7759,49988,49990],{"id":49989},"_2stream-cipher-attack","2、Stream Cipher Attack",[13,49992,49993],{},"流密码是常用的一种加密算法，与分组加密算法不同，流密码的加密是基于异或（XOR）操作进行的，每次都只操作一个字节。但流密码加密算法的性能非常好，因此也是非常受开发者欢迎的一种加密算法。常见的流密码加密算法有RC4、ORYX、SEAL等。",[10548,49995,49997],{"id":49996},"_1reused-key-attack","（1）Reused Key Attack",[13,49999,50000],{},"在流密码的使用中，最常见的错误便是使用同一个密钥进行多次加\u002F解密。这将使得破解流密码变得非常简单。这种攻击被称为“Reused Key At-tack”，在这种攻击下，攻击者不需要知道密钥，即可还原出明文。（具体实现办法可以看书哦，这个比较有意思）",[10548,50002,50004],{"id":50003},"_2bit-flipping-attack","（2）Bit-flipping Attack",[13,50006,50007],{},"当知道A的明文、B的明文、A的密文时，可以推导出B的密文。在密码学中，攻击者在不知道明文的情况下，通过改变密文，使得明文按其需要的方式发生改变的攻击方式，被称为Bit-flipping Attack。",[13,50009,50010,50011,50014],{},"解决Bit-flipping攻击的方法是",[22,50012,50013],{},"验证密文的完整性","，最常见的方法是增加带有KEY的MAC（消息验证码，Message Authentication Code），通过MAC验证密文是否被篡改。",[10548,50016,50018],{"id":50017},"_3弱随机ⅳ问题","（3）弱随机Ⅳ问题",[13,50020,50021],{},"在authcode()函数中，它默认使用了4字节的IV（就是函数中的keyc），使得破解难度增大。但是4字节的IV实际上是很脆弱的，它不够随机，可以通过“暴力破解”的方式找到重复的IV。",[7759,50023,50025],{"id":50024},"_3wep破解","3、WEP破解",[13,50027,50028],{},"WEP是一种常用的无线加密传输协议，破解了WEP的密钥，就可以以此密钥连接无线的Access Point。最著名的针对流密码的攻击可能就是WEP密钥的破解。WEP采用RC4算法，也存在这两种攻击方式。WEP在加密过程中，有两个关键因素，一个是初始化向量IV，一个是对消息的CRC-32校验。",[49,50030,50031,50034,50037,50040,50043,50046],{},[52,50032,50033],{},"第一步：加载目标。",[52,50035,50036],{},"第二步：与目标网络进行协商。",[52,50038,50039],{},"第三步：生成密钥流。",[52,50041,50042],{},"第四步：构造ARP包。",[52,50044,50045],{},"第五步：生成自己的ARP包。",[52,50047,50048],{},"第六步：开始破解。",[7759,50050,50052],{"id":50051},"_4ecp模式","4、ECP模式",[13,50054,50055],{},"对于分组加密算法来说，除去算法本身，还有一些通用的加密模式，不同的加密算法会支持同样的几种加密模式。常见的加密模式有：ECB、CBC、CFB、OFB、CTR等。如果加密模式被攻击，那么不论加密算法的密钥有多长，都可能不再安全。",[13,50057,50058],{},"ECB模式（电码簿模式）是最简单的一种加密模式，它的每个分组之间相对独立。",[13,50060,50061],{},[617,50062],{"alt":119,"src":32278},[13,50064,50065],{},"但ECB模式最大的问题也是出在这种分组的独立性上：攻击者只需要对调任意分组的密文，在经过解密后，所得明文的顺序也是经过对调的。这与链式加密模式（CBC）等是完全不同的，链式加密模式的分组前后之间会互相关联，一个字节的变化，会导致整个密文发生变化。这一特点也可以用于判断密文是否是用ECB模式加密的。",[13,50067,50068],{},"对于ECB模式来说，改变分组密文的顺序，将改变解密后的明文顺序；替换某个分组密文，解密后该对应分组的明文也会被替换，而其他分组不受影响。",[13,50070,50071,50074],{},[22,50072,50073],{},"ECB模式并未完全混淆分组间的关系，因此当分组足够多时，仍然会暴露一些私密信息，而链式模式则避免了此问题","。当需要加密的明文多于一个分组的长度时，应该避免使用ECB模式，而使用其他更加安全的加密模式。",[7759,50076,50078],{"id":50077},"_5密钥管理","5、密钥管理",[13,50080,50081,50082],{},"在密码学里有个基本的原则：",[22,50083,50084],{},"密码系统的安全性应该依赖于密钥的复杂性，而不应该依赖于算法的保密性。",[13,50086,50087],{},"在安全领域里，选择一个足够安全的加密算法不是困难的事情，难的是密钥管理。在一些实际的攻击案例中，直接攻击加密算法本身的案例很少，而因为密钥没有妥善管理导致的安全事件却很多。对于攻击者来说，他们不需要正面破解加密算法，如果能够通过一些方法获得密钥，则是件事半功倍的事情。",[13,50089,50090],{},[22,50091,50092],{},"密钥管理中最常见的错误，就是将密钥硬编码在代码里。",[49,50094,50095,50098],{},[52,50096,50097],{},"代码被广泛传播。这种泄露途径常见于一些开源软件；有的商业软件并不开源，但编译后的二进制文件被用户下载，也可能被逆向工程反编译后，泄露硬编码的密钥。",[52,50099,50100],{},"软件开发团队的成员都能查看代码，从而获知硬编码的密钥。开发团队的成员如果流动性较大，则可能会由此泄露代码。",[13,50102,50103,50104,50107,50108],{},"密钥管理的主要目的，还是为了防止密钥从非正常的渠道泄露。",[22,50105,50106],{},"定期更换密钥也是一种有效的做法","。一个比较安全的密钥管理系统，可以将所有的密钥（包括一些敏感配置文件）都集中保存在一个服务器（集群）上，并通过Web Service的方式提供获取密钥的API。每个Web应用在需要使用密钥时，通过带认证信息的API请求密钥管理系统，动态获取密钥。",[22,50109,50110],{},"Web应用不能把密钥写入本地文件中，只加载到内存，这样动态获取密钥最大程度地保护了密钥的私密性。密钥集中管理，降低了系统对于密钥的耦合性，也有利于定期更换密钥。",[7759,50112,50114],{"id":50113},"_6伪随机数问题","6、伪随机数问题",[13,50116,50117],{},"伪随机数（pseudo random number）问题——伪随机数不够随机，是程序开发中会出现的一个问题。一方面，大多数开发者对此方面的安全知识有所欠缺，很容易写出不安全的代码；另一方面，伪随机数问题的攻击方式在多数情况下都只存在于理论中，难以证明，因此在说服程序员修补代码时也显得有点理由不够充分。",[13,50119,50120],{},"伪随机数，是通过一些数学算法生成的随机数，并非真正的随机数。密码学上的安全伪随机数应该是不可压缩的。对应的“真随机数”，则是通过一些物理系统生成的随机数，比如电压的波动、硬盘磁头读\u002F写时的寻道时间、空中电磁波的噪声等。",[10548,50122,50124],{"id":50123},"_1进程伪随机","（1）进程伪随机",[13,50126,50127],{},"在OpenSSL的伪随机数生成算法中，唯一的随机因子是pid。而在Linux系统中，pid的最大值也是32768。这是一个很小的范围，因此可以很快地遍历出所有的随机数。",[10548,50129,50131],{"id":50130},"_2时间伪随机","（2）时间伪随机",[13,50133,50134,50135],{},"很多伪随机数算法与系统时间有关，而有的程序员甚至就直接使用系统时间代替随机数的生成。这样生成的随机数，是根据时间顺序增长的，可以从时间上进行预测，从而存在安全隐患。在开发程序时，要切记：",[22,50136,50137],{},"不要把时间函数当成随机数使用。",[10548,50139,50141],{"id":50140},"_3破解伪随机的方法","（3）破解伪随机的方法",[13,50143,50144],{},"（这里书上主要介绍的是PHP上几个函数的破解方式，大部分以代码为主，感兴趣可以看看）",[10548,50146,50148],{"id":50147},"_4安全的随机数","（4）安全的随机数",[13,50150,50151],{},"在重要或敏感的系统中，一定要使用足够强壮的随机数生成算法。",[49,50153,50154,50157,50160],{},[52,50155,50156],{},"在Java中，可以使用java.security.SecureRandom。",[52,50158,50159],{},"在Linux中，可以使用\u002Fdev\u002Frandom或者\u002Fdev\u002Furandom来生成随机数，只需要读取即可。",[52,50161,50162],{},"在PHP 5.3.0及其之后的版本中，若是支持openSSL扩展，也可以直接使用函数来生成随机数。",[13,50164,50165],{},"算法上还可以通过多个随机数的组合，以增加随机数的复杂性。比如通过给随机数使用MD5算法后，再连接一个随机字符，然后再使用MD5算法一次。这些方法，也将极大地增加攻击的难度。",[7759,50167,50169],{"id":50168},"_7一些注重的细节","7、一些注重的细节",[13,50171,50172],{},"在加密算法的选择和实践上，有以下最佳实践：",[10548,50174,50176],{"id":50175},"_1不要使用ecb模式","（1）不要使用ECB模式",[10548,50178,50180],{"id":50179},"_2不要使用流密码比如rc4","（2）不要使用流密码（比如RC4）",[10548,50182,50184],{"id":50183},"_3使用hmac-sha1代替md5甚至是代替sha1","（3）使用HMAC-SHA1代替MD5（甚至是代替SHA1）",[10548,50186,50188],{"id":50187},"_4不要使用相同的key做不同的事","（4）不要使用相同的key做不同的事",[10548,50190,50192],{"id":50191},"_5salts与iv需要随机产生","（5）salts与IV需要随机产生",[10548,50194,50196],{"id":50195},"_6不要自己实现加密算法尽量实现安全专家实现好的库","（6）不要自己实现加密算法，尽量实现安全专家实现好的库",[10548,50198,50200],{"id":50199},"_7不要依赖系统的保密性","（7）不要依赖系统的保密性",[13,50202,50203],{},"当你不知道该如何选择时，有以下建议：",[10548,50205,50207],{"id":50206},"_1使用cbc模式的aes256用于加密","（1）使用CBC模式的AES256用于加密",[10548,50209,50211],{"id":50210},"_2使用hmac-sha512用于完整性检查","（2）使用HMAC-SHA512用于完整性检查",[10548,50213,50215],{"id":50214},"_3使用带salt的sha-256或sha-512用于hashing","（3）使用带salt的SHA-256或SHA-512用于Hashing",[23289,50217],{},[107,50219,50221],{"id":50220},"第十二章-web框架安全","第十二章 Web框架安全",[13,50223,50224],{},"实施安全方案，要达到好的效果，必须要完成两个目标：",[49,50226,50227,50230],{},[52,50228,50229],{},"安全方案正确、可靠；",[52,50231,50232],{},"能够发现所有可能存在的安全问题，不出现遗漏。",[7759,50234,50236],{"id":50235},"_1mvc框架安全","1、MVC框架安全",[13,50238,50239],{},"MVC是Model-View-Controller的缩写，它将Web应用分为三层，View层负责用户视图、页面展示等工作；Controller负责应用的逻辑实现，接收View层传入的用户请求，并转发给对应的Model做处理；Model层则负责实现模型，完成数据的处理。",[13,50241,50242,50243,67],{},"从数据的流入来看，用户提交的数据先后流经了View层、Controller、Model层，数据的流出则反过来。在设计安全方案时，要牢牢把握住数据这个关键因素。",[22,50244,50245],{},"在MVC框架中，通过切片、过滤器等方式，往往能对数据进行全局处理，这为设计安全方案提供了极大的便利",[13,50247,50248],{},"比如在Spring Security中，通过URL pattern实现的访问控制，需要由框架来处理所有用户请求，在Spring Security获取了URL handler基础上，才有可能将后续的安全检查落实。在SpringSecurity的配置中，第一步就是在web.xml文件中增加一个filter，接管用户数据。",[7759,50250,50252],{"id":50251},"_2模板引擎与xss防御","2、模板引擎与XSS防御",[13,50254,50255],{},"XSS攻击是在用户的浏览器上执行的，其形成过程则是在服务器端页面渲染时，注入了恶意的HTML代码导致的。从MVC架构来说，是发生在View层，因此使用“输出编码”的防御方法更加合理，这意味着需要针对不同上下文的XSS攻击场景，使用不同的编码方式。",[13,50257,50258],{},"最好的XSS防御方案，在不同的场景需要使用不同的编码函数，如果统一使用这5个字符的HtmlEncode，则很可能会被攻击者绕过。通过自定义的方法，使得XSS防御的功能得到完善；同时在模板系统中，搜索不安全的变量也有了依据，甚至在代码检测工具中，可以自动判断出需要使用哪一种安全的编码方法，这在安全开发流程中是非常重要的。",[7759,50260,50262],{"id":50261},"_3web框架与csrf防御","3、Web框架与CSRF防御",[13,50264,50265],{},"CSRF攻击的目标，一般都会产生“写数据”操作的URL，比如“增”、“删”、“改”；而“读数据”操作并不是CSRF攻击的目标，因为在CSRF的攻击过程中攻击者无法获取到服务器端返回的数据，攻击者只是借用户之手触发服务器动作，所以读数据对于CSRF来说并无直接的意义（但是如果同时存在XSS漏洞或者其他的跨域漏洞，则可能会引起别的问题。",[13,50267,50268,50269,50272],{},"在Web应用开发中，有必要",[22,50270,50271],{},"对“读操作”和“写操作”予以区分","，比如要求所有的“写操作”都使用HTTP POST。完整的CSRF防御方案，对于Web框架来说有以下几处地方需要改动：",[49,50274,50275,50278,50281,50284],{},[52,50276,50277],{},"在Session中绑定token。如果不能保存到服务器端Session中，则可以替代为保存到Cookie里。",[52,50279,50280],{},"在form表单中自动填入token字段，比如\u003Cinput type=hidden name=\"anti_csrf_token\"value=\"$token\" \u002F>。",[52,50282,50283],{},"在Ajax请求中自动添加token，这可能需要已有的Ajax封装实现的支持。",[52,50285,50286],{},"在服务器端对比POST提交参数的token与Session中绑定的token是否一致，以验证CSRF攻击。",[7759,50288,50290],{"id":50289},"_4http-headers管理","4、HTTP Headers管理",[13,50292,50293,50294,50297,50298,819],{},"在Web框架中，可以对HTTP头进行全局化的处理，针对HTTP返回头的CRLF注入只需要",[22,50295,50296],{},"在“value”中编码所有的\\r\\n即可","。这里没有提到在“key”中编码\\r\\n，是因为让用户能够控制“key”是极其危险的事情，在任何情况下都不应该使其发生。对于框架来说，",[22,50299,50300],{},"管理好跳转目的地址是很有必要的",[49,50302,50303,50306],{},[52,50304,50305],{},"如果Web框架提供统一的跳转函数，则可以在跳转函数内部实现一个白名单，指定跳转地址只能在白名单中；",[52,50307,50308],{},"控制HTTP的Location字段，限制Location的值只能是哪些地址，也能起到同样的效果，其本质还是白名单。",[7759,50310,50312],{"id":50311},"_5数据持久层与sql注入","5、数据持久层与SQL注入",[13,50314,50315],{},"使用ORM（Object\u002FRelation Mapping）框架对SQL注入是有积极意义的。我们知道对抗SQL注入的最佳方式就是使用“预编译绑定变量”。在实际解决SQL注入时，还有一个难点就是应用复杂后，代码数量庞大，难以把可能存在SQL注入的地方不遗漏地找出来，而ORM框架为我们发现问题提供了一个便捷的途径。使用Web框架提供的功能，在代码风格上更加统一，也更利于代码审计。",[23289,50317],{},[107,50319,50321],{"id":50320},"第十三章-应用层拒绝服务攻击","第十三章 应用层拒绝服务攻击",[13,50323,50324],{},"在互联网中一谈起DDOS攻击，人们往往谈虎色变。DDOS攻击被认为是安全领域中最难解决的问题之一，迄今为止也没有一个完美的解决方案。（没错，现在仍然是主流的威胁之一，不常见的原因是很多企业选用云服务器等方式，DDOS被大企业的方案给过滤掉了，但是不得不说【挺贵的】。。。）",[7759,50326,50328],{"id":50327},"_1ddos简介","1、DDOS简介",[13,50330,50331,50332,50335],{},"DDOS又称为分布式拒绝服务，全称是Distributed Denial of Service。DDOS本是",[22,50333,50334],{},"利用合理的请求造成资源过载，导致服务不可用","。资源是有限的，而服务必须一直提供下去。如果资源都已经被占用了，那么服务也将过载，导致系统停止新的响应。",[13,50337,50338],{},"分布式拒绝服务攻击，将正常请求放大了若干倍，通过若干个网络节点同时发起攻击，以达成规模效应。这些网络节点往往是黑客们所控制的“肉鸡”，数量达到一定规模后，就形成了一个“僵尸网络”。大型的僵尸网络，甚至达到了数万、数十万台的规模。如此规模的僵尸网络发起的DDOS攻击，几乎是不可阻挡的。",[13,50340,50341],{},"常见的DDOS攻击有SYN flood、UDP flood、ICMP flood等。其中SYN flood是一种最为经典的DDOS攻击，其发现于1996年，但至今仍然保持着非常强大的生命力。SYN flood如此猖獗是因为它利用了TCP协议设计中的缺陷，而TCP\u002FIP协议是整个互联网的基础，牵一发而动全身，如今想要修复这样的缺陷几乎成为不可能的事情。",[13,50343,50344],{},"在正常情况下，TCP三次握手过程如下：",[13,50346,50347],{},[617,50348],{"alt":119,"src":50349},"img\u002F13.1.png",[49,50351,50352,50355,50358],{},[52,50353,50354],{},"客户端向服务器端发送一个SYN包，包含客户端使用的端口号和初始序列号x；",[52,50356,50357],{},"服务器端收到客户端发送来的SYN包后，向客户端发送一个SYN和ACK都置位的TCP报文，包含确认号xx1和服务器端的初始序列号y；",[52,50359,50360],{},"客户端收到服务器端返回的SYNSACK报文后，向服务器端返回一个确认号为yy1、序号为xx1的ACK报文，一个标准的TCP连接完成。",[13,50362,50363],{},"SYN flood在攻击时，首先伪造大量的源IP地址，分别向服务器端发送大量的SYN包，此时服务器端会返回SYN\u002FACK包，因为源地址是伪造的，所以伪造的IP并不会应答，服务器端没有收到伪造IP的回应，会重试3～5次并且等待一个SYNTime（一般为30秒至2分钟），如果超时则丢弃这个连接。攻击者大量发送这种伪造源地址的SYN请求，服务器端将会消耗非常多的资源（CPU和内存）来处理这种半连接，同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求，导致拒绝服务。",[13,50365,50366],{},"对抗SYN flood的主要措施有SYN Cookie\u002FSYN Proxy、safereset等算法。SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”，并统计每个IP地址的访问频率。如果在短时间内收到大量的来自同一个IP地址的数据包，则认为受到攻击，之后来自这个IP地址的包将被丢弃。",[13,50368,50369,50370],{},"在很多对抗DDOS的产品中，一般会综合使用各种算法，结合一些DDOS攻击的特征，对流量进行清洗。对抗DDOS的网络设备可以串联或者并联在网络出口处。但DDOS仍然是业界的一个难题，",[22,50371,50372],{},"当攻击流量超过了网络设备，甚至带宽的最大负荷时，网络仍将瘫痪。一般来说，大型网站之所以看起来比较能“抗”DDOS攻击，是因为大型网站的带宽比较充足，集群内服务器的数量也比较多。但一个集群的资源毕竟是有限的，在实际的攻击中，DDOS的流量甚至可以达到数G到几十G，遇到这种情况，只能与网络运营商合作，共同完成DDOS攻击的响应。",[7759,50374,50376],{"id":50375},"_2应用层ddos","2、应用层DDOS",[13,50378,50379],{},"应用层DDOS，不同于网络层DDOS，由于发生在应用层，因此TCP三次握手已经完成，连接已经建立，所以发起攻击的IP地址也都是真实的。",[10548,50381,50383],{"id":50382},"_1cc攻击","（1）CC攻击",[13,50385,50386],{},"“CC攻击”的前身是一个叫fatboy的攻击程序，当时黑客为了挑战绿盟的一款反DDOS设备开发了它。绿盟是中国著名的安全公司之一，它有一款叫“黑洞（Collapasar）”的反DDOS设备，能够有效地清洗SYN Flood等有害流量。而黑客则挑衅式地将fatboy所实现的攻击方式命名为：Challenge Collapasar（简称CC），意指在黑洞的防御下，仍然能有效完成拒绝服务攻击。",[13,50388,50389,50390,50393],{},"CC攻击的原理非常简单，就是",[22,50391,50392],{},"对一些消耗资源较大的应用页面不断发起正常的请求，以达到消耗服务端资源的目的","。在Web应用中，查询数据库、读\u002F写硬盘文件等操作，相对都会消耗比较多的资源。",[13,50395,50396],{},"应用层DDOS攻击是针对服务器性能的一种攻击，那么许多优化服务器性能的方法，都或多或少地能缓解此种攻击。比如将使用频率高的数据放在memcache中，相对于查询数据库所消耗的资源来说，查询memcache所消耗的资源可以忽略不计。但很多性能优化的方案并非是为了对抗应用层DDOS攻击而设计的，因此攻击者想要找到一个资源消耗大的页面并不困难。比如当memcache查询没有命中时，服务器必然会查询数据库，从而增大服务器资源的消耗，攻击者只需要找到这样的页面即可。同时攻击者除了触发“读”数据操作外，还可以触发“写”数据操作，“写”数据的行为一般都会导致服务器操作数据库。",[10548,50398,50400],{"id":50399},"_2限制请求频率","（2）限制请求频率",[13,50402,50403,50404,50407],{},"最常见的针对应用层DDOS攻击的防御措施，是在应用中",[22,50405,50406],{},"针对每个“客户端”做一个请求频率的限制","。例如：通过IP地址与Cookie 定位一个客户端，如果客户端的请求在一定时间内过于频繁，则对之后来自该客户端的所有请求都重定向到一个出错页面。",[13,50409,50410],{},"然而这种防御方法并不完美，因为它在客户端的判断依据上并不是永远可靠的。这个方案中有两个因素用以定位一个客户端：一个是IP地址，另一个是Cookie。但用户的IP地址可能会发生改变，而Cookie又可能会被清空，如果IP地址和Cookie同时都发生了变化，那么就无法再定位到同一个客户端了。",[10548,50412,50414],{"id":50413},"_3解决应用层ddos","（3）解决应用层DDOS",[49,50416,50417,50420,50423],{},[52,50418,50419],{},"应用代码要做好性能优化。合理地使用memcache就是一个很好的优化方案，将数据库的压力尽可能转移到内存中。此外还需要及时地释放资源，比如及时关闭数据库连接，减少空连接等消耗。",[52,50421,50422],{},"在网络架构上做好优化。善于利用负载均衡分流，避免用户流量集中在单台服务器上。同时可以充分利用好CDN和镜像站点的分流作用，缓解主站的压力。",[52,50424,50425,67],{},[22,50426,50427],{},"实现一些对抗手段，比如限制每个IP地址的请求频率",[13,50429,50430],{},"一种比较可靠的方法是让客户端解析一段JavaScript，并给出正确的运行结果。因为大部分的自动化脚本都是直接构造HTTP包完成的，并非在一个浏览器环境中发起的请求。因此一段需要计算的JavaScript，可以判断出客户端到底是不是浏览器。类似的，发送一个flash让客户端解析，也可以起到同样的作用。但需要注意的是，这种方法并不是万能的，有的自动化脚本是内嵌在浏览器中的“内挂”，就无法检测出来了。",[7759,50432,50434],{"id":50433},"_3资源耗尽攻击","3、资源耗尽攻击",[13,50436,50437],{},"攻击者还可能利用一些WebServer的漏洞或设计缺陷，直接造成拒绝服务。",[10548,50439,50441],{"id":50440},"_1slowloris攻击","（1）Slowloris攻击",[13,50443,50444,50445],{},"原理是以极低的速度往服务器发送HTTP请求。由于WebServer对于并发的连接数都有一定的上限，因此若是恶意地占用住这些连接不释放，那么Web Server的所有连接都将被恶意连接占用，从而无法接受新的请求，导致拒绝服务。这种攻击几乎针对所有的Web Server都是有效的。从这种方式可以看出：",[22,50446,50447],{},"此类拒绝服务攻击的本质，实际上是对有限资源的无限制滥用。",[10548,50449,50451],{"id":50450},"_2http-post-dos","（2）HTTP POST DOS",[13,50453,50454],{},"原理是在发送HTTP POST包时，指定一个非常大的Content-Length值，然后以很低的速度发包，比如10～100s发一个字节，保持住这个连接不断开。这样当客户端连接数多了以后，占用住了Web Server的所有可用连接，从而导致DOS。",[13,50456,50457],{},"这种攻击的本质也是针对Apache的MaxClients限制的。要解决此类问题，可以使用Web应用防火墙，或者一个定制的Web Server安全模块。",[13,50459,50460,50463,50464],{},[22,50461,50462],{},"凡是资源有“限制”的地方，都可能发生资源滥用，从而导致拒绝服务，也就是一种“资源耗尽攻击”","。出于可用性和物理条件的限制，内存、进程数、存储空间等资源都不可能无限制地增长，因此如果未对不可信任的资源使用者进行配额的限制，就有可能造成拒绝服务。",[22,50465,50466],{},"内存泄漏是程序员经常需要解决的一种bug，而在安全领域中，内存泄漏则被认为是一种能够造成拒绝服务攻击的方式。",[10548,50468,50470],{"id":50469},"_3server-limit-dos","（3）Server Limit DOS",[13,50472,50473],{},"Web Server对HTTP包头都有长度限制，以Apache举例，默认是8192字节。也就是说，Apache所能接受的最大HTTP包头大小为8192字节（这里指的是Request Header，如果是Re-quest Body，则默认的大小限制是2GB）。如果客户端发送的HTTP包头超过这个大小，服务器就会返回一个4xx错误。",[13,50475,50476],{},"假如攻击者通过XSS攻击，恶意地往客户端写入了一个超长的Cookie，则该客户端在清空Cookie之前，将无法再访问该Cookie所在域的任何页面。这是因为Cookie也是放在HTTP包头里发送的，而Web Server默认会认为这是一个超长的非正常请求，从而导致“客户端”的拒绝服务。",[13,50478,50479],{},"要解决此问题，需要调整Apache配置参数LimitRequestFieldSize，这个参数设置为0时，对HTTP包头的大小没有限制。",[7759,50481,50483],{"id":50482},"_4redos正则攻击","4、ReDOS正则攻击",[13,50485,50486],{},"当正则表达式写得不好时，就有可能被恶意输入利用，消耗大量资源，从而造成DOS。这种攻击被称为ReDOS。ReDOS是一种代码实现上的缺陷。我们知道正则表达式是基于NFA（Nondeterministic Finite Au-tomaton）的，它是一个状态机，每个状态和输入符号都可能有许多不同的下一个状态。正则解析引擎将遍历所有可能的路径直到最后。由于每个状态都有若干个“下一个状态”，因此决策算法将逐个尝试每个“下一个状态”，直到找到一个匹配的。",[13,50488,50489],{},"例如：",[114,50491,50494],{"className":50492,"code":50493,"language":299},[297],"^(a+)+$\n",[17,50495,50493],{"__ignoreMap":119},[13,50497,50498],{},"输入为“aaaa”时执行过程：",[13,50500,50501],{},[617,50502],{"alt":119,"src":50503},"img\u002F13.2.png",[13,50505,50506],{},"但输入“a”数量为16个时，就变成了65536条可能的路径；此后每增加一个“a”，路径的数量都会翻倍。",[13,50508,50509],{},"这极大地增加了正则引擎解析数据时的消耗。当用户恶意构造输入时，这些有缺陷的正则表达式就会消耗大量的系统资源（比如CPU和内存），从而导致整台服务器的性能下降，表现的结果是系统速度很慢，有的进程或服务失去响应，与拒绝服务的后果是一样的。",[23289,50511],{},[107,50513,50515],{"id":50514},"第十四章-php安全","第十四章 PHP安全",[7759,50517,50519],{"id":50518},"_1文件包含漏洞","1、文件包含漏洞",[13,50521,50522],{},"严格来说，文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本或代码，并让服务器端执行。“代码注入”的典型代表就是文件包含（File Inclusion）。文件包含可能会出现在JSP、PHP、ASP等语言中。",[114,50524,50527],{"className":50525,"code":50526,"language":299},[297],"PHP：include(), include_once(), require(), require_once(), fopen(), readfile(), ...\n\nJSP\u002FServlet：ava.io.File(), java.io.FileReader(), ...\n\nASP：include file, include virtual, ...\n",[17,50528,50526],{"__ignoreMap":119},[13,50530,50531],{},"要想成功利用文件包含漏洞，需要满足下面两个条件：",[49,50533,50534,50537],{},[52,50535,50536],{},"include()等函数通过动态变量的方式引入需要包含的文件；",[52,50538,50539],{},"用户能够控制该动态变量。",[10548,50541,50543],{"id":50542},"_1本地文件包含","（1）本地文件包含",[13,50545,50546,50547,50550],{},"能够",[22,50548,50549],{},"打开并包含本地文件的漏洞","，被称为本地文件包含漏洞（Local File Inclusion，简称LFI）。文件包含漏洞能够读取敏感文件或者服务器端脚本的源代码，从而为攻击者实施进一步攻击奠定基础。",[10548,50552,50554],{"id":50553},"_2远程文件包含","（2）远程文件包含",[13,50556,50557],{},"如果PHP的配置选项allow_url_include为ON的话，则include\u002Frequire函数是可以加载远程文件的，这种漏洞被称为远程文件包含漏洞（Re-mote File Inclusion，简称RFI）。",[7759,50559,50561],{"id":50560},"_2变量覆盖漏洞","2、变量覆盖漏洞",[10548,50563,50565],{"id":50564},"_1全局变量覆盖","（1）全局变量覆盖",[13,50567,50568],{},"变量如果未被初始化，且能被用户所控制，那么很可能会导致安全问题。而在PHP中，这种情况在register_globals为ON时尤其严重。",[10548,50570,50572],{"id":50571},"_2extract变量覆盖","（2）extract()变量覆盖",[13,50574,50575],{},"extract()函数能将变量从数组导入当前的符号表，其函数定义如下：",[114,50577,50581],{"className":50578,"code":50579,"language":50580,"meta":119,"style":119},"language-php shiki shiki-themes github-dark","int extract ( array $var_array [, int \n\n$extract_type [, string $prefix ]] )\n","php",[17,50582,50583,50588,50592],{"__ignoreMap":119},[78,50584,50585],{"class":124,"line":125},[78,50586,50587],{},"int extract ( array $var_array [, int \n",[78,50589,50590],{"class":124,"line":132},[78,50591,129],{"emptyLinePlaceholder":128},[78,50593,50594],{"class":124,"line":138},[78,50595,50596],{},"$extract_type [, string $prefix ]] )\n",[13,50598,50599],{},"第二个参数指定函数将变量导入符号表时的行为，最常见的两个值是“EXTR_OVER-WRITE”和“EXTR_SKIP”。",[13,50601,50602],{},"当值为“EXTR_OVERWRITE”时，在将变量导入符号表的过程中，如果变量名发生冲突，则覆盖已有变量；值为“EXTR_SKIP”则表示跳过不覆盖。若第二个参数未指定，则在默认情况下使用“EXTR_OVERWRITE”。",[10548,50604,50606],{"id":50605},"_3类似还有几个函数","（3）类似还有几个函数",[49,50608,50609,50612,50615],{},[52,50610,50611],{},"遍历初始化变量",[52,50613,50614],{},"impoet_request_variables变量覆盖",[52,50616,50617],{},"parse_str()变量覆盖",[7759,50619,50621],{"id":50620},"_3代码执行漏洞","3、代码执行漏洞",[23289,50623],{},[107,50625,50627],{"id":50626},"第十五章-web-server配置安全","第十五章 Web Server配置安全",[13,50629,50630],{},"Web服务器是Web应用的载体，如果这个载体出现安全问题，那么运行在其中的Web应用程序的安全也无法得到保障。因此Web服务器的安全不容忽视。Web服务器安全，考虑的是应用布署时的运行环境安全。这个运行环境包括Web Server、脚本语言解释器、中间件等软件，这些软件所提供的一些配置参数，也可以起到安全保护的作用。",[7759,50632,50634],{"id":50633},"_1apache安全apache-httpd","1、Apache安全（Apache Httpd）",[13,50636,50637],{},"Web Server的安全我们关注两点：一是WebServer本身是否安全；二是Web Server是否提供了可使用的安全功能。纵观Apache的漏洞史，它曾经出现过许多次高危漏洞。但这些高危漏洞，大部分是由Apache的Module造成的，Apache核心的高危漏洞几乎没有。Apache有很多官方与非官方的Module，默认启动的Module出现过的高危漏洞非常少，大多数的高危漏洞集中在默认没有安装或enable的Module上。",[13,50639,50640],{},"检查Apache安全的第一件事情，就是检查Apache的Module安装情况，根据“最小权限原则”，应该尽可能地减少不必要的Module，对于要使用的Module，则检查其对应版本是否存在已知的安全漏洞。",[13,50642,50643,50644,50647],{},"定制好了Apache的安装包后，接下来需要做的，就是指定Apache进程以单独的用户身份运行，这通常需要为Apache单独建立一个user\u002Fgroup。",[22,50645,50646],{},"Apache以root身份或者admin身份运行是一个非常糟糕的决定。这里的admin身份是指服务器管理员在管理机器时使用的身份。这个身份的权限也是比较高的，因为管理员有操作管理脚本、访问配置文件、读\u002F写日志等需求。","（在这里我们就能意识到，如果你看过一些配置虚拟机、使用Linux服务的教学视频，老师们都会告诉你配置一个个人用户【即使有时候root用户操作更方便】，但也有少数情况是root用户执行会导致程序的警告or报错，但其实根源大多是项目不建议你使用root就行管理【例如HDFS等节点的启动】）",[13,50649,50650],{},"使用高权限身份运行Apache的结果可能是灾难性的，它会带来两个可怕的后果：",[49,50652,50653,50656],{},[52,50654,50655],{},"当黑客入侵Web成功时，将直接获得一个高权限（比如root或admin）的shell；",[52,50657,50658],{},"应用程序本身将具备较高权限，当出现bug时，可能会带来较高风险，比如删除本地重要文件、杀死进程等不可预知的结果。",[13,50660,50661],{},"比较好的做法是使用专门的用户身份运行Apache，这个用户身份不应该具备shell，它唯一的作用就是用来运行Web应用。",[7759,50663,50665],{"id":50664},"_2nginx安全","2、Nginx安全",[13,50667,50668],{},"从安全的角度来看，Nginx近年来出现的影响默认安装版本的高危漏洞却比Apache要多。在Nginx的官方网站有这些安全问题的列表。",[13,50670,50671],{},"多多关注Nginx的漏洞信息，并及时将软件升级到安全的版本，是非常有必要的一件事情。从历史的经验来看，如果一个软件出现的漏洞较多，那么说明代码维护者的安全意识与安全经验有所欠缺，同时由于破窗效应，这个软件未来往往会出现更多的漏洞。",[13,50673,50674],{},"就软件安全本身来看，Nginx与Apache最大的区别在于，检查Apache安全时更多的要关注Module的安全，而Nginx则需要注意软件本身的安全，及时升级软件版本。",[7759,50676,50678],{"id":50677},"_3jboss远程命令执行","3、jBoss远程命令执行",[13,50680,50681],{},"jBoss是J2EE环境中一个流行的Web容器，但是jBoss在默认安装时提供的一些功能却不太安全，如果配置不得当，则可能直接造成远程命令执行。",[13,50683,50684],{},"由于jBoss在默认安装时会有一个管理后台，叫做JMX-Console，它提供给管理员一些强大的功能，其中包括配置MBeans，这同样也会为黑客们打开方便之门。通过8080端口（默认安装时会监听8080端口）访问\u002Fjmx-console能够进入到这个管理界面。默认安装时访问JMX-Console是没有任何认证的。",[7759,50686,50688],{"id":50687},"_4tomacat远程命令执行","4、Tomacat远程命令执行",[13,50690,50691],{},"Apache Tomcat与jBoss一样，默认也会运行在8080端口。它提供的Tomcat Manager的作用与JMX-Console类似，管理员也可以在Tomcat Manager中部署war包。",[13,50693,50694],{},"虽然Tomcat后台有密码认证，但强烈建议删除这一后台，因为攻击者可以通过暴力破解等方式获取后台的访问权限，从安全的角度看，这增加了系统的攻击面，得不偿失。",[7759,50696,50698],{"id":50697},"_5http-parameter-pollution","5、HTTP Parameter Pollution",[13,50700,50701],{},"通过GET或POST向服务器发起请求时，提交两个相同的参数，那么服务器会如何选择呢？",[114,50703,50706],{"className":50704,"code":50705,"language":299},[297],"\u002F?a=test&a=test1\n",[17,50707,50705],{"__ignoreMap":119},[13,50709,50710],{},"在某些服务端环境中，会只取第一个参数；而在另外一些环境中，比如.net环境中，则会变成",[114,50712,50715],{"className":50713,"code":50714,"language":299},[297],"a=test,test1\n",[17,50716,50714],{"__ignoreMap":119},[13,50718,50719],{},"这种特性在绕过一些服务器端的逻辑判断时，会非常有用。HPP攻击，与Web服务器环境、服务器端使用的脚本语言有关。HPP本身可以看做服务器端软件的一种功能，参数选择的顺序是由服务器端软件所决定的。但是正如我们在本书中所举的很多例子一样，当程序员不熟悉软件的这种功能时，就有可能造成误用，或者程序逻辑涵盖范围不够全面，从而形成漏洞。",[23289,50721],{},[107,50723,50725],{"id":50724},"第十六章-互联网业务安全","第十六章 互联网业务安全",[7759,50727,50728],{"id":50728},"产品安全",[13,50730,50731,50732,67],{},"一个完整的产品有许多特性，互联网产品亦如此。互联网产品其实是网站提供的在线服务，产品特性包括性能、美观、方便性等方面，同时也包括安全。一般来说，",[22,50733,50734],{},"安全是产品的一个特性",[13,50736,50737,50738,50741],{},"安全本身可视作产品的一个组成部分。一个好的产品，在设计之初，就应该考虑是否会存在安全隐患，从而提前准备好对策。",[22,50739,50740],{},"将安全视为产品特性，往往也就解决了业务与安全之间的矛盾","。其实业务与安全之间本来是没有冲突的，出现冲突往往是因为安全方案设计得不够完美。比如安全方案的实现成本相对较高，从而不得不牺牲一些产品功能上的需求，有时候牺牲的可能还有性能。",[10548,50743,50745],{"id":50744},"_1互联网产品对安全的需求","（1）互联网产品对安全的需求",[13,50747,50748],{},[22,50749,50750],{},"当一个产品功能有缺陷、用户体验极差，甚至是整天宕机的时候，是谈不上安全性的，因为产品本身可能都已经无法存在下去了。但是当一个产品其他方面都做得很好的时候，安全有可能会成为产品的一种核心竞争力，成为拉开产品与竞争对手之间差距的秘密武器。只有安全也做得好的产品，才能成为真正的好产品。",[13,50752,50753],{},"安全是产品特性的一个组成部分，具备了安全性，产品才是完整的；安全做好了，产品最终才能真正成熟。",[10548,50755,50757],{"id":50756},"_2好的产品方案","（2）好的产品方案",[13,50759,50760],{},"一个优秀的安全方案，除了可以有效地解决问题以外，至少还必须具备两个条件：",[49,50762,50763,50766],{},[52,50764,50765],{},"良好的用户体验",[52,50767,50768],{},"优秀的性能",[7759,50770,50771],{"id":50771},"关于本章",[13,50773,50774],{},"本章的其他部分，强烈建议各位去看一下书，并不是因为不会摘取\u002F没什么重点。相反，涉及思想的东西每个人看了会有每个人的感悟，开发流程往往会根据实际情况来变。之前的内容中也少有例子解析，但是经验之谈需要看大量的例子才能摸索到别人的一丝经验。希望大家看完之后也能在issue上留下点自己的感悟。",[23289,50776],{},[107,50778,50780],{"id":50779},"第十七章-安全开发流程sdl","第十七章 安全开发流程（SDL）",[13,50782,50783],{},"安全开发流程，能够帮助企业以最小的成本提高产品的安全性。它符合“Secure at theSource”的战略思想。实施好安全开发流程，对企业安全的发展来说，可以起到事半功倍的效果。",[7759,50785,48732],{"id":50786},"_1简介-1",[13,50788,50789],{},"SDL的全称是 Security Development Lifecy-cle，即：安全开发生命周期。它是由微软最早提出的，在软件工程中实施，是帮助解决软件安全问题的办法。SDL是一个安全保证的过程，其重点是软件开发，它在开发的所有阶段都引入了安全和隐私的原则。自2004年起，SDL一直都是微软在全公司实施的强制性策略。SDL的大致步骤如下：",[13,50791,50792],{},[617,50793],{"alt":119,"src":50794},"img\u002F17.1.png",[13,50796,50797,50798],{},"SDL中的方法，试图从安全漏洞产生的根源上解决问题。通过对软件工程的控制，保证产品的安全性。",[22,50799,50800],{},"（详细每个阶段的过程可以参考书本）",[7759,50802,50804],{"id":50803},"_2敏捷sdl","2、敏捷SDL",[13,50806,50807],{},"敏捷开发往往是采用“小步快跑”的方式，不断地完善产品，并没有非常规范的流程，文档也尽可能简单。这样做有利于产品的快速发布，但是对于安全来说，往往是一场灾难。需求无法在一开始非常明确，一些安全设计可能也会随之变化。微软为敏捷开发专门设计了敏捷SDL。",[13,50809,50810,50811,50814,50815,50818],{},"敏捷SDL的思想其实就是",[22,50812,50813],{},"以变化的观点实施安全的工作","。需求和功能可能一直在变化，代码可能也在发生变化，这要求在实施SDL时需要在",[22,50816,50817],{},"每个阶段更新威胁模型和隐私策略，在必要的环节迭代模糊测试、代码安全分析","等工作。",[7759,50820,50822],{"id":50821},"_3实战校验","3、实战校验",[13,50824,50825],{},"对于互联网公司来说，更倾向于使用敏捷开发，快速迭代开发出产品。因此微软的SDL从各方面来看，都显得较为厚重，需要经过一些定制和裁剪才能适用于各种不同的环境。大体遵守以下准则：",[49,50827,50828,50831,50834,50837,50840,50843],{},[52,50829,50830],{},"准则一：与项目经理进行充分沟通，排出足够的时间。",[52,50832,50833],{},"准则二：规范公司的立项流程，确保所有项目都能通知到安全团队，避免遗漏。",[52,50835,50836],{},"准则三：树立安全部门的权威，项目必须由安全部门审核完成后才能发布。",[52,50838,50839],{},"准则四：将技术方案写入开发、测试的工作手册中。",[52,50841,50842],{},"准则五：给工程师培训安全方案。",[52,50844,50845],{},"准则六：记录所有的安全bug，激励程序员编写安全的代码。",[13,50847,50848],{},"互联网公司对产品、用户体验的重视程度非常高，大多数的产品都要求在短时间内发布，因此在SDL的实施上有着自己的特色。",[7759,50850,50852],{"id":50851},"_4需求分析与设计阶段","4、需求分析与设计阶段",[13,50854,50855],{},"需求分析阶段与设计阶段是项目的初始阶段。需求分析阶段将论证项目的目标、可行性、实现方向等问题。在需求阶段，安全工程师需要关心产品主要功能上的安全强度和安全体验是否足够，主要需要思考安全功能。",[13,50857,50858],{},"需要注意的是，在安全领域中，“安全功能”与“安全的功能”是两个不同的概念。**“安全功能”是指产品本身提供给用户的安全功能，比如数字证书、密码取回问题等功能。而“安全的功能”，则指在产品具体功能的实现上要做到安全，不要出现漏洞而被黑客利用。**在需求分析阶段，可以对项目经理、产品经理或架构师进行访谈，以了解产品背景和技术架构，并给出相应的建议。在实际使用时，更多的要依靠安全工程师的经验做出判断。",[7759,50860,50862],{"id":50861},"_5开发阶段","5、开发阶段",[13,50864,50865],{},"开发阶段是安全工作的一个重点。依据“安全是为业务服务”这一指导思想，在需求层面，安全改变业务的地方较少，因此应当力求代码实现上的安全，也就是做到“安全的功能”。要达到这个目标，首先要分析可能出现的漏洞，并从代码上提供可行的解决方案。",[49,50867,50868,50871],{},[52,50869,50870],{},"使用提供安全的函数",[52,50872,50873],{},"使用代码安全审计工具",[7759,50875,50877],{"id":50876},"_6测试阶段","6、测试阶段",[13,50879,50880,50881,50884],{},"测试阶段是产品发布前的最后一个阶段，在此阶段需要对产品进行充分的安全测试，验证需求分析、设计阶段的安全功能是否符合预期目标，并验证在开发阶段发现的所有安全问题是否得到解决。",[22,50882,50883],{},"安全测试应该独立于代码审计而存在","。“安全测试”相对于“代码审计”而言，至少有两个好处：",[49,50886,50887,50890],{},[52,50888,50889],{},"有一些代码逻辑较为复杂，通过代码审计难以发现所有问题，而通过安全测试可以将问题看得更清楚；",[52,50891,50892],{},"有一些逻辑漏洞通过安全测试，可以更快地得到结果。",[13,50894,50895],{},"安全测试，一般分为自动化测试和手动测试两种方式：",[49,50897,50898,50901,50904],{},[52,50899,50900],{},"自动化测试以覆盖性的测试为目的，可以通过“Web安全扫描器”对项目或产品进行漏洞扫描。",[52,50902,50903],{},"Web安全扫描器针对“XSS”、“SQL Injection”、“Open Redirect”、“PHP File Include”等漏洞的检测技术已经比较成熟。这是因为这些漏洞的检测方法主要是检测返回结果的字符串特征。",[52,50905,50906],{},"对于“CSRF”、“越权访问”、“文件上传”等漏洞，却难以达到自动化检测的效果。这是因为这些漏洞涉及系统逻辑或业务逻辑，有时候还需要人机交互参与页面流程。因此这类漏洞的检测更多的需要依靠手动测试完成。",[23289,50908],{},[107,50910,50912],{"id":50911},"第十八章-安全运营","第十八章 安全运营",[13,50914,50915,50916,50919],{},"俗话说，",[22,50917,50918],{},"安全是“三分技术，七分管理”","。安全对于企业来说，结果才是最重要的。安全方案设计完成后，即使看起来再美好，也需要经受实践的检验。",[13,50921,50922],{},[22,50923,50924],{},"（这里和第十六章一样，同样是以理论为主，感兴趣的小伙伴自行看书吧，运营这个我应该会单开一个栏目来说【毕竟我现在的身份是工作室运营！！区别于运维哦！！】书已经借好了，大概是张亮写的《从零开始做运营》……跑远了哈）",[23289,50926],{},[107,50928,50929],{"id":50929},"结语",[13,50931,50932],{},"这里并不是本书的结语，而是我个人的一些反思\u002F感想。首先非常感谢吴翰清老师的这本书，带我成功走进了网络安全的世界（因为太好看了，让我产生了对网络安全的浓厚兴趣，因此又借了些其他关于网络安全的书，之后应该也会看到我看其他网安的书的笔记）。虽然这本书出版的时间比较早（12年），计算机行业的技术发展是非常快的，但是放到现在来看很多观点仍然具有非常高的参考价值。即使PHP等已经逐渐退出了当前的环境（PHP天下第一，PHP爱好者别打我！），但是其中的应用\u002F反思乃至设计放到任何一个语言来说都是适用的。旧的语言不会一直热门，因为新的业务会让带来新的挑战；新的语言也不一定辉煌，因为即便是迭代也有其基石。",[13,50934,50935],{},"网络安全是一块大蛋糕，并且是一块随时代发展越来越大的蛋糕。简单的映射到专业来说，计科是基石，软件是生产，物联是虚实结合，大数据是新兴热门，那么网安就是互联网的守门人。我是在读完一遍纸质书后才进行的这一边笔记整理，基本约等于读了一遍半吧。作为入门，它显得有点过于深奥了，但是却在其中让我反思到了不少生产的道理：",[13,50937,50938],{},"我在假期给别人写过个小系统，用的是Spring Security和jwt，但是并不算理解整个体系架构和组成部分，有些依赖都是一知半解（虽然现在也是）。但是读完这本书后也真切地理解了配置在property中的一些jwt字段是啥（其实就是加密中提到的salt），同时也理解了鉴权Authorization、Token之类的真实含义与作用。即使他让我掌握的只有一点，我也觉得万分超值（或许我的潜意识学会了也说不定）。",[13,50940,50941],{},"最后对于本书最后的”（附）谈谈互联网企业安全的发展方向“这篇文章进行强烈推荐，感受一个人的NB不应该只源自于他对知识的理解，我认为还有他能对所处的事业的侃侃而谈。我深知现如今我的状态是啥都感兴趣学一点，但是大多都不是很精通，但是多听多看多学总是好的，不希冀于成长到和他一般对行业具有前瞻，但是确切的在学习中得到满足。这就是我读这本书的意义。",[13,50943,50944],{},"这句话同样送给在看的你。——Alexie-Z-Yevich 2023.1.6",[226,50946,50947],{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":119,"searchDepth":144,"depth":144,"links":50949},[50950,50951,50959,50964,50970,50976,50982,50986,50992,50997,51006,51011,51020,51027,51033,51038,51045,51049,51057,51058],{"id":48347,"depth":132,"text":48347},{"id":48374,"depth":132,"text":48375,"children":50952},[50953,50954,50955,50956,50957,50958],{"id":48383,"depth":144,"text":48384},{"id":48396,"depth":144,"text":48397},{"id":48415,"depth":144,"text":48416},{"id":48466,"depth":144,"text":48467},{"id":48498,"depth":144,"text":48499},{"id":48605,"depth":144,"text":48606},{"id":48669,"depth":132,"text":48670,"children":50960},[50961,50962,50963],{"id":48676,"depth":144,"text":48677},{"id":48695,"depth":144,"text":48696},{"id":48712,"depth":144,"text":48713},{"id":48724,"depth":132,"text":48725,"children":50965},[50966,50967,50968,50969],{"id":48731,"depth":144,"text":48732},{"id":48768,"depth":144,"text":48769},{"id":48953,"depth":144,"text":48954},{"id":49101,"depth":144,"text":49102},{"id":49113,"depth":132,"text":49114,"children":50971},[50972,50973,50974,50975],{"id":49120,"depth":144,"text":49121},{"id":49136,"depth":144,"text":49137},{"id":49149,"depth":144,"text":49150},{"id":49163,"depth":144,"text":49164},{"id":49223,"depth":132,"text":49224,"children":50977},[50978,50979,50980,50981],{"id":49233,"depth":144,"text":49234},{"id":49243,"depth":144,"text":49244},{"id":49254,"depth":144,"text":49255},{"id":49278,"depth":144,"text":49279},{"id":49312,"depth":132,"text":49313,"children":50983},[50984,50985],{"id":49319,"depth":144,"text":49320},{"id":49413,"depth":144,"text":49414},{"id":49460,"depth":132,"text":49461,"children":50987},[50988,50989,50990,50991],{"id":49467,"depth":144,"text":49468},{"id":49494,"depth":144,"text":49495},{"id":49568,"depth":144,"text":49569},{"id":49604,"depth":144,"text":49605},{"id":49650,"depth":132,"text":49651,"children":50993},[50994,50995,50996],{"id":27706,"depth":144,"text":27767},{"id":49687,"depth":144,"text":49688},{"id":49724,"depth":144,"text":49725},{"id":49758,"depth":132,"text":49759,"children":50998},[50999,51000,51001,51002,51003,51004,51005],{"id":49765,"depth":144,"text":49766},{"id":49784,"depth":144,"text":49785},{"id":49798,"depth":144,"text":49799},{"id":49808,"depth":144,"text":49809},{"id":49825,"depth":144,"text":49826},{"id":49832,"depth":144,"text":49833},{"id":49845,"depth":144,"text":49846},{"id":49860,"depth":132,"text":49861,"children":51007},[51008,51009,51010],{"id":49876,"depth":144,"text":49877},{"id":49913,"depth":144,"text":49914},{"id":49926,"depth":144,"text":49927},{"id":49938,"depth":132,"text":49939,"children":51012},[51013,51014,51015,51016,51017,51018,51019],{"id":27766,"depth":144,"text":27767},{"id":49989,"depth":144,"text":49990},{"id":50024,"depth":144,"text":50025},{"id":50051,"depth":144,"text":50052},{"id":50077,"depth":144,"text":50078},{"id":50113,"depth":144,"text":50114},{"id":50168,"depth":144,"text":50169},{"id":50220,"depth":132,"text":50221,"children":51021},[51022,51023,51024,51025,51026],{"id":50235,"depth":144,"text":50236},{"id":50251,"depth":144,"text":50252},{"id":50261,"depth":144,"text":50262},{"id":50289,"depth":144,"text":50290},{"id":50311,"depth":144,"text":50312},{"id":50320,"depth":132,"text":50321,"children":51028},[51029,51030,51031,51032],{"id":50327,"depth":144,"text":50328},{"id":50375,"depth":144,"text":50376},{"id":50433,"depth":144,"text":50434},{"id":50482,"depth":144,"text":50483},{"id":50514,"depth":132,"text":50515,"children":51034},[51035,51036,51037],{"id":50518,"depth":144,"text":50519},{"id":50560,"depth":144,"text":50561},{"id":50620,"depth":144,"text":50621},{"id":50626,"depth":132,"text":50627,"children":51039},[51040,51041,51042,51043,51044],{"id":50633,"depth":144,"text":50634},{"id":50664,"depth":144,"text":50665},{"id":50677,"depth":144,"text":50678},{"id":50687,"depth":144,"text":50688},{"id":50697,"depth":144,"text":50698},{"id":50724,"depth":132,"text":50725,"children":51046},[51047,51048],{"id":50728,"depth":144,"text":50728},{"id":50771,"depth":144,"text":50771},{"id":50779,"depth":132,"text":50780,"children":51050},[51051,51052,51053,51054,51055,51056],{"id":50786,"depth":144,"text":48732},{"id":50803,"depth":144,"text":50804},{"id":50821,"depth":144,"text":50822},{"id":50851,"depth":144,"text":50852},{"id":50861,"depth":144,"text":50862},{"id":50876,"depth":144,"text":50877},{"id":50911,"depth":132,"text":50912},{"id":50929,"depth":132,"text":50929},{},"TalkingAbout\u002F网络安全\u002F1_《白帽子讲Web安全》\u002F我的网络安全入门.md","\u002Fundergraduate\u002Fnote-70730b92c3fb",{"title":48342,"description":119},"undergraduate\u002Fnote-70730b92c3fb",[14968,246,23378,10715,14542,23333],"uyUWNONfOTgUrioyI_uEcIh9rxnmqodnKtH_uJ7cQCQ",{"id":51067,"title":246,"assetBase":239,"author":8,"body":51068,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":61651,"navigation":128,"originalPath":61652,"path":61653,"seo":61654,"source":23330,"stem":61655,"tags":61656,"weight":250,"__hash__":61657},"content\u002Fundergraduate\u002Fnote-723af69388da.md",{"type":10,"value":51069,"toc":61633},[51070,51072,51075,51078,51081,51088,51094,51097,51100,51103,51106,51109,51112,51115,51118,51121,51124,51166,51169,51173,51176,52018,52021,52025,52029,52032,52165,52169,52172,52176,52785,52789,53668,53671,53825,53829,53833,53836,53840,54431,54435,54439,54442,54446,55458,55463,55467,55471,55478,55482,56570,56578,56581,56585,56668,56672,56740,56744,56831,56834,56837,56904,56907,57016,57019,57095,57098,57144,57148,57220,57224,57297,57301,57390,57394,57540,57543,57547,57618,57621,57755,57758,57851,57854,57965,57969,58055,58058,58099,58102,58105,58158,58161,58297,58300,58303,58306,58309,58432,58436,58439,58548,58552,58555,58632,58635,58776,58779,58782,58785,58890,58893,58896,58899,58979,58982,59057,59060,59074,59079,59174,59177,59318,59322,59325,59462,59468,59539,59546,59549,59553,59558,59576,59656,59660,59665,59668,59738,59741,59845,59849,59852,59956,60043,60046,60049,60057,60167,60170,60173,60178,60313,60316,60319,60323,60328,60419,60423,60512,60515,60518,60660,60663,60818,60822,60937,61046,61049,61052,61137,61140,61235,61238,61270,61274,61277,61288,61291,61295,61354,61358,61428,61432,61485,61489,61547,61551,61618,61620,61623,61626,61628,61631],[4517,51071,246],{"id":246},[107,51073,51074],{"id":51074},"前置知识",[10548,51076,51077],{"id":51077},"vector",[13,51079,51080],{},"C++ STL中的verctor好比是C语言中的数组，但是vector又具有数组没有的一些高级功能。与数组相比，vector就是一个可以不用再初始化就必须制定大小的边长数组。",[13,51082,51083,51084],{},"算法中常见的vector",[51085,51086,51087],"int",{}," L(n, 0)表示生成一个L包含n个重复的元素，每个元素值为0。",[13,51089,51090],{},[617,51091],{"alt":51092,"src":51093},"vector说明","vector%E8%AF%B4%E6%98%8E.png",[10548,51095,51096],{"id":51096},"set",[13,51098,51099],{},"set就是集合，STL的set用二叉树实现，集合中的每个元素只出现一次(参照数学中集合的互斥性)，并且是排好序的(默认按键值升序排列)",[13,51101,51102],{},"访问元素的时间复杂度是O(log2n) 。",[10548,51104,51105],{"id":51105},"queue",[13,51107,51108],{},"queue是一种容器转换器模板，调用#include\u003C queue>即可使用队列类。在算法中通常是作为FIFO队列使用。",[13,51110,51111],{},"常见形式：queue\u003CType, Container> (\u003C数据类型，容器类型>）",[10548,51113,51114],{"id":51114},"functional",[13,51116,51117],{},"类模板std::function是通用多态函数封装器。 std::function的实例能存储、复制及调用任何可调用函数、 lambda表达式、 bind表达式或其他函数对象，还有指向成员函数指针和指向数据成员指针。",[13,51119,51120],{},"简单来说就是在函数中实现内嵌函数，但是内嵌函数同样适用于递归，且可以获得外层函数的参数。",[10548,51122,51123],{"id":51123},"结构体",[114,51125,51129],{"className":51126,"code":51127,"language":51128,"meta":119,"style":119},"language-c++ shiki shiki-themes github-dark","template\u003Cclass T>\nstruct BtNode\n{ \n    T data;\n    int depth = 1;\n    BtNode *left = 0, *right = 0;\n};\n","c++",[17,51130,51131,51136,51141,51146,51151,51156,51161],{"__ignoreMap":119},[78,51132,51133],{"class":124,"line":125},[78,51134,51135],{},"template\u003Cclass T>\n",[78,51137,51138],{"class":124,"line":132},[78,51139,51140],{},"struct BtNode\n",[78,51142,51143],{"class":124,"line":138},[78,51144,51145],{},"{ \n",[78,51147,51148],{"class":124,"line":144},[78,51149,51150],{},"    T data;\n",[78,51152,51153],{"class":124,"line":150},[78,51154,51155],{},"    int depth = 1;\n",[78,51157,51158],{"class":124,"line":156},[78,51159,51160],{},"    BtNode *left = 0, *right = 0;\n",[78,51162,51163],{"class":124,"line":162},[78,51164,51165],{},"};\n",[13,51167,51168],{},"结构体属于用户自定义的数据类型，允许用户存储不同的数据类型。写法如上述。",[10548,51170,51172],{"id":51171},"matrix","Matrix",[13,51174,51175],{},"矩阵运算库，在算法中以老师给的Matrix.hpp为准，建议浏览一下内容，知道诸如.row()函数、G(x,y)等运算都来源于自建库，附上我使用版本的Matrix.hpp：",[114,51177,51179],{"className":51126,"code":51178,"language":51128,"meta":119,"style":119},"\u002F\u002F Matrix.hpp\n#pragma once\n#include\u003Cvector>\n#include\u003Ciostream>\nusing namespace std;\ntemplate\u003Cclass T>\nclass Matrix\n{  \n   vector\u003CT> buf; \u002F\u002F 用一维数组保存矩阵元素\n   size_t r = 0, c = 0; \u002F\u002F 行数和列数\npublic:\n   Matrix() = default; \u002F\u002F 默认初始化\n   Matrix(const Matrix &m) = default; \u002F\u002F 使用另一矩阵初始化\n   ~Matrix() = default; \u002F\u002F 析构\n   Matrix &operator=(const Matrix &) = default; \u002F\u002F 赋值\n   Matrix(size_t row, size_t col): \u002F\u002F 根据行数和列数初始化\n      buf(vector\u003CT>(row * col)), r(row), c(col) {}\n   Matrix(size_t row, size_t col, const T &v): \u002F\u002F 用行数和列数及指定值初始化\n      buf(vector\u003CT>(row * col, v)), r(row), c(col) {}\n   \u002F\u002F 使用初始值列表初始化, 即使用{}初始化\n   Matrix(const initializer_list\u003Cinitializer_list\u003CT>> &m):\n      buf(begin(m)->begin(), rbegin(m)->end()), \u002F\u002F 指定元素\n      r(m.size()), c(begin(m)->size()) \u002F\u002F 指定行数和列数\n   {}\n   void assign(const T &v) \u002F\u002F 每个元素都是v\n   {  \n      buf.assign(r * c, v);\n   } \u002F\u002F 耗时O(size)\n   \u002F\u002F 元素类型简写\n   using reference = typename vector\u003CT>::reference; \u002F\u002F 元素引用\n   using const_reference = typename vector\u003CT>::const_reference; \u002F\u002F const引用\n   reference operator()(size_t i, size_t j) \u002F\u002F 使用M(i, j)的形式访问矩阵元素\n   {  \n      return buf[i * c + j];\n   }\n   const_reference operator()(size_t i, size_t j) const\n   {  \n      return buf[i * c + j];\n   }\n   size_t rows() const { return r; } \u002F\u002F 行数\n   size_t cols() const { return c; } \u002F\u002F 列数\n   \u002F\u002F\n   \u002F\u002F extend\n   \u002F\u002F\n   Matrix(Matrix &&m): buf(move(m.buf)), r(m.r), c(m.c) {}\n   Matrix &operator=(Matrix &&m)\n   {  \n      buf = move(m.buf), r = m.r, c = m.c;\n      return *this;\n   }\n   Matrix &operator=(const initializer_list\u003CT> &m)\n   {  \n      buf.assign(m);\n      return *this;\n   } \u002F\u002F 使用列表赋值，即将{}中的元素复制到*this\n   size_t size() const { return r * c; } \u002F\u002F 元素数\n   \u002F\u002F\n   \u002F\u002F end extend\n   \u002F\u002F\n};\n\u002F\u002F\ntemplate\u003Cclass T> \u002F\u002F 输出矩阵的所有元素\nostream &operator\u003C\u003C(ostream &out, const Matrix\u003CT> &m)\n{  \n   size_t r = m.rows(), c = m.cols();\n   for(size_t i = 0; i \u003C r; ++i)\n   {  \n       for(size_t j = 0; j \u003C c; ++j)\n         out \u003C\u003C m(i, j) \u003C\u003C ' ';\n      out \u003C\u003C endl; \u002F\u002F 输出一行元素后换行\n   }\n   return out;\n} \u002F\u002F 耗时O(size)\n\u002F\u002F\n\u002F\u002F extend\n\u002F\u002F\ntemplate\u003Cclass T> \u002F\u002F 两个矩阵相加\nauto operator+(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n{  \n   size_t r = min(X.rows(), Y.rows()), c = min(X.cols(), Y.cols());\n   Matrix\u003CT> Z(r, c);\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) + Y(i, j);\n   return Z;\n}\ntemplate\u003Cclass T> \u002F\u002F 两个矩阵相减\nauto operator-(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n{  \n   size_t r = min(X.rows(), Y.rows()), c = min(X.cols(), Y.cols());\n   Matrix\u003CT> Z(r, c);\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) - Y(i, j);\n   return Z;\n}\ntemplate\u003Cclass T> \u002F\u002F 两个矩阵相乘\nauto operator*(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n{  \n   size_t r = X.rows(), c = Y.cols(), m = min(X.cols(), Y.rows());\n   Matrix\u003CT> Z(r, c);\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n      {  \n         Z(i, j) = X(i, 0) * Y(0, j);\n         for(size_t k = 1; k \u003C m; ++k)\n            Z(i, j) = Z(i, j) + X(i, k) * Y(k, j);\n      }\n   return Z;\n}\ntemplate\u003Cclass T, class T2> \u002F\u002F 加上一个值\nauto operator+(const Matrix\u003CT> &X, const T2 &v)\n{  \n   size_t r = X.rows(), c = X.cols();\n   Matrix\u003CT> Z(r, c); \u002F\u002F 结果矩阵\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) + v;\n   return Z;\n}\ntemplate\u003Cclass T, class T2> \u002F\u002F 减去一个值\nauto operator-(const Matrix\u003CT> &X, const T2 &v)\n{  \n   size_t r = X.rows(), c = X.cols();\n   Matrix\u003CT> Z(r, c); \u002F\u002F 结果矩阵\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) - v;\n   return Z;\n}\ntemplate\u003Cclass T, class T2> \u002F\u002F 乘以一个值\nauto operator*(const Matrix\u003CT> &X, const T2 &v)\n{  \n   size_t r = X.rows(), c = X.cols();\n   Matrix\u003CT> Z(r, c); \u002F\u002F 结果矩阵\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) * v;\n   return Z;\n}\ntemplate\u003Cclass T, class T2> \u002F\u002F 除以一个值\nauto operator\u002F(const Matrix\u003CT> &X, const T2 &v)\n{  \n   size_t r = X.rows(), c = X.cols();\n   Matrix\u003CT> Z(r, c); \u002F\u002F 结果矩阵\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(i, j) \u002F v;\n   return Z;\n}\ntemplate\u003Cclass T> \u002F\u002F 负\nauto operator-(const Matrix\u003CT> &X)\n{  \n   return X * (-1);\n}\ntemplate\u003Cclass T> \u002F\u002F 转置\nauto transpose(const Matrix\u003CT> &X)\n{  \n   size_t r = X.cols(), c = X.rows();\n   Matrix\u003CT> Z(r, c);\n   for(size_t i = 0; i \u003C r; ++i)\n      for(size_t j = 0; j \u003C c; ++j)\n         Z(i, j) = X(j, i);\n   return Z;\n}\n\u002F\u002F\n\u002F\u002F end extend\n\u002F\u002F\n",[17,51180,51181,51186,51191,51196,51201,51206,51210,51215,51220,51225,51230,51235,51240,51245,51250,51255,51260,51265,51270,51275,51280,51285,51290,51295,51300,51305,51310,51315,51320,51325,51330,51335,51340,51344,51349,51354,51359,51363,51367,51371,51376,51381,51386,51391,51395,51400,51405,51409,51414,51419,51423,51428,51432,51437,51441,51446,51451,51455,51460,51464,51468,51473,51478,51483,51487,51492,51497,51501,51506,51511,51516,51520,51525,51530,51534,51539,51543,51548,51553,51557,51562,51567,51571,51576,51581,51586,51590,51595,51600,51604,51608,51612,51616,51620,51625,51629,51633,51638,51643,51647,51652,51657,51662,51667,51673,51679,51685,51691,51696,51701,51706,51712,51718,51723,51729,51735,51740,51745,51751,51756,51761,51767,51773,51778,51783,51788,51793,51798,51804,51809,51814,51820,51826,51831,51836,51841,51846,51851,51857,51862,51867,51873,51879,51884,51889,51894,51899,51904,51910,51915,51920,51926,51932,51937,51943,51948,51954,51960,51965,51971,51976,51981,51986,51992,51997,52002,52007,52013],{"__ignoreMap":119},[78,51182,51183],{"class":124,"line":125},[78,51184,51185],{},"\u002F\u002F Matrix.hpp\n",[78,51187,51188],{"class":124,"line":132},[78,51189,51190],{},"#pragma once\n",[78,51192,51193],{"class":124,"line":138},[78,51194,51195],{},"#include\u003Cvector>\n",[78,51197,51198],{"class":124,"line":144},[78,51199,51200],{},"#include\u003Ciostream>\n",[78,51202,51203],{"class":124,"line":150},[78,51204,51205],{},"using namespace std;\n",[78,51207,51208],{"class":124,"line":156},[78,51209,51135],{},[78,51211,51212],{"class":124,"line":162},[78,51213,51214],{},"class Matrix\n",[78,51216,51217],{"class":124,"line":168},[78,51218,51219],{},"{  \n",[78,51221,51222],{"class":124,"line":174},[78,51223,51224],{},"   vector\u003CT> buf; \u002F\u002F 用一维数组保存矩阵元素\n",[78,51226,51227],{"class":124,"line":180},[78,51228,51229],{},"   size_t r = 0, c = 0; \u002F\u002F 行数和列数\n",[78,51231,51232],{"class":124,"line":186},[78,51233,51234],{},"public:\n",[78,51236,51237],{"class":124,"line":192},[78,51238,51239],{},"   Matrix() = default; \u002F\u002F 默认初始化\n",[78,51241,51242],{"class":124,"line":198},[78,51243,51244],{},"   Matrix(const Matrix &m) = default; \u002F\u002F 使用另一矩阵初始化\n",[78,51246,51247],{"class":124,"line":204},[78,51248,51249],{},"   ~Matrix() = default; \u002F\u002F 析构\n",[78,51251,51252],{"class":124,"line":210},[78,51253,51254],{},"   Matrix &operator=(const Matrix &) = default; \u002F\u002F 赋值\n",[78,51256,51257],{"class":124,"line":216},[78,51258,51259],{},"   Matrix(size_t row, size_t col): \u002F\u002F 根据行数和列数初始化\n",[78,51261,51262],{"class":124,"line":222},[78,51263,51264],{},"      buf(vector\u003CT>(row * col)), r(row), c(col) {}\n",[78,51266,51267],{"class":124,"line":421},[78,51268,51269],{},"   Matrix(size_t row, size_t col, const T &v): \u002F\u002F 用行数和列数及指定值初始化\n",[78,51271,51272],{"class":124,"line":427},[78,51273,51274],{},"      buf(vector\u003CT>(row * col, v)), r(row), c(col) {}\n",[78,51276,51277],{"class":124,"line":433},[78,51278,51279],{},"   \u002F\u002F 使用初始值列表初始化, 即使用{}初始化\n",[78,51281,51282],{"class":124,"line":2443},[78,51283,51284],{},"   Matrix(const initializer_list\u003Cinitializer_list\u003CT>> &m):\n",[78,51286,51287],{"class":124,"line":2448},[78,51288,51289],{},"      buf(begin(m)->begin(), rbegin(m)->end()), \u002F\u002F 指定元素\n",[78,51291,51292],{"class":124,"line":2454},[78,51293,51294],{},"      r(m.size()), c(begin(m)->size()) \u002F\u002F 指定行数和列数\n",[78,51296,51297],{"class":124,"line":2460},[78,51298,51299],{},"   {}\n",[78,51301,51302],{"class":124,"line":2465},[78,51303,51304],{},"   void assign(const T &v) \u002F\u002F 每个元素都是v\n",[78,51306,51307],{"class":124,"line":2470},[78,51308,51309],{},"   {  \n",[78,51311,51312],{"class":124,"line":2903},[78,51313,51314],{},"      buf.assign(r * c, v);\n",[78,51316,51317],{"class":124,"line":2909},[78,51318,51319],{},"   } \u002F\u002F 耗时O(size)\n",[78,51321,51322],{"class":124,"line":11477},[78,51323,51324],{},"   \u002F\u002F 元素类型简写\n",[78,51326,51327],{"class":124,"line":13374},[78,51328,51329],{},"   using reference = typename vector\u003CT>::reference; \u002F\u002F 元素引用\n",[78,51331,51332],{"class":124,"line":13380},[78,51333,51334],{},"   using const_reference = typename vector\u003CT>::const_reference; \u002F\u002F const引用\n",[78,51336,51337],{"class":124,"line":13386},[78,51338,51339],{},"   reference operator()(size_t i, size_t j) \u002F\u002F 使用M(i, j)的形式访问矩阵元素\n",[78,51341,51342],{"class":124,"line":13722},[78,51343,51309],{},[78,51345,51346],{"class":124,"line":13727},[78,51347,51348],{},"      return buf[i * c + j];\n",[78,51350,51351],{"class":124,"line":13953},[78,51352,51353],{},"   }\n",[78,51355,51356],{"class":124,"line":13958},[78,51357,51358],{},"   const_reference operator()(size_t i, size_t j) const\n",[78,51360,51361],{"class":124,"line":13964},[78,51362,51309],{},[78,51364,51365],{"class":124,"line":13969},[78,51366,51348],{},[78,51368,51369],{"class":124,"line":24170},[78,51370,51353],{},[78,51372,51373],{"class":124,"line":24175},[78,51374,51375],{},"   size_t rows() const { return r; } \u002F\u002F 行数\n",[78,51377,51378],{"class":124,"line":24180},[78,51379,51380],{},"   size_t cols() const { return c; } \u002F\u002F 列数\n",[78,51382,51383],{"class":124,"line":24186},[78,51384,51385],{},"   \u002F\u002F\n",[78,51387,51388],{"class":124,"line":24192},[78,51389,51390],{},"   \u002F\u002F extend\n",[78,51392,51393],{"class":124,"line":24198},[78,51394,51385],{},[78,51396,51397],{"class":124,"line":24204},[78,51398,51399],{},"   Matrix(Matrix &&m): buf(move(m.buf)), r(m.r), c(m.c) {}\n",[78,51401,51402],{"class":124,"line":24210},[78,51403,51404],{},"   Matrix &operator=(Matrix &&m)\n",[78,51406,51407],{"class":124,"line":24215},[78,51408,51309],{},[78,51410,51411],{"class":124,"line":24220},[78,51412,51413],{},"      buf = move(m.buf), r = m.r, c = m.c;\n",[78,51415,51416],{"class":124,"line":24226},[78,51417,51418],{},"      return *this;\n",[78,51420,51421],{"class":124,"line":24232},[78,51422,51353],{},[78,51424,51425],{"class":124,"line":24238},[78,51426,51427],{},"   Matrix &operator=(const initializer_list\u003CT> &m)\n",[78,51429,51430],{"class":124,"line":24244},[78,51431,51309],{},[78,51433,51434],{"class":124,"line":24250},[78,51435,51436],{},"      buf.assign(m);\n",[78,51438,51439],{"class":124,"line":24256},[78,51440,51418],{},[78,51442,51443],{"class":124,"line":24262},[78,51444,51445],{},"   } \u002F\u002F 使用列表赋值，即将{}中的元素复制到*this\n",[78,51447,51448],{"class":124,"line":24267},[78,51449,51450],{},"   size_t size() const { return r * c; } \u002F\u002F 元素数\n",[78,51452,51453],{"class":124,"line":24273},[78,51454,51385],{},[78,51456,51457],{"class":124,"line":24279},[78,51458,51459],{},"   \u002F\u002F end extend\n",[78,51461,51462],{"class":124,"line":24284},[78,51463,51385],{},[78,51465,51466],{"class":124,"line":24290},[78,51467,51165],{},[78,51469,51470],{"class":124,"line":24296},[78,51471,51472],{},"\u002F\u002F\n",[78,51474,51475],{"class":124,"line":24302},[78,51476,51477],{},"template\u003Cclass T> \u002F\u002F 输出矩阵的所有元素\n",[78,51479,51480],{"class":124,"line":24308},[78,51481,51482],{},"ostream &operator\u003C\u003C(ostream &out, const Matrix\u003CT> &m)\n",[78,51484,51485],{"class":124,"line":24314},[78,51486,51219],{},[78,51488,51489],{"class":124,"line":24320},[78,51490,51491],{},"   size_t r = m.rows(), c = m.cols();\n",[78,51493,51494],{"class":124,"line":24325},[78,51495,51496],{},"   for(size_t i = 0; i \u003C r; ++i)\n",[78,51498,51499],{"class":124,"line":24331},[78,51500,51309],{},[78,51502,51503],{"class":124,"line":25115},[78,51504,51505],{},"       for(size_t j = 0; j \u003C c; ++j)\n",[78,51507,51508],{"class":124,"line":25121},[78,51509,51510],{},"         out \u003C\u003C m(i, j) \u003C\u003C ' ';\n",[78,51512,51513],{"class":124,"line":25127},[78,51514,51515],{},"      out \u003C\u003C endl; \u002F\u002F 输出一行元素后换行\n",[78,51517,51518],{"class":124,"line":25132},[78,51519,51353],{},[78,51521,51522],{"class":124,"line":25137},[78,51523,51524],{},"   return out;\n",[78,51526,51527],{"class":124,"line":25143},[78,51528,51529],{},"} \u002F\u002F 耗时O(size)\n",[78,51531,51532],{"class":124,"line":25149},[78,51533,51472],{},[78,51535,51536],{"class":124,"line":25155},[78,51537,51538],{},"\u002F\u002F extend\n",[78,51540,51541],{"class":124,"line":25161},[78,51542,51472],{},[78,51544,51545],{"class":124,"line":25166},[78,51546,51547],{},"template\u003Cclass T> \u002F\u002F 两个矩阵相加\n",[78,51549,51550],{"class":124,"line":25172},[78,51551,51552],{},"auto operator+(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n",[78,51554,51555],{"class":124,"line":25178},[78,51556,51219],{},[78,51558,51559],{"class":124,"line":25184},[78,51560,51561],{},"   size_t r = min(X.rows(), Y.rows()), c = min(X.cols(), Y.cols());\n",[78,51563,51564],{"class":124,"line":25190},[78,51565,51566],{},"   Matrix\u003CT> Z(r, c);\n",[78,51568,51569],{"class":124,"line":25196},[78,51570,51496],{},[78,51572,51573],{"class":124,"line":25202},[78,51574,51575],{},"      for(size_t j = 0; j \u003C c; ++j)\n",[78,51577,51578],{"class":124,"line":25207},[78,51579,51580],{},"         Z(i, j) = X(i, j) + Y(i, j);\n",[78,51582,51583],{"class":124,"line":25212},[78,51584,51585],{},"   return Z;\n",[78,51587,51588],{"class":124,"line":25218},[78,51589,23518],{},[78,51591,51592],{"class":124,"line":25224},[78,51593,51594],{},"template\u003Cclass T> \u002F\u002F 两个矩阵相减\n",[78,51596,51597],{"class":124,"line":25230},[78,51598,51599],{},"auto operator-(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n",[78,51601,51602],{"class":124,"line":25236},[78,51603,51219],{},[78,51605,51606],{"class":124,"line":25241},[78,51607,51561],{},[78,51609,51610],{"class":124,"line":25246},[78,51611,51566],{},[78,51613,51614],{"class":124,"line":25252},[78,51615,51496],{},[78,51617,51618],{"class":124,"line":25258},[78,51619,51575],{},[78,51621,51622],{"class":124,"line":25264},[78,51623,51624],{},"         Z(i, j) = X(i, j) - Y(i, j);\n",[78,51626,51627],{"class":124,"line":25269},[78,51628,51585],{},[78,51630,51631],{"class":124,"line":25274},[78,51632,23518],{},[78,51634,51635],{"class":124,"line":25280},[78,51636,51637],{},"template\u003Cclass T> \u002F\u002F 两个矩阵相乘\n",[78,51639,51640],{"class":124,"line":25286},[78,51641,51642],{},"auto operator*(const Matrix\u003CT> &X, const Matrix\u003CT> &Y)\n",[78,51644,51645],{"class":124,"line":25292},[78,51646,51219],{},[78,51648,51649],{"class":124,"line":25298},[78,51650,51651],{},"   size_t r = X.rows(), c = Y.cols(), m = min(X.cols(), Y.rows());\n",[78,51653,51655],{"class":124,"line":51654},101,[78,51656,51566],{},[78,51658,51660],{"class":124,"line":51659},102,[78,51661,51496],{},[78,51663,51665],{"class":124,"line":51664},103,[78,51666,51575],{},[78,51668,51670],{"class":124,"line":51669},104,[78,51671,51672],{},"      {  \n",[78,51674,51676],{"class":124,"line":51675},105,[78,51677,51678],{},"         Z(i, j) = X(i, 0) * Y(0, j);\n",[78,51680,51682],{"class":124,"line":51681},106,[78,51683,51684],{},"         for(size_t k = 1; k \u003C m; ++k)\n",[78,51686,51688],{"class":124,"line":51687},107,[78,51689,51690],{},"            Z(i, j) = Z(i, j) + X(i, k) * Y(k, j);\n",[78,51692,51694],{"class":124,"line":51693},108,[78,51695,23499],{},[78,51697,51699],{"class":124,"line":51698},109,[78,51700,51585],{},[78,51702,51704],{"class":124,"line":51703},110,[78,51705,23518],{},[78,51707,51709],{"class":124,"line":51708},111,[78,51710,51711],{},"template\u003Cclass T, class T2> \u002F\u002F 加上一个值\n",[78,51713,51715],{"class":124,"line":51714},112,[78,51716,51717],{},"auto operator+(const Matrix\u003CT> &X, const T2 &v)\n",[78,51719,51721],{"class":124,"line":51720},113,[78,51722,51219],{},[78,51724,51726],{"class":124,"line":51725},114,[78,51727,51728],{},"   size_t r = X.rows(), c = X.cols();\n",[78,51730,51732],{"class":124,"line":51731},115,[78,51733,51734],{},"   Matrix\u003CT> Z(r, c); \u002F\u002F 结果矩阵\n",[78,51736,51738],{"class":124,"line":51737},116,[78,51739,51496],{},[78,51741,51743],{"class":124,"line":51742},117,[78,51744,51575],{},[78,51746,51748],{"class":124,"line":51747},118,[78,51749,51750],{},"         Z(i, j) = X(i, j) + v;\n",[78,51752,51754],{"class":124,"line":51753},119,[78,51755,51585],{},[78,51757,51759],{"class":124,"line":51758},120,[78,51760,23518],{},[78,51762,51764],{"class":124,"line":51763},121,[78,51765,51766],{},"template\u003Cclass T, class T2> \u002F\u002F 减去一个值\n",[78,51768,51770],{"class":124,"line":51769},122,[78,51771,51772],{},"auto operator-(const Matrix\u003CT> &X, const T2 &v)\n",[78,51774,51776],{"class":124,"line":51775},123,[78,51777,51219],{},[78,51779,51781],{"class":124,"line":51780},124,[78,51782,51728],{},[78,51784,51786],{"class":124,"line":51785},125,[78,51787,51734],{},[78,51789,51791],{"class":124,"line":51790},126,[78,51792,51496],{},[78,51794,51796],{"class":124,"line":51795},127,[78,51797,51575],{},[78,51799,51801],{"class":124,"line":51800},128,[78,51802,51803],{},"         Z(i, j) = X(i, j) - v;\n",[78,51805,51807],{"class":124,"line":51806},129,[78,51808,51585],{},[78,51810,51812],{"class":124,"line":51811},130,[78,51813,23518],{},[78,51815,51817],{"class":124,"line":51816},131,[78,51818,51819],{},"template\u003Cclass T, class T2> \u002F\u002F 乘以一个值\n",[78,51821,51823],{"class":124,"line":51822},132,[78,51824,51825],{},"auto operator*(const Matrix\u003CT> &X, const T2 &v)\n",[78,51827,51829],{"class":124,"line":51828},133,[78,51830,51219],{},[78,51832,51834],{"class":124,"line":51833},134,[78,51835,51728],{},[78,51837,51839],{"class":124,"line":51838},135,[78,51840,51734],{},[78,51842,51844],{"class":124,"line":51843},136,[78,51845,51496],{},[78,51847,51849],{"class":124,"line":51848},137,[78,51850,51575],{},[78,51852,51854],{"class":124,"line":51853},138,[78,51855,51856],{},"         Z(i, j) = X(i, j) * v;\n",[78,51858,51860],{"class":124,"line":51859},139,[78,51861,51585],{},[78,51863,51865],{"class":124,"line":51864},140,[78,51866,23518],{},[78,51868,51870],{"class":124,"line":51869},141,[78,51871,51872],{},"template\u003Cclass T, class T2> \u002F\u002F 除以一个值\n",[78,51874,51876],{"class":124,"line":51875},142,[78,51877,51878],{},"auto operator\u002F(const Matrix\u003CT> &X, const T2 &v)\n",[78,51880,51882],{"class":124,"line":51881},143,[78,51883,51219],{},[78,51885,51887],{"class":124,"line":51886},144,[78,51888,51728],{},[78,51890,51892],{"class":124,"line":51891},145,[78,51893,51734],{},[78,51895,51897],{"class":124,"line":51896},146,[78,51898,51496],{},[78,51900,51902],{"class":124,"line":51901},147,[78,51903,51575],{},[78,51905,51907],{"class":124,"line":51906},148,[78,51908,51909],{},"         Z(i, j) = X(i, j) \u002F v;\n",[78,51911,51913],{"class":124,"line":51912},149,[78,51914,51585],{},[78,51916,51918],{"class":124,"line":51917},150,[78,51919,23518],{},[78,51921,51923],{"class":124,"line":51922},151,[78,51924,51925],{},"template\u003Cclass T> \u002F\u002F 负\n",[78,51927,51929],{"class":124,"line":51928},152,[78,51930,51931],{},"auto operator-(const Matrix\u003CT> &X)\n",[78,51933,51935],{"class":124,"line":51934},153,[78,51936,51219],{},[78,51938,51940],{"class":124,"line":51939},154,[78,51941,51942],{},"   return X * (-1);\n",[78,51944,51946],{"class":124,"line":51945},155,[78,51947,23518],{},[78,51949,51951],{"class":124,"line":51950},156,[78,51952,51953],{},"template\u003Cclass T> \u002F\u002F 转置\n",[78,51955,51957],{"class":124,"line":51956},157,[78,51958,51959],{},"auto transpose(const Matrix\u003CT> &X)\n",[78,51961,51963],{"class":124,"line":51962},158,[78,51964,51219],{},[78,51966,51968],{"class":124,"line":51967},159,[78,51969,51970],{},"   size_t r = X.cols(), c = X.rows();\n",[78,51972,51974],{"class":124,"line":51973},160,[78,51975,51566],{},[78,51977,51979],{"class":124,"line":51978},161,[78,51980,51496],{},[78,51982,51984],{"class":124,"line":51983},162,[78,51985,51575],{},[78,51987,51989],{"class":124,"line":51988},163,[78,51990,51991],{},"         Z(i, j) = X(j, i);\n",[78,51993,51995],{"class":124,"line":51994},164,[78,51996,51585],{},[78,51998,52000],{"class":124,"line":51999},165,[78,52001,23518],{},[78,52003,52005],{"class":124,"line":52004},166,[78,52006,51472],{},[78,52008,52010],{"class":124,"line":52009},167,[78,52011,52012],{},"\u002F\u002F end extend\n",[78,52014,52016],{"class":124,"line":52015},168,[78,52017,51472],{},[107,52019,52020],{"id":52020},"渐进符号",[7759,52022,52024],{"id":52023},"渐进符号o上界考点","渐进符号O（上界）【考点】",[10548,52026,52028],{"id":52027},"_1符号o的定义","1、符号O的定义",[13,52030,52031],{},"f(n) = O(g(n))当且仅当存在正整数c和n0，使得n >= n0时，有f(n) \u003C= c * g(n)。此时，称g(n)是f(n)的一个上界。",[8366,52033,52034,52049],{},[8369,52035,52036],{},[8372,52037,52038,52043,52046],{},[8375,52039,52040],{"align":9247},[22,52041,52042],{},"常数函数",[8375,52044,52045],{"align":9247},"f(n) = C0 = O(1)",[8375,52047,52048],{"align":9247},"c = C0, n0 = 0",[8386,52050,52051,52068,52084,52101,52117,52134,52151],{},[8372,52052,52053,52058,52063],{},[8391,52054,52055],{"align":9247},[22,52056,52057],{},"线性函数",[8391,52059,52060],{"align":9247},[22,52061,52062],{},"3n + 2 = O(n)",[8391,52064,52065],{"align":9247},[22,52066,52067],{},"c = 4, n0 = 2",[8372,52069,52070,52074,52079],{},[8391,52071,52072],{"align":9247},[22,52073,52057],{},[8391,52075,52076],{"align":9247},[22,52077,52078],{},"100n + 6lnn = O(n)",[8391,52080,52081],{"align":9247},[22,52082,52083],{},"c = 102, n0 = 6",[8372,52085,52086,52091,52096],{},[8391,52087,52088],{"align":9247},[22,52089,52090],{},"平方函数",[8391,52092,52093],{"align":9247},[22,52094,52095],{},"10n ^ 2 + 4n + 3 = O(n ^ 2)",[8391,52097,52098],{"align":9247},[22,52099,52100],{},"c = 11, n0 = 5",[8372,52102,52103,52107,52112],{},[8391,52104,52105],{"align":9247},[22,52106,52090],{},[8391,52108,52109],{"align":9247},[22,52110,52111],{},"nlogn + n ^ 2 = O(n ^ 2)",[8391,52113,52114],{"align":9247},[22,52115,52116],{},"c = 2, n0 = 3",[8372,52118,52119,52124,52129],{},[8391,52120,52121],{"align":9247},[22,52122,52123],{},"指数函数",[8391,52125,52126],{"align":9247},[22,52127,52128],{},"6 x 2 ^ n + n ^ 2 = O(2 ^ n)",[8391,52130,52131],{"align":9247},[22,52132,52133],{},"c = 7, n0 = 4",[8372,52135,52136,52141,52146],{},[8391,52137,52138],{"align":9247},[22,52139,52140],{},"松散界限",[8391,52142,52143],{"align":9247},[22,52144,52145],{},"3n + 2 = O(n ^ 2)",[8391,52147,52148],{"align":9247},[22,52149,52150],{},"c = 3, n0 = 2",[8372,52152,52153,52158,52163],{},[8391,52154,52155],{"align":9247},[22,52156,52157],{},"错误界限",[8391,52159,52160],{"align":9247},[22,52161,52162],{},"3n + 2 ≠ O(1)",[8391,52164],{"align":9247},[13,52166,52167],{},[22,52168,11250],{},[13,52170,52171],{},"（1）不要产生松散界限；（2）不要产生错误界限；（3）f(n)与g(n)顺序不能调转。",[10548,52173,52175],{"id":52174},"_2大o比率定理","2、【大O比率定理】",[78,52177,52179],{"className":52178},[4566],[78,52180,52182,52352],{"className":52181},[4570],[78,52183,52185],{"className":52184},[4574],[4576,52186,52187],{"xmlns":4578,"display":4579},[4581,52188,52189,52349],{},[4584,52190,52191,52194,52196,52198,52200,52202,52205,52207,52209,52211,52213,52216,52237,52259,52262,52264,52266,52268,52270,52272,52275,52277,52279,52281,52283,52285,52287,52290,52292,52295,52297,52299,52302,52320,52342,52345,52347],{},[4587,52192,52193],{},"对于函数",[4596,52195,5053],{},[4591,52197,4594],{"stretchy":4593},[4596,52199,19],{},[4591,52201,4604],{"stretchy":4593},[4587,52203,52204],{},"和",[4596,52206,43673],{},[4591,52208,4594],{"stretchy":4593},[4596,52210,19],{},[4591,52212,4604],{"stretchy":4593},[4587,52214,52215],{},"，如果",[4628,52217,52218,52225],{},[4584,52219,52220,52223],{},[4596,52221,52222],{},"lim",[4591,52224,17553],{},[4584,52226,52227,52229,52232,52234],{},[4596,52228,19],{},[4591,52230,52231],{},"→",[4591,52233,7351],{},[4596,52235,52236],{"mathvariant":7101},"∞",[4611,52238,52239,52249],{},[4584,52240,52241,52243,52245,52247],{},[4596,52242,5053],{},[4591,52244,4594],{"stretchy":4593},[4596,52246,19],{},[4591,52248,4604],{"stretchy":4593},[4584,52250,52251,52253,52255,52257],{},[4596,52252,43673],{},[4591,52254,4594],{"stretchy":4593},[4596,52256,19],{},[4591,52258,4604],{"stretchy":4593},[4587,52260,52261],{},"存在，则",[4596,52263,5053],{},[4591,52265,4594],{"stretchy":4593},[4596,52267,19],{},[4591,52269,4604],{"stretchy":4593},[4591,52271,4609],{},[4596,52273,52274],{},"O",[4591,52276,4594],{"stretchy":4593},[4596,52278,43673],{},[4591,52280,4594],{"stretchy":4593},[4596,52282,19],{},[4591,52284,4604],{"stretchy":4593},[4591,52286,4604],{"stretchy":4593},[4587,52288,52289],{},"当且仅当",[4596,52291,7360],{},[4591,52293,52294],{},">",[7077,52296,2949],{},[4591,52298,2066],{"separator":1419},[4587,52300,52301],{},"使得",[4628,52303,52304,52310],{},[4584,52305,52306,52308],{},[4596,52307,52222],{},[4591,52309,17553],{},[4584,52311,52312,52314,52316,52318],{},[4596,52313,19],{},[4591,52315,52231],{},[4591,52317,7351],{},[4596,52319,52236],{"mathvariant":7101},[4611,52321,52322,52332],{},[4584,52323,52324,52326,52328,52330],{},[4596,52325,5053],{},[4591,52327,4594],{"stretchy":4593},[4596,52329,19],{},[4591,52331,4604],{"stretchy":4593},[4584,52333,52334,52336,52338,52340],{},[4596,52335,43673],{},[4591,52337,4594],{"stretchy":4593},[4596,52339,19],{},[4591,52341,4604],{"stretchy":4593},[4591,52343,52344],{},"≤",[4596,52346,7360],{},[4587,52348,67],{},[4647,52350,52351],{"encoding":4649},"对于函数f(n)和g(n)，如果\\lim_{n\\rightarrow + \\infty}\\frac{f(n)}{g(n)}存在，则f(n) = O(g(n))当且仅当c > 0,使得\\lim_{n\\rightarrow + \\infty}\\frac{f(n)}{g(n)} ≤ c。",[78,52353,52355,52565,52604,52773],{"className":52354,"ariaHidden":1419},[4654],[78,52356,52358,52362,52365,52368,52371,52374,52377,52380,52383,52386,52389,52392,52395,52398,52457,52460,52541,52544,52547,52550,52553,52556,52559,52562],{"className":52357},[4658],[78,52359],{"className":52360,"style":52361},[4662],"height:2.363em;vertical-align:-0.936em;",[78,52363,52193],{"className":52364},[4667,6184],[78,52366,5053],{"className":52367,"style":5170},[4667,4678],[78,52369,4594],{"className":52370},[4674],[78,52372,19],{"className":52373},[4667,4678],[78,52375,4604],{"className":52376},[4682],[78,52378,52204],{"className":52379},[4667,6184],[78,52381,43673],{"className":52382,"style":5187},[4667,4678],[78,52384,4594],{"className":52385},[4674],[78,52387,19],{"className":52388},[4667,4678],[78,52390,4604],{"className":52391},[4682],[78,52393,52215],{"className":52394},[4667,6184],[78,52396],{"className":52397,"style":4839},[4739],[78,52399,52402],{"className":52400},[4788,52401],"op-limits",[78,52403,52405,52448],{"className":52404},[4693,4694],[78,52406,52408,52445],{"className":52407},[4698],[78,52409,52411,52435],{"className":52410,"style":16794},[4702],[78,52412,52414,52417],{"style":52413},"top:-2.4em;margin-left:0em;",[78,52415],{"className":52416,"style":4781},[4710],[78,52418,52420],{"className":52419},[4715,4716,4717,4718],[78,52421,52423,52426,52429,52432],{"className":52422},[4667,4718],[78,52424,19],{"className":52425},[4667,4678,4718],[78,52427,52231],{"className":52428},[4744,4718],[78,52430,7351],{"className":52431},[4667,4718],[78,52433,52236],{"className":52434},[4667,4718],[78,52436,52437,52440],{"style":5824},[78,52438],{"className":52439,"style":4781},[4710],[78,52441,52442],{},[78,52443,52222],{"className":52444},[4788],[78,52446,4726],{"className":52447},[4725],[78,52449,52451],{"className":52450},[4698],[78,52452,52455],{"className":52453,"style":52454},[4702],"height:0.7583em;",[78,52456],{},[78,52458],{"className":52459,"style":4839},[4739],[78,52461,52463,52466,52538],{"className":52462},[4667],[78,52464],{"className":52465},[4674,4761],[78,52467,52469],{"className":52468},[4611],[78,52470,52472,52530],{"className":52471},[4693,4694],[78,52473,52475,52527],{"className":52474},[4698],[78,52476,52479,52499,52507],{"className":52477,"style":52478},[4702],"height:1.427em;",[78,52480,52481,52484],{"style":4777},[78,52482],{"className":52483,"style":4781},[4710],[78,52485,52487,52490,52493,52496],{"className":52486},[4667],[78,52488,43673],{"className":52489,"style":5187},[4667,4678],[78,52491,4594],{"className":52492},[4674],[78,52494,19],{"className":52495},[4667,4678],[78,52497,4604],{"className":52498},[4682],[78,52500,52501,52504],{"style":4919},[78,52502],{"className":52503,"style":4781},[4710],[78,52505],{"className":52506,"style":4927},[4926],[78,52508,52509,52512],{"style":4930},[78,52510],{"className":52511,"style":4781},[4710],[78,52513,52515,52518,52521,52524],{"className":52514},[4667],[78,52516,5053],{"className":52517,"style":5170},[4667,4678],[78,52519,4594],{"className":52520},[4674],[78,52522,19],{"className":52523},[4667,4678],[78,52525,4604],{"className":52526},[4682],[78,52528,4726],{"className":52529},[4725],[78,52531,52533],{"className":52532},[4698],[78,52534,52536],{"className":52535,"style":17380},[4702],[78,52537],{},[78,52539],{"className":52540},[4682,4761],[78,52542,52261],{"className":52543},[4667,6184],[78,52545,5053],{"className":52546,"style":5170},[4667,4678],[78,52548,4594],{"className":52549},[4674],[78,52551,19],{"className":52552},[4667,4678],[78,52554,4604],{"className":52555},[4682],[78,52557],{"className":52558,"style":4740},[4739],[78,52560,4609],{"className":52561},[4744],[78,52563],{"className":52564,"style":4740},[4739],[78,52566,52568,52571,52574,52577,52580,52583,52586,52589,52592,52595,52598,52601],{"className":52567},[4658],[78,52569],{"className":52570,"style":4663},[4662],[78,52572,52274],{"className":52573,"style":17251},[4667,4678],[78,52575,4594],{"className":52576},[4674],[78,52578,43673],{"className":52579,"style":5187},[4667,4678],[78,52581,4594],{"className":52582},[4674],[78,52584,19],{"className":52585},[4667,4678],[78,52587,38757],{"className":52588},[4682],[78,52590,52289],{"className":52591},[4667,6184],[78,52593,7360],{"className":52594},[4667,4678],[78,52596],{"className":52597,"style":4740},[4739],[78,52599,52294],{"className":52600},[4744],[78,52602],{"className":52603,"style":4740},[4739],[78,52605,52607,52610,52613,52616,52619,52622,52625,52681,52684,52764,52767,52770],{"className":52606},[4658],[78,52608],{"className":52609,"style":52361},[4662],[78,52611,2949],{"className":52612},[4667],[78,52614,2066],{"className":52615},[5126],[78,52617],{"className":52618,"style":4839},[4739],[78,52620,52301],{"className":52621},[4667,6184],[78,52623],{"className":52624,"style":4839},[4739],[78,52626,52628],{"className":52627},[4788,52401],[78,52629,52631,52673],{"className":52630},[4693,4694],[78,52632,52634,52670],{"className":52633},[4698],[78,52635,52637,52660],{"className":52636,"style":16794},[4702],[78,52638,52639,52642],{"style":52413},[78,52640],{"className":52641,"style":4781},[4710],[78,52643,52645],{"className":52644},[4715,4716,4717,4718],[78,52646,52648,52651,52654,52657],{"className":52647},[4667,4718],[78,52649,19],{"className":52650},[4667,4678,4718],[78,52652,52231],{"className":52653},[4744,4718],[78,52655,7351],{"className":52656},[4667,4718],[78,52658,52236],{"className":52659},[4667,4718],[78,52661,52662,52665],{"style":5824},[78,52663],{"className":52664,"style":4781},[4710],[78,52666,52667],{},[78,52668,52222],{"className":52669},[4788],[78,52671,4726],{"className":52672},[4725],[78,52674,52676],{"className":52675},[4698],[78,52677,52679],{"className":52678,"style":52454},[4702],[78,52680],{},[78,52682],{"className":52683,"style":4839},[4739],[78,52685,52687,52690,52761],{"className":52686},[4667],[78,52688],{"className":52689},[4674,4761],[78,52691,52693],{"className":52692},[4611],[78,52694,52696,52753],{"className":52695},[4693,4694],[78,52697,52699,52750],{"className":52698},[4698],[78,52700,52702,52722,52730],{"className":52701,"style":52478},[4702],[78,52703,52704,52707],{"style":4777},[78,52705],{"className":52706,"style":4781},[4710],[78,52708,52710,52713,52716,52719],{"className":52709},[4667],[78,52711,43673],{"className":52712,"style":5187},[4667,4678],[78,52714,4594],{"className":52715},[4674],[78,52717,19],{"className":52718},[4667,4678],[78,52720,4604],{"className":52721},[4682],[78,52723,52724,52727],{"style":4919},[78,52725],{"className":52726,"style":4781},[4710],[78,52728],{"className":52729,"style":4927},[4926],[78,52731,52732,52735],{"style":4930},[78,52733],{"className":52734,"style":4781},[4710],[78,52736,52738,52741,52744,52747],{"className":52737},[4667],[78,52739,5053],{"className":52740,"style":5170},[4667,4678],[78,52742,4594],{"className":52743},[4674],[78,52745,19],{"className":52746},[4667,4678],[78,52748,4604],{"className":52749},[4682],[78,52751,4726],{"className":52752},[4725],[78,52754,52756],{"className":52755},[4698],[78,52757,52759],{"className":52758,"style":17380},[4702],[78,52760],{},[78,52762],{"className":52763},[4682,4761],[78,52765],{"className":52766,"style":4740},[4739],[78,52768,52344],{"className":52769},[4744],[78,52771],{"className":52772,"style":4740},[4739],[78,52774,52776,52779,52782],{"className":52775},[4658],[78,52777],{"className":52778,"style":18224},[4662],[78,52780,7360],{"className":52781},[4667,4678],[78,52783,67],{"className":52784},[4667,6184],[10548,52786,52788],{"id":52787},"_3常用上界关系定理-由大o比率定理证明","3、【常用上界关系定理】 (由大O比率定理证明)",[78,52790,52792],{"className":52791},[4566],[78,52793,52795,53016],{"className":52794},[4570],[78,52796,52798],{"className":52797},[4574],[4576,52799,52800],{"xmlns":4578,"display":4579},[4581,52801,52802,53013],{},[4584,52803,52804,52807,52809,52811,52814,52817,52832,52834,52836,52838,52840,52842,52844,52846,52848,52850,52852,52854,52864,52866,52868,52870,52880,52882,52884,52886,52888,52904,52906,52908,52910,52920,52922,52924,52926,52928,52934,52936,52938,52941,52947,52949,52951,52953,52965,52967,52969,52975,52977,52979,52981,52987,52989,52991,52997,52999,53001,53003,53005,53008,53010],{},[4587,52805,52806],{},"对于任何正数",[4596,52808,4598],{},[4587,52810,52204],{},[4596,52812,52813],{},"ε",[4587,52815,52816],{},"，",[4614,52818,52819,52826],{},[4584,52820,52821,52824],{},[4596,52822,52823],{},"log",[4591,52825,17553],{},[4584,52827,52828,52830],{},[4591,52829,17848],{},[4596,52831,4598],{},[4596,52833,19],{},[4591,52835,4609],{},[4596,52837,52274],{},[4591,52839,4594],{"stretchy":4593},[7077,52841,469],{},[4591,52843,4604],{"stretchy":4593},[4591,52845,2066],{"separator":1419},[4596,52847,4598],{},[4591,52849,4609],{},[4596,52851,52274],{},[4591,52853,4594],{"stretchy":4593},[4614,52855,52856,52862],{},[4584,52857,52858,52860],{},[4596,52859,52823],{},[4591,52861,17553],{},[4596,52863,52813],{},[4596,52865,19],{},[4591,52867,4604],{"stretchy":4593},[4591,52869,2066],{"separator":1419},[4614,52871,52872,52878],{},[4584,52873,52874,52876],{},[4596,52875,52823],{},[4591,52877,17553],{},[4596,52879,4598],{},[4596,52881,19],{},[4591,52883,4609],{},[4596,52885,52274],{},[4591,52887,4594],{"stretchy":4593},[4614,52889,52890,52896],{},[4584,52891,52892,52894],{},[4596,52893,52823],{},[4591,52895,17553],{},[4584,52897,52898,52900,52902],{},[4596,52899,4598],{},[4591,52901,7351],{},[4596,52903,52813],{},[4596,52905,19],{},[4591,52907,4604],{"stretchy":4593},[4591,52909,2066],{"separator":1419},[4614,52911,52912,52918],{},[4584,52913,52914,52916],{},[4596,52915,52823],{},[4591,52917,17553],{},[4596,52919,4598],{},[4596,52921,19],{},[4591,52923,4609],{},[4596,52925,52274],{},[4591,52927,4594],{"stretchy":4593},[4614,52929,52930,52932],{},[4596,52931,19],{},[4596,52933,52813],{},[4591,52935,4604],{"stretchy":4593},[4591,52937,2066],{"separator":1419},[4739,52939],{"linebreak":52940},"newline",[4614,52942,52943,52945],{},[4596,52944,19],{},[4596,52946,4598],{},[4591,52948,4609],{},[4596,52950,52274],{},[4591,52952,4594],{"stretchy":4593},[4614,52954,52955,52957],{},[4596,52956,19],{},[4584,52958,52959,52961,52963],{},[4596,52960,4598],{},[4591,52962,7351],{},[4596,52964,52813],{},[4591,52966,4604],{"stretchy":4593},[4591,52968,2066],{"separator":1419},[4614,52970,52971,52973],{},[4596,52972,19],{},[4596,52974,4598],{},[4591,52976,4609],{},[4596,52978,52274],{},[4591,52980,4594],{"stretchy":4593},[4614,52982,52983,52985],{},[7077,52984,472],{},[4596,52986,19],{},[4591,52988,4604],{"stretchy":4593},[4587,52990,52204],{},[4614,52992,52993,52995],{},[7077,52994,472],{},[4596,52996,19],{},[4591,52998,4609],{},[4596,53000,52274],{},[4591,53002,4594],{"stretchy":4593},[7077,53004,472],{},[4591,53006,53007],{"stretchy":4593},"!",[4591,53009,4604],{"stretchy":4593},[4587,53011,53012],{},"等上界关系都成立。",[4647,53014,53015],{"encoding":4649},"对于任何正数x和ε，\n\\log^{-x}n = O(1), \nx = O(\\log^{ε}n), \n\\log^{x}n = O(\\log^{x + ε}n),\n\\log^{x}n = O(n^{ε}),\\\\\nn^x = O(n^{x + ε}),\nn^x = O(2^n)和2^n = O(2!)\n等上界关系都成立。",[78,53017,53019,53100,53136,53247,53364,53415,53418,53462,53561,53646],{"className":53018,"ariaHidden":1419},[4654],[78,53020,53022,53026,53029,53032,53035,53038,53041,53044,53085,53088,53091,53094,53097],{"className":53021},[4658],[78,53023],{"className":53024,"style":53025},[4662],"height:1.0501em;vertical-align:-0.1944em;",[78,53027,52806],{"className":53028},[4667,6184],[78,53030,4598],{"className":53031},[4667,4678],[78,53033,52204],{"className":53034},[4667,6184],[78,53036,52813],{"className":53037},[4667,4678],[78,53039,52816],{"className":53040},[4667,6184],[78,53042],{"className":53043,"style":4839},[4739],[78,53045,53047,53054],{"className":53046},[4788],[78,53048,53050,53051],{"className":53049},[4788],"lo",[78,53052,43673],{"style":53053},"margin-right:0.0139em;",[78,53055,53057],{"className":53056},[4689],[78,53058,53060],{"className":53059},[4693],[78,53061,53063],{"className":53062},[4698],[78,53064,53067],{"className":53065,"style":53066},[4702],"height:0.8557em;",[78,53068,53070,53073],{"style":53069},"top:-3.1473em;margin-right:0.05em;",[78,53071],{"className":53072,"style":4711},[4710],[78,53074,53076],{"className":53075},[4715,4716,4717,4718],[78,53077,53079,53082],{"className":53078},[4667,4718],[78,53080,17848],{"className":53081},[4667,4718],[78,53083,4598],{"className":53084},[4667,4678,4718],[78,53086],{"className":53087,"style":4839},[4739],[78,53089,19],{"className":53090},[4667,4678],[78,53092],{"className":53093,"style":4740},[4739],[78,53095,4609],{"className":53096},[4744],[78,53098],{"className":53099,"style":4740},[4739],[78,53101,53103,53106,53109,53112,53115,53118,53121,53124,53127,53130,53133],{"className":53102},[4658],[78,53104],{"className":53105,"style":4663},[4662],[78,53107,52274],{"className":53108,"style":17251},[4667,4678],[78,53110,4594],{"className":53111},[4674],[78,53113,469],{"className":53114},[4667],[78,53116,4604],{"className":53117},[4682],[78,53119,2066],{"className":53120},[5126],[78,53122],{"className":53123,"style":4839},[4739],[78,53125,4598],{"className":53126},[4667,4678],[78,53128],{"className":53129,"style":4740},[4739],[78,53131,4609],{"className":53132},[4744],[78,53134],{"className":53135,"style":4740},[4739],[78,53137,53139,53142,53145,53148,53183,53186,53189,53192,53195,53198,53232,53235,53238,53241,53244],{"className":53138},[4658],[78,53140],{"className":53141,"style":4663},[4662],[78,53143,52274],{"className":53144,"style":17251},[4667,4678],[78,53146,4594],{"className":53147},[4674],[78,53149,53151,53156],{"className":53150},[4788],[78,53152,53050,53154],{"className":53153},[4788],[78,53155,43673],{"style":53053},[78,53157,53159],{"className":53158},[4689],[78,53160,53162],{"className":53161},[4693],[78,53163,53165],{"className":53164},[4698],[78,53166,53169],{"className":53167,"style":53168},[4702],"height:0.7487em;",[78,53170,53171,53174],{"style":53069},[78,53172],{"className":53173,"style":4711},[4710],[78,53175,53177],{"className":53176},[4715,4716,4717,4718],[78,53178,53180],{"className":53179},[4667,4718],[78,53181,52813],{"className":53182},[4667,4678,4718],[78,53184],{"className":53185,"style":4839},[4739],[78,53187,19],{"className":53188},[4667,4678],[78,53190,4604],{"className":53191},[4682],[78,53193,2066],{"className":53194},[5126],[78,53196],{"className":53197,"style":4839},[4739],[78,53199,53201,53206],{"className":53200},[4788],[78,53202,53050,53204],{"className":53203},[4788],[78,53205,43673],{"style":53053},[78,53207,53209],{"className":53208},[4689],[78,53210,53212],{"className":53211},[4693],[78,53213,53215],{"className":53214},[4698],[78,53216,53218],{"className":53217,"style":53168},[4702],[78,53219,53220,53223],{"style":53069},[78,53221],{"className":53222,"style":4711},[4710],[78,53224,53226],{"className":53225},[4715,4716,4717,4718],[78,53227,53229],{"className":53228},[4667,4718],[78,53230,4598],{"className":53231},[4667,4678,4718],[78,53233],{"className":53234,"style":4839},[4739],[78,53236,19],{"className":53237},[4667,4678],[78,53239],{"className":53240,"style":4740},[4739],[78,53242,4609],{"className":53243},[4744],[78,53245],{"className":53246,"style":4740},[4739],[78,53248,53250,53254,53257,53260,53300,53303,53306,53309,53312,53315,53349,53352,53355,53358,53361],{"className":53249},[4658],[78,53251],{"className":53252,"style":53253},[4662],"height:1.1057em;vertical-align:-0.25em;",[78,53255,52274],{"className":53256,"style":17251},[4667,4678],[78,53258,4594],{"className":53259},[4674],[78,53261,53263,53268],{"className":53262},[4788],[78,53264,53050,53266],{"className":53265},[4788],[78,53267,43673],{"style":53053},[78,53269,53271],{"className":53270},[4689],[78,53272,53274],{"className":53273},[4693],[78,53275,53277],{"className":53276},[4698],[78,53278,53280],{"className":53279,"style":53066},[4702],[78,53281,53282,53285],{"style":53069},[78,53283],{"className":53284,"style":4711},[4710],[78,53286,53288],{"className":53287},[4715,4716,4717,4718],[78,53289,53291,53294,53297],{"className":53290},[4667,4718],[78,53292,4598],{"className":53293},[4667,4678,4718],[78,53295,7351],{"className":53296},[7450,4718],[78,53298,52813],{"className":53299},[4667,4678,4718],[78,53301],{"className":53302,"style":4839},[4739],[78,53304,19],{"className":53305},[4667,4678],[78,53307,4604],{"className":53308},[4682],[78,53310,2066],{"className":53311},[5126],[78,53313],{"className":53314,"style":4839},[4739],[78,53316,53318,53323],{"className":53317},[4788],[78,53319,53050,53321],{"className":53320},[4788],[78,53322,43673],{"style":53053},[78,53324,53326],{"className":53325},[4689],[78,53327,53329],{"className":53328},[4693],[78,53330,53332],{"className":53331},[4698],[78,53333,53335],{"className":53334,"style":53168},[4702],[78,53336,53337,53340],{"style":53069},[78,53338],{"className":53339,"style":4711},[4710],[78,53341,53343],{"className":53342},[4715,4716,4717,4718],[78,53344,53346],{"className":53345},[4667,4718],[78,53347,4598],{"className":53348},[4667,4678,4718],[78,53350],{"className":53351,"style":4839},[4739],[78,53353,19],{"className":53354},[4667,4678],[78,53356],{"className":53357,"style":4740},[4739],[78,53359,4609],{"className":53360},[4744],[78,53362],{"className":53363,"style":4740},[4739],[78,53365,53367,53370,53373,53376,53409,53412],{"className":53366},[4658],[78,53368],{"className":53369,"style":4663},[4662],[78,53371,52274],{"className":53372,"style":17251},[4667,4678],[78,53374,4594],{"className":53375},[4674],[78,53377,53379,53382],{"className":53378},[4667],[78,53380,19],{"className":53381},[4667,4678],[78,53383,53385],{"className":53384},[4689],[78,53386,53388],{"className":53387},[4693],[78,53389,53391],{"className":53390},[4698],[78,53392,53395],{"className":53393,"style":53394},[4702],"height:0.7144em;",[78,53396,53397,53400],{"style":5209},[78,53398],{"className":53399,"style":4711},[4710],[78,53401,53403],{"className":53402},[4715,4716,4717,4718],[78,53404,53406],{"className":53405},[4667,4718],[78,53407,52813],{"className":53408},[4667,4678,4718],[78,53410,4604],{"className":53411},[4682],[78,53413,2066],{"className":53414},[5126],[78,53416],{"className":53417},[4739,52940],[78,53419,53421,53424,53453,53456,53459],{"className":53420},[4658],[78,53422],{"className":53423,"style":53394},[4662],[78,53425,53427,53430],{"className":53426},[4667],[78,53428,19],{"className":53429},[4667,4678],[78,53431,53433],{"className":53432},[4689],[78,53434,53436],{"className":53435},[4693],[78,53437,53439],{"className":53438},[4698],[78,53440,53442],{"className":53441,"style":53394},[4702],[78,53443,53444,53447],{"style":5209},[78,53445],{"className":53446,"style":4711},[4710],[78,53448,53450],{"className":53449},[4715,4716,4717,4718],[78,53451,4598],{"className":53452},[4667,4678,4718],[78,53454],{"className":53455,"style":4740},[4739],[78,53457,4609],{"className":53458},[4744],[78,53460],{"className":53461,"style":4740},[4739],[78,53463,53465,53469,53472,53475,53514,53517,53520,53523,53552,53555,53558],{"className":53464},[4658],[78,53466],{"className":53467,"style":53468},[4662],"height:1.0713em;vertical-align:-0.25em;",[78,53470,52274],{"className":53471,"style":17251},[4667,4678],[78,53473,4594],{"className":53474},[4674],[78,53476,53478,53481],{"className":53477},[4667],[78,53479,19],{"className":53480},[4667,4678],[78,53482,53484],{"className":53483},[4689],[78,53485,53487],{"className":53486},[4693],[78,53488,53490],{"className":53489},[4698],[78,53491,53494],{"className":53492,"style":53493},[4702],"height:0.8213em;",[78,53495,53496,53499],{"style":5209},[78,53497],{"className":53498,"style":4711},[4710],[78,53500,53502],{"className":53501},[4715,4716,4717,4718],[78,53503,53505,53508,53511],{"className":53504},[4667,4718],[78,53506,4598],{"className":53507},[4667,4678,4718],[78,53509,7351],{"className":53510},[7450,4718],[78,53512,52813],{"className":53513},[4667,4678,4718],[78,53515,4604],{"className":53516},[4682],[78,53518,2066],{"className":53519},[5126],[78,53521],{"className":53522,"style":4839},[4739],[78,53524,53526,53529],{"className":53525},[4667],[78,53527,19],{"className":53528},[4667,4678],[78,53530,53532],{"className":53531},[4689],[78,53533,53535],{"className":53534},[4693],[78,53536,53538],{"className":53537},[4698],[78,53539,53541],{"className":53540,"style":53394},[4702],[78,53542,53543,53546],{"style":5209},[78,53544],{"className":53545,"style":4711},[4710],[78,53547,53549],{"className":53548},[4715,4716,4717,4718],[78,53550,4598],{"className":53551},[4667,4678,4718],[78,53553],{"className":53554,"style":4740},[4739],[78,53556,4609],{"className":53557},[4744],[78,53559],{"className":53560,"style":4740},[4739],[78,53562,53564,53567,53570,53573,53602,53605,53608,53637,53640,53643],{"className":53563},[4658],[78,53565],{"className":53566,"style":4663},[4662],[78,53568,52274],{"className":53569,"style":17251},[4667,4678],[78,53571,4594],{"className":53572},[4674],[78,53574,53576,53579],{"className":53575},[4667],[78,53577,472],{"className":53578},[4667],[78,53580,53582],{"className":53581},[4689],[78,53583,53585],{"className":53584},[4693],[78,53586,53588],{"className":53587},[4698],[78,53589,53591],{"className":53590,"style":53394},[4702],[78,53592,53593,53596],{"style":5209},[78,53594],{"className":53595,"style":4711},[4710],[78,53597,53599],{"className":53598},[4715,4716,4717,4718],[78,53600,19],{"className":53601},[4667,4678,4718],[78,53603,4604],{"className":53604},[4682],[78,53606,52204],{"className":53607},[4667,6184],[78,53609,53611,53614],{"className":53610},[4667],[78,53612,472],{"className":53613},[4667],[78,53615,53617],{"className":53616},[4689],[78,53618,53620],{"className":53619},[4693],[78,53621,53623],{"className":53622},[4698],[78,53624,53626],{"className":53625,"style":53394},[4702],[78,53627,53628,53631],{"style":5209},[78,53629],{"className":53630,"style":4711},[4710],[78,53632,53634],{"className":53633},[4715,4716,4717,4718],[78,53635,19],{"className":53636},[4667,4678,4718],[78,53638],{"className":53639,"style":4740},[4739],[78,53641,4609],{"className":53642},[4744],[78,53644],{"className":53645,"style":4740},[4739],[78,53647,53649,53652,53655,53658,53661,53665],{"className":53648},[4658],[78,53650],{"className":53651,"style":4663},[4662],[78,53653,52274],{"className":53654,"style":17251},[4667,4678],[78,53656,4594],{"className":53657},[4674],[78,53659,472],{"className":53660},[4667],[78,53662,53664],{"className":53663},[4682],"!)",[78,53666,53012],{"className":53667},[4667,6184],[13,53669,53670],{},"**总结：**常用上界关系就是通常所说的向上约分，需要注意的是常用上界关系定理中的转换公式，理解与学会转换诸如：",[78,53672,53674],{"className":53673},[4566],[78,53675,53677,53716],{"className":53676},[4570],[78,53678,53680],{"className":53679},[4574],[4576,53681,53682],{"xmlns":4578,"display":4579},[4581,53683,53684,53713],{},[4584,53685,53686,53696,53698,53700,53702,53704,53711],{},[4614,53687,53688,53694],{},[4584,53689,53690,53692],{},[4596,53691,52823],{},[4591,53693,17553],{},[7077,53695,22822],{},[4596,53697,19],{},[4591,53699,4609],{},[4596,53701,52274],{},[4591,53703,4594],{"stretchy":4593},[4614,53705,53706,53708],{},[4596,53707,19],{},[7077,53709,53710],{},"1.5",[4591,53712,4604],{"stretchy":4593},[4647,53714,53715],{"encoding":4649},"\\log^{20}n = O(n^{1.5})",[78,53717,53719,53776],{"className":53718,"ariaHidden":1419},[4654],[78,53720,53722,53726,53761,53764,53767,53770,53773],{"className":53721},[4658],[78,53723],{"className":53724,"style":53725},[4662],"height:1.0929em;vertical-align:-0.1944em;",[78,53727,53729,53734],{"className":53728},[4788],[78,53730,53050,53732],{"className":53731},[4788],[78,53733,43673],{"style":53053},[78,53735,53737],{"className":53736},[4689],[78,53738,53740],{"className":53739},[4693],[78,53741,53743],{"className":53742},[4698],[78,53744,53747],{"className":53745,"style":53746},[4702],"height:0.8984em;",[78,53748,53749,53752],{"style":53069},[78,53750],{"className":53751,"style":4711},[4710],[78,53753,53755],{"className":53754},[4715,4716,4717,4718],[78,53756,53758],{"className":53757},[4667,4718],[78,53759,22822],{"className":53760},[4667,4718],[78,53762],{"className":53763,"style":4839},[4739],[78,53765,19],{"className":53766},[4667,4678],[78,53768],{"className":53769,"style":4740},[4739],[78,53771,4609],{"className":53772},[4744],[78,53774],{"className":53775,"style":4740},[4739],[78,53777,53779,53783,53786,53789,53822],{"className":53778},[4658],[78,53780],{"className":53781,"style":53782},[4662],"height:1.1141em;vertical-align:-0.25em;",[78,53784,52274],{"className":53785,"style":17251},[4667,4678],[78,53787,4594],{"className":53788},[4674],[78,53790,53792,53795],{"className":53791},[4667],[78,53793,19],{"className":53794},[4667,4678],[78,53796,53798],{"className":53797},[4689],[78,53799,53801],{"className":53800},[4693],[78,53802,53804],{"className":53803},[4698],[78,53805,53808],{"className":53806,"style":53807},[4702],"height:0.8641em;",[78,53809,53810,53813],{"style":5209},[78,53811],{"className":53812,"style":4711},[4710],[78,53814,53816],{"className":53815},[4715,4716,4717,4718],[78,53817,53819],{"className":53818},[4667,4718],[78,53820,53710],{"className":53821},[4667,4718],[78,53823,4604],{"className":53824},[4682],[7759,53826,53828],{"id":53827},"渐进符号ω下界","渐进符号Ω（下界）",[10548,53830,53832],{"id":53831},"_1符号ω的定义","1、符号Ω的定义",[13,53834,53835],{},"f(n) = Ω(g(n))当且仅当存在正常数c和n0，使得当n ≥ n0时，有f(n) >= c * g(n)。",[10548,53837,53839],{"id":53838},"_2大ω比率定理","2、【大Ω比率定理】",[78,53841,53843],{"className":53842},[4566],[78,53844,53846,54008],{"className":53845},[4570],[78,53847,53849],{"className":53848},[4574],[4576,53850,53851],{"xmlns":4578,"display":4579},[4581,53852,53853,54005],{},[4584,53854,53855,53858,53860,53862,53864,53866,53868,53870,53872,53874,53876,53878,53896,53918,53920,53922,53924,53926,53928,53930,53933,53935,53937,53939,53941,53943,53945,53948,53950,53952,53954,53957,53975,53997,53999,54001,54003],{},[4587,53856,53857],{},"对于",[4596,53859,5053],{},[4591,53861,4594],{"stretchy":4593},[4596,53863,19],{},[4591,53865,4604],{"stretchy":4593},[4587,53867,52204],{},[4596,53869,43673],{},[4591,53871,4594],{"stretchy":4593},[4596,53873,19],{},[4591,53875,4604],{"stretchy":4593},[4587,53877,52215],{},[4628,53879,53880,53886],{},[4584,53881,53882,53884],{},[4596,53883,52222],{},[4591,53885,17553],{},[4584,53887,53888,53890,53892,53894],{},[4596,53889,19],{},[4591,53891,52231],{},[4591,53893,7351],{},[4596,53895,52236],{"mathvariant":7101},[4611,53897,53898,53908],{},[4584,53899,53900,53902,53904,53906],{},[4596,53901,43673],{},[4591,53903,4594],{"stretchy":4593},[4596,53905,19],{},[4591,53907,4604],{"stretchy":4593},[4584,53909,53910,53912,53914,53916],{},[4596,53911,5053],{},[4591,53913,4594],{"stretchy":4593},[4596,53915,19],{},[4591,53917,4604],{"stretchy":4593},[4587,53919,52261],{},[4596,53921,5053],{},[4591,53923,4594],{"stretchy":4593},[4596,53925,19],{},[4591,53927,4604],{"stretchy":4593},[4591,53929,4609],{},[4596,53931,53932],{"mathvariant":7101},"Ω",[4591,53934,4594],{"stretchy":4593},[4596,53936,43673],{},[4591,53938,4594],{"stretchy":4593},[4596,53940,19],{},[4591,53942,4604],{"stretchy":4593},[4591,53944,4604],{"stretchy":4593},[4587,53946,53947],{},"当且仅当存在",[4596,53949,7360],{},[4591,53951,52294],{},[7077,53953,2949],{},[4587,53955,53956],{},"，使得",[4628,53958,53959,53965],{},[4584,53960,53961,53963],{},[4596,53962,52222],{},[4591,53964,17553],{},[4584,53966,53967,53969,53971,53973],{},[4596,53968,19],{},[4591,53970,52231],{},[4591,53972,7351],{},[4596,53974,52236],{"mathvariant":7101},[4611,53976,53977,53987],{},[4584,53978,53979,53981,53983,53985],{},[4596,53980,43673],{},[4591,53982,4594],{"stretchy":4593},[4596,53984,19],{},[4591,53986,4604],{"stretchy":4593},[4584,53988,53989,53991,53993,53995],{},[4596,53990,5053],{},[4591,53992,4594],{"stretchy":4593},[4596,53994,19],{},[4591,53996,4604],{"stretchy":4593},[4591,53998,41631],{},[4591,54000,4609],{},[4596,54002,7360],{},[4587,54004,67],{},[4647,54006,54007],{"encoding":4649},"对于f(n)和g(n)，如果\\lim_{n\\rightarrow + \\infty}\\frac{g(n)}{f(n)}存在，则f(n) = Ω(g(n))当且仅当存在c > 0，使得\\lim_{n\\rightarrow + \\infty}\\frac{g(n)}{f(n)} \u003C= c。",[78,54009,54011,54216,54255,54419],{"className":54010,"ariaHidden":1419},[4654],[78,54012,54014,54017,54020,54023,54026,54029,54032,54035,54038,54041,54044,54047,54050,54053,54109,54112,54192,54195,54198,54201,54204,54207,54210,54213],{"className":54013},[4658],[78,54015],{"className":54016,"style":52361},[4662],[78,54018,53857],{"className":54019},[4667,6184],[78,54021,5053],{"className":54022,"style":5170},[4667,4678],[78,54024,4594],{"className":54025},[4674],[78,54027,19],{"className":54028},[4667,4678],[78,54030,4604],{"className":54031},[4682],[78,54033,52204],{"className":54034},[4667,6184],[78,54036,43673],{"className":54037,"style":5187},[4667,4678],[78,54039,4594],{"className":54040},[4674],[78,54042,19],{"className":54043},[4667,4678],[78,54045,4604],{"className":54046},[4682],[78,54048,52215],{"className":54049},[4667,6184],[78,54051],{"className":54052,"style":4839},[4739],[78,54054,54056],{"className":54055},[4788,52401],[78,54057,54059,54101],{"className":54058},[4693,4694],[78,54060,54062,54098],{"className":54061},[4698],[78,54063,54065,54088],{"className":54064,"style":16794},[4702],[78,54066,54067,54070],{"style":52413},[78,54068],{"className":54069,"style":4781},[4710],[78,54071,54073],{"className":54072},[4715,4716,4717,4718],[78,54074,54076,54079,54082,54085],{"className":54075},[4667,4718],[78,54077,19],{"className":54078},[4667,4678,4718],[78,54080,52231],{"className":54081},[4744,4718],[78,54083,7351],{"className":54084},[4667,4718],[78,54086,52236],{"className":54087},[4667,4718],[78,54089,54090,54093],{"style":5824},[78,54091],{"className":54092,"style":4781},[4710],[78,54094,54095],{},[78,54096,52222],{"className":54097},[4788],[78,54099,4726],{"className":54100},[4725],[78,54102,54104],{"className":54103},[4698],[78,54105,54107],{"className":54106,"style":52454},[4702],[78,54108],{},[78,54110],{"className":54111,"style":4839},[4739],[78,54113,54115,54118,54189],{"className":54114},[4667],[78,54116],{"className":54117},[4674,4761],[78,54119,54121],{"className":54120},[4611],[78,54122,54124,54181],{"className":54123},[4693,4694],[78,54125,54127,54178],{"className":54126},[4698],[78,54128,54130,54150,54158],{"className":54129,"style":52478},[4702],[78,54131,54132,54135],{"style":4777},[78,54133],{"className":54134,"style":4781},[4710],[78,54136,54138,54141,54144,54147],{"className":54137},[4667],[78,54139,5053],{"className":54140,"style":5170},[4667,4678],[78,54142,4594],{"className":54143},[4674],[78,54145,19],{"className":54146},[4667,4678],[78,54148,4604],{"className":54149},[4682],[78,54151,54152,54155],{"style":4919},[78,54153],{"className":54154,"style":4781},[4710],[78,54156],{"className":54157,"style":4927},[4926],[78,54159,54160,54163],{"style":4930},[78,54161],{"className":54162,"style":4781},[4710],[78,54164,54166,54169,54172,54175],{"className":54165},[4667],[78,54167,43673],{"className":54168,"style":5187},[4667,4678],[78,54170,4594],{"className":54171},[4674],[78,54173,19],{"className":54174},[4667,4678],[78,54176,4604],{"className":54177},[4682],[78,54179,4726],{"className":54180},[4725],[78,54182,54184],{"className":54183},[4698],[78,54185,54187],{"className":54186,"style":17380},[4702],[78,54188],{},[78,54190],{"className":54191},[4682,4761],[78,54193,52261],{"className":54194},[4667,6184],[78,54196,5053],{"className":54197,"style":5170},[4667,4678],[78,54199,4594],{"className":54200},[4674],[78,54202,19],{"className":54203},[4667,4678],[78,54205,4604],{"className":54206},[4682],[78,54208],{"className":54209,"style":4740},[4739],[78,54211,4609],{"className":54212},[4744],[78,54214],{"className":54215,"style":4740},[4739],[78,54217,54219,54222,54225,54228,54231,54234,54237,54240,54243,54246,54249,54252],{"className":54218},[4658],[78,54220],{"className":54221,"style":4663},[4662],[78,54223,53932],{"className":54224},[4667],[78,54226,4594],{"className":54227},[4674],[78,54229,43673],{"className":54230,"style":5187},[4667,4678],[78,54232,4594],{"className":54233},[4674],[78,54235,19],{"className":54236},[4667,4678],[78,54238,38757],{"className":54239},[4682],[78,54241,53947],{"className":54242},[4667,6184],[78,54244,7360],{"className":54245},[4667,4678],[78,54247],{"className":54248,"style":4740},[4739],[78,54250,52294],{"className":54251},[4744],[78,54253],{"className":54254,"style":4740},[4739],[78,54256,54258,54261,54264,54267,54270,54326,54329,54409,54412,54416],{"className":54257},[4658],[78,54259],{"className":54260,"style":52361},[4662],[78,54262,2949],{"className":54263},[4667],[78,54265,53956],{"className":54266},[4667,6184],[78,54268],{"className":54269,"style":4839},[4739],[78,54271,54273],{"className":54272},[4788,52401],[78,54274,54276,54318],{"className":54275},[4693,4694],[78,54277,54279,54315],{"className":54278},[4698],[78,54280,54282,54305],{"className":54281,"style":16794},[4702],[78,54283,54284,54287],{"style":52413},[78,54285],{"className":54286,"style":4781},[4710],[78,54288,54290],{"className":54289},[4715,4716,4717,4718],[78,54291,54293,54296,54299,54302],{"className":54292},[4667,4718],[78,54294,19],{"className":54295},[4667,4678,4718],[78,54297,52231],{"className":54298},[4744,4718],[78,54300,7351],{"className":54301},[4667,4718],[78,54303,52236],{"className":54304},[4667,4718],[78,54306,54307,54310],{"style":5824},[78,54308],{"className":54309,"style":4781},[4710],[78,54311,54312],{},[78,54313,52222],{"className":54314},[4788],[78,54316,4726],{"className":54317},[4725],[78,54319,54321],{"className":54320},[4698],[78,54322,54324],{"className":54323,"style":52454},[4702],[78,54325],{},[78,54327],{"className":54328,"style":4839},[4739],[78,54330,54332,54335,54406],{"className":54331},[4667],[78,54333],{"className":54334},[4674,4761],[78,54336,54338],{"className":54337},[4611],[78,54339,54341,54398],{"className":54340},[4693,4694],[78,54342,54344,54395],{"className":54343},[4698],[78,54345,54347,54367,54375],{"className":54346,"style":52478},[4702],[78,54348,54349,54352],{"style":4777},[78,54350],{"className":54351,"style":4781},[4710],[78,54353,54355,54358,54361,54364],{"className":54354},[4667],[78,54356,5053],{"className":54357,"style":5170},[4667,4678],[78,54359,4594],{"className":54360},[4674],[78,54362,19],{"className":54363},[4667,4678],[78,54365,4604],{"className":54366},[4682],[78,54368,54369,54372],{"style":4919},[78,54370],{"className":54371,"style":4781},[4710],[78,54373],{"className":54374,"style":4927},[4926],[78,54376,54377,54380],{"style":4930},[78,54378],{"className":54379,"style":4781},[4710],[78,54381,54383,54386,54389,54392],{"className":54382},[4667],[78,54384,43673],{"className":54385,"style":5187},[4667,4678],[78,54387,4594],{"className":54388},[4674],[78,54390,19],{"className":54391},[4667,4678],[78,54393,4604],{"className":54394},[4682],[78,54396,4726],{"className":54397},[4725],[78,54399,54401],{"className":54400},[4698],[78,54402,54404],{"className":54403,"style":17380},[4702],[78,54405],{},[78,54407],{"className":54408},[4682,4761],[78,54410],{"className":54411,"style":4740},[4739],[78,54413,54415],{"className":54414},[4744],"\u003C=",[78,54417],{"className":54418,"style":4740},[4739],[78,54420,54422,54425,54428],{"className":54421},[4658],[78,54423],{"className":54424,"style":18224},[4662],[78,54426,7360],{"className":54427},[4667,4678],[78,54429,67],{"className":54430},[4667,6184],[7759,54432,54434],{"id":54433},"渐进符号θ双界","渐进符号Θ（双界）",[10548,54436,54438],{"id":54437},"_1符号θ的定义","1、符号Θ的定义",[13,54440,54441],{},"f(n) = Θ(g(n))当且仅当存在正常数c1，c2和n0，使得当n >= n0时，有c1 * g(n) \u003C= f(n) \u003C= c2 * g(n)。",[10548,54443,54445],{"id":54444},"_2大θ比率定理","2、【大Θ比率定理】",[78,54447,54449],{"className":54448},[4566],[78,54450,54452,54716],{"className":54451},[4570],[78,54453,54455],{"className":54454},[4574],[4576,54456,54457],{"xmlns":4578,"display":4579},[4581,54458,54459,54713],{},[4584,54460,54461,54463,54465,54467,54469,54471,54473,54475,54477,54479,54481,54483,54501,54523,54526,54544,54566,54569,54571,54573,54575,54577,54579,54582,54584,54586,54588,54590,54592,54594,54597,54599,54601,54603,54605,54607,54609,54611,54613,54631,54653,54655,54657,54659,54661,54663,54681,54703,54705,54707,54709,54711],{},[4587,54462,52193],{},[4596,54464,5053],{},[4591,54466,4594],{"stretchy":4593},[4596,54468,19],{},[4591,54470,4604],{"stretchy":4593},[4587,54472,52204],{},[4596,54474,43673],{},[4591,54476,4594],{"stretchy":4593},[4596,54478,19],{},[4591,54480,4604],{"stretchy":4593},[4587,54482,52215],{},[4628,54484,54485,54491],{},[4584,54486,54487,54489],{},[4596,54488,52222],{},[4591,54490,17553],{},[4584,54492,54493,54495,54497,54499],{},[4596,54494,19],{},[4591,54496,52231],{},[4591,54498,7351],{},[4596,54500,52236],{"mathvariant":7101},[4611,54502,54503,54513],{},[4584,54504,54505,54507,54509,54511],{},[4596,54506,5053],{},[4591,54508,4594],{"stretchy":4593},[4596,54510,19],{},[4591,54512,4604],{"stretchy":4593},[4584,54514,54515,54517,54519,54521],{},[4596,54516,43673],{},[4591,54518,4594],{"stretchy":4593},[4596,54520,19],{},[4591,54522,4604],{"stretchy":4593},[4587,54524,54525],{},"与",[4628,54527,54528,54534],{},[4584,54529,54530,54532],{},[4596,54531,52222],{},[4591,54533,17553],{},[4584,54535,54536,54538,54540,54542],{},[4596,54537,19],{},[4591,54539,52231],{},[4591,54541,7351],{},[4596,54543,52236],{"mathvariant":7101},[4611,54545,54546,54556],{},[4584,54547,54548,54550,54552,54554],{},[4596,54549,43673],{},[4591,54551,4594],{"stretchy":4593},[4596,54553,19],{},[4591,54555,4604],{"stretchy":4593},[4584,54557,54558,54560,54562,54564],{},[4596,54559,5053],{},[4591,54561,4594],{"stretchy":4593},[4596,54563,19],{},[4591,54565,4604],{"stretchy":4593},[4587,54567,54568],{},"都存在，则",[4596,54570,5053],{},[4591,54572,4594],{"stretchy":4593},[4596,54574,19],{},[4591,54576,4604],{"stretchy":4593},[4591,54578,4609],{},[4596,54580,54581],{"mathvariant":7101},"Θ",[4591,54583,4594],{"stretchy":4593},[4596,54585,43673],{},[4591,54587,4594],{"stretchy":4593},[4596,54589,19],{},[4591,54591,4604],{"stretchy":4593},[4591,54593,4604],{"stretchy":4593},[4587,54595,54596],{},"当且仅当存在正常数",[4596,54598,7360],{},[7077,54600,469],{},[4587,54602,52816],{},[4596,54604,7360],{},[7077,54606,472],{},[4587,54608,52816],{},[4739,54610],{"linebreak":52940},[4587,54612,52301],{},[4628,54614,54615,54621],{},[4584,54616,54617,54619],{},[4596,54618,52222],{},[4591,54620,17553],{},[4584,54622,54623,54625,54627,54629],{},[4596,54624,19],{},[4591,54626,52231],{},[4591,54628,7351],{},[4596,54630,52236],{"mathvariant":7101},[4611,54632,54633,54643],{},[4584,54634,54635,54637,54639,54641],{},[4596,54636,43673],{},[4591,54638,4594],{"stretchy":4593},[4596,54640,19],{},[4591,54642,4604],{"stretchy":4593},[4584,54644,54645,54647,54649,54651],{},[4596,54646,5053],{},[4591,54648,4594],{"stretchy":4593},[4596,54650,19],{},[4591,54652,4604],{"stretchy":4593},[4591,54654,41631],{},[4591,54656,4609],{},[4596,54658,7360],{},[7077,54660,469],{},[4591,54662,2066],{"separator":1419},[4628,54664,54665,54671],{},[4584,54666,54667,54669],{},[4596,54668,52222],{},[4591,54670,17553],{},[4584,54672,54673,54675,54677,54679],{},[4596,54674,19],{},[4591,54676,52231],{},[4591,54678,7351],{},[4596,54680,52236],{"mathvariant":7101},[4611,54682,54683,54693],{},[4584,54684,54685,54687,54689,54691],{},[4596,54686,5053],{},[4591,54688,4594],{"stretchy":4593},[4596,54690,19],{},[4591,54692,4604],{"stretchy":4593},[4584,54694,54695,54697,54699,54701],{},[4596,54696,43673],{},[4591,54698,4594],{"stretchy":4593},[4596,54700,19],{},[4591,54702,4604],{"stretchy":4593},[4591,54704,41631],{},[4591,54706,4609],{},[4596,54708,7360],{},[7077,54710,472],{},[4587,54712,67],{},[4647,54714,54715],{"encoding":4649},"对于函数f(n)和g(n)，如果\\lim_{n\\rightarrow + \\infty}\\frac{f(n)}{g(n)}与\\lim_{n\\rightarrow + \\infty}\\frac{g(n)}{f(n)}都存在，则f(n) = Θ(g(n))当且仅当存在正常数c1，c2，\\\\\n使得\\lim_{n\\rightarrow + \\infty}\\frac{g(n)}{f(n)} \u003C= c1, \\lim_{n\\rightarrow + \\infty}\\frac{f(n)}{g(n)} \u003C= c2。",[78,54717,54719,55069,55114,55117,55277,55443],{"className":54718,"ariaHidden":1419},[4654],[78,54720,54722,54725,54728,54731,54734,54737,54740,54743,54746,54749,54752,54755,54758,54761,54817,54820,54900,54903,54906,54962,54965,55045,55048,55051,55054,55057,55060,55063,55066],{"className":54721},[4658],[78,54723],{"className":54724,"style":52361},[4662],[78,54726,52193],{"className":54727},[4667,6184],[78,54729,5053],{"className":54730,"style":5170},[4667,4678],[78,54732,4594],{"className":54733},[4674],[78,54735,19],{"className":54736},[4667,4678],[78,54738,4604],{"className":54739},[4682],[78,54741,52204],{"className":54742},[4667,6184],[78,54744,43673],{"className":54745,"style":5187},[4667,4678],[78,54747,4594],{"className":54748},[4674],[78,54750,19],{"className":54751},[4667,4678],[78,54753,4604],{"className":54754},[4682],[78,54756,52215],{"className":54757},[4667,6184],[78,54759],{"className":54760,"style":4839},[4739],[78,54762,54764],{"className":54763},[4788,52401],[78,54765,54767,54809],{"className":54766},[4693,4694],[78,54768,54770,54806],{"className":54769},[4698],[78,54771,54773,54796],{"className":54772,"style":16794},[4702],[78,54774,54775,54778],{"style":52413},[78,54776],{"className":54777,"style":4781},[4710],[78,54779,54781],{"className":54780},[4715,4716,4717,4718],[78,54782,54784,54787,54790,54793],{"className":54783},[4667,4718],[78,54785,19],{"className":54786},[4667,4678,4718],[78,54788,52231],{"className":54789},[4744,4718],[78,54791,7351],{"className":54792},[4667,4718],[78,54794,52236],{"className":54795},[4667,4718],[78,54797,54798,54801],{"style":5824},[78,54799],{"className":54800,"style":4781},[4710],[78,54802,54803],{},[78,54804,52222],{"className":54805},[4788],[78,54807,4726],{"className":54808},[4725],[78,54810,54812],{"className":54811},[4698],[78,54813,54815],{"className":54814,"style":52454},[4702],[78,54816],{},[78,54818],{"className":54819,"style":4839},[4739],[78,54821,54823,54826,54897],{"className":54822},[4667],[78,54824],{"className":54825},[4674,4761],[78,54827,54829],{"className":54828},[4611],[78,54830,54832,54889],{"className":54831},[4693,4694],[78,54833,54835,54886],{"className":54834},[4698],[78,54836,54838,54858,54866],{"className":54837,"style":52478},[4702],[78,54839,54840,54843],{"style":4777},[78,54841],{"className":54842,"style":4781},[4710],[78,54844,54846,54849,54852,54855],{"className":54845},[4667],[78,54847,43673],{"className":54848,"style":5187},[4667,4678],[78,54850,4594],{"className":54851},[4674],[78,54853,19],{"className":54854},[4667,4678],[78,54856,4604],{"className":54857},[4682],[78,54859,54860,54863],{"style":4919},[78,54861],{"className":54862,"style":4781},[4710],[78,54864],{"className":54865,"style":4927},[4926],[78,54867,54868,54871],{"style":4930},[78,54869],{"className":54870,"style":4781},[4710],[78,54872,54874,54877,54880,54883],{"className":54873},[4667],[78,54875,5053],{"className":54876,"style":5170},[4667,4678],[78,54878,4594],{"className":54879},[4674],[78,54881,19],{"className":54882},[4667,4678],[78,54884,4604],{"className":54885},[4682],[78,54887,4726],{"className":54888},[4725],[78,54890,54892],{"className":54891},[4698],[78,54893,54895],{"className":54894,"style":17380},[4702],[78,54896],{},[78,54898],{"className":54899},[4682,4761],[78,54901,54525],{"className":54902},[4667,6184],[78,54904],{"className":54905,"style":4839},[4739],[78,54907,54909],{"className":54908},[4788,52401],[78,54910,54912,54954],{"className":54911},[4693,4694],[78,54913,54915,54951],{"className":54914},[4698],[78,54916,54918,54941],{"className":54917,"style":16794},[4702],[78,54919,54920,54923],{"style":52413},[78,54921],{"className":54922,"style":4781},[4710],[78,54924,54926],{"className":54925},[4715,4716,4717,4718],[78,54927,54929,54932,54935,54938],{"className":54928},[4667,4718],[78,54930,19],{"className":54931},[4667,4678,4718],[78,54933,52231],{"className":54934},[4744,4718],[78,54936,7351],{"className":54937},[4667,4718],[78,54939,52236],{"className":54940},[4667,4718],[78,54942,54943,54946],{"style":5824},[78,54944],{"className":54945,"style":4781},[4710],[78,54947,54948],{},[78,54949,52222],{"className":54950},[4788],[78,54952,4726],{"className":54953},[4725],[78,54955,54957],{"className":54956},[4698],[78,54958,54960],{"className":54959,"style":52454},[4702],[78,54961],{},[78,54963],{"className":54964,"style":4839},[4739],[78,54966,54968,54971,55042],{"className":54967},[4667],[78,54969],{"className":54970},[4674,4761],[78,54972,54974],{"className":54973},[4611],[78,54975,54977,55034],{"className":54976},[4693,4694],[78,54978,54980,55031],{"className":54979},[4698],[78,54981,54983,55003,55011],{"className":54982,"style":52478},[4702],[78,54984,54985,54988],{"style":4777},[78,54986],{"className":54987,"style":4781},[4710],[78,54989,54991,54994,54997,55000],{"className":54990},[4667],[78,54992,5053],{"className":54993,"style":5170},[4667,4678],[78,54995,4594],{"className":54996},[4674],[78,54998,19],{"className":54999},[4667,4678],[78,55001,4604],{"className":55002},[4682],[78,55004,55005,55008],{"style":4919},[78,55006],{"className":55007,"style":4781},[4710],[78,55009],{"className":55010,"style":4927},[4926],[78,55012,55013,55016],{"style":4930},[78,55014],{"className":55015,"style":4781},[4710],[78,55017,55019,55022,55025,55028],{"className":55018},[4667],[78,55020,43673],{"className":55021,"style":5187},[4667,4678],[78,55023,4594],{"className":55024},[4674],[78,55026,19],{"className":55027},[4667,4678],[78,55029,4604],{"className":55030},[4682],[78,55032,4726],{"className":55033},[4725],[78,55035,55037],{"className":55036},[4698],[78,55038,55040],{"className":55039,"style":17380},[4702],[78,55041],{},[78,55043],{"className":55044},[4682,4761],[78,55046,54568],{"className":55047},[4667,6184],[78,55049,5053],{"className":55050,"style":5170},[4667,4678],[78,55052,4594],{"className":55053},[4674],[78,55055,19],{"className":55056},[4667,4678],[78,55058,4604],{"className":55059},[4682],[78,55061],{"className":55062,"style":4740},[4739],[78,55064,4609],{"className":55065},[4744],[78,55067],{"className":55068,"style":4740},[4739],[78,55070,55072,55075,55078,55081,55084,55087,55090,55093,55096,55099,55102,55105,55108,55111],{"className":55071},[4658],[78,55073],{"className":55074,"style":4663},[4662],[78,55076,54581],{"className":55077},[4667],[78,55079,4594],{"className":55080},[4674],[78,55082,43673],{"className":55083,"style":5187},[4667,4678],[78,55085,4594],{"className":55086},[4674],[78,55088,19],{"className":55089},[4667,4678],[78,55091,38757],{"className":55092},[4682],[78,55094,54596],{"className":55095},[4667,6184],[78,55097,7360],{"className":55098},[4667,4678],[78,55100,469],{"className":55101},[4667],[78,55103,52816],{"className":55104},[4667,6184],[78,55106,7360],{"className":55107},[4667,4678],[78,55109,472],{"className":55110},[4667],[78,55112,52816],{"className":55113},[4667,6184],[78,55115],{"className":55116},[4739,52940],[78,55118,55120,55123,55126,55129,55185,55188,55268,55271,55274],{"className":55119},[4658],[78,55121],{"className":55122,"style":52361},[4662],[78,55124,52301],{"className":55125},[4667,6184],[78,55127],{"className":55128,"style":4839},[4739],[78,55130,55132],{"className":55131},[4788,52401],[78,55133,55135,55177],{"className":55134},[4693,4694],[78,55136,55138,55174],{"className":55137},[4698],[78,55139,55141,55164],{"className":55140,"style":16794},[4702],[78,55142,55143,55146],{"style":52413},[78,55144],{"className":55145,"style":4781},[4710],[78,55147,55149],{"className":55148},[4715,4716,4717,4718],[78,55150,55152,55155,55158,55161],{"className":55151},[4667,4718],[78,55153,19],{"className":55154},[4667,4678,4718],[78,55156,52231],{"className":55157},[4744,4718],[78,55159,7351],{"className":55160},[4667,4718],[78,55162,52236],{"className":55163},[4667,4718],[78,55165,55166,55169],{"style":5824},[78,55167],{"className":55168,"style":4781},[4710],[78,55170,55171],{},[78,55172,52222],{"className":55173},[4788],[78,55175,4726],{"className":55176},[4725],[78,55178,55180],{"className":55179},[4698],[78,55181,55183],{"className":55182,"style":52454},[4702],[78,55184],{},[78,55186],{"className":55187,"style":4839},[4739],[78,55189,55191,55194,55265],{"className":55190},[4667],[78,55192],{"className":55193},[4674,4761],[78,55195,55197],{"className":55196},[4611],[78,55198,55200,55257],{"className":55199},[4693,4694],[78,55201,55203,55254],{"className":55202},[4698],[78,55204,55206,55226,55234],{"className":55205,"style":52478},[4702],[78,55207,55208,55211],{"style":4777},[78,55209],{"className":55210,"style":4781},[4710],[78,55212,55214,55217,55220,55223],{"className":55213},[4667],[78,55215,5053],{"className":55216,"style":5170},[4667,4678],[78,55218,4594],{"className":55219},[4674],[78,55221,19],{"className":55222},[4667,4678],[78,55224,4604],{"className":55225},[4682],[78,55227,55228,55231],{"style":4919},[78,55229],{"className":55230,"style":4781},[4710],[78,55232],{"className":55233,"style":4927},[4926],[78,55235,55236,55239],{"style":4930},[78,55237],{"className":55238,"style":4781},[4710],[78,55240,55242,55245,55248,55251],{"className":55241},[4667],[78,55243,43673],{"className":55244,"style":5187},[4667,4678],[78,55246,4594],{"className":55247},[4674],[78,55249,19],{"className":55250},[4667,4678],[78,55252,4604],{"className":55253},[4682],[78,55255,4726],{"className":55256},[4725],[78,55258,55260],{"className":55259},[4698],[78,55261,55263],{"className":55262,"style":17380},[4702],[78,55264],{},[78,55266],{"className":55267},[4682,4761],[78,55269],{"className":55270,"style":4740},[4739],[78,55272,54415],{"className":55273},[4744],[78,55275],{"className":55276,"style":4740},[4739],[78,55278,55280,55283,55286,55289,55292,55295,55351,55354,55434,55437,55440],{"className":55279},[4658],[78,55281],{"className":55282,"style":52361},[4662],[78,55284,7360],{"className":55285},[4667,4678],[78,55287,469],{"className":55288},[4667],[78,55290,2066],{"className":55291},[5126],[78,55293],{"className":55294,"style":4839},[4739],[78,55296,55298],{"className":55297},[4788,52401],[78,55299,55301,55343],{"className":55300},[4693,4694],[78,55302,55304,55340],{"className":55303},[4698],[78,55305,55307,55330],{"className":55306,"style":16794},[4702],[78,55308,55309,55312],{"style":52413},[78,55310],{"className":55311,"style":4781},[4710],[78,55313,55315],{"className":55314},[4715,4716,4717,4718],[78,55316,55318,55321,55324,55327],{"className":55317},[4667,4718],[78,55319,19],{"className":55320},[4667,4678,4718],[78,55322,52231],{"className":55323},[4744,4718],[78,55325,7351],{"className":55326},[4667,4718],[78,55328,52236],{"className":55329},[4667,4718],[78,55331,55332,55335],{"style":5824},[78,55333],{"className":55334,"style":4781},[4710],[78,55336,55337],{},[78,55338,52222],{"className":55339},[4788],[78,55341,4726],{"className":55342},[4725],[78,55344,55346],{"className":55345},[4698],[78,55347,55349],{"className":55348,"style":52454},[4702],[78,55350],{},[78,55352],{"className":55353,"style":4839},[4739],[78,55355,55357,55360,55431],{"className":55356},[4667],[78,55358],{"className":55359},[4674,4761],[78,55361,55363],{"className":55362},[4611],[78,55364,55366,55423],{"className":55365},[4693,4694],[78,55367,55369,55420],{"className":55368},[4698],[78,55370,55372,55392,55400],{"className":55371,"style":52478},[4702],[78,55373,55374,55377],{"style":4777},[78,55375],{"className":55376,"style":4781},[4710],[78,55378,55380,55383,55386,55389],{"className":55379},[4667],[78,55381,43673],{"className":55382,"style":5187},[4667,4678],[78,55384,4594],{"className":55385},[4674],[78,55387,19],{"className":55388},[4667,4678],[78,55390,4604],{"className":55391},[4682],[78,55393,55394,55397],{"style":4919},[78,55395],{"className":55396,"style":4781},[4710],[78,55398],{"className":55399,"style":4927},[4926],[78,55401,55402,55405],{"style":4930},[78,55403],{"className":55404,"style":4781},[4710],[78,55406,55408,55411,55414,55417],{"className":55407},[4667],[78,55409,5053],{"className":55410,"style":5170},[4667,4678],[78,55412,4594],{"className":55413},[4674],[78,55415,19],{"className":55416},[4667,4678],[78,55418,4604],{"className":55419},[4682],[78,55421,4726],{"className":55422},[4725],[78,55424,55426],{"className":55425},[4698],[78,55427,55429],{"className":55428,"style":17380},[4702],[78,55430],{},[78,55432],{"className":55433},[4682,4761],[78,55435],{"className":55436,"style":4740},[4739],[78,55438,54415],{"className":55439},[4744],[78,55441],{"className":55442,"style":4740},[4739],[78,55444,55446,55449,55452,55455],{"className":55445},[4658],[78,55447],{"className":55448,"style":18224},[4662],[78,55450,7360],{"className":55451},[4667,4678],[78,55453,472],{"className":55454},[4667],[78,55456,67],{"className":55457},[4667,6184],[49,55459,55460],{},[52,55461,55462],{},"大Θ比率定理是大O比率定理与大Ω比率定理的结合。",[7759,55464,55466],{"id":55465},"简化master定理考点","简化Master定理【考点】",[10548,55468,55470],{"id":55469},"_1定理适用范围","1、定理适用范围",[13,55472,55473,55474,55477],{},"当a > 0, b > 1, α >= 0时，对于形如T(n) = aT(n \u002F b) + X(n ^ α)（其中，X代表O、Ω、Θ之一，n \u002F b可以理解为",[78,55475,55476],{},"n \u002F b","【这里无法描述】）的递归函数，可以使用简化Master定理找到他们的渐进函数。",[10548,55479,55481],{"id":55480},"_2简化master定理","2、简化Master定理",[78,55483,55485],{"className":55484},[4566],[78,55486,55488,55751],{"className":55487},[4570],[78,55489,55491],{"className":55490},[4574],[4576,55492,55493],{"xmlns":4578,"display":4579},[4581,55494,55495,55748],{},[4584,55496,55497,55500,55502,55504,55506,55508,55510,55512,55514,55516,55519,55521,55523,55525,55528,55530,55532,55534,55536,55538,55540,55542,55544,55546,55548,55550,55552,55554,55557,55559,55565,55567,55569,55571,55574,55576,55578,55580,55582,55584,55587,55589,55592,55594,55596,55598,55600,55602,55604],{},[4587,55498,55499],{},"当",[4596,55501,5009],{},[4591,55503,52294],{},[7077,55505,2949],{},[4591,55507,2066],{"separator":1419},[4596,55509,12172],{},[4591,55511,52294],{},[7077,55513,469],{},[4591,55515,2066],{"separator":1419},[4596,55517,55518],{},"α",[4591,55520,52294],{},[4591,55522,4609],{},[7077,55524,2949],{},[4587,55526,55527],{},"时，递归函数",[4596,55529,5074],{},[4591,55531,4594],{"stretchy":4593},[4596,55533,19],{},[4591,55535,4604],{"stretchy":4593},[4591,55537,4609],{},[4596,55539,5009],{},[4596,55541,5074],{},[4591,55543,4594],{"stretchy":4593},[4596,55545,19],{},[4596,55547,7102],{"mathvariant":7101},[4596,55549,12172],{},[4591,55551,4604],{"stretchy":4593},[4591,55553,7351],{},[4596,55555,55556],{},"X",[4591,55558,4594],{"stretchy":4593},[4614,55560,55561,55563],{},[4596,55562,19],{},[4596,55564,55518],{},[4591,55566,4604],{"stretchy":4593},[4591,55568,4594],{"stretchy":4593},[4596,55570,55556],{},[4587,55572,55573],{},"代表",[4596,55575,52274],{},[4587,55577,1011],{},[4596,55579,53932],{"mathvariant":7101},[4587,55581,1011],{},[4596,55583,54581],{"mathvariant":7101},[4587,55585,55586],{},"之一",[4591,55588,4604],{"stretchy":4593},[4587,55590,55591],{},"的渐进函数为",[4739,55593],{"linebreak":52940},[4596,55595,5074],{},[4591,55597,4594],{"stretchy":4593},[4596,55599,19],{},[4591,55601,4604],{"stretchy":4593},[4591,55603,4609],{},[4584,55605,55606,55609],{},[4591,55607,55608],{"fence":1419},"{",[37085,55610,55614,55664,55710],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},"0.36em","left left","1em",[37091,55615,55616],{},[37094,55617,55618],{},[37101,55619,55620],{"scriptlevel":2949,"displaystyle":4593},[4584,55621,55622,55624,55626,55644,55646,55648,55650,55652,55662],{},[4596,55623,55556],{},[4591,55625,4594],{"stretchy":4593},[4614,55627,55628,55630],{},[4596,55629,19],{},[4584,55631,55632,55642],{},[4600,55633,55634,55640],{},[4584,55635,55636,55638],{},[4596,55637,52823],{},[4591,55639,17553],{},[4596,55641,12172],{},[4596,55643,5009],{},[4591,55645,4604],{"stretchy":4593},[4591,55647,2066],{"separator":1419},[4596,55649,55518],{},[4591,55651,41631],{},[4600,55653,55654,55660],{},[4584,55655,55656,55658],{},[4596,55657,52823],{},[4591,55659,17553],{},[4596,55661,12172],{},[4596,55663,5009],{},[37091,55665,55666],{},[37094,55667,55668],{},[37101,55669,55670],{"scriptlevel":2949,"displaystyle":4593},[4584,55671,55672,55674,55676,55682,55684,55686,55688,55690,55692,55694,55696,55698,55708],{},[4596,55673,55556],{},[4591,55675,4594],{"stretchy":4593},[4614,55677,55678,55680],{},[4596,55679,19],{},[4596,55681,55518],{},[4596,55683,7132],{},[4596,55685,5025],{},[4596,55687,43673],{},[4596,55689,19],{},[4591,55691,4604],{"stretchy":4593},[4591,55693,2066],{"separator":1419},[4596,55695,55518],{},[4591,55697,4609],{},[4600,55699,55700,55706],{},[4584,55701,55702,55704],{},[4596,55703,52823],{},[4591,55705,17553],{},[4596,55707,12172],{},[4596,55709,5009],{},[37091,55711,55712],{},[37094,55713,55714],{},[37101,55715,55716],{"scriptlevel":2949,"displaystyle":4593},[4584,55717,55718,55720,55722,55728,55730,55732,55734,55736,55746],{},[4596,55719,55556],{},[4591,55721,4594],{"stretchy":4593},[4614,55723,55724,55726],{},[4596,55725,19],{},[4596,55727,55518],{},[4591,55729,4604],{"stretchy":4593},[4591,55731,2066],{"separator":1419},[4596,55733,55518],{},[4591,55735,52294],{},[4600,55737,55738,55744],{},[4584,55739,55740,55742],{},[4596,55741,52823],{},[4591,55743,17553],{},[4596,55745,12172],{},[4596,55747,5009],{},[4647,55749,55750],{"encoding":4649},"当a > 0, b > 1, α >= 0时，递归函数T(n) = aT(n \u002F b) + X(n ^ α)(X代表O、Ω、Θ之一)的渐进函数为 \\\\ \nT(n) = \n\\begin{cases} \nX(n^{\\log_ba}), α \u003C \\log_ba \\\\ \nX(n^αlogn), α = \\log_ba \\\\\nX(n^α), α > \\log_ba\n\\end{cases}",[78,55752,55754,55776,55803,55833,55866,55902,55980,55983,56010],{"className":55753,"ariaHidden":1419},[4654],[78,55755,55757,55761,55764,55767,55770,55773],{"className":55756},[4658],[78,55758],{"className":55759,"style":55760},[4662],"height:0.7224em;vertical-align:-0.0391em;",[78,55762,55499],{"className":55763},[4667,6184],[78,55765,5009],{"className":55766},[4667,4678],[78,55768],{"className":55769,"style":4740},[4739],[78,55771,52294],{"className":55772},[4744],[78,55774],{"className":55775,"style":4740},[4739],[78,55777,55779,55782,55785,55788,55791,55794,55797,55800],{"className":55778},[4658],[78,55780],{"className":55781,"style":43725},[4662],[78,55783,2949],{"className":55784},[4667],[78,55786,2066],{"className":55787},[5126],[78,55789],{"className":55790,"style":4839},[4739],[78,55792,12172],{"className":55793},[4667,4678],[78,55795],{"className":55796,"style":4740},[4739],[78,55798,52294],{"className":55799},[4744],[78,55801],{"className":55802,"style":4740},[4739],[78,55804,55806,55810,55813,55816,55819,55823,55826,55830],{"className":55805},[4658],[78,55807],{"className":55808,"style":55809},[4662],"height:0.8389em;vertical-align:-0.1944em;",[78,55811,469],{"className":55812},[4667],[78,55814,2066],{"className":55815},[5126],[78,55817],{"className":55818,"style":4839},[4739],[78,55820,55518],{"className":55821,"style":55822},[4667,4678],"margin-right:0.0037em;",[78,55824],{"className":55825,"style":4740},[4739],[78,55827,55829],{"className":55828},[4744],">=",[78,55831],{"className":55832,"style":4740},[4739],[78,55834,55836,55839,55842,55845,55848,55851,55854,55857,55860,55863],{"className":55835},[4658],[78,55837],{"className":55838,"style":4663},[4662],[78,55840,2949],{"className":55841},[4667],[78,55843,55527],{"className":55844},[4667,6184],[78,55846,5074],{"className":55847,"style":5219},[4667,4678],[78,55849,4594],{"className":55850},[4674],[78,55852,19],{"className":55853},[4667,4678],[78,55855,4604],{"className":55856},[4682],[78,55858],{"className":55859,"style":4740},[4739],[78,55861,4609],{"className":55862},[4744],[78,55864],{"className":55865,"style":4740},[4739],[78,55867,55869,55872,55875,55878,55881,55884,55887,55890,55893,55896,55899],{"className":55868},[4658],[78,55870],{"className":55871,"style":4663},[4662],[78,55873,5009],{"className":55874},[4667,4678],[78,55876,5074],{"className":55877,"style":5219},[4667,4678],[78,55879,4594],{"className":55880},[4674],[78,55882,19],{"className":55883},[4667,4678],[78,55885,7102],{"className":55886},[4667],[78,55888,12172],{"className":55889},[4667,4678],[78,55891,4604],{"className":55892},[4682],[78,55894],{"className":55895,"style":5143},[4739],[78,55897,7351],{"className":55898},[7450],[78,55900],{"className":55901,"style":5143},[4739],[78,55903,55905,55908,55912,55915,55944,55947,55950,55953,55956,55959,55962,55965,55968,55971,55974,55977],{"className":55904},[4658],[78,55906],{"className":55907,"style":4663},[4662],[78,55909,55556],{"className":55910,"style":55911},[4667,4678],"margin-right:0.0785em;",[78,55913,4594],{"className":55914},[4674],[78,55916,55918,55921],{"className":55917},[4667],[78,55919,19],{"className":55920},[4667,4678],[78,55922,55924],{"className":55923},[4689],[78,55925,55927],{"className":55926},[4693],[78,55928,55930],{"className":55929},[4698],[78,55931,55933],{"className":55932,"style":53394},[4702],[78,55934,55935,55938],{"style":5209},[78,55936],{"className":55937,"style":4711},[4710],[78,55939,55941],{"className":55940},[4715,4716,4717,4718],[78,55942,55518],{"className":55943,"style":55822},[4667,4678,4718],[78,55945,4604],{"className":55946},[4682],[78,55948,4594],{"className":55949},[4674],[78,55951,55556],{"className":55952,"style":55911},[4667,4678],[78,55954,55573],{"className":55955},[4667,6184],[78,55957,52274],{"className":55958,"style":17251},[4667,4678],[78,55960,1011],{"className":55961},[4667,6184],[78,55963,53932],{"className":55964},[4667],[78,55966,1011],{"className":55967},[4667,6184],[78,55969,54581],{"className":55970},[4667],[78,55972,55586],{"className":55973},[4667,6184],[78,55975,4604],{"className":55976},[4682],[78,55978,55591],{"className":55979},[4667,6184],[78,55981],{"className":55982},[4739,52940],[78,55984,55986,55989,55992,55995,55998,56001,56004,56007],{"className":55985},[4658],[78,55987],{"className":55988,"style":4663},[4662],[78,55990,5074],{"className":55991,"style":5219},[4667,4678],[78,55993,4594],{"className":55994},[4674],[78,55996,19],{"className":55997},[4667,4678],[78,55999,4604],{"className":56000},[4682],[78,56002],{"className":56003,"style":4740},[4739],[78,56005,4609],{"className":56006},[4744],[78,56008],{"className":56009,"style":4740},[4739],[78,56011,56013,56017],{"className":56012},[4658],[78,56014],{"className":56015,"style":56016},[4662],"height:4.32em;vertical-align:-1.91em;",[78,56018,56020,56120,56567],{"className":56019},[18342],[78,56021,56023],{"className":56022},[4674],[78,56024,56028],{"className":56025},[56026,56027],"delimsizing","mult",[78,56029,56031,56111],{"className":56030},[4693,4694],[78,56032,56034,56108],{"className":56033},[4698],[78,56035,56038,56053,56072,56084,56096],{"className":56036,"style":56037},[4702],"height:2.35em;",[78,56039,56041,56045],{"style":56040},"top:-2.2em;",[78,56042],{"className":56043,"style":56044},[4710],"height:3.15em;",[78,56046,56050],{"className":56047},[56048,56049],"delimsizinginner","delim-size4",[78,56051,56052],{},"⎩",[78,56054,56056,56059],{"style":56055},"top:-2.192em;",[78,56057],{"className":56058,"style":56044},[4710],[78,56060,56062],{"style":56061},"height:0.316em;width:0.8889em;",[5884,56063,56069],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},"0.8889em","0.316em","width:0.8889em","0 0 888.89 316","xMinYMin",[5892,56070],{"d":56071},"M384 0 H504 V316 H384z M384 0 H504 V316 H384z",[78,56073,56075,56078],{"style":56074},"top:-3.15em;",[78,56076],{"className":56077,"style":56044},[4710],[78,56079,56081],{"className":56080},[56048,56049],[78,56082,56083],{},"⎨",[78,56085,56087,56090],{"style":56086},"top:-4.292em;",[78,56088],{"className":56089,"style":56044},[4710],[78,56091,56092],{"style":56061},[5884,56093,56094],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,56095],{"d":56071},[78,56097,56099,56102],{"style":56098},"top:-4.6em;",[78,56100],{"className":56101,"style":56044},[4710],[78,56103,56105],{"className":56104},[56048,56049],[78,56106,56107],{},"⎧",[78,56109,4726],{"className":56110},[4725],[78,56112,56114],{"className":56113},[4698],[78,56115,56118],{"className":56116,"style":56117},[4702],"height:1.85em;",[78,56119],{},[78,56121,56123],{"className":56122},[4667],[78,56124,56126],{"className":56125},[37085],[78,56127,56129],{"className":56128},[38098],[78,56130,56132,56558],{"className":56131},[4693,4694],[78,56133,56135,56555],{"className":56134},[4698],[78,56136,56139,56316,56442],{"className":56137,"style":56138},[4702],"height:2.41em;",[78,56140,56142,56146],{"style":56141},"top:-4.41em;",[78,56143],{"className":56144,"style":56145},[4710],"height:3.008em;",[78,56147,56149,56152,56155,56244,56247,56250,56253,56256,56259,56262,56265,56310,56313],{"className":56148},[4667],[78,56150,55556],{"className":56151,"style":55911},[4667,4678],[78,56153,4594],{"className":56154},[4674],[78,56156,56158,56161],{"className":56157},[4667],[78,56159,19],{"className":56160},[4667,4678],[78,56162,56164],{"className":56163},[4689],[78,56165,56167],{"className":56166},[4693],[78,56168,56170],{"className":56169},[4698],[78,56171,56174],{"className":56172,"style":56173},[4702],"height:0.8491em;",[78,56175,56176,56179],{"style":4958},[78,56177],{"className":56178,"style":4711},[4710],[78,56180,56182],{"className":56181},[4715,4716,4717,4718],[78,56183,56185,56237,56241],{"className":56184},[4667,4718],[78,56186,56188,56200],{"className":56187},[4788,4718],[78,56189,56191,56194,56197],{"className":56190},[4788,4718],[78,56192,7132],{"className":56193},[4718],[78,56195,5025],{"className":56196},[4718],[78,56198,43673],{"className":56199,"style":53053},[4718],[78,56201,56203],{"className":56202},[4689],[78,56204,56206,56228],{"className":56205},[4693,4694],[78,56207,56209,56225],{"className":56208},[4698],[78,56210,56213],{"className":56211,"style":56212},[4702],"height:0.2302em;",[78,56214,56216,56219],{"style":56215},"top:-2.2341em;margin-right:0.0714em;",[78,56217],{"className":56218,"style":4896},[4710],[78,56220,56222],{"className":56221},[4715,4900,4901,4718],[78,56223,12172],{"className":56224},[4667,4678,4718],[78,56226,4726],{"className":56227},[4725],[78,56229,56231],{"className":56230},[4698],[78,56232,56235],{"className":56233,"style":56234},[4702],"height:0.2659em;",[78,56236],{},[78,56238],{"className":56239,"style":56240},[4739,4718],"margin-right:0.1952em;",[78,56242,5009],{"className":56243},[4667,4678,4718],[78,56245,4604],{"className":56246},[4682],[78,56248,2066],{"className":56249},[5126],[78,56251],{"className":56252,"style":4839},[4739],[78,56254,55518],{"className":56255,"style":55822},[4667,4678],[78,56257],{"className":56258,"style":4740},[4739],[78,56260,41631],{"className":56261},[4744],[78,56263],{"className":56264,"style":4740},[4739],[78,56266,56268,56273],{"className":56267},[4788],[78,56269,53050,56271],{"className":56270},[4788],[78,56272,43673],{"style":53053},[78,56274,56276],{"className":56275},[4689],[78,56277,56279,56301],{"className":56278},[4693,4694],[78,56280,56282,56298],{"className":56281},[4698],[78,56283,56286],{"className":56284,"style":56285},[4702],"height:0.242em;",[78,56287,56289,56292],{"style":56288},"top:-2.4559em;margin-right:0.05em;",[78,56290],{"className":56291,"style":4711},[4710],[78,56293,56295],{"className":56294},[4715,4716,4717,4718],[78,56296,12172],{"className":56297},[4667,4678,4718],[78,56299,4726],{"className":56300},[4725],[78,56302,56304],{"className":56303},[4698],[78,56305,56308],{"className":56306,"style":56307},[4702],"height:0.2441em;",[78,56309],{},[78,56311],{"className":56312,"style":4839},[4739],[78,56314,5009],{"className":56315},[4667,4678],[78,56317,56319,56322],{"style":56318},"top:-2.97em;",[78,56320],{"className":56321,"style":56145},[4710],[78,56323,56325,56328,56331,56361,56364,56367,56370,56373,56376,56379,56382,56385,56388,56391,56394,56436,56439],{"className":56324},[4667],[78,56326,55556],{"className":56327,"style":55911},[4667,4678],[78,56329,4594],{"className":56330},[4674],[78,56332,56334,56337],{"className":56333},[4667],[78,56335,19],{"className":56336},[4667,4678],[78,56338,56340],{"className":56339},[4689],[78,56341,56343],{"className":56342},[4693],[78,56344,56346],{"className":56345},[4698],[78,56347,56350],{"className":56348,"style":56349},[4702],"height:0.6644em;",[78,56351,56352,56355],{"style":4958},[78,56353],{"className":56354,"style":4711},[4710],[78,56356,56358],{"className":56357},[4715,4716,4717,4718],[78,56359,55518],{"className":56360,"style":55822},[4667,4678,4718],[78,56362,7132],{"className":56363,"style":7300},[4667,4678],[78,56365,5025],{"className":56366},[4667,4678],[78,56368,43673],{"className":56369,"style":5187},[4667,4678],[78,56371,19],{"className":56372},[4667,4678],[78,56374,4604],{"className":56375},[4682],[78,56377,2066],{"className":56378},[5126],[78,56380],{"className":56381,"style":4839},[4739],[78,56383,55518],{"className":56384,"style":55822},[4667,4678],[78,56386],{"className":56387,"style":4740},[4739],[78,56389,4609],{"className":56390},[4744],[78,56392],{"className":56393,"style":4740},[4739],[78,56395,56397,56402],{"className":56396},[4788],[78,56398,53050,56400],{"className":56399},[4788],[78,56401,43673],{"style":53053},[78,56403,56405],{"className":56404},[4689],[78,56406,56408,56428],{"className":56407},[4693,4694],[78,56409,56411,56425],{"className":56410},[4698],[78,56412,56414],{"className":56413,"style":56285},[4702],[78,56415,56416,56419],{"style":56288},[78,56417],{"className":56418,"style":4711},[4710],[78,56420,56422],{"className":56421},[4715,4716,4717,4718],[78,56423,12172],{"className":56424},[4667,4678,4718],[78,56426,4726],{"className":56427},[4725],[78,56429,56431],{"className":56430},[4698],[78,56432,56434],{"className":56433,"style":56307},[4702],[78,56435],{},[78,56437],{"className":56438,"style":4839},[4739],[78,56440,5009],{"className":56441},[4667,4678],[78,56443,56445,56448],{"style":56444},"top:-1.53em;",[78,56446],{"className":56447,"style":56145},[4710],[78,56449,56451,56454,56457,56486,56489,56492,56495,56498,56501,56504,56507,56549,56552],{"className":56450},[4667],[78,56452,55556],{"className":56453,"style":55911},[4667,4678],[78,56455,4594],{"className":56456},[4674],[78,56458,56460,56463],{"className":56459},[4667],[78,56461,19],{"className":56462},[4667,4678],[78,56464,56466],{"className":56465},[4689],[78,56467,56469],{"className":56468},[4693],[78,56470,56472],{"className":56471},[4698],[78,56473,56475],{"className":56474,"style":56349},[4702],[78,56476,56477,56480],{"style":4958},[78,56478],{"className":56479,"style":4711},[4710],[78,56481,56483],{"className":56482},[4715,4716,4717,4718],[78,56484,55518],{"className":56485,"style":55822},[4667,4678,4718],[78,56487,4604],{"className":56488},[4682],[78,56490,2066],{"className":56491},[5126],[78,56493],{"className":56494,"style":4839},[4739],[78,56496,55518],{"className":56497,"style":55822},[4667,4678],[78,56499],{"className":56500,"style":4740},[4739],[78,56502,52294],{"className":56503},[4744],[78,56505],{"className":56506,"style":4740},[4739],[78,56508,56510,56515],{"className":56509},[4788],[78,56511,53050,56513],{"className":56512},[4788],[78,56514,43673],{"style":53053},[78,56516,56518],{"className":56517},[4689],[78,56519,56521,56541],{"className":56520},[4693,4694],[78,56522,56524,56538],{"className":56523},[4698],[78,56525,56527],{"className":56526,"style":56285},[4702],[78,56528,56529,56532],{"style":56288},[78,56530],{"className":56531,"style":4711},[4710],[78,56533,56535],{"className":56534},[4715,4716,4717,4718],[78,56536,12172],{"className":56537},[4667,4678,4718],[78,56539,4726],{"className":56540},[4725],[78,56542,56544],{"className":56543},[4698],[78,56545,56547],{"className":56546,"style":56307},[4702],[78,56548],{},[78,56550],{"className":56551,"style":4839},[4739],[78,56553,5009],{"className":56554},[4667,4678],[78,56556,4726],{"className":56557},[4725],[78,56559,56561],{"className":56560},[4698],[78,56562,56565],{"className":56563,"style":56564},[4702],"height:1.91em;",[78,56566],{},[78,56568],{"className":56569},[4682,4761],[49,56571,56572],{},[52,56573,56574,56575,67],{},"通过简化Master定理我们求的是",[22,56576,56577],{},"Θ的渐进函数",[107,56579,56580],{"id":56580},"排序算法",[10548,56582,56584],{"id":56583},"选择排序升序排列","选择排序（升序排列）",[114,56586,56588],{"className":51126,"code":56587,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Max(T X[], int n)\n{ \n    int pos = 0;\n    for(int i = 1; i \u003C n; ++i)\n        if(X[pos] \u003C X[i]) pos = i;\n    return pos;  \u002F\u002F 返回数组最大值的下标\n}\ntemplate\u003Cclass T>\nvoid SelectionSort(T X[], int n)\n{ \n    for(int m = n; m > 1; --m){ \n        int i = Max(X, m);  \u002F\u002F 找到当前数组的最大值\n        swap(X[i], X[m - 1]);  \u002F\u002F 将最大值与数组未遍历末位交换\n    }\n}\n\u002F\u002F 时间复杂度为O(n ^ 2)\n",[17,56589,56590,56594,56599,56603,56608,56613,56618,56623,56627,56631,56636,56640,56645,56650,56655,56659,56663],{"__ignoreMap":119},[78,56591,56592],{"class":124,"line":125},[78,56593,51135],{},[78,56595,56596],{"class":124,"line":132},[78,56597,56598],{},"int Max(T X[], int n)\n",[78,56600,56601],{"class":124,"line":138},[78,56602,51145],{},[78,56604,56605],{"class":124,"line":144},[78,56606,56607],{},"    int pos = 0;\n",[78,56609,56610],{"class":124,"line":150},[78,56611,56612],{},"    for(int i = 1; i \u003C n; ++i)\n",[78,56614,56615],{"class":124,"line":156},[78,56616,56617],{},"        if(X[pos] \u003C X[i]) pos = i;\n",[78,56619,56620],{"class":124,"line":162},[78,56621,56622],{},"    return pos;  \u002F\u002F 返回数组最大值的下标\n",[78,56624,56625],{"class":124,"line":168},[78,56626,23518],{},[78,56628,56629],{"class":124,"line":174},[78,56630,51135],{},[78,56632,56633],{"class":124,"line":180},[78,56634,56635],{},"void SelectionSort(T X[], int n)\n",[78,56637,56638],{"class":124,"line":186},[78,56639,51145],{},[78,56641,56642],{"class":124,"line":192},[78,56643,56644],{},"    for(int m = n; m > 1; --m){ \n",[78,56646,56647],{"class":124,"line":198},[78,56648,56649],{},"        int i = Max(X, m);  \u002F\u002F 找到当前数组的最大值\n",[78,56651,56652],{"class":124,"line":204},[78,56653,56654],{},"        swap(X[i], X[m - 1]);  \u002F\u002F 将最大值与数组未遍历末位交换\n",[78,56656,56657],{"class":124,"line":210},[78,56658,15810],{},[78,56660,56661],{"class":124,"line":216},[78,56662,23518],{},[78,56664,56665],{"class":124,"line":222},[78,56666,56667],{},"\u002F\u002F 时间复杂度为O(n ^ 2)\n",[10548,56669,56671],{"id":56670},"插入排序升序排列且不含重复元素","插入排序（升序排列且不含重复元素）",[114,56673,56675],{"className":51126,"code":56674,"language":51128,"meta":119,"style":119},"\u002F\u002F 将元素插入到有序数组中\ntemplate\u003Cclass T, class T2>\nint Insert(T X[], int m, const T2 &v)  \u002F\u002F v为要插入的元素\n{ \n    int p;\n    for(p = m - 1; p >= 0 and X[p] > v; --p) {}  \u002F\u002F 用p记录第一个比v小的数组下标\n    if(X[p] == v) return m;  \u002F\u002F 如果两数据相等，不执行插入操作\n    for(int i = m - 1; i > p; --i)\n        X[i + 1] = X[i];  \u002F\u002F 所有数据向后移一位\n    X[p + 1] = v;\n    return m + 1;\n}\n\u002F\u002F 时间复杂度为O(m)\n",[17,56676,56677,56682,56687,56692,56696,56701,56706,56711,56716,56721,56726,56731,56735],{"__ignoreMap":119},[78,56678,56679],{"class":124,"line":125},[78,56680,56681],{},"\u002F\u002F 将元素插入到有序数组中\n",[78,56683,56684],{"class":124,"line":132},[78,56685,56686],{},"template\u003Cclass T, class T2>\n",[78,56688,56689],{"class":124,"line":138},[78,56690,56691],{},"int Insert(T X[], int m, const T2 &v)  \u002F\u002F v为要插入的元素\n",[78,56693,56694],{"class":124,"line":144},[78,56695,51145],{},[78,56697,56698],{"class":124,"line":150},[78,56699,56700],{},"    int p;\n",[78,56702,56703],{"class":124,"line":156},[78,56704,56705],{},"    for(p = m - 1; p >= 0 and X[p] > v; --p) {}  \u002F\u002F 用p记录第一个比v小的数组下标\n",[78,56707,56708],{"class":124,"line":162},[78,56709,56710],{},"    if(X[p] == v) return m;  \u002F\u002F 如果两数据相等，不执行插入操作\n",[78,56712,56713],{"class":124,"line":168},[78,56714,56715],{},"    for(int i = m - 1; i > p; --i)\n",[78,56717,56718],{"class":124,"line":174},[78,56719,56720],{},"        X[i + 1] = X[i];  \u002F\u002F 所有数据向后移一位\n",[78,56722,56723],{"class":124,"line":180},[78,56724,56725],{},"    X[p + 1] = v;\n",[78,56727,56728],{"class":124,"line":186},[78,56729,56730],{},"    return m + 1;\n",[78,56732,56733],{"class":124,"line":192},[78,56734,23518],{},[78,56736,56737],{"class":124,"line":198},[78,56738,56739],{},"\u002F\u002F 时间复杂度为O(m)\n",[10548,56741,56743],{"id":56742},"插入排序升序排列","插入排序（升序排列）",[114,56745,56747],{"className":51126,"code":56746,"language":51128,"meta":119,"style":119},"\u002F\u002F 将无序数组进行插入排序\ntemplate\u003Cclass T>\nvoid Insert(T X[], int m, const T &v)\n{ \n    int i;\n    for(i = m - 1; i >= 0 and X[i] > v; --i)  \u002F\u002F 找到第一个比传入元素小的下标，将其他元素向后移动\n        X[i + 1] = X[i];\n    X[i + 1] = v;\n}\ntemplate\u003Cclass T>\nvoid InsertionSort(T X[], int n)\n{ \n    for(int m = 1; m \u003C n; ++m){ \n        auto v = X[m];\n        Insert(X, m, v);\n    }\n}\n\u002F\u002F 时间复杂度为O(n ^ 2)\n",[17,56748,56749,56754,56758,56763,56767,56772,56777,56782,56787,56791,56795,56800,56804,56809,56814,56819,56823,56827],{"__ignoreMap":119},[78,56750,56751],{"class":124,"line":125},[78,56752,56753],{},"\u002F\u002F 将无序数组进行插入排序\n",[78,56755,56756],{"class":124,"line":132},[78,56757,51135],{},[78,56759,56760],{"class":124,"line":138},[78,56761,56762],{},"void Insert(T X[], int m, const T &v)\n",[78,56764,56765],{"class":124,"line":144},[78,56766,51145],{},[78,56768,56769],{"class":124,"line":150},[78,56770,56771],{},"    int i;\n",[78,56773,56774],{"class":124,"line":156},[78,56775,56776],{},"    for(i = m - 1; i >= 0 and X[i] > v; --i)  \u002F\u002F 找到第一个比传入元素小的下标，将其他元素向后移动\n",[78,56778,56779],{"class":124,"line":162},[78,56780,56781],{},"        X[i + 1] = X[i];\n",[78,56783,56784],{"class":124,"line":168},[78,56785,56786],{},"    X[i + 1] = v;\n",[78,56788,56789],{"class":124,"line":174},[78,56790,23518],{},[78,56792,56793],{"class":124,"line":180},[78,56794,51135],{},[78,56796,56797],{"class":124,"line":186},[78,56798,56799],{},"void InsertionSort(T X[], int n)\n",[78,56801,56802],{"class":124,"line":192},[78,56803,51145],{},[78,56805,56806],{"class":124,"line":198},[78,56807,56808],{},"    for(int m = 1; m \u003C n; ++m){ \n",[78,56810,56811],{"class":124,"line":204},[78,56812,56813],{},"        auto v = X[m];\n",[78,56815,56816],{"class":124,"line":210},[78,56817,56818],{},"        Insert(X, m, v);\n",[78,56820,56821],{"class":124,"line":216},[78,56822,15810],{},[78,56824,56825],{"class":124,"line":222},[78,56826,23518],{},[78,56828,56829],{"class":124,"line":421},[78,56830,56667],{},[107,56832,56833],{"id":56833},"图遍历方法",[10548,56835,56836],{"id":56836},"一般树的先序遍历",[114,56838,56840],{"className":51126,"code":56839,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nstruct BtNode\n{ \n    T data;\n    BtNode *left = 0, *right = 0;\n};\ntemplate\u003Cclass T, class Func>\nvoid PreOrder(BtNode\u003CT> *x, Func Visit)\n{ \n    if(x == 0) return;\n    Visit(x);\n    PreOrder(x->left, Visit);\n    PreOrder(x->right, Visit);\n}\n",[17,56841,56842,56846,56850,56854,56858,56862,56866,56871,56876,56880,56885,56890,56895,56900],{"__ignoreMap":119},[78,56843,56844],{"class":124,"line":125},[78,56845,51135],{},[78,56847,56848],{"class":124,"line":132},[78,56849,51140],{},[78,56851,56852],{"class":124,"line":138},[78,56853,51145],{},[78,56855,56856],{"class":124,"line":144},[78,56857,51150],{},[78,56859,56860],{"class":124,"line":150},[78,56861,51160],{},[78,56863,56864],{"class":124,"line":156},[78,56865,51165],{},[78,56867,56868],{"class":124,"line":162},[78,56869,56870],{},"template\u003Cclass T, class Func>\n",[78,56872,56873],{"class":124,"line":168},[78,56874,56875],{},"void PreOrder(BtNode\u003CT> *x, Func Visit)\n",[78,56877,56878],{"class":124,"line":174},[78,56879,51145],{},[78,56881,56882],{"class":124,"line":180},[78,56883,56884],{},"    if(x == 0) return;\n",[78,56886,56887],{"class":124,"line":186},[78,56888,56889],{},"    Visit(x);\n",[78,56891,56892],{"class":124,"line":192},[78,56893,56894],{},"    PreOrder(x->left, Visit);\n",[78,56896,56897],{"class":124,"line":198},[78,56898,56899],{},"    PreOrder(x->right, Visit);\n",[78,56901,56902],{"class":124,"line":204},[78,56903,23518],{},[10548,56905,56906],{"id":56906},"二叉树的层次遍历",[114,56908,56910],{"className":51126,"code":56909,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nstruct BtNode\n{ \n    T data;\n    BtNode *left = 0, *right = 0;\n};\ntemplate\u003Cclass T, class Func>\nvoid LevelOrder(BtNode\u003CT> *x, Func Visit)\n{ \n    if(x == 0) return;\n    queue\u003CBtNode\u003CT> *> Q;  \u002F\u002F 创建队列（先入先出）\n    Visit(x), Q.push(x);\n    while(not Q.empty()){ \n        x = Q.front(), Q.pop();  \u002F\u002F 取Q队列的第一个元素出队。\n        auto left = x->left, right = x->right;\n        if(left != 0)\n            Visit(left), Q.push(left);  \u002F\u002F 将x左子树元素入队\n        if(right != 0)\n            Visit(right), Q.push(right);  \u002F\u002F 将x右子树元素入队\n    }\n}\n\u002F\u002F 其实类似先序遍历，都是先执行Visit操作后再进行左右子树判断；\n\u002F\u002F 主要区别在于层次遍历是一个入队出队操作，先判断队列中是否有元素，再去将元素的左右子树依次入队。\n",[17,56911,56912,56916,56920,56924,56928,56932,56936,56940,56945,56949,56953,56958,56963,56968,56973,56978,56983,56988,56993,56998,57002,57006,57011],{"__ignoreMap":119},[78,56913,56914],{"class":124,"line":125},[78,56915,51135],{},[78,56917,56918],{"class":124,"line":132},[78,56919,51140],{},[78,56921,56922],{"class":124,"line":138},[78,56923,51145],{},[78,56925,56926],{"class":124,"line":144},[78,56927,51150],{},[78,56929,56930],{"class":124,"line":150},[78,56931,51160],{},[78,56933,56934],{"class":124,"line":156},[78,56935,51165],{},[78,56937,56938],{"class":124,"line":162},[78,56939,56870],{},[78,56941,56942],{"class":124,"line":168},[78,56943,56944],{},"void LevelOrder(BtNode\u003CT> *x, Func Visit)\n",[78,56946,56947],{"class":124,"line":174},[78,56948,51145],{},[78,56950,56951],{"class":124,"line":180},[78,56952,56884],{},[78,56954,56955],{"class":124,"line":186},[78,56956,56957],{},"    queue\u003CBtNode\u003CT> *> Q;  \u002F\u002F 创建队列（先入先出）\n",[78,56959,56960],{"class":124,"line":192},[78,56961,56962],{},"    Visit(x), Q.push(x);\n",[78,56964,56965],{"class":124,"line":198},[78,56966,56967],{},"    while(not Q.empty()){ \n",[78,56969,56970],{"class":124,"line":204},[78,56971,56972],{},"        x = Q.front(), Q.pop();  \u002F\u002F 取Q队列的第一个元素出队。\n",[78,56974,56975],{"class":124,"line":210},[78,56976,56977],{},"        auto left = x->left, right = x->right;\n",[78,56979,56980],{"class":124,"line":216},[78,56981,56982],{},"        if(left != 0)\n",[78,56984,56985],{"class":124,"line":222},[78,56986,56987],{},"            Visit(left), Q.push(left);  \u002F\u002F 将x左子树元素入队\n",[78,56989,56990],{"class":124,"line":421},[78,56991,56992],{},"        if(right != 0)\n",[78,56994,56995],{"class":124,"line":427},[78,56996,56997],{},"            Visit(right), Q.push(right);  \u002F\u002F 将x右子树元素入队\n",[78,56999,57000],{"class":124,"line":433},[78,57001,15810],{},[78,57003,57004],{"class":124,"line":2443},[78,57005,23518],{},[78,57007,57008],{"class":124,"line":2448},[78,57009,57010],{},"\u002F\u002F 其实类似先序遍历，都是先执行Visit操作后再进行左右子树判断；\n",[78,57012,57013],{"class":124,"line":2454},[78,57014,57015],{},"\u002F\u002F 主要区别在于层次遍历是一个入队出队操作，先判断队列中是否有元素，再去将元素的左右子树依次入队。\n",[10548,57017,57018],{"id":57018},"连通图的宽度优先搜索算法",[114,57020,57022],{"className":51126,"code":57021,"language":51128,"meta":119,"style":119},"template\u003Cclass Fun>\nvoid BFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited, Fun Visit)\n{ \n    int n = G.rows();\n    queue\u003Cint> Q;\n    Visit(v), Visited[v] = 1, Q.push(v);  \u002F\u002F Visit函数代表进行访问操作，数组Visited记录元素元素是否被访问\n    while(not Q.empty()){ \n        v = Q.front(), Q.pop();\n        for(int w = 0; w \u003C n; ++w)\n            if(not Visited[w] and G(v, w) == 1)\n                Visit(w), Visited[w] = 1, Q.push(w);\n    }\n}\n\u002F\u002F 和树的层次遍历一模一样，区别就是树一般为二叉树，只有两个子节点，但是图是每个节点都有可能相连；\n\u002F\u002F 所以在宽度搜索时是将没有访问过的一排节点（相连）全部入队。\n",[17,57023,57024,57029,57034,57038,57043,57048,57053,57057,57062,57067,57072,57077,57081,57085,57090],{"__ignoreMap":119},[78,57025,57026],{"class":124,"line":125},[78,57027,57028],{},"template\u003Cclass Fun>\n",[78,57030,57031],{"class":124,"line":132},[78,57032,57033],{},"void BFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited, Fun Visit)\n",[78,57035,57036],{"class":124,"line":138},[78,57037,51145],{},[78,57039,57040],{"class":124,"line":144},[78,57041,57042],{},"    int n = G.rows();\n",[78,57044,57045],{"class":124,"line":150},[78,57046,57047],{},"    queue\u003Cint> Q;\n",[78,57049,57050],{"class":124,"line":156},[78,57051,57052],{},"    Visit(v), Visited[v] = 1, Q.push(v);  \u002F\u002F Visit函数代表进行访问操作，数组Visited记录元素元素是否被访问\n",[78,57054,57055],{"class":124,"line":162},[78,57056,56967],{},[78,57058,57059],{"class":124,"line":168},[78,57060,57061],{},"        v = Q.front(), Q.pop();\n",[78,57063,57064],{"class":124,"line":174},[78,57065,57066],{},"        for(int w = 0; w \u003C n; ++w)\n",[78,57068,57069],{"class":124,"line":180},[78,57070,57071],{},"            if(not Visited[w] and G(v, w) == 1)\n",[78,57073,57074],{"class":124,"line":186},[78,57075,57076],{},"                Visit(w), Visited[w] = 1, Q.push(w);\n",[78,57078,57079],{"class":124,"line":192},[78,57080,15810],{},[78,57082,57083],{"class":124,"line":198},[78,57084,23518],{},[78,57086,57087],{"class":124,"line":204},[78,57088,57089],{},"\u002F\u002F 和树的层次遍历一模一样，区别就是树一般为二叉树，只有两个子节点，但是图是每个节点都有可能相连；\n",[78,57091,57092],{"class":124,"line":210},[78,57093,57094],{},"\u002F\u002F 所以在宽度搜索时是将没有访问过的一排节点（相连）全部入队。\n",[10548,57096,57097],{"id":57097},"连通图的深度优先算法",[114,57099,57101],{"className":51126,"code":57100,"language":51128,"meta":119,"style":119},"template\u003Cclass Fun>\nvoid DFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited, Fun Visit)\n{ \n    int n = G.rows();\n    Visit(v), Visited[v] = 1;\n    for(int w = 0; w \u003C n; ++w)\n        if(not Visited[w] and G(v, w) == 1)\n            DFS(G, w, Visited, Visit);  \u002F\u002F 递归去寻找未访问的节点\n}\n",[17,57102,57103,57107,57112,57116,57120,57125,57130,57135,57140],{"__ignoreMap":119},[78,57104,57105],{"class":124,"line":125},[78,57106,57028],{},[78,57108,57109],{"class":124,"line":132},[78,57110,57111],{},"void DFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited, Fun Visit)\n",[78,57113,57114],{"class":124,"line":138},[78,57115,51145],{},[78,57117,57118],{"class":124,"line":144},[78,57119,57042],{},[78,57121,57122],{"class":124,"line":150},[78,57123,57124],{},"    Visit(v), Visited[v] = 1;\n",[78,57126,57127],{"class":124,"line":156},[78,57128,57129],{},"    for(int w = 0; w \u003C n; ++w)\n",[78,57131,57132],{"class":124,"line":162},[78,57133,57134],{},"        if(not Visited[w] and G(v, w) == 1)\n",[78,57136,57137],{"class":124,"line":168},[78,57138,57139],{},"            DFS(G, w, Visited, Visit);  \u002F\u002F 递归去寻找未访问的节点\n",[78,57141,57142],{"class":124,"line":174},[78,57143,23518],{},[10548,57145,57147],{"id":57146},"二叉树的深度优先搜索改计算每个节点的深度","二叉树的深度优先搜索（改）计算每个节点的深度",[114,57149,57151],{"className":51126,"code":57150,"language":51128,"meta":119,"style":119},"#include\u003Calgorithm>\ntemplate\u003Cclass T>\nstruct BtNode\n{ \n    T data;\n    int depth = 1;\n    BtNode *left = 0, *right = 0; \u002F\u002F 左子树, 右子树\n};\ntemplate\u003Cclass T>  \u002F\u002F 使用后根遍历的方法计算深度\nint Depth(BtNode\u003CT> *x)\n{ \n    if(x == 0) return 0;\n    x->depth = std::max(Depth(x->left), Depth(x->right)) + 1;  \u002F\u002F 递归向上回溯深度\n    return x->depth;\n}\n",[17,57152,57153,57158,57162,57166,57170,57174,57178,57183,57187,57192,57197,57201,57206,57211,57216],{"__ignoreMap":119},[78,57154,57155],{"class":124,"line":125},[78,57156,57157],{},"#include\u003Calgorithm>\n",[78,57159,57160],{"class":124,"line":132},[78,57161,51135],{},[78,57163,57164],{"class":124,"line":138},[78,57165,51140],{},[78,57167,57168],{"class":124,"line":144},[78,57169,51145],{},[78,57171,57172],{"class":124,"line":150},[78,57173,51150],{},[78,57175,57176],{"class":124,"line":156},[78,57177,51155],{},[78,57179,57180],{"class":124,"line":162},[78,57181,57182],{},"    BtNode *left = 0, *right = 0; \u002F\u002F 左子树, 右子树\n",[78,57184,57185],{"class":124,"line":168},[78,57186,51165],{},[78,57188,57189],{"class":124,"line":174},[78,57190,57191],{},"template\u003Cclass T>  \u002F\u002F 使用后根遍历的方法计算深度\n",[78,57193,57194],{"class":124,"line":180},[78,57195,57196],{},"int Depth(BtNode\u003CT> *x)\n",[78,57198,57199],{"class":124,"line":186},[78,57200,51145],{},[78,57202,57203],{"class":124,"line":192},[78,57204,57205],{},"    if(x == 0) return 0;\n",[78,57207,57208],{"class":124,"line":198},[78,57209,57210],{},"    x->depth = std::max(Depth(x->left), Depth(x->right)) + 1;  \u002F\u002F 递归向上回溯深度\n",[78,57212,57213],{"class":124,"line":204},[78,57214,57215],{},"    return x->depth;\n",[78,57217,57218],{"class":124,"line":210},[78,57219,23518],{},[10548,57221,57223],{"id":57222},"一般树的深度优先搜索改计算每个节点的层次","一般树的深度优先搜索（改）计算每个节点的层次",[114,57225,57227],{"className":51126,"code":57226,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nstruct TreeNode\n{ \n    T data;\n    int level = 1;\n    TreeNode *first = 0, *next = 0;  \u002F\u002F first、next的作用类似于首位坐标\n};\ntemplate\u003Cclass T>  \u002F\u002F 使用先根遍历的方法计算层次\nvoid Level(TreeNode\u003CT> *x, int level)\n{ \n    if(x == 0) return;\n    x->level = level;  \u002F\u002F \n    for(auto w = x->first; w != 0; w = w->next)  \u002F\u002F 这里就是层次遍历的体现，将first开始到最后一个next节点\n        Level(w, level + 1);\n}\n",[17,57228,57229,57233,57238,57242,57246,57251,57256,57260,57265,57270,57274,57278,57283,57288,57293],{"__ignoreMap":119},[78,57230,57231],{"class":124,"line":125},[78,57232,51135],{},[78,57234,57235],{"class":124,"line":132},[78,57236,57237],{},"struct TreeNode\n",[78,57239,57240],{"class":124,"line":138},[78,57241,51145],{},[78,57243,57244],{"class":124,"line":144},[78,57245,51150],{},[78,57247,57248],{"class":124,"line":150},[78,57249,57250],{},"    int level = 1;\n",[78,57252,57253],{"class":124,"line":156},[78,57254,57255],{},"    TreeNode *first = 0, *next = 0;  \u002F\u002F first、next的作用类似于首位坐标\n",[78,57257,57258],{"class":124,"line":162},[78,57259,51165],{},[78,57261,57262],{"class":124,"line":168},[78,57263,57264],{},"template\u003Cclass T>  \u002F\u002F 使用先根遍历的方法计算层次\n",[78,57266,57267],{"class":124,"line":174},[78,57268,57269],{},"void Level(TreeNode\u003CT> *x, int level)\n",[78,57271,57272],{"class":124,"line":180},[78,57273,51145],{},[78,57275,57276],{"class":124,"line":186},[78,57277,56884],{},[78,57279,57280],{"class":124,"line":192},[78,57281,57282],{},"    x->level = level;  \u002F\u002F \n",[78,57284,57285],{"class":124,"line":198},[78,57286,57287],{},"    for(auto w = x->first; w != 0; w = w->next)  \u002F\u002F 这里就是层次遍历的体现，将first开始到最后一个next节点\n",[78,57289,57290],{"class":124,"line":204},[78,57291,57292],{},"        Level(w, level + 1);\n",[78,57294,57295],{"class":124,"line":210},[78,57296,23518],{},[10548,57298,57300],{"id":57299},"连通图的深度优先遍历算法改计算每个顶点的层次","连通图的深度优先遍历算法（改）计算每个顶点的层次",[114,57302,57304],{"className":51126,"code":57303,"language":51128,"meta":119,"style":119},"#include \"Matrix.hpp\"  \u002F\u002F 图计算的依赖\n#include \"ios.hpp\"\n    #include \u003Cfunctional>\nauto Level(const Matrix\u003Cbool> &G, int u = 0)\n{ \n    int n = G.rows();\n    vector\u003Cint> L(n, 0);  \u002F\u002F 设置L中有n个元素，每个元素值为0\n    function\u003Cvoid(int, int)>\n    Level = [&](int u, int level){  \u002F\u002F 区别于外面一圈Level函数，可以调用外圈Level中的参数\n        L[u] = level;\n        for(int w = 0; w \u003C n; ++w)\n            if(L[w] == 0 and G(u, w) == 1)\n                Level(w, level + 1);\n    };\n    Level(u, 1);\n    return L;\n}\n",[17,57305,57306,57314,57319,57324,57329,57333,57337,57342,57347,57352,57357,57361,57366,57371,57376,57381,57386],{"__ignoreMap":119},[78,57307,57308,57311],{"class":124,"line":125},[78,57309,57310],{},"#include \"Matrix.hpp\"",[78,57312,57313],{},"  \u002F\u002F 图计算的依赖\n",[78,57315,57316],{"class":124,"line":132},[78,57317,57318],{},"#include \"ios.hpp\"\n",[78,57320,57321],{"class":124,"line":138},[78,57322,57323],{},"    #include \u003Cfunctional>\n",[78,57325,57326],{"class":124,"line":144},[78,57327,57328],{},"auto Level(const Matrix\u003Cbool> &G, int u = 0)\n",[78,57330,57331],{"class":124,"line":150},[78,57332,51145],{},[78,57334,57335],{"class":124,"line":156},[78,57336,57042],{},[78,57338,57339],{"class":124,"line":162},[78,57340,57341],{},"    vector\u003Cint> L(n, 0);  \u002F\u002F 设置L中有n个元素，每个元素值为0\n",[78,57343,57344],{"class":124,"line":168},[78,57345,57346],{},"    function\u003Cvoid(int, int)>\n",[78,57348,57349],{"class":124,"line":174},[78,57350,57351],{},"    Level = [&](int u, int level){  \u002F\u002F 区别于外面一圈Level函数，可以调用外圈Level中的参数\n",[78,57353,57354],{"class":124,"line":180},[78,57355,57356],{},"        L[u] = level;\n",[78,57358,57359],{"class":124,"line":186},[78,57360,57066],{},[78,57362,57363],{"class":124,"line":192},[78,57364,57365],{},"            if(L[w] == 0 and G(u, w) == 1)\n",[78,57367,57368],{"class":124,"line":198},[78,57369,57370],{},"                Level(w, level + 1);\n",[78,57372,57373],{"class":124,"line":204},[78,57374,57375],{},"    };\n",[78,57377,57378],{"class":124,"line":210},[78,57379,57380],{},"    Level(u, 1);\n",[78,57382,57383],{"class":124,"line":216},[78,57384,57385],{},"    return L;\n",[78,57387,57388],{"class":124,"line":222},[78,57389,23518],{},[10548,57391,57393],{"id":57392},"图的宽度优先遍历算法改输出图的每个连通分支","图的宽度优先遍历算法（改）输出图的每个连通分支",[114,57395,57397],{"className":51126,"code":57396,"language":51128,"meta":119,"style":119},"#include \"..\u002Falgorithm.h\"\nauto BFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited)\n{ \n    int n = G.rows();\n    queue\u003Cint> Q;\n    set\u003Cint> part;\n    part \u003C\u003C v, Visited[v] = 1, Q.push(v);\n    while(not Q.empty()){ \n        v = Q.front(), Q.pop();\n        for(int w = 0; w \u003C n; ++w)\n            if(not Visited[w] and G(v, w) == 1)\n                part \u003C\u003C w, Visited[w] = 1, Q.push(w);\n        }\n    return part;\n}\nauto BFT(Matrix\u003Cbool> &G)\n{ \n    int n = G.rows();\n    vector\u003Cbool> Visited(n, 0);\n    vector\u003Cset\u003Cint>> parts;  \u002F\u002F 创建一个动态大小的数组parts记录int集合\n    for(int v = 0; v \u003C n; ++v)\n        if(not Visited[v])\n            parts \u003C\u003C BFS(G, v, Visited);  \u002F\u002F 将每个节点都遍历一遍\n    return parts;\n}\n\u002F\u002F 和连通图的主要差别就是BFT函数将所有节点扫一遍，避免出现有些节点单出来的情况。\n\u002F\u002F[1,1,1,0,0],\n\u002F\u002F[1,1,1,0,0],\n\u002F\u002F[1,1,1,0,0],\n\u002F\u002F[0,0,0,1,1],\n\u002F\u002F[0,0,0,1,1]\n",[17,57398,57399,57404,57409,57413,57417,57421,57426,57431,57435,57439,57443,57447,57452,57456,57461,57465,57470,57474,57478,57483,57488,57493,57498,57503,57508,57512,57517,57522,57526,57530,57535],{"__ignoreMap":119},[78,57400,57401],{"class":124,"line":125},[78,57402,57403],{},"#include \"..\u002Falgorithm.h\"\n",[78,57405,57406],{"class":124,"line":132},[78,57407,57408],{},"auto BFS(Matrix\u003Cbool> &G, int v, vector\u003Cbool> &Visited)\n",[78,57410,57411],{"class":124,"line":138},[78,57412,51145],{},[78,57414,57415],{"class":124,"line":144},[78,57416,57042],{},[78,57418,57419],{"class":124,"line":150},[78,57420,57047],{},[78,57422,57423],{"class":124,"line":156},[78,57424,57425],{},"    set\u003Cint> part;\n",[78,57427,57428],{"class":124,"line":162},[78,57429,57430],{},"    part \u003C\u003C v, Visited[v] = 1, Q.push(v);\n",[78,57432,57433],{"class":124,"line":168},[78,57434,56967],{},[78,57436,57437],{"class":124,"line":174},[78,57438,57061],{},[78,57440,57441],{"class":124,"line":180},[78,57442,57066],{},[78,57444,57445],{"class":124,"line":186},[78,57446,57071],{},[78,57448,57449],{"class":124,"line":192},[78,57450,57451],{},"                part \u003C\u003C w, Visited[w] = 1, Q.push(w);\n",[78,57453,57454],{"class":124,"line":198},[78,57455,10054],{},[78,57457,57458],{"class":124,"line":204},[78,57459,57460],{},"    return part;\n",[78,57462,57463],{"class":124,"line":210},[78,57464,23518],{},[78,57466,57467],{"class":124,"line":216},[78,57468,57469],{},"auto BFT(Matrix\u003Cbool> &G)\n",[78,57471,57472],{"class":124,"line":222},[78,57473,51145],{},[78,57475,57476],{"class":124,"line":421},[78,57477,57042],{},[78,57479,57480],{"class":124,"line":427},[78,57481,57482],{},"    vector\u003Cbool> Visited(n, 0);\n",[78,57484,57485],{"class":124,"line":433},[78,57486,57487],{},"    vector\u003Cset\u003Cint>> parts;  \u002F\u002F 创建一个动态大小的数组parts记录int集合\n",[78,57489,57490],{"class":124,"line":2443},[78,57491,57492],{},"    for(int v = 0; v \u003C n; ++v)\n",[78,57494,57495],{"class":124,"line":2448},[78,57496,57497],{},"        if(not Visited[v])\n",[78,57499,57500],{"class":124,"line":2454},[78,57501,57502],{},"            parts \u003C\u003C BFS(G, v, Visited);  \u002F\u002F 将每个节点都遍历一遍\n",[78,57504,57505],{"class":124,"line":2460},[78,57506,57507],{},"    return parts;\n",[78,57509,57510],{"class":124,"line":2465},[78,57511,23518],{},[78,57513,57514],{"class":124,"line":2470},[78,57515,57516],{},"\u002F\u002F 和连通图的主要差别就是BFT函数将所有节点扫一遍，避免出现有些节点单出来的情况。\n",[78,57518,57519],{"class":124,"line":2903},[78,57520,57521],{},"\u002F\u002F[1,1,1,0,0],\n",[78,57523,57524],{"class":124,"line":2909},[78,57525,57521],{},[78,57527,57528],{"class":124,"line":11477},[78,57529,57521],{},[78,57531,57532],{"class":124,"line":13374},[78,57533,57534],{},"\u002F\u002F[0,0,0,1,1],\n",[78,57536,57537],{"class":124,"line":13380},[78,57538,57539],{},"\u002F\u002F[0,0,0,1,1]\n",[107,57541,57542],{"id":57542},"分治方法",[10548,57544,57546],{"id":57545},"折半搜索升序数组","折半搜索（升序数组）",[114,57548,57550],{"className":51126,"code":57549,"language":51128,"meta":119,"style":119},"\u002F\u002F 从一个升序数组中查找一个元素\ntemplate\u003Cclass T, class T2>\nint search(T X[], int n, const T2 &v)\n{ \n    int low = 0, up = n;\n    while(low \u003C up){ \n        int m = (low + up) \u002F 2;\n        if(v == X[m]) return m;\n        else if(v \u003C X[m]) up = m;\n        else low = m + 1;\n    }\n    return -1;\n}\n\u002F\u002F 时间复杂度为O(log(n))\n",[17,57551,57552,57557,57561,57566,57570,57575,57580,57585,57590,57595,57600,57604,57609,57613],{"__ignoreMap":119},[78,57553,57554],{"class":124,"line":125},[78,57555,57556],{},"\u002F\u002F 从一个升序数组中查找一个元素\n",[78,57558,57559],{"class":124,"line":132},[78,57560,56686],{},[78,57562,57563],{"class":124,"line":138},[78,57564,57565],{},"int search(T X[], int n, const T2 &v)\n",[78,57567,57568],{"class":124,"line":144},[78,57569,51145],{},[78,57571,57572],{"class":124,"line":150},[78,57573,57574],{},"    int low = 0, up = n;\n",[78,57576,57577],{"class":124,"line":156},[78,57578,57579],{},"    while(low \u003C up){ \n",[78,57581,57582],{"class":124,"line":162},[78,57583,57584],{},"        int m = (low + up) \u002F 2;\n",[78,57586,57587],{"class":124,"line":168},[78,57588,57589],{},"        if(v == X[m]) return m;\n",[78,57591,57592],{"class":124,"line":174},[78,57593,57594],{},"        else if(v \u003C X[m]) up = m;\n",[78,57596,57597],{"class":124,"line":180},[78,57598,57599],{},"        else low = m + 1;\n",[78,57601,57602],{"class":124,"line":186},[78,57603,15810],{},[78,57605,57606],{"class":124,"line":192},[78,57607,57608],{},"    return -1;\n",[78,57610,57611],{"class":124,"line":198},[78,57612,23518],{},[78,57614,57615],{"class":124,"line":204},[78,57616,57617],{},"\u002F\u002F 时间复杂度为O(log(n))\n",[10548,57619,57620],{"id":57620},"归并排序",[114,57622,57624],{"className":51126,"code":57623,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nvoid Merge(T W[], int low, int m, int up)\n{ \n    vector X(W + low, W + m);  \u002F\u002F 创建动态数组X长度为low~m，存入low~m的数据\n    vector Y(W + m, W + up);  \u002F\u002F 创建动态数组Y长度为m~up，存入m~up的数据\n    int nx = size(X), ny = size(Y);\n    int i = 0, j = 0, k = low;\n    while(i \u003C nx and j \u003C ny)  \u002F\u002F 将X、Y中数据进行比较，存入W数组\n        if(X[i] \u003C Y[j])\n            W[k] = X[i], ++k, ++i;\n        else\n            W[k] = Y[j], ++k, ++j;\n    while(i \u003C nx)  \u002F\u002F 将比较完后未存入的元素存入\n        W[k] = X[i], ++k, ++i;\n    while(j \u003C ny)\n        W[k] = Y[j], ++k, ++j;\n}\ntemplate\u003Cclass T>\nvoid MergeSort(T X[], int low, int up)\n{ \n    if(up - low \u003C= 1) return;\n    int m = (low + up) \u002F 2;\n    MergeSort(X, low, m);  \u002F\u002F 左右递归再向上排序\n    MergeSort(X, m, up);\n    Merge(X, low, m, up);\n}\n\u002F\u002F 时间复杂度为Θ(n * log(n))\n",[17,57625,57626,57630,57635,57639,57644,57649,57654,57659,57664,57669,57674,57679,57684,57689,57694,57699,57704,57708,57712,57717,57721,57726,57731,57736,57741,57746,57750],{"__ignoreMap":119},[78,57627,57628],{"class":124,"line":125},[78,57629,51135],{},[78,57631,57632],{"class":124,"line":132},[78,57633,57634],{},"void Merge(T W[], int low, int m, int up)\n",[78,57636,57637],{"class":124,"line":138},[78,57638,51145],{},[78,57640,57641],{"class":124,"line":144},[78,57642,57643],{},"    vector X(W + low, W + m);  \u002F\u002F 创建动态数组X长度为low~m，存入low~m的数据\n",[78,57645,57646],{"class":124,"line":150},[78,57647,57648],{},"    vector Y(W + m, W + up);  \u002F\u002F 创建动态数组Y长度为m~up，存入m~up的数据\n",[78,57650,57651],{"class":124,"line":156},[78,57652,57653],{},"    int nx = size(X), ny = size(Y);\n",[78,57655,57656],{"class":124,"line":162},[78,57657,57658],{},"    int i = 0, j = 0, k = low;\n",[78,57660,57661],{"class":124,"line":168},[78,57662,57663],{},"    while(i \u003C nx and j \u003C ny)  \u002F\u002F 将X、Y中数据进行比较，存入W数组\n",[78,57665,57666],{"class":124,"line":174},[78,57667,57668],{},"        if(X[i] \u003C Y[j])\n",[78,57670,57671],{"class":124,"line":180},[78,57672,57673],{},"            W[k] = X[i], ++k, ++i;\n",[78,57675,57676],{"class":124,"line":186},[78,57677,57678],{},"        else\n",[78,57680,57681],{"class":124,"line":192},[78,57682,57683],{},"            W[k] = Y[j], ++k, ++j;\n",[78,57685,57686],{"class":124,"line":198},[78,57687,57688],{},"    while(i \u003C nx)  \u002F\u002F 将比较完后未存入的元素存入\n",[78,57690,57691],{"class":124,"line":204},[78,57692,57693],{},"        W[k] = X[i], ++k, ++i;\n",[78,57695,57696],{"class":124,"line":210},[78,57697,57698],{},"    while(j \u003C ny)\n",[78,57700,57701],{"class":124,"line":216},[78,57702,57703],{},"        W[k] = Y[j], ++k, ++j;\n",[78,57705,57706],{"class":124,"line":222},[78,57707,23518],{},[78,57709,57710],{"class":124,"line":421},[78,57711,51135],{},[78,57713,57714],{"class":124,"line":427},[78,57715,57716],{},"void MergeSort(T X[], int low, int up)\n",[78,57718,57719],{"class":124,"line":433},[78,57720,51145],{},[78,57722,57723],{"class":124,"line":2443},[78,57724,57725],{},"    if(up - low \u003C= 1) return;\n",[78,57727,57728],{"class":124,"line":2448},[78,57729,57730],{},"    int m = (low + up) \u002F 2;\n",[78,57732,57733],{"class":124,"line":2454},[78,57734,57735],{},"    MergeSort(X, low, m);  \u002F\u002F 左右递归再向上排序\n",[78,57737,57738],{"class":124,"line":2460},[78,57739,57740],{},"    MergeSort(X, m, up);\n",[78,57742,57743],{"class":124,"line":2465},[78,57744,57745],{},"    Merge(X, low, m, up);\n",[78,57747,57748],{"class":124,"line":2470},[78,57749,23518],{},[78,57751,57752],{"class":124,"line":2903},[78,57753,57754],{},"\u002F\u002F 时间复杂度为Θ(n * log(n))\n",[10548,57756,57757],{"id":57757},"快速排序",[114,57759,57761],{"className":51126,"code":57760,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Partition(T X[], int low, int up)\n{ \n    int key = up - 1, p = low;\n    for(int i = low; i \u003C key; ++i)  \u002F\u002F 每次将比最后一个数小的数排到数组的前面\n        if(X[i] \u003C X[key])\n            swap(X[i], X[p]), ++p;\n    swap(X[key], X[p]);  \u002F\u002F 如果前面所有数都比X[key]小，那么swap(X[key], X[p])实际为swap(X[key], X[key])\n    return p;\n}\ntemplate\u003Cclass T>\nvoid QuickSort(T X[], int low, int up)\n{ \n    if(up - low \u003C= 1) return;\n    int m = Partition(X, low, up);\n    QuickSort(X, low, m);  \u002F\u002F 不断缩小左右区间，直到完成排序\n    QuickSort(X, m + 1, up);\n}\n\u002F\u002F 平均时间复杂度为O(n * log(n))，最坏时间复杂度为O(n ^ 2)\n",[17,57762,57763,57767,57772,57776,57781,57786,57791,57796,57801,57806,57810,57814,57819,57823,57827,57832,57837,57842,57846],{"__ignoreMap":119},[78,57764,57765],{"class":124,"line":125},[78,57766,51135],{},[78,57768,57769],{"class":124,"line":132},[78,57770,57771],{},"int Partition(T X[], int low, int up)\n",[78,57773,57774],{"class":124,"line":138},[78,57775,51145],{},[78,57777,57778],{"class":124,"line":144},[78,57779,57780],{},"    int key = up - 1, p = low;\n",[78,57782,57783],{"class":124,"line":150},[78,57784,57785],{},"    for(int i = low; i \u003C key; ++i)  \u002F\u002F 每次将比最后一个数小的数排到数组的前面\n",[78,57787,57788],{"class":124,"line":156},[78,57789,57790],{},"        if(X[i] \u003C X[key])\n",[78,57792,57793],{"class":124,"line":162},[78,57794,57795],{},"            swap(X[i], X[p]), ++p;\n",[78,57797,57798],{"class":124,"line":168},[78,57799,57800],{},"    swap(X[key], X[p]);  \u002F\u002F 如果前面所有数都比X[key]小，那么swap(X[key], X[p])实际为swap(X[key], X[key])\n",[78,57802,57803],{"class":124,"line":174},[78,57804,57805],{},"    return p;\n",[78,57807,57808],{"class":124,"line":180},[78,57809,23518],{},[78,57811,57812],{"class":124,"line":186},[78,57813,51135],{},[78,57815,57816],{"class":124,"line":192},[78,57817,57818],{},"void QuickSort(T X[], int low, int up)\n",[78,57820,57821],{"class":124,"line":198},[78,57822,51145],{},[78,57824,57825],{"class":124,"line":204},[78,57826,57725],{},[78,57828,57829],{"class":124,"line":210},[78,57830,57831],{},"    int m = Partition(X, low, up);\n",[78,57833,57834],{"class":124,"line":216},[78,57835,57836],{},"    QuickSort(X, low, m);  \u002F\u002F 不断缩小左右区间，直到完成排序\n",[78,57838,57839],{"class":124,"line":222},[78,57840,57841],{},"    QuickSort(X, m + 1, up);\n",[78,57843,57844],{"class":124,"line":421},[78,57845,23518],{},[78,57847,57848],{"class":124,"line":427},[78,57849,57850],{},"\u002F\u002F 平均时间复杂度为O(n * log(n))，最坏时间复杂度为O(n ^ 2)\n",[10548,57852,57853],{"id":57853},"线性时间选择算法",[114,57855,57857],{"className":51126,"code":57856,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Partition(T X[], int low, int up)\n{ \n    int key = up - 1, p = low;\n    for(int i = low; i \u003C key; ++i)\n        if(X[i] \u003C X[key])\n            swap(X[i], X[p]), ++p;\n    swap(X[key], X[p]);\n    return p;\n}\ntemplate\u003Cclass T>\nT &Select(T X[], int n, int k)\n{ \n    int low = 0, up = n;\n    for(;;){ \n        int m = Partition(X, low, up);\n        if(k == m) return X[m];  \u002F\u002F 找到指定元素，算法终止\n        else if(k \u003C m) up = m;\n        else low = m + 1;\n    }\n}\n\u002F\u002F 平均时间复杂度为O(n)，最坏时间复杂度为O(n ^ 2)\n\u002F\u002F 显而易见，这里的Partition函数和上题的一模一样，因此最坏情况（数组降序）时时间复杂度为O(n ^ 2)\n\u002F\u002F 这个算法主要是用来在乱序数组中寻找指定元素\n",[17,57858,57859,57863,57867,57871,57875,57880,57884,57888,57893,57897,57901,57905,57910,57914,57918,57923,57928,57933,57938,57942,57946,57950,57955,57960],{"__ignoreMap":119},[78,57860,57861],{"class":124,"line":125},[78,57862,51135],{},[78,57864,57865],{"class":124,"line":132},[78,57866,57771],{},[78,57868,57869],{"class":124,"line":138},[78,57870,51145],{},[78,57872,57873],{"class":124,"line":144},[78,57874,57780],{},[78,57876,57877],{"class":124,"line":150},[78,57878,57879],{},"    for(int i = low; i \u003C key; ++i)\n",[78,57881,57882],{"class":124,"line":156},[78,57883,57790],{},[78,57885,57886],{"class":124,"line":162},[78,57887,57795],{},[78,57889,57890],{"class":124,"line":168},[78,57891,57892],{},"    swap(X[key], X[p]);\n",[78,57894,57895],{"class":124,"line":174},[78,57896,57805],{},[78,57898,57899],{"class":124,"line":180},[78,57900,23518],{},[78,57902,57903],{"class":124,"line":186},[78,57904,51135],{},[78,57906,57907],{"class":124,"line":192},[78,57908,57909],{},"T &Select(T X[], int n, int k)\n",[78,57911,57912],{"class":124,"line":198},[78,57913,51145],{},[78,57915,57916],{"class":124,"line":204},[78,57917,57574],{},[78,57919,57920],{"class":124,"line":210},[78,57921,57922],{},"    for(;;){ \n",[78,57924,57925],{"class":124,"line":216},[78,57926,57927],{},"        int m = Partition(X, low, up);\n",[78,57929,57930],{"class":124,"line":222},[78,57931,57932],{},"        if(k == m) return X[m];  \u002F\u002F 找到指定元素，算法终止\n",[78,57934,57935],{"class":124,"line":421},[78,57936,57937],{},"        else if(k \u003C m) up = m;\n",[78,57939,57940],{"class":124,"line":427},[78,57941,57599],{},[78,57943,57944],{"class":124,"line":433},[78,57945,15810],{},[78,57947,57948],{"class":124,"line":2443},[78,57949,23518],{},[78,57951,57952],{"class":124,"line":2448},[78,57953,57954],{},"\u002F\u002F 平均时间复杂度为O(n)，最坏时间复杂度为O(n ^ 2)\n",[78,57956,57957],{"class":124,"line":2454},[78,57958,57959],{},"\u002F\u002F 显而易见，这里的Partition函数和上题的一模一样，因此最坏情况（数组降序）时时间复杂度为O(n ^ 2)\n",[78,57961,57962],{"class":124,"line":2460},[78,57963,57964],{},"\u002F\u002F 这个算法主要是用来在乱序数组中寻找指定元素\n",[10548,57966,57968],{"id":57967},"合并数组不含重复元素","合并数组（不含重复元素）",[114,57970,57972],{"className":51126,"code":57971,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Merge(T X[], int m, T Y[], int n, T W[])\n{ \n    int i = 0, j = 0, k = 0;\n    while(i \u003C m and j \u003C n)\n        if(X[i] \u003C Y[j])\n            W[k] = X[i], ++k, ++i;\n        else if(X[i] > Y[j])\n            W[k] = Y[j], ++k, ++j;\n        else\n            W[k] = X[i], ++k, ++i, ++j;\n    while(i \u003C m)\n        W[k] = X[i], ++k, ++i;\n    while(j \u003C n)\n        W[k] = Y[j], ++k, ++j;\n    return k;\n}\n\u002F\u002F 和归并排序的merge函数基本一模一样，就不做赘述\n",[17,57973,57974,57978,57983,57987,57992,57997,58001,58005,58010,58014,58018,58023,58028,58032,58037,58041,58046,58050],{"__ignoreMap":119},[78,57975,57976],{"class":124,"line":125},[78,57977,51135],{},[78,57979,57980],{"class":124,"line":132},[78,57981,57982],{},"int Merge(T X[], int m, T Y[], int n, T W[])\n",[78,57984,57985],{"class":124,"line":138},[78,57986,51145],{},[78,57988,57989],{"class":124,"line":144},[78,57990,57991],{},"    int i = 0, j = 0, k = 0;\n",[78,57993,57994],{"class":124,"line":150},[78,57995,57996],{},"    while(i \u003C m and j \u003C n)\n",[78,57998,57999],{"class":124,"line":156},[78,58000,57668],{},[78,58002,58003],{"class":124,"line":162},[78,58004,57673],{},[78,58006,58007],{"class":124,"line":168},[78,58008,58009],{},"        else if(X[i] > Y[j])\n",[78,58011,58012],{"class":124,"line":174},[78,58013,57683],{},[78,58015,58016],{"class":124,"line":180},[78,58017,57678],{},[78,58019,58020],{"class":124,"line":186},[78,58021,58022],{},"            W[k] = X[i], ++k, ++i, ++j;\n",[78,58024,58025],{"class":124,"line":192},[78,58026,58027],{},"    while(i \u003C m)\n",[78,58029,58030],{"class":124,"line":198},[78,58031,57693],{},[78,58033,58034],{"class":124,"line":204},[78,58035,58036],{},"    while(j \u003C n)\n",[78,58038,58039],{"class":124,"line":210},[78,58040,57703],{},[78,58042,58043],{"class":124,"line":216},[78,58044,58045],{},"    return k;\n",[78,58047,58048],{"class":124,"line":222},[78,58049,23518],{},[78,58051,58052],{"class":124,"line":421},[78,58053,58054],{},"\u002F\u002F 和归并排序的merge函数基本一模一样，就不做赘述\n",[10548,58056,58057],{"id":58057},"奇偶划分",[114,58059,58061],{"className":51126,"code":58060,"language":51128,"meta":119,"style":119},"int Partition(int X[], int n)\n{ \n    int p = 0;\n    for(int i = 0; i \u003C n; ++i)\n        if(X[i] % 2 == 1)\n            swap(X[i], X[p]), ++p;\n    return p;\n}\n",[17,58062,58063,58068,58072,58077,58082,58087,58091,58095],{"__ignoreMap":119},[78,58064,58065],{"class":124,"line":125},[78,58066,58067],{},"int Partition(int X[], int n)\n",[78,58069,58070],{"class":124,"line":132},[78,58071,51145],{},[78,58073,58074],{"class":124,"line":138},[78,58075,58076],{},"    int p = 0;\n",[78,58078,58079],{"class":124,"line":144},[78,58080,58081],{},"    for(int i = 0; i \u003C n; ++i)\n",[78,58083,58084],{"class":124,"line":150},[78,58085,58086],{},"        if(X[i] % 2 == 1)\n",[78,58088,58089],{"class":124,"line":156},[78,58090,57795],{},[78,58092,58093],{"class":124,"line":162},[78,58094,57805],{},[78,58096,58097],{"class":124,"line":168},[78,58098,23518],{},[107,58100,58101],{"id":58101},"贪心算法",[10548,58103,58104],{"id":58104},"装载问题",[114,58106,58108],{"className":51126,"code":58107,"language":51128,"meta":119,"style":119},"vector\u003Cbool> Load(vector\u003Cdouble> &W, double M)\n{ \n    int n = W.size();\n    sort(begin(W), end(W));  \u002F\u002F 从小到大排序\n    vector\u003Cbool> X(n, 0);\n    double rc = M;\n    for(int i = 0; i \u003C n and W[i] \u003C= rc; ++i)\n        X[i] = 1, rc -= W[i];\n    return X;\n}\n",[17,58109,58110,58115,58119,58124,58129,58134,58139,58144,58149,58154],{"__ignoreMap":119},[78,58111,58112],{"class":124,"line":125},[78,58113,58114],{},"vector\u003Cbool> Load(vector\u003Cdouble> &W, double M)\n",[78,58116,58117],{"class":124,"line":132},[78,58118,51145],{},[78,58120,58121],{"class":124,"line":138},[78,58122,58123],{},"    int n = W.size();\n",[78,58125,58126],{"class":124,"line":144},[78,58127,58128],{},"    sort(begin(W), end(W));  \u002F\u002F 从小到大排序\n",[78,58130,58131],{"class":124,"line":150},[78,58132,58133],{},"    vector\u003Cbool> X(n, 0);\n",[78,58135,58136],{"class":124,"line":156},[78,58137,58138],{},"    double rc = M;\n",[78,58140,58141],{"class":124,"line":162},[78,58142,58143],{},"    for(int i = 0; i \u003C n and W[i] \u003C= rc; ++i)\n",[78,58145,58146],{"class":124,"line":168},[78,58147,58148],{},"        X[i] = 1, rc -= W[i];\n",[78,58150,58151],{"class":124,"line":174},[78,58152,58153],{},"    return X;\n",[78,58155,58156],{"class":124,"line":180},[78,58157,23518],{},[10548,58159,58160],{"id":58160},"背包问题",[114,58162,58164],{"className":51126,"code":58163,"language":51128,"meta":119,"style":119},"void Sort(vector\u003Cdouble> &V, vector\u003Cdouble> &W)\n{ \n    struct oType { double v, w; };  \u002F\u002F 一个物品具有价值、重量两个属性\n    auto cmp = [](oType p, oType q){ \n        return p.v \u002F p.w > q.v \u002F q.w;\n    };\n    int n = min(V.size(), W.size());\n    vector\u003CoType> X(n);\n    for(int i = 0; i \u003C n; ++i)\n        X[i] = {V[i], W[i]};\n    sort(begin(X), end(X), cmp);  \u002F\u002F 这个可能是按照cmp规则对X进行排序（题主C++不太好QWQ）\n    for(int i = 0; i \u003C n; ++i)\n        V[i] = X[i].v, W[i] = X[i].w;\n}\nvector\u003Cdouble> Knap(vector\u003Cdouble> &V, vector\u003Cdouble> &W, double M)\n{ \n    int n = min(V.size(), W.size());  \u002F\u002F 避免出现价值、重量不同导致物品个数出问题\n    Sort(V, W);\n    vector\u003Cdouble> X(n, 0);\n    double rc = M;\n    int t;\n    for(t = 0; t \u003C n and W[t] \u003C= rc; ++t)\n        X[t] = 1, rc -= W[t];\n    if(t \u003C n)  \u002F\u002F 这一步很多余，毕竟不可能只把一个物品放一部分进背包\n        X[t] = rc \u002F W[t];\n    return X;\n}\n\u002F\u002F Knap函数在Sort函数下部分与装载问题无异，因此Sort函数主要是将价值\u002F重量进行排序\n",[17,58165,58166,58171,58175,58180,58185,58190,58194,58199,58204,58208,58213,58218,58222,58227,58231,58236,58240,58245,58250,58255,58259,58264,58269,58274,58279,58284,58288,58292],{"__ignoreMap":119},[78,58167,58168],{"class":124,"line":125},[78,58169,58170],{},"void Sort(vector\u003Cdouble> &V, vector\u003Cdouble> &W)\n",[78,58172,58173],{"class":124,"line":132},[78,58174,51145],{},[78,58176,58177],{"class":124,"line":138},[78,58178,58179],{},"    struct oType { double v, w; };  \u002F\u002F 一个物品具有价值、重量两个属性\n",[78,58181,58182],{"class":124,"line":144},[78,58183,58184],{},"    auto cmp = [](oType p, oType q){ \n",[78,58186,58187],{"class":124,"line":150},[78,58188,58189],{},"        return p.v \u002F p.w > q.v \u002F q.w;\n",[78,58191,58192],{"class":124,"line":156},[78,58193,57375],{},[78,58195,58196],{"class":124,"line":162},[78,58197,58198],{},"    int n = min(V.size(), W.size());\n",[78,58200,58201],{"class":124,"line":168},[78,58202,58203],{},"    vector\u003CoType> X(n);\n",[78,58205,58206],{"class":124,"line":174},[78,58207,58081],{},[78,58209,58210],{"class":124,"line":180},[78,58211,58212],{},"        X[i] = {V[i], W[i]};\n",[78,58214,58215],{"class":124,"line":186},[78,58216,58217],{},"    sort(begin(X), end(X), cmp);  \u002F\u002F 这个可能是按照cmp规则对X进行排序（题主C++不太好QWQ）\n",[78,58219,58220],{"class":124,"line":192},[78,58221,58081],{},[78,58223,58224],{"class":124,"line":198},[78,58225,58226],{},"        V[i] = X[i].v, W[i] = X[i].w;\n",[78,58228,58229],{"class":124,"line":204},[78,58230,23518],{},[78,58232,58233],{"class":124,"line":210},[78,58234,58235],{},"vector\u003Cdouble> Knap(vector\u003Cdouble> &V, vector\u003Cdouble> &W, double M)\n",[78,58237,58238],{"class":124,"line":216},[78,58239,51145],{},[78,58241,58242],{"class":124,"line":222},[78,58243,58244],{},"    int n = min(V.size(), W.size());  \u002F\u002F 避免出现价值、重量不同导致物品个数出问题\n",[78,58246,58247],{"class":124,"line":421},[78,58248,58249],{},"    Sort(V, W);\n",[78,58251,58252],{"class":124,"line":427},[78,58253,58254],{},"    vector\u003Cdouble> X(n, 0);\n",[78,58256,58257],{"class":124,"line":433},[78,58258,58138],{},[78,58260,58261],{"class":124,"line":2443},[78,58262,58263],{},"    int t;\n",[78,58265,58266],{"class":124,"line":2448},[78,58267,58268],{},"    for(t = 0; t \u003C n and W[t] \u003C= rc; ++t)\n",[78,58270,58271],{"class":124,"line":2454},[78,58272,58273],{},"        X[t] = 1, rc -= W[t];\n",[78,58275,58276],{"class":124,"line":2460},[78,58277,58278],{},"    if(t \u003C n)  \u002F\u002F 这一步很多余，毕竟不可能只把一个物品放一部分进背包\n",[78,58280,58281],{"class":124,"line":2465},[78,58282,58283],{},"        X[t] = rc \u002F W[t];\n",[78,58285,58286],{"class":124,"line":2470},[78,58287,58153],{},[78,58289,58290],{"class":124,"line":2903},[78,58291,23518],{},[78,58293,58294],{"class":124,"line":2909},[78,58295,58296],{},"\u002F\u002F Knap函数在Sort函数下部分与装载问题无异，因此Sort函数主要是将价值\u002F重量进行排序\n",[10548,58298,58299],{"id":58299},"活动安排问题",[13,58301,58302],{},"已知n个活动E = {1，2，…，n}需要使用同一资源，第k个活动的开始和结束时间分别是s_k和f_k，其中s_k \u003C f_k, k = 1，2，…，n。",[13,58304,58305],{},"简单来说就是一个集合中有若干元素，每个元素含有起始（s_k）、结束（f_k）两个值，只有在起始时间才能开始，占用资源直到结束时间结束，经历了起始和结束的元素才能进入子集。求这个集合中能完成的最大子集。",[13,58307,58308],{},"贪心思想就是当一个活动结束立即找到一个活动开始，优先找到结束时间早的活动。",[114,58310,58312],{"className":51126,"code":58311,"language":51128,"meta":119,"style":119},"void Sort(vector\u003Cdouble> &S, vector\u003Cdouble> &F)\n{ \n    struct oType { double s, f; };\n    auto cmp = [](oType p, oType q){ \n        return p.f \u003C q.f;  \u002F\u002F 按照结束时间进行排序\n    };\n    int n = min(S.size(), F.size());\n    vector\u003CoType> X(n);\n    for(int i = 0; i \u003C n; ++i)\n        X[i] = {S[i], F[i]};\n    sort(begin(X), end(X), cmp);\n    for(int i = 0; i \u003C n; ++i)\n        S[i] = X[i].s, F[i] = X[i].f;\n}\nvector\u003Cbool> Action(vector\u003Cdouble> &S, vector\u003Cdouble> &F)  \u002F\u002F S是起始时间数组；F是结束时间数组（Start\u002FFinal）\n{ \n    int n = min(S.size(), F.size());\n    Sort(S, F);\n    vector\u003Cbool> X(n, 0);\n    X[0] = 1;\n    for(int i = 1, j = 0; i \u003C n; ++i)\n        if(S[i] >= F[j])\n            X[i] = 1, j = i;\n    return X;\n}\n\u002F\u002F 主体和背包问题类似，明确两者的贪心条件区别，可以同时记忆\n",[17,58313,58314,58319,58323,58328,58332,58337,58341,58346,58350,58354,58359,58364,58368,58373,58377,58382,58386,58390,58395,58399,58404,58409,58414,58419,58423,58427],{"__ignoreMap":119},[78,58315,58316],{"class":124,"line":125},[78,58317,58318],{},"void Sort(vector\u003Cdouble> &S, vector\u003Cdouble> &F)\n",[78,58320,58321],{"class":124,"line":132},[78,58322,51145],{},[78,58324,58325],{"class":124,"line":138},[78,58326,58327],{},"    struct oType { double s, f; };\n",[78,58329,58330],{"class":124,"line":144},[78,58331,58184],{},[78,58333,58334],{"class":124,"line":150},[78,58335,58336],{},"        return p.f \u003C q.f;  \u002F\u002F 按照结束时间进行排序\n",[78,58338,58339],{"class":124,"line":156},[78,58340,57375],{},[78,58342,58343],{"class":124,"line":162},[78,58344,58345],{},"    int n = min(S.size(), F.size());\n",[78,58347,58348],{"class":124,"line":168},[78,58349,58203],{},[78,58351,58352],{"class":124,"line":174},[78,58353,58081],{},[78,58355,58356],{"class":124,"line":180},[78,58357,58358],{},"        X[i] = {S[i], F[i]};\n",[78,58360,58361],{"class":124,"line":186},[78,58362,58363],{},"    sort(begin(X), end(X), cmp);\n",[78,58365,58366],{"class":124,"line":192},[78,58367,58081],{},[78,58369,58370],{"class":124,"line":198},[78,58371,58372],{},"        S[i] = X[i].s, F[i] = X[i].f;\n",[78,58374,58375],{"class":124,"line":204},[78,58376,23518],{},[78,58378,58379],{"class":124,"line":210},[78,58380,58381],{},"vector\u003Cbool> Action(vector\u003Cdouble> &S, vector\u003Cdouble> &F)  \u002F\u002F S是起始时间数组；F是结束时间数组（Start\u002FFinal）\n",[78,58383,58384],{"class":124,"line":216},[78,58385,51145],{},[78,58387,58388],{"class":124,"line":222},[78,58389,58345],{},[78,58391,58392],{"class":124,"line":421},[78,58393,58394],{},"    Sort(S, F);\n",[78,58396,58397],{"class":124,"line":427},[78,58398,58133],{},[78,58400,58401],{"class":124,"line":433},[78,58402,58403],{},"    X[0] = 1;\n",[78,58405,58406],{"class":124,"line":2443},[78,58407,58408],{},"    for(int i = 1, j = 0; i \u003C n; ++i)\n",[78,58410,58411],{"class":124,"line":2448},[78,58412,58413],{},"        if(S[i] >= F[j])\n",[78,58415,58416],{"class":124,"line":2454},[78,58417,58418],{},"            X[i] = 1, j = i;\n",[78,58420,58421],{"class":124,"line":2460},[78,58422,58153],{},[78,58424,58425],{"class":124,"line":2465},[78,58426,23518],{},[78,58428,58429],{"class":124,"line":2470},[78,58430,58431],{},"\u002F\u002F 主体和背包问题类似，明确两者的贪心条件区别，可以同时记忆\n",[10548,58433,58435],{"id":58434},"最小生成树prim算法","最小生成树Prim算法",[13,58437,58438],{},"从图的任一节点开始，每次找到与该节点连通的最短路径的节点（未被访问），直到遍历完所有节点",[114,58440,58442],{"className":51126,"code":58441,"language":51128,"meta":119,"style":119},"\u002F\u002F .assign()：C++ string类的成员函数，用于拷贝、赋值操作，它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上。\n\u002F\u002F isinf()函数是cmath标头的库函数，用于检查给定值是否为无限(负无穷大或正无穷大)。如果给定值是无穷大，则返回1；否则，返回0。 \nbool Prim(const Matrix\u003Cdouble> &G, int v, vector\u003Cint> &prev)\n{ \n    int n = G.rows();\n    prev.assign(n, v); \u002F\u002F prev保存各节点的父亲，初始为根v（这里不写0是因为可能你设置的起始节点不是0）\n    vector\u003Cbool> S(n, false);  \u002F\u002F 记录节点是否被选，初始值为false\n    S[v] = true;\n    for(int i = 0; i \u003C n - 1; ++i){ \n        double min = INFINITY;\n        for(int w = 0; w \u003C n; ++w)\n            if(not S[w] and G(prev[w], w) \u003C min) \n                min = G(prev[w], w), v = w;  \u002F\u002F 找到与节点相邻的最短边\n        if(isinf(min)) return false;  \u002F\u002F 判断节点间是否连通\n        S[v] = true;\n        for(int w = 0; w \u003C n; ++w)\n            if(not S[w] and G(v, w) \u003C G(prev[w], w))  \u002F\u002F 更新未选顶点的父亲）\n                prev[w] = v;\n    }\n    return true;\n}\n\u002F\u002F 该题主要用于判断无向图是否连通\n",[17,58443,58444,58449,58454,58459,58463,58467,58472,58477,58482,58487,58492,58496,58501,58506,58511,58516,58520,58525,58530,58534,58539,58543],{"__ignoreMap":119},[78,58445,58446],{"class":124,"line":125},[78,58447,58448],{},"\u002F\u002F .assign()：C++ string类的成员函数，用于拷贝、赋值操作，它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上。\n",[78,58450,58451],{"class":124,"line":132},[78,58452,58453],{},"\u002F\u002F isinf()函数是cmath标头的库函数，用于检查给定值是否为无限(负无穷大或正无穷大)。如果给定值是无穷大，则返回1；否则，返回0。 \n",[78,58455,58456],{"class":124,"line":138},[78,58457,58458],{},"bool Prim(const Matrix\u003Cdouble> &G, int v, vector\u003Cint> &prev)\n",[78,58460,58461],{"class":124,"line":144},[78,58462,51145],{},[78,58464,58465],{"class":124,"line":150},[78,58466,57042],{},[78,58468,58469],{"class":124,"line":156},[78,58470,58471],{},"    prev.assign(n, v); \u002F\u002F prev保存各节点的父亲，初始为根v（这里不写0是因为可能你设置的起始节点不是0）\n",[78,58473,58474],{"class":124,"line":162},[78,58475,58476],{},"    vector\u003Cbool> S(n, false);  \u002F\u002F 记录节点是否被选，初始值为false\n",[78,58478,58479],{"class":124,"line":168},[78,58480,58481],{},"    S[v] = true;\n",[78,58483,58484],{"class":124,"line":174},[78,58485,58486],{},"    for(int i = 0; i \u003C n - 1; ++i){ \n",[78,58488,58489],{"class":124,"line":180},[78,58490,58491],{},"        double min = INFINITY;\n",[78,58493,58494],{"class":124,"line":186},[78,58495,57066],{},[78,58497,58498],{"class":124,"line":192},[78,58499,58500],{},"            if(not S[w] and G(prev[w], w) \u003C min) \n",[78,58502,58503],{"class":124,"line":198},[78,58504,58505],{},"                min = G(prev[w], w), v = w;  \u002F\u002F 找到与节点相邻的最短边\n",[78,58507,58508],{"class":124,"line":204},[78,58509,58510],{},"        if(isinf(min)) return false;  \u002F\u002F 判断节点间是否连通\n",[78,58512,58513],{"class":124,"line":210},[78,58514,58515],{},"        S[v] = true;\n",[78,58517,58518],{"class":124,"line":216},[78,58519,57066],{},[78,58521,58522],{"class":124,"line":222},[78,58523,58524],{},"            if(not S[w] and G(v, w) \u003C G(prev[w], w))  \u002F\u002F 更新未选顶点的父亲）\n",[78,58526,58527],{"class":124,"line":421},[78,58528,58529],{},"                prev[w] = v;\n",[78,58531,58532],{"class":124,"line":427},[78,58533,15810],{},[78,58535,58536],{"class":124,"line":433},[78,58537,58538],{},"    return true;\n",[78,58540,58541],{"class":124,"line":2443},[78,58542,23518],{},[78,58544,58545],{"class":124,"line":2448},[78,58546,58547],{},"\u002F\u002F 该题主要用于判断无向图是否连通\n",[10548,58549,58551],{"id":58550},"最小生成树kruskal算法","最小生成树Kruskal算法",[13,58553,58554],{},"将节点之间的边按照升序排列，选取最短边，在不形成环的情况下遍历完所有节点。",[114,58556,58558],{"className":51126,"code":58557,"language":51128,"meta":119,"style":119},"bool Kruskal(vector\u003CEdge> &Ed, int n, vector\u003CEdge> &X)\n{ \n    if(Ed.size() \u003C n - 1) return false;  \u002F\u002F 边数比节点个数少不可能连通\n    sort(begin(Ed), end(Ed));\n    UnionFind U(n);  \u002F\u002F 并查集结构，初始将每个节点作为一个子树\n    X = {};\n    for(auto e : Ed){ \n        int u = U.Find(e.u), v = U.Find(e.v);\n        if(u == v) continue;  \u002F\u002F 两节点是一个分支的，不用合并直接进入下一个节点判别\n        U.Union(u, v);\n        X.push_back(e);  \u002F\u002F 记录节点e已被使用\n        if(X.size() >= n - 1) return true;\n    }\n    return false;\n}   \n",[17,58559,58560,58565,58569,58574,58579,58584,58589,58594,58599,58604,58609,58614,58619,58623,58628],{"__ignoreMap":119},[78,58561,58562],{"class":124,"line":125},[78,58563,58564],{},"bool Kruskal(vector\u003CEdge> &Ed, int n, vector\u003CEdge> &X)\n",[78,58566,58567],{"class":124,"line":132},[78,58568,51145],{},[78,58570,58571],{"class":124,"line":138},[78,58572,58573],{},"    if(Ed.size() \u003C n - 1) return false;  \u002F\u002F 边数比节点个数少不可能连通\n",[78,58575,58576],{"class":124,"line":144},[78,58577,58578],{},"    sort(begin(Ed), end(Ed));\n",[78,58580,58581],{"class":124,"line":150},[78,58582,58583],{},"    UnionFind U(n);  \u002F\u002F 并查集结构，初始将每个节点作为一个子树\n",[78,58585,58586],{"class":124,"line":156},[78,58587,58588],{},"    X = {};\n",[78,58590,58591],{"class":124,"line":162},[78,58592,58593],{},"    for(auto e : Ed){ \n",[78,58595,58596],{"class":124,"line":168},[78,58597,58598],{},"        int u = U.Find(e.u), v = U.Find(e.v);\n",[78,58600,58601],{"class":124,"line":174},[78,58602,58603],{},"        if(u == v) continue;  \u002F\u002F 两节点是一个分支的，不用合并直接进入下一个节点判别\n",[78,58605,58606],{"class":124,"line":180},[78,58607,58608],{},"        U.Union(u, v);\n",[78,58610,58611],{"class":124,"line":186},[78,58612,58613],{},"        X.push_back(e);  \u002F\u002F 记录节点e已被使用\n",[78,58615,58616],{"class":124,"line":192},[78,58617,58618],{},"        if(X.size() >= n - 1) return true;\n",[78,58620,58621],{"class":124,"line":198},[78,58622,15810],{},[78,58624,58625],{"class":124,"line":204},[78,58626,58627],{},"    return false;\n",[78,58629,58630],{"class":124,"line":210},[78,58631,23518],{},[10548,58633,58634],{"id":58634},"多机调度问题",[114,58636,58638],{"className":51126,"code":58637,"language":51128,"meta":119,"style":119},"#include\u003Cqueue.hpp>\nusing namespace std;\nstruct Machine { int i, tm; }; \u002F\u002F 机器号, 使用时间\nbool operator\u003C(const Machine &x, const Machine &y)\n{ \n    return x.tm \u003C y.tm; \u002F\u002F 比较使用时间\n}\nauto InitMachine(int m) \u002F\u002F 初始化机器和最小堆\n{ \n    minheap\u003CMachine> H;\n    for(int i = 0; i \u003C m; ++i)\n        H.push({i, 0});\n    return H;\n}\nauto LPT(vector\u003Cint> &J, int m) \u002F\u002F n是作业数, m是机器数, n>m\n{ \n    sort(begin(J), end(J)); \u002F\u002F 作业按照所需处理时间升序排列\n    auto H = InitMachine(m); \u002F\u002F 初始化机器和最小堆\n    int n = J.size(); \u002F\u002F 作业数\n    vector\u003Cint> X(n); \u002F\u002F 当前调度\n    for(int t = n - 1; t >= 0; --t) \u002F\u002F 从处理时间最长的作业开始\n    { \n        auto [i, tm] = H.top(); H.pop(); \u002F\u002F 选用最早空闲的机器\n        X[t] = i, tm += J[t]; \u002F\u002F 作业t安排到机器i\n        H.push({i, tm});\n    }\n    return X;\n}\n\u002F\u002F 因为这题代码过长，强行理解不如按照自己的思路去写一个全新的，所以对于参考代码不做过多赘述。\n",[17,58639,58640,58645,58649,58654,58659,58663,58668,58672,58677,58681,58686,58691,58696,58701,58705,58710,58714,58719,58724,58729,58734,58739,58744,58749,58754,58759,58763,58767,58771],{"__ignoreMap":119},[78,58641,58642],{"class":124,"line":125},[78,58643,58644],{},"#include\u003Cqueue.hpp>\n",[78,58646,58647],{"class":124,"line":132},[78,58648,51205],{},[78,58650,58651],{"class":124,"line":138},[78,58652,58653],{},"struct Machine { int i, tm; }; \u002F\u002F 机器号, 使用时间\n",[78,58655,58656],{"class":124,"line":144},[78,58657,58658],{},"bool operator\u003C(const Machine &x, const Machine &y)\n",[78,58660,58661],{"class":124,"line":150},[78,58662,51145],{},[78,58664,58665],{"class":124,"line":156},[78,58666,58667],{},"    return x.tm \u003C y.tm; \u002F\u002F 比较使用时间\n",[78,58669,58670],{"class":124,"line":162},[78,58671,23518],{},[78,58673,58674],{"class":124,"line":168},[78,58675,58676],{},"auto InitMachine(int m) \u002F\u002F 初始化机器和最小堆\n",[78,58678,58679],{"class":124,"line":174},[78,58680,51145],{},[78,58682,58683],{"class":124,"line":180},[78,58684,58685],{},"    minheap\u003CMachine> H;\n",[78,58687,58688],{"class":124,"line":186},[78,58689,58690],{},"    for(int i = 0; i \u003C m; ++i)\n",[78,58692,58693],{"class":124,"line":192},[78,58694,58695],{},"        H.push({i, 0});\n",[78,58697,58698],{"class":124,"line":198},[78,58699,58700],{},"    return H;\n",[78,58702,58703],{"class":124,"line":204},[78,58704,23518],{},[78,58706,58707],{"class":124,"line":210},[78,58708,58709],{},"auto LPT(vector\u003Cint> &J, int m) \u002F\u002F n是作业数, m是机器数, n>m\n",[78,58711,58712],{"class":124,"line":216},[78,58713,51145],{},[78,58715,58716],{"class":124,"line":222},[78,58717,58718],{},"    sort(begin(J), end(J)); \u002F\u002F 作业按照所需处理时间升序排列\n",[78,58720,58721],{"class":124,"line":421},[78,58722,58723],{},"    auto H = InitMachine(m); \u002F\u002F 初始化机器和最小堆\n",[78,58725,58726],{"class":124,"line":427},[78,58727,58728],{},"    int n = J.size(); \u002F\u002F 作业数\n",[78,58730,58731],{"class":124,"line":433},[78,58732,58733],{},"    vector\u003Cint> X(n); \u002F\u002F 当前调度\n",[78,58735,58736],{"class":124,"line":2443},[78,58737,58738],{},"    for(int t = n - 1; t >= 0; --t) \u002F\u002F 从处理时间最长的作业开始\n",[78,58740,58741],{"class":124,"line":2448},[78,58742,58743],{},"    { \n",[78,58745,58746],{"class":124,"line":2454},[78,58747,58748],{},"        auto [i, tm] = H.top(); H.pop(); \u002F\u002F 选用最早空闲的机器\n",[78,58750,58751],{"class":124,"line":2460},[78,58752,58753],{},"        X[t] = i, tm += J[t]; \u002F\u002F 作业t安排到机器i\n",[78,58755,58756],{"class":124,"line":2465},[78,58757,58758],{},"        H.push({i, tm});\n",[78,58760,58761],{"class":124,"line":2470},[78,58762,15810],{},[78,58764,58765],{"class":124,"line":2903},[78,58766,58153],{},[78,58768,58769],{"class":124,"line":2909},[78,58770,23518],{},[78,58772,58773],{"class":124,"line":11477},[78,58774,58775],{},"\u002F\u002F 因为这题代码过长，强行理解不如按照自己的思路去写一个全新的，所以对于参考代码不做过多赘述。\n",[13,58777,58778],{},"多级调度问题主要是n个机器、m个作业，每个作业用时不等（可以相等），求最短调度时间。",[13,58780,58781],{},"整体思路（仅供参考）：",[13,58783,58784],{},"（1）将作业调度时间降序排列；（2）找到当前时间最短的机器插入作业；（3）判断下一个作业。",[114,58786,58788],{"className":23652,"code":58787,"language":23654,"meta":119,"style":119},"public int Solution(int n, int m, int T[]){\n    int[] a = new int[n];  \u002F\u002F 记录各机器调度时间\n    Arrays.sort(T,Collections.reverseOrder());  \u002F\u002F 降序排列\n    for(int i = 0;i \u003C m;i++){\n        int min = INFINITY;\n        int pom = 0;\n        for(int j = 0;j \u003C n;j++){\n            if(a[j] \u003C min){\n                min = a[j];\n                pom = j;  \u002F\u002F 记录最短调度机器下标\n            }\n        }\n        a[pom] += m;\n    }\n    int max = 0;\n    for(int i = 0;i \u003C n;i++){  \u002F\u002F 找出所有机器中耗时最长的那个\n        if(max \u003C a[i])\n            max = a[i];\n    }\n    return max;\n}\n",[17,58789,58790,58795,58800,58805,58810,58815,58820,58825,58830,58835,58840,58844,58848,58853,58857,58862,58867,58872,58877,58881,58886],{"__ignoreMap":119},[78,58791,58792],{"class":124,"line":125},[78,58793,58794],{},"public int Solution(int n, int m, int T[]){\n",[78,58796,58797],{"class":124,"line":132},[78,58798,58799],{},"    int[] a = new int[n];  \u002F\u002F 记录各机器调度时间\n",[78,58801,58802],{"class":124,"line":138},[78,58803,58804],{},"    Arrays.sort(T,Collections.reverseOrder());  \u002F\u002F 降序排列\n",[78,58806,58807],{"class":124,"line":144},[78,58808,58809],{},"    for(int i = 0;i \u003C m;i++){\n",[78,58811,58812],{"class":124,"line":150},[78,58813,58814],{},"        int min = INFINITY;\n",[78,58816,58817],{"class":124,"line":156},[78,58818,58819],{},"        int pom = 0;\n",[78,58821,58822],{"class":124,"line":162},[78,58823,58824],{},"        for(int j = 0;j \u003C n;j++){\n",[78,58826,58827],{"class":124,"line":168},[78,58828,58829],{},"            if(a[j] \u003C min){\n",[78,58831,58832],{"class":124,"line":174},[78,58833,58834],{},"                min = a[j];\n",[78,58836,58837],{"class":124,"line":180},[78,58838,58839],{},"                pom = j;  \u002F\u002F 记录最短调度机器下标\n",[78,58841,58842],{"class":124,"line":186},[78,58843,9615],{},[78,58845,58846],{"class":124,"line":192},[78,58847,10054],{},[78,58849,58850],{"class":124,"line":198},[78,58851,58852],{},"        a[pom] += m;\n",[78,58854,58855],{"class":124,"line":204},[78,58856,15810],{},[78,58858,58859],{"class":124,"line":210},[78,58860,58861],{},"    int max = 0;\n",[78,58863,58864],{"class":124,"line":216},[78,58865,58866],{},"    for(int i = 0;i \u003C n;i++){  \u002F\u002F 找出所有机器中耗时最长的那个\n",[78,58868,58869],{"class":124,"line":222},[78,58870,58871],{},"        if(max \u003C a[i])\n",[78,58873,58874],{"class":124,"line":421},[78,58875,58876],{},"            max = a[i];\n",[78,58878,58879],{"class":124,"line":427},[78,58880,15810],{},[78,58882,58883],{"class":124,"line":433},[78,58884,58885],{},"    return max;\n",[78,58887,58888],{"class":124,"line":2443},[78,58889,23518],{},[107,58891,58892],{"id":58892},"动态规划算法",[10548,58894,58895],{"id":58895},"矩阵连乘最优次序",[13,58897,58898],{},"主要是n个矩阵进行矩阵乘法运算时，通过括号改变运算的先后顺序，减少运算次数，找到最佳划分方法，求解最少运算次数.",[114,58900,58902],{"className":51126,"code":58901,"language":51128,"meta":119,"style":119},"Matrix\u003Cint> MatrixChain(int r[], int n)\n{ \n    Matrix\u003Cint> c(n, n, 0), kay(n, n);  \u002F\u002F c(i, j)存储矩阵i连乘矩阵j中的最小值，kay记录分段位置\n    for(int i = n - 2; i >= 0; --i){  \u002F\u002F 第一层循环从链末尾向前保存最优路径\n        for(int j = i + 1; j \u003C n; ++j){ \n            c(i, j) = (int)INFINITY;  \u002F\u002F 初始连乘大小默认最大\n            for(int k = i; k \u003C j; ++k){ \n                int t = c(i, k) + c(k + 1, j) + r[i] * r[k + 1] * r[j + 1];\n                if(t \u003C c(i, j)) c(i, j) = t, kay(i, j) = k;\n            }\n        }\n    }\n    return kay;\n}\n\u002F\u002F 时间复杂度为O(n ^ 3)\n\u002F\u002F 关于这题其实有些费解，因为矩阵能够连乘，因此可以近似看成一条链。具体我也说不很清，题主也是让别人教的QWQ\n",[17,58903,58904,58909,58913,58918,58923,58928,58933,58938,58943,58948,58952,58956,58960,58965,58969,58974],{"__ignoreMap":119},[78,58905,58906],{"class":124,"line":125},[78,58907,58908],{},"Matrix\u003Cint> MatrixChain(int r[], int n)\n",[78,58910,58911],{"class":124,"line":132},[78,58912,51145],{},[78,58914,58915],{"class":124,"line":138},[78,58916,58917],{},"    Matrix\u003Cint> c(n, n, 0), kay(n, n);  \u002F\u002F c(i, j)存储矩阵i连乘矩阵j中的最小值，kay记录分段位置\n",[78,58919,58920],{"class":124,"line":144},[78,58921,58922],{},"    for(int i = n - 2; i >= 0; --i){  \u002F\u002F 第一层循环从链末尾向前保存最优路径\n",[78,58924,58925],{"class":124,"line":150},[78,58926,58927],{},"        for(int j = i + 1; j \u003C n; ++j){ \n",[78,58929,58930],{"class":124,"line":156},[78,58931,58932],{},"            c(i, j) = (int)INFINITY;  \u002F\u002F 初始连乘大小默认最大\n",[78,58934,58935],{"class":124,"line":162},[78,58936,58937],{},"            for(int k = i; k \u003C j; ++k){ \n",[78,58939,58940],{"class":124,"line":168},[78,58941,58942],{},"                int t = c(i, k) + c(k + 1, j) + r[i] * r[k + 1] * r[j + 1];\n",[78,58944,58945],{"class":124,"line":174},[78,58946,58947],{},"                if(t \u003C c(i, j)) c(i, j) = t, kay(i, j) = k;\n",[78,58949,58950],{"class":124,"line":180},[78,58951,9615],{},[78,58953,58954],{"class":124,"line":186},[78,58955,10054],{},[78,58957,58958],{"class":124,"line":192},[78,58959,15810],{},[78,58961,58962],{"class":124,"line":198},[78,58963,58964],{},"    return kay;\n",[78,58966,58967],{"class":124,"line":204},[78,58968,23518],{},[78,58970,58971],{"class":124,"line":210},[78,58972,58973],{},"\u002F\u002F 时间复杂度为O(n ^ 3)\n",[78,58975,58976],{"class":124,"line":216},[78,58977,58978],{},"\u002F\u002F 关于这题其实有些费解，因为矩阵能够连乘，因此可以近似看成一条链。具体我也说不很清，题主也是让别人教的QWQ\n",[10548,58980,58981],{"id":58981},"任意顶点间最短路径长度",[114,58983,58985],{"className":51126,"code":58984,"language":51128,"meta":119,"style":119},"Matrix\u003C double> Floyd(const Matrix\u003Cdouble> &G)\n{ \n    int n = G.rows();\n    auto A = G;\n    for(int k = 0; k \u003C n; ++k)  \u002F\u002F 第一层循环中的k作为中间节点\n        for(int i = 0; i \u003C n; ++i)  \u002F\u002F 二、三层分别为起始节点和终止节点\n            for(int j = 0; j \u003C n; ++j){ \n                auto t = A(i, k) + A(k, j);  \u002F\u002F 在这里将首尾相连，去除k\n                if(t \u003C A(i, j)) \n                    A(i, j) = t;\n            }\n    return A;\n}\n\u002F\u002F 时间复杂度为O(n ^ 3)\n\u002F\u002F 这个算法是直接将所有节点到任一节点的路径直接算出来了，如果要算任意节点可以直接找到结果\n",[17,58986,58987,58992,58996,59000,59005,59010,59015,59020,59025,59030,59035,59039,59044,59048,59052],{"__ignoreMap":119},[78,58988,58989],{"class":124,"line":125},[78,58990,58991],{},"Matrix\u003C double> Floyd(const Matrix\u003Cdouble> &G)\n",[78,58993,58994],{"class":124,"line":132},[78,58995,51145],{},[78,58997,58998],{"class":124,"line":138},[78,58999,57042],{},[78,59001,59002],{"class":124,"line":144},[78,59003,59004],{},"    auto A = G;\n",[78,59006,59007],{"class":124,"line":150},[78,59008,59009],{},"    for(int k = 0; k \u003C n; ++k)  \u002F\u002F 第一层循环中的k作为中间节点\n",[78,59011,59012],{"class":124,"line":156},[78,59013,59014],{},"        for(int i = 0; i \u003C n; ++i)  \u002F\u002F 二、三层分别为起始节点和终止节点\n",[78,59016,59017],{"class":124,"line":162},[78,59018,59019],{},"            for(int j = 0; j \u003C n; ++j){ \n",[78,59021,59022],{"class":124,"line":168},[78,59023,59024],{},"                auto t = A(i, k) + A(k, j);  \u002F\u002F 在这里将首尾相连，去除k\n",[78,59026,59027],{"class":124,"line":174},[78,59028,59029],{},"                if(t \u003C A(i, j)) \n",[78,59031,59032],{"class":124,"line":180},[78,59033,59034],{},"                    A(i, j) = t;\n",[78,59036,59037],{"class":124,"line":186},[78,59038,9615],{},[78,59040,59041],{"class":124,"line":192},[78,59042,59043],{},"    return A;\n",[78,59045,59046],{"class":124,"line":198},[78,59047,23518],{},[78,59049,59050],{"class":124,"line":204},[78,59051,58973],{},[78,59053,59054],{"class":124,"line":210},[78,59055,59056],{},"\u002F\u002F 这个算法是直接将所有节点到任一节点的路径直接算出来了，如果要算任意节点可以直接找到结果\n",[10548,59058,59059],{"id":59059},"多段图",[49,59061,59062,59065,59068,59071],{},[52,59063,59064],{},"多段图是一个带权有向图并且无环",[52,59066,59067],{},"有且仅有一个起始点（原点source）和一个终止节点（汇点target）",[52,59069,59070],{},"它有n个阶段，每个阶段由特定的几个结点构成",[52,59072,59073],{},"每个结点的所有结点都只能指向下一个相邻的阶段，阶段之间不能越界(大概长这样)",[13,59075,59076],{},[617,59077],{"alt":59059,"src":59078},"%E5%A4%9A%E6%AE%B5%E5%9B%BE.png",[114,59080,59082],{"className":51126,"code":59081,"language":51128,"meta":119,"style":119},"vector\u003Cint> MultiGraph(const Matrix\u003Cdouble> &G, int m)\n{ \n    int n = G.rows(), t = n - 1;  \u002F\u002F n顶点数，t汇点（不包含起始点的中继点）\n    vector\u003Cdouble> C(n, 0);  \u002F\u002F C[j]记录从初始节点到汇点的距离，初始为0\n    vector\u003Cint> Next(n);  \u002F\u002F Next记录最短路径上所经过的后继节点\n    for(int j = t - 1; j >= 0; --j){  \u002F\u002F 从终点向前计算\n        int r = j + 1;\n        for(int i = r; i \u003C n; ++i)\n            if(G(j, i) + C[i] \u003C G(j, r) + C[r]) \n                r = i;\n        C[j] = G(j, r) + C[r], Next[j] = r;  \u002F\u002F 存入当前节点到终点的最短路径，并且更新当前节点的后继节点\n    }\n    vector\u003Cint> X(m);\n    X[0] = 0;\n    for(int i = 1; i \u003C m; ++i)  \u002F\u002F 将后继节点转为从起点开始的正向顺序\n        X[i] = Next[X[i - 1]];\n    return X;\n}\n\u002F\u002F 时间复杂度为O(n ^ 2)\n",[17,59083,59084,59089,59093,59098,59103,59108,59113,59118,59123,59128,59133,59138,59142,59147,59152,59157,59162,59166,59170],{"__ignoreMap":119},[78,59085,59086],{"class":124,"line":125},[78,59087,59088],{},"vector\u003Cint> MultiGraph(const Matrix\u003Cdouble> &G, int m)\n",[78,59090,59091],{"class":124,"line":132},[78,59092,51145],{},[78,59094,59095],{"class":124,"line":138},[78,59096,59097],{},"    int n = G.rows(), t = n - 1;  \u002F\u002F n顶点数，t汇点（不包含起始点的中继点）\n",[78,59099,59100],{"class":124,"line":144},[78,59101,59102],{},"    vector\u003Cdouble> C(n, 0);  \u002F\u002F C[j]记录从初始节点到汇点的距离，初始为0\n",[78,59104,59105],{"class":124,"line":150},[78,59106,59107],{},"    vector\u003Cint> Next(n);  \u002F\u002F Next记录最短路径上所经过的后继节点\n",[78,59109,59110],{"class":124,"line":156},[78,59111,59112],{},"    for(int j = t - 1; j >= 0; --j){  \u002F\u002F 从终点向前计算\n",[78,59114,59115],{"class":124,"line":162},[78,59116,59117],{},"        int r = j + 1;\n",[78,59119,59120],{"class":124,"line":168},[78,59121,59122],{},"        for(int i = r; i \u003C n; ++i)\n",[78,59124,59125],{"class":124,"line":174},[78,59126,59127],{},"            if(G(j, i) + C[i] \u003C G(j, r) + C[r]) \n",[78,59129,59130],{"class":124,"line":180},[78,59131,59132],{},"                r = i;\n",[78,59134,59135],{"class":124,"line":186},[78,59136,59137],{},"        C[j] = G(j, r) + C[r], Next[j] = r;  \u002F\u002F 存入当前节点到终点的最短路径，并且更新当前节点的后继节点\n",[78,59139,59140],{"class":124,"line":192},[78,59141,15810],{},[78,59143,59144],{"class":124,"line":198},[78,59145,59146],{},"    vector\u003Cint> X(m);\n",[78,59148,59149],{"class":124,"line":204},[78,59150,59151],{},"    X[0] = 0;\n",[78,59153,59154],{"class":124,"line":210},[78,59155,59156],{},"    for(int i = 1; i \u003C m; ++i)  \u002F\u002F 将后继节点转为从起点开始的正向顺序\n",[78,59158,59159],{"class":124,"line":216},[78,59160,59161],{},"        X[i] = Next[X[i - 1]];\n",[78,59163,59164],{"class":124,"line":222},[78,59165,58153],{},[78,59167,59168],{"class":124,"line":421},[78,59169,23518],{},[78,59171,59172],{"class":124,"line":427},[78,59173,56667],{},[10548,59175,59176],{"id":59176},"两个字符串的最长公共子串",[114,59178,59180],{"className":51126,"code":59179,"language":51128,"meta":119,"style":119},"Matrix\u003Cint> LCSSize(const string &X, const string &Y)\n{ \n    int m = X.size(), n = Y.size();\n    Matrix\u003Cint> C(m + 1, n + 1);  \u002F\u002F 构建一个(m + 1, n + 1)大小的矩阵（从1开始，防止越界）\n    for(int i = 0; i \u003C= m; ++i)\n        for(int j = 0; j \u003C= n; ++j)\n            if(i \u003C= 0 or j \u003C= 0)\n                C(i, j) = 0;\n            else if(X[i - 1] == Y[j - 1])\n                C(i, j) = C(i - 1, j - 1) + 1;  \u002F\u002F 计数代表公共子串有几个元素\n            else\n                C(i, j) = max(C(i - 1, j), C(i, j - 1));  \u002F\u002F 从当前位置的上方或者左边选取较大值填充不相等区域\n    return C;\n}\nstring LCS(const string &X, const string &Y)\n{ \n    auto C = LCSSize(X, Y);\n    int i = X.size(), j = Y.size(), k = C(i, j);  \u002F\u002F k代表最长子串元素个数\n    string Z;\n    while(k > 0)\n        if(X[i - 1] == Y[j - 1])  \u002F\u002F 相等，矩阵脱最外层\n            Z.push_back(X[i - 1]), --i, --j, --k;\n        else if(C(i, j) == C(i - 1, j)) --i;\n        else --j;\n    reverse(begin(Z), end(Z));  \u002F\u002F 反转\n    return Z;\n}\n\u002F\u002F 时间复杂度为O(mn)，其中m=|X|, n=|Y|\n",[17,59181,59182,59187,59191,59196,59201,59206,59211,59216,59221,59226,59231,59236,59241,59246,59250,59255,59259,59264,59269,59274,59279,59284,59289,59294,59299,59304,59309,59313],{"__ignoreMap":119},[78,59183,59184],{"class":124,"line":125},[78,59185,59186],{},"Matrix\u003Cint> LCSSize(const string &X, const string &Y)\n",[78,59188,59189],{"class":124,"line":132},[78,59190,51145],{},[78,59192,59193],{"class":124,"line":138},[78,59194,59195],{},"    int m = X.size(), n = Y.size();\n",[78,59197,59198],{"class":124,"line":144},[78,59199,59200],{},"    Matrix\u003Cint> C(m + 1, n + 1);  \u002F\u002F 构建一个(m + 1, n + 1)大小的矩阵（从1开始，防止越界）\n",[78,59202,59203],{"class":124,"line":150},[78,59204,59205],{},"    for(int i = 0; i \u003C= m; ++i)\n",[78,59207,59208],{"class":124,"line":156},[78,59209,59210],{},"        for(int j = 0; j \u003C= n; ++j)\n",[78,59212,59213],{"class":124,"line":162},[78,59214,59215],{},"            if(i \u003C= 0 or j \u003C= 0)\n",[78,59217,59218],{"class":124,"line":168},[78,59219,59220],{},"                C(i, j) = 0;\n",[78,59222,59223],{"class":124,"line":174},[78,59224,59225],{},"            else if(X[i - 1] == Y[j - 1])\n",[78,59227,59228],{"class":124,"line":180},[78,59229,59230],{},"                C(i, j) = C(i - 1, j - 1) + 1;  \u002F\u002F 计数代表公共子串有几个元素\n",[78,59232,59233],{"class":124,"line":186},[78,59234,59235],{},"            else\n",[78,59237,59238],{"class":124,"line":192},[78,59239,59240],{},"                C(i, j) = max(C(i - 1, j), C(i, j - 1));  \u002F\u002F 从当前位置的上方或者左边选取较大值填充不相等区域\n",[78,59242,59243],{"class":124,"line":198},[78,59244,59245],{},"    return C;\n",[78,59247,59248],{"class":124,"line":204},[78,59249,23518],{},[78,59251,59252],{"class":124,"line":210},[78,59253,59254],{},"string LCS(const string &X, const string &Y)\n",[78,59256,59257],{"class":124,"line":216},[78,59258,51145],{},[78,59260,59261],{"class":124,"line":222},[78,59262,59263],{},"    auto C = LCSSize(X, Y);\n",[78,59265,59266],{"class":124,"line":421},[78,59267,59268],{},"    int i = X.size(), j = Y.size(), k = C(i, j);  \u002F\u002F k代表最长子串元素个数\n",[78,59270,59271],{"class":124,"line":427},[78,59272,59273],{},"    string Z;\n",[78,59275,59276],{"class":124,"line":433},[78,59277,59278],{},"    while(k > 0)\n",[78,59280,59281],{"class":124,"line":2443},[78,59282,59283],{},"        if(X[i - 1] == Y[j - 1])  \u002F\u002F 相等，矩阵脱最外层\n",[78,59285,59286],{"class":124,"line":2448},[78,59287,59288],{},"            Z.push_back(X[i - 1]), --i, --j, --k;\n",[78,59290,59291],{"class":124,"line":2454},[78,59292,59293],{},"        else if(C(i, j) == C(i - 1, j)) --i;\n",[78,59295,59296],{"class":124,"line":2460},[78,59297,59298],{},"        else --j;\n",[78,59300,59301],{"class":124,"line":2465},[78,59302,59303],{},"    reverse(begin(Z), end(Z));  \u002F\u002F 反转\n",[78,59305,59306],{"class":124,"line":2470},[78,59307,59308],{},"    return Z;\n",[78,59310,59311],{"class":124,"line":2903},[78,59312,23518],{},[78,59314,59315],{"class":124,"line":2909},[78,59316,59317],{},"\u002F\u002F 时间复杂度为O(mn)，其中m=|X|, n=|Y|\n",[10548,59319,59321],{"id":59320},"_01背包问题","0\u002F1背包问题",[13,59323,59324],{},"一共有N件物品，每件物品都有其相应的体积和价值，给你一个背包，背包有容量上限，怎样往背包中装物品，能让背包中的物品价值最高。",[114,59326,59328],{"className":51126,"code":59327,"language":51128,"meta":119,"style":119},"#include\u003Cvector>\n#include\u003Cmap>\n#include\u003Cfunctional>\nusing namespace std;\ntypedef vector\u003Cmap\u003Cdouble, double>> RestType;  \u002F\u002F 剩余表, 剩余容量-最优效益对数组\nauto Knap(vector\u003Cdouble> &V, vector\u003Cdouble> &W, double c)  \u002F\u002F 效益数组, 重量数组, 容量\n{\n    int n = min(V.size(), W.size()); \u002F\u002F 物品数\n    RestType M(n); \u002F\u002F 剩余容量-最优效益对数组\n    function\u003Cdouble(int, double)> m = [&](int i, double y){ \n        if(M[i].count(y) > 0) \n            return M[i][y]; \u002F\u002F 已经计算过, 返回\n        double cv; \u002F\u002F 否则, 开始递归计算\n        if(i >= n - 1 and W[i] > y) \n            cv = 0;\n        else if(i >= n - 1) \n            cv = V[i];\n        else if(W[i] > y) \n            cv = m(i + 1, y);\n        else \n            cv = max(m(i + 1, y), m(i + 1, y - W[i]) + V[i]);\n        M[i][y] = cv;\n        return M[i][y];\n    };  \u002F\u002F 调用m(0, c)耗时O(n^2 * 2^n)\n    auto fv = m(0, c);\n    return M;\n}\n",[17,59329,59330,59334,59339,59344,59348,59353,59358,59363,59368,59373,59378,59383,59388,59393,59398,59403,59408,59413,59418,59423,59428,59433,59438,59443,59448,59453,59458],{"__ignoreMap":119},[78,59331,59332],{"class":124,"line":125},[78,59333,51195],{},[78,59335,59336],{"class":124,"line":132},[78,59337,59338],{},"#include\u003Cmap>\n",[78,59340,59341],{"class":124,"line":138},[78,59342,59343],{},"#include\u003Cfunctional>\n",[78,59345,59346],{"class":124,"line":144},[78,59347,51205],{},[78,59349,59350],{"class":124,"line":150},[78,59351,59352],{},"typedef vector\u003Cmap\u003Cdouble, double>> RestType;  \u002F\u002F 剩余表, 剩余容量-最优效益对数组\n",[78,59354,59355],{"class":124,"line":156},[78,59356,59357],{},"auto Knap(vector\u003Cdouble> &V, vector\u003Cdouble> &W, double c)  \u002F\u002F 效益数组, 重量数组, 容量\n",[78,59359,59360],{"class":124,"line":162},[78,59361,59362],{},"{\n",[78,59364,59365],{"class":124,"line":168},[78,59366,59367],{},"    int n = min(V.size(), W.size()); \u002F\u002F 物品数\n",[78,59369,59370],{"class":124,"line":174},[78,59371,59372],{},"    RestType M(n); \u002F\u002F 剩余容量-最优效益对数组\n",[78,59374,59375],{"class":124,"line":180},[78,59376,59377],{},"    function\u003Cdouble(int, double)> m = [&](int i, double y){ \n",[78,59379,59380],{"class":124,"line":186},[78,59381,59382],{},"        if(M[i].count(y) > 0) \n",[78,59384,59385],{"class":124,"line":192},[78,59386,59387],{},"            return M[i][y]; \u002F\u002F 已经计算过, 返回\n",[78,59389,59390],{"class":124,"line":198},[78,59391,59392],{},"        double cv; \u002F\u002F 否则, 开始递归计算\n",[78,59394,59395],{"class":124,"line":204},[78,59396,59397],{},"        if(i >= n - 1 and W[i] > y) \n",[78,59399,59400],{"class":124,"line":210},[78,59401,59402],{},"            cv = 0;\n",[78,59404,59405],{"class":124,"line":216},[78,59406,59407],{},"        else if(i >= n - 1) \n",[78,59409,59410],{"class":124,"line":222},[78,59411,59412],{},"            cv = V[i];\n",[78,59414,59415],{"class":124,"line":421},[78,59416,59417],{},"        else if(W[i] > y) \n",[78,59419,59420],{"class":124,"line":427},[78,59421,59422],{},"            cv = m(i + 1, y);\n",[78,59424,59425],{"class":124,"line":433},[78,59426,59427],{},"        else \n",[78,59429,59430],{"class":124,"line":2443},[78,59431,59432],{},"            cv = max(m(i + 1, y), m(i + 1, y - W[i]) + V[i]);\n",[78,59434,59435],{"class":124,"line":2448},[78,59436,59437],{},"        M[i][y] = cv;\n",[78,59439,59440],{"class":124,"line":2454},[78,59441,59442],{},"        return M[i][y];\n",[78,59444,59445],{"class":124,"line":2460},[78,59446,59447],{},"    };  \u002F\u002F 调用m(0, c)耗时O(n^2 * 2^n)\n",[78,59449,59450],{"class":124,"line":2465},[78,59451,59452],{},"    auto fv = m(0, c);\n",[78,59454,59455],{"class":124,"line":2470},[78,59456,59457],{},"    return M;\n",[78,59459,59460],{"class":124,"line":2903},[78,59461,23518],{},[13,59463,59464,59465,28447],{},"题主表示比较嫌弃这种写法，和众所周知的AcWing上的解法差别还挺大的，因为这只是整体算法的一部分，理解起来反而很困难，但是如果要你把整个算法全部写出来，这样的写法一定非常鸡肋，所以下面是题主的代码，其实是取巧了，不像如上代码一样具有普适性，但是胜在容易理解和比较好写（",[25921,59466,59467],{},"对我来说",[114,59469,59471],{"className":23652,"code":59470,"language":23654,"meta":119,"style":119},"public int Solution(int v[], int w[], int c){  \u002F\u002F 效益数组, 重量数组, 容量\n    int n = Math.max(v.length, w.length);  \u002F\u002F 物品数\n    int[][] dp = new int[n + 1][c + 1];  \u002F\u002F dp记录背包内选择后的最大价值\n    for(int i = 1;i \u003C= n;i++){  \u002F\u002F 枚举所有背包占用的情况\n        for(int j = 0; j \u003C= c;j++){\n            if(j - w[i] >=0)\n                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[j]] + v[i]);  \u002F\u002F 将第i件物品放入背包的效益与不放入背包的效益进行比较，决定第i件物品是否放入背包。\n            else\n                dp[i][j] = dp[i - 1][j];\n        }\n    }\n    return dp[n][max];\n}\n\u002F\u002F 这样子只能输出背包最大效益，如果想要知道选取的是哪些元素的话，要么还是参照老师的那种写法，要么在此写法上加上一段回溯。\n",[17,59472,59473,59478,59483,59488,59493,59498,59503,59508,59512,59517,59521,59525,59530,59534],{"__ignoreMap":119},[78,59474,59475],{"class":124,"line":125},[78,59476,59477],{},"public int Solution(int v[], int w[], int c){  \u002F\u002F 效益数组, 重量数组, 容量\n",[78,59479,59480],{"class":124,"line":132},[78,59481,59482],{},"    int n = Math.max(v.length, w.length);  \u002F\u002F 物品数\n",[78,59484,59485],{"class":124,"line":138},[78,59486,59487],{},"    int[][] dp = new int[n + 1][c + 1];  \u002F\u002F dp记录背包内选择后的最大价值\n",[78,59489,59490],{"class":124,"line":144},[78,59491,59492],{},"    for(int i = 1;i \u003C= n;i++){  \u002F\u002F 枚举所有背包占用的情况\n",[78,59494,59495],{"class":124,"line":150},[78,59496,59497],{},"        for(int j = 0; j \u003C= c;j++){\n",[78,59499,59500],{"class":124,"line":156},[78,59501,59502],{},"            if(j - w[i] >=0)\n",[78,59504,59505],{"class":124,"line":162},[78,59506,59507],{},"                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[j]] + v[i]);  \u002F\u002F 将第i件物品放入背包的效益与不放入背包的效益进行比较，决定第i件物品是否放入背包。\n",[78,59509,59510],{"class":124,"line":168},[78,59511,59235],{},[78,59513,59514],{"class":124,"line":174},[78,59515,59516],{},"                dp[i][j] = dp[i - 1][j];\n",[78,59518,59519],{"class":124,"line":180},[78,59520,10054],{},[78,59522,59523],{"class":124,"line":186},[78,59524,15810],{},[78,59526,59527],{"class":124,"line":192},[78,59528,59529],{},"    return dp[n][max];\n",[78,59531,59532],{"class":124,"line":198},[78,59533,23518],{},[78,59535,59536],{"class":124,"line":204},[78,59537,59538],{},"\u002F\u002F 这样子只能输出背包最大效益，如果想要知道选取的是哪些元素的话，要么还是参照老师的那种写法，要么在此写法上加上一段回溯。\n",[13,59540,59541,59542,59545],{},"写在前面：在上这门课之前题主没有接触过后面三个算法，因此基本上对来源什么的都不是很懂，大概估计后面三章会在回溯和剪枝出一道大题、概率出一道大题，一共两道大题20分。题主的建议是直接背吧，如果有兴致会在之后出一张本学年的",[25921,59543,59544],{},"押题卷","，模仿样卷的题型罢了。",[107,59547,59548],{"id":59548},"回溯方法",[10548,59550,59552],{"id":59551},"使用递归方法生成含-n-个分量的所有排列","使用递归方法生成含 n 个分量的所有排列",[13,59554,59555,59556],{},"求一个数组的全排列。举个例子方便大家理解：有数组",[78,59557,4074],{},[13,59559,59560,59561,59563,59564,59563,59566,59563,59569,59563,59572,59563,59574,67],{},"全排列为",[78,59562,4074],{},", ",[78,59565,4079],{},[78,59567,59568],{},"2,1,3",[78,59570,59571],{},"2,3,1",[78,59573,22872],{},[78,59575,4092],{},[114,59577,59579],{"className":51126,"code":59578,"language":51128,"meta":119,"style":119},"\u002F\u002F iota函数用于对范围赋值\nvoid B_Perm(int n)\n{ \n    vector\u003Cint> X(n);\n    function\u003Cvoid(int)> Perm = [&](int t){ \n        if(t >= n) cout \u003C\u003C X \u003C\u003C endl;\n        else\n            for(int i = t; i \u003C n; ++i){ \n                swap(X[t], X[i]);  \u002F\u002F 交换两个数位置\n                Perm(t + 1);  \u002F\u002F 交换下一个数（下一层）\n                swap(X[t], X[i]);  \u002F\u002F 保持原数组不变\n            }\n    };\n    iota(begin(X), end(X), 0);  \u002F\u002F 将X数组置为有序排列（例如X长度为3，则iota后X = [1,2,3]）\n    Perm(0);\n}\n",[17,59580,59581,59586,59591,59595,59600,59605,59610,59614,59619,59624,59629,59634,59638,59642,59647,59652],{"__ignoreMap":119},[78,59582,59583],{"class":124,"line":125},[78,59584,59585],{},"\u002F\u002F iota函数用于对范围赋值\n",[78,59587,59588],{"class":124,"line":132},[78,59589,59590],{},"void B_Perm(int n)\n",[78,59592,59593],{"class":124,"line":138},[78,59594,51145],{},[78,59596,59597],{"class":124,"line":144},[78,59598,59599],{},"    vector\u003Cint> X(n);\n",[78,59601,59602],{"class":124,"line":150},[78,59603,59604],{},"    function\u003Cvoid(int)> Perm = [&](int t){ \n",[78,59606,59607],{"class":124,"line":156},[78,59608,59609],{},"        if(t >= n) cout \u003C\u003C X \u003C\u003C endl;\n",[78,59611,59612],{"class":124,"line":162},[78,59613,57678],{},[78,59615,59616],{"class":124,"line":168},[78,59617,59618],{},"            for(int i = t; i \u003C n; ++i){ \n",[78,59620,59621],{"class":124,"line":174},[78,59622,59623],{},"                swap(X[t], X[i]);  \u002F\u002F 交换两个数位置\n",[78,59625,59626],{"class":124,"line":180},[78,59627,59628],{},"                Perm(t + 1);  \u002F\u002F 交换下一个数（下一层）\n",[78,59630,59631],{"class":124,"line":186},[78,59632,59633],{},"                swap(X[t], X[i]);  \u002F\u002F 保持原数组不变\n",[78,59635,59636],{"class":124,"line":192},[78,59637,9615],{},[78,59639,59640],{"class":124,"line":198},[78,59641,57375],{},[78,59643,59644],{"class":124,"line":204},[78,59645,59646],{},"    iota(begin(X), end(X), 0);  \u002F\u002F 将X数组置为有序排列（例如X长度为3，则iota后X = [1,2,3]）\n",[78,59648,59649],{"class":124,"line":210},[78,59650,59651],{},"    Perm(0);\n",[78,59653,59654],{"class":124,"line":216},[78,59655,23518],{},[10548,59657,59659],{"id":59658},"使用递归方法生成-n-个元素的所有子集","使用递归方法生成 n 个元素的所有子集",[13,59661,59662,59663],{},"求一个数组的所有子集。举个例子方便大家理解：有数组",[78,59664,4074],{},[13,59666,59667],{},"子集为{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}。",[114,59669,59671],{"className":51126,"code":59670,"language":51128,"meta":119,"style":119},"void B_SubSet(int n)\n{ \n    vector\u003Cbool> X(n);\n    function\u003Cvoid(int)> SubSet = [&](int t){\n        if(t >= n) cout \u003C\u003C X \u003C\u003C endl;\n        else{\n            X[t] = 1;  \u002F\u002F 对X[t]元素进行判断，=1就是取，=0就是不取\n            SubSet(t + 1);  \u002F\u002F 为两种状况分别构建队列\n            X[t] = 0;\n            SubSet(t + 1);\n        }\n    };\n    SubSet(0);\n}\n",[17,59672,59673,59678,59682,59687,59692,59696,59701,59706,59711,59716,59721,59725,59729,59734],{"__ignoreMap":119},[78,59674,59675],{"class":124,"line":125},[78,59676,59677],{},"void B_SubSet(int n)\n",[78,59679,59680],{"class":124,"line":132},[78,59681,51145],{},[78,59683,59684],{"class":124,"line":138},[78,59685,59686],{},"    vector\u003Cbool> X(n);\n",[78,59688,59689],{"class":124,"line":144},[78,59690,59691],{},"    function\u003Cvoid(int)> SubSet = [&](int t){\n",[78,59693,59694],{"class":124,"line":150},[78,59695,59609],{},[78,59697,59698],{"class":124,"line":156},[78,59699,59700],{},"        else{\n",[78,59702,59703],{"class":124,"line":162},[78,59704,59705],{},"            X[t] = 1;  \u002F\u002F 对X[t]元素进行判断，=1就是取，=0就是不取\n",[78,59707,59708],{"class":124,"line":168},[78,59709,59710],{},"            SubSet(t + 1);  \u002F\u002F 为两种状况分别构建队列\n",[78,59712,59713],{"class":124,"line":174},[78,59714,59715],{},"            X[t] = 0;\n",[78,59717,59718],{"class":124,"line":180},[78,59719,59720],{},"            SubSet(t + 1);\n",[78,59722,59723],{"class":124,"line":186},[78,59724,10054],{},[78,59726,59727],{"class":124,"line":192},[78,59728,57375],{},[78,59730,59731],{"class":124,"line":198},[78,59732,59733],{},"    SubSet(0);\n",[78,59735,59736],{"class":124,"line":204},[78,59737,23518],{},[10548,59739,59740],{"id":59740},"旅行商问题",[114,59742,59744],{"className":51126,"code":59743,"language":51128,"meta":119,"style":119},"\u002F\u002F 旅行商问题可以看成是全排列问题，因为一定存在回路（不存在的边给了个INFINITY），所以只需要将所有节点的排列方式找出来，最短的就是最优路径。\nvector\u003Cint> TSP(const Matrix\u003Cdouble> &G)\n{ \n    int n = G.rows();\n    vector\u003Cint> X(n), BX;  \u002F\u002F X存到当前节点的路径；BX存最优路径\n    double BC = INFINITY;  \u002F\u002F 预设最大耗费\n    function\u003Cvoid(int, double)> TSP = [&](int t, double C){\n        if(t >= n and C + G(X[n - 1], 0) \u003C BC)  \u002F\u002F 所有节点都到达且花费更少（答案更优）\n            BC = C + G(X[n - 1], 0), BX = X;\n        else if(t \u003C n)\n            for(int i = t; i \u003C n; ++i){\n                swap(X[t], X[i]);\n                if(C + G(X[t - 1], X[t]) \u003C BC)  \u002F\u002F 如果当前路径比最优短，就接着找，已经超了也就没有找下去的必要了\n                    TSP(t + 1, C + G(X[t - 1], X[t]));\n                swap(X[t], X[i]);\n            }\n    };\n    iota(begin(X), end(X), 0);  \u002F\u002F 初始化\n    TSP(1, 0);  \u002F\u002F 从第一站开始考虑，当前耗费为0\n    return BX;\n}\n",[17,59745,59746,59751,59756,59760,59764,59769,59774,59779,59784,59789,59794,59799,59804,59809,59814,59818,59822,59826,59831,59836,59841],{"__ignoreMap":119},[78,59747,59748],{"class":124,"line":125},[78,59749,59750],{},"\u002F\u002F 旅行商问题可以看成是全排列问题，因为一定存在回路（不存在的边给了个INFINITY），所以只需要将所有节点的排列方式找出来，最短的就是最优路径。\n",[78,59752,59753],{"class":124,"line":132},[78,59754,59755],{},"vector\u003Cint> TSP(const Matrix\u003Cdouble> &G)\n",[78,59757,59758],{"class":124,"line":138},[78,59759,51145],{},[78,59761,59762],{"class":124,"line":144},[78,59763,57042],{},[78,59765,59766],{"class":124,"line":150},[78,59767,59768],{},"    vector\u003Cint> X(n), BX;  \u002F\u002F X存到当前节点的路径；BX存最优路径\n",[78,59770,59771],{"class":124,"line":156},[78,59772,59773],{},"    double BC = INFINITY;  \u002F\u002F 预设最大耗费\n",[78,59775,59776],{"class":124,"line":162},[78,59777,59778],{},"    function\u003Cvoid(int, double)> TSP = [&](int t, double C){\n",[78,59780,59781],{"class":124,"line":168},[78,59782,59783],{},"        if(t >= n and C + G(X[n - 1], 0) \u003C BC)  \u002F\u002F 所有节点都到达且花费更少（答案更优）\n",[78,59785,59786],{"class":124,"line":174},[78,59787,59788],{},"            BC = C + G(X[n - 1], 0), BX = X;\n",[78,59790,59791],{"class":124,"line":180},[78,59792,59793],{},"        else if(t \u003C n)\n",[78,59795,59796],{"class":124,"line":186},[78,59797,59798],{},"            for(int i = t; i \u003C n; ++i){\n",[78,59800,59801],{"class":124,"line":192},[78,59802,59803],{},"                swap(X[t], X[i]);\n",[78,59805,59806],{"class":124,"line":198},[78,59807,59808],{},"                if(C + G(X[t - 1], X[t]) \u003C BC)  \u002F\u002F 如果当前路径比最优短，就接着找，已经超了也就没有找下去的必要了\n",[78,59810,59811],{"class":124,"line":204},[78,59812,59813],{},"                    TSP(t + 1, C + G(X[t - 1], X[t]));\n",[78,59815,59816],{"class":124,"line":210},[78,59817,59803],{},[78,59819,59820],{"class":124,"line":216},[78,59821,9615],{},[78,59823,59824],{"class":124,"line":222},[78,59825,57375],{},[78,59827,59828],{"class":124,"line":421},[78,59829,59830],{},"    iota(begin(X), end(X), 0);  \u002F\u002F 初始化\n",[78,59832,59833],{"class":124,"line":427},[78,59834,59835],{},"    TSP(1, 0);  \u002F\u002F 从第一站开始考虑，当前耗费为0\n",[78,59837,59838],{"class":124,"line":433},[78,59839,59840],{},"    return BX;\n",[78,59842,59843],{"class":124,"line":2443},[78,59844,23518],{},[10548,59846,59848],{"id":59847},"子集和问题36输出一个不满足-38输出所有","子集和问题（36输出一个\u002F不满足 & 38输出所有）",[13,59850,59851],{},"简单理解为给定一个数组W，给定一个数字M，求是否W存在子集的子集和等于M。",[114,59853,59855],{"className":51126,"code":59854,"language":51128,"meta":119,"style":119},"\u002F\u002F 从题干就知道这一题类似于子集问题\nvector\u003Cbool> SetSum(const vector\u003Cint> &W, int M)\n{ \n    int n = W.size();\n    vector\u003Cbool> X(n), Y;\n    function\u003Cvoid(int, int, int)> SetSum = [&](int t, int s, int r){ \n        if(not Y.empty()) return;  \u002F\u002F 不存在，结束\n        if(s == M) Y = X, Y.resize(t);\n        else if(t \u003C n){\n            X[t] = 1;\n            if(s + W[t] \u003C= M)  \u002F\u002F 每个元素依然是选或不选两种状态（选了之后仍然小于等于数字M）\n                SetSum(t + 1, s + W[t], r - W[t]);\n            X[t] = 0;\n            if(s + (r - W[t]) >= M)  \u002F\u002F 不选的话也要保证可选值大于等于数字M\n                SetSum(t + 1, s, r - W[t]);\n        }\n    };\n    int s = 0, r = accumulate(begin(W), end(W), 0);  \u002F\u002F accumulate求和函数，初始为0，累加X数组\n    SetSum(0, s, r);\n    return Y;\n}\n",[17,59856,59857,59862,59867,59871,59875,59880,59885,59890,59895,59900,59905,59910,59915,59919,59924,59929,59933,59937,59942,59947,59952],{"__ignoreMap":119},[78,59858,59859],{"class":124,"line":125},[78,59860,59861],{},"\u002F\u002F 从题干就知道这一题类似于子集问题\n",[78,59863,59864],{"class":124,"line":132},[78,59865,59866],{},"vector\u003Cbool> SetSum(const vector\u003Cint> &W, int M)\n",[78,59868,59869],{"class":124,"line":138},[78,59870,51145],{},[78,59872,59873],{"class":124,"line":144},[78,59874,58123],{},[78,59876,59877],{"class":124,"line":150},[78,59878,59879],{},"    vector\u003Cbool> X(n), Y;\n",[78,59881,59882],{"class":124,"line":156},[78,59883,59884],{},"    function\u003Cvoid(int, int, int)> SetSum = [&](int t, int s, int r){ \n",[78,59886,59887],{"class":124,"line":162},[78,59888,59889],{},"        if(not Y.empty()) return;  \u002F\u002F 不存在，结束\n",[78,59891,59892],{"class":124,"line":168},[78,59893,59894],{},"        if(s == M) Y = X, Y.resize(t);\n",[78,59896,59897],{"class":124,"line":174},[78,59898,59899],{},"        else if(t \u003C n){\n",[78,59901,59902],{"class":124,"line":180},[78,59903,59904],{},"            X[t] = 1;\n",[78,59906,59907],{"class":124,"line":186},[78,59908,59909],{},"            if(s + W[t] \u003C= M)  \u002F\u002F 每个元素依然是选或不选两种状态（选了之后仍然小于等于数字M）\n",[78,59911,59912],{"class":124,"line":192},[78,59913,59914],{},"                SetSum(t + 1, s + W[t], r - W[t]);\n",[78,59916,59917],{"class":124,"line":198},[78,59918,59715],{},[78,59920,59921],{"class":124,"line":204},[78,59922,59923],{},"            if(s + (r - W[t]) >= M)  \u002F\u002F 不选的话也要保证可选值大于等于数字M\n",[78,59925,59926],{"class":124,"line":210},[78,59927,59928],{},"                SetSum(t + 1, s, r - W[t]);\n",[78,59930,59931],{"class":124,"line":216},[78,59932,10054],{},[78,59934,59935],{"class":124,"line":222},[78,59936,57375],{},[78,59938,59939],{"class":124,"line":421},[78,59940,59941],{},"    int s = 0, r = accumulate(begin(W), end(W), 0);  \u002F\u002F accumulate求和函数，初始为0，累加X数组\n",[78,59943,59944],{"class":124,"line":427},[78,59945,59946],{},"    SetSum(0, s, r);\n",[78,59948,59949],{"class":124,"line":433},[78,59950,59951],{},"    return Y;\n",[78,59953,59954],{"class":124,"line":2443},[78,59955,23518],{},[114,59957,59959],{"className":51126,"code":59958,"language":51128,"meta":119,"style":119},"void SetSum(const vector\u003Cint> &W, int M)\n{ \n    int n = W.size();\n    vector\u003Cbool> X(n);\n    function\u003Cvoid(int, int, int)> SetSum = [&](int t, int s, int r){ \n        if(s == M) cout \u003C\u003C to_string(X, t) \u003C\u003C endl;  \u002F\u002F 存在一种情况直接输出\n        else if(t \u003C n){\n            X[t] = 1;\n            if(s + W[t] \u003C= M) \n                SetSum(t + 1, s + W[t], r - W[t]);\n            X[t] = 0;\n            if(s + (r - W[t]) >= M) \n                SetSum(t + 1, s, r - W[t]);\n        }\n    };\n    int s = 0, r = accumulate(begin(W), end(W), 0);\n    SetSum(0, s, r);\n}\n\u002F\u002F 显而易见，这两个代码块的区别在于Y，以及方法体中if-else中的if部分。优先记第二种，实在不行你把第二种写上老师都不会扣很多分。\n",[17,59960,59961,59966,59970,59974,59978,59982,59987,59991,59995,60000,60004,60008,60013,60017,60021,60025,60030,60034,60038],{"__ignoreMap":119},[78,59962,59963],{"class":124,"line":125},[78,59964,59965],{},"void SetSum(const vector\u003Cint> &W, int M)\n",[78,59967,59968],{"class":124,"line":132},[78,59969,51145],{},[78,59971,59972],{"class":124,"line":138},[78,59973,58123],{},[78,59975,59976],{"class":124,"line":144},[78,59977,59686],{},[78,59979,59980],{"class":124,"line":150},[78,59981,59884],{},[78,59983,59984],{"class":124,"line":156},[78,59985,59986],{},"        if(s == M) cout \u003C\u003C to_string(X, t) \u003C\u003C endl;  \u002F\u002F 存在一种情况直接输出\n",[78,59988,59989],{"class":124,"line":162},[78,59990,59899],{},[78,59992,59993],{"class":124,"line":168},[78,59994,59904],{},[78,59996,59997],{"class":124,"line":174},[78,59998,59999],{},"            if(s + W[t] \u003C= M) \n",[78,60001,60002],{"class":124,"line":180},[78,60003,59914],{},[78,60005,60006],{"class":124,"line":186},[78,60007,59715],{},[78,60009,60010],{"class":124,"line":192},[78,60011,60012],{},"            if(s + (r - W[t]) >= M) \n",[78,60014,60015],{"class":124,"line":198},[78,60016,59928],{},[78,60018,60019],{"class":124,"line":204},[78,60020,10054],{},[78,60022,60023],{"class":124,"line":210},[78,60024,57375],{},[78,60026,60027],{"class":124,"line":216},[78,60028,60029],{},"    int s = 0, r = accumulate(begin(W), end(W), 0);\n",[78,60031,60032],{"class":124,"line":222},[78,60033,59946],{},[78,60035,60036],{"class":124,"line":421},[78,60037,23518],{},[78,60039,60040],{"class":124,"line":427},[78,60041,60042],{},"\u002F\u002F 显而易见，这两个代码块的区别在于Y，以及方法体中if-else中的if部分。优先记第二种，实在不行你把第二种写上老师都不会扣很多分。\n",[10548,60044,60045],{"id":60045},"最大团问题",[13,60047,60048],{},"求一个图中连通节点最多的子图",[49,60050,60051,60054],{},[52,60052,60053],{},"扫每一个节点，如果和团中所有节点都连通，可以存；",[52,60055,60056],{},"每个节点都有存和不存两种状态。",[114,60058,60060],{"className":51126,"code":60059,"language":51128,"meta":119,"style":119},"bool Connected(const Matrix\u003Cbool> &G, const vector\u003Cbool> &X, int t)  \u002F\u002F 检查团与节点t的连接性\n{ \n    for(int u = 0; u \u003C t; ++u)\n        if(X[u] == 1 and G(t, u) == 0)  \u002F\u002F 如果节点在当前团中但是没有与当前没有连接\n            return false;\n    return true;\n}\nvector\u003Cbool> Clique(const Matrix\u003Cbool> &G)\n{ \n    int n = G.rows(), fn = -1;  \u002F\u002F fn记录最大团的顶点数\n    vector\u003Cbool> X(n), BX;  \u002F\u002F X记录当前团，BX记录最大团\n    function\u003Cvoid(int, int)> Clique = [&](int t, int cn){ \n        if(t >= n and cn > fn) fn = cn, BX = X;\n        else if(t \u003C n){ \n            X[t] = 1;\n            if(Connected(G, X, t)) Clique(t + 1, cn + 1);\n            X[t] = 0;\n            if(cn + n - (t + 1) > fn) Clique(t + 1, cn);\n        }\n    };\n    Clique(0, 0);\n    return BX;\n}\n",[17,60061,60062,60067,60071,60076,60081,60086,60090,60094,60099,60103,60108,60113,60118,60123,60128,60132,60137,60141,60146,60150,60154,60159,60163],{"__ignoreMap":119},[78,60063,60064],{"class":124,"line":125},[78,60065,60066],{},"bool Connected(const Matrix\u003Cbool> &G, const vector\u003Cbool> &X, int t)  \u002F\u002F 检查团与节点t的连接性\n",[78,60068,60069],{"class":124,"line":132},[78,60070,51145],{},[78,60072,60073],{"class":124,"line":138},[78,60074,60075],{},"    for(int u = 0; u \u003C t; ++u)\n",[78,60077,60078],{"class":124,"line":144},[78,60079,60080],{},"        if(X[u] == 1 and G(t, u) == 0)  \u002F\u002F 如果节点在当前团中但是没有与当前没有连接\n",[78,60082,60083],{"class":124,"line":150},[78,60084,60085],{},"            return false;\n",[78,60087,60088],{"class":124,"line":156},[78,60089,58538],{},[78,60091,60092],{"class":124,"line":162},[78,60093,23518],{},[78,60095,60096],{"class":124,"line":168},[78,60097,60098],{},"vector\u003Cbool> Clique(const Matrix\u003Cbool> &G)\n",[78,60100,60101],{"class":124,"line":174},[78,60102,51145],{},[78,60104,60105],{"class":124,"line":180},[78,60106,60107],{},"    int n = G.rows(), fn = -1;  \u002F\u002F fn记录最大团的顶点数\n",[78,60109,60110],{"class":124,"line":186},[78,60111,60112],{},"    vector\u003Cbool> X(n), BX;  \u002F\u002F X记录当前团，BX记录最大团\n",[78,60114,60115],{"class":124,"line":192},[78,60116,60117],{},"    function\u003Cvoid(int, int)> Clique = [&](int t, int cn){ \n",[78,60119,60120],{"class":124,"line":198},[78,60121,60122],{},"        if(t >= n and cn > fn) fn = cn, BX = X;\n",[78,60124,60125],{"class":124,"line":204},[78,60126,60127],{},"        else if(t \u003C n){ \n",[78,60129,60130],{"class":124,"line":210},[78,60131,59904],{},[78,60133,60134],{"class":124,"line":216},[78,60135,60136],{},"            if(Connected(G, X, t)) Clique(t + 1, cn + 1);\n",[78,60138,60139],{"class":124,"line":222},[78,60140,59715],{},[78,60142,60143],{"class":124,"line":421},[78,60144,60145],{},"            if(cn + n - (t + 1) > fn) Clique(t + 1, cn);\n",[78,60147,60148],{"class":124,"line":427},[78,60149,10054],{},[78,60151,60152],{"class":124,"line":433},[78,60153,57375],{},[78,60155,60156],{"class":124,"line":2443},[78,60157,60158],{},"    Clique(0, 0);\n",[78,60160,60161],{"class":124,"line":2448},[78,60162,59840],{},[78,60164,60165],{"class":124,"line":2454},[78,60166,23518],{},[10548,60168,60169],{"id":60169},"着色问题",[13,60171,60172],{},"这个算是回溯中最难的一个了，依旧是前面的模板，但是写法稍有不同：",[49,60174,60175],{},[52,60176,60177],{},"判断颜色是否和邻边相同，相同就给下一个节点变色，不同则检查下一个节点。",[114,60179,60181],{"className":51126,"code":60180,"language":51128,"meta":119,"style":119},"#include \u003Cvector>\n#include \u003Cfunctional>\n#include \u003CMatrix.hpp>\nusing namespace std;\nbool legal(const Matrix\u003Cbool> &G, vector\u003Cint> &X, int t)\n{ \n    for(int i = 0; i \u003C t; ++i)\n        if(G(i, t) == 1 and X[i] == X[t])  \u002F\u002F 连通并且颜色相同返回false\n            return false;\n    return true;\n}\nauto Chromatic(Matrix\u003Cbool> &G)\n{ \n    int n = G.rows(), fm = n + 1; \u002F\u002F 顶点数, fm最优颜色数（其实取n就够了，这里应该是为了让结果更加明显，便于debug）\n    vector\u003Cint> X(n), BX; \u002F\u002F 当前方案, 最优方案\n    function\u003Cvoid(int, int)> Chromatic = [&](int t, int m){ \u002F\u002F 搜索解空间树\n        if(t >= n and m \u003C fm) \u002F\u002F 答案(颜色数更小)\n            BX = X, fm = m;\n        else if(t \u003C n)\n            for(X[t] = 1; X[t] \u003C= m; ++X[t]){ \n                auto cm = max(X[t] + 1, m);  \u002F\u002F 新的颜色数(可能需要增加)\n                if(legal(G, X, t) and cm \u003C fm)  \u002F\u002F X[t]可用且颜色数可能更小\n                    Chromatic(t + 1, cm);  \u002F\u002F 下一顶点\n            }\n        };\n    Chromatic(0, 1);  \u002F\u002F 从顶点0开始, 初始颜色数为1, 上限为n\n    return BX;\n}\n",[17,60182,60183,60188,60193,60198,60202,60207,60211,60216,60221,60225,60229,60233,60238,60242,60247,60252,60257,60262,60267,60271,60276,60281,60286,60291,60295,60300,60305,60309],{"__ignoreMap":119},[78,60184,60185],{"class":124,"line":125},[78,60186,60187],{},"#include \u003Cvector>\n",[78,60189,60190],{"class":124,"line":132},[78,60191,60192],{},"#include \u003Cfunctional>\n",[78,60194,60195],{"class":124,"line":138},[78,60196,60197],{},"#include \u003CMatrix.hpp>\n",[78,60199,60200],{"class":124,"line":144},[78,60201,51205],{},[78,60203,60204],{"class":124,"line":150},[78,60205,60206],{},"bool legal(const Matrix\u003Cbool> &G, vector\u003Cint> &X, int t)\n",[78,60208,60209],{"class":124,"line":156},[78,60210,51145],{},[78,60212,60213],{"class":124,"line":162},[78,60214,60215],{},"    for(int i = 0; i \u003C t; ++i)\n",[78,60217,60218],{"class":124,"line":168},[78,60219,60220],{},"        if(G(i, t) == 1 and X[i] == X[t])  \u002F\u002F 连通并且颜色相同返回false\n",[78,60222,60223],{"class":124,"line":174},[78,60224,60085],{},[78,60226,60227],{"class":124,"line":180},[78,60228,58538],{},[78,60230,60231],{"class":124,"line":186},[78,60232,23518],{},[78,60234,60235],{"class":124,"line":192},[78,60236,60237],{},"auto Chromatic(Matrix\u003Cbool> &G)\n",[78,60239,60240],{"class":124,"line":198},[78,60241,51145],{},[78,60243,60244],{"class":124,"line":204},[78,60245,60246],{},"    int n = G.rows(), fm = n + 1; \u002F\u002F 顶点数, fm最优颜色数（其实取n就够了，这里应该是为了让结果更加明显，便于debug）\n",[78,60248,60249],{"class":124,"line":210},[78,60250,60251],{},"    vector\u003Cint> X(n), BX; \u002F\u002F 当前方案, 最优方案\n",[78,60253,60254],{"class":124,"line":216},[78,60255,60256],{},"    function\u003Cvoid(int, int)> Chromatic = [&](int t, int m){ \u002F\u002F 搜索解空间树\n",[78,60258,60259],{"class":124,"line":222},[78,60260,60261],{},"        if(t >= n and m \u003C fm) \u002F\u002F 答案(颜色数更小)\n",[78,60263,60264],{"class":124,"line":421},[78,60265,60266],{},"            BX = X, fm = m;\n",[78,60268,60269],{"class":124,"line":427},[78,60270,59793],{},[78,60272,60273],{"class":124,"line":433},[78,60274,60275],{},"            for(X[t] = 1; X[t] \u003C= m; ++X[t]){ \n",[78,60277,60278],{"class":124,"line":2443},[78,60279,60280],{},"                auto cm = max(X[t] + 1, m);  \u002F\u002F 新的颜色数(可能需要增加)\n",[78,60282,60283],{"class":124,"line":2448},[78,60284,60285],{},"                if(legal(G, X, t) and cm \u003C fm)  \u002F\u002F X[t]可用且颜色数可能更小\n",[78,60287,60288],{"class":124,"line":2454},[78,60289,60290],{},"                    Chromatic(t + 1, cm);  \u002F\u002F 下一顶点\n",[78,60292,60293],{"class":124,"line":2460},[78,60294,9615],{},[78,60296,60297],{"class":124,"line":2465},[78,60298,60299],{},"        };\n",[78,60301,60302],{"class":124,"line":2470},[78,60303,60304],{},"    Chromatic(0, 1);  \u002F\u002F 从顶点0开始, 初始颜色数为1, 上限为n\n",[78,60306,60307],{"class":124,"line":2903},[78,60308,59840],{},[78,60310,60311],{"class":124,"line":2909},[78,60312,23518],{},[107,60314,60315],{"id":60315},"分枝限界方法",[13,60317,60318],{},"通俗来说就是回溯算法中的剪枝操作，上面的回溯算法用的是深度优先遍历，那么下文的分枝限界算法就是用的宽度优先遍历，个人结论就是和图遍历一样，回溯用递归能解决，剪枝就需要用到队列queue了，如果还不是很懂queue的建议取找个文档简单阅读一下queue的基本操作。",[10548,60320,60322],{"id":60321},"使用分枝限界方法生成含-n-个分量的所有排列","使用分枝限界方法生成含 n 个分量的所有排列",[49,60324,60325],{},[52,60326,60327],{},"首先我们明确一点就是回溯的思想是递归，而分枝限界的思想是递推，也就是说用通项公式来解决问题。",[114,60329,60331],{"className":51126,"code":60330,"language":51128,"meta":119,"style":119},"struct PermNode\n{ \n    vector\u003Cint> X;\n    int t;\n};\nvoid Perm(int n)\n{ \n    queue\u003CPermNode> Q;\n    vector\u003Cint> X(n);  \u002F\u002F X用来存数组中的元素排序，t用来存数组中的元素个数\n    iota(begin(X), end(X), 0);\n    Q.push({X, 0});\n    while(not Q.empty()){ \n        auto [X, t] = Q.front(); Q.pop();\n        if(t >= n) cout \u003C\u003C X \u003C\u003C endl;\n        else \n            for(int i = t; i \u003C n; ++i)\n                swap(X[t], X[i]), Q.push({X, t + 1});  \u002F\u002F 将所有的邻边全部入队\n    }\n}\n",[17,60332,60333,60338,60342,60347,60351,60355,60360,60364,60369,60374,60379,60384,60388,60393,60397,60401,60406,60411,60415],{"__ignoreMap":119},[78,60334,60335],{"class":124,"line":125},[78,60336,60337],{},"struct PermNode\n",[78,60339,60340],{"class":124,"line":132},[78,60341,51145],{},[78,60343,60344],{"class":124,"line":138},[78,60345,60346],{},"    vector\u003Cint> X;\n",[78,60348,60349],{"class":124,"line":144},[78,60350,58263],{},[78,60352,60353],{"class":124,"line":150},[78,60354,51165],{},[78,60356,60357],{"class":124,"line":156},[78,60358,60359],{},"void Perm(int n)\n",[78,60361,60362],{"class":124,"line":162},[78,60363,51145],{},[78,60365,60366],{"class":124,"line":168},[78,60367,60368],{},"    queue\u003CPermNode> Q;\n",[78,60370,60371],{"class":124,"line":174},[78,60372,60373],{},"    vector\u003Cint> X(n);  \u002F\u002F X用来存数组中的元素排序，t用来存数组中的元素个数\n",[78,60375,60376],{"class":124,"line":180},[78,60377,60378],{},"    iota(begin(X), end(X), 0);\n",[78,60380,60381],{"class":124,"line":186},[78,60382,60383],{},"    Q.push({X, 0});\n",[78,60385,60386],{"class":124,"line":192},[78,60387,56967],{},[78,60389,60390],{"class":124,"line":198},[78,60391,60392],{},"        auto [X, t] = Q.front(); Q.pop();\n",[78,60394,60395],{"class":124,"line":204},[78,60396,59609],{},[78,60398,60399],{"class":124,"line":210},[78,60400,59427],{},[78,60402,60403],{"class":124,"line":216},[78,60404,60405],{},"            for(int i = t; i \u003C n; ++i)\n",[78,60407,60408],{"class":124,"line":222},[78,60409,60410],{},"                swap(X[t], X[i]), Q.push({X, t + 1});  \u002F\u002F 将所有的邻边全部入队\n",[78,60412,60413],{"class":124,"line":421},[78,60414,15810],{},[78,60416,60417],{"class":124,"line":427},[78,60418,23518],{},[10548,60420,60422],{"id":60421},"使用分枝限界方法生成-n-个元素的所有子集","使用分枝限界方法生成 n 个元素的所有子集",[114,60424,60426],{"className":51126,"code":60425,"language":51128,"meta":119,"style":119},"struct SetNode\n{ \n    vector\u003Cbool> X;\n    int t;\n};\nvoid SubSet(int n)\n{ \n    queue\u003CSetNode> Q;\n    vector\u003Cbool> X(n);\n    Q.push({X, 0});\n    while(not Q.empty()){ \n        auto[X, t] = Q.front(); Q.pop();\n        if(t >= n) cout \u003C\u003C X \u003C\u003C endl;\n        else{ \n            X[t] = 1, Q.push({X, t + 1});  \u002F\u002F 为选了X[t]的元素构建一条队列\n            X[t] = 0, Q.push({X, t + 1});  \u002F\u002F 为不选X[t]的元素构建一条队列\n        }\n    }\n}\n",[17,60427,60428,60433,60437,60442,60446,60450,60455,60459,60464,60468,60472,60476,60481,60485,60490,60495,60500,60504,60508],{"__ignoreMap":119},[78,60429,60430],{"class":124,"line":125},[78,60431,60432],{},"struct SetNode\n",[78,60434,60435],{"class":124,"line":132},[78,60436,51145],{},[78,60438,60439],{"class":124,"line":138},[78,60440,60441],{},"    vector\u003Cbool> X;\n",[78,60443,60444],{"class":124,"line":144},[78,60445,58263],{},[78,60447,60448],{"class":124,"line":150},[78,60449,51165],{},[78,60451,60452],{"class":124,"line":156},[78,60453,60454],{},"void SubSet(int n)\n",[78,60456,60457],{"class":124,"line":162},[78,60458,51145],{},[78,60460,60461],{"class":124,"line":168},[78,60462,60463],{},"    queue\u003CSetNode> Q;\n",[78,60465,60466],{"class":124,"line":174},[78,60467,59686],{},[78,60469,60470],{"class":124,"line":180},[78,60471,60383],{},[78,60473,60474],{"class":124,"line":186},[78,60475,56967],{},[78,60477,60478],{"class":124,"line":192},[78,60479,60480],{},"        auto[X, t] = Q.front(); Q.pop();\n",[78,60482,60483],{"class":124,"line":198},[78,60484,59609],{},[78,60486,60487],{"class":124,"line":204},[78,60488,60489],{},"        else{ \n",[78,60491,60492],{"class":124,"line":210},[78,60493,60494],{},"            X[t] = 1, Q.push({X, t + 1});  \u002F\u002F 为选了X[t]的元素构建一条队列\n",[78,60496,60497],{"class":124,"line":216},[78,60498,60499],{},"            X[t] = 0, Q.push({X, t + 1});  \u002F\u002F 为不选X[t]的元素构建一条队列\n",[78,60501,60502],{"class":124,"line":222},[78,60503,10054],{},[78,60505,60506],{"class":124,"line":421},[78,60507,15810],{},[78,60509,60510],{"class":124,"line":427},[78,60511,23518],{},[13,60513,60514],{},"有了以上基础，以下三个就是大同小异了，这里不做过多解释。写不出来的话用前两题的思想套入问题，写写白话吧，毕竟这里不推荐大家背书。。。",[10548,60516,59740],{"id":60517},"旅行商问题-1",[114,60519,60521],{"className":51126,"code":60520,"language":51128,"meta":119,"style":119},"struct TSPNode\n{ \n    vector\u003Cint> X;\n    int t;\n    double C;\n};\nbool operator\u003C(const TSPNode &X, const TSPNode &Y)\n{ \n    return X.C \u003C Y.C;\n}\nvector\u003Cint> TSP(const Matrix\u003Cdouble> &G)\n{ \n    minheap\u003CTSPNode> H;\n    int n = G.rows();\n    vector\u003Cint> X(n), BX;\n    iota(begin(X), end(X), 0);\n    double C = 0, BC = INFINITY;\n    H.push({X, 1, C});\n    while(not H.empty()){ \n        auto [X, t, C] = H.top(); H.pop();\n        if(t >= n and C + G(X[n - 1], 0) \u003C BC)\n            BC = C + G(X[n - 1], 0), BX = X;\n        else if(t \u003C n)\n            for(int i = t; i \u003C n; ++i){ \n                swap(X[t], X[i]);\n                if(C + G(X[t - 1], X[t]) \u003C BC)\n                    H.push({X, t + 1, C + G(X[t - 1], X[t])});\n            }\n    }\n    return BX;\n}\n",[17,60522,60523,60528,60532,60536,60540,60545,60549,60554,60558,60563,60567,60571,60575,60580,60584,60589,60593,60598,60603,60608,60613,60618,60622,60626,60630,60634,60639,60644,60648,60652,60656],{"__ignoreMap":119},[78,60524,60525],{"class":124,"line":125},[78,60526,60527],{},"struct TSPNode\n",[78,60529,60530],{"class":124,"line":132},[78,60531,51145],{},[78,60533,60534],{"class":124,"line":138},[78,60535,60346],{},[78,60537,60538],{"class":124,"line":144},[78,60539,58263],{},[78,60541,60542],{"class":124,"line":150},[78,60543,60544],{},"    double C;\n",[78,60546,60547],{"class":124,"line":156},[78,60548,51165],{},[78,60550,60551],{"class":124,"line":162},[78,60552,60553],{},"bool operator\u003C(const TSPNode &X, const TSPNode &Y)\n",[78,60555,60556],{"class":124,"line":168},[78,60557,51145],{},[78,60559,60560],{"class":124,"line":174},[78,60561,60562],{},"    return X.C \u003C Y.C;\n",[78,60564,60565],{"class":124,"line":180},[78,60566,23518],{},[78,60568,60569],{"class":124,"line":186},[78,60570,59755],{},[78,60572,60573],{"class":124,"line":192},[78,60574,51145],{},[78,60576,60577],{"class":124,"line":198},[78,60578,60579],{},"    minheap\u003CTSPNode> H;\n",[78,60581,60582],{"class":124,"line":204},[78,60583,57042],{},[78,60585,60586],{"class":124,"line":210},[78,60587,60588],{},"    vector\u003Cint> X(n), BX;\n",[78,60590,60591],{"class":124,"line":216},[78,60592,60378],{},[78,60594,60595],{"class":124,"line":222},[78,60596,60597],{},"    double C = 0, BC = INFINITY;\n",[78,60599,60600],{"class":124,"line":421},[78,60601,60602],{},"    H.push({X, 1, C});\n",[78,60604,60605],{"class":124,"line":427},[78,60606,60607],{},"    while(not H.empty()){ \n",[78,60609,60610],{"class":124,"line":433},[78,60611,60612],{},"        auto [X, t, C] = H.top(); H.pop();\n",[78,60614,60615],{"class":124,"line":2443},[78,60616,60617],{},"        if(t >= n and C + G(X[n - 1], 0) \u003C BC)\n",[78,60619,60620],{"class":124,"line":2448},[78,60621,59788],{},[78,60623,60624],{"class":124,"line":2454},[78,60625,59793],{},[78,60627,60628],{"class":124,"line":2460},[78,60629,59618],{},[78,60631,60632],{"class":124,"line":2465},[78,60633,59803],{},[78,60635,60636],{"class":124,"line":2470},[78,60637,60638],{},"                if(C + G(X[t - 1], X[t]) \u003C BC)\n",[78,60640,60641],{"class":124,"line":2903},[78,60642,60643],{},"                    H.push({X, t + 1, C + G(X[t - 1], X[t])});\n",[78,60645,60646],{"class":124,"line":2909},[78,60647,9615],{},[78,60649,60650],{"class":124,"line":11477},[78,60651,15810],{},[78,60653,60654],{"class":124,"line":13374},[78,60655,59840],{},[78,60657,60658],{"class":124,"line":13380},[78,60659,23518],{},[10548,60661,60045],{"id":60662},"最大团问题-1",[114,60664,60666],{"className":51126,"code":60665,"language":51128,"meta":119,"style":119},"bool Connected(const Matrix\u003Cbool> &G, const vector\u003Cbool> &X, int t)\n{ \n    for(int u = 0; u \u003C t; ++u)\n        if(X[u] == 1 and G(t, u) == 0) return false;\n    return true;\n}\nstruct CliqueNode\n{ \n    vector\u003Cbool> X;\n    int t, cn;\n};\nbool operator\u003C(const CliqueNode &X, const CliqueNode &Y)\n{ \n    return X.cn \u003C Y.cn;\n}\nvector\u003C bool> Clique(const Matrix\u003Cbool> &G)\n{ \n    maxheap\u003CCliqueNode> H;\n    int n = G.rows();\n    vector\u003Cbool> X(n), BX;\n    int cn = 0, fn = 0;\n    H.push({X, 0, cn});\n    while(not H.empty()){ \n        auto [X, t, cn] = H.top(); H.pop();\n        if(t >= n and cn > fn) fn = cn, BX = X;\n        else if(t \u003C n){ \n            X[t] = 1;\n            if(Connected(G, X, t)) H.push({X, t + 1, cn + 1});\n            X[t] = 0;\n            if(cn + n - (t + 1) > fn) H.push({X, t + 1, cn});\n        }\n    }\n    return BX;\n}\n",[17,60667,60668,60673,60677,60681,60686,60690,60694,60699,60703,60707,60712,60716,60721,60725,60730,60734,60739,60743,60748,60752,60757,60762,60767,60771,60776,60780,60784,60788,60793,60797,60802,60806,60810,60814],{"__ignoreMap":119},[78,60669,60670],{"class":124,"line":125},[78,60671,60672],{},"bool Connected(const Matrix\u003Cbool> &G, const vector\u003Cbool> &X, int t)\n",[78,60674,60675],{"class":124,"line":132},[78,60676,51145],{},[78,60678,60679],{"class":124,"line":138},[78,60680,60075],{},[78,60682,60683],{"class":124,"line":144},[78,60684,60685],{},"        if(X[u] == 1 and G(t, u) == 0) return false;\n",[78,60687,60688],{"class":124,"line":150},[78,60689,58538],{},[78,60691,60692],{"class":124,"line":156},[78,60693,23518],{},[78,60695,60696],{"class":124,"line":162},[78,60697,60698],{},"struct CliqueNode\n",[78,60700,60701],{"class":124,"line":168},[78,60702,51145],{},[78,60704,60705],{"class":124,"line":174},[78,60706,60441],{},[78,60708,60709],{"class":124,"line":180},[78,60710,60711],{},"    int t, cn;\n",[78,60713,60714],{"class":124,"line":186},[78,60715,51165],{},[78,60717,60718],{"class":124,"line":192},[78,60719,60720],{},"bool operator\u003C(const CliqueNode &X, const CliqueNode &Y)\n",[78,60722,60723],{"class":124,"line":198},[78,60724,51145],{},[78,60726,60727],{"class":124,"line":204},[78,60728,60729],{},"    return X.cn \u003C Y.cn;\n",[78,60731,60732],{"class":124,"line":210},[78,60733,23518],{},[78,60735,60736],{"class":124,"line":216},[78,60737,60738],{},"vector\u003C bool> Clique(const Matrix\u003Cbool> &G)\n",[78,60740,60741],{"class":124,"line":222},[78,60742,51145],{},[78,60744,60745],{"class":124,"line":421},[78,60746,60747],{},"    maxheap\u003CCliqueNode> H;\n",[78,60749,60750],{"class":124,"line":427},[78,60751,57042],{},[78,60753,60754],{"class":124,"line":433},[78,60755,60756],{},"    vector\u003Cbool> X(n), BX;\n",[78,60758,60759],{"class":124,"line":2443},[78,60760,60761],{},"    int cn = 0, fn = 0;\n",[78,60763,60764],{"class":124,"line":2448},[78,60765,60766],{},"    H.push({X, 0, cn});\n",[78,60768,60769],{"class":124,"line":2454},[78,60770,60607],{},[78,60772,60773],{"class":124,"line":2460},[78,60774,60775],{},"        auto [X, t, cn] = H.top(); H.pop();\n",[78,60777,60778],{"class":124,"line":2465},[78,60779,60122],{},[78,60781,60782],{"class":124,"line":2470},[78,60783,60127],{},[78,60785,60786],{"class":124,"line":2903},[78,60787,59904],{},[78,60789,60790],{"class":124,"line":2909},[78,60791,60792],{},"            if(Connected(G, X, t)) H.push({X, t + 1, cn + 1});\n",[78,60794,60795],{"class":124,"line":11477},[78,60796,59715],{},[78,60798,60799],{"class":124,"line":13374},[78,60800,60801],{},"            if(cn + n - (t + 1) > fn) H.push({X, t + 1, cn});\n",[78,60803,60804],{"class":124,"line":13380},[78,60805,10054],{},[78,60807,60808],{"class":124,"line":13386},[78,60809,15810],{},[78,60811,60812],{"class":124,"line":13722},[78,60813,59840],{},[78,60815,60816],{"class":124,"line":13727},[78,60817,23518],{},[10548,60819,60821],{"id":60820},"子集和问题44输出所有-45输出一个不满足","子集和问题（44输出所有 & 45输出一个\u002F不满足）",[114,60823,60825],{"className":51126,"code":60824,"language":51128,"meta":119,"style":119},"struct SetSumNode\n{ \n    vector\u003Cbool> X;\n    int t, s, r;\n};\nvoid SetSum(const vector\u003Cint> &W, int M)\n{ \n    queue\u003CSetSumNode> Q;\n    int n = W.size();\n    vector\u003Cbool> X(n);\n    int s = 0, r = accumulate(begin(W), end(W), 0);\n    Q.push({X, 0, s, r});\n    while(not Q.empty()){ \n        auto [X, t, s, r] = Q.front(); Q.pop();\n        if(s == M) cout \u003C\u003C to_string(X, t) \u003C\u003C endl;\n        else if(t \u003C n){ \n            X[t] = 1;\n            if(s + W[t] \u003C= M)\n                Q.push({X, t + 1, s + W[t], r - W[t]});\n            X[t] = 0;\n            if(s + (r - W[t]) >= M)\n                Q.push({X, t + 1, s, r - W[t]});\n        }\n    };\n}\n",[17,60826,60827,60832,60836,60840,60845,60849,60853,60857,60862,60866,60870,60874,60879,60883,60888,60893,60897,60901,60906,60911,60915,60920,60925,60929,60933],{"__ignoreMap":119},[78,60828,60829],{"class":124,"line":125},[78,60830,60831],{},"struct SetSumNode\n",[78,60833,60834],{"class":124,"line":132},[78,60835,51145],{},[78,60837,60838],{"class":124,"line":138},[78,60839,60441],{},[78,60841,60842],{"class":124,"line":144},[78,60843,60844],{},"    int t, s, r;\n",[78,60846,60847],{"class":124,"line":150},[78,60848,51165],{},[78,60850,60851],{"class":124,"line":156},[78,60852,59965],{},[78,60854,60855],{"class":124,"line":162},[78,60856,51145],{},[78,60858,60859],{"class":124,"line":168},[78,60860,60861],{},"    queue\u003CSetSumNode> Q;\n",[78,60863,60864],{"class":124,"line":174},[78,60865,58123],{},[78,60867,60868],{"class":124,"line":180},[78,60869,59686],{},[78,60871,60872],{"class":124,"line":186},[78,60873,60029],{},[78,60875,60876],{"class":124,"line":192},[78,60877,60878],{},"    Q.push({X, 0, s, r});\n",[78,60880,60881],{"class":124,"line":198},[78,60882,56967],{},[78,60884,60885],{"class":124,"line":204},[78,60886,60887],{},"        auto [X, t, s, r] = Q.front(); Q.pop();\n",[78,60889,60890],{"class":124,"line":210},[78,60891,60892],{},"        if(s == M) cout \u003C\u003C to_string(X, t) \u003C\u003C endl;\n",[78,60894,60895],{"class":124,"line":216},[78,60896,60127],{},[78,60898,60899],{"class":124,"line":222},[78,60900,59904],{},[78,60902,60903],{"class":124,"line":421},[78,60904,60905],{},"            if(s + W[t] \u003C= M)\n",[78,60907,60908],{"class":124,"line":427},[78,60909,60910],{},"                Q.push({X, t + 1, s + W[t], r - W[t]});\n",[78,60912,60913],{"class":124,"line":433},[78,60914,59715],{},[78,60916,60917],{"class":124,"line":2443},[78,60918,60919],{},"            if(s + (r - W[t]) >= M)\n",[78,60921,60922],{"class":124,"line":2448},[78,60923,60924],{},"                Q.push({X, t + 1, s, r - W[t]});\n",[78,60926,60927],{"class":124,"line":2454},[78,60928,10054],{},[78,60930,60931],{"class":124,"line":2460},[78,60932,57375],{},[78,60934,60935],{"class":124,"line":2465},[78,60936,23518],{},[114,60938,60940],{"className":51126,"code":60939,"language":51128,"meta":119,"style":119},"struct SetSumNode\n{ \n    vector\u003Cbool> X;\n    int t, s, r;\n};\nvector\u003Cbool> SetSum(const vector\u003Cint> &W, int M)\n{ \n    queue\u003CSetSumNode> Q;\n    int n = W.size();\n    vector\u003Cbool> X(n), Y;\n    int s = 0, r = accumulate(begin(W), end(W), 0);\n    Q.push({X, 0, s, r});\n    while(not Q.empty()){ \n        if(not Y.empty()) break;\n            auto [X, t, s, r] = Q.front(); Q.pop();\n        if(s == M) Y = X, Y.resize(t);\n        else if(t \u003C n){ \n            X[t] = 1;\n            if(s + W[t] \u003C= M) Q.push({X, t + 1, s + W[t], r - W[t]});\n            X[t] = 0;\n            if(s + (r - W[t]) >= M) Q.push({X, t + 1, s, r - W[t]});\n        }\n    }\n    return Y;\n}\n",[17,60941,60942,60946,60950,60954,60958,60962,60966,60970,60974,60978,60982,60986,60990,60994,60999,61004,61008,61012,61016,61021,61025,61030,61034,61038,61042],{"__ignoreMap":119},[78,60943,60944],{"class":124,"line":125},[78,60945,60831],{},[78,60947,60948],{"class":124,"line":132},[78,60949,51145],{},[78,60951,60952],{"class":124,"line":138},[78,60953,60441],{},[78,60955,60956],{"class":124,"line":144},[78,60957,60844],{},[78,60959,60960],{"class":124,"line":150},[78,60961,51165],{},[78,60963,60964],{"class":124,"line":156},[78,60965,59866],{},[78,60967,60968],{"class":124,"line":162},[78,60969,51145],{},[78,60971,60972],{"class":124,"line":168},[78,60973,60861],{},[78,60975,60976],{"class":124,"line":174},[78,60977,58123],{},[78,60979,60980],{"class":124,"line":180},[78,60981,59879],{},[78,60983,60984],{"class":124,"line":186},[78,60985,60029],{},[78,60987,60988],{"class":124,"line":192},[78,60989,60878],{},[78,60991,60992],{"class":124,"line":198},[78,60993,56967],{},[78,60995,60996],{"class":124,"line":204},[78,60997,60998],{},"        if(not Y.empty()) break;\n",[78,61000,61001],{"class":124,"line":210},[78,61002,61003],{},"            auto [X, t, s, r] = Q.front(); Q.pop();\n",[78,61005,61006],{"class":124,"line":216},[78,61007,59894],{},[78,61009,61010],{"class":124,"line":222},[78,61011,60127],{},[78,61013,61014],{"class":124,"line":421},[78,61015,59904],{},[78,61017,61018],{"class":124,"line":427},[78,61019,61020],{},"            if(s + W[t] \u003C= M) Q.push({X, t + 1, s + W[t], r - W[t]});\n",[78,61022,61023],{"class":124,"line":433},[78,61024,59715],{},[78,61026,61027],{"class":124,"line":2443},[78,61028,61029],{},"            if(s + (r - W[t]) >= M) Q.push({X, t + 1, s, r - W[t]});\n",[78,61031,61032],{"class":124,"line":2448},[78,61033,10054],{},[78,61035,61036],{"class":124,"line":2454},[78,61037,15810],{},[78,61039,61040],{"class":124,"line":2460},[78,61041,59951],{},[78,61043,61044],{"class":124,"line":2465},[78,61045,23518],{},[107,61047,61048],{"id":61048},"概率方法",[10548,61050,61051],{"id":61051},"随机方法改写快速排序程序",[114,61053,61055],{"className":51126,"code":61054,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Partition(T X[], int low, int up)\n{ \n    int key = rand() % (up - low) + low, p = low;  \u002F\u002F key值随机生成，其他和快速排序一模一样\n    swap(X[key], X[up - 1]), key = up - 1;\n    for(int i = low; i \u003C key; ++i)\n        if(X[i] \u003C X[key]) \n            swap(X[i], X[p]), ++p;\n    swap(X[key], X[p]);\n    return p;\n}\ntemplate\u003Cclass T>\nvoid QuickSort(T X[], int low, int up)\n{ \n    if(up - low \u003C= 1) return;\n    int m = Partition(X, low, up);\n    QuickSort(X, low, m);\n    QuickSort(X, m + 1, up);\n}\n",[17,61056,61057,61061,61065,61069,61074,61079,61083,61088,61092,61096,61100,61104,61108,61112,61116,61120,61124,61129,61133],{"__ignoreMap":119},[78,61058,61059],{"class":124,"line":125},[78,61060,51135],{},[78,61062,61063],{"class":124,"line":132},[78,61064,57771],{},[78,61066,61067],{"class":124,"line":138},[78,61068,51145],{},[78,61070,61071],{"class":124,"line":144},[78,61072,61073],{},"    int key = rand() % (up - low) + low, p = low;  \u002F\u002F key值随机生成，其他和快速排序一模一样\n",[78,61075,61076],{"class":124,"line":150},[78,61077,61078],{},"    swap(X[key], X[up - 1]), key = up - 1;\n",[78,61080,61081],{"class":124,"line":156},[78,61082,57879],{},[78,61084,61085],{"class":124,"line":162},[78,61086,61087],{},"        if(X[i] \u003C X[key]) \n",[78,61089,61090],{"class":124,"line":168},[78,61091,57795],{},[78,61093,61094],{"class":124,"line":174},[78,61095,57892],{},[78,61097,61098],{"class":124,"line":180},[78,61099,57805],{},[78,61101,61102],{"class":124,"line":186},[78,61103,23518],{},[78,61105,61106],{"class":124,"line":192},[78,61107,51135],{},[78,61109,61110],{"class":124,"line":198},[78,61111,57818],{},[78,61113,61114],{"class":124,"line":204},[78,61115,51145],{},[78,61117,61118],{"class":124,"line":210},[78,61119,57725],{},[78,61121,61122],{"class":124,"line":216},[78,61123,57831],{},[78,61125,61126],{"class":124,"line":222},[78,61127,61128],{},"    QuickSort(X, low, m);\n",[78,61130,61131],{"class":124,"line":421},[78,61132,57841],{},[78,61134,61135],{"class":124,"line":427},[78,61136,23518],{},[10548,61138,61139],{"id":61139},"随机方法改写基于划分的选择程序",[114,61141,61143],{"className":51126,"code":61142,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nint Partition(T X[], int low, int up)\n{ \n    int key = rand() % (up - low) + low, p = low;  \u002F\u002F key值随机生成，其他和选择排序一模一样\n    swap(X[key], X[up - 1]), key = up - 1;\n    for(int i = low; i \u003C key; ++i)\n        if(X[i] \u003C X[key]) \n            swap(X[i], X[p]), ++p;\n    swap(X[key], X[p]);\n    return p;\n}\ntemplate\u003Cclass T>\nT &Select(T X[], int n, int k)\n{ \n    int low = 0, up = n;\n    for(;;){ \n        int m = Partition(X, low, up);\n        if(k == m) return X[m];\n        else if(k \u003C m) up = m;\n        else low = m + 1;\n    }\n}\n",[17,61144,61145,61149,61153,61157,61162,61166,61170,61174,61178,61182,61186,61190,61194,61198,61202,61206,61210,61214,61219,61223,61227,61231],{"__ignoreMap":119},[78,61146,61147],{"class":124,"line":125},[78,61148,51135],{},[78,61150,61151],{"class":124,"line":132},[78,61152,57771],{},[78,61154,61155],{"class":124,"line":138},[78,61156,51145],{},[78,61158,61159],{"class":124,"line":144},[78,61160,61161],{},"    int key = rand() % (up - low) + low, p = low;  \u002F\u002F key值随机生成，其他和选择排序一模一样\n",[78,61163,61164],{"class":124,"line":150},[78,61165,61078],{},[78,61167,61168],{"class":124,"line":156},[78,61169,57879],{},[78,61171,61172],{"class":124,"line":162},[78,61173,61087],{},[78,61175,61176],{"class":124,"line":168},[78,61177,57795],{},[78,61179,61180],{"class":124,"line":174},[78,61181,57892],{},[78,61183,61184],{"class":124,"line":180},[78,61185,57805],{},[78,61187,61188],{"class":124,"line":186},[78,61189,23518],{},[78,61191,61192],{"class":124,"line":192},[78,61193,51135],{},[78,61195,61196],{"class":124,"line":198},[78,61197,57909],{},[78,61199,61200],{"class":124,"line":204},[78,61201,51145],{},[78,61203,61204],{"class":124,"line":210},[78,61205,57574],{},[78,61207,61208],{"class":124,"line":216},[78,61209,57922],{},[78,61211,61212],{"class":124,"line":222},[78,61213,57927],{},[78,61215,61216],{"class":124,"line":421},[78,61217,61218],{},"        if(k == m) return X[m];\n",[78,61220,61221],{"class":124,"line":427},[78,61222,57937],{},[78,61224,61225],{"class":124,"line":433},[78,61226,57599],{},[78,61228,61229],{"class":124,"line":2443},[78,61230,15810],{},[78,61232,61233],{"class":124,"line":2448},[78,61234,23518],{},[10548,61236,61237],{"id":61237},"随机洗牌算法",[114,61239,61241],{"className":51126,"code":61240,"language":51128,"meta":119,"style":119},"template\u003Cclass T>\nvoid Shuffle(T X[], int n)\n{ \n    for(--n; n > 0; --n)\n        swap(X[n], X[rand() % n]);  \u002F\u002F 随机交换元素，将数组完全打乱\n}\n",[17,61242,61243,61247,61252,61256,61261,61266],{"__ignoreMap":119},[78,61244,61245],{"class":124,"line":125},[78,61246,51135],{},[78,61248,61249],{"class":124,"line":132},[78,61250,61251],{},"void Shuffle(T X[], int n)\n",[78,61253,61254],{"class":124,"line":138},[78,61255,51145],{},[78,61257,61258],{"class":124,"line":144},[78,61259,61260],{},"    for(--n; n > 0; --n)\n",[78,61262,61263],{"class":124,"line":150},[78,61264,61265],{},"        swap(X[n], X[rand() % n]);  \u002F\u002F 随机交换元素，将数组完全打乱\n",[78,61267,61268],{"class":124,"line":156},[78,61269,23518],{},[10548,61271,61273],{"id":61272},"插入说明","插入说明：",[13,61275,61276],{},"虽然题库里都是拉斯维加斯算法的求解过程，但是生活处处充满惊喜，谁也不知道他会不会出一个算法以外的题或者其他算法的题给你，因此在这里题主详细但又简洁的介绍下三种概率方法（蒙特卡洛算法、拉斯维加斯算法、舍伍德算法）",[49,61278,61279,61282,61285],{},[52,61280,61281],{},"拉斯维加斯算法：不会得到错误解，但是有可能找不到解。（在下面的题目中形容得比较简单，对于需要排序的问题就是在开始将数组随机打乱；而对于需要求子集的问题，就是在判断一个元素选还是不选时引入随机数，就这么看来，概率算法其实是试卷的送分题【基础题型加一句随机数描述】）",[52,61283,61284],{},"蒙特卡洛算法：用于求问题的准确解，但是这个解不能保证是正确的。",[52,61286,61287],{},"舍伍德算法：总能得到问题的一个解，且得到的解一定是正确的。（通过确定算法引入随机数，消除\u002F减少好坏实例之间的区别）",[13,61289,61290],{},"了解了这三个随机算法的区别后，考试的时候怎么办？如果真的出现了其他的概率算法怎么写？题主的建议是全按照拉斯维加斯算法的过程写，因为都是在基础题型上加上随机判断，三个算法的区别就是随机算法安插的位置和次数（1~2次）不同，所以没必要纠结之间的差别，拿个大头就好！",[10548,61292,61294],{"id":61293},"拉斯维加斯算法求解旅行商问题是否存在耗费不超过t的旅行","拉斯维加斯算法求解旅行商问题（是否存在耗费不超过t的旅行）",[114,61296,61298],{"className":51126,"code":61297,"language":51128,"meta":119,"style":119},"bool TSP(const Matrix\u003Cdouble> &G, double t, vector\u003Cint> &X)\n{ \n    int n = G.rows();\n    iota(begin(X), end(X), 0);\n    random_shuffle(begin(X), end(X));  \u002F\u002F 对一个数组随机排列\n    double s = 0;\n    for(int k = 0; k \u003C n; ++k){ \n        s += G(X[k % n], X[(k + 1) % n]);\n        if(s > t) return false;\n    }\n    return true;\n}\n",[17,61299,61300,61305,61309,61313,61317,61322,61327,61332,61337,61342,61346,61350],{"__ignoreMap":119},[78,61301,61302],{"class":124,"line":125},[78,61303,61304],{},"bool TSP(const Matrix\u003Cdouble> &G, double t, vector\u003Cint> &X)\n",[78,61306,61307],{"class":124,"line":132},[78,61308,51145],{},[78,61310,61311],{"class":124,"line":138},[78,61312,57042],{},[78,61314,61315],{"class":124,"line":144},[78,61316,60378],{},[78,61318,61319],{"class":124,"line":150},[78,61320,61321],{},"    random_shuffle(begin(X), end(X));  \u002F\u002F 对一个数组随机排列\n",[78,61323,61324],{"class":124,"line":156},[78,61325,61326],{},"    double s = 0;\n",[78,61328,61329],{"class":124,"line":162},[78,61330,61331],{},"    for(int k = 0; k \u003C n; ++k){ \n",[78,61333,61334],{"class":124,"line":168},[78,61335,61336],{},"        s += G(X[k % n], X[(k + 1) % n]);\n",[78,61338,61339],{"class":124,"line":174},[78,61340,61341],{},"        if(s > t) return false;\n",[78,61343,61344],{"class":124,"line":180},[78,61345,15810],{},[78,61347,61348],{"class":124,"line":186},[78,61349,58538],{},[78,61351,61352],{"class":124,"line":192},[78,61353,23518],{},[10548,61355,61357],{"id":61356},"拉斯维加斯算法求解01背包问题是否存在效益和不少于t的装包方式","拉斯维加斯算法求解0\u002F1背包问题（是否存在效益和不少于t的装包方式）",[114,61359,61361],{"className":51126,"code":61360,"language":51128,"meta":119,"style":119},"bool Knap(const vector\u003Cdouble> &V, const vector\u003Cdouble> &W,\ndouble c, double t, vector\u003Cbool> &X)\n{ \n    int n = min(V.size(), W.size());\n    double fv = 0, fw = 0;\n    for(int i = 0; i \u003C n; ++i){ \n        if(rand() % 2 == 1)\n            X[i] = 1, fv += V[i], fw += W[i];\n        else\n            X[i] = 0;\n        if(fw > c) return false;\n    }\n    return fv >= t;\n}\n",[17,61362,61363,61368,61373,61377,61381,61386,61391,61396,61401,61405,61410,61415,61419,61424],{"__ignoreMap":119},[78,61364,61365],{"class":124,"line":125},[78,61366,61367],{},"bool Knap(const vector\u003Cdouble> &V, const vector\u003Cdouble> &W,\n",[78,61369,61370],{"class":124,"line":132},[78,61371,61372],{},"double c, double t, vector\u003Cbool> &X)\n",[78,61374,61375],{"class":124,"line":138},[78,61376,51145],{},[78,61378,61379],{"class":124,"line":144},[78,61380,58198],{},[78,61382,61383],{"class":124,"line":150},[78,61384,61385],{},"    double fv = 0, fw = 0;\n",[78,61387,61388],{"class":124,"line":156},[78,61389,61390],{},"    for(int i = 0; i \u003C n; ++i){ \n",[78,61392,61393],{"class":124,"line":162},[78,61394,61395],{},"        if(rand() % 2 == 1)\n",[78,61397,61398],{"class":124,"line":168},[78,61399,61400],{},"            X[i] = 1, fv += V[i], fw += W[i];\n",[78,61402,61403],{"class":124,"line":174},[78,61404,57678],{},[78,61406,61407],{"class":124,"line":180},[78,61408,61409],{},"            X[i] = 0;\n",[78,61411,61412],{"class":124,"line":186},[78,61413,61414],{},"        if(fw > c) return false;\n",[78,61416,61417],{"class":124,"line":192},[78,61418,15810],{},[78,61420,61421],{"class":124,"line":198},[78,61422,61423],{},"    return fv >= t;\n",[78,61425,61426],{"class":124,"line":204},[78,61427,23518],{},[10548,61429,61431],{"id":61430},"拉斯维加斯算法求解hamilton回路问题是否有hamilton回路","拉斯维加斯算法求解Hamilton回路问题（是否有Hamilton回路）",[114,61433,61435],{"className":51126,"code":61434,"language":51128,"meta":119,"style":119},"bool Hamilton(const Matrix\u003Cbool> &G, vector\u003Cint> &X)\n{ \n    int n = G.rows();\n    iota(begin(X), end(X), 0);\n    random_shuffle(begin(X), end(X));\n    for(int k = 0; k \u003C n; ++k){ \n        int i = X[k], j = X[(k + 1) % n];\n        if(G(i, j) != 1) return false;\n    }\n    return true;\n}\n",[17,61436,61437,61442,61446,61450,61454,61459,61463,61468,61473,61477,61481],{"__ignoreMap":119},[78,61438,61439],{"class":124,"line":125},[78,61440,61441],{},"bool Hamilton(const Matrix\u003Cbool> &G, vector\u003Cint> &X)\n",[78,61443,61444],{"class":124,"line":132},[78,61445,51145],{},[78,61447,61448],{"class":124,"line":138},[78,61449,57042],{},[78,61451,61452],{"class":124,"line":144},[78,61453,60378],{},[78,61455,61456],{"class":124,"line":150},[78,61457,61458],{},"    random_shuffle(begin(X), end(X));\n",[78,61460,61461],{"class":124,"line":156},[78,61462,61331],{},[78,61464,61465],{"class":124,"line":162},[78,61466,61467],{},"        int i = X[k], j = X[(k + 1) % n];\n",[78,61469,61470],{"class":124,"line":168},[78,61471,61472],{},"        if(G(i, j) != 1) return false;\n",[78,61474,61475],{"class":124,"line":174},[78,61476,15810],{},[78,61478,61479],{"class":124,"line":180},[78,61480,58538],{},[78,61482,61483],{"class":124,"line":186},[78,61484,23518],{},[10548,61486,61488],{"id":61487},"拉斯维加斯算法求解子集和问题是否存在和为t的子集","拉斯维加斯算法求解子集和问题（是否存在和为t的子集）",[114,61490,61492],{"className":51126,"code":61491,"language":51128,"meta":119,"style":119},"bool SetSum(const vector\u003Cint> &W, int t, vector\u003Cbool> &X)\n{ \n    int s = 0;\n    for(int i = 0; i \u003C W.size(); ++i){ \n        if(rand() % 2 == 1)\n            X[i] = 1, s += W[i];\n        else\n            X[i] = 0;\n        if(s > t) return false;\n    }\n    return s == t;\n}\n",[17,61493,61494,61499,61503,61508,61513,61517,61522,61526,61530,61534,61538,61543],{"__ignoreMap":119},[78,61495,61496],{"class":124,"line":125},[78,61497,61498],{},"bool SetSum(const vector\u003Cint> &W, int t, vector\u003Cbool> &X)\n",[78,61500,61501],{"class":124,"line":132},[78,61502,51145],{},[78,61504,61505],{"class":124,"line":138},[78,61506,61507],{},"    int s = 0;\n",[78,61509,61510],{"class":124,"line":144},[78,61511,61512],{},"    for(int i = 0; i \u003C W.size(); ++i){ \n",[78,61514,61515],{"class":124,"line":150},[78,61516,61395],{},[78,61518,61519],{"class":124,"line":156},[78,61520,61521],{},"            X[i] = 1, s += W[i];\n",[78,61523,61524],{"class":124,"line":162},[78,61525,57678],{},[78,61527,61528],{"class":124,"line":168},[78,61529,61409],{},[78,61531,61532],{"class":124,"line":174},[78,61533,61341],{},[78,61535,61536],{"class":124,"line":180},[78,61537,15810],{},[78,61539,61540],{"class":124,"line":186},[78,61541,61542],{},"    return s == t;\n",[78,61544,61545],{"class":124,"line":192},[78,61546,23518],{},[10548,61548,61550],{"id":61549},"拉斯维加斯算法求解团问题是否存在顶点数不小于k的团","拉斯维加斯算法求解团问题（是否存在顶点数不小于k的团）",[114,61552,61554],{"className":51126,"code":61553,"language":51128,"meta":119,"style":119},"bool Clique(const Matrix\u003Cbool> &G, int k, vector\u003Cbool> &X)\n{ \n    int n = G.rows(), m = 0;\n    for(int i = 0; i \u003C n; ++i)\n        if(rand() % 2 == 1)\n            X[i] = 1, ++m;\n        else\n            X[i] = 0;\n        if(m \u003C k) return false;\n    for(int i = 0; i \u003C n; ++i)\n        for(int j = i + 1; j \u003C n; ++j)\n            if(X[i] == 1 and X[j] == 1 and G(i, j) != 1) return false;\n    return true;\n}\n",[17,61555,61556,61561,61565,61570,61574,61578,61583,61587,61591,61596,61600,61605,61610,61614],{"__ignoreMap":119},[78,61557,61558],{"class":124,"line":125},[78,61559,61560],{},"bool Clique(const Matrix\u003Cbool> &G, int k, vector\u003Cbool> &X)\n",[78,61562,61563],{"class":124,"line":132},[78,61564,51145],{},[78,61566,61567],{"class":124,"line":138},[78,61568,61569],{},"    int n = G.rows(), m = 0;\n",[78,61571,61572],{"class":124,"line":144},[78,61573,58081],{},[78,61575,61576],{"class":124,"line":150},[78,61577,61395],{},[78,61579,61580],{"class":124,"line":156},[78,61581,61582],{},"            X[i] = 1, ++m;\n",[78,61584,61585],{"class":124,"line":162},[78,61586,57678],{},[78,61588,61589],{"class":124,"line":168},[78,61590,61409],{},[78,61592,61593],{"class":124,"line":174},[78,61594,61595],{},"        if(m \u003C k) return false;\n",[78,61597,61598],{"class":124,"line":180},[78,61599,58081],{},[78,61601,61602],{"class":124,"line":186},[78,61603,61604],{},"        for(int j = i + 1; j \u003C n; ++j)\n",[78,61606,61607],{"class":124,"line":192},[78,61608,61609],{},"            if(X[i] == 1 and X[j] == 1 and G(i, j) != 1) return false;\n",[78,61611,61612],{"class":124,"line":198},[78,61613,58538],{},[78,61615,61616],{"class":124,"line":204},[78,61617,23518],{},[107,61619,25480],{"id":25480},[13,61621,61622],{},"到这里，这门课这本书的所有内容（其实就是简单讲解了下题库）都已经完结了！恭喜恭喜，如果你是从头到尾认真一路复习下来的，那么毫无疑问，你八成已经忘得差不多了QWQ（因为题主两天半写到这发现真要随机抽一道给我确实不一定会写）。但是不用担心，基本上认真看到这的对于各问题的基本思路都已经成型，大家大可按照自己喜欢的、方便的语言去完成算法。两章回溯由于题主也是第一次接触，并且老师上课节奏较快（咱也不是认真听课的人），所以采用的是强记的方式。这两天题主会根据样卷出一份考前押题卷，一个是加强自己的手写能力，二个题库的题过了一遍，发现有些题太简单了，而有些题太难了，可以很大程度的缩小背记范围。那么，这个文档到此就告一段落了，之后应该是上传到GitHub上供未来的学弟学妹参考了（毕竟考前两天才完成）。",[13,61624,61625],{},"加油加油！                                                                                                                                                            ——By Alexie-Z-Yevich 2022.5.8",[23289,61627],{},[13,61629,61630],{},"算是版本2.0吧，因为之前对于回溯和分枝限界不是很了解，所以连带着概率也没怎么给大家写，今天把之前埋的坑都填上了，还是好难啊，押题卷昨天就出完了，大家感兴趣还是可以看一下滴。（其实今天又过了一遍题，如果真在题库里抽的话，那么其实没啥好押题的，真是谁也说不清呢）                                                                                                                                             ——By Alexie-Z-Yevich 2022.5.9",[226,61632,228],{},{"title":119,"searchDepth":144,"depth":144,"links":61634},[61635,61636,61642,61643,61644,61645,61646,61647,61648,61649,61650],{"id":51074,"depth":132,"text":51074},{"id":52020,"depth":132,"text":52020,"children":61637},[61638,61639,61640,61641],{"id":52023,"depth":144,"text":52024},{"id":53827,"depth":144,"text":53828},{"id":54433,"depth":144,"text":54434},{"id":55465,"depth":144,"text":55466},{"id":56580,"depth":132,"text":56580},{"id":56833,"depth":132,"text":56833},{"id":57542,"depth":132,"text":57542},{"id":58101,"depth":132,"text":58101},{"id":58892,"depth":132,"text":58892},{"id":59548,"depth":132,"text":59548},{"id":60315,"depth":132,"text":60315},{"id":61048,"depth":132,"text":61048},{"id":25480,"depth":132,"text":25480},{},"我的大学\u002F大二下学期\u002F算法设计与分析（课程通用）\u002F算法.md","\u002Fundergraduate\u002Fnote-723af69388da",{"title":246,"description":119},"undergraduate\u002Fnote-723af69388da",[14541,246],"cd3XThQokb58gw3oUKjVVb7TP-nut3h920SPiDRa4zs",{"id":61659,"title":61660,"assetBase":239,"author":8,"body":61661,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":62989,"navigation":128,"originalPath":62990,"path":62991,"seo":62992,"source":23330,"stem":62993,"tags":62994,"weight":250,"__hash__":62995},"content\u002Fundergraduate\u002Fnote-73558c6351ef.md","商务智能",{"type":10,"value":61662,"toc":62929},[61663,61665,61677,61681,61685,61689,61692,61695,61701,61704,61709,61713,61716,61721,61724,61728,61732,61735,61739,61742,61748,61752,61799,61803,61836,61840,61844,61855,61859,61862,61867,61871,61874,61877,61881,61884,61887,61891,61894,61896,61900,61904,61908,61913,61917,61920,61925,61929,61932,61936,61939,61943,61946,61951,61955,61958,61961,61975,61980,61983,61985,61989,61993,61996,62013,62016,62021,62025,62030,62034,62037,62041,62044,62048,62051,62056,62060,62063,62074,62076,62080,62091,62095,62098,62103,62107,62109,62112,62115,62119,62122,62127,62131,62148,62150,62154,62171,62175,62181,62189,62192,62206,62210,62221,62225,62229,62234,62238,62240,62246,62248,62277,62280,62282,62285,62304,62308,62311,62316,62320,62323,62326,62329,62334,62338,62341,62344,62347,62364,62366,62370,62373,62376,62380,62383,62386,62390,62393,62397,62400,62404,62407,62411,62414,62418,62421,62425,62429,62433,62436,62440,62443,62445,62449,62457,62461,62465,62468,62482,62486,62490,62493,62496,62510,62514,62528,62530,62534,62538,62541,62545,62548,62552,62556,62570,62574,62579,62582,62587,62591,62593,62597,62600,62604,62607,62610,62612,62615,62620,62624,62628,62631,62636,62641,62660,62664,62667,62675,62680,62684,62688,62696,62700,62708,62710,62714,62717,62720,62726,62728,62732,62736,62739,62745,62749,62754,62758,62764,62767,62771,62777,62780,62784,62787,62791,62794,62798,62802,62805,62808,62812,62815,62819,62822,62824,62828,62834,62837,62841,62844,62847,62850,62854,62860,62868,62872,62875,62878,62882,62886,62889,62893,62896,62900,62902,62906,62909],[4517,61664,61660],{"id":61660},[72,61666,61667,61671,61674],{},[13,61668,61669],{},[22,61670,23957],{},[13,61672,61673],{},"本文档的1、2、5、6章是老师考试要求的范围（我们这届），第五章因为范围比较大，老师上课也没有讲，所以准备单独做一个文档出来，正好《数据仓库与数据挖掘》的重点也是数据挖掘，就一起合并到那个文档中了。",[13,61675,61676],{},"其余的章节是我自己课余时间看完的，做了一个简单的摘要，清华的书还是挺有意思的，作为兴趣爱好可以推荐大家有时间去看看。",[107,61678,61680],{"id":61679},"第一章-商务智能概论","第一章 商务智能概论",[7759,61682,61684],{"id":61683},"_1商业决策需要商务智能","1、商业决策需要商务智能",[10548,61686,61688],{"id":61687},"_1数据信息与知识","（1）数据、信息与知识",[13,61690,61691],{},"数据是记录、描述和识别事物的符号，通过数据有意义的组合可表达现实世界中某种实体的特征。**数据多表现为简单的事实。**数据也成为记录、案例、样本等。数据用属性描述，属性也成为变量、特征、字段或维等。",[13,61693,61694],{},"数据经过解释后可以转换为有用的信息，信息是经过某种提炼、加工和集成后的数据。信息是可以被人们理解和解释的，对不同的人可能价值不同。",[13,61696,61697,61698],{},"数据和信息虽然不等同，却也是密不可分的。概括地讲，",[22,61699,61700],{},"数据是信息的载体，而信息是对数据的解释。",[13,61702,61703],{},"**知识就是对信息内容进行的提炼、比较、挖掘、分析、概括、判断和推论。**知识分为事实性知识和经验知识：事实性知识是人类对客观事物和现象的认识结果；经验知识多是一种隐性知识，是存储在人们大脑中的经历、经验、技巧、体会和感悟等尚未公开的知识。",[72,61705,61706],{},[13,61707,61708],{},"我个人是将数据、信息、知识的关系代入到生产环境中：数据——》数据分析——》BI。数据分析对应信息，这是一个将不同源数据聚合的过程，将大量无用的数据转换为单条格式化的“信息”；BI对应的是知识，知识是方便人们进行理解的，所以同样的，大数据中最终呈现的BI报表也一定是让人容易理解的。",[10548,61710,61712],{"id":61711},"_2决策","（2）决策",[13,61714,61715],{},"**管理就是决策。**决策是企业管理的核心，贯穿管理的全过程。企业管理可分为战略层、中间管理层和运营层三个层次。",[72,61717,61718],{},[13,61719,61720],{},"简单来说就是三层分别负责：目的、计划、实施三个步骤。",[13,61722,61723],{},"企业各层级决策都必须有足够的信息，越往高层，决策需要的信息粒度越大，而信息堆决策的影响也越大。决策 = 信息 + 知识（经验） + 冒险，而充分的有价值的信息、知识以及经验可以降低决策风险。",[7759,61725,61727],{"id":61726},"_2商务智能","2、商务智能",[10548,61729,61731],{"id":61730},"_1技术支持","（1）技术支持",[13,61733,61734],{},"商务智能的技术基础是数据仓库（data warehousing，DW）、在线分析处理（on-line analytical processing，OLAP）、数据挖掘（data mining，DM）。数据仓库用以存储和管理数据，数据仓库的数据从运营层而来。在线分析处理用于把这些数据转化成信息，支持各级决策人员复杂查询和在线分析处理，并以直观易懂的图标把结果展现出来。数据挖掘可以从海量的数据中提取出隐含在数据中有用的数据，以便做出更有效地决策，提高企业智能。",[10548,61736,61738],{"id":61737},"_2简介","（2）简介",[13,61740,61741],{},"商务智能把各种数据及时地转化为支持决策的信息和知识，帮助企业管理者了解客户的需求、消费习惯，预测市场的变化趋势以及行业的整体发展方向，进行有效的决策，进而在竞争中占据有利的地位。",[13,61743,61744,61745],{},"商务智能可视为一个散装的概念，其内容包括分析应用、基础架构、平台以及实践。商务智能是融合了先进信息技术与创新管理理念的结合体，集成了企业内外的数据，经过加工并从中提取能够创造商业价值的信息，面向企业战略并服务于管理层、业务层，指导企业经营决策、管理思想，提升企业竞争力，涉及企业战略、管理思想、业务整合和技术体系等层面，促进信息到知识再到利润的转变，从而实现更好的绩效。",[22,61746,61747],{},"应用的核心不在其功能，而在于对业务的优化。",[10548,61749,61751],{"id":61750},"_3商务智能的价值","（3）商务智能的价值",[2285,61753,61754,61762,61770,61778,61783,61791],{},[52,61755,61756,61759,61761],{},[22,61757,61758],{},"制定合适的市场营销策略",[2996,61760],{},"利用商务智能技术构建商业模型，确定合适的营销策略。",[52,61763,61764,61767,61769],{},[22,61765,61766],{},"改善顾客管理",[2996,61768],{},"顾客智能是商务智能在顾客管理关系中的应用。企业正在逐渐由“以产品为中心”转化为“以顾客为中心”。",[52,61771,61772,61775,61777],{},[22,61773,61774],{},"降低经营成本提高收入",[2996,61776],{},"应用商务智能企业的绩效管理功能，可以简便、快捷地制定各种成本收益报表，对不同的业务活动进行成本核算，深入分析偏差和改进方法，从而降低成本，提高收入。",[52,61779,61780],{},[22,61781,61782],{},"提高风险管理能力",[52,61784,61785,61788,61790],{},[22,61786,61787],{},"改善业务洞察力",[2996,61789],{},"商务智能减少管理者收集数据、获取信息所花费的时间，加速决策过程，使正确的信息在正确的的时间流向决策者。",[52,61792,61793,61796,61798],{},[22,61794,61795],{},"提高市场响应能力",[2996,61797],{},"借助商务智能还可以预测市场变化，精简流程，确定需要改进的环节，以适应外部环境的变动。",[10548,61800,61802],{"id":61801},"_4商务智能系统的功能","（4）商务智能系统的功能",[2285,61804,61805,61812,61820,61828],{},[52,61806,61807,61809,61811],{},[22,61808,29591],{},[2996,61810],{},"数据是决策分析的基础。",[52,61813,61814,61817,61819],{},[22,61815,61816],{},"信息呈现",[2996,61818],{},"信息呈现是指把收集的数据以报表的形式呈现出来，让用户了解到企业、市场的现状，这是商务智能的初步功能。",[52,61821,61822,61825,61827],{},[22,61823,61824],{},"运营分析",[2996,61826],{},"运营分析包括运营指标分析、运营业绩分析和财务分析等。",[52,61829,61830,61833,61835],{},[22,61831,61832],{},"战略决策支持",[2996,61834],{},"战略决策支持是指根据战略业务单元（strategic bussiness unit，SBU）的经营业绩和定位，选择一种合理的投资组合战略。",[7759,61837,61839],{"id":61838},"_3商务智能的应用","3、商务智能的应用",[10548,61841,61843],{"id":61842},"_1金融行业","（1）金融行业",[49,61845,61846,61849,61852],{},[52,61847,61848],{},"规范整合金融企业资源，进行成本控制、获利分析和绩效评估。",[52,61850,61851],{},"评估、模拟、分析与控制市场风险、信用风险以及运营风险。",[52,61853,61854],{},"开发、保留和利用金融顾客关系，发展增值服务和个性化服务。",[10548,61856,61858],{"id":61857},"_2通信行业","（2）通信行业",[13,61860,61861],{},"从运营数据中获得反映市场状况的有效信息，适时推出新业务，争夺有限的客户资源，减少客户流失率。",[72,61863,61864],{},[13,61865,61866],{},"预警功能：如果实际绩效偏离了预定目标，仪表盘就会自动向管理人员报警。",[10548,61868,61870],{"id":61869},"_3零售行业","（3）零售行业",[13,61872,61873],{},"零售行业能否对品牌、产品、市场和运营效率做出快速、有效的决策就显得非常重要。通过对运营数据进行分析，开展数据库营销，零售企业就可以把握顾客的购买习惯，辅助品牌标识、产品分类和营销计划的优化，赢得顾客的忠诚。",[13,61875,61876],{},"如何对来源于网络营销、电子邮件、传真和电话等不同渠道的顾客数据进行整合和加工，深入分析顾客价值，寻找新顾客、交叉销售和提升销售机会，开展关系营销和直复式营销是非常重要的。",[10548,61878,61880],{"id":61879},"_4保健行业","（4）保健行业",[13,61882,61883],{},"商务智能也通过集成和分析企业研发、顾客管理等相关数据，降低研发成本，改善保健企业的运营。",[13,61885,61886],{},"允许制药和生物医学企业迅速把生物医学数据转换成临床洞察力，分析运营数据以及管理风险，比能够把分析结果转换成有效的药品治疗方案，优化药品组合，最大限度地从开发、许可、销售和营销业务中盈利。",[10548,61888,61890],{"id":61889},"_5其他行业","（5）其他行业",[13,61892,61893],{},"略。",[23289,61895],{},[107,61897,61899],{"id":61898},"第二章-商务智能系统架构","第二章 商务智能系统架构",[7759,61901,61903],{"id":61902},"_1商务智能系统的组成","1、商务智能系统的组成",[10548,61905,61907],{"id":61906},"_1架构图","（1）架构图",[13,61909,61910],{},[617,61911],{"alt":119,"src":61912},".\u002Fimg\u002F2.1.png",[10548,61914,61916],{"id":61915},"_2数据源与数据提取","（2）数据源与数据提取",[13,61918,61919],{},"数据是商务智能系统的基础，通常包括企业内部数据和外部数据：内部数据包括企业各种应用系统、办公自动化系统等产生的业务数据、文档等；外部数据包括有关市场、竞争对手的数据以及各类外部统计数据等。",[72,61921,61922],{},[13,61923,61924],{},"ETL工具：抽取（extrat）、转换（transform）、装载（load）",[10548,61926,61928],{"id":61927},"_3数据仓库","（3）数据仓库",[13,61930,61931],{},"数据仓库的数据包括元数据和经过ETL的业务数据。元数据是关于数据的数据，主要包括数据源的描述、数据的抽取规则、数据的转换规则、数据的加载频率、数据仓库模型等。数据源中的数据按照元数据库的规则，经过抽取、清理、转换、集成，按照决策主题重新组织、存储。",[10548,61933,61935],{"id":61934},"_4访问工具","（4）访问工具",[13,61937,61938],{},"访问工具包括应用接口和中间件服务器。数据库中间件允许用户透明的访问数据仓库服务器，用于即席查询（ad-hoc query）、在线分析处理和数据挖掘。",[10548,61940,61942],{"id":61941},"_5决策支持工具","（5）决策支持工具",[13,61944,61945],{},"决策支持工具由即席查询、报表，在线分析处理和数据挖掘等组成。",[13,61947,61948],{},[617,61949],{"alt":119,"src":61950},".\u002Fimg\u002F2.2.png",[7759,61952,61954],{"id":61953},"_2数据集成","2、数据集成",[13,61956,61957],{},"数据来源广泛，数据格式更加多样，企业数据主要集中在文件系统、数据库和消息队列。",[13,61959,61960],{},"早期数据分析阶段，多库系统存在以下问题：",[49,61962,61963,61966,61969,61972],{},[52,61964,61965],{},"可用性差：源数据库或通信网络故障导致系统瘫痪",[52,61967,61968],{},"响应速度慢：全局查询延迟和低层效率影响响应速度",[52,61970,61971],{},"系统性能低：总体性能取决于数据源中性能最差的系统",[52,61973,61974],{},"系统开销大：每次查询要启动通过多个系统，通信和运行开销大",[13,61976,61977],{},[22,61978,61979],{},"数据集成的目的是要运用一定的技术手段把分布在异构系统中的数据按一定的规则组织成一个整体，使用户能有效地对其进行共享、分析，因此数据集成是构建数据仓库的基础。",[13,61981,61982],{},"主数据管理和数据仓库是相辅相成的。它们都是减少数据冗余和不一致性的跨部门集中式系统，都依赖ETL、元数据管理等技术保证数据质量。",[23289,61984],{},[107,61986,61988],{"id":61987},"第三章-数据仓库","第三章 数据仓库",[7759,61990,61992],{"id":61991},"_1从数据库到数据仓库","1、从数据库到数据仓库",[13,61994,61995],{},"企业的数据处理大致分为两类：一类是操作型处理，即在线事务处理，它是针对具体业务在数据库联机的日常操作，通常对少数记录进行查询、修改。另一类是分析型处理，一般针对某些主题的历史数据进行处理，支持管理决策。",[49,61997,61998,62001,62004,62007,62010],{},[52,61999,62000],{},"处理性能：操作型性能要求高、时间短；分析型资源占用多、时间长",[52,62002,62003],{},"数据集成：操作型处理通常较为分散；分析型处理是面向主题的，数据全面、准确，可以有效支持分析。",[52,62005,62006],{},"数据更新：操作型处理主要由原子事务组成，数据更新频繁，需要并行控制和恢复机制；分析型处理包含复杂的查询，大部分是只读操作。",[52,62008,62009],{},"数据时限：操作型只关注当前的数据；分析型着重于对历史数据的分析处理。",[52,62011,62012],{},"数据综合",[10548,62014,62015],{"id":62015},"详细比较",[13,62017,62018],{},[617,62019],{"alt":119,"src":62020},".\u002Fimg\u002F3.1.png",[7759,62022,62024],{"id":62023},"_2数据仓库的概念","2、数据仓库的概念",[13,62026,62027],{},[22,62028,62029],{},"数据仓库就是面向主题（subject-oriented）、集成的（integrated）、非易失的（non-volatile）和时变的（time-variant）的数据集合用以支持管理决策。",[10548,62031,62033],{"id":62032},"特征一面向主题","特征一：面向主题",[13,62035,62036],{},"在操作型数据库中，各个业务系统可能是相互分离的。数据仓库是面向主题的。每一个商业主题都对应于企业决策包含的分析对象。",[10548,62038,62040],{"id":62039},"特征二集成性","特征二：集成性",[13,62042,62043],{},"数据一般是相互独立、异构的。而数据仓库中的数据是对分散的数据进行抽取、清洗、转换和汇总后得到的，这样就保证了数据仓库内的数据的一致性。",[10548,62045,62047],{"id":62046},"特征三数据的非易失性","特征三：数据的非易失性",[13,62049,62050],{},"主要服务于日常的业务操作，使得数据库需要不断地对数据进行实时更新，以便迅速获得当前的最新数据，不致影响正常的业务操作。在数据仓库中只需要保存过去的业务数据，不需要每一笔业务都实时更新数据仓库，而是根据商业需要每隔一段时间把一批较新的数据导入数据仓库。",[72,62052,62053],{},[13,62054,62055],{},"非易失性主要是针对应用而言的。",[10548,62057,62059],{"id":62058},"特征四数据的时变性","特征四：数据的时变性",[13,62061,62062],{},"数据仓库包含各种粒度的历史数据。",[49,62064,62065,62068,62071],{},[52,62066,62067],{},"数据仓库的数据时限一般要远远长于操作型数据的数据时限",[52,62069,62070],{},"操作型系统存储的是当前数据，而数据仓库中的数据是历史数据",[52,62072,62073],{},"数据仓库中的数据是按照时间顺序追加的，它们都带有时间属性",[7759,62075,30030],{"id":30029},[10548,62077,62079],{"id":62078},"_1数据仓库的问题","（1）数据仓库的问题",[49,62081,62082,62085,62088],{},[52,62083,62084],{},"如果按“自顶而下”的方法建立企业级数据仓库，建设规模往往较大，建设周期长、投资大",[52,62086,62087],{},"在数据仓库建好后，随着使用数据仓库的部门增多，对数据仓库资源的竞争将成为企业面临的一个难题",[52,62089,62090],{},"各个部门都希望能定制数据仓库中的数据，但数据仓库是面向企业的",[10548,62092,62094],{"id":62093},"_2数据集市","（2）数据集市",[13,62096,62097],{},"数据集市面向部门、业务单元或特定应用，因而规模较小，便于快速实现，且成本低廉，短期内即可获得明显效果。数据集市的应用不仅满足了部门的数据处理需求，而且作为数据仓库的子集有助于构建完整的企业级数据仓库。",[72,62099,62100],{},[13,62101,62102],{},"我们可以将数据集市看成是数据仓库的子集，也可以将数据仓库看成是多个数据集市的聚合，虽然在数学上这两句话表达的内容可能一样，但在这里有一个设计的先后顺序。",[7759,62104,62106],{"id":62105},"_4元数据","4、元数据",[10548,62108,30037],{"id":30036},[13,62110,62111],{},"数据仓库中的元数据是关于数据仓库中数据的数据。它的作用类似于数据库管理系统的数据字典，用于保存逻辑数据结构、文件、地址和索引等信息。从广义上讲，在数据仓库中，元数据是描述数据仓库内数据的结构和建立方法的数据。",[13,62113,62114],{},"元数据可分为技术元数据和业务元数据。技术元数据为开发和管理数据仓库的IT人员使用，它描述了与数据仓库开发、管理和维护相关的数据，包括数据源信息、数据转换描述、数据仓库模型、数据清洗与更新规则、数据映射和访问权限等。而业务元数据为管理和业务分析人员服务，从业务角度描述数据，包括商业术语、数据仓库中有什么数据、数据的位置和数据的可用性等，使业务人员更好地理解数据仓库中哪些数据是可用的以及如何使用它们。",[10548,62116,62118],{"id":62117},"_2存储方式","（2）存储方式",[13,62120,62121],{},"元数据有两种常见的存储方式：一种是以数据集为基础，每一个数据集都有对应的元数据文件，每一个数据文件包含对应数据集的元数据内容；另一种是以数据库为基础的，即元数据库。",[72,62123,62124],{},[13,62125,62126],{},"Hive和maxwell大部分采用的是第二种数据库为基础（我猜的，并没有实际查），Hive需要在MySQL中先创建metastore，而maxwell需要在MySQL中创建maxwell，里面存储的是统一生成的源数据表。",[10548,62128,62130],{"id":62129},"_3元数据的作用","（3）元数据的作用",[49,62132,62133,62136,62139,62142,62145],{},[52,62134,62135],{},"描述哪些数据在数据仓库中，帮助决策分析者对数据仓库中的数据定位",[52,62137,62138],{},"定义数据进入数据仓库的方式，作为数据汇总、映射和清洗等的指南",[52,62140,62141],{},"记录业务事件的发生和随之进行的数据抽取工作的时间安排",[52,62143,62144],{},"记录并检测系统数据一致性的要求和执行情况",[52,62146,62147],{},"评估数据质量",[7759,62149,47976],{"id":47975},[10548,62151,62153],{"id":62152},"_1数据抽取","（1）数据抽取",[49,62155,62156,62159,62162,62165,62168],{},[52,62157,62158],{},"确认数据源的数据及其含义",[52,62160,62161],{},"抽取。确定访问元数据库中的哪些文件或表，需要提取其中哪些字段",[52,62163,62164],{},"抽取频率。需要定期更新数据仓库的数据，因此对于不同的数据源需要确定数据抽取的频率",[52,62166,62167],{},"输出。数据输出的目的地和输出的格式",[52,62169,62170],{},"异常处理。当需要的数据无法抽取时如何处理",[10548,62172,62174],{"id":62173},"_2数据转换","（2）数据转换",[13,62176,62177,62178],{},"不同的数据源可能由不同的平台开发，使用不同的数据库管理系统，因此数据格式也可能不同。",[22,62179,62180],{},"数据转换的主要任务是对数据粒度不一致的数据进行转化。",[49,62182,62183,62186],{},[52,62184,62185],{},"不一致数据的转换",[52,62187,62188],{},"数据粒度的转换",[10548,62190,62191],{"id":29622},"（3）数据清洗",[49,62193,62194,62197,62200,62203],{},[52,62195,62196],{},"缺失（missing）数据，即数据值的缺失。",[52,62198,62199],{},"错误数据。常见的错误数据包括字段的虚假值、异常取值等。",[52,62201,62202],{},"数据重复。",[52,62204,62205],{},"数据冲突。源数据中一些相关字段的值必须是兼容的。",[10548,62207,62209],{"id":62208},"_4数据装载","（4）数据装载",[49,62211,62212,62215,62218],{},[52,62213,62214],{},"初始装载。一次对整个数据仓库进行装载。",[52,62216,62217],{},"增量装载。在数据仓库中，增量装载可以保证数据仓库与源数据变化的同期性。",[52,62219,62220],{},"完全刷新。周期性地重写整个数据仓库，有时也可能只对一些特定的数据进行刷新。",[7759,62222,62224],{"id":62223},"_6操作型数据存储","6、操作型数据存储",[10548,62226,62228],{"id":62227},"操作型数据库操作型数据存储和数据仓库之间的比较","操作型数据库、操作型数据存储和数据仓库之间的比较",[13,62230,62231],{},[617,62232],{"alt":119,"src":62233},"img\u002F3.2.png",[7759,62235,62237],{"id":62236},"_7数据仓库模型","7、数据仓库模型",[10548,62239,29843],{"id":29842},[13,62241,62242,62243],{},"概念模型是用来表达信息世界中的信息结构，通常人们利用概念模型定义实际的数据需求。",[22,62244,62245],{},"一般采用实体-关系（E-R）图作为概念模型。",[10548,62247,29867],{"id":29866},[49,62249,62250,62258,62269],{},[52,62251,62252,62253],{},"星型模型\n",[49,62254,62255],{},[52,62256,62257],{},"星型模型的核心是事实表，事实表把各种不同的维表连接起来。",[52,62259,62260,62261],{},"雪花模型\n",[49,62262,62263,62266],{},[52,62264,62265],{},"某些维表中的数据可以进一步分解到附加的表中，以便减少冗余，节省存储空间",[52,62267,62268],{},"进一步标准化、规范化处理",[52,62270,62271,62272],{},"衍生模型\n",[49,62273,62274],{},[52,62275,62276],{},"星系模型：描述了数据仓库中多个事实表共享一个或多个维表的情况",[13,62278,62279],{},"逻辑模型设计包括确定数据仓库中数据粒度、数据分割策略、关系模式以及记录系统定义等工作。",[10548,62281,29888],{"id":29887},[13,62283,62284],{},"物理模型是逻辑模型在数据仓库中的实现，即数据仓库的物理分布模型，主要包含数据仓库的软硬件配置，数据的存储结构与索引、数据存放位置和存储分配等。",[49,62286,62287],{},[52,62288,62289,62290],{},"设计数据仓库的物理模型\n",[49,62291,62292,62295,62298,62301],{},[52,62293,62294],{},"确定项目资源",[52,62296,62297],{},"确定软硬件配置",[52,62299,62300],{},"数据仓库存储设计",[52,62302,62303],{},"数据仓库ETL策略",[7759,62305,62307],{"id":62306},"_8数据挖掘查询语言","8、数据挖掘查询语言",[13,62309,62310],{},"数据挖掘语言是有数据挖掘原语定义的，如数据挖掘查询语言（Data Mining Query Language，DMQL）。DMQL是一种基于SQL的数据挖掘查询语言，包括定义数据仓库与数据集市、挖掘概念\u002F类描述、关联和分类等数据挖掘原语。数据挖掘语言提供了交互式数据挖掘工具，具有类似SQL的语法，易于与SQL集成。",[72,62312,62313],{},[13,62314,62315],{},"简单来说就是诸如HiveQL、Spark SQL等SQL语句都是为了方便开发者使用进行的封装。虽然外观上都是极其简单的SQL语句，但是本质上做着数据处理\u002F数据挖掘的工作（毕竟再复杂的功能底层也逃不过CRUD），这类QL语句实际上还是转换为操作原语进行执行，并非由QL语句直接执行。例如Spark中的Spark SQL实际上是将内容转换为RDD后执行。",[7759,62317,62319],{"id":62318},"_9数据湖","9、数据湖",[13,62321,62322],{},"数据湖是在大数据环境下，针对传统数据仓库的不足，提出的一种集中式数据存储技术。",[13,62324,62325],{},"数据湖只需要较低成本，就可以存储任意规模的原始数据，不需要预定义模型或者结构化处理就能进行各种数据分析。",[13,62327,62328],{},"数据湖由多个数据池组成，其属性包括数据更新频率、数据来源、数据量、数据选择标准、数据关系等，可以使用键、索引等元数据描述。",[72,62330,62331],{},[13,62332,62333],{},"这里留个坑，看到尚硅谷出过数据湖Hudi的视频，不过应该半年后才有计划看了，先留个坑在这。",[7759,62335,62337],{"id":62336},"_10数据中台","10、数据中台",[13,62339,62340],{},"数据中台是一个企业级的逻辑概念，本质上是一种用于数据共享的企业级系统，处于企业前台和后台之间的中间层，一般分为数据中台和业务中台。前台开发主要完成应用开发，后台开发主要工作是数据管理，而数据中台主要为企业内部提供数据服务。",[13,62342,62343],{},"数据中台要把共性的资源、能力整合到一起，把面向客户的价值独立出来。",[10548,62345,62346],{"id":62346},"模块",[49,62348,62349,62352,62355,62358,62361],{},[52,62350,62351],{},"数据治理",[52,62353,62354],{},"数据采集和存储",[52,62356,62357],{},"数据共享",[52,62359,62360],{},"数据业务价值提供：使数据价值最大化",[52,62362,62363],{},"数据服务与管理",[23289,62365],{},[107,62367,62369],{"id":62368},"第四章-在线分析处理","第四章 在线分析处理",[13,62371,62372],{},"在线分析处理（OLAP），也称多维分析。",[13,62374,62375],{},"OLAP用于支持复杂的多维分析操作，并最终以一种直观易懂的方式把查询结果返回给分析人员，OLAP侧重于对中高层管理人员的决策支持。",[7759,62377,62379],{"id":62378},"_1定义-1","1、定义",[13,62381,62382],{},"OLAP是一种共享多维信息的快速分析的技术；OLAP利用多维数据库技术使用户可以从不同的角度观察数据；OLAP用于支持复杂的分析操作，侧重于对管理人员的决策支持，可以满足分析人员快速、灵活地进行大数据量的复杂查询的需求，并且以一种直观易懂的观察形式进行快速、稳定一致和交互性的存取，允许管理人员对数据进行深入观察。",[7759,62384,62385],{"id":32356},"2、特点",[10548,62387,62389],{"id":62388},"_1快速","（1）快速",[13,62391,62392],{},"终端用户对系统的快速响应有很高的要求。",[10548,62394,62396],{"id":62395},"_2可分析","（2）可分析",[13,62398,62399],{},"用户可以应用OLAP平台分析数据，也可以使用其他外部分析工具。",[10548,62401,62403],{"id":62402},"_3共享","（3）共享",[13,62405,62406],{},"OLAP是只读的，仅需要简单的安全管理。",[10548,62408,62410],{"id":62409},"_4多维","（4）多维",[13,62412,62413],{},"维是OLAP的核心概念，多维性是OLAP的关键属性。",[7759,62415,62417],{"id":62416},"_3oltp和olap的区别","3、OLTP和OLAP的区别",[13,62419,62420],{},"OLTP是事件驱动、面向应用的，其主要的特点是对性能要求高，用户数量大。",[13,62422,62423],{},[617,62424],{"alt":119,"src":30157},[7759,62426,62428],{"id":62427},"_4olap分类","4、OLAP分类",[10548,62430,62432],{"id":62431},"_1按照处理地点分类","（1）按照处理地点分类",[13,62434,62435],{},"OLAP按照数据处理的地点可以分为服务器端在线分析处理（Server-side OLAP或Server OLAP）和客户端在线分析处理（Client-side OLAP或Client OLAP）。",[10548,62437,62439],{"id":62438},"_2按照存储方式分类","（2）按照存储方式分类",[13,62441,62442],{},"OLAP按照存储器的多维数据存储方式可以分为关系在线分析处理（relational OLAP，ROLAP）、多位在线分析处理（multi-dimensional OLAP，MOLAP）、桌面在线分析处理（desktop OLAP，DOLAP）和混合在线分析处理（hybrid OLAP，HOLAP）等。",[23289,62444],{},[107,62446,62448],{"id":62447},"第五章-数据挖掘重点","第五章 数据挖掘（重点）",[72,62450,62451,62454],{},[13,62452,62453],{},"老实说第五章在本书的占比蛮重的，但是计科等单独学了数据挖掘这门课，我们这边零基础但是需要考试，如果压缩在本书的篇幅中会显得很不重要，所以决定单开一章数据挖掘进行学习。因为不只是《商务智能》，期末的《数据仓库》和《机器学习》对数据挖掘都有要求。但是时间关系不会在考试前把这个文档出出来了，但是会在期末前出出来。",[13,62455,62456],{},"同样，关于第六章及之后的内容本来不准备敲出来的，毕竟考试只考1、2、5、6，但是我把这本书看完了，多少还是有点收益的，所以会考虑将后续的章节补齐。",[107,62458,62460],{"id":62459},"第六章-移动商务智能","第六章 移动商务智能",[7759,62462,62464],{"id":62463},"_1移动商务","1、移动商务",[13,62466,62467],{},"移动商务作为一种新的电子交易模式，其主要特点包括以下几个方面：",[49,62469,62470,62473,62476,62479],{},[52,62471,62472],{},"使用方便，移动端随时在线，用户不受时间和地域的限制，尤其对于响应时间很高的移动应用（如股票或期货交易）来说特别重要。",[52,62474,62475],{},"安全性高。目前移动商务安全技术已经可以提供封闭式端到端的无线传输层安全协议（WTLS），该协议提供认证和加密服务，可以安装在移动设备内的SIM卡上，除了允许使用者随身携带、任意插入移动设备内外使用外，还提供PIN码或身份验证机制。",[52,62477,62478],{},"定位能力强。可以随时追踪和定位移动用户所在区域，提供用户可能需要的区域性服务信息，从而促成服务提供商与用户交易。",[52,62480,62481],{},"容易实现个性化服务。服务提供商可以根据用户的消费习惯、爱好、历史消费记录和所处位置，提供个性化服务。",[7759,62483,62485],{"id":62484},"_2移动商务智能","2、移动商务智能",[10548,62487,62489],{"id":62488},"_1概念","（1）概念",[13,62491,62492],{},"移动商务智能是商务智能在移动商务领域的应用，一般通过移动终端采集相关数据，经企业商务智能系统查询分析、在线分析处理或数据挖掘后把结果在移动终端显示，为顾客提供个性化的信息，辅助移动员工做出决策的过程。",[10548,62494,32357],{"id":62495},"_2特点-1",[49,62497,62498,62501,62504,62507],{},[52,62499,62500],{},"智能性",[52,62502,62503],{},"移动性",[52,62505,62506],{},"个性化",[52,62508,62509],{},"主动性",[10548,62511,62513],{"id":62512},"_3应用","（3）应用",[49,62515,62516,62519,62522,62525],{},[52,62517,62518],{},"移动支付用户信用评估",[52,62520,62521],{},"移动支付用户利润分析",[52,62523,62524],{},"移动支付用户类别分析",[52,62526,62527],{},"用户消费行为分析",[23289,62529],{},[107,62531,62533],{"id":62532},"第七章-商务智能与知识管理","第七章 商务智能与知识管理",[7759,62535,62537],{"id":62536},"_1知识管理概念","1、知识管理概念",[13,62539,62540],{},"知识是一个内涵丰富，外延广泛的概念，学术界对其有不同的定义。在知识管理的研究中，知识是指结构化的经验、价值。情景信息和专家认识的混合，提供了评估、整合新经验和信息的框架。知识可以有效地提升组织运作的能力。知识可以被分为显性知识( explicit knowledge)和隐性知识(tacit knowledge)，其中，显性知识是能用语言、符号、规则、公式或对象等表达，可以记录在一定物质载体上并可以共享的知识，例如书刊、报纸和技术文档等资料中的知识，而隐性知识则是存储在大脑中的经历、经验、技巧、诀窍,体会和感悟等很难表达的知识，例如钢琴师的演奏技巧，医生的临床经验等因长期从事某项业务而形成的判断力，洞察力和直觉。",[7759,62542,62544],{"id":62543},"_2商务智能和知识管理的关系","2、商务智能和知识管理的关系",[13,62546,62547],{},"知识管理是伴随知识经济出现的一种创新管理，知识管理综合运用战略、组织、流程、技术、变化等多种措施和管理工具，以富有效率的方式组织资源实现其管理目标。商务智能则注重运用相关的技术来帮助企业管理层对运营数据进行分析,以提高企业决策水平。",[13,62549,62550],{},[617,62551],{"alt":119,"src":31471},[7759,62553,62555],{"id":62554},"_3商务智能和知识管理的区别","3、商务智能和知识管理的区别",[49,62557,62558,62561,62564,62567],{},[52,62559,62560],{},"内涵不同",[52,62562,62563],{},"知识的管理过程和技术不同",[52,62565,62566],{},"关注的知识类型不同",[52,62568,62569],{},"面向的用户不同",[7759,62571,62573],{"id":62572},"_4商务智能和知识管理的联系","4、商务智能和知识管理的联系",[49,62575,62576],{},[52,62577,62578],{},"辅助决策",[13,62580,62581],{},"商务智能和知识管理在一定程度上都可以辅助决策者利用知识更好地进行决策。商务智能是对企业深层知识进行获取，沉淀的一种重要方法。这些知识通常隐藏在数据中，不易被发现，如消费者的购物习惯、偏好等知识，挖掘这些模式有效地辅助企业人员，尤其是辅助中、高层的管理人员进行决策，使企业的管理决策实现由主观经验型到科学型转变。",[49,62583,62584],{},[52,62585,62586],{},"商务智能是知识获取的一种手段",[13,62588,62589],{},[617,62590],{"alt":119,"src":31499},[23289,62592],{},[107,62594,62596],{"id":62595},"第八章-web挖掘","第八章 Web挖掘",[13,62598,62599],{},"利用文本挖掘进行网页聚类，利用结构挖掘改进搜索引擎，利用日志挖掘研究用户的使用模式等都是Web挖掘的典型应用。",[7759,62601,62603],{"id":62602},"_1web挖掘基础","1、Web挖掘基础",[10548,62605,62489],{"id":62606},"_1概念-1",[13,62608,62609],{},"Web挖掘的主要作用是通过收集，加工和处理涉及消费者消费行为的大量数据，确定特定用户群体或个体的兴趣、习惯、倾向和需求，进而推断相应用户群体或个体未来的使用行为，然后对所识别的用户群体进行特定内容的定向营销，从而为企业带来更多的利润，并提高企业的效率。Web挖掘典型的作用包括优化Web网站的结构，根据用户的喜好设计个性化的网站，留住老顾客、吸引新顾客，并降低运营成本以及提高电子商务安全等。",[10548,62611,32409],{"id":32408},[13,62613,62614],{},"主要步骤：数据预处理、模式识别、模式分析和可视化等",[13,62616,62617],{},[617,62618],{"alt":119,"src":62619},"img\u002F8.1.png",[7759,62621,62623],{"id":62622},"_2web内容挖掘","2、Web内容挖掘",[10548,62625,62627],{"id":62626},"_1文本挖掘","（1）文本挖掘",[13,62629,62630],{},"以Web文本分析对象的文本挖掘称为Web文本挖掘。",[49,62632,62633],{},[52,62634,62635],{},"挖掘过程**（困难很大）**",[13,62637,62638],{},[617,62639],{"alt":119,"src":62640},"img\u002F8.2.png",[49,62642,62643],{},[52,62644,62645,62646],{},"挖掘方法：文本概括（summary）、文本分类和文本聚类等\n",[49,62647,62648,62651,62657],{},[52,62649,62650],{},"文本概括：**文本概括是指从文本(集)中抽取关键信息，用简洁的形式总结文本(集)的主题内容。这样用户不须要阅读全文就可以对文本(集)的内容有一个比较全面的认识,以决定是否深人阅读。**当前绝大部分搜索引擎采用的方法是简单地截取文本的前几行，这种方法显然存在一些缺陷。",[52,62652,62653,62654],{},"文本分类：",[22,62655,62656],{},"文本分类是把一些被标记的文本作为训练集，找到文本属性和文本类别之间的关系模型，然后利用这种关系模型来判断新文本的类别。",[52,62658,62659],{},"文本聚类：**文本聚类是根据文本的不同特征划分为不同的类，目的是是属于同一类的文本之间的差别尽可能小，而不同类别的文本之间的差别尽可能大。**文本聚类和文本分类的区别是分类学习的样本有类别标记，而聚类的样本没有确定的类别，需要采用聚类算法来确定。",[10548,62661,62663],{"id":62662},"_2多媒体挖掘","（2）多媒体挖掘",[13,62665,62666],{},"Web多媒体挖掘是指从大量多媒体数据中通过综合分析视听特性和语义，发现隐含的、有价值的和可理解的模式，得出事件的趋向和关联，为用户提供决策支持。对于多媒体挖掘而言，主要是针对图像、音频、视频以及综合的多媒体数据进行分析，多媒体挖掘包括图像挖掘、视频挖掘和音频挖掘等类别。",[49,62668,62669,62672],{},[52,62670,62671],{},"主要方法：基本的多媒体挖掘方法包括多媒体索引和检索,多媒体数据多维分析﹑多媒体数据的分类与预测以及多媒体数据关联挖掘等方法",[52,62673,62674],{},"体系结构",[13,62676,62677],{},[617,62678],{"alt":119,"src":62679},"img\u002F8.3.png",[7759,62681,62683],{"id":62682},"_3web结构挖掘与日志挖掘","3、Web结构挖掘与日志挖掘",[10548,62685,62687],{"id":62686},"_1结构挖掘","（1）结构挖掘",[49,62689,62690,62693],{},[52,62691,62692],{},"Web结构挖掘是指挖掘Web链接结构模式，即通过分析页面链接的数量和对象，建立Web 的链接结构模式。",[52,62694,62695],{},"Web结构挖掘的典型应用包括信息检索、社区识别、网站优化和搜索引擎。",[10548,62697,62699],{"id":62698},"_2日志挖掘","（2）日志挖掘",[49,62701,62702,62705],{},[52,62703,62704],{},"Web日志挖掘是指从用户访问日志中获取有价值的信息。即通过分析 Web日志数据,发现访问者存取Web页面的模式,识别访问者的兴趣、频率、满意度，从而发现潜在用户，增强网站的竞争力。",[52,62706,62707],{},"Web日志挖掘在网站个性化设计、商业决策、改善系统性能和网站网页结构优化等方面是很有用的。",[23289,62709],{},[107,62711,62713],{"id":62712},"第九章-商务智能在企业绩效管理中的应用","第九章 商务智能在企业绩效管理中的应用",[13,62715,62716],{},"商务智能与企业绩效管理的整合，将使企业真正关注绩效管理。在这个意义上讲，商务智能是绩效管理的重要技术支持。商务智能在共享信息、有效控制企业增长，创造新的利润以及降低成本等方面为绩效管理带来价值。",[13,62718,62719],{},"商务智能允许用户获得企业运营状况，从而具备透彻的业务洞察力，对企业绩效的调整实施更加游刃有余，更加灵活。、",[13,62721,62722,62723],{},"商务智能与企业绩效管理是殊途同归的：",[22,62724,62725],{},"一个企业可能有很多绩效目标，用户通过商务智能工具从目标建立开始一直到实施结束，始终进行跟踪监控。一旦发生偏差，就会分析找出出现问题的根源，及时通知企业相关人员。",[23289,62727],{},[107,62729,62731],{"id":62730},"第十章-数据挖掘在电子商务中的应用","第十章 数据挖掘在电子商务中的应用",[7759,62733,62735],{"id":62734},"_1电子商务需要数据挖掘","1、电子商务需要数据挖掘",[13,62737,62738],{},"网站只是一个面向用户的窗口，顾客通过网站来了解企业提供的服务，而企业也需要通过网站了解顾客的需求。顾客在浏览电子商务网站、参与交易的过程中会留下很多有用的数据。通过分析这些数据,电子商务企业可以了解用户的消费喜好和行为模式，以及网站的结构应如何改进等信息，从而为顾客提供更有针对性的营销手段和服务，满足顾客的潜在需求。随着电子商务交易量的不断增加，与顾客有关数据的不断增长，如何从大量的数据中挖掘有用的知识是非常重要的。",[13,62740,62741,62742],{},"数据挖掘在电子商务中的具体应用可以表现为电子商务推荐系统、基于Web的个性化服务、电子商务Web网站优化和用户浏览行为模式分析等。在这些应用中，",[22,62743,62744],{},"数据挖掘可以帮助电子商务企业更好地了解用户的潜在兴趣，提高用户个性化的服务水平，提升顾客价值。",[7759,62746,62748],{"id":62747},"_2我比较感兴趣的几个顾客管理运用","2、我比较感兴趣的几个顾客管理运用",[72,62750,62751],{},[13,62752,62753],{},"这里有很多个顾客管理的应用，但是我知道很多就算敲出来也不会有人看，就敲几个我自己最感兴趣的吧。",[10548,62755,62757],{"id":62756},"_1个性化推荐","（1）个性化推荐",[13,62759,62760,62761],{},"推荐系统有两个特点：**一是主动性。分类目录和搜索引擎都可以解决信息过载的问题，但需要用户提供明确需求。**如果用户不能精确描述需求，则很难为用户提供准确的结果。不同的是推荐系统不需要用户提供明确的需求，而是分析用户特性与物品属性，获得用户的偏好模型，从而主动为用户推荐感兴趣的物品或信息。",[22,62762,62763],{},"二是个性化。推荐系统能够更好地挖掘长尾信息，根据用户可能的兴趣，推荐冷门物品，满足小部分用户的个性化需求。",[13,62765,62766],{},"推荐系统可以用于电商平台、新闻媒体、视频平台、社交平台等。",[10548,62768,62770],{"id":62769},"_2词云图","（2）词云图",[13,62772,62773,62774],{},"词云图的分析主要是对顾客评价内容进行分词和去停词，将不同词语出现的频率进行统计。然后将不同的字体颜色、字体大小以图形化的方式展示。",[22,62775,62776],{},"通过词云图，用户可以直观感受到文本数据所表达的主要意思。",[13,62778,62779],{},"目前市场上主流的分析方式有：SnowNLP分词，jieba精准模式分词和jieba全模式分词。",[10548,62781,62783],{"id":62782},"_3情感语义分析","（3）情感语义分析",[13,62785,62786],{},"目前比较流行的情感语义分析方法有两种：基于字典的情感语义分析和基于机器学习的情感语义分析。前者通过定义情感字典，对文本内容进行分词、去停等操作以后，计算情感值来获取文本的情感倾向；后者则是通过人工标注训练文本，对其进行有监督的机器学习，从而获得情感分析模型。SnowNLP是基于字符的生成模型，主要包含词性标注,情感分析、文本分类等功能，可以计算出每个评价的情感得分，得分越高，则用户好感度越高。",[7759,62788,62790],{"id":62789},"_3网站结构优化","3、网站结构优化",[13,62792,62793],{},"一个网站的有效性并不仅仅包括所有网页的内容本身，还应该包括网站的结构。一个设计合理的网站，不仅能带给顾客便捷的访问体验，加深顾客对该网站的印象，还可以指导网站设计人员根据顾客的访问时间、访问地点、访问兴趣和访问频率等信息动态地调整网站的页面结构，优化页面链接，改进现有的搜索引擎，修改网站的结构，实现资源优化，从而有针对性地向顾客提供更全面的、更便捷的服务。",[7759,62795,62797],{"id":62796},"_4智能搜索引擎","4、智能搜索引擎",[10548,62799,62801],{"id":62800},"_1文档自动分类","（1）文档自动分类",[13,62803,62804],{},"现有的网页分类技术主要基于特征向量，也就是提取网页中的几个关键词——网页特征关键词，并以此作为分类的标准。虽然这种分类的方法不需要人工完成，高效而客观，但其最大的缺陷在于分类的准确性比较低。为了有效地解决这个问题，许多搜索引擎采用了半人工、半自动化的方式。",[13,62806,62807],{},"一个网页在整个网站中所处的位置以及其他网页对该网页的链接，都体现了网站的管理者对于这个网页的内容与类别的定位。充分利用这些信息，有助于更准确、更高效地分析该网页。",[10548,62809,62811],{"id":62810},"_2自动文摘的形成","（2）自动文摘的形成",[13,62813,62814],{},"自动文摘是在搜索引擎抓取网页之后，自动从原始的文档中提取的能够又映该网页内容的摘要信息。",[10548,62816,62818],{"id":62817},"_3检索结果的联机聚类","（3）检索结果的联机聚类",[13,62820,62821],{},"搜索引擎首先响应用户的请求，在检索到满足用户要求的网页后，使用聚类技术，把结果集分为若干个簇。这样的聚类技术，通过各项特征，例如，满足条件的网页的URL、标题和相关的包含关键词的文档片段等，对这些网页进行快速地聚类分析，从而得到一系列表示了各种主题的簇。",[23289,62823],{},[107,62825,62827],{"id":62826},"第十一章-工作流挖掘","第十一章 工作流挖掘",[13,62829,62830,62831],{},"工作流挖掘( workflow mining)，也叫流程挖掘( process mining)，是数据挖掘在工作流管理领域的应用，主要思想是",[22,62832,62833],{},"利用数据挖掘技术从工作流日志中重构工作流模型，达到流程分析和流程优化的目的。",[13,62835,62836],{},"目前，工作流挖掘的研究主要包括工作流模型重构、工作流监控与评价和组织视图挖掘等方面，其中工作流模型重构研究成果较多。",[7759,62838,62840],{"id":62839},"_1工作流挖掘的概念与作用","1、工作流挖掘的概念与作用",[10548,62842,62489],{"id":62843},"_1概念-2",[13,62845,62846],{},"工作流挖掘是一个结合流程管理和数据挖掘的研究领域，它的初衷是通过对工作流(业务流程)运行产生的日志进行分析，重现业务流程的真实过程。",[13,62848,62849],{},"工作流挖掘的内容不仅包括流程模型的重构，还包括对流程的监控、评价以及组织视图的挖掘。工作流挖掘的意义不仅在于流程管理，也是企业知识管理的重要手段。",[10548,62851,62853],{"id":62852},"_2作用","（2）作用",[13,62855,62856,62857,29665],{},"工作流挖掘的主要作用包括",[22,62858,62859],{},"工作流柔性管理、工作流模型的优化和工作流的智能管理",[49,62861,62862,62865],{},[52,62863,62864],{},"工作流柔性管理：工作流挖掘从工作流执行阶段提取日志，通过把重构的工作流模型与原模型进行对比，从而实现工作流的柔性管理。",[52,62866,62867],{},"工作流模型的优化：工作流的生命周期分为工作流设计、工作流部署、工作流运行和工作流改进等阶段。与传统的工作流管理不同，工作流挖掘的日志来源于工作流运行阶段，而工作流挖掘主要关注于生命周期中的后两个阶段，通过对工作流模型的监控和重构弥补了传统工作流管理的不足。",[7759,62869,62871],{"id":62870},"_2工作流监控","2、工作流监控",[13,62873,62874],{},"工作流监控可以通过频繁模式挖掘实现，频繁模式挖掘可以发现工作流中经常出现的活动及其关系，帮助管理者及时了解工作流的变化情况。",[13,62876,62877],{},"工作流的监控还包括对工作流性能的实时监控。工作流性能包括时间，资源等评价指标，通过工作流性能的分析可以计算工作流的整体效率，分析流程的运行瓶颈等。",[7759,62879,62881],{"id":62880},"_3工作流挖掘的应用","3、工作流挖掘的应用",[10548,62883,62885],{"id":62884},"_1流程监控","（1）流程监控",[13,62887,62888],{},"流程管理软件可以对业务流程的执行过程进行记录，传统的流程管理软件主要侧重于流程的自动化而缺乏对流程信息的分析，利用工作流挖掘技术可以分析发现重要的知识，帮助企业分析流程的失效和缺陷信息，改进业务流程的质量。工作流挖掘可以发现非正常流程，是流程监控的重要手段。",[10548,62890,62892],{"id":62891},"_2流程优化","（2）流程优化",[13,62894,62895],{},"流程挖掘技术可以检测到发生在业务单元的真实流程，而不只是与设计流程进行比较；流程挖掘技术有能力检测到真实的数据是否流向了假设的内部工作流，而不仅仅面向系统；人的固定思维容易产生盲点，但透明的真实流程可以帮助执行人员客观地发现特殊的欺诈行为。",[10548,62897,62899],{"id":62898},"_3社会关系分析等其他领域","（3）社会关系分析等其他领域",[23289,62901],{},[107,62903,62905],{"id":62904},"第十四章-商务智能进展","第十四章 商务智能进展",[7759,62907,62908],{"id":62908},"新的趋势",[49,62910,62911,62917,62923],{},[52,62912,62913,62914,62916],{},"自动分析",[2996,62915],{},"数据的迅速增加以及数据的多态性，使得数据分析的复杂性和难度相应增加。因此，如何使数据分析的过程实现自动化，或者尽量减少人工的参与就成为数据分析领域的热点话题之一。自动机器学习，为整个数据分析项目的自动化提供了技术基础，这就增强了商务智能平台的易用性，降低了用户的使用门槛以及对数据科学家和专业数据分析人才的依赖，使企业各级人员都能使用商务智能平台的各种分析功能，提高了效率，满足了企业各级人员对信息和决策支持的需求。",[52,62918,62919,62920,62922],{},"数据素养",[2996,62921],{},"随着企业的数字化发展，掌握一定的数据分析能力将成为所有岗位的一种基本要求，这就是数据素养，也是企业顺利实现数字化转型的重要支撑。同时，保护用户的数据隐私、防止数据的滥用等数字道德问题也会提上日程。",[52,62924,62925,62926,62928],{},"泛在智能",[2996,62927],{},"企业经营环境越来越复杂化，从互联网＋到智能＋，企业内部、与供应链管理相关的边缘端等场景都离不开商务智能，商务智能正在慢慢渗透到各个行业、各个领域，从传统企业到新型互联网创业公司，孵化了许多新业态、新模式、新场景。这对商务智能平台的架构和分析技术提出了更高的要求。人工智能技术的发展，尤其是对多态数据(图像、视频、声音、文本等)的处理算法的广泛使用，将增强商务智能的使用范围和功能。",{"title":119,"searchDepth":144,"depth":144,"links":62930},[62931,62936,62940,62952,62958,62959,62963,62969,62974,62975,62981,62986],{"id":61679,"depth":132,"text":61680,"children":62932},[62933,62934,62935],{"id":61683,"depth":144,"text":61684},{"id":61726,"depth":144,"text":61727},{"id":61838,"depth":144,"text":61839},{"id":61898,"depth":132,"text":61899,"children":62937},[62938,62939],{"id":61902,"depth":144,"text":61903},{"id":61953,"depth":144,"text":61954},{"id":61987,"depth":132,"text":61988,"children":62941},[62942,62943,62944,62945,62946,62947,62948,62949,62950,62951],{"id":61991,"depth":144,"text":61992},{"id":62023,"depth":144,"text":62024},{"id":30029,"depth":144,"text":30030},{"id":62105,"depth":144,"text":62106},{"id":47975,"depth":144,"text":47976},{"id":62223,"depth":144,"text":62224},{"id":62236,"depth":144,"text":62237},{"id":62306,"depth":144,"text":62307},{"id":62318,"depth":144,"text":62319},{"id":62336,"depth":144,"text":62337},{"id":62368,"depth":132,"text":62369,"children":62953},[62954,62955,62956,62957],{"id":62378,"depth":144,"text":62379},{"id":32356,"depth":144,"text":62385},{"id":62416,"depth":144,"text":62417},{"id":62427,"depth":144,"text":62428},{"id":62447,"depth":132,"text":62448},{"id":62459,"depth":132,"text":62460,"children":62960},[62961,62962],{"id":62463,"depth":144,"text":62464},{"id":62484,"depth":144,"text":62485},{"id":62532,"depth":132,"text":62533,"children":62964},[62965,62966,62967,62968],{"id":62536,"depth":144,"text":62537},{"id":62543,"depth":144,"text":62544},{"id":62554,"depth":144,"text":62555},{"id":62572,"depth":144,"text":62573},{"id":62595,"depth":132,"text":62596,"children":62970},[62971,62972,62973],{"id":62602,"depth":144,"text":62603},{"id":62622,"depth":144,"text":62623},{"id":62682,"depth":144,"text":62683},{"id":62712,"depth":132,"text":62713},{"id":62730,"depth":132,"text":62731,"children":62976},[62977,62978,62979,62980],{"id":62734,"depth":144,"text":62735},{"id":62747,"depth":144,"text":62748},{"id":62789,"depth":144,"text":62790},{"id":62796,"depth":144,"text":62797},{"id":62826,"depth":132,"text":62827,"children":62982},[62983,62984,62985],{"id":62839,"depth":144,"text":62840},{"id":62870,"depth":144,"text":62871},{"id":62880,"depth":144,"text":62881},{"id":62904,"depth":132,"text":62905,"children":62987},[62988],{"id":62908,"depth":144,"text":62908},{},"我的大学\u002F大三下学期\u002F商务智能\u002F商务智能.md","\u002Fundergraduate\u002Fnote-73558c6351ef",{"title":61660,"description":119},"undergraduate\u002Fnote-73558c6351ef",[14968,7744,246,23378,10715,6380],"CfPZH9PYF6-x7druBzo9aQFojbKDWQBidT-pXb6IGPs",{"id":62997,"title":10715,"assetBase":239,"author":8,"body":62998,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":65229,"navigation":128,"originalPath":65230,"path":65231,"seo":65232,"source":23330,"stem":65233,"tags":65234,"weight":250,"__hash__":65235},"content\u002Fundergraduate\u002Fnote-73f8226c464a.md",{"type":10,"value":62999,"toc":65216},[63000,63002,63006,63010,63014,63018,63022,63026,63028,63032,63036,63041,63044,63049,63052,63057,63060,63065,63068,63070,63074,63079,63082,63087,63090,63095,63098,63103,63106,63109,63111,63115,63118,63121,63124,63127,63130,63140,63142,63146,63149,63159,63162,63164,63168,63171,63174,63185,63188,63193,63195,63206,63209,63214,63216,63220,63223,63226,63229,63231,63235,63239,63244,63247,63252,63255,63261,63267,63270,63276,63278,63282,63285,63288,63291,63294,63297,63299,63303,63309,63598,63601,63606,63774,63777,63783,63786,63792,63798,63804,63807,63813,64174,64177,64179,64183,64200,64202,64206,64210,64213,64216,64219,64222,64225,64227,64231,64234,64237,64240,64243,64245,64249,64252,64256,64259,64262,64265,64268,64271,64274,64277,64280,64282,64286,64289,64294,64297,64302,64305,64307,64311,64329,64331,64335,64338,64363,64366,64381,64384,64408,64410,64430,64432,64436,64439,64442,64451,64454,64457,64476,64479,64482,64502,64505,64524,64528,64537,64540,64544,64547,64550,64553,64555,64559,64562,64565,64580,64582,64586,64589,64591,64595,64599,64604,64615,64620,64623,64628,64631,64636,64646,64651,64654,64656,64660,64663,64668,64671,64676,64679,64684,64687,64692,64695,64697,64701,64704,64710,64713,64716,64719,64728,64730,64734,64738,64741,64743,64747,64752,64755,64760,64763,64768,64771,64776,64779,64784,64787,64792,64795,64797,64801,64804,64807,64810,64813,64816,64819,64822,64825,64828,64831,64834,64837,64840,64843,64845,64849,64852,64855,64858,64861,64864,64867,64870,64873,64876,64879,64882,64884,64888,64891,64894,64897,64900,64903,64906,64909,64911,64915,64918,64921,64923,64927,64931,64934,64937,64957,64959,64963,64966,64969,64972,64975,64978,64981,64984,64987,64989,64993,64996,64999,65002,65005,65007,65011,65014,65017,65026,65030,65033,65036,65039,65042,65045,65047,65051,65054,65057,65059,65063,65066,65071,65074,65079,65082,65084,65088,65093,65096,65099,65104,65107,65110,65115,65118,65121,65124,65126,65130,65133,65136,65139,65142,65145,65147,65151,65156,65159,65161,65164,65167,65172,65175,65177,65180,65183,65185,65189,65192,65195,65198,65201,65204,65206,65208,65211,65214],[4517,63001,10715],{"id":10715},[107,63003,63005],{"id":63004},"考试题型","考试题型：",[10548,63007,63009],{"id":63008},"一判断题10分10","一、判断题（10分\u002F10）",[10548,63011,63013],{"id":63012},"二填空题20分10","二、填空题（20分\u002F10）",[10548,63015,63017],{"id":63016},"三选择题20分10","三、选择题（20分\u002F10）",[10548,63019,63021],{"id":63020},"四大题一30分2-关系代数sql语言","四、大题一（30分\u002F2）-->关系代数\u002FSQl语言",[10548,63023,63025],{"id":63024},"五大题二20分-关系数据库设计","五、大题二（20分） -->关系数据库设计",[23289,63027],{},[107,63029,63031],{"id":63030},"第一章-绪论","第一章 绪论",[10548,63033,63035],{"id":63034},"_1数据库的4个基本概念","1、数据库的4个基本概念",[13,63037,63038],{},[22,63039,63040],{},"（1）数据",[13,63042,63043],{},"数据是数据库中存储的基本对象，是用来描述事物的符号记录。",[13,63045,63046],{},[22,63047,63048],{},"（2）数据库",[13,63050,63051],{},"存放数据的仓库。是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据中的数据按一定的数据模型组织、描述和存储，具有较小的冗余度、较高的数据独立性和易扩展性，并可为用户共享。",[13,63053,63054],{},[22,63055,63056],{},"（3）数据库管理系统",[13,63058,63059],{},"是位于用户和操作系统之间的一层数据管理软件。数据管理系统和操作系统一样是计算机的基础软件，也是一个大型复杂的软件系统。",[13,63061,63062],{},[22,63063,63064],{},"（4）数据库系统",[13,63066,63067],{},"是数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。",[23289,63069],{},[10548,63071,63073],{"id":63072},"_2数据库系统的特点","2、数据库系统的特点",[13,63075,63076],{},[22,63077,63078],{},"（1）数据结构化",[13,63080,63081],{},"数据库系统实现整体数据的结构化，这是数据库的主要特征之一，也是数据库系统与文件系统的本质区别。",[13,63083,63084],{},[22,63085,63086],{},"（2）数据的共享性高、冗余度低且易扩充",[13,63088,63089],{},"数据共享可以大大减少数据冗余，节约存储空间。数据共享还能够避免数据之间的不相容性与不一致性。（弹性大、易于扩充）",[13,63091,63092],{},[22,63093,63094],{},"（3）数据独立性高",[13,63096,63097],{},"数据独立性包括数据的物理独立性和逻辑独立性。物理独立性是指用户的应用程序与数据库中的物理存储是相互独立的；逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。",[13,63099,63100],{},[22,63101,63102],{},"（4）数据由数据库管理系统统一管理和控制",[13,63104,63105],{},"1、数据的安全性保护；2、数据的完整性检查；3、并发控制；4、数据库恢复",[13,63107,63108],{},"**综上所述：**数据库是长期储存在计算机内有组织、大量、共享的数据集合。它可以供各种用户共享，具有最小的冗余度和较高的数据独立性。数据库管理系统在数据库建立、运用和维护时对数据库进行统一控制，以保证数据的完整性和安全性，并在多用户使用数据库时进行并发控制，在发生故障后对数据库进行恢复。",[23289,63110],{},[10548,63112,63114],{"id":63113},"_3概念模型","3、概念模型",[13,63116,63117],{},"**（1）实体：**客观存在并可相互区别的事物",[13,63119,63120],{},"**（2）属性：**实体所具有的某一特性",[13,63122,63123],{},"**（3）码：**唯一标识实体的属性集",[13,63125,63126],{},"**（4）实体型：**用实体名及其属性名集合来抽象和刻画同类实体（具有相同属性的实体必然具有共同的特征和性质）",[13,63128,63129],{},"**（5）实体集：**同一类型的实体的集合",[13,63131,63132,63133,63136,63137,63139],{},"**（6）联系：**实体",[78,63134,63135],{},"型","内部的联系和实体",[78,63138,63135],{},"之间的联系（通常指不同实体集之间的联系，实体之间的联系有一对一、一对多、多对多等多种类型）",[23289,63141],{},[10548,63143,63145],{"id":63144},"_4数据模型","4、数据模型",[13,63147,63148],{},"**（1）数据结构：**描述数据库的组成对象以及对象之间的联系",[13,63150,63151,63152,63154,63155,63158],{},"**（2）数据操作：**对数据库中各种对象",[78,63153,63135],{},"的实例",[78,63156,63157],{},"值","允许执行的操作的集合，包括操作及有关的操作规则。（查询、更新两大类操作）",[13,63160,63161],{},"**（3）数据的完整性约束条件：**一组完整性规则。任何关系必须满足实体完整性和参照完整性",[23289,63163],{},[10548,63165,63167],{"id":63166},"_5关系模型","5、关系模型",[13,63169,63170],{},"关系模型是最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。",[13,63172,63173],{},"**（1）关系模型的数据结构：**建立在严格的数学模型的基础上。关系模型要求关系必须是规范化的，关系的每一个分量必须是一个不可分的数据项。",[49,63175,63176,63179,63182],{},[52,63177,63178],{},"码：也称为码键。表中的某个属性组，它可以唯一确定一个元组；",[52,63180,63181],{},"域：域是一组具有相同数据类型的值的集合；",[52,63183,63184],{},"分量：元组中的一个属性值。",[13,63186,63187],{},"**（2）关系模型的数据操纵与完整性约束：**操作对象和操作结果都是关系。",[13,63189,63190],{},[22,63191,63192],{},"（3）关系模型的优缺点：",[13,63194,32055],{},[49,63196,63197,63200,63203],{},[52,63198,63199],{},"关系模型与格式化模型不同，它是建立在严格的数学概念的基础上的。",[52,63201,63202],{},"关系模型的概念单一。所以数据结构简单、清晰，用户易懂易用。",[52,63204,63205],{},"关系模型的存取路径对用户透明，从而具有更高的数据独立性、更好的安全保密性，简化了程序员和数据库开发建立的工作。",[13,63207,63208],{},"缺点：",[49,63210,63211],{},[52,63212,63213],{},"存取路径对用户隐蔽，导致查询效率不如格式化数据模型。",[23289,63215],{},[10548,63217,63219],{"id":63218},"_6数据库系统的三级模式结构","6、数据库系统的三级模式结构",[13,63221,63222],{},"**（1）模式：**模式也称逻辑模式，是数据库中全体数据的逻辑结构和特征的描述，是所有用户的公共数据视图。",[13,63224,63225],{},"**（2）外模式：**外模式也称子模式或用户模式，它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述，是数据库用户的数据视图，是与某一应用有关的数据的逻辑表示。（外模式通常是模式的子集，一个数据库可以有多个外模式）",[13,63227,63228],{},"**（3）内模式：**内模式也称存储模式，一个数据库只有一个内模式。它是数据物理结构和存储方式的描述，是数据在数据库内部的组织方式。",[23289,63230],{},[107,63232,63234],{"id":63233},"第二章-关系数据库","第二章 关系数据库",[10548,63236,63238],{"id":63237},"_1一些碎片知识","1、一些碎片知识",[13,63240,28636,63241],{},[22,63242,63243],{},"域",[13,63245,63246],{},"域是一组拥有相同数据类型的值的集合。",[13,63248,28654,63249],{},[22,63250,63251],{},"关系类型",[13,63253,63254],{},"关系有三种类型：基本关系（通常又被称为基本表或者基表）、查询表和视图表。",[13,63256,63257,63258,67],{},"（3）关系的每一个分量必须是一个",[22,63259,63260],{},"不可分的数据项",[13,63262,63263,63264,67],{},"（4）关系的模式称为",[22,63265,63266],{},"关系模式",[13,63268,63269],{},"（5）关系数据库的型也被称为关系数据库模式，是对关系数据库的描述。",[13,63271,63272,63273,67],{},"（6）关系操作的特点是集合操作方式，即",[22,63274,63275],{},"操作的对象和结果都是集合",[23289,63277],{},[10548,63279,63281],{"id":63280},"_2传统的集合运算","2、传统的集合运算",[13,63283,63284],{},"传统的集合运算是二目运算，包括并、差、交、笛卡尔积4种运算。",[13,63286,63287],{},"（1）并：R∪S={t|t∈R∪t∈S}",[13,63289,63290],{},"（2）差：R-S={t|t∈R∩t∉S}",[13,63292,63293],{},"（3）交：R∩S={t|t∈R∩t∈S}",[13,63295,63296],{},"（4）笛卡尔积：R×S={(tr,ts)|tr∈R∧ts∈S}",[23289,63298],{},[10548,63300,63302],{"id":63301},"_3专门的关系运算","3、专门的关系运算",[13,63304,28636,63305,63308],{},[22,63306,63307],{},"选择","【限制】",[78,63310,63312],{"className":63311},[4566],[78,63313,63315,63385],{"className":63314},[4570],[78,63316,63318],{"className":63317},[4574],[4576,63319,63320],{"xmlns":4578,"display":4579},[4581,63321,63322,63382],{},[4584,63323,63324,63332,63334,63336,63338,63340,63342,63344,63347,63349,63352,63354,63357,63359,63361,63363,63365,63372,63379],{},[4600,63325,63326,63329],{},[4596,63327,63328],{},"σ",[4596,63330,63331],{},"F",[4591,63333,4594],{"stretchy":4593},[4596,63335,27152],{},[4591,63337,4604],{"stretchy":4593},[4591,63339,4609],{},[4591,63341,55608],{"stretchy":4593},[4596,63343,5012],{},[4596,63345,63346],{"mathvariant":7101},"∣",[4596,63348,5012],{},[4591,63350,63351],{},"∈",[4596,63353,27152],{},[4591,63355,63356],{},"∩",[4596,63358,63331],{},[4591,63360,4594],{"stretchy":4593},[4596,63362,5012],{},[4591,63364,4604],{"stretchy":4593},[4614,63366,63367,63369],{},[4591,63368,4609],{},[4591,63370,63371],{"mathvariant":7101,"lspace":37089,"rspace":37089},"′",[4614,63373,63374,63377],{},[4587,63375,63376],{},"真",[4591,63378,63371],{"mathvariant":7101,"lspace":37089,"rspace":37089},[4591,63380,63381],{"stretchy":4593},"}",[4647,63383,63384],{"encoding":4649},"\\sigma_F(R) = \\{t|t∈R∩F(t)='真'\\}",[78,63386,63388,63454,63481,63499,63557],{"className":63387,"ariaHidden":1419},[4654],[78,63389,63391,63394,63436,63439,63442,63445,63448,63451],{"className":63390},[4658],[78,63392],{"className":63393,"style":4663},[4662],[78,63395,63397,63400],{"className":63396},[4667],[78,63398,63328],{"className":63399,"style":5187},[4667,4678],[78,63401,63403],{"className":63402},[4689],[78,63404,63406,63428],{"className":63405},[4693,4694],[78,63407,63409,63425],{"className":63408},[4698],[78,63410,63413],{"className":63411,"style":63412},[4702],"height:0.3283em;",[78,63414,63416,63419],{"style":63415},"top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;",[78,63417],{"className":63418,"style":4711},[4710],[78,63420,63422],{"className":63421},[4715,4716,4717,4718],[78,63423,63331],{"className":63424,"style":5219},[4667,4678,4718],[78,63426,4726],{"className":63427},[4725],[78,63429,63431],{"className":63430},[4698],[78,63432,63434],{"className":63433,"style":4733},[4702],[78,63435],{},[78,63437,4594],{"className":63438},[4674],[78,63440,27152],{"className":63441,"style":38285},[4667,4678],[78,63443,4604],{"className":63444},[4682],[78,63446],{"className":63447,"style":4740},[4739],[78,63449,4609],{"className":63450},[4744],[78,63452],{"className":63453,"style":4740},[4739],[78,63455,63457,63460,63463,63466,63469,63472,63475,63478],{"className":63456},[4658],[78,63458],{"className":63459,"style":4663},[4662],[78,63461,55608],{"className":63462},[4674],[78,63464,5012],{"className":63465},[4667,4678],[78,63467,63346],{"className":63468},[4667],[78,63470,5012],{"className":63471},[4667,4678],[78,63473],{"className":63474,"style":4740},[4739],[78,63476,63351],{"className":63477},[4744],[78,63479],{"className":63480,"style":4740},[4739],[78,63482,63484,63487,63490,63493,63496],{"className":63483},[4658],[78,63485],{"className":63486,"style":18224},[4662],[78,63488,27152],{"className":63489,"style":38285},[4667,4678],[78,63491],{"className":63492,"style":5143},[4739],[78,63494,63356],{"className":63495},[7450],[78,63497],{"className":63498,"style":5143},[4739],[78,63500,63502,63506,63509,63512,63515,63518,63521,63554],{"className":63501},[4658],[78,63503],{"className":63504,"style":63505},[4662],"height:1.0519em;vertical-align:-0.25em;",[78,63507,63331],{"className":63508,"style":5219},[4667,4678],[78,63510,4594],{"className":63511},[4674],[78,63513,5012],{"className":63514},[4667,4678],[78,63516,4604],{"className":63517},[4682],[78,63519],{"className":63520,"style":4740},[4739],[78,63522,63524,63527],{"className":63523},[4744],[78,63525,4609],{"className":63526},[4744],[78,63528,63530],{"className":63529},[4689],[78,63531,63533],{"className":63532},[4693],[78,63534,63536],{"className":63535},[4698],[78,63537,63540],{"className":63538,"style":63539},[4702],"height:0.8019em;",[78,63541,63542,63545],{"style":5209},[78,63543],{"className":63544,"style":4711},[4710],[78,63546,63548],{"className":63547},[4715,4716,4717,4718],[78,63549,63551],{"className":63550},[4667,4718],[78,63552,63371],{"className":63553},[4667,4718],[78,63555],{"className":63556,"style":4740},[4739],[78,63558,63560,63563,63595],{"className":63559},[4658],[78,63561],{"className":63562,"style":63505},[4662],[78,63564,63566,63569],{"className":63565},[4667],[78,63567,63376],{"className":63568},[4667,6184],[78,63570,63572],{"className":63571},[4689],[78,63573,63575],{"className":63574},[4693],[78,63576,63578],{"className":63577},[4698],[78,63579,63581],{"className":63580,"style":63539},[4702],[78,63582,63583,63586],{"style":5209},[78,63584],{"className":63585,"style":4711},[4710],[78,63587,63589],{"className":63588},[4715,4716,4717,4718],[78,63590,63592],{"className":63591},[4667,4718],[78,63593,63371],{"className":63594},[4667,4718],[78,63596,63381],{"className":63597},[4682],[13,63599,63600],{},"从R（表）中找出所有满足F（条件）的t（元素）。F为运算表达式，有＞、≥、＜、≤、=、\u003C>（不等于）、┐（非）、∩、∪运算符。",[13,63602,28654,63603],{},[22,63604,63605],{},"投影",[78,63607,63609],{"className":63608},[4566],[78,63610,63612,63659],{"className":63611},[4570],[78,63613,63615],{"className":63614},[4574],[4576,63616,63617],{"xmlns":4578,"display":4579},[4581,63618,63619,63656],{},[4584,63620,63621,63628,63630,63632,63634,63636,63638,63640,63642,63644,63646,63648,63650,63652,63654],{},[4600,63622,63623,63626],{},[4596,63624,63625],{"mathvariant":7101},"Π",[4596,63627,17143],{},[4591,63629,4594],{"stretchy":4593},[4596,63631,27152],{},[4591,63633,4604],{"stretchy":4593},[4591,63635,4609],{},[4591,63637,55608],{"stretchy":4593},[4596,63639,5012],{},[4591,63641,17845],{"stretchy":4593},[4596,63643,17143],{},[4591,63645,17857],{"stretchy":4593},[4596,63647,63346],{"mathvariant":7101},[4596,63649,5012],{},[4591,63651,63351],{},[4596,63653,27152],{},[4591,63655,63381],{"stretchy":4593},[4647,63657,63658],{"encoding":4649},"\\Pi_A(R)=\\{t[A]|t∈R\\}",[78,63660,63662,63726,63762],{"className":63661,"ariaHidden":1419},[4654],[78,63663,63665,63668,63708,63711,63714,63717,63720,63723],{"className":63664},[4658],[78,63666],{"className":63667,"style":4663},[4662],[78,63669,63671,63674],{"className":63670},[4667],[78,63672,63625],{"className":63673},[4667],[78,63675,63677],{"className":63676},[4689],[78,63678,63680,63700],{"className":63679},[4693,4694],[78,63681,63683,63697],{"className":63682},[4698],[78,63684,63686],{"className":63685,"style":63412},[4702],[78,63687,63688,63691],{"style":4706},[78,63689],{"className":63690,"style":4711},[4710],[78,63692,63694],{"className":63693},[4715,4716,4717,4718],[78,63695,17143],{"className":63696},[4667,4678,4718],[78,63698,4726],{"className":63699},[4725],[78,63701,63703],{"className":63702},[4698],[78,63704,63706],{"className":63705,"style":4733},[4702],[78,63707],{},[78,63709,4594],{"className":63710},[4674],[78,63712,27152],{"className":63713,"style":38285},[4667,4678],[78,63715,4604],{"className":63716},[4682],[78,63718],{"className":63719,"style":4740},[4739],[78,63721,4609],{"className":63722},[4744],[78,63724],{"className":63725,"style":4740},[4739],[78,63727,63729,63732,63735,63738,63741,63744,63747,63750,63753,63756,63759],{"className":63728},[4658],[78,63730],{"className":63731,"style":4663},[4662],[78,63733,55608],{"className":63734},[4674],[78,63736,5012],{"className":63737},[4667,4678],[78,63739,17845],{"className":63740},[4674],[78,63742,17143],{"className":63743},[4667,4678],[78,63745,17857],{"className":63746},[4682],[78,63748,63346],{"className":63749},[4667],[78,63751,5012],{"className":63752},[4667,4678],[78,63754],{"className":63755,"style":4740},[4739],[78,63757,63351],{"className":63758},[4744],[78,63760],{"className":63761,"style":4740},[4739],[78,63763,63765,63768,63771],{"className":63764},[4658],[78,63766],{"className":63767,"style":4663},[4662],[78,63769,27152],{"className":63770,"style":38285},[4667,4678],[78,63772,63381],{"className":63773},[4682],[13,63775,63776],{},"选出R（表）中的A（属性列）中的t（元素）组成新视图。",[13,63778,28672,63779,63782],{},[22,63780,63781],{},"连接","（θ连接）",[13,63784,63785],{},"表达式太难写了这里就不写了。。。",[13,63787,63788,63789,67],{},"通过AθB条件判断生成的笛卡尔积，θ为“=”时的运算称之为",[22,63790,63791],{},"等值运算",[13,63793,63794,63797],{},[22,63795,63796],{},"自然连接","（没有AθB的表达式）是一种特殊的等值运算【取消重复列】。",[13,63799,63800,63803],{},[22,63801,63802],{},"外连接","：笛卡尔积（不存在位置给null）【保留所有关系】",[13,63805,63806],{},"左外连接：保留左边关系；右外连接：保留右边关系。",[13,63808,63809,63810],{},"（4）",[22,63811,63812],{},"除运算",[78,63814,63816],{"className":63815},[4566],[78,63817,63819,63892],{"className":63818},[4570],[78,63820,63822],{"className":63821},[4574],[4576,63823,63824],{"xmlns":4578,"display":4579},[4581,63825,63826,63889],{},[4584,63827,63828,63830,63833,63835,63837,63839,63845,63847,63849,63851,63853,63859,63861,63863,63865,63872,63874,63876,63878,63881,63887],{},[4596,63829,27152],{},[4591,63831,63832],{},"÷",[4596,63834,43693],{},[4591,63836,4609],{},[4591,63838,55608],{"stretchy":4593},[4600,63840,63841,63843],{},[4596,63842,5012],{},[4596,63844,17132],{},[4591,63846,17845],{"stretchy":4593},[4596,63848,4598],{},[4591,63850,17857],{"stretchy":4593},[4596,63852,63346],{"mathvariant":7101},[4600,63854,63855,63857],{},[4596,63856,5012],{},[4596,63858,17132],{},[4591,63860,63351],{},[4596,63862,27152],{},[4591,63864,63356],{},[4600,63866,63867,63869],{},[4596,63868,63625],{"mathvariant":7101},[4596,63870,63871],{},"Y",[4591,63873,4594],{"stretchy":4593},[4596,63875,43693],{},[4591,63877,4604],{"stretchy":4593},[4591,63879,63880],{},"⊆",[4600,63882,63883,63885],{},[4596,63884,63871],{},[4596,63886,4598],{},[4591,63888,63381],{"stretchy":4593},[4647,63890,63891],{"encoding":4649},"R\\div S=\\{t_r[x]|t_r∈R∩\\Pi_Y(S)⊆Y_x\\}",[78,63893,63895,63914,63932,64042,64060,64124],{"className":63894,"ariaHidden":1419},[4654],[78,63896,63898,63902,63905,63908,63911],{"className":63897},[4658],[78,63899],{"className":63900,"style":63901},[4662],"height:0.7667em;vertical-align:-0.0833em;",[78,63903,27152],{"className":63904,"style":38285},[4667,4678],[78,63906],{"className":63907,"style":5143},[4739],[78,63909,63832],{"className":63910},[7450],[78,63912],{"className":63913,"style":5143},[4739],[78,63915,63917,63920,63923,63926,63929],{"className":63916},[4658],[78,63918],{"className":63919,"style":18224},[4662],[78,63921,43693],{"className":63922,"style":7153},[4667,4678],[78,63924],{"className":63925,"style":4740},[4739],[78,63927,4609],{"className":63928},[4744],[78,63930],{"className":63931,"style":4740},[4739],[78,63933,63935,63938,63941,63981,63984,63987,63990,63993,64033,64036,64039],{"className":63934},[4658],[78,63936],{"className":63937,"style":4663},[4662],[78,63939,55608],{"className":63940},[4674],[78,63942,63944,63947],{"className":63943},[4667],[78,63945,5012],{"className":63946},[4667,4678],[78,63948,63950],{"className":63949},[4689],[78,63951,63953,63973],{"className":63952},[4693,4694],[78,63954,63956,63970],{"className":63955},[4698],[78,63957,63959],{"className":63958,"style":5279},[4702],[78,63960,63961,63964],{"style":4706},[78,63962],{"className":63963,"style":4711},[4710],[78,63965,63967],{"className":63966},[4715,4716,4717,4718],[78,63968,17132],{"className":63969,"style":17251},[4667,4678,4718],[78,63971,4726],{"className":63972},[4725],[78,63974,63976],{"className":63975},[4698],[78,63977,63979],{"className":63978,"style":4733},[4702],[78,63980],{},[78,63982,17845],{"className":63983},[4674],[78,63985,4598],{"className":63986},[4667,4678],[78,63988,17857],{"className":63989},[4682],[78,63991,63346],{"className":63992},[4667],[78,63994,63996,63999],{"className":63995},[4667],[78,63997,5012],{"className":63998},[4667,4678],[78,64000,64002],{"className":64001},[4689],[78,64003,64005,64025],{"className":64004},[4693,4694],[78,64006,64008,64022],{"className":64007},[4698],[78,64009,64011],{"className":64010,"style":5279},[4702],[78,64012,64013,64016],{"style":4706},[78,64014],{"className":64015,"style":4711},[4710],[78,64017,64019],{"className":64018},[4715,4716,4717,4718],[78,64020,17132],{"className":64021,"style":17251},[4667,4678,4718],[78,64023,4726],{"className":64024},[4725],[78,64026,64028],{"className":64027},[4698],[78,64029,64031],{"className":64030,"style":4733},[4702],[78,64032],{},[78,64034],{"className":64035,"style":4740},[4739],[78,64037,63351],{"className":64038},[4744],[78,64040],{"className":64041,"style":4740},[4739],[78,64043,64045,64048,64051,64054,64057],{"className":64044},[4658],[78,64046],{"className":64047,"style":18224},[4662],[78,64049,27152],{"className":64050,"style":38285},[4667,4678],[78,64052],{"className":64053,"style":5143},[4739],[78,64055,63356],{"className":64056},[7450],[78,64058],{"className":64059,"style":5143},[4739],[78,64061,64063,64066,64106,64109,64112,64115,64118,64121],{"className":64062},[4658],[78,64064],{"className":64065,"style":4663},[4662],[78,64067,64069,64072],{"className":64068},[4667],[78,64070,63625],{"className":64071},[4667],[78,64073,64075],{"className":64074},[4689],[78,64076,64078,64098],{"className":64077},[4693,4694],[78,64079,64081,64095],{"className":64080},[4698],[78,64082,64084],{"className":64083,"style":63412},[4702],[78,64085,64086,64089],{"style":4706},[78,64087],{"className":64088,"style":4711},[4710],[78,64090,64092],{"className":64091},[4715,4716,4717,4718],[78,64093,63871],{"className":64094,"style":5143},[4667,4678,4718],[78,64096,4726],{"className":64097},[4725],[78,64099,64101],{"className":64100},[4698],[78,64102,64104],{"className":64103,"style":4733},[4702],[78,64105],{},[78,64107,4594],{"className":64108},[4674],[78,64110,43693],{"className":64111,"style":7153},[4667,4678],[78,64113,4604],{"className":64114},[4682],[78,64116],{"className":64117,"style":4740},[4739],[78,64119,63880],{"className":64120},[4744],[78,64122],{"className":64123,"style":4740},[4739],[78,64125,64127,64130,64171],{"className":64126},[4658],[78,64128],{"className":64129,"style":4663},[4662],[78,64131,64133,64136],{"className":64132},[4667],[78,64134,63871],{"className":64135,"style":5143},[4667,4678],[78,64137,64139],{"className":64138},[4689],[78,64140,64142,64163],{"className":64141},[4693,4694],[78,64143,64145,64160],{"className":64144},[4698],[78,64146,64148],{"className":64147,"style":5279},[4702],[78,64149,64151,64154],{"style":64150},"top:-2.55em;margin-left:-0.2222em;margin-right:0.05em;",[78,64152],{"className":64153,"style":4711},[4710],[78,64155,64157],{"className":64156},[4715,4716,4717,4718],[78,64158,4598],{"className":64159},[4667,4678,4718],[78,64161,4726],{"className":64162},[4725],[78,64164,64166],{"className":64165},[4698],[78,64167,64169],{"className":64168,"style":4733},[4702],[78,64170],{},[78,64172,63381],{"className":64173},[4682],[13,64175,64176],{},"R、S中相关元素形成的集合，可以在R中用不相关的元素得到就满足除法运算。",[23289,64178],{},[10548,64180,64182],{"id":64181},"_4常用sql运算","4、常用SQL运算",[49,64184,64185,64188,64191,64194,64197],{},[52,64186,64187],{},"count 对元组计数",[52,64189,64190],{},"total 求总和",[52,64192,64193],{},"max 求最大值",[52,64195,64196],{},"min 求最小值",[52,64198,64199],{},"avg求平均值",[23289,64201],{},[107,64203,64205],{"id":64204},"第三章-关系数据库标准语言sql","第三章 关系数据库标准语言SQl",[10548,64207,64209],{"id":64208},"_1sql的特点","1、SQL的特点",[13,64211,64212],{},"（1）综合统一；",[13,64214,64215],{},"（2）高度非过程化；",[13,64217,64218],{},"（3）面向集合的操作；",[13,64220,64221],{},"（4）以同一语法结构提供多种使用方式；",[13,64223,64224],{},"（5）语言简洁，易学易用。",[23289,64226],{},[10548,64228,64230],{"id":64229},"_2sql功能","2、SQL功能",[13,64232,64233],{},"（1）数据查询【select】",[13,64235,64236],{},"（2）数据定义【create、drop、alter】",[13,64238,64239],{},"（3）数据操纵【insert、update、delete】",[13,64241,64242],{},"（4）数据控制【grant、revoke】",[23289,64244],{},[107,64246,64248],{"id":64247},"第四章-数据库安全性控制","第四章 数据库安全性控制",[13,64250,64251],{},"包括用户身份鉴别、多层存取控制、审计、视图和数据加密等安全技术。",[10548,64253,64255],{"id":64254},"_1常用的用户身份鉴别","1、常用的用户身份鉴别",[13,64257,64258],{},"（1）静态口令鉴别",[13,64260,64261],{},"由用户自己设定，鉴别时只要按要求输入正确的口令，系统将允许用户使用数据库管理系统。",[13,64263,64264],{},"（2）动态口令鉴别",[13,64266,64267],{},"目前较为安全的鉴别方式。口令是动态变化的，每次鉴别时均需使用动态产生的新口令登录数据库管理系统。",[13,64269,64270],{},"（3）生物特征鉴别",[13,64272,64273],{},"生物特征指的是生物体唯一具有的，可测量、识别、验证的稳定生物特征。",[13,64275,64276],{},"（4）智能卡鉴别",[13,64278,64279],{},"智能卡是一种不可复制硬件，内置集成电路的芯片，具有硬件加密功能。",[23289,64281],{},[10548,64283,64285],{"id":64284},"_2存取控制","2、存取控制",[13,64287,64288],{},"存取控制机制主要包括定义用户权限和合法权限检查两部分，两机制一起组成了数据库管理系统的存取控制子系统。",[13,64290,28636,64291],{},[22,64292,64293],{},"自主存取控制（灵活）",[13,64295,64296],{},"用户对于不同的数据库对象有不同的存取权限，不同的用户对同一对象也有不同的权限，而且用户还可将其拥有的权限转授给其他用户。",[13,64298,28654,64299],{},[22,64300,64301],{},"强制存取控制（严格）",[13,64303,64304],{},"每一个数据库对象被标以一定的密级，每一个用户也被授予某一个级别的许可证。对于任意一个对象，只有具有合法许可证的用户才可以存取。",[23289,64306],{},[10548,64308,64310],{"id":64309},"_3用户权限","3、用户权限",[13,64312,64313,64314,1011,64317,64320,64321,64324,64325,64328],{},"由",[22,64315,64316],{},"数据库对象",[22,64318,64319],{},"操作类型","组成。在数据库系统中，定义存取权限称为授权。存取控制的对象不仅有",[22,64322,64323],{},"数据","本身（基本表中的数据、属性列上的数据），还有",[22,64326,64327],{},"数据库模式","（包括模式、基本表、视图和索引的创建）。",[23289,64330],{},[10548,64332,64334],{"id":64333},"_4授权语句","4、授权语句",[13,64336,64337],{},"（1）grant授予",[114,64339,64341],{"className":33693,"code":64340,"language":33695,"meta":119,"style":119},"grant \u003C权限>[,\u003C权限>]…\non \u003C对象类型>\u003C对象名>[,\u003C对象类型>\u003C对象名>]……\nto \u003C用户>[,\u003C用户>]…\n[with grant option];\n",[17,64342,64343,64348,64353,64358],{"__ignoreMap":119},[78,64344,64345],{"class":124,"line":125},[78,64346,64347],{},"grant \u003C权限>[,\u003C权限>]…\n",[78,64349,64350],{"class":124,"line":132},[78,64351,64352],{},"on \u003C对象类型>\u003C对象名>[,\u003C对象类型>\u003C对象名>]……\n",[78,64354,64355],{"class":124,"line":138},[78,64356,64357],{},"to \u003C用户>[,\u003C用户>]…\n",[78,64359,64360],{"class":124,"line":144},[78,64361,64362],{},"[with grant option];\n",[13,64364,64365],{},"例：",[114,64367,64369],{"className":33693,"code":64368,"language":33695,"meta":119,"style":119},"grant insert on table sc to u5 with grant option;\n\u002F\u002F 将sc表的insert权限给u5用户，并且允许该用户将权限授予其他用户。\n",[17,64370,64371,64376],{"__ignoreMap":119},[78,64372,64373],{"class":124,"line":125},[78,64374,64375],{},"grant insert on table sc to u5 with grant option;\n",[78,64377,64378],{"class":124,"line":132},[78,64379,64380],{},"\u002F\u002F 将sc表的insert权限给u5用户，并且允许该用户将权限授予其他用户。\n",[13,64382,64383],{},"（2）revoke收回",[114,64385,64387],{"className":33693,"code":64386,"language":33695,"meta":119,"style":119},"revoke \u003C权限>[,\u003C权限>]…\non \u003C对象类型>\u003C对象名>[,\u003C对象类型>\u003C对象名>]……\nfrom \u003C用户>[,\u003C用户>]…\n[cascade|restrict];\n",[17,64388,64389,64394,64398,64403],{"__ignoreMap":119},[78,64390,64391],{"class":124,"line":125},[78,64392,64393],{},"revoke \u003C权限>[,\u003C权限>]…\n",[78,64395,64396],{"class":124,"line":132},[78,64397,64352],{},[78,64399,64400],{"class":124,"line":138},[78,64401,64402],{},"from \u003C用户>[,\u003C用户>]…\n",[78,64404,64405],{"class":124,"line":144},[78,64406,64407],{},"[cascade|restrict];\n",[13,64409,64365],{},[114,64411,64413],{"className":33693,"code":64412,"language":33695,"meta":119,"style":119},"revoke insert on table sc from u5 cascade;\n\u002F\u002F 收回u5用户在sc表的insert权限（同时cascade不会收回u5授权用户的权限）\n\u002F\u002F 所以restrict会级联收回下级用户权限\n",[17,64414,64415,64420,64425],{"__ignoreMap":119},[78,64416,64417],{"class":124,"line":125},[78,64418,64419],{},"revoke insert on table sc from u5 cascade;\n",[78,64421,64422],{"class":124,"line":132},[78,64423,64424],{},"\u002F\u002F 收回u5用户在sc表的insert权限（同时cascade不会收回u5授权用户的权限）\n",[78,64426,64427],{"class":124,"line":138},[78,64428,64429],{},"\u002F\u002F 所以restrict会级联收回下级用户权限\n",[23289,64431],{},[10548,64433,64435],{"id":64434},"_5数据库角色","5、数据库角色",[13,64437,64438],{},"数据库角色是被命名的一组与数据库操作相关的权限，角色是权限的集合。",[13,64440,64441],{},"（1）角色的创建",[114,64443,64445],{"className":33693,"code":64444,"language":33695,"meta":119,"style":119},"create role \u003C角色名>\n",[17,64446,64447],{"__ignoreMap":119},[78,64448,64449],{"class":124,"line":125},[78,64450,64444],{},[13,64452,64453],{},"（2）给角色授权",[13,64455,64456],{},"利用grant语句将权限授予某一个或几个角色。",[114,64458,64460],{"className":33693,"code":64459,"language":33695,"meta":119,"style":119},"grant \u003C权限>[,\u003C权限>]…\non \u003C对象类型>对象名\nto \u003C角色>[,\u003C角色>]…\n",[17,64461,64462,64466,64471],{"__ignoreMap":119},[78,64463,64464],{"class":124,"line":125},[78,64465,64347],{},[78,64467,64468],{"class":124,"line":132},[78,64469,64470],{},"on \u003C对象类型>对象名\n",[78,64472,64473],{"class":124,"line":138},[78,64474,64475],{},"to \u003C角色>[,\u003C角色>]…\n",[13,64477,64478],{},"（3）将一个角色授予其他的角色或用户",[13,64480,64481],{},"拥有with admin option的角色或用户可以将权限授予其他人。",[114,64483,64485],{"className":33693,"code":64484,"language":33695,"meta":119,"style":119},"grant \u003C角色1>[,\u003C角色2>]…\nto \u003C角色3>[,\u003C用户1>]…\n[with admin option]\n",[17,64486,64487,64492,64497],{"__ignoreMap":119},[78,64488,64489],{"class":124,"line":125},[78,64490,64491],{},"grant \u003C角色1>[,\u003C角色2>]…\n",[78,64493,64494],{"class":124,"line":132},[78,64495,64496],{},"to \u003C角色3>[,\u003C用户1>]…\n",[78,64498,64499],{"class":124,"line":138},[78,64500,64501],{},"[with admin option]\n",[13,64503,64504],{},"（4）角色权限的收回",[114,64506,64508],{"className":33693,"code":64507,"language":33695,"meta":119,"style":119},"revoke \u003C权限>[,\u003C权限>]…\non \u003C对象类型>\u003C对象名>\nfrom \u003C角色>[,\u003C角色>]…\n",[17,64509,64510,64514,64519],{"__ignoreMap":119},[78,64511,64512],{"class":124,"line":125},[78,64513,64393],{},[78,64515,64516],{"class":124,"line":132},[78,64517,64518],{},"on \u003C对象类型>\u003C对象名>\n",[78,64520,64521],{"class":124,"line":138},[78,64522,64523],{},"from \u003C角色>[,\u003C角色>]…\n",[107,64525,64527],{"id":64526},"第五章-数据库完整性","第五章 数据库完整性",[13,64529,64530,64531,52204,64534,67],{},"数据库的完整性是指数据的",[22,64532,64533],{},"正确性",[22,64535,64536],{},"相容性",[13,64538,64539],{},"关系数据库管理系统使得完整性控制成为其核心支持的功能，从而能够为所有的用户和应用提供一致的数据库完整性。",[10548,64541,64543],{"id":64542},"_1实体完整性","1、实体完整性",[13,64545,64546],{},"primary key主键定义关系的主码，具有不为空和唯一的特性。用户插入数据时会对实体完整性故则自动检查：",[13,64548,64549],{},"（1）检查主码值是否唯一，如果不唯一则拒绝插入或修改；",[13,64551,64552],{},"（2）检查主码各个属性是否为空，只要一个为空就拒绝插入和修改。",[23289,64554],{},[10548,64556,64558],{"id":64557},"_2参照完整性","2、参照完整性",[13,64560,64561],{},"foreign key外键定义关系的外码，用references指明外码参照的是哪些表的主码。",[13,64563,64564],{},"语法结构；",[114,64566,64568],{"className":33693,"code":64567,"language":33695,"meta":119,"style":119},"foreign key (Sno) references Student(Sno);\n\u002F\u002F 当前表的Sno元素和Student表中的Sno关联\n",[17,64569,64570,64575],{"__ignoreMap":119},[78,64571,64572],{"class":124,"line":125},[78,64573,64574],{},"foreign key (Sno) references Student(Sno);\n",[78,64576,64577],{"class":124,"line":132},[78,64578,64579],{},"\u002F\u002F 当前表的Sno元素和Student表中的Sno关联\n",[23289,64581],{},[10548,64583,64585],{"id":64584},"_3用户定义的完整性","3、用户定义的完整性",[13,64587,64588],{},"针对某一具体应用的数据必须满足的语义要求。\n简单来说就是用户对一些属性字段进行语义限制的操作，常见的有not null\u002Funique等。",[23289,64590],{},[107,64592,64594],{"id":64593},"第六章-关系数据库理论","第六章 关系数据库理论",[10548,64596,64598],{"id":64597},"_1术语定义","1、术语定义",[13,64600,64601],{},[22,64602,64603],{},"（1）函数依赖",[13,64605,64606,64607,64610,64611,64614],{},"设R(U)是属性集U上的关系模式，X、Y是U的子集。若对于R(U)的任何一个可能的关系r，如果r中不存在两个元组在X上的属性值相等，二在Y上的属性值不等，则称",[22,64608,64609],{},"X函数确定Y","或",[22,64612,64613],{},"Y函数依赖于X","，记作X---->Y。",[13,64616,64617],{},[22,64618,64619],{},"（2）完全函数依赖",[13,64621,64622],{},"在R(U)中，如果X---->Y，并且对于X的任何一个真子集X`--\u002F-->Y，则称Y对X完全函数依赖。记作X--F-->Y。",[13,64624,64625],{},[22,64626,64627],{},"（3）部分函数依赖",[13,64629,64630],{},"若X---->Y，但Y不完全函数依赖于X，则称Y对X部分函数依赖。记作X--P-->Y。",[13,64632,64633],{},[22,64634,64635],{},"（4）候选码",[13,64637,64638,64639,64642,64643,67],{},"设K为R\u003CU,F>中的属性或属性组合，若K--F-->U，则K为R的候选码。如果U函数依赖于K，即K---->U，则K称为",[22,64640,64641],{},"超码","。包含在任何一个候选码中的属性称为",[22,64644,64645],{},"主属性",[13,64647,64648],{},[22,64649,64650],{},"（5）全码",[13,64652,64653],{},"整个属性组是码，称为全码。",[23289,64655],{},[10548,64657,64659],{"id":64658},"_2范式","2、范式",[13,64661,64662],{},"关系数据库中的关系是要满足一定要求的，满足不同程度要求的为不同的范式。",[13,64664,64665],{},[22,64666,64667],{},"（1）1NF",[13,64669,64670],{},"若关系模式的每一个分量都是不可再分的数据项，则关系模式R属于第一范式。",[13,64672,64673],{},[22,64674,64675],{},"（2）2NF",[13,64677,64678],{},"若关系模式R∈1NF，并且每一个非主属性都完全函数依赖与R的码，则R∈2NF。",[13,64680,64681],{},[22,64682,64683],{},"（3）3NF",[13,64685,64686],{},"关系模式R中若不存在这样的码X，属性组Y及非主属性Z（Z不属于Y）使得X---->Y，Y---->Z成立，Y--\u002F-->X，则称R\u003CU,F>∈3NF。",[13,64688,64689],{},[22,64690,64691],{},"（4）BCNF",[13,64693,64694],{},"设关系模式R∈1NF，如果对于每个函数依赖X---->Y，若Y不属于X，则X必有候选码，那么R∈BCNF。",[23289,64696],{},[10548,64698,64700],{"id":64699},"_3数据依赖的公理系统","3、数据依赖的公理系统",[13,64702,64703],{},"数据依赖的公理系统是模式分解算法的理论基础。",[13,64705,64706,64709],{},[22,64707,64708],{},"Armstrong公理系统","：设U为属性集总体，F是U上的一组函数依赖，于是有关系模式R\u003CU,F>，对R\u003CU,F>来说有以下的推理规则：",[13,64711,64712],{},"（1）自反律：若Y包含于X包含于U，则X---->Y为F所蕴含。",[13,64714,64715],{},"（2）增广律：若X---->Y为F所蕴含，且Z包含于U，则XZ---->YZ为F所蕴含。",[13,64717,64718],{},"（3）传递律：若X---->Y及Y---->Z为F所蕴含，则X---->Z为F所蕴含。",[13,64720,64721,64722,1011,64725,67],{},"Armstrong公理系统是",[22,64723,64724],{},"有效的",[22,64726,64727],{},"完备的",[23289,64729],{},[107,64731,64733],{"id":64732},"第七章-数据库设计","第七章 数据库设计",[10548,64735,64737],{"id":64736},"_1一般定义","1、一般定义",[13,64739,64740],{},"数据库设计是指对于一个给定的应用环境，构造（设计）优化的数据库逻辑模式和物理结构，并据此建立数据库及其应用系统，使之能够有效的存储和管理数据，满足各种用户的应用需求，包括信息管理要求和数据操作要求。",[23289,64742],{},[10548,64744,64746],{"id":64745},"_2数据库设计的基本步骤","2、数据库设计的基本步骤",[13,64748,64749],{},[22,64750,64751],{},"（1）需求分析",[13,64753,64754],{},"准确了解与分析用户需求。",[13,64756,64757],{},[22,64758,64759],{},"（2）概念结构设计",[13,64761,64762],{},"对用户需求进行综合、归纳与抽象，形成一个独立于具体数据库管理系统的概念模型。",[13,64764,64765],{},[22,64766,64767],{},"（3）逻辑结构设计",[13,64769,64770],{},"将概念结构转换为某个数据库管理系统所支持的数据模型.",[13,64772,64773],{},[22,64774,64775],{},"（4）物理结构设计",[13,64777,64778],{},"为逻辑结构模型选取一个最适合应用环境的物理结构。",[13,64780,64781],{},[22,64782,64783],{},"（5）数据库实施",[13,64785,64786],{},"根据逻辑设计和物理设计的结果建立数据库，编写与调试应用程序，组织数据入库，并进行试运行。",[13,64788,64789],{},[22,64790,64791],{},"（6）数据库运行和维护",[13,64793,64794],{},"不断对其进行评估、调整和修改。",[23289,64796],{},[10548,64798,64800],{"id":64799},"_3需求分析不考写错了","3、需求分析【不考，写错了】",[13,64802,64803],{},"（1）任务",[13,64805,64806],{},"调查的重点是“数据”和“处理”，通过调查、收集与分析，获得用户对数据库的信息要求、处理要求、安全性与完整性要求。",[13,64808,64809],{},"（2）调查步骤",[13,64811,64812],{},"【1】调查组织机构情况；",[13,64814,64815],{},"【2】调查各部门的业务活动情况；",[13,64817,64818],{},"【3】在协助业务活动的基础上，协助用户明确对新系统的各种要求；",[13,64820,64821],{},"【4】确定新系统的边界。",[13,64823,64824],{},"（3）方法",[13,64826,64827],{},"【1】跟班作业",[13,64829,64830],{},"【2】开调查会",[13,64832,64833],{},"【3】请专人介绍",[13,64835,64836],{},"【4】询问",[13,64838,64839],{},"【5】设计调查表请用户填写",[13,64841,64842],{},"【6】查阅记录",[23289,64844],{},[10548,64846,64848],{"id":64847},"_4概念结构设计","4、概念结构设计",[13,64850,64851],{},"（1）主要特点",[13,64853,64854],{},"【1】能真实、充分地反映现实世界，包括事物和事物之间的联系，能满足用户对数据的处理要求，是现实世界的一个真是模型.",[13,64856,64857],{},"【2】易于理解，可以用它和不熟悉计算机的用户交换意见。",[13,64859,64860],{},"【3】易于更改，当应用环境和应用要求改变时容易对概念模型修改和扩充。",[13,64862,64863],{},"【4】易于向关系、网状、层次等各种数据模型转换。",[13,64865,64866],{},"（2）E-R模型与E-R图",[13,64868,64869],{},"E-R模型是用E-R土来描述现实世界的概念模型，包括实体、属性、实体之间的联系等。",[13,64871,64872],{},"E-R图提供了表示实体型、属性和联系的方法：",[13,64874,64875],{},"【1】实体型用矩形表示；",[13,64877,64878],{},"【2】属性用椭圆形表示；",[13,64880,64881],{},"【3】联系用菱形表示。",[23289,64883],{},[10548,64885,64887],{"id":64886},"_5逻辑结构设计","5、逻辑结构设计",[13,64889,64890],{},"逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用数据库管理系统产品所支持的数据模型相符合的逻辑结构。",[13,64892,64893],{},"一个实体型转换为一个关系模式。",[13,64895,64896],{},"【1】一个1：1联系可以转换为一个独立的关系模式，也可以与任意一端对应的关系模式合并。",[13,64898,64899],{},"【2】一个1：n联系可以转换为一个独立的关系模式，也可以与n端对应的关系模式合并。",[13,64901,64902],{},"【3】一个n：m联系转换为一个关系模式。",[13,64904,64905],{},"【4】三个或三个以上实体间一个多元联系可以转换为一个关系模式。",[13,64907,64908],{},"【5】具有相同码的关系模式可以合并。",[23289,64910],{},[10548,64912,64914],{"id":64913},"_6物理结构设计","6、物理结构设计",[13,64916,64917],{},"（1）确定数据库的物理结构；",[13,64919,64920],{},"（2）对物理结构进行评估。",[23289,64922],{},[107,64924,64926],{"id":64925},"第十章-数据库恢复技术","第十章  数据库恢复技术",[10548,64928,64930],{"id":64929},"_1事物","1、事物",[13,64932,64933],{},"所谓事务是用户定义的一个数据库操作序列，这些操作要么全做，要么全不做，是一个不可分割的工作单位。",[13,64935,64936],{},"定义事务的语句一般有三条：",[114,64938,64940],{"className":33693,"code":64939,"language":33695,"meta":119,"style":119},"begin transaction;  \u002F\u002F 代表事务的开始\ncommit;  \u002F\u002F 提交事务的所有操作\nrollback;  \u002F\u002F 回滚，系统将事务中对数据库的所有已完成的操作全部撤销，回滚到事务开始时的状态\n",[17,64941,64942,64947,64952],{"__ignoreMap":119},[78,64943,64944],{"class":124,"line":125},[78,64945,64946],{},"begin transaction;  \u002F\u002F 代表事务的开始\n",[78,64948,64949],{"class":124,"line":132},[78,64950,64951],{},"commit;  \u002F\u002F 提交事务的所有操作\n",[78,64953,64954],{"class":124,"line":138},[78,64955,64956],{},"rollback;  \u002F\u002F 回滚，系统将事务中对数据库的所有已完成的操作全部撤销，回滚到事务开始时的状态\n",[23289,64958],{},[10548,64960,64962],{"id":64961},"_2事务的特性","2、事务的特性",[13,64964,64965],{},"（1）原子性",[13,64967,64968],{},"事务是数据库的逻辑工作单位，要么都做，要么都不做；",[13,64970,64971],{},"（2）一致性",[13,64973,64974],{},"事务的执行结构必须是使数据性一致状态变到另一个一致性状态。",[13,64976,64977],{},"（3）隔离性",[13,64979,64980],{},"一个事务的执行不能被其他事务干扰。",[13,64982,64983],{},"（4）持续性",[13,64985,64986],{},"一个事务一旦提交，他对数据库中数据的改变应该是永久的。",[23289,64988],{},[10548,64990,64992],{"id":64991},"_3登录日志文件","3、登录日志文件",[13,64994,64995],{},"为保证数据库是可恢复的，登录日志文件时必须遵守两条原则：",[13,64997,64998],{},"（1）登录的次序严格按并发事务执行的时间次序。",[13,65000,65001],{},"（2）必须先写日志文件，后写数据库。",[13,65003,65004],{},"【关于（2）】如果先写了数据库修改，而在运行记录中没有登记这个修改，则以后就无法恢复这个修改了。如果先写日志，但没有修改数据库，按日志文件恢复时只不过多执行一次UNDO操作，并不会影响数据库的正确性。",[23289,65006],{},[107,65008,65010],{"id":65009},"第十一章-并发控制","第十一章 并发控制",[13,65012,65013],{},"事务可以一个一个地串行执行，即每个时刻只有一个事务运行。",[13,65015,65016],{},"在单处理机系统中，事务的并发执行实际上是这些并行事务的并行操作轮流交叉运行。",[13,65018,65019,65020,52204,65023,65025],{},"事务是并发控制的基本单位。为了保证事务的",[22,65021,65022],{},"隔离性",[22,65024,31793],{},"，数据库管理系统需要对并发操作进行正确调度。",[10548,65027,65029],{"id":65028},"_1并发操作的数据不一致性","1、并发操作的数据不一致性",[13,65031,65032],{},"（1）丢失修改",[13,65034,65035],{},"两个事务T1和T2读入同一数据并修改，T2提交的结果破坏了T1提交的结果，导致T1的修改被丢失。\n（2）不可重复读",[13,65037,65038],{},"事务T1读取数据后，事务T2执行更新操作，使T1无法再现前一次读取结果。",[13,65040,65041],{},"（3）读“脏”数据",[13,65043,65044],{},"事务T1修改某一数据并将其写回磁盘，事务T2读取同一数据后，T1由于某种原因被撤销，这时T1修改过的数据恢复原值，T2读到的数据就与数据库中的数据不一致，则T2读到的数据就为“脏”数据，即不正确的数据。",[23289,65046],{},[10548,65048,65050],{"id":65049},"_2并发控制","2、并发控制",[13,65052,65053],{},"并发控制机制就是要用正确的方式调度并发操作，使一个用户事务的执行不受其他事物的干扰。",[13,65055,65056],{},"并发控制的主要技术有封锁、时间戳、乐观控制法和多版本并发控制等。",[23289,65058],{},[10548,65060,65062],{"id":65061},"_3封锁","3、封锁",[13,65064,65065],{},"封锁是实现并发控制的一个非常重要的技术。基本的封锁类型有两种：",[13,65067,65068],{},[22,65069,65070],{},"（1）排它锁",[13,65072,65073],{},"又称写锁。若事务T对数据对象A加上X锁，则只允许T读取和修改A，其他任何事务都不能再对A加任何类型的锁，直到T释放A上的锁为止。",[13,65075,65076],{},[22,65077,65078],{},"（2）共享锁",[13,65080,65081],{},"又称读锁。若事务T对数据对象A加上S锁，则事务T可以读A但不能修改A，其他事务只能再对A加S锁，而不能加X锁，直到T释放A上的S锁为止。",[23289,65083],{},[10548,65085,65087],{"id":65086},"_4封锁协议","4、封锁协议",[13,65089,65090],{},[22,65091,65092],{},"（1）一级封锁协议",[13,65094,65095],{},"一级封锁协议是指，事务T在修改数据R之前必须先对其加X锁，直到事务结束才释放。",[13,65097,65098],{},"可防止丢失修改，并保证事务T是可恢复的。",[13,65100,65101],{},[22,65102,65103],{},"（2）二级封锁协议",[13,65105,65106],{},"二级封锁协议是指，在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁，读完后即可释放S锁。",[13,65108,65109],{},"进一步防止读“脏”数据。",[13,65111,65112],{},[22,65113,65114],{},"（3）三级封锁协议",[13,65116,65117],{},"三级封锁协议是指，在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁，直到事务结束才释放。",[13,65119,65120],{},"进一步防止不可重复读。",[13,65122,65123],{},"【*】三级协议的区别主要在于什么操作需要申请封锁，以及何时释放锁（即持锁时间）。",[23289,65125],{},[10548,65127,65129],{"id":65128},"_5活锁和死锁","5、活锁和死锁",[13,65131,65132],{},"（1）活锁",[13,65134,65135],{},"活锁的情形：事务有可能永远等待。（事务未被批准而一直处于等待状态）",[13,65137,65138],{},"避免活锁的简单方法是采用先来先服务的策略。",[13,65140,65141],{},"（2）死锁",[13,65143,65144],{},"死锁的情形：多个事务之间形成互相等待的局面。",[23289,65146],{},[10548,65148,65150],{"id":65149},"_6死锁的预防","6、死锁的预防",[13,65152,65153],{},[22,65154,65155],{},"（1）一次封锁法",[13,65157,65158],{},"要求每个事务必须一次将所有要使用的数据全部加锁，否则就不能继续执行。",[13,65160,63208],{},[13,65162,65163],{},"【1】扩大了封锁的范围，降低了系统的并发度；",[13,65165,65166],{},"【2】不要求封锁的数据在执行过程中可能变成封锁对象，很难事先精确的确定每个事务所要封锁的数据对象。",[13,65168,65169],{},[22,65170,65171],{},"（2）顺序封锁法",[13,65173,65174],{},"预先对数据对象规定一个封锁顺序，所有事物按这个顺序进行封锁。",[13,65176,63208],{},[13,65178,65179],{},"【1】封锁的数据对象极多，并且随数据的插入、删除等操作不断地变化，要维护这样的资源的封锁的顺序非常困难，成本很高。",[13,65181,65182],{},"【2】事务的封锁请求可以随事务的执行而动态的决定，很难事先确定每一个事物要封锁哪些对象，也就很难按照规定的顺序去施加封锁。",[23289,65184],{},[10548,65186,65188],{"id":65187},"_7死锁的诊断和解除","7、死锁的诊断和解除",[13,65190,65191],{},"（1）诊断",[13,65193,65194],{},"【1】超时法：超过了规定时限，就认为发生了死锁。",[13,65196,65197],{},"【2】等待图法：事务的等待循序形成的有向图如果存在回路，则说明发生了死锁。",[13,65199,65200],{},"（2）解除",[13,65202,65203],{},"选择一个处理死锁代价最小的事务，将其撤销，释放此事务持有的所有锁，使其他事务得以继续运行下去。",[23289,65205],{},[107,65207,25480],{"id":25480},[13,65209,65210],{},"这个年纪总是喜欢做一些无意义的事去强行拔高自己的存在，这个文档也就简化了一下书本，收录了一点个人理解和作业。虽然有“疑似”考卷的押题范围，但完全没有想法去为了那个做一份针对的文档。还是以学习新知识为重心吧，不要舍本逐末了。",[13,65212,65213],{},"不知道写些什么，就胡言乱语这么多吧。                                                                                                         ——By Alexie·Z·Yevich 2022.5.15",[226,65215,228],{},{"title":119,"searchDepth":144,"depth":144,"links":65217},[65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228],{"id":63004,"depth":132,"text":63005},{"id":63030,"depth":132,"text":63031},{"id":63233,"depth":132,"text":63234},{"id":64204,"depth":132,"text":64205},{"id":64247,"depth":132,"text":64248},{"id":64526,"depth":132,"text":64527},{"id":64593,"depth":132,"text":64594},{"id":64732,"depth":132,"text":64733},{"id":64925,"depth":132,"text":64926},{"id":65009,"depth":132,"text":65010},{"id":25480,"depth":132,"text":25480},{},"我的大学\u002F大二下学期\u002F数据库.md","\u002Fundergraduate\u002Fnote-73f8226c464a",{"title":10715,"description":119},"undergraduate\u002Fnote-73f8226c464a",[14968,246,10715],"4x4d0ahkpI15t9LYgSC8zCMzVBFQb82iBbcVzs_Z5t0",{"id":65237,"title":65238,"assetBase":239,"author":8,"body":65239,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":66626,"navigation":128,"originalPath":66627,"path":66628,"seo":66629,"source":23330,"stem":66630,"tags":66631,"weight":250,"__hash__":66632},"content\u002Fundergraduate\u002Fnote-7b665d20198c.md","作为运营的第一本运营书",{"type":10,"value":65240,"toc":66593},[65241,65245,65254,65258,65262,65316,65318,65322,65352,65356,65374,65378,65623,65625,65629,65665,65669,65672,65725,65728,65731,65775,65781,65784,65828,65831,65834,65854,65857,65871,65873,65877,65880,65883,65886,65889,65892,65896,65899,65902,65905,65908,65911,65914,65917,65920,65923,65937,65941,65944,65947,65958,65961,65964,65967,65970,65973,66008,66013,66016,66019,66026,66030,66034,66037,66051,66055,66060,66062,66066,66069,66072,66075,66078,66089,66092,66095,66098,66101,66104,66107,66110,66113,66116,66119,66122,66125,66128,66131,66134,66137,66142,66145,66153,66156,66167,66170,66181,66184,66192,66195,66198,66218,66221,66245,66247,66251,66254,66257,66261,66264,66281,66285,66288,66291,66294,66298,66301,66305,66308,66312,66315,66319,66323,66326,66329,66343,66346,66360,66363,66377,66380,66428,66430,66434,66437,66440,66447,66450,66473,66475,66479,66482,66487,66490,66494,66508,66511,66519,66522,66524,66528,66531,66551,66554,66577,66579,66581,66584,66587,66590],[4517,65242,65244],{"id":65243},"从零开始做运营","《从零开始做运营》",[72,65246,65247,65251],{},[13,65248,65249],{},[22,65250,23957],{},[13,65252,65253],{},"我加入工作室的时候职位是策划，在大三转成运营。但说是运营，其实在工作室中和打杂并无太大区别，尤其我还一直想转研发，所以混乱到自己也不知道要干什么。偶然在“打杂”的时候翻到这本《从零开始做运营》，这就是我和这本书的开始。因为是文科类性质的书（至少目前我是这么认为），所以暂且记录下书中我比较认同、感受的观点。也许写到总结时，会有不一样的发现。",[107,65255,65257],{"id":65256},"互联网的世界从来没有不需要运营的产品也没有可以无视产品的运营","互联网的世界，从来没有不需要运营的产品，也没有可以无视产品的运营。",[107,65259,65261],{"id":65260},"第一章-实话实说运营","第一章 实话实说运营",[49,65263,65264,65267,65270,65273,65279,65282,65285,65296,65299,65302],{},[52,65265,65266],{},"产品经理的工作大部分是需求分析、文档写作以及资源沟通。一个好的产品经理，需要有“跟到底”的精神。",[52,65268,65269],{},"一个产品的成功，“三分靠实力，七分靠运气”。产品经理的苦衷在于，做了所有正确的事，实现了所有需求并且完成得非常漂亮，可是如果运气不好，产品就无法形成规模效应。",[52,65271,65272],{},"运营人员的成功靠什么呢？可能是“七分靠实力，三分靠运气”。运营人员的苦衷在于，运营需要积累，无论是实力的积累、经验的积累，还是对用户了解程度的积累、对数据敏感程度的积累，这其中的时间、实践、反思、错误，全都是消耗品。创意会随着时间的增⻓而消磨，手段会随着用户的熟悉而失效，最后能够留下来的，是运营人员⻓期磨炼出来的敏锐，是对用户熟知的引导手段的集结。",[52,65274,65275,65276,65278],{},"作为一个运营人员，你需要掌握每天流量、数据的变化，洞悉任何一个可能影响运营数据的因素，掌握所有可以提升运营数据的手",[2996,65277],{},"段。",[52,65280,65281],{},"产品的需求从用户中产生，在漫⻓的开发、测试、上线之后，产品经理的任务却并没有结束，产品经理还需要通过各种数据和渠道的反馈来了解这个上线的功能或者设计对用户到底有没有用处，用户究竟有没有去使用；如果用户使用了，那么如何让这个功能或者设计变得更好用、更值得用；如果用户没有使用，那么为什么他们不用，需求对应的功能或者设计是否有问题，还是缺乏功能的引导和说明。",[52,65283,65284],{},"一个运营指标是为何提出的，运营做的一堆工作究竟对指标有没有帮助，是否还可以持续地提升效果，是否需要将运营手段固化为产品模块，这就是“跟到底”。",[52,65286,65287,65288],{},"我们始终应该明白如下两个准则：",[49,65289,65290,65293],{},[52,65291,65292],{},"第一，永远不要奢望可以对一无是处的产品进行运营，更别幻想通过运营让这样的产品起死回生甚至走向成功。",[52,65294,65295],{},"第二，永远不要以为产品的设计完美到无需运营，即便是能够实现自运营的产品，也依然需要持续的运营引导才能达到自运营的状态。",[52,65297,65298],{},"在任何一家公司、任何一个岗位，可能都需要坚持两三年，才能明白公司的具体情况、岗位的细节。但是现在，对很多人来说，不要提在一个岗位修炼两三年，让他们在一个公司工作两三年都是奢望。过热的环境、过多的机会让很多人跟着薪资走，哪里薪资高去哪里，哪个行业看起来有机会吸引更多的投资，哪个公司看起来更有机会上市，就往哪里去。很多人面临过多的机会，已经有了选择困难症，但殊不知这样频繁的选择不是你真正需要的，你需要的是让自己变得有责任心和有价值。",[52,65300,65301],{},"曾经有人说过，“产品经理是通往CEO（首席执行官）的训练营”。如果这句话是对的，那么运营就是通往COO（首席运营官）或者CMO（市场总监）的训练营。",[52,65303,65304,65305],{},"运营入门大多先从非常基础甚至看似毫无价值的事情开始，其中一些工作甚至可以称之为体力活，很多人并不喜欢这样的工作：",[49,65306,65307,65310,65313],{},[52,65308,65309],{},"内容运营要做一些内容准备，具体工作很可能是非常基础的上传图片、编辑文本的工作，繁重而且很乏味。",[52,65311,65312],{},"活动运营要做活动的前期调研。",[52,65314,65315],{},"产品运营要做产品的前期调研，找各种人要各种数据和表格，打各种电话去研究用户的反馈信息，你会觉得自己像个客服，唠唠叨叨但是无从下手。",[23289,65317],{},[107,65319,65321],{"id":65320},"第二章-运营是个筐","第二章 运营是个筐",[49,65323,65324,65327,65330,65341],{},[52,65325,65326],{},"运营是个筐，什么都能往里装。",[52,65328,65329],{},"曾经听人说过：“（互联网）产品是一项贯穿用户整个生命周期的设计行为。它根据用户的需求而变化，最终完成对用户需求的实现与用户体验的完善。”同样的道理，（互联网）运营贯穿了互联网产品整个生命周期，它根据产品的变化而调整，为了实现不同阶段的目标而有所改变，不断适应提高。",[52,65331,65332,65333],{},"一切能够进行产品推广、促进用户使用、提高用户认知的手段都是运营。根据产品类型的不同，运营的方式也不尽相同，但运营的核心目的只有一个：让产品活得更好、更久。\n",[49,65334,65335,65338],{},[52,65336,65337],{},"“活得更好”，是通过推广、教育、活动等一系列手段让产品的各项数据获得提升；",[52,65339,65340],{},"“活得更久”，是通过数据分析和用户行为研究让产品的功能不断完善、易用性不断提升，从而获得更⻓的产品生命周期。",[52,65342,65343,65344],{},"产品的生命周期：\n",[49,65345,65346,65349],{},[52,65347,65348],{},"具体来说，一个产品，进行产品设计的过程是孕育期；达到上线状态，与用户⻅面，这是初创期；获取用户、持续运营，这是成⻓期；用户稳定，收入持续，这是成熟期；用户衰减、收入减少，这是衰退期；最后完成历史使命，产品终结，这是消亡期。",[52,65350,65351],{},"孕育期，运营人员应当介入产品设计，预留好运营接口、做好对应的运营准备；初创期，运营人员应该通过各种手段获取初始用户、培养种子用户；成⻓期，运营人员应该借助各种资源进行市场推广、开展各项活动，加速用户与收入的增⻓速度；成熟期，运营人员应当通过各种运营手段，保持用户稳定，保障收入稳定；衰退期，运营人员应当更多地关怀用户，并试图将已有用户导入新的产品；消亡期，运营人员则应当做好后续工作，对用户有个交代。",[13,65353,65354],{},[617,65355],{"alt":119,"src":30426},[49,65357,65358],{},[52,65359,65360,65361],{},"运营的核心任务归结起来为两点：\n",[49,65362,65363,65366],{},[52,65364,65365],{},"流量建设：通过各种推广、扩散、营销、活动，提升网站的流量指标，我们通常所说的PV（Page View的英文缩写，意为⻚面浏览量，是评价网站流量最常用的指标之一。）、UV（Unique Visitor的简写，是指不同的、通过互联网访问、浏览这个网⻚的自然人。）、转化率（Take Rates（Conversions Rates），转化率=进行了相应的动作的访问量\u002F总访问量，用以衡量网站内容对访问者的吸引程度以及网站的宣传效果。）、SEO（Search Engine Optimization的英文缩写，意为“搜索引擎优化”。SEO是指从自然搜索结果获得网站流量的技术和过程。）都在这个环节。",[52,65367,65368,65369],{},"用户维系：如何持续有效地推动用户的活跃与留存，并从中发现有价值甚至高价值的用户，这些用户会持续地为网站（产品）带来价值、产生收益，让网站（产品）可以存活下去，并且活得有质量。\n",[49,65370,65371],{},[52,65372,65373],{},"经过多年的发展，“用户”的定义已经发展成“User”（使用者）与“Member”（会员）两种基础定义。",[13,65375,65376],{},[617,65377],{"alt":119,"src":30562},[49,65379,65380,65517,65520,65523],{},[52,65381,65382,65383],{},"运营是一种手段，简单地划分通常分为三类：\n",[49,65384,65385,65438,65480],{},[52,65386,65387,65388],{},"内容运营\n",[49,65389,65390,65393,65396,65401,65421,65435],{},[52,65391,65392],{},"网站（产品）中可供用户消费并且延⻓用户停留时间、促进用户转化的展示均可称之为“内容”。内容可能是文字、图片，也可能是音、视频，或者动作。那么，是不是所有的网站（产品）都有内容？我们可以对照下面的问题来找到答案。",[52,65394,65395],{},"内容运营是指通过创造、编辑、组织、呈现网站或产品的内容，从而提高互联网产品的内容价值，制造出对用户的黏着、活跃产生一定的促进作用的内容。",[52,65397,65398],{},[617,65399],{"alt":119,"src":65400},"img\u002F2.3.png",[52,65402,65403,65404],{},"内容运营至少包括五个部分：\n",[49,65405,65406,65409,65412,65415,65418],{},[52,65407,65408],{},"创作内容(采集或者原创，包括各种内容类型）",[52,65410,65411],{},"编辑审核",[52,65413,65414],{},"推荐和专题制作",[52,65416,65417],{},"找到需要这些内容的人，并且想办法呈现给他们",[52,65419,65420],{},"根据数据和用户反馈，进行内容调整与优化",[52,65422,65423,65424],{},"内容运营的核心：\n",[49,65425,65426,65429,65432],{},[52,65427,65428],{},"持续制作、编辑及推荐对用户有价值的内容，保证用户可以在产品中获取这些信息",[52,65430,65431],{},"根据KPI的设计，降低或者提高用户获取内容的成本",[52,65433,65434],{},"协助网站（产品）获利",[52,65436,65437],{},"内容运营非常倚重文案能力，它对任职人员的思维灵活度、创意水平、逻辑能力都有要求。你既需要想出有趣的新鲜的点子来规划和展示你的内容，又不能过分浮夸以至于用户不知所云为何物。同时，内容运营人员也需要了解用户互动的逻辑，找出有效的方法和手段，刺激用户间产生正向互动，从而获得更多的优质内容。",[52,65439,65440,65441],{},"用户运营\n",[49,65442,65443,65446,65449,65460,65463],{},[52,65444,65445],{},"什么是用户？所有使用网站及产品的自然人，都是用户。",[52,65447,65448],{},"用户运营是指：以网站（产品）的用户的活跃、留存、付费为目标，依据用户的需求，制定运营方案甚至是运营机制。目前，用户运营已经发展到针对不同类型的用户采取有针对性的运营策略的阶段。",[52,65450,65451,65452],{},"不同的网站（产品），用户运营的方式和方法有很大差异，取决于网站（产品）有多依赖用户，内部如何定义用户。将用户定义为User和定义为Member，会带来完全不同的运营策略和运营手段，甚至产生不同的运营工具和运营指标。\n",[49,65453,65454,65457],{},[52,65455,65456],{},"User指的是使用者，不管是否注册，是否登录，能够使用产品的都是User。",[52,65458,65459],{},"Member则比使用者要更进一层，可能是完成了注册并登录使用产品的User，也可能是付费使用高级功能的User。总之，Member的定义更精准，需要做的事情也更多。",[52,65461,65462],{},"用户运营首先要做的事情，就是掌握用户结构。另一件事情，就是了解用户的规模以及增⻓或衰退情况，并进行适当的用户分级，了解新用户有多少、老用户有多少、每日增⻓规模有多少、用户都处于怎样的生命周期。",[52,65464,65465,65466],{},"用户运营的核心：\n",[49,65467,65468,65471,65474,65477],{},[52,65469,65470],{},"开源（拉动新用户）",[52,65472,65473],{},"节流（防止用户流失与流失用户挽回）",[52,65475,65476],{},"维持（已有用户的留存）",[52,65478,65479],{},"刺激（促进用户活跃甚至向付费用户转化）",[52,65481,65482,65483],{},"活动运营\n",[49,65484,65485,65488,65491],{},[52,65486,65487],{},"活动运营是通过开展独立活动、联合活动，拉动某一个或多个指标的短期提升的运营工作。",[52,65489,65490],{},"活动运营可以短期拉动运营指标，也可以为产品探路，很多产品的功能可以从活动中总结和提炼出来。",[52,65492,65493,65494],{},"活动运营人员的日常工作是策划活动。它具体包含如下内容：\n",[49,65495,65496,65499,65502,65505,65508,65511,65514],{},[52,65497,65498],{},"活动文案撰写：文案用户看得懂，活动可以吸引你的用户。",[52,65500,65501],{},"活动流程设计：活动流程是自然的、妥帖的、用户乐于去执行的。",[52,65503,65504],{},"活动规则制定：规则如何设计能让用户最快明白，几步操作是用户的极限。",[52,65506,65507],{},"活动成本预估：一个活动必然有需要付出的成本，成本高了运营的压力太大，成本低了用户不愿意参与，活动设计得再漂亮也是白搭。",[52,65509,65510],{},"活动预期收益：你的活动是为了拉动哪个或哪些指标，将为网站（产品）带来怎样的收益，收益不仅仅是收入，还有用户活跃度、留存率，减少流失等指标，这些内容是设计活动的目标。",[52,65512,65513],{},"活动效果统计：明确地让自己和领导知道：活动效果好不好；如果不好，如何改进，能不能在活动中通过调整文案、入口来改善活动的效果。",[52,65515,65516],{},"活动改进措施：预备一些可能会在活动中启用的措施，促进活动效果的提升。",[52,65518,65519],{},"运营虽然看起来包罗万象，但并不意味着运营是起死回生、包治百病的灵丹妙药，甚至有的时候，运营的作用十分微弱。",[52,65521,65522],{},"运营是一个吃力但未必讨好的活儿，运营的结果好不好，并不仅仅取决于运营人员的个人能力和运营团队的能力，还有一些无法回避的关键要素，比如产品的特色、用户的习惯。",[52,65524,65525,65526],{},"运营入门的几个要素：\n",[49,65527,65528,65570,65595],{},[52,65529,65530,65531],{},"心态\n",[49,65532,65533,65553],{},[52,65534,65535,65536],{},"以运营人员的身份进入互联网行业，请先端正心态，明确几个前提\n",[49,65537,65538,65541,65544,65547,65550],{},[52,65539,65540],{},"运营不是万能的。",[52,65542,65543],{},"没有运营是万万不能的。",[52,65545,65546],{},"运营和产品是无法割裂的。",[52,65548,65549],{},"运营和很多其他岗位都是亲密无间的好伙伴。",[52,65551,65552],{},"最高级的运营是自运营。",[52,65554,65555,65556],{},"简单的道理\n",[49,65557,65558,65561,65564,65567],{},[52,65559,65560],{},"甜一点没有坏处，不管你是否做运营。",[52,65562,65563],{},"运营思路需要天⻢行空，但是并不代表无迹可寻。",[52,65565,65566],{},"运营手段需要创造性，但并不代表不可复用。",[52,65568,65569],{},"生活中的很多细节都可以对运营有所启发。",[52,65571,65572,65573],{},"技能\n",[49,65574,65575],{},[52,65576,65577,65578],{},"自上而下地反思一下你目前有以下哪些技能\n",[49,65579,65580,65583,65586,65589,65592],{},[52,65581,65582],{},"对数据的敏感度。",[52,65584,65585],{},"想象力与创造力。",[52,65587,65588],{},"口头表达能力、文字表达能力。",[52,65590,65591],{},"沟通能力。",[52,65593,65594],{},"执行力。",[52,65596,65597,65598],{},"思维模式\n",[49,65599,65600,65603,65606,65609],{},[52,65601,65602],{},"发散性思维：从一个点出发，进行思维的扩展，最终产生多个方案，而不是唯一方案，这就是运营的发散性思维。",[52,65604,65605],{},"逆向思维：这是一种逆转因果的思维方式，从原因可以推知结果，反过来从结果可以反推原因。",[52,65607,65608],{},"结构化思维：这是一种系统级别的思维方式，它通常不采用“头痛医头、脚痛医脚”的case by case（具体问题具体分析）解决方案，而是先汇总然后让系统来解决类似的所有问题。",[52,65610,65611,65612],{},"还需要清楚：\n",[49,65613,65614,65617,65620],{},[52,65615,65616],{},"进入职场之后，任何职位（除非对口专业）对专业契合度的要求都没有那么高。",[52,65618,65619],{},"很多时候，会拖我们后腿的，不是所谓的专业是否对口，而是我们的思维方式是否对路。",[52,65621,65622],{},"跟不上运营节奏的时候，放弃思考，多听多问，然后多想多做。",[23289,65624],{},[107,65626,65628],{"id":65627},"第三章-揭开内容运营的面纱","第三章 揭开内容运营的面纱",[49,65630,65631,65648,65662],{},[52,65632,65633,65634],{},"内容运营涉及的事情很多，并且非常细节化，它至少包含了以下内容：",[49,65635,65636,65639,65642,65645],{},[52,65637,65638],{},"内容的采集与创造。",[52,65640,65641],{},"内容的呈现与管理。",[52,65643,65644],{},"内容的扩散与传导。",[52,65646,65647],{},"内容的效果与评估。",[52,65649,65650,65651],{},"在内容运营的初期，我们对运营工作的排序应当是：",[49,65652,65653,65656,65659],{},[52,65654,65655],{},"内容消费者定位（网站定位+受众定位+运营目标）。",[52,65657,65658],{},"内容来源确认（采集或者寻找内容生产者）。",[52,65660,65661],{},"内容标准的确立（有哪些内容、如何展现内容、评判内容质量的标准）。",[52,65663,65664],{},"内容运营发展到今天，已经不再是简单的内容制造与发送了，内容运营的标准，早已被大大提高了。将你的内容视为你的商品，从初始阶段就定义这个商品的销售对象、选品和展示方式，进而确保上线后的后台内容流转与前台展示效果。",[7759,65666,65668],{"id":65667},"内容初始化构建网站与产品的价值观","内容初始化——构建网站与产品的价值观",[13,65670,65671],{},"内容初始化就是在已构建好的内容框架下，在用户进入之前填充一些内容，这些内容是内容运营初期网站或（产品）的核心部分，代表着网站（产品）的价值观。",[49,65673,65674,65708],{},[52,65675,65676,65677],{},"依赖项：\n",[49,65678,65679,65690,65702,65705],{},[52,65680,65681,65682],{},"第一，确立好内容供应链的架构，即通过系统去解决内容从哪里来、到哪里去的流程问题。\n",[49,65683,65684,65687],{},[52,65685,65686],{},"不管什么样的内容规范，最先解决的其实都不是内容的甄别问题，而是什么样的内容允许被创建。也可以认为，确立了创建内容的标准之后，网站就已经可以初步对垃圾内容的产生进行约束。创建内容标准的确立对甄别内容质量的帮助，是初步减少不良内容出现的概率，及规避对不良内容的清洗带来的用户投诉和用户意⻅的反弹。",[52,65688,65689],{},"即便是有了系统和规则的约束，内容质量的甄别也依然会有部分内容依赖人工，而且内容质量的甄别，本身就是所有有内容的网站和产品始终都在寻找解决方案的重要事项。",[52,65691,65692,65693],{},"第二，确立好内容面对的初始用户群（关于初始用户或者称为“种子用户”，我们会在后面具体讨论）。\n",[49,65694,65695,65698],{},[52,65696,65697],{},"通过各种方式将好的内容呈现给用户。呈现的方法，无非是用户主动发现，以及运营人员对用户主动推送与引导两种方式。",[52,65699,65700],{},[617,65701],{"alt":119,"src":29839},[52,65703,65704],{},"第三，明确第一阶段用内容解决的问题，并进行内容准备。",[52,65706,65707],{},"第四，关键路径的梳理与初始内容的准备。",[52,65709,65710,65711],{},"一个网站（产品）进入正式运营阶段，就需要建立一些标准，具体包括：\n",[49,65712,65713,65716,65719,65722],{},[52,65714,65715],{},"内容质量的甄别。",[52,65717,65718],{},"好内容的露出与呈现方式。",[52,65720,65721],{},"持续的推送与推荐机制的建立。",[52,65723,65724],{},"实现“自运营”的路径与机制选择。",[7759,65726,65727],{"id":65727},"把好的内容呈现给用户",[13,65729,65730],{},"渠道选择的原则自不待言，就是要使用用户最常接触、且最易使用的那部分渠道。",[49,65732,65733,65758],{},[52,65734,65735,65736],{},"推送渠道的选择\n",[49,65737,65738,65741,65744],{},[52,65739,65740],{},"第一，优先考虑渠道是否覆盖推送对象。",[52,65742,65743],{},"第二，推送内容的时效性。",[52,65745,65746,65747],{},"依据：\n",[49,65748,65749,65752,65755],{},[52,65750,65751],{},"历史推送数据。它主要包括使用过什么样的渠道，各个渠道的到达率与转化率如何。",[52,65753,65754],{},"竞品选择的渠道。如果没有历史数据，就需要预估，此时比较具有参考价值的，是竞品的渠道选择。",[52,65756,65757],{},"用户兴趣点所涉及的渠道。如果没有历史数据，也没有掌握竞品的情况甚至没有竞品，那么可能就需要根据用户的行为去猜测用户可能会在哪些渠道上接受信息。",[52,65759,65760,65761],{},"文案的撰写\n",[49,65762,65763,65766,65769,65772],{},[52,65764,65765],{},"贴近受众的心理。",[52,65767,65768],{},"选一个好位置。",[52,65770,65771],{},"简单有趣，朗朗上口。",[52,65773,65774],{},"符合场景。",[13,65776,65777,65778,67],{},"好文案的特征：",[22,65779,65780],{},"称呼亲切、内容简单、落款严肃、充满诱惑",[7759,65782,65783],{"id":65783},"公共平台内容运营的步骤",[49,65785,65786,65795,65801,65810,65813,65822],{},[52,65787,65788,65789,65791,65792,65794],{},"先定位",[2996,65790],{},"根据品牌自身的特点、受众、调性来定义公共平台所要进行运营的内容的特色、受众和调性。",[2996,65793],{},"这个定位，实际上包含两层意思：第一层意思是面向受众群的定位。你要清楚哪些受众群体会喜欢你的内容。第二层意思是面向内容的定位。对于这样的受众群体，你应该通过什么类型的内容进行⻓期的运营。",[52,65796,65797,65798,65800],{},"快速测试，获取反馈",[2996,65799],{},"要进行快速测试，看之前定位的受众是否接受发布的内容，如果发现反馈平平，那就多试几次加以调整。",[52,65802,65803,65804,65806,65807,65809],{},"培养用户的习惯",[2996,65805],{},"不管是早晨通勤时间发布，中午休息时间发布，还是晚上休闲时间发布，这个时间点都不重要。**重要的是，要在固定的时间发布内容。**如果内容发布的时间固定，⻓期关注内容的用户会养成定时查看的习惯。",[2996,65808],{},"习惯是建立在用户对内容感兴趣的基础上，如果前两步没有做好，这一步就没有价值了。",[52,65811,65812],{},"坚持⻓期的内容运营方针",[52,65814,65815,65816,65818,65821],{},"与内容消费者保持互动",[2996,65817],{},[22,65819,65820],{},"公共平台上的内容消费者，或许也是内容生产者","，和他们进行沟通，很有可能带来有益的提醒，帮助运营者找到用户关心的问题并予以解决。这并不难，只要你肯提供消费者需要的内容，你就解决了他们关心的问题。",[52,65823,65824,65825,65827],{},"坚持原创",[2996,65826],{},"原创的符合品牌特点及受众口味的内容，最容易引爆热点。所以，对于希望在公共平台开展内容运营的企业和运营人员来说，就要先明白这些道理，然后摆正心态，坚持做正确的事。",[7759,65829,65830],{"id":65830},"内容运营的核心",[13,65832,65833],{},"一个网站（产品），只要有内容，就涉及内容供应链的建立，而内容供应链的建立必然涉及三方：网站（产品）、内容生产者及内容消费者。这三方关系着内容运营的核心。",[49,65835,65836,65842,65848],{},[52,65837,65838,65839,65841],{},"内容消费者",[2996,65840],{},"内容消费者是消费内容的人（阅读、采纳、运用），他们与网站（产品）的定位息息相关，他们决定了网站（产品）的内容给谁看，谁会对这些内容感兴趣从而提供可转化的流量。",[52,65843,65844,65845,65847],{},"内容生产者",[2996,65846],{},"内容生产者是生产内容的人，他们是网站（产品）内容的发动机，他们决定了网站（产品）会提供怎样的内容。内容生产者所提供的内容与内容消费者兴趣的匹配，是保证内容流转效率和网站（产品）转化能力的动力。",[52,65849,65850,65851,65853],{},"网站与产品",[2996,65852],{},"网站与产品是联系内容生产者和内容消费者的渠道或平台，它需要维系内容生产者，满足内容消费者，通过各种方式保证网站（产品）的运转。",[10548,65855,65856],{"id":65856},"内容运营的反馈机制和跟进策略",[49,65858,65859,65862,65865,65868],{},[52,65860,65861],{},"在内容的采集与管理工作中，必须考虑用户反馈和对应的跟进策略。",[52,65863,65864],{},"反馈机制和跟进策略可以根据平台的不同选择合适的展现方式。",[52,65866,65867],{},"数据挖掘机制非常重要，但更重要的是对数据挖掘之后的反馈与跟进。",[52,65869,65870],{},"内容不是一成不变的，而是需要调整与提高。·内容运营必须要有KPI，但不管是曝光度的指标还是其他指标，指标的意义都不仅仅是“达成”，而是要反过来指导下一阶段的内容运营工作。",[23289,65872],{},[107,65874,65876],{"id":65875},"第四章-做一个有趣的活动","第四章 做一个有趣的活动",[13,65878,65879],{},"做运营，离不开活动。活动运营，顾名思义是通过组织活动在短期内快速提升相关指标的运营手段。我们拆分一下这句话中的关键字：",[13,65881,65882],{},"短期：在一个较短的时间内开展活动。",[13,65884,65885],{},"快速：用简单直接的方式在较短时间内达成结果。",[13,65887,65888],{},"提升指标：目的明确，提升活动对应指标，达成KPI。",[13,65890,65891],{},"具体来说，一个完整的活动运营流程可能会涉及如下步骤：",[13,65893,65894],{},[617,65895],{"alt":119,"src":30157},[13,65897,65898],{},"策划：活动的设计阶段，会定义明确的活动时间、对象、方式、目标、预算等。",[13,65900,65901],{},"开发：活动需要由设计人员设计界面，请开发人员开发实现功能。",[13,65903,65904],{},"测试：一个活动开发完成后，需要测试以确认功能是否可用与易用。",[13,65906,65907],{},"宣传：找到可以触达用户的渠道，协调资源来做活动露出。这个阶段几乎是和开发、测试同时进行的，而且为了活动效果，在上线之前就会做一些预热。",[13,65909,65910],{},"上线：终于到了上线时间，活动就会在线上进行展示，让用户参与活动。",[13,65912,65913],{},"指标监控：活动上线后，需要监测相应的指标，根据指标反映的问题进行适当的调整。",[13,65915,65916],{},"奖励发放：活动结束后（当然，也可以是活动进行中），对符合奖励条件的用户发放奖励。",[13,65918,65919],{},"效果评估：活动结束后，评估活动效果，总结经验教训，以备下次活动参考借鉴。",[13,65921,65922],{},"在整个活动运营过程中，有四件事情非常重要，可以称之为“核心”，它们分别是：",[49,65924,65925,65928,65931,65934],{},[52,65926,65927],{},"活动设计与成本预算。",[52,65929,65930],{},"活动⻛险管控与应急预案。",[52,65932,65933],{},"活动数据监测与应对策略。",[52,65935,65936],{},"活动效果判定与总结。",[10548,65938,65940],{"id":65939},"请铭记一个运营者如果心中永远只有当前的目标而忽略了行动的目的那么他终将一无所获","请铭记：一个运营者，如果心中永远只有当前的目标，而忽略了行动的目的，那么他终将一无所获。",[7759,65942,65943],{"id":65943},"活动设计与成本预算",[13,65945,65946],{},"针对活动运营的成本预算管控，我们在活动设计上可以做什么呢？",[49,65948,65949,65952,65955],{},[52,65950,65951],{},"先看能不能借势，再看能不能借力。可以借势的活动用抽奖的方式进行，可以借力的活动用合作分摊成本。",[52,65953,65954],{},"如果势、力皆无，那么就要拿出数据说服老板，要么降低活动预期，要么增加活动预算。",[52,65956,65957],{},"如果说服不了老板，那么，尽你的最大努力，来设计一个吸引人的活动吧。",[10548,65959,65960],{"id":65960},"活动规则的设计准则",[13,65962,65963],{},"活动规则的设计准则就一句话：流程简单少思考，文案清晰无歧义。",[13,65965,65966],{},"但是，在这个准则之上，还有一个很高的帽子：活动设计与活动理由的无缝衔接。",[13,65968,65969],{},"即使一个活动设计得再无聊，如果有足够多的人看到它，它也可能会起到很好的宣传效果；而不管一个活动设计得多么精致，如果人们并不知晓，那它也不太可能有效果。所以，活动策划的另一个关键是，宣传渠道投放。",[7759,65971,65972],{"id":65972},"活动策划",[2285,65974,65975,65978,65981,65984,65987,65990,65993,65996,65999,66002,66005],{},[52,65976,65977],{},"活动主题：活动文案的一部分，让用户看得懂，明白活动是什么主题，是否对他有吸引力。",[52,65979,65980],{},"活动对象：明确活动针对的群体，让用户看得懂，让自己抓得住，让领导认可。",[52,65982,65983],{},"活动时间：活动的开始时间、结束时间，奖励的发放时间、领取时间。",[52,65985,65986],{},"活动描述：活动文案的一部分，让用户看过之后明白要不要参与，怎么参与。",[52,65988,65989],{},"规则详情：活动文案的一部分，让用户看得懂，让开发人员看得懂，一部分内容是在前端展示给用户看的，另一部分内容是让开发人员知道活动如何实现。",[52,65991,65992],{},"投放渠道：让市场人员或者你自己看得懂，要有投放时间、投放渠道的选择、预算。",[52,65994,65995],{},"⻛险控制：让开发人员看得懂你的⻛险环节是什么，有无对应的措施来解决。",[52,65997,65998],{},"监测指标：涵盖大多数相关指标，包括投放渠道的监控、用户参与情况的监控、奖励发放的监控等。监测这些指标可以帮助你在查看数据的时候找到问题，并且启发你去解决这些问题。",[52,66000,66001],{},"成本预估：一个活动需要多少钱，单人成本是多少。成本预估不一定非常准确，但是必须要树立这个意识。有一些活动是不花钱的，但是如果要花钱，你要明白一个活动的容量有多大，对指标的帮助是什么，为了这些利益，你需要多少成本支持。",[52,66003,66004],{},"效果评估：有成本就有收益，你的活动目的对网站（产品）的哪些指标是有帮助的，以及如何体现，你需要考虑，并让领导认可。",[52,66006,66007],{},"FAQ（常⻅问题解答）：可以另外准备一个文档，提供给客服或者相关人员，帮助解决用户在参与活动中遇到的问题。FAQ要详细、标准。如果活动规模大，仅有FAQ还不够，你需要提前准备客服的培训文件，并积极与客服人员沟通。",[13,66009,66010],{},[22,66011,66012],{},"活动策划文档的目的，是为了让活动做得有理有据。做活动的理由、耗费运营成本的代价、上线后可能带来的预期收益都是必须体现在活动策划中的。",[7759,66014,66015],{"id":66015},"活动风险管控与应急预案",[13,66017,66018],{},"运营最累的部分，其实是如何控制运营⻛险，把用户体验做到最好。而活动运营最累的环节不是如何设计一个有趣的活动，而是如何保证活动开展过程中的用户体验，减少活动的⻛险。",[13,66020,66021,66022,66025],{},"换而言之，哪怕是最普通的活动内容，用户看了完全提不起参与的兴趣，都不是最可怕的，最应该引起运营人员关注的是，",[22,66023,66024],{},"不能让有兴趣参与的用户在整个活动流程中感到不快","，不管是活动开发有Bug（错误）导致的体验不佳，还是活动设计有漏洞导致的不公平，这些都是需要考虑和严格把关的内容。",[13,66027,66028],{},[617,66029],{"alt":119,"src":30871},[13,66031,66032],{},[617,66033],{"alt":119,"src":30924},[13,66035,66036],{},"活动⻛控的严格程度是有一些窍门的。",[49,66038,66039,66042,66045,66048],{},[52,66040,66041],{},"产品发展初期，为了吸引用户进入，⻛控可以较为宽松，甚至直接不做⻛控。",[52,66043,66044],{},"产品发展期，为了促进用户留存及活跃，对部分提升用户留存和活跃的活动可以使用较为宽松的⻛控，但涉及到付费行为，就需要较为严格的⻛控。",[52,66046,66047],{},"产品成熟期，需要较为严格的⻛控，这个时期最怕的就是数据的大起大落，严格⻛控可以帮助你将数据变化控制在比较平稳的范围内，也可以对有实际价值的客户提供更多奖励。",[52,66049,66050],{},"产品衰退期，可以采用较为宽松的⻛控以延⻓产品的生命周期。",[10548,66052,66054],{"id":66053},"活动运营人员首先要明白活动是一种短期刺激运营指标的手段","活动运营人员首先要明白，活动是一种短期刺激运营指标的手段。",[13,66056,66057],{},[617,66058],{"alt":119,"src":66059},"img\u002F4.5.png",[23289,66061],{},[107,66063,66065],{"id":66064},"第五章-用户运营比想象得更难","第五章 用户运营比想象得更难",[13,66067,66068],{},"所有的用户运营工作，都建立在一个相同的基础上，即对用户的充分了解。如何证明我们了解用户呢？举一个很简单的例子。假设要做一个User Referral（用户推荐）活动，运营人员应当知道，用户喜欢用哪些渠道进行分享和邀请，同时也应当知道，这个活动在哪些外部平台推广宣传，或者和哪些外部平台做联合推广，会达到最优效果。",[13,66070,66071],{},"所有的工作，都围绕一个内容——人。既然用户是人，就绕不开需求理论。",[7759,66073,66074],{"id":66074},"通过数据窥探用户",[10548,66076,66077],{"id":66077},"转化率",[49,66079,66080,66083,66086],{},[52,66081,66082],{},"列表⻚转化率=最终下单用户数\u002F商品列表⻚到达用户数",[52,66084,66085],{},"详情⻚转化率=最终下单用户数\u002F商品详情⻚到达用户数",[52,66087,66088],{},"支付转化率（支付成功率）=支付成功的用户\u002F最终下单用户数",[13,66090,66091],{},"数据需要归类，不同类别的数据需要分门别类地存放和使用，然后找到数据之间的关联与逻辑关系，分析需要归因，对数据产生的现象背后的原因要加以分析和查找。",[13,66093,66094],{},"不管是归类还是归因，最后都需要验证推论的正确性，这就产生了持续运营的总结和归纳，表现到行为上，就是重现与试错。能够确认的归因就重现，不能确认的就试错。通过这两种方式，用户运营人员就能以较高的高度和较宏观的视角，去看待和了解用户。",[7759,66096,66097],{"id":66097},"直面用户",[13,66099,66100],{},"数据为我们提供预测用户的依据，帮助我们验证猜测和推论是否成立。但是，数据绝不是唯一一个了解用户的途径，事实上，有一种方法被广泛使用，产品经理称之为“用户研究”。",[13,66102,66103],{},"当然，从运营角度来看，直面用户的方法可能未必需要那么多，但是其原理是一致的。需要注意的是，运营与用户面对面地做深度访谈之类的行为是比较困难的。",[10548,66105,66106],{"id":66106},"客服时间反馈",[13,66108,66109],{},"客服是直面用户的第一道闸门，这个闸门既可以为运营和产品人员指出已有的问题和潜在的⻛险，也可以隔绝所有问题的反馈并阻挡改进的步伐。",[13,66111,66112],{},"通常是先记录所有的客服事件并挖掘其背后的问题，再归纳其共性。从运营端找到用户最关注的点，立即予以解决或排定优先级着手解决。",[10548,66114,66115],{"id":66115},"电话回访",[13,66117,66118],{},"回访的关键在于明确问题，尝试让用户重现问题以帮助自己明晰症结所在。",[10548,66120,66121],{"id":66121},"问卷调查",[13,66123,66124],{},"尽量客观地描述选项；尽量避免预设立场之后进行问卷设计与分析；尽量让问卷的设计可以覆盖大多数用户，提供大样本基础；尽量回收足够多的有效问卷。",[13,66126,66127],{},"起来都很简单，但做起来很难。",[10548,66129,66130],{"id":66130},"聚类调研",[13,66132,66133],{},"直面的是类似用户，推论的是选型用户。所谓选型用户，就是预设立场选出来的典型用户。",[7759,66135,66136],{"id":66136},"工作内容",[13,66138,66139],{},[617,66140],{"alt":119,"src":66141},"img\u002F5.1.png",[10548,66143,66144],{"id":66144},"开源",[49,66146,66147,66150],{},[52,66148,66149],{},"注册渠道的挑选和打开",[52,66151,66152],{},"提升注册转化率",[10548,66154,66155],{"id":66155},"节流",[49,66157,66158,66161,66164],{},[52,66159,66160],{},"定义用户沉默或流失的标准",[52,66162,66163],{},"建立流失预警机制",[52,66165,66166],{},"对已流失的用户进行挽回",[10548,66168,66169],{"id":66169},"促活跃",[49,66171,66172,66175,66178],{},[52,66173,66174],{},"定义用户留存与用户活跃的标准",[52,66176,66177],{},"提升用户留存率",[52,66179,66180],{},"提升用户活跃度（用户行为、产品使用频次等）",[10548,66182,66183],{"id":66183},"转付费",[49,66185,66186,66189],{},[52,66187,66188],{},"通过一系列行为让未付费的活跃用户付费",[52,66190,66191],{},"通过机制让已付费的用户持续付费",[10548,66193,66194],{"id":66194},"注册转化",[13,66196,66197],{},"对于网站（产品）来说，运营和产品人员应该通过引导流程告诉用户：产品是什么、核心价值在哪里、提供怎样的服务等等。作为运营者，必须清醒地认识到，对于一个新用户，只有他\u002F她通过注册引导流程，到达产品使用界面，甚至完成第一次使用，才算得上是一个真正的用户。在这里有几个原则需要把握：",[49,66199,66200,66203,66206,66209,66212,66215],{},[52,66201,66202],{},"把用户当成傻子。应当简单明了、图文并茂地告诉用户，这是什么，用户能做什么，用户从哪里开始体验。",[52,66204,66205],{},"最大程度地展现核心功能、核心价值、核心玩法。",[52,66207,66208],{},"分阶段展示次要功能、次要价值、次要玩法，不要试图全部塞给用户。",[52,66210,66211],{},"根据数据统计调整文案，改进引导顺序等细节。",[52,66213,66214],{},"引导要有趣，不要让用户觉得枯躁；步骤要简单、流程要短，很少有人在进行数次点击还没看明白你要表达什么之后，依然有耐心。",[52,66216,66217],{},"引导要捆绑用户行为，用户的每一个反馈都可以告诉你，他究竟是否明白你在说什么。每一个反馈都可以提供一些激励，促使他继续下去，完成流程。",[7759,66219,66220],{"id":66220},"节流到底节什么流",[49,66222,66223,66226,66228],{},[52,66224,66225],{},"定义流失用户的衡量标准",[52,66227,66163],{},[52,66229,66230,66231],{},"预防用户流失\n",[49,66232,66233,66236,66239,66242],{},[52,66234,66235],{},"给用户想要的一切。",[52,66237,66238],{},"持续给他们想要的一切。",[52,66240,66241],{},"尝试给他们可能喜欢的一切。",[52,66243,66244],{},"避免让他们失去兴趣。",[23289,66246],{},[107,66248,66250],{"id":66249},"第六章-关于数据的一二三","第六章 关于数据的一二三",[7759,66252,66253],{"id":66253},"数据的定义",[13,66255,66256],{},"数据，其实就是与产品和运营相关的一些数值。这些数值，可以通过第三方工具或通过自行开发进行统计，这些数值是研究和分析的基础素材。不管什么样的产品，都有一些核心数据，它们是进行分析，得出结论的基础。",[13,66258,66259],{},[617,66260],{"alt":119,"src":31273},[7759,66262,66263],{"id":66263},"数据分析的方法",[49,66265,66266,66269,66272,66275,66278],{},[52,66267,66268],{},"确定数据的准确性",[52,66270,66271],{},"明确影响数据的因素",[52,66273,66274],{},"重视⻓期的数据监测",[52,66276,66277],{},"持客观的视角",[52,66279,66280],{},"注意剔除干扰项",[7759,66282,66284],{"id":66283},"数据分析的方法误区与数据说谎的手法","数据分析的方法、误区与数据说谎的手法",[13,66286,66287],{},"**核心观点：**运营数据分析的关键不在于数据，而在于分析。或者说，所有数据分析的关键都在于分析，而不在于数据本身。",[13,66289,66290],{},"**前提：**数据分析的能力是渐进的，对数据的敏感度是需要培养的。",[13,66292,66293],{},"**事实：**数据表达出的信息与多种因素相关，运营人员尝试学习运营数据分析之前，要尽量抛开预设立场，并且明白不同类别的数据在不同的阶段其重要性也是不同的。",[10548,66295,66297],{"id":66296},"uvunique-visitors独立访客数","UV（Unique Visitors）：独立访客数",[13,66299,66300],{},"独立访客数和独立IP是两个概念。独立IP要求访问者的IP地址各不相同，而独立访客数则未必。",[10548,66302,66304],{"id":66303},"pvpage-views面访问量","PV（Page Views）：⻚面访问量",[13,66306,66307],{},"每一个用户，每打开一个⻚面，就是一个PV。",[10548,66309,66311],{"id":66310},"rvrepeat-visitors重复访客","RV（Repeat Visitors）：重复访客",[13,66313,66314],{},"比如，昨天小明浏览了我的微信公众号，今天他又来了。小明就是一个RV。",[10548,66316,66318],{"id":66317},"tptime-on-page面停留时间","TP（Time On Page）：⻚面停留时间",[10548,66320,66322],{"id":66321},"traffic-sources流量来源渠道","Traffic Sources：流量来源渠道",[13,66324,66325],{},"比如，百度每天为你的网站贡献了100个UV；用户直接输入网址为你的网站贡献了10000个UV；微信每天为你的网站带来1000个UV。这些都是流量来源渠道。",[10548,66327,66328],{"id":66328},"数据使用的方法",[49,66330,66331,66334,66337,66340],{},[52,66332,66333],{},"掌握历史数据。",[52,66335,66336],{},"从历史数据中归纳规律。",[52,66338,66339],{},"通过规律反向进行数据预测。",[52,66341,66342],{},"学会对数据进行拆解。",[10548,66344,66345],{"id":66345},"运营数据分析的误区",[49,66347,66348,66351,66354,66357],{},[52,66349,66350],{},"不要用单一类型的数据去评价全局。",[52,66352,66353],{},"不要夸大偶然事件，认为带来必然结果。",[52,66355,66356],{},"避免用结论推导原因。",[52,66358,66359],{},"避免唯数据论。",[10548,66361,66362],{"id":66362},"运营数据说谎的手法",[49,66364,66365,66368,66371,66374],{},[52,66366,66367],{},"拉伸图表",[52,66369,66370],{},"修改坐标轴数据",[52,66372,66373],{},"故意选择有利的样本",[52,66375,66376],{},"样本规模差异",[10548,66378,66379],{"id":66379},"读懂数据背后的人",[49,66381,66382,66393,66401,66409],{},[52,66383,66384,66385],{},"抛弃预设立场\n",[49,66386,66387,66390],{},[52,66388,66389],{},"研究数据的波动和波动的节点，通过这一步去确立要研究哪些相关事件，研究用户行为还是系统事件。",[52,66391,66392],{},"这一步是定位，但不要定性。",[52,66394,66395,66396],{},"深挖用户行为与系统事件\n",[49,66397,66398],{},[52,66399,66400],{},"挖掘对应时间节点的相关事件，包括系统事件和用户行为，通过这一步找出可能造成影响的动作和事件。",[52,66402,66403,66404],{},"尝试换位思考\n",[49,66405,66406],{},[52,66407,66408],{},"把用户的真实反馈模拟出来，而不是夸大或削弱用户的反馈。必要的时候，可以找一些用户进行调研。",[52,66410,66411,66412],{},"整合关键数据\n",[49,66413,66414],{},[52,66415,66416,66417],{},"整合可能有用的核心数据，譬如历史数据、关联数据、竞品数据等，最后得出结论：\n",[49,66418,66419,66422,66425],{},[52,66420,66421],{},"造成数据变化的原因究竟是什么？",[52,66423,66424],{},"有什么办法可以改善或者促进数据的变化？",[52,66426,66427],{},"总结经验，类似情况再次发生时，应该进行何种处置与预案。",[23289,66429],{},[107,66431,66433],{"id":66432},"第七章-当运营遇到产品","第七章 当运营遇到产品",[13,66435,66436],{},"最早是没有“运营”与“产品”岗位划分的，大家都被叫作“策划”。后来，开始出现了单独的“产品经理”岗位与“运营专员”岗位的招聘，于是，产品和运营开始拥有各自的发展道路。",[13,66438,66439],{},"运营需要产品，产品也需要运营。运营需要产品提供场景、工具、环境等；产品需要运营提供用户、内容、活动等。所以，这是一对兄弟，也是一对对手，他们之间会出现优先级的争取、资源的争抢，更会出现双方的协同合作，共同实现目标。",[13,66441,66442,66443,66446],{},"**一切能够帮助产品进行推广、促进用户使用、提高用户认知的手段都是运营。**运营切入产品最好的节点是：",[22,66444,66445],{},"产品设计之前","：根据产品设计的发展目标（含目标用户、目标市场、阶段规划），进行早期的运营工具设计、运营目标分解、运营切入点选择、运营路线图制作、运营策略规划。",[10548,66448,66449],{"id":66449},"运营指标",[49,66451,66452,66455,66458,66461,66464,66467,66470],{},[52,66453,66454],{},"产品定位。包括运营切入点是什么，切入点面对的是哪些用户，他们的消费水平如何，兴趣点在哪里。",[52,66456,66457],{},"产品质量。包括功能指标、性能指标。",[52,66459,66460],{},"产品对运营的支持。要留住用户，既需要好的产品功能、产品体验，也需要得力的运营工具、活动设计。",[52,66462,66463],{},"市场推广。包括对哪些人开放，在哪些市场投放。",[52,66465,66466],{},"商务合作。包括联合运营是否可以事半功倍，商务合作是否要排他等。",[52,66468,66469],{},"财务预算。无论用户数还是流水、收入或者营收，都涉及单人用户的维护成本。财务预算要明确，能否支撑运营目标的达成。",[52,66471,66472],{},"商业模式。预算即成本。现有的商业模式能否支撑成本，是否需要引入投资，在什么节点引入。运营目标拆解之后，这些都会变得清晰。",[23289,66474],{},[107,66476,66478],{"id":66477},"第八章-用户习惯的养成","第八章 用户习惯的养成",[13,66480,66481],{},"“用户习惯”这个词，更多地出现在产品经理进行用户研究、交互设计的过程中。所谓的用户习惯，更多的是心理学层面上的研究，主要讨论在产品的交互设计中，怎样能够让用户不假思索的使用产品。",[13,66483,66484],{},[22,66485,66486],{},"运营层面的“用户习惯”，是帮助用户适应运营节奏并形成习惯、对运营活动形成期望。",[13,66488,66489],{},"用户习惯养成的第一个要点是持续，持续并不等于一个活动做一年，而是每到这个节点，你都有对应的运营策略。第二个要点是固化，固化不等于每到这个节点你都做同样的事情，而是每到这个节点你会让用户有相似的感知。",[10548,66491,66493],{"id":66492},"运营人员应该做什么","运营人员应该做什么？",[49,66495,66496,66499,66502,66505],{},[52,66497,66498],{},"将自己的运营计划从1天、1周，提高到1月、1年的周期。",[52,66500,66501],{},"对关键节点进行⻓期运营策略设计。",[52,66503,66504],{},"保持与产品人员、开发人员的沟通，善用资源。",[52,66506,66507],{},"养成观测数据的习惯。·保持对竞品的关注，做差异化的运营准备。",[10548,66509,66510],{"id":66510},"用户真的需要被教育吗",[49,66512,66513,66516],{},[52,66514,66515],{},"如果你的设计（无论是产品功能还是运营机制）符合用户的预期，那么用户是不需要被教育的。",[52,66517,66518],{},"如果你的设计不符合用户的预期，并且你打算通过这些设计差异与竞争对手保留竞争优势，那么用户是需要被教育的。",[13,66520,66521],{},"从这一点上说，用户是否需要教育，取决于你的设计。",[23289,66523],{},[107,66525,66527],{"id":66526},"第九章-移动端的运营","第九章 移动端的运营",[13,66529,66530],{},"如果说Web时代是聚合流量然后分发，App时代就是将零散流量聚合，看起来似乎差不多，只是入口变为出口，但实际操作手法却大相径庭。做Web，只要你能和入口保持良好的关系，拿得到推荐位、广告位，买得起关键词，合作起来⻛生水起，流量哗哗地进，当然，是否留得住用户又是另外一个话题。而做App，你除了要和入口（商店）保持良好的关系，拿到首发、推荐之外，还要有切实有效的办法从各个分散的入口导流。而且，这直接考验你留住流量的能力，因为App的流量一旦流失，挽回难度比Web要大得多，原因很简单，因为Web用户关闭的是浏览器，只要入口还在，就能想办法挽回用户，可App用户流失，删除的是应用，应用一旦不再出现在用户的手机屏幕上，想要挽回用户，那付出的代价就太高了。",[49,66532,66533,66536,66539,66542,66545,66548],{},[52,66534,66535],{},"从运营的角度来说，虽然渠道变了，介质变了，但是内容运营的基本方法并没有变。",[52,66537,66538],{},"移动端的内容要更专注、质量更高，同时不能局限于内容方面的运营。",[52,66540,66541],{},"由于社交功能的引入，好的内容被传播的可能性更高，传播后获客成本可能更低",[52,66543,66544],{},"坚持做原创内容。这个微信公众号的内容定位是互联网运营，并且坚持发布原创内容。",[52,66546,66547],{},"保持高频率更新。这个微信公众号的内容供应频率是每天更新一次。",[52,66549,66550],{},"读者留言必回并开放评论。鼓励用户留言，并对用户留言中有价值的问题进行总结并转化成内容；在获得了原创保护功能下的评论功能后，不阻拦用户的评论，并依然保证每条评论必回。",[7759,66552,66553],{"id":66553},"移动端运营的特点",[49,66555,66556,66565,66568,66571,66574],{},[52,66557,66558,66559],{},"第一，从分享的角度来说，移动端的分享更容易，通常只需三步操作",[49,66560,66561],{},[52,66562,66563],{},[617,66564],{"alt":119,"src":31760},[52,66566,66567],{},"第二，从互动的角度来说，移动端的互动更简单，往往只有一两个动作，但是用户点赞的成本不低。",[52,66569,66570],{},"第三，从信任的角度来说，移动端由于增加了社交功能，用户建立信任的时间缩短，但对种子用户的忠诚度要求更高。",[52,66572,66573],{},"第四，从忠诚的角度来说，只有用心的服务才能换来客户的忠诚，这一点并没有因为移动端的特点而有所不同。",[52,66575,66576],{},"第五，从营销的角度来说，如果不用心做内容，营销效果也会打折扣。",[23289,66578],{},[107,66580,50929],{"id":50929},[13,66582,66583],{},"一开始看这本书，主要是冲着”作为工作室的运营，但是连基本的运营体系都不甚了解，说出去难免让人笑话“这个目的看的。本来说是简单的做个文摘，因为距离书本出版已经过了好多年了，众所周知互联网时代是巨变的。可是看了几章之后发现技术的革新并不意味着思想的革新，很多现有的运营模式都和以前的一般相似。如果按第二章说的：运营是个筐，那么到我这就认为：运营是个圈——技术的发展只会变更最大化效益的运营手段，但是主流的运营模式和场景都一直在兜兜转转没有太大改变。",[13,66585,66586],{},"还有一点是最近大家都在找实习了，焦虑无形中就传播了出来，我看到第六章关于数据的描述才猛然发现——我一个学大数据的，居然不知道大数据中的数据究竟包含些什么？同时因为最近在实践数仓的项目，我都难以想象PB级的数据到底来源于哪里？又有些什么内容？反而是这本书给了我答案。",[13,66588,66589],{},"没必要为了未来就什么业而慌乱，Java后端也好、大数据也罢、哪怕是运营或者产品，开卷有益。这是我对这本书的高度肯定！",[13,66591,66592],{},"——Alexie-Z-Yevich 2023.2.12",{"title":119,"searchDepth":144,"depth":144,"links":66594},[66595,66596,66597,66598,66604,66609,66615,66620,66621,66622,66625],{"id":65256,"depth":132,"text":65257},{"id":65260,"depth":132,"text":65261},{"id":65320,"depth":132,"text":65321},{"id":65627,"depth":132,"text":65628,"children":66599},[66600,66601,66602,66603],{"id":65667,"depth":144,"text":65668},{"id":65727,"depth":144,"text":65727},{"id":65783,"depth":144,"text":65783},{"id":65830,"depth":144,"text":65830},{"id":65875,"depth":132,"text":65876,"children":66605},[66606,66607,66608],{"id":65943,"depth":144,"text":65943},{"id":65972,"depth":144,"text":65972},{"id":66015,"depth":144,"text":66015},{"id":66064,"depth":132,"text":66065,"children":66610},[66611,66612,66613,66614],{"id":66074,"depth":144,"text":66074},{"id":66097,"depth":144,"text":66097},{"id":66136,"depth":144,"text":66136},{"id":66220,"depth":144,"text":66220},{"id":66249,"depth":132,"text":66250,"children":66616},[66617,66618,66619],{"id":66253,"depth":144,"text":66253},{"id":66263,"depth":144,"text":66263},{"id":66283,"depth":144,"text":66284},{"id":66432,"depth":132,"text":66433},{"id":66477,"depth":132,"text":66478},{"id":66526,"depth":132,"text":66527,"children":66623},[66624],{"id":66553,"depth":144,"text":66553},{"id":50929,"depth":132,"text":50929},{},"TalkingAbout\u002F运营\u002F1_《从零开始做运营》 张亮\u002F作为运营的第一本运营书.md","\u002Fundergraduate\u002Fnote-7b665d20198c",{"title":65238,"description":119},"undergraduate\u002Fnote-7b665d20198c",[6380,14542,23333],"Q9IE9sw3xY1Rnxxe6viWhH2FxLEMU_mf6wwf8Rl3Asc",{"id":66634,"title":66635,"assetBase":239,"author":8,"body":66636,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":68068,"navigation":128,"originalPath":68069,"path":68070,"seo":68071,"source":23330,"stem":68072,"tags":68073,"weight":250,"__hash__":68074},"content\u002Fundergraduate\u002Fnote-7ed4f32ed08c.md","HQL初级练习",{"type":10,"value":66637,"toc":68064},[66638,66641,66649,66652,66656,66665,66669,66678,66682,66691,66695,66760,66764,66773,66777,66786,66790,66799,66803,66812,66816,66825,66829,66838,66842,66851,66855,66864,66868,66877,66881,66890,66894,66919,66923,66938,66942,66956,66960,66969,66973,66982,66986,66995,66999,67008,67012,67027,67031,67040,67044,67053,67057,67071,67075,67195,67199,67213,67217,67231,67235,67249,67253,67273,67276,67280,67320,67324,67344,67348,67398,67402,67446,67450,67470,67474,67509,67513,67538,67542,67572,67576,67621,67625,67665,67669,67684,67688,67758,67762,67806,67810,67863,67867,68062],[4517,66639,66635],{"id":66640},"hql初级练习",[72,66642,66643,66646],{},[13,66644,66645],{},"using() 使用的子列不能作为 group by 对象—— mysql 可以，hive 不行",[13,66647,66648],{},"mysql 中没有对 string 的操作，所以遇到 date_format() 等操作的时候，需要先使用 str_to_date() 将字符串转换为时间，否则无法被 ‘yyyy-MM-dd’ 识别",[107,66650,66651],{"id":66651},"基础查询训练",[10548,66653,66655],{"id":66654},"_1-查询姓名中带山的学生名单","1. 查询姓名中带“山”的学生名单",[114,66657,66659],{"className":33693,"code":66658,"language":33695,"meta":119,"style":119},"select * from student_info where stu_name like \"%山%\";\n",[17,66660,66661],{"__ignoreMap":119},[78,66662,66663],{"class":124,"line":125},[78,66664,66658],{},[10548,66666,66668],{"id":66667},"_2-查询姓王老师的个数","2. 查询姓“王”老师的个数",[114,66670,66672],{"className":33693,"code":66671,"language":33695,"meta":119,"style":119},"select count(*) from teacher_info where tea_name like '王%';\n",[17,66673,66674],{"__ignoreMap":119},[78,66675,66676],{"class":124,"line":125},[78,66677,66671],{},[10548,66679,66681],{"id":66680},"_3-检索课程编号为04且分数小于60的学生的分数信息结果按分数降序排列","3. 检索课程编号为“04”且分数小于60的学生的分数信息，结果按分数降序排列",[114,66683,66685],{"className":33693,"code":66684,"language":33695,"meta":119,"style":119},"select * from score_info where course_id='04' and score \u003C 60 order by score desc ;\n",[17,66686,66687],{"__ignoreMap":119},[78,66688,66689],{"class":124,"line":125},[78,66690,66684],{},[10548,66692,66694],{"id":66693},"_4-查询数学成绩不及格的学生信息和其对应的数学学科成绩按照学号升序排序","4. 查询数学成绩不及格的学生信息和其对应的数学学科成绩，按照学号升序排序",[114,66696,66698],{"className":33693,"code":66697,"language":33695,"meta":119,"style":119},"select\n    s.stu_id,\n    s.stu_name,\n    t1.score\nfrom student_info s\njoin (\n    select\n        *\n    from score_info\n    where course_id=(select course_id from course_info where course_name='数学') and score \u003C 60\n    ) t1 on s.stu_id = t1.stu_id\norder by s.stu_id;\n",[17,66699,66700,66705,66710,66715,66720,66725,66730,66735,66740,66745,66750,66755],{"__ignoreMap":119},[78,66701,66702],{"class":124,"line":125},[78,66703,66704],{},"select\n",[78,66706,66707],{"class":124,"line":132},[78,66708,66709],{},"    s.stu_id,\n",[78,66711,66712],{"class":124,"line":138},[78,66713,66714],{},"    s.stu_name,\n",[78,66716,66717],{"class":124,"line":144},[78,66718,66719],{},"    t1.score\n",[78,66721,66722],{"class":124,"line":150},[78,66723,66724],{},"from student_info s\n",[78,66726,66727],{"class":124,"line":156},[78,66728,66729],{},"join (\n",[78,66731,66732],{"class":124,"line":162},[78,66733,66734],{},"    select\n",[78,66736,66737],{"class":124,"line":168},[78,66738,66739],{},"        *\n",[78,66741,66742],{"class":124,"line":174},[78,66743,66744],{},"    from score_info\n",[78,66746,66747],{"class":124,"line":180},[78,66748,66749],{},"    where course_id=(select course_id from course_info where course_name='数学') and score \u003C 60\n",[78,66751,66752],{"class":124,"line":186},[78,66753,66754],{},"    ) t1 on s.stu_id = t1.stu_id\n",[78,66756,66757],{"class":124,"line":192},[78,66758,66759],{},"order by s.stu_id;\n",[10548,66761,66763],{"id":66762},"_5-查询编号为02的课程的总成绩","5. 查询编号为“02”的课程的总成绩",[114,66765,66767],{"className":33693,"code":66766,"language":33695,"meta":119,"style":119},"select sum(score) from score_info where course_id = '02';\n",[17,66768,66769],{"__ignoreMap":119},[78,66770,66771],{"class":124,"line":125},[78,66772,66766],{},[10548,66774,66776],{"id":66775},"_6-查询参加考试的学生个数","6. 查询参加考试的学生个数",[114,66778,66780],{"className":33693,"code":66779,"language":33695,"meta":119,"style":119},"select count(distinct stu_id) from score_info;\n",[17,66781,66782],{"__ignoreMap":119},[78,66783,66784],{"class":124,"line":125},[78,66785,66779],{},[10548,66787,66789],{"id":66788},"_7-查询各科成绩最高和最低的分以如下的形式显示课程号最高分最低分","7. 查询各科成绩最高和最低的分，以如下的形式显示：课程号、最高分、最低分",[114,66791,66793],{"className":33693,"code":66792,"language":33695,"meta":119,"style":119},"select course_id, max(score) as maximum, min(score) as minimum from score_info group by course_id;\n",[17,66794,66795],{"__ignoreMap":119},[78,66796,66797],{"class":124,"line":125},[78,66798,66792],{},[10548,66800,66802],{"id":66801},"_8-查询每门课程有多少学生参加了考试有考试成绩","8. 查询每门课程有多少学生参加了考试（有考试成绩）",[114,66804,66806],{"className":33693,"code":66805,"language":33695,"meta":119,"style":119},"select course_id, count(distinct stu_id) from score_info group by course_id;\n",[17,66807,66808],{"__ignoreMap":119},[78,66809,66810],{"class":124,"line":125},[78,66811,66805],{},[10548,66813,66815],{"id":66814},"_9-查询男生女生人数","9. 查询男生、女生人数",[114,66817,66819],{"className":33693,"code":66818,"language":33695,"meta":119,"style":119},"select sex, count(sex) from student_info group by sex;\n",[17,66820,66821],{"__ignoreMap":119},[78,66822,66823],{"class":124,"line":125},[78,66824,66818],{},[10548,66826,66828],{"id":66827},"_10-查询平均成绩大于60分的学生的学号和平均成绩","10. 查询平均成绩大于60分的学生的学号和平均成绩",[114,66830,66832],{"className":33693,"code":66831,"language":33695,"meta":119,"style":119},"select stu_id, avg(score) from score_info group by stu_id having avg(score) > 60;\n",[17,66833,66834],{"__ignoreMap":119},[78,66835,66836],{"class":124,"line":125},[78,66837,66831],{},[10548,66839,66841],{"id":66840},"_11-查询至少考了四门课程的学生学号","11. 查询至少考了四门课程的学生学号",[114,66843,66845],{"className":33693,"code":66844,"language":33695,"meta":119,"style":119},"select stu_id from score_info group by stu_id having count(score);\n",[17,66846,66847],{"__ignoreMap":119},[78,66848,66849],{"class":124,"line":125},[78,66850,66844],{},[10548,66852,66854],{"id":66853},"_12-查询每门课程的平均成绩结果按平均成绩升序排序平均成绩相同时按课程号降序排列","12. 查询每门课程的平均成绩，结果按平均成绩升序排序，平均成绩相同时，按课程号降序排列",[114,66856,66858],{"className":33693,"code":66857,"language":33695,"meta":119,"style":119},"select course_id, avg(score) from score_info group by course_id order by avg(score) asc, course_id desc;\n",[17,66859,66860],{"__ignoreMap":119},[78,66861,66862],{"class":124,"line":125},[78,66863,66857],{},[10548,66865,66867],{"id":66866},"_13-统计参加考试人数大于等于15的学科","13. 统计参加考试人数大于等于15的学科",[114,66869,66871],{"className":33693,"code":66870,"language":33695,"meta":119,"style":119},"select course_id from score_info group by course_id having count(distinct stu_id) >= 15;\n",[17,66872,66873],{"__ignoreMap":119},[78,66874,66875],{"class":124,"line":125},[78,66876,66870],{},[10548,66878,66880],{"id":66879},"_14-查询学生的总成绩并按照总成绩降序排序","14. 查询学生的总成绩并按照总成绩降序排序",[114,66882,66884],{"className":33693,"code":66883,"language":33695,"meta":119,"style":119},"select stu_id, sum(score) from score_info group by stu_id order by sum(score) desc;\n",[17,66885,66886],{"__ignoreMap":119},[78,66887,66888],{"class":124,"line":125},[78,66889,66883],{},[10548,66891,66893],{"id":66892},"_15-查询一共参加三门课程且其中一门为语文课程的学生的id和姓名","15. 查询一共参加三门课程且其中一门为语文课程的学生的id和姓名",[114,66895,66897],{"className":33693,"code":66896,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info left join score_info USING (stu_id)\nwhere stu_id in\n(select stu_id from course_info LEFT JOIN score_info using(course_id) where course_name = \"语文\")\nGROUP BY stu_id HAVING count(*)  = 3;\n",[17,66898,66899,66904,66909,66914],{"__ignoreMap":119},[78,66900,66901],{"class":124,"line":125},[78,66902,66903],{},"select stu_id, stu_name from student_info left join score_info USING (stu_id)\n",[78,66905,66906],{"class":124,"line":132},[78,66907,66908],{},"where stu_id in\n",[78,66910,66911],{"class":124,"line":138},[78,66912,66913],{},"(select stu_id from course_info LEFT JOIN score_info using(course_id) where course_name = \"语文\")\n",[78,66915,66916],{"class":124,"line":144},[78,66917,66918],{},"GROUP BY stu_id HAVING count(*)  = 3;\n",[10548,66920,66922],{"id":66921},"_16-查询没有学全所有课的学生的学号姓名","16. 查询没有学全所有课的学生的学号、姓名",[114,66924,66926],{"className":33693,"code":66925,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info where stu_id in\n(select stu_id from score_info group by stu_id having count(*) \u003C (select count(*) from course_info));\n",[17,66927,66928,66933],{"__ignoreMap":119},[78,66929,66930],{"class":124,"line":125},[78,66931,66932],{},"select stu_id, stu_name from student_info where stu_id in\n",[78,66934,66935],{"class":124,"line":132},[78,66936,66937],{},"(select stu_id from score_info group by stu_id having count(*) \u003C (select count(*) from course_info));\n",[10548,66939,66941],{"id":66940},"_17-查询出只选修了三门课程的全部学生的学号和姓名","17. 查询出只选修了三门课程的全部学生的学号和姓名",[114,66943,66945],{"className":33693,"code":66944,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info where stu_id in\n(select stu_id from score_info group by stu_id having count(*) = 3);\n",[17,66946,66947,66951],{"__ignoreMap":119},[78,66948,66949],{"class":124,"line":125},[78,66950,66932],{},[78,66952,66953],{"class":124,"line":132},[78,66954,66955],{},"(select stu_id from score_info group by stu_id having count(*) = 3);\n",[10548,66957,66959],{"id":66958},"_18-查询所有学生的学号姓名选课数总成绩","18. 查询所有学生的学号、姓名、选课数、总成绩",[114,66961,66963],{"className":33693,"code":66962,"language":33695,"meta":119,"style":119},"select stu_id, stu_name, count(score), sum(score) from student_info left join score_info using (stu_id) group by stu_id;\n",[17,66964,66965],{"__ignoreMap":119},[78,66966,66967],{"class":124,"line":125},[78,66968,66962],{},[10548,66970,66972],{"id":66971},"_19-查询平均成绩大于85的所有学生的学号姓名和平均成绩","19. 查询平均成绩大于85的所有学生的学号、姓名和平均成绩",[114,66974,66976],{"className":33693,"code":66975,"language":33695,"meta":119,"style":119},"select stu_id, stu_name, avg(score) from student_info left join score_info using (stu_id) group by stu_id having avg(score) > 85;\n",[17,66977,66978],{"__ignoreMap":119},[78,66979,66980],{"class":124,"line":125},[78,66981,66975],{},[10548,66983,66985],{"id":66984},"_20-查询学生的选课情况学号姓名课程号课程名称","20. 查询学生的选课情况：学号，姓名，课程号，课程名称",[114,66987,66989],{"className":33693,"code":66988,"language":33695,"meta":119,"style":119},"select stu_id, stu_name, course_id, course_name from student_info left join score_info using (stu_id) left join course_info using (course_id);\n",[17,66990,66991],{"__ignoreMap":119},[78,66992,66993],{"class":124,"line":125},[78,66994,66988],{},[10548,66996,66998],{"id":66997},"_21-课程编号为01且课程分数小于60按分数降序排列的学生信息","21. 课程编号为\"01\"且课程分数小于60，按分数降序排列的学生信息",[114,67000,67002],{"className":33693,"code":67001,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info left join score_info using (stu_id) where course_id = '01' and score \u003C 60;\n",[17,67003,67004],{"__ignoreMap":119},[78,67005,67006],{"class":124,"line":125},[78,67007,67001],{},[10548,67009,67011],{"id":67010},"_22-查询所有课程成绩在70分以上的学生的姓名课程名称和分数按分数升序排列","22. 查询所有课程成绩在70分以上的学生的姓名、课程名称和分数，按分数升序排列",[114,67013,67015],{"className":33693,"code":67014,"language":33695,"meta":119,"style":119},"select stu_name, course_name, score from score_info left join student_info using (stu_id) left join course_info using (course_id) where stu_id in\n    (select stu_id from score_info where stu_id not in (select stu_id from score_info where score \u003C= 70));\n",[17,67016,67017,67022],{"__ignoreMap":119},[78,67018,67019],{"class":124,"line":125},[78,67020,67021],{},"select stu_name, course_name, score from score_info left join student_info using (stu_id) left join course_info using (course_id) where stu_id in\n",[78,67023,67024],{"class":124,"line":132},[78,67025,67026],{},"    (select stu_id from score_info where stu_id not in (select stu_id from score_info where score \u003C= 70));\n",[10548,67028,67030],{"id":67029},"_23-查询该学生不同课程的成绩相同的学生编号课程编号学生成绩","23. 查询该学生不同课程的成绩相同的学生编号、课程编号、学生成绩",[114,67032,67034],{"className":33693,"code":67033,"language":33695,"meta":119,"style":119},"select si1.stu_id, si1.course_id, si1.score from score_info si1 join score_info si2 on si1.stu_id = si2.stu_id and si1.score = si2.score and si1.course_id \u003C> si2.course_id;\n",[17,67035,67036],{"__ignoreMap":119},[78,67037,67038],{"class":124,"line":125},[78,67039,67033],{},[10548,67041,67043],{"id":67042},"_24-查询课程编号为01的课程比02的课程成绩高的所有学生的学号","24. 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号",[114,67045,67047],{"className":33693,"code":67046,"language":33695,"meta":119,"style":119},"select s1.stu_id from score_info s1 join score_info s2 on s1.stu_id = s2.stu_id and s1.score > s2.score where s1.course_id = '01' and s2.course_id = 02;\n",[17,67048,67049],{"__ignoreMap":119},[78,67050,67051],{"class":124,"line":125},[78,67052,67046],{},[10548,67054,67056],{"id":67055},"_25-查询学过编号为01的课程并且也学过编号为02的课程的学生的学号姓名","25. 查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名",[114,67058,67060],{"className":33693,"code":67059,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info where stu_id in\n(select s1.stu_id from score_info s1 join score_info s2 on s1.stu_id = s2.stu_id where s1.course_id = '01' and s2.course_id = 02);\n",[17,67061,67062,67066],{"__ignoreMap":119},[78,67063,67064],{"class":124,"line":125},[78,67065,66932],{},[78,67067,67068],{"class":124,"line":132},[78,67069,67070],{},"(select s1.stu_id from score_info s1 join score_info s2 on s1.stu_id = s2.stu_id where s1.course_id = '01' and s2.course_id = 02);\n",[10548,67072,67074],{"id":67073},"_26-查询学过李体音老师所教的所有课的同学的学号姓名","26. 查询学过“李体音”老师所教的所有课的同学的学号、姓名",[114,67076,67078],{"className":33693,"code":67077,"language":33695,"meta":119,"style":119},"SELECT\n   stu_id,\n   stu_name\nFROM\n   student_info\nWHERE\n   stu_id IN (\n   SELECT\n      stu_id\n   FROM\n      (\n      SELECT\n         stu_id,\n         count( course_id ) AS ct\n      FROM\n         score_info\n      WHERE\n         course_id IN ( SELECT course_id FROM course_info LEFT JOIN teacher_info USING ( tea_id ) WHERE tea_name = \"李体音\" )\n      GROUP BY\n         stu_id\n      ) t1\n   JOIN ( SELECT count( course_id ) AS ct FROM course_info LEFT JOIN teacher_info USING ( tea_id ) WHERE tea_name = \"李体音\" ) t2 ON t1.ct = t2.ct\n   );\n",[17,67079,67080,67085,67090,67095,67100,67105,67110,67115,67120,67125,67130,67135,67140,67145,67150,67155,67160,67165,67170,67175,67180,67185,67190],{"__ignoreMap":119},[78,67081,67082],{"class":124,"line":125},[78,67083,67084],{},"SELECT\n",[78,67086,67087],{"class":124,"line":132},[78,67088,67089],{},"   stu_id,\n",[78,67091,67092],{"class":124,"line":138},[78,67093,67094],{},"   stu_name\n",[78,67096,67097],{"class":124,"line":144},[78,67098,67099],{},"FROM\n",[78,67101,67102],{"class":124,"line":150},[78,67103,67104],{},"   student_info\n",[78,67106,67107],{"class":124,"line":156},[78,67108,67109],{},"WHERE\n",[78,67111,67112],{"class":124,"line":162},[78,67113,67114],{},"   stu_id IN (\n",[78,67116,67117],{"class":124,"line":168},[78,67118,67119],{},"   SELECT\n",[78,67121,67122],{"class":124,"line":174},[78,67123,67124],{},"      stu_id\n",[78,67126,67127],{"class":124,"line":180},[78,67128,67129],{},"   FROM\n",[78,67131,67132],{"class":124,"line":186},[78,67133,67134],{},"      (\n",[78,67136,67137],{"class":124,"line":192},[78,67138,67139],{},"      SELECT\n",[78,67141,67142],{"class":124,"line":198},[78,67143,67144],{},"         stu_id,\n",[78,67146,67147],{"class":124,"line":204},[78,67148,67149],{},"         count( course_id ) AS ct\n",[78,67151,67152],{"class":124,"line":210},[78,67153,67154],{},"      FROM\n",[78,67156,67157],{"class":124,"line":216},[78,67158,67159],{},"         score_info\n",[78,67161,67162],{"class":124,"line":222},[78,67163,67164],{},"      WHERE\n",[78,67166,67167],{"class":124,"line":421},[78,67168,67169],{},"         course_id IN ( SELECT course_id FROM course_info LEFT JOIN teacher_info USING ( tea_id ) WHERE tea_name = \"李体音\" )\n",[78,67171,67172],{"class":124,"line":427},[78,67173,67174],{},"      GROUP BY\n",[78,67176,67177],{"class":124,"line":433},[78,67178,67179],{},"         stu_id\n",[78,67181,67182],{"class":124,"line":2443},[78,67183,67184],{},"      ) t1\n",[78,67186,67187],{"class":124,"line":2448},[78,67188,67189],{},"   JOIN ( SELECT count( course_id ) AS ct FROM course_info LEFT JOIN teacher_info USING ( tea_id ) WHERE tea_name = \"李体音\" ) t2 ON t1.ct = t2.ct\n",[78,67191,67192],{"class":124,"line":2454},[78,67193,67194],{},"   );\n",[10548,67196,67198],{"id":67197},"_27-查询学过李体音老师所讲授的任意一门课程的学生的学号姓名","27. 查询学过“李体音”老师所讲授的任意一门课程的学生的学号、姓名",[114,67200,67202],{"className":33693,"code":67201,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info where stu_id in\n(select stu_id from score_info left join course_info using (course_id) left join teacher_info using (tea_id) where tea_name = \"李体音\");\n",[17,67203,67204,67208],{"__ignoreMap":119},[78,67205,67206],{"class":124,"line":125},[78,67207,66932],{},[78,67209,67210],{"class":124,"line":132},[78,67211,67212],{},"(select stu_id from score_info left join course_info using (course_id) left join teacher_info using (tea_id) where tea_name = \"李体音\");\n",[10548,67214,67216],{"id":67215},"_28-查询没学过李体音老师讲授的任一门课程的学生姓名","28. 查询没学过\"李体音\"老师讲授的任一门课程的学生姓名",[114,67218,67220],{"className":33693,"code":67219,"language":33695,"meta":119,"style":119},"select stu_name from student_info where stu_id not in\n(select stu_id from score_info left join course_info using (course_id) left join teacher_info using (tea_id) where tea_name = \"李体音\");\n",[17,67221,67222,67227],{"__ignoreMap":119},[78,67223,67224],{"class":124,"line":125},[78,67225,67226],{},"select stu_name from student_info where stu_id not in\n",[78,67228,67229],{"class":124,"line":132},[78,67230,67212],{},[10548,67232,67234],{"id":67233},"_29-查询至少有一门课与学号为001的学生所学课程相同的学生的学号和姓名","29. 查询至少有一门课与学号为“001”的学生所学课程相同的学生的学号和姓名",[114,67236,67238],{"className":33693,"code":67237,"language":33695,"meta":119,"style":119},"select stu_id, stu_name from student_info where stu_id in\n(select stu_id from score_info where course_id in (select course_id from score_info where score_info.stu_id = '001'));\n",[17,67239,67240,67244],{"__ignoreMap":119},[78,67241,67242],{"class":124,"line":125},[78,67243,66932],{},[78,67245,67246],{"class":124,"line":132},[78,67247,67248],{},"(select stu_id from score_info where course_id in (select course_id from score_info where score_info.stu_id = '001'));\n",[10548,67250,67252],{"id":67251},"_30-按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩","30. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩",[114,67254,67256],{"className":33693,"code":67255,"language":33695,"meta":119,"style":119},"select score, avg from score_info t1 left join\n    (select stu_id, avg(score) as avg from score_info group by stu_id) t2\non t1.stu_id = t2.stu_id order by avg desc;\n",[17,67257,67258,67263,67268],{"__ignoreMap":119},[78,67259,67260],{"class":124,"line":125},[78,67261,67262],{},"select score, avg from score_info t1 left join\n",[78,67264,67265],{"class":124,"line":132},[78,67266,67267],{},"    (select stu_id, avg(score) as avg from score_info group by stu_id) t2\n",[78,67269,67270],{"class":124,"line":138},[78,67271,67272],{},"on t1.stu_id = t2.stu_id order by avg desc;\n",[107,67274,67275],{"id":67275},"初级查询训练",[10548,67277,67279],{"id":67278},"_1-从订单明细表order_detail中筛选出2021年总销量小于100的商品及其销量假设今天的日期是2022-01-10不考虑上架时间小于一个月的商品","1. 从订单明细表（order_detail）中筛选出2021年总销量小于100的商品及其销量，假设今天的日期是2022-01-10，不考虑上架时间小于一个月的商品",[114,67281,67283],{"className":33693,"code":67282,"language":33695,"meta":119,"style":119},"SELECT sku_info.sku_id, sku_info.name, SUM(order_detail.sku_num) AS order_num\nFROM order_detail\nLEFT JOIN sku_info ON order_detail.sku_id = sku_info.sku_id\nWHERE year(order_detail.create_date) = 2021\nAND datediff(order_detail.create_date, \"2021-12-10\") \u003C= 0\nGROUP BY sku_info.sku_id, sku_info.name\nHAVING order_num \u003C 100;\n",[17,67284,67285,67290,67295,67300,67305,67310,67315],{"__ignoreMap":119},[78,67286,67287],{"class":124,"line":125},[78,67288,67289],{},"SELECT sku_info.sku_id, sku_info.name, SUM(order_detail.sku_num) AS order_num\n",[78,67291,67292],{"class":124,"line":132},[78,67293,67294],{},"FROM order_detail\n",[78,67296,67297],{"class":124,"line":138},[78,67298,67299],{},"LEFT JOIN sku_info ON order_detail.sku_id = sku_info.sku_id\n",[78,67301,67302],{"class":124,"line":144},[78,67303,67304],{},"WHERE year(order_detail.create_date) = 2021\n",[78,67306,67307],{"class":124,"line":150},[78,67308,67309],{},"AND datediff(order_detail.create_date, \"2021-12-10\") \u003C= 0\n",[78,67311,67312],{"class":124,"line":156},[78,67313,67314],{},"GROUP BY sku_info.sku_id, sku_info.name\n",[78,67316,67317],{"class":124,"line":162},[78,67318,67319],{},"HAVING order_num \u003C 100;\n",[10548,67321,67323],{"id":67322},"_2-从用户登录明细表user_login_detail中查询每天的新增用户数若一个用户在某天登录了且在这一天之前没登录过则认为该用户为这一天的新增用户","2. 从用户登录明细表（user_login_detail）中查询每天的新增用户数。若一个用户在某天登录了，且在这一天之前没登录过，则认为该用户为这一天的新增用户。",[114,67325,67327],{"className":33693,"code":67326,"language":33695,"meta":119,"style":119},"select login_date_first, count(*) as user_count from (\n select user_id, min(date_format(login_ts, 'yyyy-MM-dd')) as login_date_first from user_login_detail group by user_id ) t1\n                                               group by login_date_first;\n",[17,67328,67329,67334,67339],{"__ignoreMap":119},[78,67330,67331],{"class":124,"line":125},[78,67332,67333],{},"select login_date_first, count(*) as user_count from (\n",[78,67335,67336],{"class":124,"line":132},[78,67337,67338],{}," select user_id, min(date_format(login_ts, 'yyyy-MM-dd')) as login_date_first from user_login_detail group by user_id ) t1\n",[78,67340,67341],{"class":124,"line":138},[78,67342,67343],{},"                                               group by login_date_first;\n",[10548,67345,67347],{"id":67346},"_3-从用户登录明细表user_login_detail和订单信息表order_info中查询每个用户的注册日期首次登录日期总登录次数以及2021年的登录次数订单数和订单总额","3. 从用户登录明细表（user_login_detail）和订单信息表（order_info）中查询每个用户的注册日期（首次登录日期）、总登录次数，以及2021年的登录次数、订单数和订单总额。",[114,67349,67351],{"className":33693,"code":67350,"language":33695,"meta":119,"style":119},"select t1.user_id, register_date, total_login_count, login_count_2021, nvl(order_count_2021, 0) as order_count_2021,\n       cast (nvl( order_amount_2021, 0.00) as decimal(16, 2)) as order_amount_2021 from (\n    select user_id, min(date_format(login_ts, 'yyyy-MM-dd')) as register_date,\n           count(login_ts) as total_login_count, count(year(login_ts) = '2021') as login_count_2021\n    from user_login_detail group by user_id ) t1\n    left join (\n        select user_id, count(*) as order_count_2021, sum(total_amount) as order_amount_2021\n        from order_info where year(create_date) = '2021' group by user_id\n) t2 on t1.user_id = t2.user_id order by user_id;\n",[17,67352,67353,67358,67363,67368,67373,67378,67383,67388,67393],{"__ignoreMap":119},[78,67354,67355],{"class":124,"line":125},[78,67356,67357],{},"select t1.user_id, register_date, total_login_count, login_count_2021, nvl(order_count_2021, 0) as order_count_2021,\n",[78,67359,67360],{"class":124,"line":132},[78,67361,67362],{},"       cast (nvl( order_amount_2021, 0.00) as decimal(16, 2)) as order_amount_2021 from (\n",[78,67364,67365],{"class":124,"line":138},[78,67366,67367],{},"    select user_id, min(date_format(login_ts, 'yyyy-MM-dd')) as register_date,\n",[78,67369,67370],{"class":124,"line":144},[78,67371,67372],{},"           count(login_ts) as total_login_count, count(year(login_ts) = '2021') as login_count_2021\n",[78,67374,67375],{"class":124,"line":150},[78,67376,67377],{},"    from user_login_detail group by user_id ) t1\n",[78,67379,67380],{"class":124,"line":156},[78,67381,67382],{},"    left join (\n",[78,67384,67385],{"class":124,"line":162},[78,67386,67387],{},"        select user_id, count(*) as order_count_2021, sum(total_amount) as order_amount_2021\n",[78,67389,67390],{"class":124,"line":168},[78,67391,67392],{},"        from order_info where year(create_date) = '2021' group by user_id\n",[78,67394,67395],{"class":124,"line":174},[78,67396,67397],{},") t2 on t1.user_id = t2.user_id order by user_id;\n",[10548,67399,67401],{"id":67400},"_4-请向所有用户推荐其朋友收藏但是自己未收藏的商品从好友关系表friendship_info和收藏表favor_info中查询出应向哪位用户推荐哪些商品","4. 请向所有用户推荐其朋友收藏但是自己未收藏的商品，从好友关系表（friendship_info）和收藏表（favor_info）中查询出应向哪位用户推荐哪些商品。",[114,67403,67405],{"className":33693,"code":67404,"language":33695,"meta":119,"style":119},"select user_id, sku_id from (select distinct t1.user1_id as user_id, sku_id\n                             from friendship_info t1\n                                      left join favor_info t2 on t1.user2_id = t2.user_id where sku_id is not null) t1\nwhere user_id except (\n    select distinct t1.user1_id as user_id, sku_id\n                             from friendship_info t1\n                                      left join favor_info t2 on t1.user1_id = t2.user_id\n    ) order by user_id;\n",[17,67406,67407,67412,67417,67422,67427,67432,67436,67441],{"__ignoreMap":119},[78,67408,67409],{"class":124,"line":125},[78,67410,67411],{},"select user_id, sku_id from (select distinct t1.user1_id as user_id, sku_id\n",[78,67413,67414],{"class":124,"line":132},[78,67415,67416],{},"                             from friendship_info t1\n",[78,67418,67419],{"class":124,"line":138},[78,67420,67421],{},"                                      left join favor_info t2 on t1.user2_id = t2.user_id where sku_id is not null) t1\n",[78,67423,67424],{"class":124,"line":144},[78,67425,67426],{},"where user_id except (\n",[78,67428,67429],{"class":124,"line":150},[78,67430,67431],{},"    select distinct t1.user1_id as user_id, sku_id\n",[78,67433,67434],{"class":124,"line":156},[78,67435,67416],{},[78,67437,67438],{"class":124,"line":162},[78,67439,67440],{},"                                      left join favor_info t2 on t1.user1_id = t2.user_id\n",[78,67442,67443],{"class":124,"line":168},[78,67444,67445],{},"    ) order by user_id;\n",[10548,67447,67449],{"id":67448},"_5-从订单信息表order_info和用户信息表user_info中分别统计每天男性和女性用户的订单总金额如果当天男性或者女性没有购物则统计结果为0","5. 从订单信息表（order_info）和用户信息表（user_info）中，分别统计每天男性和女性用户的订单总金额，如果当天男性或者女性没有购物，则统计结果为0。",[114,67451,67453],{"className":33693,"code":67452,"language":33695,"meta":119,"style":119},"select create_date, cast(sum(male) as decimal(16, 2)) as total_amount_male, cast(sum(female) as decimal(16, 2)) as total_amount_female from (\nselect create_date, if(gender = '男', total_amount, 0) male, if(gender = '女', total_amount, 0) female from order_info t1 left join user_info t2\non t1.user_id = t2.user_id ) t1 group by create_date;\n",[17,67454,67455,67460,67465],{"__ignoreMap":119},[78,67456,67457],{"class":124,"line":125},[78,67458,67459],{},"select create_date, cast(sum(male) as decimal(16, 2)) as total_amount_male, cast(sum(female) as decimal(16, 2)) as total_amount_female from (\n",[78,67461,67462],{"class":124,"line":132},[78,67463,67464],{},"select create_date, if(gender = '男', total_amount, 0) male, if(gender = '女', total_amount, 0) female from order_info t1 left join user_info t2\n",[78,67466,67467],{"class":124,"line":138},[78,67468,67469],{},"on t1.user_id = t2.user_id ) t1 group by create_date;\n",[10548,67471,67473],{"id":67472},"_6-从订单明细表order_detail中查询出所有购买过商品1和商品2但是没有购买过商品3的用户","6. 从订单明细表（order_detail）中查询出所有购买过商品1和商品2，但是没有购买过商品3的用户。",[114,67475,67477],{"className":33693,"code":67476,"language":33695,"meta":119,"style":119},"select user_id from (select t3.user_id, collect_set(t1.sku_id) as sku\n                     from order_detail t1\n                              left join order_info t2 on t1.order_id = t2.order_id\n                              left join user_info t3 on t2.user_id = t3.user_id\n                     group by t3.user_id) t1\nwhere array_contains(sku, '1') = true and array_contains(sku, '2') = true and array_contains(sku, '3') = false;\n",[17,67478,67479,67484,67489,67494,67499,67504],{"__ignoreMap":119},[78,67480,67481],{"class":124,"line":125},[78,67482,67483],{},"select user_id from (select t3.user_id, collect_set(t1.sku_id) as sku\n",[78,67485,67486],{"class":124,"line":132},[78,67487,67488],{},"                     from order_detail t1\n",[78,67490,67491],{"class":124,"line":138},[78,67492,67493],{},"                              left join order_info t2 on t1.order_id = t2.order_id\n",[78,67495,67496],{"class":124,"line":144},[78,67497,67498],{},"                              left join user_info t3 on t2.user_id = t3.user_id\n",[78,67500,67501],{"class":124,"line":150},[78,67502,67503],{},"                     group by t3.user_id) t1\n",[78,67505,67506],{"class":124,"line":156},[78,67507,67508],{},"where array_contains(sku, '1') = true and array_contains(sku, '2') = true and array_contains(sku, '3') = false;\n",[10548,67510,67512],{"id":67511},"_7-从订单明细表order_detail中统计每天商品1和商品2销量件数的差值商品1销量-商品2销量","7. 从订单明细表（order_detail）中统计每天商品1和商品2销量（件数）的差值（商品1销量-商品2销量）",[114,67514,67516],{"className":33693,"code":67515,"language":33695,"meta":119,"style":119},"select create_date,  sum(a) - sum(b) as diff from (select create_date,\n                                                if(sku_id = '1', sku_num, 0) a,\n                                                if(sku_id = '2', sku_num, 0) b from order_detail) t1\ngroup by create_date;\n",[17,67517,67518,67523,67528,67533],{"__ignoreMap":119},[78,67519,67520],{"class":124,"line":125},[78,67521,67522],{},"select create_date,  sum(a) - sum(b) as diff from (select create_date,\n",[78,67524,67525],{"class":124,"line":132},[78,67526,67527],{},"                                                if(sku_id = '1', sku_num, 0) a,\n",[78,67529,67530],{"class":124,"line":138},[78,67531,67532],{},"                                                if(sku_id = '2', sku_num, 0) b from order_detail) t1\n",[78,67534,67535],{"class":124,"line":144},[78,67536,67537],{},"group by create_date;\n",[10548,67539,67541],{"id":67540},"_8-通过订单详情表order_detail的数据根据销售件数对商品进行分类销售件数0-5000为冷门商品5001-19999为一般商品20000以上为热门商品统计不同类别商品的数量","8. 通过订单详情表（order_detail）的数据，根据销售件数对商品进行分类，销售件数0-5000为冷门商品，5001-19999为一般商品，20000以上为热门商品，统计不同类别商品的数量",[114,67543,67545],{"className":33693,"code":67544,"language":33695,"meta":119,"style":119},"select category, count(*) as cn from (\nselect case when sum(sku_num) >= 0 and sum(sku_num) \u003C= 5000 then '冷门商品'\n    when sum(sku_num) >= 5001 and sum(sku_num) \u003C= 19999 then '一般商品'\n    when sum(sku_num) >= 20000 then '热门商品' end category from order_detail group by sku_id\n      ) t1 group by category;\n",[17,67546,67547,67552,67557,67562,67567],{"__ignoreMap":119},[78,67548,67549],{"class":124,"line":125},[78,67550,67551],{},"select category, count(*) as cn from (\n",[78,67553,67554],{"class":124,"line":132},[78,67555,67556],{},"select case when sum(sku_num) >= 0 and sum(sku_num) \u003C= 5000 then '冷门商品'\n",[78,67558,67559],{"class":124,"line":138},[78,67560,67561],{},"    when sum(sku_num) >= 5001 and sum(sku_num) \u003C= 19999 then '一般商品'\n",[78,67563,67564],{"class":124,"line":144},[78,67565,67566],{},"    when sum(sku_num) >= 20000 then '热门商品' end category from order_detail group by sku_id\n",[78,67568,67569],{"class":124,"line":150},[78,67570,67571],{},"      ) t1 group by category;\n",[10548,67573,67575],{"id":67574},"_9-从用户登录明细表user_login_detail中统计有新增用户的日期的新增用户数若某日未新增用户则不出现在统计结果中并统计这些新增用户的一日留存率用户首次登录为当天新增次日也登录则为一日留存一日留存用户占新增用户数的比率为一日留存率","9. 从用户登录明细表（user_login_detail）中统计有新增用户的日期的新增用户数（若某日未新增用户，则不出现在统计结果中），并统计这些新增用户的一日留存率。用户首次登录为当天新增，次日也登录则为一日留存。一日留存用户占新增用户数的比率为一日留存率。",[114,67577,67579],{"className":33693,"code":67578,"language":33695,"meta":119,"style":119},"select regist_date, count(*) regist_count, cast(sum(rate) \u002F count(*) as decimal(16, 2)) retention_1_rate from\n(select min(date_format(login_ts, 'yyyy-MM-dd')) as regist_date,\n           if(array_contains(\n              collect_set(date_format(login_ts, 'yyyy-MM-dd')),\n              cast(date_add(min(date_format(login_ts, 'yyyy-MM-dd')), 1) as string)),\n                   1, 0) as rate\n        from user_login_detail\ngroup by user_id) t1 group by regist_date;\n",[17,67580,67581,67586,67591,67596,67601,67606,67611,67616],{"__ignoreMap":119},[78,67582,67583],{"class":124,"line":125},[78,67584,67585],{},"select regist_date, count(*) regist_count, cast(sum(rate) \u002F count(*) as decimal(16, 2)) retention_1_rate from\n",[78,67587,67588],{"class":124,"line":132},[78,67589,67590],{},"(select min(date_format(login_ts, 'yyyy-MM-dd')) as regist_date,\n",[78,67592,67593],{"class":124,"line":138},[78,67594,67595],{},"           if(array_contains(\n",[78,67597,67598],{"class":124,"line":144},[78,67599,67600],{},"              collect_set(date_format(login_ts, 'yyyy-MM-dd')),\n",[78,67602,67603],{"class":124,"line":150},[78,67604,67605],{},"              cast(date_add(min(date_format(login_ts, 'yyyy-MM-dd')), 1) as string)),\n",[78,67607,67608],{"class":124,"line":156},[78,67609,67610],{},"                   1, 0) as rate\n",[78,67612,67613],{"class":124,"line":162},[78,67614,67615],{},"        from user_login_detail\n",[78,67617,67618],{"class":124,"line":168},[78,67619,67620],{},"group by user_id) t1 group by regist_date;\n",[10548,67622,67624],{"id":67623},"_10-分别从登录明细表user_login_detail和配送信息表delivery_info中的用户登录时间和下单时间字段统计登陆次数和交易次数","10. 分别从登录明细表（user_login_detail）和配送信息表（delivery_info）中的用户登录时间和下单时间字段，统计登陆次数和交易次数",[114,67626,67628],{"className":33693,"code":67627,"language":33695,"meta":119,"style":119},"select t1.user_id, t1.login_date, nvl(login_count, 0) as login_count, nvl(order_count, 0) as order_count from (\nselect user_id, date_format(login_ts, 'yyyy-MM-dd') login_date, count(*) login_count from user_login_detail\ngroup by user_id, date_format(login_ts, 'yyyy-MM-dd')) t1\nleft join (\n    select user_id, date_format(order_date, 'yyyy-MM-dd') login_date, count(*) order_count from delivery_info\ngroup by user_id, date_format(order_date, 'yyyy-MM-dd')\n) t2 on t1.user_id = t2.user_id and t1.login_date = t2.login_date;\n",[17,67629,67630,67635,67640,67645,67650,67655,67660],{"__ignoreMap":119},[78,67631,67632],{"class":124,"line":125},[78,67633,67634],{},"select t1.user_id, t1.login_date, nvl(login_count, 0) as login_count, nvl(order_count, 0) as order_count from (\n",[78,67636,67637],{"class":124,"line":132},[78,67638,67639],{},"select user_id, date_format(login_ts, 'yyyy-MM-dd') login_date, count(*) login_count from user_login_detail\n",[78,67641,67642],{"class":124,"line":138},[78,67643,67644],{},"group by user_id, date_format(login_ts, 'yyyy-MM-dd')) t1\n",[78,67646,67647],{"class":124,"line":144},[78,67648,67649],{},"left join (\n",[78,67651,67652],{"class":124,"line":150},[78,67653,67654],{},"    select user_id, date_format(order_date, 'yyyy-MM-dd') login_date, count(*) order_count from delivery_info\n",[78,67656,67657],{"class":124,"line":156},[78,67658,67659],{},"group by user_id, date_format(order_date, 'yyyy-MM-dd')\n",[78,67661,67662],{"class":124,"line":162},[78,67663,67664],{},") t2 on t1.user_id = t2.user_id and t1.login_date = t2.login_date;\n",[10548,67666,67668],{"id":67667},"_11-从订单明细表order_detail中统计每个商品各年度的销售总额","11. 从订单明细表（order_detail）中统计每个商品各年度的销售总额",[114,67670,67672],{"className":33693,"code":67671,"language":33695,"meta":119,"style":119},"select sku_id, year(create_date) year_date, sum(sku_num) * price sku_sum from\norder_detail group by sku_id, year_date order by sku_id;\n",[17,67673,67674,67679],{"__ignoreMap":119},[78,67675,67676],{"class":124,"line":125},[78,67677,67678],{},"select sku_id, year(create_date) year_date, sum(sku_num) * price sku_sum from\n",[78,67680,67681],{"class":124,"line":132},[78,67682,67683],{},"order_detail group by sku_id, year_date order by sku_id;\n",[10548,67685,67687],{"id":67686},"_12-从订单详情表order_detail中查询2021年9月27号-2021年10月3号这一周所有商品每天销售件数","12. 从订单详情表（order_detail）中查询2021年9月27号-2021年10月3号这一周所有商品每天销售件数",[114,67689,67691],{"className":33693,"code":67690,"language":33695,"meta":119,"style":119},"select sku_id, sum(a) as monday, sum(b) as tuesday, sum(c) as wednesday,\n        sum(d) as thusday, sum(e) as friday, sum(f) as saturday, sum(g) as sunday from (\nselect sku_id,\n       if (dayofweek(create_date) = 2, sku_num, 0) as a,\n       if (dayofweek(create_date) = 3, sku_num, 0) as b,\n       if (dayofweek(create_date) = 4, sku_num, 0) as c,\n       if (dayofweek(create_date) = 5, sku_num, 0) as d,\n       if (dayofweek(create_date) = 6, sku_num, 0) as e,\n       if (dayofweek(create_date) = 7, sku_num, 0) as f,\n       if (dayofweek(create_date) = 1, sku_num, 0) as g from\n    order_detail where datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-09-27') >= 0\n    and datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-03') \u003C= 0) t\ngroup by sku_id;\n",[17,67692,67693,67698,67703,67708,67713,67718,67723,67728,67733,67738,67743,67748,67753],{"__ignoreMap":119},[78,67694,67695],{"class":124,"line":125},[78,67696,67697],{},"select sku_id, sum(a) as monday, sum(b) as tuesday, sum(c) as wednesday,\n",[78,67699,67700],{"class":124,"line":132},[78,67701,67702],{},"        sum(d) as thusday, sum(e) as friday, sum(f) as saturday, sum(g) as sunday from (\n",[78,67704,67705],{"class":124,"line":138},[78,67706,67707],{},"select sku_id,\n",[78,67709,67710],{"class":124,"line":144},[78,67711,67712],{},"       if (dayofweek(create_date) = 2, sku_num, 0) as a,\n",[78,67714,67715],{"class":124,"line":150},[78,67716,67717],{},"       if (dayofweek(create_date) = 3, sku_num, 0) as b,\n",[78,67719,67720],{"class":124,"line":156},[78,67721,67722],{},"       if (dayofweek(create_date) = 4, sku_num, 0) as c,\n",[78,67724,67725],{"class":124,"line":162},[78,67726,67727],{},"       if (dayofweek(create_date) = 5, sku_num, 0) as d,\n",[78,67729,67730],{"class":124,"line":168},[78,67731,67732],{},"       if (dayofweek(create_date) = 6, sku_num, 0) as e,\n",[78,67734,67735],{"class":124,"line":174},[78,67736,67737],{},"       if (dayofweek(create_date) = 7, sku_num, 0) as f,\n",[78,67739,67740],{"class":124,"line":180},[78,67741,67742],{},"       if (dayofweek(create_date) = 1, sku_num, 0) as g from\n",[78,67744,67745],{"class":124,"line":186},[78,67746,67747],{},"    order_detail where datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-09-27') >= 0\n",[78,67749,67750],{"class":124,"line":192},[78,67751,67752],{},"    and datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-03') \u003C= 0) t\n",[78,67754,67755],{"class":124,"line":198},[78,67756,67757],{},"group by sku_id;\n",[10548,67759,67761],{"id":67760},"_13-从订单明细表order_detail中统计同一个商品在2021年和2022年中同一个月的销量对比","13. 从订单明细表（order_detail）中，统计同一个商品在2021年和2022年中同一个月的销量对比",[114,67763,67765],{"className":33693,"code":67764,"language":33695,"meta":119,"style":119},"select sku_id,\n       month(create_date) month,\n       sum(if(year(create_date) = 2020, sku_num, 0)) 2020_skusum,\n       sum(if(year(create_date) = 2021, sku_num, 0)) 2021_skusum\nfrom order_detail\nwhere year(create_date) = 2021\n   or year(create_date) = 2020\ngroup by sku_id, month(create_date);\n",[17,67766,67767,67771,67776,67781,67786,67791,67796,67801],{"__ignoreMap":119},[78,67768,67769],{"class":124,"line":125},[78,67770,67707],{},[78,67772,67773],{"class":124,"line":132},[78,67774,67775],{},"       month(create_date) month,\n",[78,67777,67778],{"class":124,"line":138},[78,67779,67780],{},"       sum(if(year(create_date) = 2020, sku_num, 0)) 2020_skusum,\n",[78,67782,67783],{"class":124,"line":144},[78,67784,67785],{},"       sum(if(year(create_date) = 2021, sku_num, 0)) 2021_skusum\n",[78,67787,67788],{"class":124,"line":150},[78,67789,67790],{},"from order_detail\n",[78,67792,67793],{"class":124,"line":156},[78,67794,67795],{},"where year(create_date) = 2021\n",[78,67797,67798],{"class":124,"line":162},[78,67799,67800],{},"   or year(create_date) = 2020\n",[78,67802,67803],{"class":124,"line":168},[78,67804,67805],{},"group by sku_id, month(create_date);\n",[10548,67807,67809],{"id":67808},"_14-从订单明细表order_detail和收藏信息表favor_info中统计2021年国庆节期间10月1日-10月7日每个商品的购买总数量和总收藏次数","14. 从订单明细表（order_detail）和收藏信息表（favor_info）中统计2021年国庆节期间（10月1日-10月7日），每个商品的购买总数量和总收藏次数",[114,67811,67813],{"className":33693,"code":67812,"language":33695,"meta":119,"style":119},"select t1.sku_id, nvl(sku_sum, 0) as sku_sum, nvl(favor_cn, 0) as favor_cn from\n    (select sku_id, sum(sku_num) as sku_sum from order_detail\n                    where datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-01') >= 0\n                    and datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-07') \u003C= 0\n                    group by sku_id) t1 full outer join (\n              select sku_id, count(*) as favor_cn from favor_info\n                    where datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-01') >= 0\n                    and datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-07') \u003C= 0\n                    group by sku_id\n    ) t2 on t1.sku_id = t2.sku_id;\n",[17,67814,67815,67820,67825,67830,67835,67840,67845,67849,67853,67858],{"__ignoreMap":119},[78,67816,67817],{"class":124,"line":125},[78,67818,67819],{},"select t1.sku_id, nvl(sku_sum, 0) as sku_sum, nvl(favor_cn, 0) as favor_cn from\n",[78,67821,67822],{"class":124,"line":132},[78,67823,67824],{},"    (select sku_id, sum(sku_num) as sku_sum from order_detail\n",[78,67826,67827],{"class":124,"line":138},[78,67828,67829],{},"                    where datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-01') >= 0\n",[78,67831,67832],{"class":124,"line":144},[78,67833,67834],{},"                    and datediff(date_format(create_date, 'yyyy-MM-dd'), '2021-10-07') \u003C= 0\n",[78,67836,67837],{"class":124,"line":150},[78,67838,67839],{},"                    group by sku_id) t1 full outer join (\n",[78,67841,67842],{"class":124,"line":156},[78,67843,67844],{},"              select sku_id, count(*) as favor_cn from favor_info\n",[78,67846,67847],{"class":124,"line":162},[78,67848,67829],{},[78,67850,67851],{"class":124,"line":168},[78,67852,67834],{},[78,67854,67855],{"class":124,"line":174},[78,67856,67857],{},"                    group by sku_id\n",[78,67859,67860],{"class":124,"line":180},[78,67861,67862],{},"    ) t2 on t1.sku_id = t2.sku_id;\n",[10548,67864,67866],{"id":67865},"_15-动销率的定义为某品类的商品中一段时间内有销量的商品种类数占当前已上架总商品种类数的比例有销量的商品种类数已上架总商品种类数滞销率的定义为某分类商品中一段时间内没有销量的商品种类数占当前已上架总商品种类数的比例没有销量的商品种类数已上架总商品种类数只要当天任一店铺有任何商品的销量就输出该天的统计结果从订单明细表order_detail和商品信息表sku_info表中统计国庆节期间10月1日-10月7日每天每个分类的商品的动销率和滞销率","15. 动销率的定义为某品类的商品中一段时间内有销量的商品种类数占当前已上架总商品种类数的比例（有销量的商品种类数\u002F已上架总商品种类数）。滞销率的定义为某分类商品中一段时间内没有销量的商品种类数占当前已上架总商品种类数的比例（没有销量的商品种类数\u002F已上架总商品种类数）。只要当天任一店铺有任何商品的销量就输出该天的统计结果。从订单明细表（order_detail）和商品信息表（sku_info）表中统计国庆节期间（10月1日-10月7日）每天每个分类的商品的动销率和滞销率",[114,67868,67870],{"className":33693,"code":67869,"language":33695,"meta":119,"style":119},"select category_id,\n       cast(first_sale_rate as decimal(16, 2))         first_sale_rate,\n       cast((1 - first_sale_rate) as decimal(16, 2))   first_unsale_rate,\n       cast(second_sale_rate as decimal(16, 2))        second_sale_rate,\n       cast((1 - second_sale_rate) as decimal(16, 2))  second_unsale_rate,\n       cast(third_sale_rate as decimal(16, 2))         third_sale_rate,\n       cast((1 - third_sale_rate) as decimal(16, 2))   third_unsale_rate,\n       cast(fourth_sale_rate as decimal(16, 2))        fourth_sale_rate,\n       cast((1 - fourth_sale_rate) as decimal(16, 2))  fourth_unsale_rate,\n       cast(fifth_sale_rate as decimal(16, 2))         fifth_sale_rate,\n       cast((1 - fifth_sale_rate) as decimal(16, 2))   fifth_unsale_rate,\n       cast(sixth_sale_rate as decimal(16, 2))         sixth_sale_rate,\n       cast((1 - sixth_sale_rate) as decimal(16, 2))   sixth_unsale_rate,\n       cast(seventh_sale_rate as decimal(16, 2))       seventh_sale_rate,\n       cast((1 - seventh_sale_rate) as decimal(16, 2)) seventh_unsale_rate\nfrom (select category_id,\n             cast(count(distinct if(t1.create_date = '2021-10-01', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-01', sku_info.sku_id, null)) first_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-02', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-02', sku_info.sku_id, null)) second_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-03', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-03', sku_info.sku_id, null)) third_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-04', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-04', sku_info.sku_id, null)) fourth_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-05', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-05', sku_info.sku_id, null)) fifth_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-06', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-06', sku_info.sku_id, null)) sixth_sale_rate,\n             cast(count(distinct if(t1.create_date = '2021-10-07', t1.sku_id, null)) as decimal(16, 2)) \u002F\n             count(distinct if(sku_info.from_date \u003C= '2021-10-07', sku_info.sku_id, null)) seventh_sale_rate\n      from (select sku_id,\n                   create_date\n            from order_detail\n            where create_date >= '2021-10-01'\n              and create_date \u003C= '2021-10-07') t1\n               right join sku_info\n                          on t1.sku_id = sku_info.sku_id\n      group by category_id) t2;\n",[17,67871,67872,67877,67882,67887,67892,67897,67902,67907,67912,67917,67922,67927,67932,67937,67942,67947,67952,67957,67962,67967,67972,67977,67982,67987,67992,67997,68002,68007,68012,68017,68022,68027,68032,68037,68042,68047,68052,68057],{"__ignoreMap":119},[78,67873,67874],{"class":124,"line":125},[78,67875,67876],{},"select category_id,\n",[78,67878,67879],{"class":124,"line":132},[78,67880,67881],{},"       cast(first_sale_rate as decimal(16, 2))         first_sale_rate,\n",[78,67883,67884],{"class":124,"line":138},[78,67885,67886],{},"       cast((1 - first_sale_rate) as decimal(16, 2))   first_unsale_rate,\n",[78,67888,67889],{"class":124,"line":144},[78,67890,67891],{},"       cast(second_sale_rate as decimal(16, 2))        second_sale_rate,\n",[78,67893,67894],{"class":124,"line":150},[78,67895,67896],{},"       cast((1 - second_sale_rate) as decimal(16, 2))  second_unsale_rate,\n",[78,67898,67899],{"class":124,"line":156},[78,67900,67901],{},"       cast(third_sale_rate as decimal(16, 2))         third_sale_rate,\n",[78,67903,67904],{"class":124,"line":162},[78,67905,67906],{},"       cast((1 - third_sale_rate) as decimal(16, 2))   third_unsale_rate,\n",[78,67908,67909],{"class":124,"line":168},[78,67910,67911],{},"       cast(fourth_sale_rate as decimal(16, 2))        fourth_sale_rate,\n",[78,67913,67914],{"class":124,"line":174},[78,67915,67916],{},"       cast((1 - fourth_sale_rate) as decimal(16, 2))  fourth_unsale_rate,\n",[78,67918,67919],{"class":124,"line":180},[78,67920,67921],{},"       cast(fifth_sale_rate as decimal(16, 2))         fifth_sale_rate,\n",[78,67923,67924],{"class":124,"line":186},[78,67925,67926],{},"       cast((1 - fifth_sale_rate) as decimal(16, 2))   fifth_unsale_rate,\n",[78,67928,67929],{"class":124,"line":192},[78,67930,67931],{},"       cast(sixth_sale_rate as decimal(16, 2))         sixth_sale_rate,\n",[78,67933,67934],{"class":124,"line":198},[78,67935,67936],{},"       cast((1 - sixth_sale_rate) as decimal(16, 2))   sixth_unsale_rate,\n",[78,67938,67939],{"class":124,"line":204},[78,67940,67941],{},"       cast(seventh_sale_rate as decimal(16, 2))       seventh_sale_rate,\n",[78,67943,67944],{"class":124,"line":210},[78,67945,67946],{},"       cast((1 - seventh_sale_rate) as decimal(16, 2)) seventh_unsale_rate\n",[78,67948,67949],{"class":124,"line":216},[78,67950,67951],{},"from (select category_id,\n",[78,67953,67954],{"class":124,"line":222},[78,67955,67956],{},"             cast(count(distinct if(t1.create_date = '2021-10-01', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,67958,67959],{"class":124,"line":421},[78,67960,67961],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-01', sku_info.sku_id, null)) first_sale_rate,\n",[78,67963,67964],{"class":124,"line":427},[78,67965,67966],{},"             cast(count(distinct if(t1.create_date = '2021-10-02', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,67968,67969],{"class":124,"line":433},[78,67970,67971],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-02', sku_info.sku_id, null)) second_sale_rate,\n",[78,67973,67974],{"class":124,"line":2443},[78,67975,67976],{},"             cast(count(distinct if(t1.create_date = '2021-10-03', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,67978,67979],{"class":124,"line":2448},[78,67980,67981],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-03', sku_info.sku_id, null)) third_sale_rate,\n",[78,67983,67984],{"class":124,"line":2454},[78,67985,67986],{},"             cast(count(distinct if(t1.create_date = '2021-10-04', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,67988,67989],{"class":124,"line":2460},[78,67990,67991],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-04', sku_info.sku_id, null)) fourth_sale_rate,\n",[78,67993,67994],{"class":124,"line":2465},[78,67995,67996],{},"             cast(count(distinct if(t1.create_date = '2021-10-05', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,67998,67999],{"class":124,"line":2470},[78,68000,68001],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-05', sku_info.sku_id, null)) fifth_sale_rate,\n",[78,68003,68004],{"class":124,"line":2903},[78,68005,68006],{},"             cast(count(distinct if(t1.create_date = '2021-10-06', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,68008,68009],{"class":124,"line":2909},[78,68010,68011],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-06', sku_info.sku_id, null)) sixth_sale_rate,\n",[78,68013,68014],{"class":124,"line":11477},[78,68015,68016],{},"             cast(count(distinct if(t1.create_date = '2021-10-07', t1.sku_id, null)) as decimal(16, 2)) \u002F\n",[78,68018,68019],{"class":124,"line":13374},[78,68020,68021],{},"             count(distinct if(sku_info.from_date \u003C= '2021-10-07', sku_info.sku_id, null)) seventh_sale_rate\n",[78,68023,68024],{"class":124,"line":13380},[78,68025,68026],{},"      from (select sku_id,\n",[78,68028,68029],{"class":124,"line":13386},[78,68030,68031],{},"                   create_date\n",[78,68033,68034],{"class":124,"line":13722},[78,68035,68036],{},"            from order_detail\n",[78,68038,68039],{"class":124,"line":13727},[78,68040,68041],{},"            where create_date >= '2021-10-01'\n",[78,68043,68044],{"class":124,"line":13953},[78,68045,68046],{},"              and create_date \u003C= '2021-10-07') t1\n",[78,68048,68049],{"class":124,"line":13958},[78,68050,68051],{},"               right join sku_info\n",[78,68053,68054],{"class":124,"line":13964},[78,68055,68056],{},"                          on t1.sku_id = sku_info.sku_id\n",[78,68058,68059],{"class":124,"line":13969},[78,68060,68061],{},"      group by category_id) t2;\n",[226,68063,228],{},{"title":119,"searchDepth":144,"depth":144,"links":68065},[68066,68067],{"id":66651,"depth":132,"text":66651},{"id":67275,"depth":132,"text":67275},{},"Little Tips\u002FHQL初级练习.md","\u002Fundergraduate\u002Fnote-7ed4f32ed08c",{"title":66635,"description":119},"undergraduate\u002Fnote-7ed4f32ed08c",[10715],"u_5N2dcYqXep-08ZflfeHRkfOJ_s_x20HY7NKV5-XmU",{"id":68076,"title":68077,"assetBase":239,"author":8,"body":68078,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":68508,"navigation":128,"originalPath":68509,"path":68510,"seo":68511,"source":23330,"stem":68512,"tags":68513,"weight":250,"__hash__":68514},"content\u002Fundergraduate\u002Fnote-83eac7c581f6.md","MUSIC COMPOSITION WITH DEEP LEARNING A REVIEW",{"type":10,"value":68079,"toc":68471},[68080,68083,68087,68091,68095,68110,68113,68116,68119,68123,68126,68129,68133,68136,68139,68143,68146,68150,68153,68156,68162,68166,68172,68175,68181,68185,68188,68191,68197,68201,68204,68207,68211,68214,68218,68221,68224,68227,68233,68247,68250,68253,68259,68263,68266,68271,68275,68278,68281,68287,68291,68294,68297,68301,68304,68307,68310,68314,68317,68320,68323,68327,68330,68334,68337,68342,68346,68349,68352,68357,68360,68364,68367,68371,68374,68377,68380,68383,68387,68390,68393,68396,68400,68403,68407,68410,68414,68417,68420,68424,68427,68431,68434,68438,68441,68445,68448,68452,68455,68459,68462,68465,68468],[4517,68081,68082],{"id":68082},"深度学习的音乐创作综述",[7759,68084,68086],{"id":68085},"carlos-hernandez-olivan","Carlos Hernandez-Olivan",[7759,68088,68090],{"id":68089},"jose-r-beltran","Jose R. Beltran",[7759,68092,68094],{"id":68093},"department-of-engineering-and-communications-calle-maría-de-luna-universidad-de-zaragoza","Department of Engineering and Communications, Calle María de Luna, Universidad de Zaragoza",[72,68096,68097,68101,68104,68107],{},[13,68098,68099],{},[22,68100,25537],{},[13,68102,68103],{},"这篇真的只是综述，没有上一篇那么多内容，但是更加通俗易懂。对于目前主流的 GANs、VAEs、Transformers 有了更详细一点的介绍，但是依然没有介绍很详细的实现方式（所以读完两篇之后我最大的感触是人人都在说 MusicVAE 2，但是我仍然不知道它的实现过程与原理）。",[13,68105,68106],{},"我给的意见是类似这种综述类文章我不清楚是否能够发表到很高级的期刊上，但是它给人的参考价值并没有想象中的那么大，反而原文中引用的文章会给人更直观的感受。所以暂时将综述类文章放在一边，我会再读几篇偏技术一点的文章后对他们所引用的论文进行一个整理，找出大家都喜欢引用的几篇（去个重嘛，经典wordcount）读一下。",[13,68108,68109],{},"最后这篇相比第一篇主观上逊色几分，但是通俗易懂，如果读了第一篇忘了或者觉得内容过多引起不适，那么这篇的体量应该刚刚好。",[7759,68111,68112],{"id":68112},"摘要",[13,68114,68115],{},"产生一件复杂的艺术作品，如音乐作品，需要表现出真正的创造力，这取决于与音乐语言层次相关的各种因素。音乐生成一直面临着算法方法，最近还面临着在计算机视觉等其他领域使用的深度学习模型。在本文中，我们希望将基于人工智能的音乐创作模型与人类音乐创作和创造力过程之间的现有关系放在上下文中。我们概述了最近的音乐创作深度学习模型，并从理论角度将这些模型与音乐创作过程进行了比较。我们试图通过分析当前深度学习模型生成具有创造力的音乐的能力，或者人工智能和人类作曲过程之间的相似性等，来回答这项任务中一些最相关的开放性问题。",[13,68117,68118],{},"**关键词：**音乐生成、深度学习、机器学习、神经网络",[7759,68120,68122],{"id":68121},"_1-简介","1 简介",[13,68124,68125],{},"音乐通常被定义为一系列音高或节奏，或两者兼有，在某些特定的模式中。音乐创作（或生成）是创作或创作一首新音乐的过程。音乐创作术语也可以指原创音乐作品。音乐创作需要创造力，这是人类理解和创造一种语言中无穷句子的独特能力，其中大多数句子以前从未遇到或说过。这是在设计或提出基于人工智能的音乐创作算法时需要考虑的一个非常重要的方面。",[13,68127,68128],{},"更具体地说，音乐创作是音乐信息检索领域的一个重要课题。它包括旋律生成、多音轨或多乐器生成、风格转换或协调等子任务。本文将从近年来基于 AI 和 DL 的大量技术的角度来涵盖这些方面。",[39316,68130,68132],{"id":68131},"_11-从算法合成到深度学习","1.1 从算法合成到深度学习",[13,68134,68135],{},"自 20 世纪 80 年代以来，人们对计算机音乐创作的兴趣从未停止过增长。一些实验出现在 20 世纪 80 年代初，如 David Cope 在 1983 年至 1989 年的音乐智能实验或 Iannis Xenakis 的 Analogiques A 和 B。2000 年代后期，David Cope 还提出了将马尔可夫链与语法相结合用于自动音乐创作，并诞生了其他相关作品，如 Koening 的 Project1（PR1）。这些技术可以归入算法音乐创作领域，这是一种通过可形式化方法进行创作的方式。这种类型的组成是基于一个受控过程，该过程基于必须按照固定顺序遵循的数学指令。算法组合中有几种方法，如马尔可夫模型、生成语法、细胞自动机、遗传算法、过渡网络或 Caos 理论。有时，这些技术和其他概率方法与深度神经网络相结合，以调节它们或帮助它们更好地建模音乐，DeepBach 就是这样。这些模型可以生成和协调不同风格的旋律，但缺乏可推广性。与基于 Depp 学习的模型相比，这些模型的能力和必须手工完成的基于规则的定义使这些方法的功能和可推广性较差。",[13,68137,68138],{},"从 20 世纪 80 年代到 21 世纪初，第一批尝试用神经网络建模音乐的作品诞生了。近年来，随着深度学习（DL）的发展，许多研究试图用深度神经网络（NN）对音乐进行建模。用于音乐生成的 DL 模型通常使用 NN 架构，该架构已被证明在其他领域（如计算机视觉或自然语言处理（NLP））中表现良好。在这些领域中也可以使用预先训练的模型，用于音乐生成。这被称为迁移学习。本文稍后将介绍一些神经网络技术和体系结构。今天的音乐创作采用了来自大规模 NLP 应用程序的输入表示和 NNs 架构，例如基于 Transformer 的模型，它们在这项任务中表现出了非常好的性能。这是因为音乐可以被理解为一种语言，在这种语言中，每种风格或音乐流派都有自己的规则。",[39316,68140,68142],{"id":68141},"_12-用于深度学习音乐创作的神经网络架构","1.2 用于深度学习音乐创作的神经网络架构",[13,68144,68145],{},"首先，我们将概述迄今为止在音乐创作任务中提供最佳结果的最广泛使用的神经网络架构。音乐创作任务中最常用的神经网络架构是生成模型，如变分自动机（VAE）或生成对抗网络（GAN），以及基于 NLP 的模型，如长短期记忆（LSTM）或 Transformers。以下是这些型号的概述。",[10548,68147,68149],{"id":68148},"_121-可变自动编码器vaes","1.2.1 可变自动编码器（VAEs）",[13,68151,68152],{},"原始 VAE 模型使用编码器-解码器架构，通过重建输入来产生潜在空间（见图 1a）。潜在空间是压缩数据的多维空间，其中最相似的元素彼此最接近。在 VAE 中，编码器近似后验，解码器参数化似然。后验近似和似然近似分别由编码器和解码器的具有 λ 和 θ 参数的 NN 进行参数化。后验推理是通过最小化编码器或近似后验之间的 Kullback-Leiber（KL）分歧来完成的，而真正的后验推理则是通过最大化证据下界（ELBO）来完成的。",[13,68154,68155],{},"梯度是用所谓的重新参数化技巧计算的。原始 VAE 模型有一些变化，如 β-VAE，它在重建损失中添加了惩罚项 β，以改善潜在空间分布。在图 1a 中，我们展示了通用 VAE 架构。基于 VAE 的音乐创作 DL 模型的一个例子是 MusicVAE，我们将在本文的下一节中对此进行描述。",[13,68157,68158],{},[617,68159],{"alt":68160,"src":68161},"图 1a","img\u002F1a.png",[10548,68163,68165],{"id":68164},"_122-生成对抗性网络gans","1.2.2 生成对抗性网络（GANs）",[13,68167,68168,68169,68171],{},"GANs 是由两个 NN 组成的生成模型：生成器 G 和鉴别器 D。生成器学习输入数据上的分布 p",[25921,68170,43673],{},"。进行训练是为了让鉴别器最大限度地为训练样本和生成器生成的样本分配正确标签的概率。这种训练思想可以理解为 D 和 G 遵循 Goodfellow 等人所描述的两人极小极大博弈。在图 1b 中，我们展示了通用 GAN 架构。",[13,68173,68174],{},"生成器和判别器可以由不同的 NN 层形成，如多层感知器（MLP）、LSTM 或卷积神经网络（CNN）。",[13,68176,68177],{},[617,68178],{"alt":68179,"src":68180},"图 1b","img\u002F1b.png",[10548,68182,68184],{"id":68183},"_123-transformers","1.2.3 Transformers",[13,68186,68187],{},"Transformers 目前正在 NLP 应用中广泛使用，因为它们不仅在 NLP 中表现良好，而且在计算机视觉模型中也表现良好。Transformers 可以用作自回归模型，如 LSTM，这允许它们用于生成任务。Transformers 背后的基本思想是注意力机制。Vaswani 等人提出的原始注意力机制有几种变体，已用于音乐创作任务。注意力层和前馈层的结合导致了 Transformer 的编码器和解码器的形成，这与同样由编码器和解码器组成的纯 AutoEncoder 模型不同。",[13,68189,68190],{},"Transformers 使用令牌进行训练，令牌是输入的结构化表示。在图 1c 中，我们展示了通用变压器架构。",[13,68192,68193],{},[617,68194],{"alt":68195,"src":68196},"图 1c","img\u002F1c.png",[39316,68198,68200],{"id":68199},"_13-深度学习在音乐创作中的挑战","1.3 深度学习在音乐创作中的挑战",[13,68202,68203],{},"在使用 DL 的音乐创作中，从挑战的角度来看，有不同的观点，这让我们提出了与该领域中使用的输入表示和 DL 模型、实际最先进方法的输出质量或研究人员测量生成音乐质量的方式有关的问题。在这篇综述中，我们问自己以下涉及合成过程和输出的问题：当前的 DL 能够产生具有一定创造力的音乐的模型吗？使用 DL 进行音乐创作的最佳 NN 架构是什么？端到端的方法能生成完整的结构化音乐片段吗？带有 DL 的作曲作品只是对输入的模仿吗？还是 NN 可以生成训练数据中不存在的风格的新音乐？神经网络应该像人类一样遵循同样的逻辑和过程来创作音乐吗？用于音乐生成的 DL 模型需要多少数据？目前的评估方法是否足以比较和衡量创作音乐的创造力？",[13,68205,68206],{},"为了回答这些问题，我们从获得最终作品和 DL 模型输出的过程的角度来研究音乐创作或生成，即人类创作过程和深度学习的音乐生成过程之间的比较，以及生成的音乐所呈现的艺术和创作特征。我们还分析了最近最先进的深度学习音乐创作模型，以显示这些模型提供的结果（主题、完整的作品…）。分析的另一个重要方面是这些模型用于生成音乐的输入表示，以了解这些表示是否适合作曲。这让我们对如何改进这些模型有了一些见解，如果这些神经网络架构足够强大，能够以一定的创造力创作新音乐，以及深度学习音乐创作的方向和未来工作。",[39316,68208,68210],{"id":68209},"_14-论文结构","1.4 论文结构",[13,68212,68213],{},"在这篇综述中，我们从作曲过程和生成输出的类型来分析音乐作曲任务，我们不包括作品或合成任务。本文的结构如下。第 2 节介绍了音乐创作的一般过程和音乐创作的基本原则。在第 3 节中，我们从旋律作曲的角度概述了最先进的方法，并描述了已测试用于创作结构化音乐的 DL 模型。在第 4 节中，我们描述了生成多音轨或多乐器音乐的 DL 模型，即为多个乐器制作的音乐。在第 5 节中，我们展示了通常用于评估音乐生成模型输出的不同方法和指标。在第 6 节中，我们通过分析我们在第 3 节和第 4 节中描述的模型，描述了音乐生成中仍然存在的悬而未决的问题。最后，在第 7 节中，我们介绍了未来的工作和研究中仍然存在的挑战。",[7759,68215,68217],{"id":68216},"_2-音乐创作过程","2 音乐创作过程",[13,68219,68220],{},"与书面语言一样，音乐创作过程是一个复杂的过程，取决于大量的决策。在音乐领域，这个过程取决于我们所使用的音乐风格。例如，在古典音乐中，从一个或两个小节的一个小单元开始，称为主题，并将其发展为旋律或音乐短语，这是非常常见的。在流行音乐或爵士乐等风格中，更常见的是采用和弦进行，并在其前面创作或即兴创作旋律，当一个作曲家开始一首音乐时，它背后有一些基本的旋律或和声思想。从古典音乐的角度来看，这个思想（或主题）是由作曲家发展起来的，以构建遵循特定和声进程的旋律或短语，然后这些短语被分段构建。每一节都有自己的目的，因此可以用不同的键书写，其短语通常遵循与其他节不同的和声进行。通常，作品有旋律部分和伴奏部分。一首音乐的旋律部分可以由不同的乐器演奏，这些乐器的频率范围可能相似，也可能不相似，和声部分给这首音乐一种深刻而结构化的感觉。不一定在同一频率范围内的乐器与乐器和编排技术相结合（见第 3.2 节）。这些元素在音乐创作中至关重要，也是定义音乐风格或流派的重要关键。音乐，有两个维度，时间维度和和声维度。时间维度由音符持续时间或节奏表示，这是该轴中的最低级别。在此维度中，注释可以按称为条形的单位进行分组或测量，条形是有序的注释组。另一个维度，和声，与音符值或音高有关。如果我们考虑一个图像，时间维度是横轴，和弦维度是纵轴。和声也有时间上的演变，但这并没有体现在乐谱中。有一种非常常见的基于软件的音乐表示，称为钢琴卷，遵循这种逻辑。",[13,68222,68223],{},"音乐时间维度是以音符为低级单位构建的，这些音符被分组为小节，形成（主题）。在时间高级维度中，我们可以找到由持续八小节或更多小节的短语组成的部分（这取决于风格和作曲家）。和声维度的最低层次是音符层次，然后不同乐器演奏的音符的叠加给了我们和弦。和弦序列被称为和弦进程，与作曲相关，它们在时间维度上也有相关性。话虽如此，我们可以将音乐视为一种复杂的语言模式，由短期和长期关系组成。这些关系在两个维度上延伸，与音乐结构相关的时间维度和与音符或音高和和弦相关的和声维度，即和声。",[13,68225,68226],{},"从符号音乐生成和分析的角度来看，基于 Walton 的思想，音乐的基本原理或元素是（见图 2a）：",[13,68228,68229],{},[617,68230],{"alt":68231,"src":68232},"图 2a 总体音乐创作方案","img\u002F2a.png",[49,68234,68235,68238,68241,68244],{},[52,68236,68237],{},"和声。正是音符的叠加形成了和弦，构成了和弦的进程。音符级别可以被认为是和声的最低级别，其次是和弦级别。最高级别可以被认为是通常属于某个关键的进展级别。",[52,68239,68240],{},"音乐形式或结构。它是音乐呈现的高级结构，与时间维度有关。音乐作品中最小的部分是在音乐短语中发展起来的主题，音乐短语的组合形成了一个部分。音乐中的小节是根据音乐风格排序的，例如一些流行歌曲的介绍诗合唱诗（也称为 ABCBA）或奏鸣曲的阐述发展重述或 ABA。不同规模和模式的部分的串联为我们提供了整个构图。",[52,68242,68243],{},"旋律和质感。音乐术语中的质感是指为了形成音乐作品，必须在作品中结合旋律、节奏和和声的内容。音乐可以是单声道的，也可以是复调的，这取决于在同一时间段播放的音符，同音的或异音的取决于旋律，对有伴奏或没有伴奏进行区分。",[52,68245,68246],{},"乐器和编排。这些音乐技巧考虑了一首音乐作品中乐器或曲目的数量。乐器是指组成一首音乐作品的乐器的组合，而编排是指为组成一首确定的音乐作品的不同乐器分配旋律和伴奏。在录音或基于软件的音乐表现中，乐器被组织为曲目。每首曲目都包含在单个乐器上演奏的音符集。因此，我们可以将一首有多首乐器的乐曲称为多音轨，这是指包含两首或多首曲目的信息，其中每首曲目由一首乐器演奏。每个音轨可以包含一个音符或多个同时发出声音的音符，从而分别产生单声道音轨和复调音轨。",[13,68248,68249],{},"音乐类别之间是相关的。和声与结构有关，因为一个小节通常以相同的音阶和模式演奏。小节之间有抑扬顿挫的节奏，也可以有改变乐曲规模的调调。质地和乐器与音色特征有关，它们之间的关系是基于这样一个事实，即并非所有的乐器都能演奏相同的旋律。一个例子是，当我们有一首带有大量装饰元素的旋律，而这些元素无法用确定的乐器家族演奏（因为每种乐器可能有的技巧或设计的原因）。",[13,68251,68252],{},"另一个重要的音乐属性是动态，但它们与表演有关，而不是与作品本身有关，因此我们在这篇综述中不涉及它们。在图 2b 中，我们展示了我们在这篇综述中涵盖的音乐创作过程的各个方面，并描述了类别之间的关系和论文中讨论每个主题的部分。",[13,68254,68255],{},[617,68256],{"alt":68257,"src":68258},"图 2b 贝多芬第五交响曲开头的音乐级别或类别的例子","img\u002F2b.png",[7759,68260,68262],{"id":68261},"_3-旋律生成","3 旋律生成",[13,68264,68265],{},"旋律是一系列具有一定节奏的音符，以一种美学的方式排列。旋律可以是单声道的，也可以是复调的。单音是指在一个时间步长内只演奏一个音符的旋律，而在复调旋律中，在同一时间步长内演奏多个音符。旋律生成是音乐创作的重要组成部分，并且已经尝试了算法合成和包括生成模型（如 VAE 或 GAN）、用于自回归任务（如 LSTM）的递归神经网络（RNN）的几种 NN 架构，神经自回归分散估计（NADE）或自然语言处理中使用的当前模型，如 Transformers。在图 3 中，我们展示了具有旋律生成模型的类似输出的乐谱的音乐基本原理的方案。",[13,68267,68268],{},[617,68269],{"alt":68270,"src":25765},"图 3 旋律生成模型的类输出乐谱的方案",[39316,68272,68274],{"id":68273},"_31-旋律生成的深度学习模型从主题到旋律短语","3.1 旋律生成的深度学习模型：从主题到旋律短语",[13,68276,68277],{},"根据我们领域的音乐流派，人类的创作过程通常始于主题或和弦的创作，然后扩展到短语或旋律。当涉及到用于音乐生成的 DL 方法时，一些模型可以生成短期音符序列。2016 年，第一批 DL 模型试图使用递归神经网络（RNN）和语义模型（如单元选择）生成短旋律。这些模型适用于短序列，因此创作完整旋律的兴趣随着新 NN 的诞生而增长。从这些最初的作品中衍生出来，为了创造更长的序列（或旋律），出现了其他将神经网络与概率方法相结合的模型。一个例子是谷歌 2016 年发布的 Magenta Melody RNN 模型，以及 2017 年发布的 Anticipation RNN 或 DeepBach。DeepBach 被认为是目前最先进的音乐创作模式之一，因为它能够以巴赫的风格创作四声合唱。",[13,68279,68280],{},"然而，这些方法无法从头开始产生具有高水平创造力的新旋律。为了改进生成任务，研究人员选择了生成模型来进行音乐创作。事实上，如今，在 2 到 16 小节中生成主题或短旋律的最佳表演模式之一是 2018 年出版的 MusicVAE2。MusicVAE 是一种基于 VAE 的音乐生成模型。利用该模型，可以通过在潜在空间中进行插值来生成音乐。该模型使用 Lakh MIDI 数据集（LMD）中的约 150 万首歌曲进行训练，它可以为几乎 3 种乐器生成复调旋律：旋律、低音和鼓。在 MusicVAE 模型的创建以及其他领域新的 NN 架构的诞生之后，可以创建更长旋律的新的基于 DL 的模型的必要性和可用性增加了。基于 Transformers 的新模型出现了，比如 2018 年的 Music Transformer，或者使用预先训练过的 Transformer 模型，比如 OpenAI 在 2019 年提出的 MuseNet 之类的 GPT-2。这些基于 Transformer 的模型，如 Music Transformer，可以生成更长的旋律并继续给定的序列，但在几小节或几秒钟后，旋律会变得有点随机，也就是说，有些音符和和声不符合乐曲的音乐感。",[13,68282,68283,68284,68286],{},"为了克服这个问题，并开发出能够生成更长序列而不会失去前几小节或主旋律中生成的音乐感的模型，新模型在 2020 年和 2021 年诞生，作为 VAE、Transformers 或其他 NN 或机器学习算法的组合。这些模型的一些例子是 TransformerVAE 和 PianoTree。这些模型即使在复调音乐中也表现良好，并且可以生成音乐短语。最新发布的生成完整短语的模型之一是 Mittal 等人在 2021 年提出的模型。该模型基于去噪扩散概率模型（DDPM），这是一种新的生成模型，通过学习将扩散过程从数据反转为高斯噪声来生成高质量样本。该模型使用 MusicVAE 2 小节模型来训练扩散模型，以捕获 k＝32 的 VAE 潜伏时间 z",[25921,68285,5535],{}," 之间的时间关系，这将允许生成 64 小节（每个潜伏 2 小节）的 32 个潜在变量。尽管可以产生更长的复调旋律，但它们不遵循中心主题，因此往往会失去特定方向的感觉。",[39316,68288,68290],{"id":68289},"_32-结构意识","3.2 结构意识",[13,68292,68293],{},"正如我们在第一节中提到的，音乐是一种结构化的语言。一旦旋律被创作出来，它们就必须被分成更大的部分（见图 2），这些部分在作品中起着基本的作用。这些部分有不同的名称，根据音乐风格而有所不同，如流行或 trap 流派的介绍、合唱或诗歌，以及古典奏鸣曲的阐述、发展或重述。小节也可以用大写字母命名，歌曲结构可以用 ABAB 表示。生成有结构的音乐是 DL 音乐创作中最困难的任务之一，因为结构意味着节奏、和弦进行和旋律的美感，这些美感与桥段和抑扬顿挫相连。",[13,68295,68296],{},"在 DL 中，已经有一些模型试图通过施加具有自相似性约束的高级结构来生成结构化音乐。其中一个例子是 Lattner 等人在 2018 年提出的模型，该模型使用卷积限制玻尔兹曼机（C-RBM）生成音乐，并使用自相似矩阵进行自相似约束，以将作品的结构视为模板。这种强加结构模板的方法类似于作曲家在作曲时遵循的作曲过程，并且所产生的音乐片段遵循强加的结构模板。尽管新的 DL 模型趋向于端到端，并且正在发布关于用结构建模音乐的新研究，但还没有 DL 模型可以自己生成结构化音乐，也就是说，没有传递给 NN 的模板或高级结构信息的帮助。",[39316,68298,68300],{"id":68299},"_33-和声与旋律调节","3.3 和声与旋律调节",[13,68302,68303],{},"在 DL 音乐创作中，有一项任务是协调给定的旋律，这与从头开始创作复调旋律的任务不同。一方面，如果我们用 DL 模型从头开始分析创作的旋律的和声，我们会发现用 DL 生成的音乐结构不好，因为它还没有组成不同的小节，也没有以端到端的方式在小节之间书写美学韵律或桥梁。尽管如此，组成复调旋律的基于 Transformer 的模型所产生的和声在所产生作品的第一小节中是连贯的，因为它遵循某个键。我们必须强调的是，这些旋律是为钢琴而写的，这与多乐器音乐不同，多乐器音乐带来了额外的挑战，例如为每种乐器生成合适的旋律或伴奏，或者决定由哪些乐器组成合奏（见第4节）。",[13,68305,68306],{},"另一方面，旋律协调的任务包括产生伴随给定旋律的和声。伴奏可以是和弦伴奏，而不考虑和弦所在的乐器或音轨，也可以是多音轨伴奏，其中每个和弦中的音符都属于特定的乐器。最初的协调模型使用 HMM，但这些模型通过 RNN 进行了改进。一些模型预测和弦函数，而其他模型匹配给定旋律的和弦伴奏。关于生成具有不同音轨的伴奏，已经提出了基于 GAN 的模型，该模型实现 lead sheet arrangement（前导片安排，个人认为翻译为基于片段相联）。2018 年，提出了一种称为 MICA 的多乐器联合编排模型，并在 2020 年对其进行了改进，以生成多音轨伴奏。还有一种模型叫做巴赫涂鸦，它使用 Coconet 为巴赫风格的给定旋律生成伴奏。这些模型的和声质量提高了从头开始创作复调旋律的模型所产生的和声，因为该模型专注于旋律内容来执行和声，这比从头开始创作一首完整的和谐作品的挑战更小。",[13,68308,68309],{},"在使用条件反射的 DL 音乐生成中还有更多的任务，例如生成一个给定和弦进行的旋律，这是人类遵循的一种作曲方式。这些任务已经用变分自动编码器（VAE）、生成对抗性网络或基于 GAN 的模型和端到端模型来解决。其他模型执行整个作曲过程，如 ChordAL。该模型生成和弦，然后将获得的和弦级数发送到旋律生成器，并将最终输出发送到音乐风格处理器。BebopNet 等模型从爵士乐和弦中生成旋律，因为这种风格在和声环境中带来了额外的挑战。",[39316,68311,68313],{"id":68312},"_34-风格转换与风格转换","3.4 风格转换与风格转换",[13,68315,68316],{},"在音乐中，一种风格或流派被定义为从音乐理论到声音设计的复杂混合特征。这些特征包括音色、作曲过程和乐曲中使用的乐器或合成音乐的效果。由于有很多音乐流派，而其中一些流派缺乏数据集，因此通常使用风格转换技术，通过改变现有音符的音高或添加适合我们想要转换音乐的风格的新乐器，将确定风格的音乐转换为其他风格。",[13,68318,68319],{},"在基于计算机的音乐创作中，在音乐中进行风格转换的最常见技术是获得风格的嵌入，并使用该嵌入或特征向量来生成新音乐。2016 年，Gatys 等人引入了 NNs 中的风格转移。其想法是将风格特征应用于另一幅图像中的图像。2018 年的 MIDI-VAE 是最早将风格转移用于符号音乐生成的研究之一。MIDI-VAE 将潜在空间中的风格编码为音高、动态和乐器特征的组合，以生成复调音乐。风格迁移也可以通过迁移学习来实现。第一个使用迁移学习进行风格迁移的工作是 Hung 等人在 2019 年提出的爵士乐的递归 VAE 模型。迁移学习是通过在源数据集上训练模型来完成的，然后在目标数据集上微调得到的模型参数，这些参数可以采用与源数据集不同的风格。该模型表明，使用迁移学习将一首确定风格的音乐作品转换为另一首是一个很好的解决方案，因为它不仅可以用于将现有作品转换为新的流派，还可以用于从头开始创作当今使用的音乐创作数据集中不存在的流派的音乐。这方面的一个例子可以是使用使用大型流行数据集（如 Lakh MIDI 数据集（LMD））训练的 NN，并使用该预训练模型通过迁移学习生成城市音乐。",[13,68321,68322],{},"其他音乐特征，如和声和纹理（见图 2）也被用作风格转移特征。也有人研究了融合流派模型，其中不同的风格被混合以生成未知风格的音乐。",[7759,68324,68326],{"id":68325},"_4-仪器和编排","4 仪器和编排",[13,68328,68329],{},"正如我们在第 2 节中提到的，乐器和编排是正在创作的音乐流派中的基本元素，并且可以通过使用特定的乐器或编排作品的方式来代表每个作曲家的特征。一个例子是贝多芬在交响乐中使用的编排，它改变了音乐的创作方式。乐器是研究如何将相似或不同的乐器以不同的数量组合在一起，以创建合奏。编排是对得分相似或不同部分的选择和组合。由此，我们可以将乐器作为作品的颜色，将编排与作品的美学方面联系起来。乐器和编排对我们感知音乐的方式以及音乐的情感部分都有巨大的影响，但是，尽管它们代表了音乐的基本部分，但情感超出了这部作品的范围。",[39316,68331,68333],{"id":68332},"_41-从复调音乐到多乐器音乐的生成","4.1 从复调音乐到多乐器音乐的生成",[13,68335,68336],{},"在基于计算机的音乐创作中，我们可以将乐器和编排概念组合在多乐器或多音轨音乐中。然而，用于多仪器生成的基于 DL 的模型并不完全符合这些概念。基于多乐器 DL 的模型为多个乐器生成复调音乐，但是，生成的音乐是否遵循连贯的和声进程？由此产生的编曲在乐器和编排方面是连贯的，还是基于 DL 的模型只是生成多乐器音乐而不考虑每个乐器或编曲的特色？在第 3 节中，我们展示了复调音乐的产生可以创作出具有一定和声感的音乐，但在面对多乐器音乐时，最重要的一个方面是要考虑乐器和合奏的特色。决定合奏中有多少和哪些乐器，以及如何在它们之间划分旋律和伴奏，是 DL 音乐生成中尚未解决的问题。近年来，构建从头开始生成音乐的 DL 模型面临着这一挑战，这些模型可以是人类可以选择合奏乐器的交互式模型。还有一些模型可以修复仪器或棒材。我们描述了这些模型，并回答了第 4.2 节中暴露的问题。在图 4 中，我们展示了具有多乐器生成模型的类似输出的乐谱的音乐基本原理的方案。",[13,68338,68339],{},[617,68340],{"alt":68341,"src":25773},"图 4 多仪器生成模型的类输出分数方案",[39316,68343,68345],{"id":68344},"_42-从零开始多仪器生成","4.2 从零开始多仪器生成",[13,68347,68348],{},"第一个可以生成多音轨音乐的模型已经被广泛提出。在多音轨音乐生成之前，一些模型为给定的旋律或和弦生成鼓音轨。这些模型的一个例子是 Kang 等人在 2012 年提出的模型。该模型用自动鼓发生器以给定的比例伴随旋律。后来，在 2017 年，Chu 等人使用分层 RNN 生成了有鼓的流行音乐。",[13,68350,68351],{},"音乐生成中最常用的架构之一是生成模型，如 GANs 和 VAE。2017 年推出的 MuseGAN 是第一个被考虑和最知名的多音轨音乐生成模型。然后，更多的模型实现了多仪器生成任务，并在 2020 年晚些时候发布了基于自动编码器的其他模型，如 MusAE。最近用于生成音乐的另一大类 NN 架构是 Transformers。最著名的 Transformer 音乐生成模型是钢琴复调音乐生成的 Music Transformer。2019 年，Donahue 等人提出了用于多音轨音乐生成的 LakhNES，2020 年，Ens 等人提出了一种条件多音轨音乐产生模型（MMM），该模型基于 LakhNES，并通过将多个音轨连接成单个序列来改进该先前模型的令牌表示。该模型使用 MultiInstrument 和 BarFill 表示，如图 5 所示。在图 5 中，我们展示了 MultiInstrument 表示，它包含 MMM 模型用于生成音乐的令牌，以及用于修复的 BarFill 表示，即生成一个小节或几个小节，但保持作品的其余部分。",[13,68353,68354],{},[617,68355],{"alt":68356,"src":25788},"图 5 MMM 令牌表示",[13,68358,68359],{},"从作曲过程的角度来看，这些模型不是编排或乐器化的，而是从头开始或通过修复来创作音乐。这意味着这些模型不选择乐器的数量，也不生成与所选乐器相关的高质量旋律或伴奏内容。例如，MMM 模型为遵循乐器音色特征的预定义乐器生成旋律内容，但当在保留其他曲目的同时修复或重新创建单个乐器时，有时很难遵循其他乐器的组成键。这使我们得出结论，用于音乐生成的多乐器模型专注于端到端的生成，但在乐器或编排方面仍然不能很好地工作，因为它们仍然无法决定生成的音乐中的乐器数量。他们为他们训练的合奏生成音乐，如 LakhNES，或者他们采用预定义的曲目来生成每个曲目的内容。最近的模型，如 MMM，在多乐器生成方面打开了人类和人工智能之间的互动，这将允许更好地跟踪人类的作曲过程，从而改进使用多乐器生成的音乐。",[7759,68361,68363],{"id":68362},"_5-评估和指标","5 评估和指标",[13,68365,68366],{},"音乐生成中的评价可以根据测量 DL 模式的输出的方式来划分。Ji 等人区分了客观评价和主观评价。在音乐中，有必要从主观的角度来衡量结果，因为这是一种评估类型，告诉我们与人类创造力相比，模型带来了多少创造力。有时，计算模型结果指标的客观评估可以让我们了解这些结果的质量，但很难找到将其与创造力概念联系起来的方法。在本节中，我们将展示最先进的模型如何从客观和主观的角度衡量其结果的质量。",[39316,68368,68370],{"id":68369},"_51-客观评价","5.1 客观评价",[13,68372,68373],{},"客观评估使用一些数字度量来衡量模型的性能及其输出的质量。在音乐生成中，存在比较为不同目的训练的模型和使用不同数据集训练的模型的问题，因此我们对最先进的模型中使用的最常见的度量进行了描述。Ji 等人通过区分模型度量和音乐度量或描述性统计，以及其他方法，如模式重复或剽窃检测。",[13,68375,68376],{},"当你想衡量一个模型的性能时，根据用于生成音乐的 DL 模型，最常用的指标是：loss 损失、perplexity 混淆、 BLEU 分数、precision 精度（P）、recall 回忆（R）或 F-core（F1）。通常，这些度量用于比较为相同目的构建的不同 DL 模型。",[13,68378,68379],{},"损失通常用于从数学角度显示模型的输入和输出之间的差异，而另一方面，混淆告诉我们一个模型具有的泛化能力，这更多地与模型如何生成新音乐有关。例如，音乐转换器使用损失和混淆来比较不同转换器架构之间的输出，以验证模型，TonicNet 仅将损失用于相同的目的，MusicVAE 仅使用指示模型具有的重建质量的度量，但是不使用任何度量来在其他 DL 音乐生成模型之间进行比较。",[13,68381,68382],{},"关于与音乐特别相关的指标，即考虑音乐描述符的指标，我们可以发现这些指标有助于衡量作品的质量。根据 Ji 等人，这些指标可以分为四类：音高相关、节奏相关、和声相关和风格转移相关。音高相关指标，如音阶一致性、音调误差音、空小节比率或使用的音高类别数量，是衡量音高属性的指标。节奏相关指标考虑了音符的持续时间或模式，例如，节奏变化、同时出现的三个或四个音符的数量或重复音高的持续时间。和声相关指标测量和弦的熵、距离或覆盖范围。这三个度量类别被 MuseGAN、C-RNN-GAN 或 JazzGAN 等模型使用。最后，与风格转换相关的技术有助于了解迭代与所需风格的距离有多近或多远。其中包括风格契合、内容保留或转移强度。",[39316,68384,68386],{"id":68385},"_52-主观评价","5.2 主观评价",[13,68388,68389],{},"主观观点决定了生成的音乐在创造力和新颖性方面的表现，也就是说，生成的音乐可以在多大程度上被视为艺术。虽然艺术涉及创造力和美学。Sternberg 和 Kaufman 将创造力定义为做出新颖且适合任务的贡献的能力，通常带有附加的成分，如高质量的、令人惊讶的或有用的。创造力需要对音乐知识的本质和使用有更深入的理解。根据 Ji 等人的说法，音乐质量的定量评估与人类判断之间缺乏相关性，这意味着音乐生成模型也必须从主观角度进行评估，这将使我们深入了解模型的创造性。主观评价中最常用的方法是听力测试，它通常由人类来区分机器生成的音乐和人类创造的音乐。这种方法被称为图灵测试，用于测试 DeepBach。在这个模型中，来自不同音乐体验群体的 1.272 人参加了测试。该测试表明，模型越复杂，输出就越好。MusicVAE 还进行了听力测试和 Kruskal-Wallis H-test，以验证模型的质量，得出的结论是，使用分层解码器时，模型表现更好。MuseGAN 还对 144 名用户进行了听力测试，他们被分为具有不同音乐体验的小组，但用户必须在 1-5 个范围内投票决定一些预先定义的问题：和声、节奏、结构、连贯性和整体评分。",[13,68391,68392],{},"其他收听方法需要对生成的音乐进行评分，这被称为并排评分。根据模型的生成目标，还可以向听众询问一些关于模型的创造性或生成作品的自然性等问题。在听力测试中需要记住的一件重要的事情是选择参加测试的人群的可变性（如果听众是具有音乐理论基础知识的音乐学生，如果他们是业余爱好者，因此他们没有任何音乐知识，或者如果他们是专业音乐家）。听众必须有相同的刺激，也必须听相同的片段，并有相同的人类创造的片段作为参考（如果适用的话）。听觉疲劳也必须考虑在内，因为如果长时间听类似的样本，听众可能会产生偏见。",[13,68394,68395],{},"话虽如此，我们可以得出结论，当涉及到音乐生成时，听力测试是必不可少的，因为它可以反馈模型的质量，而且它们也可以是找到正在研究的更好的 NN 架构或 DL 模型的一种方法。",[7759,68397,68399],{"id":68398},"_6-讨论","6 讨论",[13,68401,68402],{},"我们已经证明，音乐是一种结构化的语言模型，具有时间和和声的短期和长期关系，需要深入了解其所有见解才能建模。这一点，加上音乐中存在的各种流派和子流派，以及创作一首音乐作品所遵循的大量创作策略，使 DL 音乐生成领域成为一个不断发展和具有挑战性的领域。在描述了音乐创作过程和 DL 最近为音乐生成所做的工作后，我们现在将讨论第 1.3 节中提出的问题。",[39316,68404,68406],{"id":68405},"目前的dl模型是否能够产生具有一定创造力的音乐","目前的DL模型是否能够产生具有一定创造力的音乐？",[13,68408,68409],{},"使用 DL 生成音乐的第一个模型使用了诸如 LSTM 之类的 RNN。这些模型可以生成注释，但在生成长期序列时失败了。这是因为这些 NN 没有处理音乐生成所需的长期序列。为了解决这个问题，并能够通过插入两个现有的基序或从分布中采样来生成短基序，创建了 MusicVAE。但由此产生了一些问题：现有主题之间的插值是否会在同一首音乐中产生有意义的高质量主题？如果我们使用 MusicVAE 来创建一个简短的主题，我们可以获得非常好的结果，但如果我们使用这种模型来生成与输入相似的较长短语或主题，这些插值可能会输出具有美感的主题，但有时它们不遵循输入所具有的任何节奏或音符方向（上升或下降）模式。因此，这些插值通常无法生成高质量的主题，因为模型不了解节奏模式和音符方向。此外，和弦进行通常有倒置，古典音乐中有规则，流行音乐、爵士乐或城市音乐中有风格限制，这些规则决定了每个和弦后面是另一个和弦。如果我们分析 DL 方法生成的复调旋律，则在和声内容方面缺乏质量，因为被训练来生成音乐的神经网络无法理解音乐语言中存在的所有这些复杂性，或者因为这些信息应该作为输入的一部分（例如作为令牌）传递给神经网络。",[39316,68411,68413],{"id":68412},"使用-dl-进行音乐创作的最佳-nn-架构是什么","使用 DL 进行音乐创作的最佳 NN 架构是什么？",[13,68415,68416],{},"Transformer 架构已经与不同的注意力机制一起使用，这些机制允许对更长的序列进行建模。这方面的一个例子是 MMM 模型的成功，该模型使用 GPT-2 生成多音轨音乐。尽管该模型使用了预先训练的 Transformer 来生成文本，但它在和声和节奏方面生成了连贯的音乐。其他架构使用生成网络，如 GANs 或 VAE，以及这些架构中的 Transformers。这些模型的发展提高了提取高级音乐属性的可能性，如风格和在潜在空间中组织的低级特征。然后，这个潜在空间被用来在这些特征和属性之间进行插值，以基于现有作品和音乐风格生成新的音乐。",[13,68418,68419],{},"通过分析过去几年中使用 DL 生成音乐的神经网络模型和架构，没有一种特定的神经网络架构能更好地实现这一目的，因为可以用于构建音乐生成模型的最佳神经网络架构将取决于我们想要获得的输出。尽管如此，正如该领域的最新作品所表明的那样，Transformers 和 Generative 模型正在成为目前最好的替代品。两种模型的组合也是执行音乐生成的一个很好的选择，尽管这取决于我们想要生成的输出，有时最佳解决方案来自 DL 与概率方法的组合。另一个需要考虑的方面是，通常，音乐生成需要具有大量参数和数据的模型。我们可以通过将预先训练的模型作为我们在前几节中描述的一些最先进的模型来解决这个问题，然后对另一个 NN 架构进行微调。另一种选择是拥有一个预训练的潜在空间，该空间是通过像 MusicVAE 提出的那样用巨大的数据集训练一个大模型来生成的，然后利用预训练的潜伏空间训练一个数据较少的较小 NN，以调节音乐作品的风格，正如 MidiMe 提出的。",[39316,68421,68423],{"id":68422},"端到端的方法能生成完整的结构化音乐片段吗","端到端的方法能生成完整的结构化音乐片段吗？",[13,68425,68426],{},"正如我们在第 3.2 节中所描述的，现在有一些基于结构模板的模型可以生成结构化音乐，但还没有一种端到端的方法可以创作结构化音乐作品。人类作曲家遵循的音乐创作过程类似于这种基于模板的方法。在不久的将来，人工智能很可能从头开始创作结构化音乐，但这里的问题是，用于音乐生成的人工智能模型是否会被用来从头开始创作整个音乐作品，或者这些模型是否会更有用，作为作曲家的辅助，从而作为人类与人工智能之间的互动。",[39316,68428,68430],{"id":68429},"带有-dl-的作曲作品只是对输入的模仿吗还是-nn-可以生成训练数据中不存在的风格的新音乐","带有 DL 的作曲作品只是对输入的模仿吗？还是 NN 可以生成训练数据中不存在的风格的新音乐？",[13,68432,68433],{},"当训练 DL 模型时，传递给 NN 的输入中的一些信息可以在输出中不做任何修改的情况下出现。即便如此，MusicVAE 和其他用于音乐生成的 DL 模型表明，新音乐可以在不模仿现有音乐或抄袭的情况下创作。模拟输入可能是过拟合的情况，这从来不是 DL 模型的目标。还应该考虑到，由于一首音乐中可能出现的乐器、音调、节奏或和弦种类繁多，在音乐的生成过程中很难进行剽窃。",[39316,68435,68437],{"id":68436},"神经网络应该像人类一样遵循同样的逻辑和过程来创作音乐吗","神经网络应该像人类一样遵循同样的逻辑和过程来创作音乐吗？",[13,68439,68440],{},"我们发现，研究人员开始构建可以生成复调旋律的模型，但这些旋律在几小节后没有遵循任何方向。当 MusicVAE 问世时，可以生成高质量的主题，这鼓励了新的研究，利用过去的时间步长信息生成旋律。新的模型，如扩散模型，正在使用这种预先训练的模型来生成更长的序列，让旋律遵循模式或方向。我们还表明，有一些模型可以通过和弦进行来调节旋律，这是以流行音乐等风格创作音乐的方式。将人类的作曲方式与用于生成音乐的 DL 架构进行比较，我们可以看到这两个过程的一些相似之处，特别是在自回归模型中。自回归（AR）包括从过去的事件中预测未来的值。一些 DL 方法是自回归的，新模型试图通过获取过去时间步长的信息来生成更长的序列，这一事实类似于人类创作古典音乐的过程。",[39316,68442,68444],{"id":68443},"用于音乐生成的-dl-模型需要多少数据","用于音乐生成的 DL 模型需要多少数据？",[13,68446,68447],{},"如果我们看看最先进的模型，这个问题可以得到部分回答。MusicVAE 使用 LMD，有 370 万首旋律、460 万个鼓型和 11.6 万个三重奏。Music Transformer 只使用了钢琴 e-Competition 中的 1.100 首钢琴作品来训练模型。其他模型，如 MMM，采用 GPT-2，这是一个预训练的具有大量文本数据的 Transformer。这让我们肯定，用于音乐生成的 DL 模型确实需要大量数据，特别是在训练生成模型或 Transformers 时，但采用预先训练的模型并进行迁移学习也是一个很好的解决方案，特别是对于符号音乐生成的实际数据集中没有表示的音乐流派和子流派。",[39316,68449,68451],{"id":68450},"目前的评估方法是否足以比较和衡量创作音乐的创造力","目前的评估方法是否足以比较和衡量创作音乐的创造力？",[13,68453,68454],{},"正如我们在第 5 节中所描述的，有两种评估类别：客观评估和主观评估。现有方法之间的客观评价指标相似，但缺乏通用的主观评价方法。听力测试是最常用的主观评估方法，但有时图灵测试只要求区分基于计算机的作文和人类作文，不足以了解神经网络创作的作文的所有特征。该问题的解决方案是，如 MuseGAN 所提出的，提出与图 2 中所示的音乐特征的质量相关的一般问题，并在 DL 模型中使用相同的问题和相同的评级方法来设置一般的主观评估方法。",[7759,68456,68458],{"id":68457},"_7-结论和未来工作","7 结论和未来工作",[13,68460,68461],{},"在本文中，我们概述了用于 DL 音乐生成的神经网络架构，描述了 DL 音乐生成中的最新技术，并讨论了在音乐生成中使用深度神经网络仍然存在的挑战。",[13,68463,68464],{},"使用 DL 架构和技术生成音乐（以及其他艺术内容）是一个不断增长的研究领域。然而，也存在一些悬而未决的挑战，比如生成有结构的音乐，分析生成音乐的创造力，以及建立可以帮助作曲家的互动模型。未来的工作应该专注于更好地建模长期关系（在时间轴和和声轴上），以便生成结构良好、和谐的音乐，在几小节后不会变得松散，以及修复或人工智能交互，这是近年来人们越来越感兴趣的任务。还有一个悬而未决的挑战与迁移学习或风格生成的条件有关，这使得大多数最先进的作品只关注相同的音乐风格，而不仅仅局限于公开数据集中的相同作者和流派，如 JSB Chorales 数据集或 Lakh MIDI 数据集。当涉及到多乐器的生成时，这项任务并不遵循人类的作曲过程，看到新的 DL 模型可能会很有趣，它们首先创作出高质量的旋律内容，然后自己或在人类的帮助下决定乐曲的乐器数量，并能够为每种乐器创作出符合其音色特征的高质量音乐。与 DL 音乐生成应该关注的方向有关的进一步问题，即建立可以从头开始生成高创意音乐的端到端模型，或者作曲家可以与人工智能交互的交互模型，是未来将要解决的任务，尽管人类与人工智能交互的趋势每天都在加快。",[13,68466,68467],{},"在使用 DL 的音乐创作中，还有更多悬而未决的问题不在本文的范围内。如果 NNs 是用受版权保护的音乐训练的，那么谁拥有 DL 生成的音乐的知识产权等问题。我们认为这将是商业应用中的一个重要关键。这里的主要关键是定义是什么使一个作品与其他作品不同，有几个特征在这里起着重要作用。正如我们在第 1 节中提到的，这些特征包括作品本身，也包括音色和用于创造乐器声音的效果。从作曲的角度来看，这是我们的研究范围，我们可以指出，当用 DL 生成音乐时，总是有可能生成与输入相似的音乐，有时生成的音乐具有直接取自输入的模式，因此必须从音乐理论的角度在这一领域进行进一步的研究，知识产权和科学，以定义是什么使作品与其他作品不同，以及如何注册 DL 生成的音乐。",[13,68469,68470],{},"我们希望本文中的分析将有助于更好地理解问题和可能的解决方案，从而为基于深度学习的音乐生成的整体研究议程做出贡献。",{"title":119,"searchDepth":144,"depth":144,"links":68472},[68473,68474,68475,68476,68477,68483,68484,68490,68494,68498,68507],{"id":68085,"depth":144,"text":68086},{"id":68089,"depth":144,"text":68090},{"id":68093,"depth":144,"text":68094},{"id":68112,"depth":144,"text":68112},{"id":68121,"depth":144,"text":68122,"children":68478},[68479,68480,68481,68482],{"id":68131,"depth":150,"text":68132},{"id":68141,"depth":150,"text":68142},{"id":68199,"depth":150,"text":68200},{"id":68209,"depth":150,"text":68210},{"id":68216,"depth":144,"text":68217},{"id":68261,"depth":144,"text":68262,"children":68485},[68486,68487,68488,68489],{"id":68273,"depth":150,"text":68274},{"id":68289,"depth":150,"text":68290},{"id":68299,"depth":150,"text":68300},{"id":68312,"depth":150,"text":68313},{"id":68325,"depth":144,"text":68326,"children":68491},[68492,68493],{"id":68332,"depth":150,"text":68333},{"id":68344,"depth":150,"text":68345},{"id":68362,"depth":144,"text":68363,"children":68495},[68496,68497],{"id":68369,"depth":150,"text":68370},{"id":68385,"depth":150,"text":68386},{"id":68398,"depth":144,"text":68399,"children":68499},[68500,68501,68502,68503,68504,68505,68506],{"id":68405,"depth":150,"text":68406},{"id":68412,"depth":150,"text":68413},{"id":68422,"depth":150,"text":68423},{"id":68429,"depth":150,"text":68430},{"id":68436,"depth":150,"text":68437},{"id":68443,"depth":150,"text":68444},{"id":68450,"depth":150,"text":68451},{"id":68457,"depth":144,"text":68458},{},"Paper Reading\u002F2. MUSIC COMPOSITION WITH DEEP LEARNING A REVIEW\u002FMUSIC COMPOSITION WITH DEEP LEARNING A REVIEW.md","\u002Fundergraduate\u002Fnote-83eac7c581f6",{"title":68077,"description":119},"undergraduate\u002Fnote-83eac7c581f6",[14541,7744,246,6380,14542],"ahzTGmtjNQo6hGxgt3XTUDT1g4HAAQbtdpA1uAJkRe0",{"id":68516,"title":68517,"assetBase":239,"author":8,"body":68518,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":71062,"navigation":128,"originalPath":71063,"path":71064,"seo":71065,"source":23330,"stem":71066,"tags":71067,"weight":250,"__hash__":71068},"content\u002Fundergraduate\u002Fnote-83fb8e873e7f.md","Spark从0到1（上）",{"type":10,"value":68519,"toc":71038},[68520,68523,68535,68539,68543,68557,68562,68567,68571,68575,68592,68596,68610,68614,68634,68638,68642,68645,68649,68652,68657,68661,68663,68667,68670,68674,68677,68681,68685,68699,68703,68706,68710,68714,68719,68722,68725,68739,68742,68747,68750,68753,68761,68766,68769,68774,68777,68781,68784,68787,68791,68795,68809,68811,68815,68819,68823,68826,68860,68863,68868,68872,68875,68878,68885,68936,68940,68943,68957,68961,68965,68978,68982,68985,68990,69070,69075,69110,69115,69157,69162,69167,69216,69221,69229,69279,69284,69323,69327,69330,69335,69360,69365,69393,69398,69431,69436,69465,69469,69475,69481,69486,69490,69621,69625,69629,69639,69643,69815,69819,69826,69829,69834,69972,69976,69980,69983,69987,69995,69999,70004,70012,70017,70025,70029,70033,70036,70039,70043,70046,70050,70061,70063,70067,70071,70076,70079,70082,70102,70105,70110,70114,70140,70144,70148,70155,70158,70162,70166,70169,70197,70201,70204,70210,70214,70217,70220,70234,70238,70241,70401,70405,70411,70414,70477,70481,70484,70527,70531,70536,70541,70620,70624,70628,70631,70634,70637,70643,70647,70670,70674,70679,70687,70692,70706,70711,70724,70728,70732,70736,70743,70750,70755,70826,70833,70838,70841,71003,71007,71036],[4517,68521,68517],{"id":68522},"spark从0到1上",[72,68524,68525,68529,68532],{},[13,68526,68527],{},[22,68528,23957],{},[13,68530,68531],{},"这是结合书本和尚硅谷大数据课程的综合Spark入门文档，去除了大部分实操过程以追求在理论上一文解决所有疑惑。原书的第二章是Scala基础编程，但是如果真的想要使用Scala进行Spark工程开发的话，建议去单独学习下Scala（很多语言特性还是比较有意思的）。所以Scala的部分并不在《Spark从0到1》这篇文档中，之后会单独开一篇文档记录Scala的语言及面试重点。",[13,68533,68534],{},"由此，开始这篇文档默认已经入门Scala了。内容过多会分为上下两部分，上部分主要介绍Spark Core和Spark SQL，下部分主要介绍Spark的其他生态，主要是Streaming，GraphX和MLlib酌情考虑。",[107,68536,68538],{"id":68537},"第一章-spark概述","第一章 Spark概述",[7759,68540,68542],{"id":68541},"_1spark是什么","1、Spark是什么？",[49,68544,68545,68548,68551,68554],{},[52,68546,68547],{},"Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎",[52,68549,68550],{},"Spark Core 中提供了 Spark 最基础与最核心的功能",[52,68552,68553],{},"Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL，用户可以使用SQL 或者 Apache Hive 版本的 SQL 方言（HQL）来查询数据。",[52,68555,68556],{},"Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件，提供了丰富的处理数据流的 API。",[13,68558,68559],{},[22,68560,68561],{},"Spark 出现的时间相对较晚，并且主要功能主要是用于数据计算，所以其实 Spark 一直被认为是 Hadoop 框架的升级版。",[13,68563,68564],{},[22,68565,68566],{},"Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据通信是基于内存，而 Hadoop 是基于磁盘。",[7759,68568,68570],{"id":68569},"_2spark与mapreduce","2、Spark与MapReduce",[10548,68572,68574],{"id":68573},"_1mapreduce的局限性","（1）MapReduce的局限性",[49,68576,68577,68580,68583,68589],{},[52,68578,68579],{},"**仅支持Map和Reduce 两种操作。**数据处理流程中的每一步都需要一个Map阶段和一个Reduce阶段，如果要利用这一解决方案，需要将所有用例都转换成MapReduce模式。",[52,68581,68582],{},"**处理效率低。**Map中间结果写磁盘，Reduce中间结果写HDFS，多个MapReduce之间通过 HDFS交换数据，任务调度和启动开销大。开销具体表现在如下几方面：客户端需要把应用程序提交给ResourcesManager，ResourcesManager 去选择节点运行；当Map任务和Reduce 任务被ResourcesManager 调度的时候，会先启动一个container 进程，然后让任务运行起来，每一个任务都要经历Java虚拟机的启动、销毁等流程。",[52,68584,68585,68586,67],{},"Map 和Reduce 均需要排序，但是因为有的任务处理完全不需要排序（比如求最大值和最小值等），所以就造成了",[22,68587,68588],{},"低效的性能",[52,68590,68591],{},"不适合做迭代计算（如机器学习、图计算等）、交互式处理（如数据挖掘）和流式处理（如日志分析）",[10548,68593,68595],{"id":68594},"_2spark解决mapreduce的不足","（2）Spark解决MapReduce的不足",[49,68597,68598,68601,68604,68607],{},[52,68599,68600],{},"Spark可以基于内存也可以基于磁盘做迭代计算",[52,68602,68603],{},"Spark所处理的数据可以来自任何一种存储介质，如关系数据库、本地文件系统、分布式存储等",[52,68605,68606],{},"Spark装在需要处理的数据至内存，并将这些数据集抽象为RDD（弹性分布式数据集）对象，然后采用一系列RDD操作处理RDD，并将处理好的结果以RDD的形式输出到内存，以数据流的方式持久化写入其他存储介质中。",[52,68608,68609],{},"Spark使用Scala语言作为编程语言，它是一种面向对象、函数式编程语言，能够像操作本地集合一样轻松地操作分布式数据集。",[10548,68611,68613],{"id":68612},"_3spark优点","（3）Spark优点",[49,68615,68616,68622,68628],{},[52,68617,68618,68621],{},[22,68619,68620],{},"运行速度快","：Spark 基于磁盘做迭代计算比基于磁盘做迭代计算的MapReduce 快十余倍；Spark 基于内存做迭代计算则比基于磁盘做迭代计算的MapReduce快100倍以上。Spark实现了高效的DAG执行引擎，可以通过内存计算来高效处理数据流。",[52,68623,68624,68627],{},[22,68625,68626],{},"易用性好","：Spark 支持Java、Python、Scala等语言，支持80多种高级算法，可以使用户快速构建不同的应用。Spark 支持交互式的Python 和 Scala的shell，这意味着可以非常方便地在这些 shel中使用Spark集群来验证解决问题的方法，而不像以前，需要打包、上传集群、验证等。",[52,68629,68630,68633],{},[22,68631,68632],{},"通用性强","：Spark可用于批处理、交互式查询（通过SparkSQL组件）、实时流处理（通过Spark Streaming 组件）、机器学习（通过Spark MLJib缅件）和图计算（通过Spark GraphX组件）。④兼容性：Spark可以使用 Hadoop的YARN作为它的资源管理和调度器。Spark也可以不依赖于第三方的资源管理和调度器，它实现了Standalone 作为其内置的资源管理和调度框架，能够读取 HDFS、Cassandra、HBase、S3和Techyon中的数据。",[7759,68635,68637],{"id":68636},"_3spark核心模块","3、Spark核心模块",[10548,68639,68641],{"id":68640},"_1spark-core","（1）Spark Core",[13,68643,68644],{},"Spark Core 中提供了 Spark 最基础与最核心的功能，Spark 其他的功能如：Spark SQL，Spark Streaming，GraphX, MLlib 都是在 Spark Core 的基础上进行扩展的",[10548,68646,68648],{"id":68647},"_2spark-sql","（2）Spark SQL",[13,68650,68651],{},"Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL，用户可以使用 SQL或者 Apache Hive 版本的 SQL 方言（HQL）来查询数据。",[72,68653,68654],{},[13,68655,68656],{},"Hive On Spark",[10548,68658,68660],{"id":68659},"_3spark-streaming","（3）Spark Streaming",[13,68662,68556],{},[10548,68664,68666],{"id":68665},"_4spark-mllib","（4）Spark MLlib",[13,68668,68669],{},"MLlib 是 Spark 提供的一个机器学习算法库。MLlib 不仅提供了模型评估、数据导入等额外的功能，还提供了一些更底层的机器学习原语。",[10548,68671,68673],{"id":68672},"_5spark-graphx","（5）Spark GraphX",[13,68675,68676],{},"GraphX 是 Spark 面向图计算提供的框架与算法库。",[7759,68678,68680],{"id":68679},"_4spark执行流程运行机制","4、Spark执行流程（运行机制）",[10548,68682,68684],{"id":68683},"_1简单概念","（1）简单概念",[49,68686,68687,68690,68693,68696],{},[52,68688,68689],{},"作业（Job)：一个应用程序以RDD行动操作(Action）为划分边界往往会产生多个作业。Spark对RDD采用情性求解机制，对RDD的创建和转换并不会立即执行，只有在遇到行动操作时才会生成一个作业，然后统一调度执行。一个作业包含多个RDD及作用于相应RDD上的各种操作。一个作业会被拆分为多组任务，每组任务被称为阶段（Stage)，或者被称为任务集(TaskSet）。",[52,68691,68692],{},"阶段（Stage)：一个作业会被拆分为多组任务，每组任务被称为阶段（Stage)，或者被称为任务集(TaskSet）。",[52,68694,68695],{},"任务集（TaskSet）：任务集是任务的集合，一个阶段创建一个任务集，阶段的每个RDD分区被创建为一个任务，多个任务封装形成任务集。",[52,68697,68698],{},"有向无环图（Directed Acycle graph)：有向无环图反映RDD之间的依赖关系。",[10548,68700,68702],{"id":68701},"_2运行架构","（2）运行架构",[13,68704,68705],{},"Spark 框架的核心是一个计算引擎，整体来说，它采用了标准 master-slave 的结构。图形中的 Driver 表示 master，负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave，负责实际执行任务。",[13,68707,68708],{},[617,68709],{"alt":119,"src":29434},[10548,68711,68713],{"id":68712},"_3核心组件","（3）核心组件",[13,68715,68716],{},[22,68717,68718],{},"Driver",[13,68720,68721],{},"Spark 驱动器节点，用于执行 Spark 任务中的 main 方法，负责实际代码的执行工作。",[13,68723,68724],{},"Driver 在 Spark 作业执行时主要负责：",[49,68726,68727,68730,68733,68736],{},[52,68728,68729],{},"将用户程序转化为作业（job）",[52,68731,68732],{},"在 Executor 之间调度任务(task)",[52,68734,68735],{},"跟踪 Executor 的执行情况",[52,68737,68738],{},"通过 UI 展示查询运行情况",[13,68740,68741],{},"实际上，我们无法准确地描述 Driver 的定义，因为在整个的编程过程中没有看到任何有关Driver 的字眼。所以简单理解，所谓的 Driver 就是驱使整个应用运行起来的程序，也称之为Driver 类。",[13,68743,68744],{},[22,68745,68746],{},"Executor",[13,68748,68749],{},"Spark Executor 是集群中工作节点（Worker）中的一个 JVM 进程，负责在 Spark 作业中运行具体任务（Task），任务彼此之间相互独立。Spark 应用启动时，Executor 节点被同时启动，并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃，Spark 应用也可以继续执行，会将出错节点上的任务调度到其他 Executor 节点上继续运行。",[13,68751,68752],{},"Executor 有两个核心功能：",[49,68754,68755,68758],{},[52,68756,68757],{},"负责运行组成 Spark 应用的任务，并将结果返回给驱动器进程",[52,68759,68760],{},"它们通过自身的块管理器（Block Manager）为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的，因此任务可以在运行时充分利用缓存数据加速运算。",[13,68762,68763],{},[22,68764,68765],{},"Master & Worker",[13,68767,68768],{},"Spark 集群的独立部署环境中，不需要依赖其他的资源调度框架，自身就实现了资源调度的功能，所以环境中还有其他两个核心组件：Master 和 Worker，这里的 Master 是一个进程，主要负责资源的调度和分配，并进行集群的监控等职责，类似于 Yarn 环境中的 ResourceManager，而Worker 则是进程，一个 Worker 运行在集群中的一台服务器上，由 Master 分配资源对数据进行并行的处理和计算，类似于 Yarn 环境中 NodeManager。",[13,68770,68771],{},[22,68772,68773],{},"ApplicationMaster",[13,68775,68776],{},"Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包含 ApplicationMaster，用于向资源调度器申请执行任务的资源容器 Container，运行用户自己的程序任务 job，监控整个任务的执行，跟踪整个任务的状态，处理任务失败等异常情况。说的简单点就是，ResourceManager（资源）和 Driver（计算）之间的解耦合靠的就是ApplicationMaster。",[10548,68778,68780],{"id":68779},"_4dagdirected-acycle-graph有向无环图","（4）DAG【Directed Acycle graph，有向无环图】",[13,68782,68783],{},"有向无环图，并不是真正意义的图形，而是由 Spark 程序直接映射成的数据流的高级抽象模型。简单理解就是将整个程序计算的执行过程用图形表示出来,这样更直观，更便于理解，可以用于表示程序的拓扑结构。",[13,68785,68786],{},"DAG 有向无环图是由点和线组成的拓扑图形，该图形具有方向，不会闭环。",[10548,68788,68790],{"id":68789},"_5应用执行的基本流程","（5）应用执行的基本流程",[13,68792,68793],{},[617,68794],{"alt":119,"src":33078},[49,68796,68797,68800,68803,68806],{},[52,68798,68799],{},"当一个Spark应用程序被提交时，首先需要为这个应用程序构建运行环境，即由驱动程序创建一个SparkContext 对象，SparkContext对象向集群资源管理器注册，之后SparkContext 对象负责和集群资源管理器进行通信以及进行资源申请、任务的分配和运行监控等，此外还包括申请运行执行器进程的资源。",[52,68801,68802],{},"集群资源管理器根据预先设定的算法，在资源池里为执行器进程分配合适的运行资源，并启动执行器进程。在运行过程中，执行器运行情况将随着心跳信息发送到资源管理。",[52,68804,68805],{},"SparkContext 对象根据RDD之间的依赖关系构建DAG图，然后提交给有向无环图调度器进行解析，将DAG图分解成多个阶段（每个阶段就是一个任务集），并计算出各Stage之间的依赖关系，然后把各个任务集提交给任务调度器进行处理。执行器进程向SparkCon text 对象申请任务，任务调度器将任务发放给执行器进程执行，同时SparkContext对象将应用程序代码发放给执行器进程，即将计算移到数据所在的节点上进行，移动计算比移动数据的网络开销要小得多。",[52,68807,68808],{},"Task在执行器进程上运行，把执行结果反馈给Task Scheduler，然后再反馈给有向无环图调度器。运行完毕后写入数据，SparkContext 对象向集群资源管理器注销并释放所有资源。",[23289,68810],{},[107,68812,68814],{"id":68813},"第二章-spark-core基于scala的spark编程","第二章  Spark Core：基于Scala的Spark编程",[7759,68816,68818],{"id":68817},"_1rdd","1、RDD",[10548,68820,68822],{"id":68821},"_1什么是rdd","（1）什么是RDD？",[13,68824,68825],{},"RDD（Resilient Distributed Dataset）叫做弹性分布式数据集，是 Spark 中最基本的数据处理模型。代码中是一个抽象类，它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。",[49,68827,68828,68845,68848,68851,68854,68857],{},[52,68829,68830,68831],{},"弹性",[49,68832,68833,68836,68839,68842],{},[52,68834,68835],{},"存储的弹性：内存与磁盘的自动切换；",[52,68837,68838],{},"容错的弹性：数据丢失可以自动恢复；",[52,68840,68841],{},"计算的弹性：计算出错重试机制；",[52,68843,68844],{},"分片的弹性：可根据需要重新分片。",[52,68846,68847],{},"分布式：数据存储在大数据集群不同节点上",[52,68849,68850],{},"数据集：RDD 封装了计算逻辑，并不保存数据",[52,68852,68853],{},"数据抽象：RDD 是一个抽象类，需要子类具体实现",[52,68855,68856],{},"不可变：RDD 封装了计算逻辑，是不可以改变的，想要改变，只能产生新的 RDD，在新的 RDD 里面封装计算逻辑",[52,68858,68859],{},"可分区、并行计算",[13,68861,68862],{},"传统的MapReduce虽然具有自动容错、负载均衡和可拓展性的优点，但其最大的缺点是在迭代计算的时候，要进行大量的磁盘I\u002FO操作，RDD正是为了解决这一缺点而出现的。",[13,68864,68865],{},[22,68866,68867],{},"RDD屏蔽了底层对数据的复杂抽象和处理，为用户提供了一组方便的数据转换与求值方法。",[10548,68869,68871],{"id":68870},"_2执行原理","（2）执行原理",[13,68873,68874],{},"从计算的角度来讲，数据处理过程中需要计算资源（内存 & CPU）和计算模型（逻辑）。 执行时，需要将计算资源和计算模型进行协调和整合。",[13,68876,68877],{},"Spark 框架在执行时，先申请资源，然后将应用程序的数据处理逻辑分解成一个一个的 计算任务。然后将任务发到已经分配资源的计算节点上, 按照指定的计算模型进行数据计 算。最后得到计算结果。",[49,68879,68880],{},[52,68881,68882],{},[22,68883,68884],{},"RDD在YARN环境中的工作原理",[8366,68886,68887,68897],{},[8369,68888,68889],{},[8372,68890,68891,68894],{},[8375,68892,68893],{"align":9247},"执行过程",[8375,68895,68896],{"align":9247},"示意图",[8386,68898,68899,68908,68917,68926],{},[8372,68900,68901,68904],{},[8391,68902,68903],{"align":9247},"（1）启动YARN集群环境",[8391,68905,68906],{"align":9247},[617,68907],{"alt":119,"src":30426},[8372,68909,68910,68913],{},[8391,68911,68912],{"align":9247},"（2）Spark申请资源调度节点和计算节点",[8391,68914,68915],{"align":9247},[617,68916],{"alt":119,"src":30562},[8372,68918,68919,68922],{},[8391,68920,68921],{"align":9247},"（3）Spark 框架根据需求将计算逻辑根据分区划分成不同的任务",[8391,68923,68924],{"align":9247},[617,68925],{"alt":119,"src":65400},[8372,68927,68928,68931],{},[8391,68929,68930],{"align":9247},"（4）调度节点将任务根据计算节点状态发送到对应的计算节点进行计算",[8391,68932,68933],{"align":9247},[617,68934],{"alt":119,"src":68935},"img\u002F2.4.png",[10548,68937,68939],{"id":68938},"_3创建rdd的方式","（3）创建RDD的方式",[13,68941,68942],{},"创建RDD的方式主要有两种：通过Spark应用程序中的数据集创建；使用本地及HDFS、HBase等外部存储系统上的文件创建。",[49,68944,68945,68948,68951,68954],{},[52,68946,68947],{},"使用数据集：通过并行化数据集合来创建RDD，就是通过调用SparkContext中的parallelize()方法并行化数据集到集群的节点上形成一个分布式的数据集合，然后就可以采用并行的方式来操作这个分布式数据集合。",[52,68949,68950],{},"使用文本文件：调用SparkContext的textFile()方法读取文件的位置即可创建RDD。textFile()支持针对目录、文本文件、压缩文件以及通配符匹配的文件进行RDD创建。",[52,68952,68953],{},"使用JSON文件；",[52,68955,68956],{},"使用CSV文件（后两种本质上都是textFile()对不同格式的读取）",[7759,68958,68960],{"id":68959},"_2rdd操作操作在一些地方又称为算子","2、RDD操作（操作在一些地方又称为算子）",[10548,68962,68964],{"id":68963},"_1转换操作行动操作","（1）转换操作&&行动操作",[49,68966,68967,68975],{},[52,68968,68969,68970],{},"转换操作：RDD的转换操作是返回新的RDD的操作，转换操作是惰性求值的，真正的转换发生在RDD的行动操作中，也就是说对于行动操作之前的所有转换操作，Spark只是记录下转换的轨迹，即相互之间的依赖关系，并不会触发真正的转换。",[49,68971,68972],{},[52,68973,68974],{},"RDD 根据数据处理方式的不同将算子整体上分为 Value 类型、双 Value 类型和 Key-Value 类型。",[52,68976,68977],{},"行动操作：行动操作是指向驱动器程序返回结果或把结果写入外部系统并触发实际计算的操作。行动操作接受RDD，但是返回一个非RDD，即输出一个结果值，并把结果值返回到驱动器的程序中。",[10548,68979,68981],{"id":68980},"_2常见的转换操作","（2）常见的转换操作",[13,68983,68984],{},"常见的RDD转换操作有map、filter、flatMap、groupByKey、reduceByKey等。",[49,68986,68987],{},[52,68988,68989],{},"map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD",[114,68991,68993],{"className":23406,"code":68992,"language":23408,"meta":119,"style":119},"\u002F\u002F 将处理的数据逐条进行映射转换，这里的转换可以是类型的转换，也可以是值的转换。\nval dataRDD: RDD[Int] = sparkContext.makeRDD(List(1,2,3,4))  \u002F\u002F 创建RDD数据结构\nval dataRDD1: RDD[Int] = dataRDD.map(\n   num => {\n       num * 2\n   }\n)  \u002F\u002F 值转换\nval dataRDD2: RDD[String] = dataRDD1.map(\n   num => {\n       \"\" + num\n   }\n)  \u002F\u002F 类型转换\n\n\u002F\u002F 输出结果：\n\u002F\u002F dataRDD1：2 4 6 8\n\u002F\u002F dataRDD2：2 4 6 8\n",[17,68994,68995,69000,69005,69010,69015,69020,69024,69029,69034,69038,69043,69047,69052,69056,69060,69065],{"__ignoreMap":119},[78,68996,68997],{"class":124,"line":125},[78,68998,68999],{},"\u002F\u002F 将处理的数据逐条进行映射转换，这里的转换可以是类型的转换，也可以是值的转换。\n",[78,69001,69002],{"class":124,"line":132},[78,69003,69004],{},"val dataRDD: RDD[Int] = sparkContext.makeRDD(List(1,2,3,4))  \u002F\u002F 创建RDD数据结构\n",[78,69006,69007],{"class":124,"line":138},[78,69008,69009],{},"val dataRDD1: RDD[Int] = dataRDD.map(\n",[78,69011,69012],{"class":124,"line":144},[78,69013,69014],{},"   num => {\n",[78,69016,69017],{"class":124,"line":150},[78,69018,69019],{},"       num * 2\n",[78,69021,69022],{"class":124,"line":156},[78,69023,51353],{},[78,69025,69026],{"class":124,"line":162},[78,69027,69028],{},")  \u002F\u002F 值转换\n",[78,69030,69031],{"class":124,"line":168},[78,69032,69033],{},"val dataRDD2: RDD[String] = dataRDD1.map(\n",[78,69035,69036],{"class":124,"line":174},[78,69037,69014],{},[78,69039,69040],{"class":124,"line":180},[78,69041,69042],{},"       \"\" + num\n",[78,69044,69045],{"class":124,"line":186},[78,69046,51353],{},[78,69048,69049],{"class":124,"line":192},[78,69050,69051],{},")  \u002F\u002F 类型转换\n",[78,69053,69054],{"class":124,"line":198},[78,69055,129],{"emptyLinePlaceholder":128},[78,69057,69058],{"class":124,"line":204},[78,69059,23628],{},[78,69061,69062],{"class":124,"line":210},[78,69063,69064],{},"\u002F\u002F dataRDD1：2 4 6 8\n",[78,69066,69067],{"class":124,"line":216},[78,69068,69069],{},"\u002F\u002F dataRDD2：2 4 6 8\n",[49,69071,69072],{},[52,69073,69074],{},"filter是对RDD中的每个元素都执行一个指定的函数，将返回值为true的元素组成一个新的RDD",[114,69076,69078],{"className":23406,"code":69077,"language":23408,"meta":119,"style":119},"\u002F\u002F 将数据根据指定的规则进行筛选过滤，符合规则的数据保留，不符合规则的数据丢弃。当数据进行筛选过滤后，分区不变，但是分区内的数据可能不均衡，生产环境下，可能会出现数据倾斜。\nval dataRDD = sparkContext.makeRDD(List(\n   1,2,3,4\n),1)\nval dataRDD1 = dataRDD.filter(_%2 == 0) \u002F\u002F 过滤掉 _%2 != 0 的元素\n\u002F\u002F dataRDD1: 2 4\n",[17,69079,69080,69085,69090,69095,69100,69105],{"__ignoreMap":119},[78,69081,69082],{"class":124,"line":125},[78,69083,69084],{},"\u002F\u002F 将数据根据指定的规则进行筛选过滤，符合规则的数据保留，不符合规则的数据丢弃。当数据进行筛选过滤后，分区不变，但是分区内的数据可能不均衡，生产环境下，可能会出现数据倾斜。\n",[78,69086,69087],{"class":124,"line":132},[78,69088,69089],{},"val dataRDD = sparkContext.makeRDD(List(\n",[78,69091,69092],{"class":124,"line":138},[78,69093,69094],{},"   1,2,3,4\n",[78,69096,69097],{"class":124,"line":144},[78,69098,69099],{},"),1)\n",[78,69101,69102],{"class":124,"line":150},[78,69103,69104],{},"val dataRDD1 = dataRDD.filter(_%2 == 0) \u002F\u002F 过滤掉 _%2 != 0 的元素\n",[78,69106,69107],{"class":124,"line":156},[78,69108,69109],{},"\u002F\u002F dataRDD1: 2 4\n",[49,69111,69112],{},[52,69113,69114],{},"flatMap是将函数应用于RDD中的每个元素，将返回的迭代器的所有内容构成新的RDD",[114,69116,69118],{"className":23406,"code":69117,"language":23408,"meta":119,"style":119},"\u002F\u002F 将处理的数据进行扁平化后再进行映射处理，所以算子也称之为扁平映射\nval dataRDD = sparkContext.makeRDD(List(\n   List(1,2),List(3,4)\n),1)\nval dataRDD1 = dataRDD.flatMap(\n   list => list\n)\n\u002F\u002F dataRDD1：1 2 3 4\n",[17,69119,69120,69125,69129,69134,69138,69143,69148,69152],{"__ignoreMap":119},[78,69121,69122],{"class":124,"line":125},[78,69123,69124],{},"\u002F\u002F 将处理的数据进行扁平化后再进行映射处理，所以算子也称之为扁平映射\n",[78,69126,69127],{"class":124,"line":132},[78,69128,69089],{},[78,69130,69131],{"class":124,"line":138},[78,69132,69133],{},"   List(1,2),List(3,4)\n",[78,69135,69136],{"class":124,"line":144},[78,69137,69099],{},[78,69139,69140],{"class":124,"line":150},[78,69141,69142],{},"val dataRDD1 = dataRDD.flatMap(\n",[78,69144,69145],{"class":124,"line":156},[78,69146,69147],{},"   list => list\n",[78,69149,69150],{"class":124,"line":162},[78,69151,8041],{},[78,69153,69154],{"class":124,"line":168},[78,69155,69156],{},"\u002F\u002F dataRDD1：1 2 3 4\n",[72,69158,69159],{},[13,69160,69161],{},"flatMap是非常常用的算子，它能将多维数据扁平化，比如说二维变为一维。常见在WordCount中，一句话被切分成多个词后使用flatMap进行展平。",[49,69163,69164],{},[52,69165,69166],{},"groupBy",[114,69168,69170],{"className":23406,"code":69169,"language":23408,"meta":119,"style":119},"\u002F\u002F 将数据根据指定的规则进行分组, 分区默认不变，但是数据会被打乱重新组合，我们将这样的操作称之为 shuffle。极限情况下，数据可能被分在同一个分区中\n\u002F\u002F 一个组的数据在一个分区中，但是并不是说一个分区中只有一个组\nval dataRDD = sparkContext.makeRDD(List(1,2,3,4),1)\nval dataRDD1 = dataRDD.groupBy(\n   _%2\n) \u002F\u002F 通过对2取余进行分区\n\u002F\u002F 输出结果：\n\u002F\u002F (0,CompactBuffer(2, 4))\n\u002F\u002F (1,CompactBuffer(1, 3))\n",[17,69171,69172,69177,69182,69187,69192,69197,69202,69206,69211],{"__ignoreMap":119},[78,69173,69174],{"class":124,"line":125},[78,69175,69176],{},"\u002F\u002F 将数据根据指定的规则进行分组, 分区默认不变，但是数据会被打乱重新组合，我们将这样的操作称之为 shuffle。极限情况下，数据可能被分在同一个分区中\n",[78,69178,69179],{"class":124,"line":132},[78,69180,69181],{},"\u002F\u002F 一个组的数据在一个分区中，但是并不是说一个分区中只有一个组\n",[78,69183,69184],{"class":124,"line":138},[78,69185,69186],{},"val dataRDD = sparkContext.makeRDD(List(1,2,3,4),1)\n",[78,69188,69189],{"class":124,"line":144},[78,69190,69191],{},"val dataRDD1 = dataRDD.groupBy(\n",[78,69193,69194],{"class":124,"line":150},[78,69195,69196],{},"   _%2\n",[78,69198,69199],{"class":124,"line":156},[78,69200,69201],{},") \u002F\u002F 通过对2取余进行分区\n",[78,69203,69204],{"class":124,"line":162},[78,69205,23628],{},[78,69207,69208],{"class":124,"line":168},[78,69209,69210],{},"\u002F\u002F (0,CompactBuffer(2, 4))\n",[78,69212,69213],{"class":124,"line":174},[78,69214,69215],{},"\u002F\u002F (1,CompactBuffer(1, 3))\n",[72,69217,69218],{},[13,69219,69220],{},"groupBy是非常常用的算子，它能通过条件对元素进行分组。常见在WordCount中，多句话扁平化之后可以将相同的词语分组聚合，以便后续进行计数。",[49,69222,69223],{},[52,69224,69225,69226,69228],{},"groupByKey是将RDD中相同key的元素分组到一起，返回一个(K, Iterable",[78,69227,5042],{},")类型的RDD",[114,69230,69232],{"className":23406,"code":69231,"language":23408,"meta":119,"style":119},"\u002F\u002F 将数据源的数据根据 key 对 value 进行分组\nval dataRDD1 = sparkContext.makeRDD(List((\"a\",1),(\"b\",2),(\"c\",3)))\nval dataRDD2 = dataRDD1.groupByKey()\nval dataRDD3 = dataRDD1.groupByKey(2)\nval dataRDD4 = dataRDD1.groupByKey(new HashPartitioner(2))\n\u002F\u002F 输出结果:（内容一致，顺序不同）\n\u002F\u002F (a,CompactBuffer(1))\n\u002F\u002F (b,CompactBuffer(2))\n\u002F\u002F (c,CompactBuffer(3))\n",[17,69233,69234,69239,69244,69249,69254,69259,69264,69269,69274],{"__ignoreMap":119},[78,69235,69236],{"class":124,"line":125},[78,69237,69238],{},"\u002F\u002F 将数据源的数据根据 key 对 value 进行分组\n",[78,69240,69241],{"class":124,"line":132},[78,69242,69243],{},"val dataRDD1 = sparkContext.makeRDD(List((\"a\",1),(\"b\",2),(\"c\",3)))\n",[78,69245,69246],{"class":124,"line":138},[78,69247,69248],{},"val dataRDD2 = dataRDD1.groupByKey()\n",[78,69250,69251],{"class":124,"line":144},[78,69252,69253],{},"val dataRDD3 = dataRDD1.groupByKey(2)\n",[78,69255,69256],{"class":124,"line":150},[78,69257,69258],{},"val dataRDD4 = dataRDD1.groupByKey(new HashPartitioner(2))\n",[78,69260,69261],{"class":124,"line":156},[78,69262,69263],{},"\u002F\u002F 输出结果:（内容一致，顺序不同）\n",[78,69265,69266],{"class":124,"line":162},[78,69267,69268],{},"\u002F\u002F (a,CompactBuffer(1))\n",[78,69270,69271],{"class":124,"line":168},[78,69272,69273],{},"\u002F\u002F (b,CompactBuffer(2))\n",[78,69275,69276],{"class":124,"line":174},[78,69277,69278],{},"\u002F\u002F (c,CompactBuffer(3))\n",[49,69280,69281],{},[52,69282,69283],{},"reduceByKey是对每个key对应的value进行reduce操作，返回一个(K, V)类型的RDD。",[114,69285,69287],{"className":23406,"code":69286,"language":23408,"meta":119,"style":119},"\u002F\u002F 可以将数据按照相同的 Key 对 Value 进行聚合\nval dataRDD1 = sparkContext.makeRDD(List((\"a\",1),(\"b\",2),(\"c\",3)))\nval dataRDD2 = dataRDD1.reduceByKey(_+_)\nval dataRDD3 = dataRDD1.reduceByKey(_+_, 2)\n\u002F\u002F 输出结果:\n\u002F\u002F (a,1) (b,2) (c,3)\n\u002F\u002F (b,2) (a,1) (c,3)\n",[17,69288,69289,69294,69298,69303,69308,69313,69318],{"__ignoreMap":119},[78,69290,69291],{"class":124,"line":125},[78,69292,69293],{},"\u002F\u002F 可以将数据按照相同的 Key 对 Value 进行聚合\n",[78,69295,69296],{"class":124,"line":132},[78,69297,69243],{},[78,69299,69300],{"class":124,"line":138},[78,69301,69302],{},"val dataRDD2 = dataRDD1.reduceByKey(_+_)\n",[78,69304,69305],{"class":124,"line":144},[78,69306,69307],{},"val dataRDD3 = dataRDD1.reduceByKey(_+_, 2)\n",[78,69309,69310],{"class":124,"line":150},[78,69311,69312],{},"\u002F\u002F 输出结果:\n",[78,69314,69315],{"class":124,"line":156},[78,69316,69317],{},"\u002F\u002F (a,1) (b,2) (c,3)\n",[78,69319,69320],{"class":124,"line":162},[78,69321,69322],{},"\u002F\u002F (b,2) (a,1) (c,3)\n",[10548,69324,69326],{"id":69325},"_3常见的行动操作","（3）常见的行动操作",[13,69328,69329],{},"常见的RDD行动操作有collect、count、first、take、reduce等。",[49,69331,69332],{},[52,69333,69334],{},"collect是将RDD中所有元素以数组的形式返回到Driver端；",[114,69336,69338],{"className":23406,"code":69337,"language":23408,"meta":119,"style":119},"\u002F\u002F 在驱动程序中，以数组 Array 的形式返回数据集的所有元素\nval rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))\n\u002F\u002F 收集数据到 Driver\nrdd.collect().foreach(println)  \u002F\u002F 收集到Driver端并循环打印\n",[17,69339,69340,69345,69350,69355],{"__ignoreMap":119},[78,69341,69342],{"class":124,"line":125},[78,69343,69344],{},"\u002F\u002F 在驱动程序中，以数组 Array 的形式返回数据集的所有元素\n",[78,69346,69347],{"class":124,"line":132},[78,69348,69349],{},"val rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))\n",[78,69351,69352],{"class":124,"line":138},[78,69353,69354],{},"\u002F\u002F 收集数据到 Driver\n",[78,69356,69357],{"class":124,"line":144},[78,69358,69359],{},"rdd.collect().foreach(println)  \u002F\u002F 收集到Driver端并循环打印\n",[49,69361,69362],{},[52,69363,69364],{},"count是返回RDD中元素的个数；first是返回RDD中的第一个元素；",[114,69366,69368],{"className":23406,"code":69367,"language":23408,"meta":119,"style":119},"\u002F\u002F 返回 RDD 中元素的个数\nval rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))\n\u002F\u002F 返回 RDD 中元素的个数\nval countResult: Long = rdd.count() \u002F\u002F 记录元素个数\n\u002F\u002F 4\n",[17,69369,69370,69375,69379,69383,69388],{"__ignoreMap":119},[78,69371,69372],{"class":124,"line":125},[78,69373,69374],{},"\u002F\u002F 返回 RDD 中元素的个数\n",[78,69376,69377],{"class":124,"line":132},[78,69378,69349],{},[78,69380,69381],{"class":124,"line":138},[78,69382,69374],{},[78,69384,69385],{"class":124,"line":144},[78,69386,69387],{},"val countResult: Long = rdd.count() \u002F\u002F 记录元素个数\n",[78,69389,69390],{"class":124,"line":150},[78,69391,69392],{},"\u002F\u002F 4\n",[49,69394,69395],{},[52,69396,69397],{},"take是返回一个由RDD的前n个元素组成的数组；",[114,69399,69401],{"className":23406,"code":69400,"language":23408,"meta":119,"style":119},"\u002F\u002F 返回一个由 RDD 的前 n 个元素组成的数组\nval rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))\n\u002F\u002F 返回 RDD 中元素的个数\nval takeResult: Array[Int] = rdd.take(2)  \u002F\u002F 返回前两个元素\nprintln(takeResult.mkString(\",\"))  \u002F\u002F 用\",\"将元素隔开\n\u002F\u002F 1,2\n",[17,69402,69403,69408,69412,69416,69421,69426],{"__ignoreMap":119},[78,69404,69405],{"class":124,"line":125},[78,69406,69407],{},"\u002F\u002F 返回一个由 RDD 的前 n 个元素组成的数组\n",[78,69409,69410],{"class":124,"line":132},[78,69411,69349],{},[78,69413,69414],{"class":124,"line":138},[78,69415,69374],{},[78,69417,69418],{"class":124,"line":144},[78,69419,69420],{},"val takeResult: Array[Int] = rdd.take(2)  \u002F\u002F 返回前两个元素\n",[78,69422,69423],{"class":124,"line":150},[78,69424,69425],{},"println(takeResult.mkString(\",\"))  \u002F\u002F 用\",\"将元素隔开\n",[78,69427,69428],{"class":124,"line":156},[78,69429,69430],{},"\u002F\u002F 1,2\n",[49,69432,69433],{},[52,69434,69435],{},"reduce是通过func函数聚集RDD中的所有元素，先聚合分区内数据，再聚合分区间数据。",[114,69437,69439],{"className":23406,"code":69438,"language":23408,"meta":119,"style":119},"\u002F\u002F 聚集 RDD 中的所有元素，先聚合分区内数据，再聚合分区间数据\nval rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4))\n\u002F\u002F 聚合数据\nval reduceResult: Int = rdd.reduce(_+_)\n\u002F\u002F 10\n",[17,69440,69441,69446,69450,69455,69460],{"__ignoreMap":119},[78,69442,69443],{"class":124,"line":125},[78,69444,69445],{},"\u002F\u002F 聚集 RDD 中的所有元素，先聚合分区内数据，再聚合分区间数据\n",[78,69447,69448],{"class":124,"line":132},[78,69449,69349],{},[78,69451,69452],{"class":124,"line":138},[78,69453,69454],{},"\u002F\u002F 聚合数据\n",[78,69456,69457],{"class":124,"line":144},[78,69458,69459],{},"val reduceResult: Int = rdd.reduce(_+_)\n",[78,69461,69462],{"class":124,"line":150},[78,69463,69464],{},"\u002F\u002F 10\n",[10548,69466,69468],{"id":69467},"_4reducebykey和groupbykey的区别","（4）reduceByKey和groupByKey的区别？",[13,69470,69471,69474],{},[22,69472,69473],{},"从 shuffle 的角度","：reduceByKey 和 groupByKey 都存在 shuffle 的操作，但是 reduceByKey 可以在 shuffle 前对分区内相同 key 的数据进行预聚合（combine）功能，这样会减少落盘的 数据量，而 groupByKey 只是进行分组，不存在数据量减少的问题，reduceByKey 性能比较高。",[13,69476,69477,69480],{},[22,69478,69479],{},"从功能的角度","：reduceByKey 其实包含分组和聚合的功能。GroupByKey 只能分组，不能聚合，所以在分组聚合的场合下，推荐使用 reduceByKey，如果仅仅是分组而不需要聚合。那么还是只能使用 groupByKey。",[13,69482,69483],{},[22,69484,69485],{},"所以在进行大量数据的 reduce 操作时候建议使用 reduceByKey。不仅可以提高速度，还可以防止使用 groupByKey 造成的内存溢出问题。",[10548,69487,69489],{"id":69488},"_5一种wordcount代码实现","（5）一种WordCount代码实现",[114,69491,69493],{"className":23406,"code":69492,"language":23408,"meta":119,"style":119},"import org.apache.spark.rdd.RDD\nimport org.apache.spark.{SparkConf, SparkContext}\n\nobject Spark03 {\n    def main(args: Array[String]): Unit = {\n        \u002F\u002F 配置Driverp[设置本地master适配、application进程名字]\n        val sparkConf = new SparkConf().setMaster(\"local[*]\").setAppName(\"WordCount\")\n        \u002F\u002F 装载\n        val sc = new SparkContext(sparkConf)\n        \u002F\u002F 加载文件（按行读取）\n        val lines: RDD[String] = sc.textFile(\"datas\")\n        \u002F\u002F 按照空格将每一行的句子扁平化成词语\n        val word: RDD[String] = lines.flatMap(_.split(\" \"))\n        \u002F\u002F 对每一个词语设置由word转化为(word, 1)格式\n        val wordToOne = word.map {\n            word => (word, 1)\n        }\n        \u002F\u002F 通过相同的key进行聚合，value相加\n        val wordToCount = wordToOne.reduceByKey(_+_)\n        \u002F\u002F 将数据返回到Driver端\n        val array: Array[(String, Int)] = wordToCount.collect()\n        \u002F\u002F 循环打印\n        array.foreach(println)\n        sc.stop()\n    }\n}\n",[17,69494,69495,69500,69505,69509,69514,69519,69524,69529,69534,69539,69544,69549,69554,69559,69564,69569,69574,69578,69583,69588,69593,69598,69603,69608,69613,69617],{"__ignoreMap":119},[78,69496,69497],{"class":124,"line":125},[78,69498,69499],{},"import org.apache.spark.rdd.RDD\n",[78,69501,69502],{"class":124,"line":132},[78,69503,69504],{},"import org.apache.spark.{SparkConf, SparkContext}\n",[78,69506,69507],{"class":124,"line":138},[78,69508,129],{"emptyLinePlaceholder":128},[78,69510,69511],{"class":124,"line":144},[78,69512,69513],{},"object Spark03 {\n",[78,69515,69516],{"class":124,"line":150},[78,69517,69518],{},"    def main(args: Array[String]): Unit = {\n",[78,69520,69521],{"class":124,"line":156},[78,69522,69523],{},"        \u002F\u002F 配置Driverp[设置本地master适配、application进程名字]\n",[78,69525,69526],{"class":124,"line":162},[78,69527,69528],{},"        val sparkConf = new SparkConf().setMaster(\"local[*]\").setAppName(\"WordCount\")\n",[78,69530,69531],{"class":124,"line":168},[78,69532,69533],{},"        \u002F\u002F 装载\n",[78,69535,69536],{"class":124,"line":174},[78,69537,69538],{},"        val sc = new SparkContext(sparkConf)\n",[78,69540,69541],{"class":124,"line":180},[78,69542,69543],{},"        \u002F\u002F 加载文件（按行读取）\n",[78,69545,69546],{"class":124,"line":186},[78,69547,69548],{},"        val lines: RDD[String] = sc.textFile(\"datas\")\n",[78,69550,69551],{"class":124,"line":192},[78,69552,69553],{},"        \u002F\u002F 按照空格将每一行的句子扁平化成词语\n",[78,69555,69556],{"class":124,"line":198},[78,69557,69558],{},"        val word: RDD[String] = lines.flatMap(_.split(\" \"))\n",[78,69560,69561],{"class":124,"line":204},[78,69562,69563],{},"        \u002F\u002F 对每一个词语设置由word转化为(word, 1)格式\n",[78,69565,69566],{"class":124,"line":210},[78,69567,69568],{},"        val wordToOne = word.map {\n",[78,69570,69571],{"class":124,"line":216},[78,69572,69573],{},"            word => (word, 1)\n",[78,69575,69576],{"class":124,"line":222},[78,69577,10054],{},[78,69579,69580],{"class":124,"line":421},[78,69581,69582],{},"        \u002F\u002F 通过相同的key进行聚合，value相加\n",[78,69584,69585],{"class":124,"line":427},[78,69586,69587],{},"        val wordToCount = wordToOne.reduceByKey(_+_)\n",[78,69589,69590],{"class":124,"line":433},[78,69591,69592],{},"        \u002F\u002F 将数据返回到Driver端\n",[78,69594,69595],{"class":124,"line":2443},[78,69596,69597],{},"        val array: Array[(String, Int)] = wordToCount.collect()\n",[78,69599,69600],{"class":124,"line":2448},[78,69601,69602],{},"        \u002F\u002F 循环打印\n",[78,69604,69605],{"class":124,"line":2454},[78,69606,69607],{},"        array.foreach(println)\n",[78,69609,69610],{"class":124,"line":2460},[78,69611,69612],{},"        sc.stop()\n",[78,69614,69615],{"class":124,"line":2465},[78,69616,15810],{},[78,69618,69619],{"class":124,"line":2470},[78,69620,23518],{},[7759,69622,69624],{"id":69623},"_3rdd序列化了解","3、RDD序列化（了解）",[10548,69626,69628],{"id":69627},"_1闭包检查","（1）闭包检查",[13,69630,69631,69632],{},"从计算的角度, ",[22,69633,69634,69635,69638],{},"算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor 端执行。",[22,69636,69637],{},"那么在 Scala 的函数式编程中，就会导致算子内经常会用到算子外的数据，这样就形成了闭包的效果，如果使用的算子外的数据无法序列化，就意味着无法传值给 Executor 端执行，就会发生错误，所以需要在执行任务计算前，检测闭包内的对象是否可以进行序列化，这个操作我们称之为","闭包检测。Scala2.12 版本后闭包编译方式发生了改变。",[10548,69640,69642],{"id":69641},"_2序列化方法和属性","（2）序列化方法和属性",[114,69644,69646],{"className":23406,"code":69645,"language":23408,"meta":119,"style":119},"object serializable02_function {\n    def main(args: Array[String]): Unit = {\n        \u002F\u002F1.创建 SparkConf 并设置 App 名称\n        val conf: SparkConf = new SparkConf().setAppName(\"SparkCoreTest\").setMaster(\"local[*]\")\n        \u002F\u002F2.创建 SparkContext，该对象是提交 Spark App 的入口\n        val sc: SparkContext = new SparkContext(conf)\n        \u002F\u002F3.创建一个 RDD\n        val rdd: RDD[String] = sc.makeRDD(Array(\"hello world\", \"hello spark\", \"hive\", \"atguigu\"))\n        \u002F\u002F3.1 创建一个 Search 对象\n        val search = new Search(\"hello\")\n        \u002F\u002F3.2 函数传递，打印：ERROR Task not serializable\n        search.getMatch1(rdd).collect().foreach(println)\n        \u002F\u002F3.3 属性传递，打印：ERROR Task not serializable\n        search.getMatch2(rdd).collect().foreach(println)\n        \u002F\u002F4.关闭连接\n        sc.stop()\n    }\n}\nclass Search(query:String) extends Serializable {\n    def isMatch(s: String): Boolean = {\n        s.contains(query)\n    }\n    \u002F\u002F 函数序列化案例\n    def getMatch1 (rdd: RDD[String]): RDD[String] = {\n        \u002F\u002Frdd.filter(this.isMatch)\n        rdd.filter(isMatch)\n    }\n    \u002F\u002F 属性序列化案例\n    def getMatch2(rdd: RDD[String]): RDD[String] = {\n        \u002F\u002Frdd.filter(x => x.contains(this.query))\n        rdd.filter(x => x.contains(query))\n        \u002F\u002Fval q = query\n        \u002F\u002Frdd.filter(x => x.contains(q))\n    }\n}\n",[17,69647,69648,69653,69657,69662,69667,69672,69677,69682,69687,69692,69697,69702,69707,69712,69717,69722,69726,69730,69734,69739,69744,69749,69753,69758,69763,69768,69773,69777,69782,69787,69792,69797,69802,69807,69811],{"__ignoreMap":119},[78,69649,69650],{"class":124,"line":125},[78,69651,69652],{},"object serializable02_function {\n",[78,69654,69655],{"class":124,"line":132},[78,69656,69518],{},[78,69658,69659],{"class":124,"line":138},[78,69660,69661],{},"        \u002F\u002F1.创建 SparkConf 并设置 App 名称\n",[78,69663,69664],{"class":124,"line":144},[78,69665,69666],{},"        val conf: SparkConf = new SparkConf().setAppName(\"SparkCoreTest\").setMaster(\"local[*]\")\n",[78,69668,69669],{"class":124,"line":150},[78,69670,69671],{},"        \u002F\u002F2.创建 SparkContext，该对象是提交 Spark App 的入口\n",[78,69673,69674],{"class":124,"line":156},[78,69675,69676],{},"        val sc: SparkContext = new SparkContext(conf)\n",[78,69678,69679],{"class":124,"line":162},[78,69680,69681],{},"        \u002F\u002F3.创建一个 RDD\n",[78,69683,69684],{"class":124,"line":168},[78,69685,69686],{},"        val rdd: RDD[String] = sc.makeRDD(Array(\"hello world\", \"hello spark\", \"hive\", \"atguigu\"))\n",[78,69688,69689],{"class":124,"line":174},[78,69690,69691],{},"        \u002F\u002F3.1 创建一个 Search 对象\n",[78,69693,69694],{"class":124,"line":180},[78,69695,69696],{},"        val search = new Search(\"hello\")\n",[78,69698,69699],{"class":124,"line":186},[78,69700,69701],{},"        \u002F\u002F3.2 函数传递，打印：ERROR Task not serializable\n",[78,69703,69704],{"class":124,"line":192},[78,69705,69706],{},"        search.getMatch1(rdd).collect().foreach(println)\n",[78,69708,69709],{"class":124,"line":198},[78,69710,69711],{},"        \u002F\u002F3.3 属性传递，打印：ERROR Task not serializable\n",[78,69713,69714],{"class":124,"line":204},[78,69715,69716],{},"        search.getMatch2(rdd).collect().foreach(println)\n",[78,69718,69719],{"class":124,"line":210},[78,69720,69721],{},"        \u002F\u002F4.关闭连接\n",[78,69723,69724],{"class":124,"line":216},[78,69725,69612],{},[78,69727,69728],{"class":124,"line":222},[78,69729,15810],{},[78,69731,69732],{"class":124,"line":421},[78,69733,23518],{},[78,69735,69736],{"class":124,"line":427},[78,69737,69738],{},"class Search(query:String) extends Serializable {\n",[78,69740,69741],{"class":124,"line":433},[78,69742,69743],{},"    def isMatch(s: String): Boolean = {\n",[78,69745,69746],{"class":124,"line":2443},[78,69747,69748],{},"        s.contains(query)\n",[78,69750,69751],{"class":124,"line":2448},[78,69752,15810],{},[78,69754,69755],{"class":124,"line":2454},[78,69756,69757],{},"    \u002F\u002F 函数序列化案例\n",[78,69759,69760],{"class":124,"line":2460},[78,69761,69762],{},"    def getMatch1 (rdd: RDD[String]): RDD[String] = {\n",[78,69764,69765],{"class":124,"line":2465},[78,69766,69767],{},"        \u002F\u002Frdd.filter(this.isMatch)\n",[78,69769,69770],{"class":124,"line":2470},[78,69771,69772],{},"        rdd.filter(isMatch)\n",[78,69774,69775],{"class":124,"line":2903},[78,69776,15810],{},[78,69778,69779],{"class":124,"line":2909},[78,69780,69781],{},"    \u002F\u002F 属性序列化案例\n",[78,69783,69784],{"class":124,"line":11477},[78,69785,69786],{},"    def getMatch2(rdd: RDD[String]): RDD[String] = {\n",[78,69788,69789],{"class":124,"line":13374},[78,69790,69791],{},"        \u002F\u002Frdd.filter(x => x.contains(this.query))\n",[78,69793,69794],{"class":124,"line":13380},[78,69795,69796],{},"        rdd.filter(x => x.contains(query))\n",[78,69798,69799],{"class":124,"line":13386},[78,69800,69801],{},"        \u002F\u002Fval q = query\n",[78,69803,69804],{"class":124,"line":13722},[78,69805,69806],{},"        \u002F\u002Frdd.filter(x => x.contains(q))\n",[78,69808,69809],{"class":124,"line":13727},[78,69810,15810],{},[78,69812,69813],{"class":124,"line":13953},[78,69814,23518],{},[10548,69816,69818],{"id":69817},"_3kryo序列化框架","（3）Kryo序列化框架",[13,69820,69821,69822],{},"参考地址: ",[5009,69823,69824],{"href":69824,"rel":69825},"https:\u002F\u002Fgithub.com\u002FEsotericSoftware\u002Fkryo",[23647],[13,69827,69828],{},"Java 的序列化能够序列化任何的类。但是比较重（字节多），序列化后，对象的提交也比较大。Spark 出于性能的考虑，Spark2.0 开始支持另外一种 Kryo 序列化机制。Kryo 速度 是 Serializable 的 10 倍。当 RDD 在 Shuffle 数据的时候，简单数据类型、数组和字符串类型 已经在 Spark 内部使用 Kryo 来序列化。",[13,69830,69831],{},[22,69832,69833],{},"注意：即使使用 Kryo 序列化，也要继承 Serializable 接口。",[114,69835,69837],{"className":23406,"code":69836,"language":23408,"meta":119,"style":119},"object serializable_Kryo {\n    def main(args: Array[String]): Unit = {\n        val conf: SparkConf = new SparkConf()\n                                    .setAppName(\"SerDemo\").setMaster(\"local[*]\")\n                                    \u002F\u002F 替换默认的序列化机制\n                                    .set(\"spark.serializer\", \n                                            \"org.apache.spark.serializer.KryoSerializer\")\n                                    \u002F\u002F 注册需要使用 kryo 序列化的自定义类\n                                    .registerKryoClasses(Array(classOf[Searcher]))\n        val sc = new SparkContext(conf)\n        val rdd: RDD[String] = sc.makeRDD(Array(\"hello world\", \"hello atguigu\", \"atguigu\", \"hahah\"), 2)\n        val searcher = new Searcher(\"hello\")\n        val result: RDD[String] = searcher.getMatchedRDD1(rdd)\n        result.collect.foreach(println)\n    }\n}\ncase class Searcher(val query: String) {\n    def isMatch(s: String) = {\n        s.contains(query)\n    }\n    def getMatchedRDD1(rdd: RDD[String]) = {\n        rdd.filter(isMatch) \n    }\n    def getMatchedRDD2(rdd: RDD[String]) = {\n        val q = query\n        rdd.filter(_.contains(q))\n     }\n}\n",[17,69838,69839,69844,69848,69853,69858,69863,69868,69873,69878,69883,69888,69893,69898,69903,69908,69912,69916,69921,69926,69930,69934,69939,69944,69948,69953,69958,69963,69968],{"__ignoreMap":119},[78,69840,69841],{"class":124,"line":125},[78,69842,69843],{},"object serializable_Kryo {\n",[78,69845,69846],{"class":124,"line":132},[78,69847,69518],{},[78,69849,69850],{"class":124,"line":138},[78,69851,69852],{},"        val conf: SparkConf = new SparkConf()\n",[78,69854,69855],{"class":124,"line":144},[78,69856,69857],{},"                                    .setAppName(\"SerDemo\").setMaster(\"local[*]\")\n",[78,69859,69860],{"class":124,"line":150},[78,69861,69862],{},"                                    \u002F\u002F 替换默认的序列化机制\n",[78,69864,69865],{"class":124,"line":156},[78,69866,69867],{},"                                    .set(\"spark.serializer\", \n",[78,69869,69870],{"class":124,"line":162},[78,69871,69872],{},"                                            \"org.apache.spark.serializer.KryoSerializer\")\n",[78,69874,69875],{"class":124,"line":168},[78,69876,69877],{},"                                    \u002F\u002F 注册需要使用 kryo 序列化的自定义类\n",[78,69879,69880],{"class":124,"line":174},[78,69881,69882],{},"                                    .registerKryoClasses(Array(classOf[Searcher]))\n",[78,69884,69885],{"class":124,"line":180},[78,69886,69887],{},"        val sc = new SparkContext(conf)\n",[78,69889,69890],{"class":124,"line":186},[78,69891,69892],{},"        val rdd: RDD[String] = sc.makeRDD(Array(\"hello world\", \"hello atguigu\", \"atguigu\", \"hahah\"), 2)\n",[78,69894,69895],{"class":124,"line":192},[78,69896,69897],{},"        val searcher = new Searcher(\"hello\")\n",[78,69899,69900],{"class":124,"line":198},[78,69901,69902],{},"        val result: RDD[String] = searcher.getMatchedRDD1(rdd)\n",[78,69904,69905],{"class":124,"line":204},[78,69906,69907],{},"        result.collect.foreach(println)\n",[78,69909,69910],{"class":124,"line":210},[78,69911,15810],{},[78,69913,69914],{"class":124,"line":216},[78,69915,23518],{},[78,69917,69918],{"class":124,"line":222},[78,69919,69920],{},"case class Searcher(val query: String) {\n",[78,69922,69923],{"class":124,"line":421},[78,69924,69925],{},"    def isMatch(s: String) = {\n",[78,69927,69928],{"class":124,"line":427},[78,69929,69748],{},[78,69931,69932],{"class":124,"line":433},[78,69933,15810],{},[78,69935,69936],{"class":124,"line":2443},[78,69937,69938],{},"    def getMatchedRDD1(rdd: RDD[String]) = {\n",[78,69940,69941],{"class":124,"line":2448},[78,69942,69943],{},"        rdd.filter(isMatch) \n",[78,69945,69946],{"class":124,"line":2454},[78,69947,15810],{},[78,69949,69950],{"class":124,"line":2460},[78,69951,69952],{},"    def getMatchedRDD2(rdd: RDD[String]) = {\n",[78,69954,69955],{"class":124,"line":2465},[78,69956,69957],{},"        val q = query\n",[78,69959,69960],{"class":124,"line":2470},[78,69961,69962],{},"        rdd.filter(_.contains(q))\n",[78,69964,69965],{"class":124,"line":2903},[78,69966,69967],{},"     }\n",[78,69969,69970],{"class":124,"line":2909},[78,69971,23518],{},[7759,69973,69975],{"id":69974},"_4rdd依赖关系重中之重","4、RDD依赖关系（重中之重）",[10548,69977,69979],{"id":69978},"_1血缘关系","（1）血缘关系",[13,69981,69982],{},"RDD 只支持粗粒度转换，即在大量记录上执行的单个操作。将创建 RDD 的一系列 Lineage （血统）记录下来，以便恢复丢失的分区。RDD 的 Lineage 会记录 RDD 的元数据信息和转 换行为，当该 RDD 的部分分区数据丢失时，它可以根据这些信息来重新运算和恢复丢失的数据分区。",[10548,69984,69986],{"id":69985},"_2依赖关系","（2）依赖关系",[72,69988,69989,69992],{},[13,69990,69991],{},"所谓的依赖关系，其实就是两个相邻 RDD 之间的关系。",[13,69993,69994],{},"通常使用.dependencies去查看RDD之间的关系。",[10548,69996,69998],{"id":69997},"_3宽窄依赖","（3）宽窄依赖",[13,70000,70001],{},[22,70002,70003],{},"窄依赖",[49,70005,70006,70009],{},[52,70007,70008],{},"父 RDD 的一个分区只会被子 RDD 的一个分区依赖",[52,70010,70011],{},"窄依赖的多个分区可以并行计算； 窄依赖的一个分区的数据如果丢失只需要重新计算对应的分区的数据就可以了。",[13,70013,70014],{},[22,70015,70016],{},"宽依赖",[49,70018,70019,70022],{},[52,70020,70021],{},"父 RDD 的一个分区会被子 RDD 的多个分区依赖(涉及到 shuffle)",[52,70023,70024],{},"划分 Stage(阶段)的依据：对于宽依赖,必须等到上一阶段计算完成才能计算下一阶段。",[7759,70026,70028],{"id":70027},"_5rdd持久化","5、RDD持久化",[10548,70030,70032],{"id":70031},"_1cache缓存","（1）Cache缓存",[13,70034,70035],{},"RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存，默认情况下会把数据以缓存 在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存，而是触发后面的 action 算 子时，该 RDD 将会被缓存在计算节点的内存中，并供后面重用。",[13,70037,70038],{},"Spark 会自动对一些 Shuffle 操作的中间数据做持久化操作(比如：reduceByKey)。这样 做的目的是为了当一个节点 Shuffle 失败了避免重新计算整个输入。但是，在实际使用的时候，如果想重用数据，仍然建议调用 persist 或 cache。",[10548,70040,70042],{"id":70041},"_2checkpoint检查点","（2）CheckPoint检查点",[13,70044,70045],{},"所谓的检查点其实就是通过将 RDD 中间结果写入磁盘。由于血缘依赖过长会造成容错成本过高，这样就不如在中间阶段做检查点容错，如果检查点之后有节点出现问题，可以从检查点开始重做血缘，减少了开销。 对 RDD 进行 checkpoint 操作并不会马上被执行，必须执行 Action 操作才能触发。",[10548,70047,70049],{"id":70048},"_3缓存和检查点区别","（3）缓存和检查点区别",[49,70051,70052,70055,70058],{},[52,70053,70054],{},"Cache 缓存只是将数据保存起来，不切断血缘依赖。Checkpoint 检查点切断血缘依赖。",[52,70056,70057],{},"Cache 缓存的数据通常存储在磁盘、内存等地方，可靠性低。Checkpoint 的数据通常存 储在 HDFS 等容错、高可用的文件系统，可靠性高。",[52,70059,70060],{},"建议对 checkpoint()的 RDD 使用 Cache 缓存，这样 checkpoint 的 job 只需从 Cache 缓存中读取数据即可，否则需要再从头计算一次 RDD。",[23289,70062],{},[107,70064,70066],{"id":70065},"第三章-spark-sql结构化数据处理","第三章 Spark SQL：结构化数据处理",[7759,70068,70070],{"id":70069},"_1spark-sql概述","1、Spark SQL概述",[13,70072,70073],{},[22,70074,70075],{},"Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。",[13,70077,70078],{},"SparkSQL 的前身是 Shark，给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程 中大量的中间磁盘落地过程消耗了大量的 I\u002FO，降低的运行效率，为了提高 SQL-on-Hadoop 的效率，大量的 SQL-on-Hadoop 工具开始产生，其中表现较为突出的是：Drill 、 Impala 、 Shark 。其中 Shark 是伯克利实验室 Spark 生态环境的组件之一，是基于 Hive 所开发的工具，它修改了Hive的内存管理、物理计划、执行三个模块，并使之能运行在 Spark 引擎上。",[13,70080,70081],{},"随着 Spark 的发展，SparkSQL 抛弃原有 Shark 的代码，汲取了 Shark 的一些优点，如内存列存储（In-Memory Columnar  Storage）、Hive兼容性等，重新开发了SparkSQL代码；由于摆脱了对Hive的依赖性，SparkSQL 无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便。",[49,70083,70084,70090,70096],{},[52,70085,70086,70089],{},[22,70087,70088],{},"数据兼容方面"," SparkSQL 不但兼容 Hive，还可以从 RDD、parquet 文件、JSON 文件中获取数据，未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据",[52,70091,70092,70095],{},[22,70093,70094],{},"性能优化方面"," 除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等",[52,70097,70098,70101],{},[22,70099,70100],{},"组件扩展方面"," 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义，进行扩展。",[13,70103,70104],{},"其中 SparkSQL 作为 Spark 生态的一员继续发展，而不再受限于 Hive，只是兼容 Hive；而 Hive on Spark 是一个 Hive 的发展计划，该计划将 Spark 作为 Hive 的底层引擎之一，也就是 说，Hive 将不再受限于一个引擎，可以采用 Map-Reduce、Tez、Spark 等引擎。",[72,70106,70107],{},[13,70108,70109],{},"后续的文档计划中也将有Hive on Spark的内容，写该文档的时候题主还没学完，敬请期待！",[7759,70111,70113],{"id":70112},"_2spark-sql优点","2、Spark SQL优点",[49,70115,70116,70122,70128,70134],{},[52,70117,70118,70121],{},[22,70119,70120],{},"易整合","：无缝的整合了 SQL 查询和 Spark 编程",[52,70123,70124,70127],{},[22,70125,70126],{},"统一的数据访问","：使用相同的方式连接不同的数据源",[52,70129,70130,70133],{},[22,70131,70132],{},"兼容Hive","：在已有的仓库上直接运行 SQL 或者 HiveQL",[52,70135,70136,70139],{},[22,70137,70138],{},"标准数据连接","：通过 JDBC 或者ODBC来连接",[7759,70141,70143],{"id":70142},"_3dataframe-dataset","3、DataFrame && DataSet",[10548,70145,70147],{"id":70146},"_1dataframe是什么","（1）DataFrame是什么？",[13,70149,70150,70151,70154],{},"在 Spark 中，DataFrame 是一种以 RDD 为基础的分布式数据集，",[22,70152,70153],{},"类似于传统数据库中的二维表格","。DataFrame 与 RDD 的主要区别在于，前者带有 schema 元信息，即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息，从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化，最终达到大幅提升运行时效率的目标。反观 RDD，由于无从得知所存数据元素的具体内部结构，Spark Core 只能在 stage 层面进行简单、通用的流水线优化。",[13,70156,70157],{},"同时，与 Hive 类似，DataFrame 也支持嵌套数据类型（struct、array 和 map）。从 API  易用性的角度上看，DataFrame API 提供的是一套高层的关系操作，比函数式的 RDD API 要更加友好，门槛更低。",[13,70159,70160],{},[617,70161],{"alt":119,"src":29839},[10548,70163,70165],{"id":70164},"_2dataset是什么课本比较久没有这部分内容","（2）DataSet是什么？（课本比较久，没有这部分内容）",[13,70167,70168],{},"DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象，是 DataFrame 的一个扩展。它提供了 RDD 的优势（强类型，使用强大的 lambda 函数的能力）以及 Spark  SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换（操作 map，flatMap，filter 等等）。",[49,70170,70171,70174,70177,70180,70190],{},[52,70172,70173],{},"DataSet 是 DataFrame API 的一个扩展，是 SparkSQL 最新的数据抽象",[52,70175,70176],{},"用户友好的 API 风格，既具有类型安全检查也具有 DataFrame 的查询优化特性；",[52,70178,70179],{},"用样例类来对 DataSet 中定义数据的结构信息，样例类中每个属性的名称直接映射到 DataSet 中的字段名称；",[52,70181,70182,70183,70186,70187,67],{},"DataSet 是强类型的。比如可以有 DataSet",[78,70184,70185],{},"Car","，DataSet",[78,70188,70189],{},"Person",[52,70191,70192,70193,70196],{},"DataFrame 是 DataSet 的特列，DataFrame=DataSet",[78,70194,70195],{},"Row"," ，所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型，跟 Car、Person 这些的类型一样，所有的 表结构信息都用 Row 来表示。获取数据时需要指定顺序。",[7759,70198,70200],{"id":70199},"_4spark-sql核心编程","4、Spark SQL核心编程",[13,70202,70203],{},"Spark Core 中，如果想要执行应用程序，需要首先构建上下文环境对象 SparkContext， Spark SQL 其实可以理解为对 Spark Core 的一种封装，不仅仅在模型上进行了封装，上下文 环境对象也进行了封装。 在老的版本中，SparkSQL 提供两种 SQL 查询起始点：一个叫 SQLContext，用于 Spark 自己提供的 SQL 查询；一个叫 HiveContext，用于连接 Hive 的查询。",[13,70205,70206,70209],{},[22,70207,70208],{},"SparkSession 是 Spark 最新的 SQL 查询起始点","，实质上是 SQLContext 和 HiveContext 的组合，所以在 SQLContext 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用 的。SparkSession 内部封装了 SparkContext，所以计算实际上是由 sparkContext 完成的。当 我们使用 spark-shell 的时候, spark 框架会自动的创建一个名称叫做 spark 的 SparkSession 对 象, 就像我们以前可以自动获取到一个 sc 来表示 SparkContext 对象一样。",[10548,70211,70213],{"id":70212},"_1dataframe创建","（1）DataFrame创建",[13,70215,70216],{},"在 Spark SQL 中 SparkSession 是创建 DataFrame 和执行 SQL 的入口，创建 DataFrame 有三种方式：通过 Spark 的数据源进行创建；从一个存在的 RDD 进行转换；还可以从 Hive Table 进行查询返回。",[13,70218,70219],{},"使用数据源创建的方式最常见的是使用parquet文件创建和使用JSON文件创建。Parquet文件格式特点如下：",[49,70221,70222,70225,70228,70231],{},[52,70223,70224],{},"可以跳过不符合条件的数据，只读取需要的数据，降低I\u002FO数据量。",[52,70226,70227],{},"可以压缩编码降低磁盘存储空间（悠羽同一列的数据类型一样，故可以使用更高效的压缩编码）。",[52,70229,70230],{},"只读取需要的列，支持向量运算，能够获取更好的扫描性能。",[52,70232,70233],{},"Parquet格式是Spark SQL的默认数据源格式，可通过spark.sql.sources.default配置。",[10548,70235,70237],{"id":70236},"_2dsl语法","（2）DSL语法",[13,70239,70240],{},"DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL，使用 DSL 语法风格不必去创建临时视图了。",[114,70242,70246],{"className":70243,"code":70244,"language":70245,"meta":119,"style":119},"language-SPARQL shiki shiki-themes github-dark","# 1) 创建一个 DataFrame\nscala> val df = spark.read.json(\"data\u002Fuser.json\")\ndf: org.apache.spark.sql.DataFrame = [age: bigint， name: string]\n\n# 2) 查看 DataFrame 的 Schema 信息\nscala> df.printSchema\nroot\n|-- age: Long (nullable = true)\n|-- username: string (nullable = true)\n\n# 3) 只查看\"username\"列数据，\nscala> df.select(\"username\").show()\n+--------+\n|username|\n+--------+\n|zhangsan|\n| lisi|\n| wangwu|\n+--------+\n\n# 4) 查看\"username\"列数据以及\"age+1\"数据\n# 注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式：单引号+字段名\nscala> df.select($\"username\",$\"age\" + 1).show\nscala> df.select('username, 'age + 1).show()\nscala> df.select('username, 'age + 1 as \"newage\").show()\n+--------+---------+\n|username|(age + 1)|\n+--------+---------+\n|zhangsan|       21|\n|    lisi|       31|\n|  wangwu|       41|\n+--------+---------+\n","SPARQL",[17,70247,70248,70253,70258,70263,70267,70272,70277,70282,70287,70292,70296,70301,70306,70311,70316,70320,70325,70330,70335,70339,70343,70348,70353,70358,70363,70368,70373,70378,70382,70387,70392,70397],{"__ignoreMap":119},[78,70249,70250],{"class":124,"line":125},[78,70251,70252],{},"# 1) 创建一个 DataFrame\n",[78,70254,70255],{"class":124,"line":132},[78,70256,70257],{},"scala> val df = spark.read.json(\"data\u002Fuser.json\")\n",[78,70259,70260],{"class":124,"line":138},[78,70261,70262],{},"df: org.apache.spark.sql.DataFrame = [age: bigint， name: string]\n",[78,70264,70265],{"class":124,"line":144},[78,70266,129],{"emptyLinePlaceholder":128},[78,70268,70269],{"class":124,"line":150},[78,70270,70271],{},"# 2) 查看 DataFrame 的 Schema 信息\n",[78,70273,70274],{"class":124,"line":156},[78,70275,70276],{},"scala> df.printSchema\n",[78,70278,70279],{"class":124,"line":162},[78,70280,70281],{},"root\n",[78,70283,70284],{"class":124,"line":168},[78,70285,70286],{},"|-- age: Long (nullable = true)\n",[78,70288,70289],{"class":124,"line":174},[78,70290,70291],{},"|-- username: string (nullable = true)\n",[78,70293,70294],{"class":124,"line":180},[78,70295,129],{"emptyLinePlaceholder":128},[78,70297,70298],{"class":124,"line":186},[78,70299,70300],{},"# 3) 只查看\"username\"列数据，\n",[78,70302,70303],{"class":124,"line":192},[78,70304,70305],{},"scala> df.select(\"username\").show()\n",[78,70307,70308],{"class":124,"line":198},[78,70309,70310],{},"+--------+\n",[78,70312,70313],{"class":124,"line":204},[78,70314,70315],{},"|username|\n",[78,70317,70318],{"class":124,"line":210},[78,70319,70310],{},[78,70321,70322],{"class":124,"line":216},[78,70323,70324],{},"|zhangsan|\n",[78,70326,70327],{"class":124,"line":222},[78,70328,70329],{},"| lisi|\n",[78,70331,70332],{"class":124,"line":421},[78,70333,70334],{},"| wangwu|\n",[78,70336,70337],{"class":124,"line":427},[78,70338,70310],{},[78,70340,70341],{"class":124,"line":433},[78,70342,129],{"emptyLinePlaceholder":128},[78,70344,70345],{"class":124,"line":2443},[78,70346,70347],{},"# 4) 查看\"username\"列数据以及\"age+1\"数据\n",[78,70349,70350],{"class":124,"line":2448},[78,70351,70352],{},"# 注意:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式：单引号+字段名\n",[78,70354,70355],{"class":124,"line":2454},[78,70356,70357],{},"scala> df.select($\"username\",$\"age\" + 1).show\n",[78,70359,70360],{"class":124,"line":2460},[78,70361,70362],{},"scala> df.select('username, 'age + 1).show()\n",[78,70364,70365],{"class":124,"line":2465},[78,70366,70367],{},"scala> df.select('username, 'age + 1 as \"newage\").show()\n",[78,70369,70370],{"class":124,"line":2470},[78,70371,70372],{},"+--------+---------+\n",[78,70374,70375],{"class":124,"line":2903},[78,70376,70377],{},"|username|(age + 1)|\n",[78,70379,70380],{"class":124,"line":2909},[78,70381,70372],{},[78,70383,70384],{"class":124,"line":11477},[78,70385,70386],{},"|zhangsan|       21|\n",[78,70388,70389],{"class":124,"line":13374},[78,70390,70391],{},"|    lisi|       31|\n",[78,70393,70394],{"class":124,"line":13380},[78,70395,70396],{},"|  wangwu|       41|\n",[78,70398,70399],{"class":124,"line":13386},[78,70400,70372],{},[10548,70402,70404],{"id":70403},"_3rdd转化为dataframe","（3）RDD转化为DataFrame",[13,70406,70407,70408],{},"在 IDEA 中开发程序时，如果需要 RDD 与 DF 或者 DS 之间互相操作，那么需要引入 ",[22,70409,70410],{},"import spark.implicits._",[13,70412,70413],{},"这里的 spark 不是 Scala 中的包名，而是创建的 sparkSession 对象的变量名称，所以必须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明，因为 Scala 只支持 val 修饰的对象的引入。 spark-shell 中无需导入，自动完成此操作。",[114,70415,70417],{"className":70243,"code":70416,"language":70245,"meta":119,"style":119},"scala> val idRDD = sc.textFile(\"data\u002Fid.txt\")\nscala> idRDD.toDF(\"id\").show\n+---+\n| id|\n+---+\n|  1|\n|  2|\n|  3|\n|  4|\n+---+\n# 实际开发中，一般通过样例类将 RDD 转换为 DataFrame\n# toDF(to DataFrame)直接将RDD转化为DataFrame\n",[17,70418,70419,70424,70429,70434,70439,70443,70448,70453,70458,70463,70467,70472],{"__ignoreMap":119},[78,70420,70421],{"class":124,"line":125},[78,70422,70423],{},"scala> val idRDD = sc.textFile(\"data\u002Fid.txt\")\n",[78,70425,70426],{"class":124,"line":132},[78,70427,70428],{},"scala> idRDD.toDF(\"id\").show\n",[78,70430,70431],{"class":124,"line":138},[78,70432,70433],{},"+---+\n",[78,70435,70436],{"class":124,"line":144},[78,70437,70438],{},"| id|\n",[78,70440,70441],{"class":124,"line":150},[78,70442,70433],{},[78,70444,70445],{"class":124,"line":156},[78,70446,70447],{},"|  1|\n",[78,70449,70450],{"class":124,"line":162},[78,70451,70452],{},"|  2|\n",[78,70454,70455],{"class":124,"line":168},[78,70456,70457],{},"|  3|\n",[78,70459,70460],{"class":124,"line":174},[78,70461,70462],{},"|  4|\n",[78,70464,70465],{"class":124,"line":180},[78,70466,70433],{},[78,70468,70469],{"class":124,"line":186},[78,70470,70471],{},"# 实际开发中，一般通过样例类将 RDD 转换为 DataFrame\n",[78,70473,70474],{"class":124,"line":192},[78,70475,70476],{},"# toDF(to DataFrame)直接将RDD转化为DataFrame\n",[10548,70478,70480],{"id":70479},"_4dataframe转化为rdd","（4）DataFrame转化为RDD",[13,70482,70483],{},"DataFrame 其实就是对 RDD 的封装，所以可以直接获取内部的 RDD。",[114,70485,70487],{"className":70243,"code":70486,"language":70245,"meta":119,"style":119},"scala> val df = sc.makeRDD(List((\"zhangsan\",30), (\"lisi\",40))).map(t=>User(t._1, t._2)).toDF\ndf: org.apache.spark.sql.DataFrame = [name: string, age: int]\n\nscala> val rdd = df.rdd\nrdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[46] at rdd at \u003Cconsole>:25\n\nscala> val array = rdd.collect\narray: Array[org.apache.spark.sql.Row] = Array([zhangsan,30], [lisi,40])\n",[17,70488,70489,70494,70499,70503,70508,70513,70517,70522],{"__ignoreMap":119},[78,70490,70491],{"class":124,"line":125},[78,70492,70493],{},"scala> val df = sc.makeRDD(List((\"zhangsan\",30), (\"lisi\",40))).map(t=>User(t._1, t._2)).toDF\n",[78,70495,70496],{"class":124,"line":132},[78,70497,70498],{},"df: org.apache.spark.sql.DataFrame = [name: string, age: int]\n",[78,70500,70501],{"class":124,"line":138},[78,70502,129],{"emptyLinePlaceholder":128},[78,70504,70505],{"class":124,"line":144},[78,70506,70507],{},"scala> val rdd = df.rdd\n",[78,70509,70510],{"class":124,"line":150},[78,70511,70512],{},"rdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[46] at rdd at \u003Cconsole>:25\n",[78,70514,70515],{"class":124,"line":156},[78,70516,129],{"emptyLinePlaceholder":128},[78,70518,70519],{"class":124,"line":162},[78,70520,70521],{},"scala> val array = rdd.collect\n",[78,70523,70524],{"class":124,"line":168},[78,70525,70526],{},"array: Array[org.apache.spark.sql.Row] = Array([zhangsan,30], [lisi,40])\n",[10548,70528,70530],{"id":70529},"_5dataframe和dataset转换","（5）DataFrame和DataSet转换",[13,70532,70533],{},[22,70534,70535],{},"声明：DataSet 是具有强类型的数据集合，需要提供对应的类型信息。DataFrame 其实是 DataSet 的特例，所以它们之间是可以互相转换的。",[72,70537,70538],{},[13,70539,70540],{},"RDD与DataSet的互转和RDD与DataFrame的互转一模一样，区别仅仅只是toDF改为了toDS。",[114,70542,70544],{"className":70243,"code":70543,"language":70245,"meta":119,"style":119},"# DataFrame 转换为 DataSet\nscala> case class User(name:String, age:Int)\ndefined class User\nscala> val df = sc.makeRDD(List((\"zhangsan\",30), \n(\"lisi\",49))).toDF(\"name\",\"age\")\ndf: org.apache.spark.sql.DataFrame = [name: string, age: int]\nscala> val ds = df.as[User]\nds: org.apache.spark.sql.Dataset[User] = [name: string, age: int]\n\n# DataSet 转换为 DataFrame\nscala> val ds = df.as[User]\nds: org.apache.spark.sql.Dataset[User] = [name: string, age: int]\nscala> val df = ds.toDF\ndf: org.apache.spark.sql.DataFrame = [name: string, age: int]\n\n# 首先使用as严格数据类型，再进行转换\n",[17,70545,70546,70551,70556,70561,70566,70571,70575,70580,70585,70589,70594,70598,70602,70607,70611,70615],{"__ignoreMap":119},[78,70547,70548],{"class":124,"line":125},[78,70549,70550],{},"# DataFrame 转换为 DataSet\n",[78,70552,70553],{"class":124,"line":132},[78,70554,70555],{},"scala> case class User(name:String, age:Int)\n",[78,70557,70558],{"class":124,"line":138},[78,70559,70560],{},"defined class User\n",[78,70562,70563],{"class":124,"line":144},[78,70564,70565],{},"scala> val df = sc.makeRDD(List((\"zhangsan\",30), \n",[78,70567,70568],{"class":124,"line":150},[78,70569,70570],{},"(\"lisi\",49))).toDF(\"name\",\"age\")\n",[78,70572,70573],{"class":124,"line":156},[78,70574,70498],{},[78,70576,70577],{"class":124,"line":162},[78,70578,70579],{},"scala> val ds = df.as[User]\n",[78,70581,70582],{"class":124,"line":168},[78,70583,70584],{},"ds: org.apache.spark.sql.Dataset[User] = [name: string, age: int]\n",[78,70586,70587],{"class":124,"line":174},[78,70588,129],{"emptyLinePlaceholder":128},[78,70590,70591],{"class":124,"line":180},[78,70592,70593],{},"# DataSet 转换为 DataFrame\n",[78,70595,70596],{"class":124,"line":186},[78,70597,70579],{},[78,70599,70600],{"class":124,"line":192},[78,70601,70584],{},[78,70603,70604],{"class":124,"line":198},[78,70605,70606],{},"scala> val df = ds.toDF\n",[78,70608,70609],{"class":124,"line":204},[78,70610,70498],{},[78,70612,70613],{"class":124,"line":210},[78,70614,129],{"emptyLinePlaceholder":128},[78,70616,70617],{"class":124,"line":216},[78,70618,70619],{},"# 首先使用as严格数据类型，再进行转换\n",[7759,70621,70623],{"id":70622},"_5rdddataframedataset三者的关系","5、RDD、DataFrame、DataSet三者的关系",[10548,70625,70627],{"id":70626},"_1版本上来看","（1）版本上来看",[13,70629,70630],{},"Spark1.0 => RDD",[13,70632,70633],{},"Spark1.3 => DataFrame",[13,70635,70636],{},"Spark1.6 => Dataset",[13,70638,70639,70640],{},"如果同样的数据都给到这三个数据结构，他们分别计算之后，都会给出相同的结果。不同是的他们的执行效率和执行方式。在后期的 Spark 版本中，",[22,70641,70642],{},"DataSet 有可能会逐步取代 RDD 和 DataFrame 成为唯一的 API 接口。",[10548,70644,70646],{"id":70645},"_2三者的共性","（2）三者的共性",[49,70648,70649,70652,70655,70658,70661,70664,70667],{},[52,70650,70651],{},"RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集，为处理超大型数 据提供便利；",[52,70653,70654],{},"三者都有惰性机制，在进行创建、转换，如 map 方法时，不会立即执行，只有在遇到 Action 如 foreach 时，三者才会开始遍历运算；",[52,70656,70657],{},"三者有许多共同的函数，如 filter，排序等；",[52,70659,70660],{},"在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包：import spark.implicits._（在 创建好 SparkSession 对象后尽量直接导入）",[52,70662,70663],{},"三者都会根据 Spark 的内存情况自动缓存运算，这样即使数据量很大，也不用担心会内存溢出",[52,70665,70666],{},"三者都有 partition 分区的概念",[52,70668,70669],{},"DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型",[10548,70671,70673],{"id":70672},"_3三者的区别","（3）三者的区别",[13,70675,70676],{},[22,70677,70678],{},"RDD",[49,70680,70681,70684],{},[52,70682,70683],{},"RDD 一般和 spark mllib 同时使用",[52,70685,70686],{},"RDD 不支持 Spark SQL 操作",[13,70688,70689],{},[22,70690,70691],{},"DataFrame",[49,70693,70694,70697,70700,70703],{},[52,70695,70696],{},"与 RDD 和 DataSet 不同，DataFrame 每一行的类型固定为 Row，每一列的值没法直接访问，只有通过解析才能获取各个字段的值",[52,70698,70699],{},"DataFrame 与 DataSet 一般不与 spark mllib 同时使用",[52,70701,70702],{},"DataFrame 与 DataSet 均支持 SparkSQL 的操作，比如 select，group by 之类，还能注册临时表\u002F视窗，进行 sql 语句操作",[52,70704,70705],{},"DataFrame 与 DataSet 支持一些特别方便的保存方式，比如保存成 csv，可以带上表头，这样每一列的字段名一目了然",[13,70707,70708],{},[22,70709,70710],{},"DataSet",[49,70712,70713,70718],{},[52,70714,70715,70716],{},"Dataset 和 DataFrame 拥有完全相同的成员函数，区别只是每一行的数据类型不同。 DataFrame 其实就是 DataSet 的一个特例 type DataFrame = Dataset",[78,70717,70195],{},[52,70719,70720,70721,70723],{},"DataFrame 也可以叫 Dataset",[78,70722,70195],{},"，每一行的类型是 Row，不解析，每一行究竟有哪些字段，各个字段又是什么类型都无从得知，只能用上面提到的 getAS 方法或者共性中的第七条提到的模式匹配拿出特定字段。而 Dataset 中，每一行是什么类型是不一定的，在自定义了 case class 之后可以很自由的获得每一行的信息。",[10548,70725,70727],{"id":70726},"_3三者的互相转换","（3）三者的互相转换",[13,70729,70730],{},[617,70731],{"alt":119,"src":62233},[7759,70733,70735],{"id":70734},"_6用户自定义函数","6、用户自定义函数",[13,70737,70738,70739,70742],{},"用户可以通过 ",[22,70740,70741],{},"spark.udf"," 功能添加自定义函数，实现自定义功能。",[10548,70744,70746,70747],{"id":70745},"_1udfuser-defined-function用户自定义函数","（1）UDF",[78,70748,70749],{},"User-Defined Function，用户自定义函数",[72,70751,70752],{},[13,70753,70754],{},"UDF相当于对已经有的函数，比如说：count等进行一个封装，在Spark中注册后就能够直接使用。主打的是将普通的函数包装成按行执行的函数。",[114,70756,70758],{"className":70243,"code":70757,"language":70245,"meta":119,"style":119},"# 1) 创建 DataFrame\nscala> val df = spark.read.json(\"data\u002Fuser.json\")\ndf: org.apache.spark.sql.DataFrame = [age: bigint， username: string]\n\n# 2) 注册 UDF\nscala> spark.udf.register(\"addName\",(x:String)=> \"Name:\"+x)\nres9: org.apache.spark.sql.expressions.UserDefinedFunction = \nUserDefinedFunction(\u003Cfunction1>,StringType,Some(List(StringType)))\n\n# 3) 创建临时表\nscala> df.createOrReplaceTempView(\"people\")\n\n# 4) 应用 UDF\nscala> spark.sql(\"Select addName(name),age from people\").show()\n",[17,70759,70760,70765,70769,70774,70778,70783,70788,70793,70798,70802,70807,70812,70816,70821],{"__ignoreMap":119},[78,70761,70762],{"class":124,"line":125},[78,70763,70764],{},"# 1) 创建 DataFrame\n",[78,70766,70767],{"class":124,"line":132},[78,70768,70257],{},[78,70770,70771],{"class":124,"line":138},[78,70772,70773],{},"df: org.apache.spark.sql.DataFrame = [age: bigint， username: string]\n",[78,70775,70776],{"class":124,"line":144},[78,70777,129],{"emptyLinePlaceholder":128},[78,70779,70780],{"class":124,"line":150},[78,70781,70782],{},"# 2) 注册 UDF\n",[78,70784,70785],{"class":124,"line":156},[78,70786,70787],{},"scala> spark.udf.register(\"addName\",(x:String)=> \"Name:\"+x)\n",[78,70789,70790],{"class":124,"line":162},[78,70791,70792],{},"res9: org.apache.spark.sql.expressions.UserDefinedFunction = \n",[78,70794,70795],{"class":124,"line":168},[78,70796,70797],{},"UserDefinedFunction(\u003Cfunction1>,StringType,Some(List(StringType)))\n",[78,70799,70800],{"class":124,"line":174},[78,70801,129],{"emptyLinePlaceholder":128},[78,70803,70804],{"class":124,"line":180},[78,70805,70806],{},"# 3) 创建临时表\n",[78,70808,70809],{"class":124,"line":186},[78,70810,70811],{},"scala> df.createOrReplaceTempView(\"people\")\n",[78,70813,70814],{"class":124,"line":192},[78,70815,129],{"emptyLinePlaceholder":128},[78,70817,70818],{"class":124,"line":198},[78,70819,70820],{},"# 4) 应用 UDF\n",[78,70822,70823],{"class":124,"line":204},[78,70824,70825],{},"scala> spark.sql(\"Select addName(name),age from people\").show()\n",[10548,70827,70829,70830],{"id":70828},"_2udafuser-defined-aggregation-function用户自定义聚合函数","(2)UDAF",[78,70831,70832],{},"User-Defined Aggregation Function，用户自定义聚合函数",[72,70834,70835],{},[13,70836,70837],{},"UDAF相当于用户自定义SQL中没有的函数，这里只记录下Spark3.0之后最新的Aggregator的实现方式，以后在生产开发中遇到再进行详细学习。",[13,70839,70840],{},"用户可以设定自己的自定义聚合函数。通 过继承 UserDefinedAggregateFunction 来实现用户自定义弱类型聚合函数。从 Spark3.0 版本 后，UserDefinedAggregateFunction 已经不推荐使用了。可以统一采用强类型聚合函数 Aggregator。",[114,70842,70844],{"className":23406,"code":70843,"language":23408,"meta":119,"style":119},"\u002F\u002F 需求：计算平均工资\n\u002F\u002F TODO 创建 UDAF 函数\nval udaf = new MyAvgAgeUDAF\n\u002F\u002F TODO 注册到 SparkSQL 中\nspark.udf.register(\"avgAge\", functions.udaf(udaf))\n\u002F\u002F TODO 在 SQL 中使用聚合函数\n\u002F\u002F 定义用户的自定义聚合函数\nspark.sql(\"select avgAge(age) from user\").show\n\u002F\u002F **************************************************\ncase class Buff( var sum:Long, var cnt:Long )\n\u002F\u002F totalage, count\nclass MyAvgAgeUDAF extends Aggregator[Long, Buff, Double]{\n    override def zero: Buff = Buff(0,0)\n    \n    override def reduce(b: Buff, a: Long): Buff = {\n        b.sum += a\n        b.cnt += 1\n        b\n    }\n    \n    override def merge(b1: Buff, b2: Buff): Buff = {\n        b1.sum += b2.sum\n        b1.cnt += b2.cnt\n        b1\n    }\n    \n    override def finish(reduction: Buff): Double = {\n        reduction.sum.toDouble\u002Freduction.cnt\n    }\n    \n    override def bufferEncoder: Encoder[Buff] = Encoders.product\n    override def outputEncoder: Encoder[Double] = Encoders.scalaDouble\n}\n",[17,70845,70846,70851,70856,70861,70866,70871,70876,70881,70886,70891,70896,70901,70906,70911,70915,70920,70925,70930,70935,70939,70943,70948,70953,70958,70963,70967,70971,70976,70981,70985,70989,70994,70999],{"__ignoreMap":119},[78,70847,70848],{"class":124,"line":125},[78,70849,70850],{},"\u002F\u002F 需求：计算平均工资\n",[78,70852,70853],{"class":124,"line":132},[78,70854,70855],{},"\u002F\u002F TODO 创建 UDAF 函数\n",[78,70857,70858],{"class":124,"line":138},[78,70859,70860],{},"val udaf = new MyAvgAgeUDAF\n",[78,70862,70863],{"class":124,"line":144},[78,70864,70865],{},"\u002F\u002F TODO 注册到 SparkSQL 中\n",[78,70867,70868],{"class":124,"line":150},[78,70869,70870],{},"spark.udf.register(\"avgAge\", functions.udaf(udaf))\n",[78,70872,70873],{"class":124,"line":156},[78,70874,70875],{},"\u002F\u002F TODO 在 SQL 中使用聚合函数\n",[78,70877,70878],{"class":124,"line":162},[78,70879,70880],{},"\u002F\u002F 定义用户的自定义聚合函数\n",[78,70882,70883],{"class":124,"line":168},[78,70884,70885],{},"spark.sql(\"select avgAge(age) from user\").show\n",[78,70887,70888],{"class":124,"line":174},[78,70889,70890],{},"\u002F\u002F **************************************************\n",[78,70892,70893],{"class":124,"line":180},[78,70894,70895],{},"case class Buff( var sum:Long, var cnt:Long )\n",[78,70897,70898],{"class":124,"line":186},[78,70899,70900],{},"\u002F\u002F totalage, count\n",[78,70902,70903],{"class":124,"line":192},[78,70904,70905],{},"class MyAvgAgeUDAF extends Aggregator[Long, Buff, Double]{\n",[78,70907,70908],{"class":124,"line":198},[78,70909,70910],{},"    override def zero: Buff = Buff(0,0)\n",[78,70912,70913],{"class":124,"line":204},[78,70914,6942],{},[78,70916,70917],{"class":124,"line":210},[78,70918,70919],{},"    override def reduce(b: Buff, a: Long): Buff = {\n",[78,70921,70922],{"class":124,"line":216},[78,70923,70924],{},"        b.sum += a\n",[78,70926,70927],{"class":124,"line":222},[78,70928,70929],{},"        b.cnt += 1\n",[78,70931,70932],{"class":124,"line":421},[78,70933,70934],{},"        b\n",[78,70936,70937],{"class":124,"line":427},[78,70938,15810],{},[78,70940,70941],{"class":124,"line":433},[78,70942,6942],{},[78,70944,70945],{"class":124,"line":2443},[78,70946,70947],{},"    override def merge(b1: Buff, b2: Buff): Buff = {\n",[78,70949,70950],{"class":124,"line":2448},[78,70951,70952],{},"        b1.sum += b2.sum\n",[78,70954,70955],{"class":124,"line":2454},[78,70956,70957],{},"        b1.cnt += b2.cnt\n",[78,70959,70960],{"class":124,"line":2460},[78,70961,70962],{},"        b1\n",[78,70964,70965],{"class":124,"line":2465},[78,70966,15810],{},[78,70968,70969],{"class":124,"line":2470},[78,70970,6942],{},[78,70972,70973],{"class":124,"line":2903},[78,70974,70975],{},"    override def finish(reduction: Buff): Double = {\n",[78,70977,70978],{"class":124,"line":2909},[78,70979,70980],{},"        reduction.sum.toDouble\u002Freduction.cnt\n",[78,70982,70983],{"class":124,"line":11477},[78,70984,15810],{},[78,70986,70987],{"class":124,"line":13374},[78,70988,6942],{},[78,70990,70991],{"class":124,"line":13380},[78,70992,70993],{},"    override def bufferEncoder: Encoder[Buff] = Encoders.product\n",[78,70995,70996],{"class":124,"line":13386},[78,70997,70998],{},"    override def outputEncoder: Encoder[Double] = Encoders.scalaDouble\n",[78,71000,71001],{"class":124,"line":13722},[78,71002,23518],{},[7759,71004,71006],{"id":71005},"_7spark-sql执行的流程面试","7、Spark SQL执行的流程（面试）",[2285,71008,71009,71012,71015,71018,71021,71024,71027,71030,71033],{},[52,71010,71011],{},"parser：基于 antlr 框架对 sql 解析，生成抽象语法树。",[52,71013,71014],{},"变量替换：通过正则表达式找出符合规则的字符串，替换成系统缓存环境的变量。 SQLConf 中的 spark.sql.variable.substitute，默认是可用的；参考 SparkSqlParser",[52,71016,71017],{},"parser：将 antlr 的 tree 转成 spark catalyst 的 LogicPlan，也就是未解析的逻辑计划；详细参考 AstBuild, ParseDriver",[52,71019,71020],{},"analyzer：通过分析器，结合 catalog，把 logical plan 和实际的数据绑定起来，将 未解析的逻辑计划 生成 逻辑计划；详细参考 QureyExecution",[52,71022,71023],{},"缓存替换：通过 CacheManager，替换有相同结果的 logical plan（逻辑计划）",[52,71025,71026],{},"logical plan 优化，基于规则的优化；优化规则参考 Optimizer，优化 执行器 RuleExecutor",[52,71028,71029],{},"生成 spark plan，也就是物理计划；参考QueryPlanner和SparkStrategies",[52,71031,71032],{},"spark plan 准备阶段",[52,71034,71035],{},"构造 RDD 执行，涉及 spark 的 wholeStageCodegenExec 机制，基于 janino 框架生成 java 代码并编译",[226,71037,228],{},{"title":119,"searchDepth":144,"depth":144,"links":71039},[71040,71046,71053],{"id":68537,"depth":132,"text":68538,"children":71041},[71042,71043,71044,71045],{"id":68541,"depth":144,"text":68542},{"id":68569,"depth":144,"text":68570},{"id":68636,"depth":144,"text":68637},{"id":68679,"depth":144,"text":68680},{"id":68813,"depth":132,"text":68814,"children":71047},[71048,71049,71050,71051,71052],{"id":68817,"depth":144,"text":68818},{"id":68959,"depth":144,"text":68960},{"id":69623,"depth":144,"text":69624},{"id":69974,"depth":144,"text":69975},{"id":70027,"depth":144,"text":70028},{"id":70065,"depth":132,"text":70066,"children":71054},[71055,71056,71057,71058,71059,71060,71061],{"id":70069,"depth":144,"text":70070},{"id":70112,"depth":144,"text":70113},{"id":70142,"depth":144,"text":70143},{"id":70199,"depth":144,"text":70200},{"id":70622,"depth":144,"text":70623},{"id":70734,"depth":144,"text":70735},{"id":71005,"depth":144,"text":71006},{},"我的大学\u002F大三下学期\u002FSpark大数据分析技术\u002FSpark从0到1（上）.md","\u002Fundergraduate\u002Fnote-83fb8e873e7f",{"title":68517,"description":119},"undergraduate\u002Fnote-83fb8e873e7f",[7744,246,23378,10715,6380,35725],"oPJAKPb6vPgz3lNG3ZAAH4q1j3IVsjPDS7iTwl36XQU",{"id":71070,"title":71071,"assetBase":239,"author":8,"body":71072,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":71828,"navigation":128,"originalPath":71829,"path":71830,"seo":71831,"source":23330,"stem":71832,"tags":71833,"weight":250,"__hash__":71834},"content\u002Fundergraduate\u002Fnote-84eb882cc014.md","计网课设",{"type":10,"value":71073,"toc":71821},[71074,71077,71093,71097,71102,71106,71113,71116,71119,71123,71126,71131,71134,71139,71142,71147,71150,71155,71158,71163,71166,71169,71173,71176,71181,71186,71191,71196,71199,71202,71205,71214,71223,71228,71231,71235,71240,71243,71246,71255,71263,71266,71269,71272,71276,71279,71283,71286,71290,71293,71296,71299,71302,71305,71308,71311,71314,71319,71322,71327,71330,71335,71339,71344,71347,71351,71354,71363,71366,71370,71379,71382,71387,71390,71393,71396,71405,71410,71413,71418,71427,71436,71441,71444,71447,71450,71455,71458,71463,71470,71473,71478,71481,71486,71489,71492,71497,71509,71512,71516,71521,71524,71528,71531,71535,71538,71542,71545,71549,71552,71556,71571,71586,71589,71592,71597,71600,71603,71616,71621,71624,71629,71632,71637,71642,71645,71650,71653,71658,71661,71664,71669,71672,71677,71680,71688,71691,71696,71700,71705,71708,71728,71732,71735,71740,71745,71748,71751,71756,71761,71764,71767,71772,71777,71783,71786,71791,71800,71805,71808,71813,71818],[4517,71075,71076],{"id":71076},"计算机网络课程设计",[72,71078,71079,71084,71087,71090],{},[13,71080,71081],{},[22,71082,71083],{},"前言&&后言：",[13,71085,71086],{},"这是一份我在完成我们学校课程设计报告的“草稿”，与其说是草稿不如说更像我的心路历程。虽说是草稿但是一开始就是为了供大家参考诞生的，面向对象主要有两类，不过主要是面向想深入研究但是确实还没开始计算机网络的学弟学妹（毕竟如果你在技术啊啥的卷一点的话计网在课堂上确实难以深入）。如果只是要“完成”课设的，大可以把代码拿去，遇到问题了瞄一眼文档就行。",[13,71088,71089],{},"学习是会产生兴趣的，毕竟一开始我看着这个也挺头疼的，当时想的是ffj写完借我抄抄，但是没想到人家写的是Go & Unix，咱这种平民还是碰不得，所以只好自己研究。刚好疫情放假早，课设开始的那天我就回家了，所以就开始了早8-早11.5\u002F午1-午5.5的高强度学习，偶尔晚上心血来潮9-11还能接着写点，7天，用了超过60h在这五个题上。",[13,71091,71092],{},"有意思吗？题目本身其实没有任何意思，但是求知过程一定是有意思的。可以看到文章中有很多超链，那都是我筛选出来的“宝物”，学计算机就是为了能用自己的技术实现自己的所想，所以我希望每一个读到这的你，都能找到自己的路，实现自己之所想。  ——By Alexie-Z-Yevich 2022.12.27",[107,71094,71096],{"id":71095},"一网络聊天程序的设计与实现","一、网络聊天程序的设计与实现",[13,71098,71099],{},[22,71100,71101],{},"完成于12\u002F20号周二",[13,71103,71104],{},[617,71105],{"alt":119,"src":29434},[13,71107,71108,71109,71112],{},"直接编译运行失败，原因是win下缺少可执行库文件，根据附件中加上#pragma comment(lib, \"ws2_32\")头文件也不好使，一度以为是Win11的锅，但是查看Windows下system32的lib库发现有ws2_32.dll文件。又以为是编译器的问题，了解了下MinGW，下载了最新版的MinGW64，但是问题还是没有解决。最后采用在编译命令后添加一个参数",[17,71110,71111],{},"-lwsock32","可以编译运行。",[13,71114,71115],{},"感觉非常不方便，于是学习了下cmake编译，但是采用cmake编译的问题更多了，期间遇到了g++和gcc配置问题、make环境缺失问题、编译指令报错问题，好在经过一上午试错最终能用cmake将第一题成功编译运行。使用cmake后就不需要在每次编译时添加-lwsock32参数，只需要在项目前加上link_libraries(ws2_32 wsock32)就能打包，可以重复使用的同时还能批量编译多个文件。",[13,71117,71118],{},"输出结果如下：",[13,71120,71121],{},[617,71122],{"alt":119,"src":33078},[13,71124,71125],{},"多次执行得到的效果如下：",[13,71127,71128],{},[617,71129],{"alt":119,"src":71130},"img\u002F1.4.png",[13,71132,71133],{},"可以看出服务端一直在等待应答，但是客户端发送一次消息之后就停止了，尝试将代码改成双端通信。首先先简单的将客户端的代码改成while(1)，但是并没有得到想象中的两边通信的效果：",[13,71135,71136],{},[617,71137],{"alt":119,"src":71138},"img\u002F1.3.png",[13,71140,71141],{},"对此我对这个不甚理解，于是将main函数中的所有内容都放到了while(1)中间，这个时候就实现了双端持续通信（但实际只是不断new了一个Client进程，本质上和多次启动并没有区别）。但好消息是知道了必定有什么东西阻塞了进程，根据下图，因为Server端的服务没结束，而Client端的消息没发出去，所以基本可以确定是在下面五个环节出了问题。",[13,71143,71144],{},[617,71145],{"alt":119,"src":71146},"img\u002F1.5.png",[13,71148,71149],{},"这时候我就注意到：close结束了这段通信，那么有没有可能不结束通信就能保证两个服务的持续连接呢？然后得到了理想的结果：",[13,71151,71152],{},[617,71153],{"alt":119,"src":71154},"img\u002F1.6.png",[13,71156,71157],{},"又经过简单的研究，发现closesocket(sockClient);并不影响通信，因为即使关闭了socket的连接，也会在每一次循环中connect重新连接上。查了下WSACleanup();函数，发现其作用是终止Ws2_32.dll 的使用，得，换个说法就是把服务给干没了，于是变成了单方面接收消息的工具，发送消息的地址信息填入不了自然就无法发送数据了。那么这时候再来实现服务端和客户端的持久交互就简单了：",[13,71159,71160],{},[617,71161],{"alt":119,"src":71162},"img\u002F1.7.png",[13,71164,71165],{},"上述流程简单介绍一下：首先要是实现“交互”，但是源代码中的两个流程都是先发送再接收，这就会造成进程阻塞后变成需要先发消息才能看到对面发来的上一条消息，考虑到一般服务端主要用作响应，所以把Server的recv放到send之前即可。标头和结尾结束进程太简单了就不过多赘述。展示下源码：",[13,71167,71168],{},"服务端主要修改后：",[13,71170,71171],{},[617,71172],{"alt":119,"src":30426},[13,71174,71175],{},"客户端主要修改后：",[13,71177,71178],{},[617,71179],{"alt":119,"src":71180},"img\u002F2.0.png",[13,71182,71183],{},[22,71184,71185],{},"12\u002F26周一",[13,71187,71188],{},[22,71189,71190],{},"本来以为这一题已经结束了，但是这两天和计科的同学交流的时候发现他们老师要求比较严格，要求他们实现多服务端通信。先说结果：以我的水平没能完成多线程通信，但是还是做了很多工作，下面只是部分我的一些浅显的逻辑：",[13,71192,71193],{},[617,71194],{"alt":119,"src":71195},"img\u002F1.8.png",[13,71197,71198],{},"可以看到，当不开启多线程的时候消息回复非常的杂乱。从结果来看，Server端确实异步响应了两个Client的请求，而且因为阻塞的缘故，是轮流对Client进行处理。Client之间互相不会通信，所以大致思路如下：",[13,71200,71201],{},"1）Server端开启多线程，响应多个Client端的请求",[13,71203,71204],{},"2）改进下标识，因为一个端口不可能被多个服务占用，所以暂打算使用端口号作为Client的表示符。",[13,71206,71207,71208,71213],{},"当时讨论的时候问了下他们怎么做的。。。好家伙，很多都是直接博客上抄的，这里附上可供借鉴的博客",[5009,71209,71212],{"href":71210,"rel":71211},"https:\u002F\u002Fblog.csdn.net\u002Fm0_45948011\u002Farticle\u002Fdetails\u002F122351720?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-6-122351720-blog-85257238.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-6-122351720-blog-85257238.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=12",[23647],"网络聊天程序的设计与实现","，不过代码使用C++完成且改动较大，因为指导书第一题给的代码是C，所以我还是尝试用自己的逻辑在指导书原C代码上修改。（不过这个学长的博客的流程图和第六题电子邮件都对我的思考起到了很大的帮助）",[13,71215,71216,71217,71222],{},"我主要参考博客",[5009,71218,71221],{"href":71219,"rel":71220},"https:\u002F\u002Fblog.csdn.net\u002Fyizhizainulii\u002Farticle\u002Fdetails\u002F124387556",[23647],"【多线程】c语言中的多线程","对代码进行修改，但是效果并不理想，加入了上锁操作后更是乱得一塌糊涂，执行效果如下：",[13,71224,71225],{},[617,71226],{"alt":119,"src":71227},"img\u002F1.9.png",[13,71229,71230],{},"仍然是异步通信且执行规律我都没摸清楚，有时候能和单个Client通信两次，有时候Client收到通信发出的消息直接进入等待。可能我还是对多线程不是很了解，通过C语言去写多线程我的兴趣不大，所以暂时搁置在这里。",[107,71232,71234],{"id":71233},"二tracert-与-ping-设计与实现","二、Tracert 与 Ping 设计与实现",[13,71236,71237],{},[22,71238,71239],{},"完成于12\u002F21周三",[13,71241,71242],{},"这一题和第一题一样，直接编译会报缺失。但是我用cmake打包完成后的exe文件运行不了。这让我百思不得其解，尝试去掉link_libraries(ws2_32 wsock32)这段代码发现cmake也无法打包，也就是说并不是在库连接上出了问题，尝试了大概2h后只能放弃，又回到用g++编译的方式。",[13,71244,71245],{},"一开始采用-lwsock32进行编译，仍然有一个库文件缺失，这时就没有办法了编译成功。于是我去了解了下-lwsock32这段代码的意思，发现原来就是link wsock32库的意思，结合cmake上link_libraries(ws2_32 wsock32)同时链接了wsock32和ws2_32两个库，抱着试一试的心理用-lws2_32去编译，结果成功了。",[13,71247,71248,71249,71254],{},"参考博客",[5009,71250,71253],{"href":71251,"rel":71252},"https:\u002F\u002Fblog.csdn.net\u002Fhappy_xiahuixiax\u002Farticle\u002Fdetails\u002F72637370",[23647],"MAKEWORD(2,2)解释","了解了MAKEWORD函数真正的意思，也清楚了和第一题中MAKEWORD(1,1)有什么区别，但是对于其具体初始化的作用还是不太了解。",[13,71256,71248,71257,71262],{},[5009,71258,71261],{"href":71259,"rel":71260},"https:\u002F\u002Fblog.csdn.net\u002Ff2157120\u002Farticle\u002Fdetails\u002F86497152",[23647],"网际校验和算法","了解了下代码中计算网际校验和函数的作用，看了下代码流程大概就是将ICMP的报文头加数据字段经过校验和，生成cksum。因为我也学的不太好，但是根据后面来看没有用到cksum的地方，所以猜测是发送过去给对面机器进行内容校验的数据，这里只是模拟生成的格式。",[13,71264,71265],{},"简单说下我对使用ICMP协议的整个程序流程的理解吧：",[13,71267,71268],{},"除去一大段制定格式规范的代码（看懂了大概1\u002F3吧，但是要我写肯定不会写），从while (!bReachDestHost && iMaxHot--)开始执行跳站\u002F判断IP是否连接。一直到sendto(sockRaw, IcmpSendBuf, sizeof(IcmpSendBuf), 0, (sockaddr *) &destSockAddr, sizeof(destSockAddr));上面仍然是指定ICMP报文规范，这里destSockAddr中填充的就是我们输入的目标IP\u002F域名。",[13,71270,71271],{},"再到下面的while(1)，while(1)的作用是持续接收返回报文，如果没有返回报文就是两种情况：发送报文丢了\u002F返回报文丢了。但无论是哪种情况都需要我们重新发送报文，此时iTTL+1，记为跳站一次，超过最大设置的跳站次数DEF_MAX_HOP（30）就可以认定发送方不在线。而对于有返回报文的情况：",[13,71273,71274],{},[617,71275],{"alt":119,"src":30562},[13,71277,71278],{},"DecodeIcmpResponse函数是对返回报文的格式校验，也算是配置的一部分吧，看懂的也不多。主要印象深刻点的就是执行的操作：如果用户输入的是IP，IP成功通信后，输出IP地址就能直接结束，不会继续接收报文；但是域名不同，比如说www.baidu.com，我不是很懂为什么有那么多的IP响应，一开始猜测是一个域名下可能有多个IP地址(或者通过不同IP转发)，但是马上我就发现了不对，我抱着玩一下的心理ping了下自己的云服务器，输入的是域名www.fenrisx.top。",[13,71280,71281],{},[617,71282],{"alt":119,"src":65400},[13,71284,71285],{},"我的云服务器只有一个IP，不可能和百度啥的一样有很多个IP，那么就不可能是为了防止“恶意连接”发送的假IP，而且我发现停止的时候并没有进行30次连接，而最后一次的IP正是正确的IP。我又试了下百度的连接，发现最终停止的IP都是一个，所以和我一开始认为的超时停止接收不太一样。开始写这段的时候还没意识到到底是怎么回事，截图的时候发现第一次\u002F第二次连接都是192.168.31.1\u002F192.168.1.1，我对这个可太敏感了，这就是标准的配置虚拟机的IP前缀，我在未开启虚拟机的时候访问会超时，但是开启虚拟机的时候一次就访问成功了。",[13,71287,71288],{},[617,71289],{"alt":119,"src":68935},[13,71291,71292],{},"虽然没有直接依据，但我大胆假设这应该是先访问查找内网的IP，结合老师上课说过的IPv4地址分类，我觉得这是发送报文这个过程就是一个不断向外抛的过程：先是询问内网是否存在这个IP，不存在就获得内网的返回报文，再逐级向外发送报文，如果目标IP位于某一级IP地址下，就能通过那一级IP地址向下发送报文，（不太确定是不是代理）回传给本机，最后得到IP\u002F域名的准确地址。",[13,71294,71295],{},"到这差不多就是我理解的题目所给的代码程序了，不一定对但是大体上被我臆想理解了，欢迎各位指正，下面就是实现测试本局域网的所有机器是否在线的代码。（因为我不会用C\u002FC++画GUI，但是要求使用C\u002FC++，所以就直接命令行解决了哈）",[13,71297,71298],{},"设计思路：",[13,71300,71301],{},"1）输入一个起始IP地址，输入一个终止IP地址",[13,71303,71304],{},"2）对范围内的每个IP发送一遍报文",[13,71306,71307],{},"3）记录下每个IP的在线状态",[13,71309,71310],{},"主要代码为两部分：",[13,71312,71313],{},"第一部分为对范围内IP的+1操作：",[13,71315,71316],{},[617,71317],{"alt":119,"src":71318},"img\u002F2.6.png",[13,71320,71321],{},"第二部分就是筛选输出部分：",[13,71323,71324],{},[617,71325],{"alt":119,"src":71326},"img\u002F2.7.png",[13,71328,71329],{},"最终输出结果如下：（这里我为了快速结束，将跳站大小改成了5，同时开了3台虚拟机在节点192.168.10.130\u002F131\u002F132上）",[13,71331,71332],{},[617,71333],{"alt":119,"src":71334},"img\u002F2.5.png",[107,71336,71338],{"id":71337},"三基于-ip-多播的网络会议程序","三、基于 IP 多播的网络会议程序",[13,71340,71341],{},[22,71342,71343],{},"开始于12\u002F22周四但是花了一整天无法完成",[13,71345,71346],{},"首先在书本源码的启动上就遇到了问题。在没搞清楚receiver和sender哪一方需要先启动时，我将两种情况都尝试了下，结果：",[13,71348,71349],{},[617,71350],{"alt":119,"src":29839},[13,71352,71353],{},"无论谁先启动，后启动的都无法加入多播组。看报错：receiver是无法绑定，而sender是无法加入多播组，但是根据代码大题内容来看，sender是没有bind这一过程的，所以说sender也可能是在端口的地方就已经挂掉了。因为双方都能单独启动，所以初步估计代码肯定没什么问题，猜测问题主要是在端口\u002F加入多播组的过程（但是我的常识和第一题告诉我一个端口可以有多个监听但不能有多个占用），抱着这种疑惑开始对整体流程的一个研究。",[13,71355,71356,71357,71362],{},"首先查报错码10048，查到博客",[5009,71358,71361],{"href":71359,"rel":71360},"https:\u002F\u002Fwww.cnblogs.com\u002Fliujx2019\u002Fp\u002F10811330.html",[23647],"套接字服务器绑定失败，错误 10048","了解到是地址已在使用中，那么和我想的端口占用比较相似。",[13,71364,71365],{},"然后就卡在上面这部分，卡了大概3个多小时。一开始以为是加入多播组的问题，反复的查资料看视频了解IP多播，但是发现没啥用，代码无论是理论还是逻辑都没有问题。最后：",[13,71367,71368],{},[617,71369],{"alt":119,"src":62233},[13,71371,71372,71373,71378],{},"反复看报告发现居然是多台PC。。。那我花这么多时间实在是太冤枉了。然后编译完成后拷贝到多个PC使用，但还是不行，服务确实都启动了，但是receiver接收不到消息。查阅很多博客了解到可能是网卡的问题，期间通过",[5009,71374,71377],{"href":71375,"rel":71376},"https:\u002F\u002Fblog.csdn.net\u002FHYZX_9987\u002Farticle\u002Fdetails\u002F125008550",[23647],"不同主机收不到组播消息原因分析","该博客了解到多播IP地址的选取，以及多网卡情况下组播发送不成功。",[13,71380,71381],{},"我用其他PC以及虚拟机都进行了尝试，但是实在是接收不到，不用的网卡全部禁用也无济于事，因为双端没有任何通信，也无从查到报错信息，加上我对路由也不是特别了解，不可能我把家里的路由器给拆了研究下，所以这个实验到此我个人已经没办法推进了。就先记录到这里。",[13,71383,71384],{},[22,71385,71386],{},"12\u002F24晚上10点实现了交互",[13,71388,71389],{},"在这两天的时间中我尝试了各种办法，先说结论吧，其实并不是之前的过程有问题，而是太相信我的打包代码了：上面我提到了端口占用，是的！一开始为了避免这种情况我将receiver和sender的端口修改成了不同的！然后传输到其他PC上的端口不一致，所以接收不到消息。今天解决的契机其实也和我这几天的不断尝试有关：我不断地整我的各个设备（后面会讲到过程中间我做的改动和学到的部分知识），中间甚至把我们家的中继路由玩坏了一次（没错，就是我们家的路由器和一个Wifi放大器，因为中间有一段时间我以为是IP分配的问题），这个时候我就再考虑是不是把我的主机网络环境搞烂了，这时才终于决定用我的笔记本作为sender而主机作为receiver，然后：成功通信了！！！",[13,71391,71392],{},"这个时候意识到是代码的问题时，我已经对主机\u002F笔记本的四个地方进行了修改：防火墙配置、PING服务、网卡配置以及在以太网中开启可靠多播协议。（以下内容虽然和课设无关，但是是我学习得过程，故在此记录）",[13,71394,71395],{},"筛选问题的方式很简单：主要设备为已经修改过的主机、笔记本，和未经过修改过的win11虚拟机（之前测试的虚拟机又有它的用途了！）",[13,71397,71398,71399,71404],{},"我先把两个开启PING服务的电脑服务关闭，重启仍然能正常通信，完美（开启PING服务我参考的博客",[5009,71400,71403],{"href":71401,"rel":71402},"https:\u002F\u002Fblog.csdn.net\u002Fliitdar\u002Farticle\u002Fdetails\u002F127370076",[23647],"Windows 10操作系统中开启Ping功能（ICMP）的方法","，主要是最近一直在整虚拟机，遇事不决先PING，我看两个PC PING不通以为影响了数据的传输。）",[13,71406,71407],{},[617,71408],{"alt":119,"src":71409},"img\u002F3.3.png",[13,71411,71412],{},"防火墙配置无需多说，嗯一般我的电脑到手防火墙就关了。",[13,71414,71415],{},[617,71416],{"alt":119,"src":71417},"img\u002F3.4.png",[13,71419,71420,71421,71426],{},"可靠多播协议是我无意间配置网络环境的时候找到的，本来以为IP多播是默认关闭的，完事之后越想越觉得不对：IP多播不是上网的一个必需品嘛。。。于是就顺藤摸瓜查了下，根据百科",[5009,71422,71425],{"href":71423,"rel":71424},"https:\u002F\u002Fbaike.baidu.com\u002Fitem\u002F%E5%8F%AF%E9%9D%A0%E5%A4%9A%E6%92%AD%E5%8D%8F%E8%AE%AE\u002F19224777?fr=aladdin",[23647],"可靠多播协议","，了解到这其实是一种加强多播利用率，提升系统资源的方式，和我的结果并没有影响。",[13,71428,71429,71430,71435],{},"最后就是网卡地址配置，其实2天前我就找到了这个问题，也试着解决（但是当时真没想到是代码问题）。参考博客太多这里就不例举了，查IP多播通信网上一大堆。简单来说就是需要两个程序保持在同一IP频段下，就比如说假定我的路由是192.168.31.1，那么我的通信设备需要为IP 192.168.31.*，这样才能实现多播通信。（在写这段话的时候我忽然想到了如果别人知道了这个IP，能不能成功黑我的电脑？最近刚好有在看网络安全的书，所以上去搜了下怎么通过IP黑入电脑，看的博客就不细说了，最后的结论就是：192.168.31.*其实是小米路由器分下来的私人频段，靠这个好像黑不到我的电脑【最主要是我自己也没成功把我的笔记本给黑了】，参考文章",[5009,71431,71434],{"href":71432,"rel":71433},"https:\u002F\u002Fwww.xinqtech.com\u002Fsmart\u002F202108\u002F1920852.html",[23647],"路由器IP和电脑IP有什么区别","。）但在研究“黑客技术”的过程中找到了一个有趣的Tracert xxx.xxx.xxx.xxx命令，显示结果如下：",[13,71437,71438],{},[617,71439],{"alt":119,"src":71440},"img\u002F3.9.png",[13,71442,71443],{},"欸？是不是和实验二很像？实验二也叫Tracert，所以其实就是封装了一下我们实验二的内容（稍微高级一点），可以看到，Tracert可以读取链路上的机器名称，XiaoQiang正是我的路由器的名字。虽然和实验无关，但是遇到了觉得有意思记录下。（打码是害怕有人能顺着网线来爆破我）",[13,71445,71446],{},"因此，当我把以太网2\u002F3禁用后，两台电脑就能实现IP多播通信了。（这里以太网2\u002F3是VMWare创建的虚拟网卡，因为是连接状态，所以启动receiver服务会先找以太网而不是WLAN）同样我又进行了虚拟机的测试：我禁用了WLAN和以太网2，以太网3的地址是192.168.10.*，和我的虚拟机IP一致，这个时候就能实现虚拟机和主机间的通信了。",[13,71448,71449],{},"之后我又好奇了下这个程序的执行：如果多台设备通信会如何呢？我把虚拟机的网络连接模式改为桥接，那么虚拟机启动后会像路由申请一个IP，尝试通信能够成功！最后在我的测试下：当有两个（多个）sender时，发送的消息receiver都能接收；当有两个（多个）receiver时，sender发出的消息能被多个receiver接收。（但是仍然有丢包率，可能和我的工作区离路由比较远的缘故\u002F抑或是我在路由之间使用了一个Wifi放大器）",[13,71451,71452],{},[22,71453,71454],{},"12\u002F25完成了实验",[13,71456,71457],{},"再次，首先强烈指责指导书的代码错误：",[13,71459,71460],{},[617,71461],{"alt":119,"src":71462},"img\u002F3.5.png",[13,71464,71465,71466,71469],{},"这是函数While中输入QUIT结束循环的部分，recvbuf",[78,71467,71468],{},"ret"," = '\\0';需要放在if外面执行，strcmp需要读到 '\\0'结束，如果不改变位置实际上需要两次输入QUIT才能退出循环，因为上一次的'\\0'留下了。第一次QUIT会被receive端正常输出，但是此时sender端会执行QUIT结束，需要再开一个sender输入第二个QUIT。",[13,71471,71472],{},"找到这个问题实际上很心酸（花了差不多两个小时），起因是我想实现receiver端接收到固定开始命令再进行显示，修改代码如下：",[13,71474,71475],{},[617,71476],{"alt":119,"src":71477},"img\u002F3.6.png",[13,71479,71480],{},"执行效果如下图：",[13,71482,71483],{},[617,71484],{"alt":119,"src":71485},"img\u002F3.7.png",[13,71487,71488],{},"但是在修改代码前无论如何都接收不到开始命令START，我尝试重复copy新代码再进行修改，修改前能正常通信，但是修改后同样不行。因为sender端改动不大，所以我的主要目的就是放在receiver端。我在经过逐行比对之后发现啥问题也没有。本来准备放弃草草了之，但是实在是不好意思这个实验都做到这个地步了半途而废，所以我开始对课程设计指导书的代码逐行实现。",[13,71490,71491],{},"执行到QUIT的部分，欸，问题出来了：",[13,71493,71494],{},[617,71495],{"alt":119,"src":71496},"img\u002F3.8.png",[13,71498,71499,71500,71505,71506,71508],{},"这个“QUIT”直接输出了！但是我执行第二个QUIT之后成功关闭了。我的第一反应不是代码问题，而是经过昨天的事后想到的是多个连接，我以为是因为在整个链路上有不止一个receiver\u002Fsender导致的关闭需要执行机器数个。但是在我修改了MCASTADDR多播组地址后情况并没有改变。到这已经花了一个多小时，最后只好输出strcmp的值来验证，但是发现每次输出都是1，这就说明传过来的比“QUIT”字段要长啊。但我依然没有意识到这一点，而是专心去找strcmp函数出错的可能。对我帮助比较大的博客",[5009,71501,71504],{"href":71502,"rel":71503},"https:\u002F\u002Fblog.csdn.net\u002Fweixin_34341229\u002Farticle\u002Fdetails\u002F93444463?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-93444463-blog-102492821.pc_relevant_recovery_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3",[23647],"解决strcmp的错误以及VS的快捷键","，这个时候我就重视起了recvbuf",[78,71507,71468],{}," = '\\0';的作用，虽然查了不少博客但我本身对C\u002FC++并不很感兴趣，所以大致浏览了下就过去了，反正问题是解决了。（其实后面想想可能起的是个过滤作用）",[13,71510,71511],{},"最后加了个system(\"pause\")暂停窗格使得实验结果能够保留，至此实验三我是在不想碰了。。。",[107,71513,71515],{"id":71514},"四网络嗅探器的设计与实现","四、网络嗅探器的设计与实现",[13,71517,71518],{},[22,71519,71520],{},"12\u002F23周五理解了代码逻辑",[13,71522,71523],{},"这一题的代码是在Linux上的C代码，头文件给少了两个（其实不是这个的问题），编译通过后会报隐式函数的Warning，但是程序能够正常编译且能够正常运行。但是一开始我运行的时候输出结果如下：",[13,71525,71526],{},[617,71527],{"alt":119,"src":30157},[13,71529,71530],{},"我就纳闷了：根据结果来看这不应该是看看有什么协议通信吗？（当然此时我并没有阅读代码，只是尝试运行）但是全是22端口的TCP通信让人很难理解。我的第一反应是缺少的头文件让隐式函数陷入了循环。很快我就找到了htons函数的头文件#include \u003Carpa\u002Finet.h>和exit()函数的头文件#include \u003Cstdlib.h>，果然不报Warning了，运行结果如下：",[13,71532,71533],{},[617,71534],{"alt":119,"src":30871},[13,71536,71537],{},"确实都不是22了，但是真的是因为头文件吗？其实不是的，之后我会提到。这个时候我就开始看源代码了。首先在while(1)之前的都是定义操作和初始化，但是后面的流程实在是看不懂，于是我尝试阅读指导书，关键是这段：",[13,71539,71540],{},[617,71541],{"alt":119,"src":30924},[13,71543,71544],{},"以我的理解也就是说：它不同于传统的监听端口，而是对整个传输过程的一个复制，所以不需要绑定端口和监听端口，在创造sock的时候就会自动开始记录主机中的报文传输。",[13,71546,71547],{},[617,71548],{"alt":119,"src":30959},[13,71550,71551],{},"这段是比较重要的一段，它其实就说明了整个socket切分的流程（前14位记录目标地址、起始地址和类型\u002F长度，中间20位是IP头，后面8位是协议头）所以没接到一个套接字，就检测下它是不是42位的，小于42位说明传过来的不完整，没必要解析。因为MAC地址的解析与IP的解析过程一致，所以我用下面这一段关键代码讲讲自己的理解：（因为我C语言功底确实不行，所以参考了很多资料）",[13,71553,71554],{},[617,71555],{"alt":119,"src":66059},[13,71557,71558,71559,71564,71565,71570],{},"首先是& 0XFF，参考博客",[5009,71560,71563],{"href":71561,"rel":71562},"https:\u002F\u002Fwww.bilibili.com\u002Fread\u002Fcv5667133\u002F",[23647],"带你在过程中理解&0xff","，了解到，sock过来的应该是Byte类型（虽然定义是char），那这个操作就是保证二进制补码的一致性。而后是输出格式%02x和%.2x（这里截图少截了一点），这里我花了大量的时间查这俩有什么区别，最后得出的结论是：没有区别，而它的作用就是为了转换为16进制数，转换为常见的MAC格式（主要是不足两位的补齐，超过的原样输出），不过这里算是因为个人基础不牢，推荐博客",[5009,71566,71569],{"href":71567,"rel":71568},"https:\u002F\u002Fblog.csdn.net\u002Fm0_65601072\u002Farticle\u002Fdetails\u002F124902817",[23647],"C语言中（%d %.2d %2d %02d）（%2x, %02x, %-2x, %.2x）（%f, %.2f, %2.2f）（%e, %.2e,%3.2e）的区别","巩固下基础。还有一个就是位移运算，以上图p = iphead + 20举例，实际上应该是让p等于iphead20位之后的内容，这里我看逻辑说得通了也就没往下查了。",[13,71572,71573,71574,71579,71580,71585],{},"再往下就进入了switch选择中，其实最开始是查的这一部分，当时不知道是Byte类型，所以不是很懂为什么proto明明只有一位但是能代表17、255这些数字。这些数字是从",[5009,71575,71578],{"href":71576,"rel":71577},"https:\u002F\u002Fbaike.baidu.com\u002Fitem\u002FIPPROTO_ICMP\u002F19519008?fr=aladdin",[23647],"IPPROTO_ICMP_百度百科","查到的，但是实际上是winsock2.h文件中的，没错，其实是Windows下的定义，这些数字也只是代表Windows下的默认编号，很抱歉没有查到Linux下的具体文件，根据最后一个default推测是定义在include\u002Flinux\u002Fin.h文件中，但是这个阶段我还不是很熟练Linux编程，没能找到这个目录（可以在虚拟机中下个CLion但是太花时间了）。IPIP是隧道协议，根据我查到的内容来看并不是Windows下的协议，因为与课设关联不大，所以只看了篇",[5009,71581,71584],{"href":71582,"rel":71583},"https:\u002F\u002Fwww.cnblogs.com\u002Fjiangshubian\u002Farticles\u002F16272522.html",[23647],"Linux IPIP隧道协议","简单了解了下就过去了。",[13,71587,71588],{},"大概根据这么个流程来执行，我大概了解了整个代码的运行流程（虽然简述很短，但实际上到这里已经花了4h以上了）这个时候就能显著了解到：**因为缺少头文件执行出来全是TCP22的输出是不正确的。**真实的情况实际上是图一是我采用本地终端远程ssh连接到虚拟机上的，所有的消息都需要通过22端口进行转发，此时其实也有其他端口和其他协议，但是因为这个请求的持续执行，所以不断请求22端口导致其他端口的回复被掩埋了。",[13,71590,71591],{},"OK，现在才能正式开始网络嗅探器的设计。",[13,71593,71594],{},[22,71595,71596],{},"12\u002F125周日、12\u002F26周一完成剩下的部分",[13,71598,71599],{},"还是有自知自明的，虽然能看懂大部分代码了，但是让我上手写确实十分吃力。因为Linux端的代码课程设计上的给得已经很完美了，所以只好尝试写个Windows上的Raw Socket。大概流程如下：",[13,71601,71602],{},"创建Row Socket --》将Row Socket绑定到本地网卡 --》 用个啥玩意监听\u002F接收IP包 --》解析IP包数据",[13,71604,71605,71606,71609,71610,71615],{},"不断看博客发现那个“啥玩意”是",[22,71607,71608],{},"SIO_RCVALL","（其实是看了不少大佬的实现代码），关于SIO_RCVALL可以参考微软官方",[5009,71611,71614],{"href":71612,"rel":71613},"https:\u002F\u002Flearn.microsoft.com\u002Fzh-cn\u002Fwindows\u002Fwin32\u002Fwinsock\u002Fsio-rcvall",[23647],"SIO_RCVALL 控制代码 ","，讲真这玩意没水平都不一定看得懂，反正我就挺没水平的。。。主体代码如下（刨去了初始化过程，毕竟初始化题一题二题三都有，c\u002Fcpp的都有）：",[13,71617,71618],{},[617,71619],{"alt":119,"src":71620},"img\u002F4.6.png",[13,71622,71623],{},"（有注释的地方很多都是从各个大佬的代码里抄来的，值得注意的是：对于Row Socket的创建Windows和Linux一样，都需要管理员权限）",[13,71625,71626],{},[617,71627],{"alt":119,"src":71628},"img\u002F4.7.png",[13,71630,71631],{},"关于TCP\u002FIP结构的来源也是在网上查询使用的，看这个比较全就全部采用了，实际上并没有使用到这么多东西，主要是一个Protocol协议的判断、端口的判断和IP地址的判断。关键代码如下（也只有这里大部分是自己写的）：",[13,71633,71634],{},[617,71635],{"alt":119,"src":71636},"img\u002F4.8.png",[13,71638,71639],{},[617,71640],{"alt":119,"src":71641},"img\u002F4.9.png",[13,71643,71644],{},"这里就是对IP报文的地址、协议、端口进行拆分，模仿附录四中的代码修改的，因为有之前对Linux版的代码解释，这里就不过多赘述了。运行结果如下：",[13,71646,71647],{},[617,71648],{"alt":119,"src":71649},"img\u002F4.10.png",[13,71651,71652],{},"这里建议使用终端（cmd\u002Fpowershell之类的，我这里使用的是Tabby，最近发现的好用的开源软件【夹点私活】）打开exe文件，因为写的while循环没有终止条件，所以一旦退出就没有显示可以保留了。可以观察到大部分协议都是TCP\u002FUDP，但是其实并不是只有他俩，我还观察到了ICMP协议。写到这里，搞得我又想修改下代码了。。。",[13,71654,71655],{},[617,71656],{"alt":119,"src":71657},"img\u002F4.11.png",[13,71659,71660],{},"好的，我又回来了，把TCP\u002FUDP协议过滤掉之后，控制台成功输出了ICMP协议，但是呢并不是等待就会出来的。。。我发现这个需要你点击浏览器发送新的互联网请求才会生成ICMP协议，ICMP协议是一种面向无连接的协议，用于传输出错报告控制信息。我想大概是确定是否成功连接才存在的吧，因为在浏览器成功回显的时候控制台才有输出，并且是输出2条以上，大概是发送n条、回传一条（没有成功访问报文大概会丢弃？因为控制台没有输出）",[13,71662,71663],{},"然后是之前图上的红色部分，代码中将TCP头过滤掉之后能显示出发送的内容是什么（大概），这里主要监听了80、8080和21这三个常见的互联网端口。这个时候我又好奇了，我之前在过程中看到了80端口的回复那么是不是可以物理层面上见识下TCP三次握手？说干就干：",[13,71665,71666],{},[617,71667],{"alt":119,"src":71668},"img\u002F4.12.png",[13,71670,71671],{},"过滤掉无关代码，只保留TCP连接的监听，同时输出发送方\u002F接收方的消息，得到结果如下：",[13,71673,71674],{},[617,71675],{"alt":119,"src":71676},"img\u002F4.13.png",[13,71678,71679],{},"当然，每次请求的次数是不一样的，内容其实也不是这些东西，只是因为在UTF-8编码下长这样，但是大概还是感觉能表现TCP三次握手：我观察到的是每一次相同的send的请求必须要收到至少两次相同receive才会改变内容，的确没观察到单个send之后就改变了内容的输出。不过诧异的是receive返回并不包含任何消息（但是其实给了个IP），总之最终是不是TCP三次握手我也不能确定，但是在我心中它就已经是了。",[49,71681,71682,71685],{},[52,71683,71684],{},"顺便补充下要注意的点：VMWare是真的很恶心的但是你又不得不用它，IP绑定其实默认绑定在以太网上，也就是我笔记本没装VMWare没有虚拟以太网服务，这WLAN分给的IP绑定不上。。。从图中也可以看出：明明IP是192.168.85.1，但实际绑定的是192.168.31.220，前者是虚拟机以太网服务，后者是真正的路由分配给的IP，但是实际上这里是通过虚拟以太网监听WLAN得到的结果（大概）。但是又有一点要注意：VMWare默认会创建两个以太网，报文通过第一层以太网之后会转发给第二层以太网，这时候问题就出现了：所有的协议都是转发过来的，和之前Linux ssh一样，所有的报文变成了UDP报文，这在开始也困扰了我很久。（当时第三题还没解决，第三题解决的时候我就推测可能是一样的问题了）。",[52,71686,71687],{},"以上注意完全是我遇到的问题结合个人推测，各位以实际情况为准。",[13,71689,71690],{},"**最后，第五题的话Wireshark其实我下了，也大概看了下它的流程和结果，理论山其实和我这里监听80\u002F8080\u002F21端口的意思差不多，但是实际上要做的处理和分析的工作量是巨大的（光还原报文剩余部分的机器码就得查很多资料），个人建议第五题不用太放在心上，不然消耗的就是青春和头发。**这里放一张Wireshark的运行截图证明我来过：",[13,71692,71693],{},[617,71694],{"alt":119,"src":71695},"img\u002F4.14.png",[107,71697,71699],{"id":71698},"五电子邮件客户端程序设计与实现","五、电子邮件客户端程序设计与实现",[13,71701,71702],{},[22,71703,71704],{},"完成于12\u002F27周二",[13,71706,71707],{},"惯例吐槽一下指导书：书本6.5节有教我怎么写代码吗？看完之后和没看差别不大，格式和流程都说的不是很清楚。挑这一题主要不是为了完成指导书上的题目（因为三个就足够了），而是对于实现电子邮件发送比较好奇：我们在生活中经常能够收到类似于Github\u002FSteam等网站发来的官方消息，是有一个人在后台给你实时发送吗？还是写了个图形化捕捉脚本？都不是，正确的方式应该是写一个完整的流程，在本地填充邮件内容后批量发送给用户。那么在这里，用到的传输协议就是SMTP\u002FPOP3，关于协议内容可以自行看书或查资料了解。",[13,71709,71710,71711,71716,71717,52204,71722,71727],{},"因为主要目的是为了学习，所以这里使用Java进行编程，直接参考别人的实验进行理解。如果有时间我会修改成C\u002FC++用来完成课程设计。主要参考博客",[5009,71712,71715],{"href":71713,"rel":71714},"https:\u002F\u002Fcsdn-czh.blog.csdn.net\u002Farticle\u002Fdetails\u002F110913974",[23647],"Java网络编程：实现QQ邮件发送客户端","的思想，但是其中过程太过复杂，从学习层面上升到了应用层面，只有一个简单的Java类，需要实现邮件客户端交互得自己写主类。所以实际上我是参考",[5009,71718,71721],{"href":71719,"rel":71720},"https:\u002F\u002Fdandelioncloud.cn\u002Farticle\u002Fdetails\u002F1548136622394716161",[23647],"JavaMail--基础类详解",[5009,71723,71726],{"href":71724,"rel":71725},"https:\u002F\u002Fwww.dandelioncloud.cn\u002Farticle\u002Fdetails\u002F1515189508248227841",[23647],"JavaMail详解","这两篇博客，通过JavaMail API进行编写。（需要用到JavaMail API，两个jar包为javax.activation和javax.mail，但是这两个jar包并不是JDK自带的，所以需要自行下载导入）第一版代码如下：",[13,71729,71730],{},[617,71731],{"alt":119,"src":66141},[13,71733,71734],{},"这里配置的是一个通过QQ邮箱发送邮件到谷歌（GMail）邮箱的代码，执行成功如下图：",[13,71736,71737],{},[617,71738],{"alt":119,"src":71739},"img\u002F5.2.png",[13,71741,71742],{},[617,71743],{"alt":119,"src":71744},"img\u002F5.3.png",[13,71746,71747],{},"通过代码不难看出（毕竟每一行的注释我都给出来了），只需要简单的设置协议、封装对象，就可以使用通过SMTP协议实现两个邮箱之间的通信。类似于时间、发件人之类的配置，则是根据发件方邮箱的安全系数来指定的。（QQ邮箱的安全校验过于严格，而类似于163邮箱甚至允许没有发件人进行邮件的发送【这我也是听说的，没有亲自尝试】）",[13,71749,71750],{},"基于SMTP协议的邮件发送大致就是这样，在查阅资料的过程中还发现了JavaMail API可以实现POP协议查看邮箱中的邮件功能，POP允许本地计算机上的用户代理程序连接到邮件服务器，将用户的邮件取回到本地。实现代码和结果如下：",[13,71752,71753],{},[617,71754],{"alt":119,"src":71755},"img\u002F5.4.png",[13,71757,71758],{},[617,71759],{"alt":119,"src":71760},"img\u002F5.5.png",[13,71762,71763],{},"可能是QQ的反扒机制吧，不可能输出所有的邮件，大概输出了5封左右控制台就报错了，可以通过休眠等方法避免（大概），这里就不做尝试了。",[13,71765,71766],{},"最终将代码修改成可以自定义的模式：",[13,71768,71769],{},[617,71770],{"alt":119,"src":71771},"img\u002F5.6.png",[13,71773,71774],{},[617,71775],{"alt":119,"src":71776},"img\u002F5.7.png",[13,71778,71779,71780,67],{},"这里邮件服务因为配置的是pop.qq.com所以只能从QQ邮箱拿邮件（其实配置谷歌我也试过了，但是一直拿不到，洋人的玩意就是难用），只需要修改stmp\u002Fpop中的协议适用对象就能实现不同邮箱的登录、查看。关于C++版本的代码也大概写出来了，不过是和别的同学一起完成的，和Java最大的不同就是：C++使用底层实现SMTP，",[22,71781,71782],{},"配置都是即时的",[13,71784,71785],{},"什么意思呢？以下面这段SMTP部分核心代码为例：",[13,71787,71788],{},[617,71789],{"alt":119,"src":71790},"img\u002F5.8.png",[13,71792,71793,71794,71799],{},"在创建socket套接字后并不是一股脑把配置填进去，而是连接上服务器后，先发送使用邮箱方的请求，再选择登陆方式，最后输入base64编码格式的账号和密码。没错，参考博客",[5009,71795,71798],{"href":71796,"rel":71797},"https:\u002F\u002Fblog.csdn.net\u002Fqq_25258019\u002Farticle\u002Fdetails\u002F126188844",[23647],"为什么要用base64编码","，SMTP最底层仍是使用base64编码的方式进行数据传输，因为在线转base64编码太麻烦了，所以这里事先就把发信邮箱已经填上去了。同样，QQ对于Message的校验非常严格，例如这种发件人到收件人的配置，使用Java语言是完全不需要配置的，但是再C++中但凡出错一点，邮件就直接发不出去了。",[13,71801,71802],{},[617,71803],{"alt":119,"src":71804},"img\u002F5.9.png",[13,71806,71807],{},"上面这段Message内容要求格式的绝对对齐，都快赶上像是一种填充html的形式了。POP3的代码和这类似，在这就不做展示了，唯一的区别就是POP3协议的连接采用明文，不需要将账号密码转化为base64格式。最后测试结果和输出结果如下：",[13,71809,71810],{},[617,71811],{"alt":119,"src":71812},"img\u002F5.10.png",[13,71814,71815],{},[617,71816],{"alt":119,"src":71817},"img\u002F5.11.png",[13,71819,71820],{},"C++版本确实不太行，主要是代码复杂且报文会丢。。。这我是没想到的，我的第三次发送直接石沉大海了，但是第三第四次代码完全没有改动。。。发送报文丢了recv都不会有回复，这个时候程序就卡死在了recv阶段。总之，这个实验就这样吧，再往复杂的走还能做的处理很多，不过能独立把Java版本掌握我已经很满足了。",{"title":119,"searchDepth":144,"depth":144,"links":71822},[71823,71824,71825,71826,71827],{"id":71095,"depth":132,"text":71096},{"id":71233,"depth":132,"text":71234},{"id":71337,"depth":132,"text":71338},{"id":71514,"depth":132,"text":71515},{"id":71698,"depth":132,"text":71699},{},"我的大学\u002F大三上学期\u002F计算机网络\u002F计网课设.md","\u002Fundergraduate\u002Fnote-84eb882cc014",{"title":71071,"description":119},"undergraduate\u002Fnote-84eb882cc014",[14541,7744,246,14542,23333],"xxpPB2pF6nVIRJKTA_dhx65VW6_Aa0QxXuTsPDxLtvA",{"id":71836,"title":71837,"assetBase":239,"author":8,"body":71838,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":71860,"navigation":128,"originalPath":71861,"path":71862,"seo":71863,"source":23330,"stem":71864,"tags":71865,"weight":250,"__hash__":71866},"content\u002Fundergraduate\u002Fnote-873fc0920d40.md","重新过一遍前端",{"type":10,"value":71839,"toc":71856},[71840,71844,71847,71850,71853],[4517,71841,71843],{"id":71842},"修炼我的前端","修炼我的前端？",[7759,71845,71846],{"id":71846},"不浅显的起步",[13,71848,71849],{},"虽然不是专业搞前端的，但还是准备“看下”这本书，无他，一个是因为之前有写过前端，但是被别人吐槽太丑了；二个是这是淘宝的前端团队撰写的，比较新且比较前沿（我指的是设计理念）。当然，还有最重要的：《白帽子讲Web扫描》这本书。。。我环境配不齐，本来以为是《白帽子讲Web安全》的作者写的续作，毕竟这一本已经有十年的历史了，但没想到是网络爬虫相关，实操性比较高。但是实操性这种东西，是由时效性的，这几年技术快速爆炸，我已经找不齐书中的环境了（笑哭），最后尝试了大概十小时无法起步后最终选择换一本书缓解一下，这就是我和这本书的开始。",[7759,71851,71852],{"id":71852},"结束",[13,71854,71855],{},"不是每一本书都会做笔记哒！这种整体轮廓类的还是相当于简单过一遍前端的知识体系，权当茶余饭后的消遣罢了。（对于不学前端的，看看总是有好处的；没开始\u002F想开始前端学习的，那这本书还不错；已经学过不少的，那么基本上只能当复习资料来看咯）",{"title":119,"searchDepth":144,"depth":144,"links":71857},[71858,71859],{"id":71846,"depth":144,"text":71846},{"id":71852,"depth":144,"text":71852},{},"TalkingAbout\u002F前端\u002F2_《前端修炼小册》 淘系前端团队\u002F重新过一遍前端.md","\u002Fundergraduate\u002Fnote-873fc0920d40",{"title":71837,"description":119},"undergraduate\u002Fnote-873fc0920d40",[23333],"gBPMLgRMpa0_XRuncwqsP2Z-9z6WYN7h-gpnC772SR4",{"id":71868,"title":71869,"assetBase":239,"author":8,"body":71870,"category":25506,"collection":23324,"date":23325,"description":71878,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":72315,"navigation":128,"originalPath":72316,"path":72317,"seo":72318,"source":23330,"stem":72319,"tags":72320,"weight":250,"__hash__":72321},"content\u002Fundergraduate\u002Fnote-89674a8f00e8.md","大模型推理加速综述",{"type":10,"value":71871,"toc":72294},[71872,71876,71879,71882,71885,71888,71891,71894,71897,71900,71903,71906,71913,71917,71920,71923,71926,71930,71933,71937,71940,71944,71948,71955,71961,71968,71971,71977,71992,71995,71999,72002,72005,72008,72012,72015,72018,72028,72031,72035,72038,72055,72059,72062,72068,72072,72075,72079,72082,72088,72102,72106,72109,72120,72123,72134,72138,72141,72149,72153,72156,72160,72163,72167,72170,72181,72185,72188,72192,72195,72198,72202,72205,72222,72226,72229,72232,72235,72246,72250,72253,72257,72260,72264,72267,72287,72291],[4517,71873,71875],{"id":71874},"高效的生成式大语言模型服务从算法到系统的综述","高效的生成式大语言模型服务——从算法到系统的综述",[13,71877,71878],{},"美国卡内基梅隆大学苗旭鹏",[13,71880,71881],{},"美国卡内基梅隆大学加布里埃尔·奥利亚罗",[13,71883,71884],{},"美国卡内基梅隆大学张志豪",[13,71886,71887],{},"美国卡内基梅隆大学程新浩",[13,71889,71890],{},"美国卡内基梅隆大学金泓毅",[13,71892,71893],{},"美国卡内基梅隆大学陈天奇",[13,71895,71896],{},"美国卡内基梅隆大学贾之豪",[13,71898,71899],{},"在人工智能（AI）快速发展的领域中，生成型大型语言模型（LLMs）位于前沿，彻底改变了我们与数据的交互方式。然而，在需要低延迟和高吞吐量的场景中部署这些模型将对于计算强度和内存消耗的效率提供方面有了更大要求。该论述从机器学习系统（MLSys）的研究视角来讨论高效 LLM 服务方法的迫切需求，这是人工智能创新和实际系统优化的关键。本文提供深入的分析，涵盖一系列解决方案，从尖端的算法修正到系统设计的突破性变化。这项调查旨在提供对高效 LLM 服务的当前状态和未来方向的全面了解，为研究人员和从业人员在有效克服部署 LLM 的障碍、重塑 AI 的未来方面提供有价值的见解。",[13,71901,71902],{},"CCS 概念：• 计算方法学→机器学习；并行计算方法学；自然语言处理；• 一般和参考→调查和概述；• 硬件→新兴设备和系统的分析和设计；新兴技术；• 计算机系统组织→架构；• 软件及其工程→操作系统。",[13,71904,71905],{},"额外关键词和短语：大型语言模型，效率，算法，系统，推理，服务。",[13,71907,71908,71909],{},"ACM参考格式：Xupeng Miao, Gabriele Oliaro, Zhihao Zhang, Xinhao Cheng, Hongyi Jin, Tianqi Chen, and Zhihao Jia. 2018. 向高效的生成式大型语言模型服务迈进：从算法到系统的调查. J. ACM 37, 4, 文章111 (2018年8月), 32页。",[5009,71910,71911],{"href":71911,"rel":71912},"https:\u002F\u002Fdoi.org\u002FXXXXXXX.XXXXXXX",[23647],[107,71914,71916],{"id":71915},"_1-引言","1. 引言",[13,71918,71919],{},"生成式大型语言模型（LLMs）已成为推动人工智能（AI）实现重大进展的主导力量，并在许多与语言相关的任务中展示出卓越的性能。从机器翻译到情感分析、问答和文本生成，这些模型在理解、生成和操作人类语言方面展示了自己的能力。基于 Transformer 的架构的出现，如 GPT 系列（Generative Pre-trained Transformer）、LLaMA 系列和其他最新的公开 LLMs（如 OPT 、BLOOM、Mistral 、DeciLM、Baichuan 、GLM），在这一模式转变中起到了关键作用，彻底改变了自然语言处理（NLP）任务的处理方式。除了 NLP，这些模型还在更广泛的应用领域产生变革，包括自动化编程、科学探索、个性化数字助手、创意艺术和下一代计算架构，展示了它们的多功能性和深远影响。",[13,71921,71922],{},"然而，LLM 史无前例的成功也带来了一系列挑战，其中最显著的是在服务过程中对计算资源的巨大需求。庞大的模型大小和复杂性，加上对大量计算资源的需求，阻碍了它们在实际应用中的广泛部署。这些模型对资源的密集利用性引发了对能源消耗、可扩展性和可访问性的担忧，阻碍了它们在没有像大公司那样丰富计算资源的更广泛社区中的采用。",[13,71924,71925],{},"本调查论文旨在解决高效的 LLM 服务的关键需求，并全面探讨研究界提出的现有多方面策略，以解决这一挑战。我们对从算法创新到新型系统架构的整个解决方案范围进行了深入研究，所有这些解决方案都旨在优化大型语言模型的推理过程。",[7759,71927,71929],{"id":71928},"_11-目标","1.1 目标",[13,71931,71932],{},"本次调查的主要目标是全面介绍 LLM 服务和推理方面的最新进展。我们将根据它们的基本方法系统地审查和归类现有的技术，突出它们的优点和局限性。这项调查将涵盖广泛的方法论，包括解码算法、架构设计、模型压缩、低位量化、并行计算、内存管理、请求调度和内核优化。",[7759,71934,71936],{"id":71935},"_12-结构","1.2 结构",[13,71938,71939],{},"本文的结构如下：第  2节介绍了关于 LLM 服务的背景信息。第 3 节包括我们对高效 LLM 服务现有方法的分类，并从算法创新 (§ 3.1) 和系统优化 (§ 3.2) 两个方面重新审视了这些相关工作。之后，我们列出了一些代表性的 LLM 服务框架，并在第 4 节提供了分析。第 5 节讨论了 LLM 服务系统的基准测试。第 6 节阐明了本调查与其他相关文献的联系。最后，在第 7 节提出了一些有前景的探索方向，以提高生成式 LLM 服务的效率，以激励未来的研究。",[107,71941,71943],{"id":71942},"_2-背景","2 背景",[7759,71945,71947],{"id":71946},"_21-基于-transformer-的大型语言模型","2.1 基于 Transformer 的大型语言模型",[13,71949,71950,71951,71954],{},"基于 Transformer 的大型语言模型（LLMs）在自然语言处理领域标志着重大转变，引入了一种理解和生成人类语言的新范式。这一创新的核心是 Transformer 架构，它建立在自注意力机制的概念基础之上，允许模型在进行预测时权衡输入数据的不同部分的重要性。在数学上，Transformer中的自注意力机制可以描述如下：对于输入序列 𝑋 = ",[78,71952,71953],{},"𝑥1, 𝑥2, ..., 𝑥𝑛","，Transformer使用 𝑋 的线性变换来计算一组查询 𝑄、键 𝐾 和值 𝑉。然后计算自注意力分数如下：",[13,71956,71957],{},[617,71958],{"alt":71959,"src":71960},"(1)","img\u002F(1).png",[13,71962,71963,71964,71967],{},"其中，𝑑",[25921,71965,71966],{},"𝑘"," 是键的维度。这种机制使得模型能够针对输出的每个元素，在输入序列的不同部分上进行聚焦，捕捉不论它们在输入序列中的距离多远的复杂依赖关系。",[13,71969,71970],{},"Transformers 中的另一个重要结构是前馈网络（FFN），它存在于 Transformer 的每一层，显著地增加了计算强度。FFN 通常由两个线性变换和一个非线性激活函数组成，通常表示为：",[13,71972,71973],{},[617,71974],{"alt":71975,"src":71976},"(2)","img\u002F(2).png",[13,71978,71979,71980,71982,71983,71985,71986,71988,71989,71991],{},"这里，𝑊",[25921,71981,469],{},"、𝑊",[25921,71984,472],{},"、𝑏",[25921,71987,469],{}," 和 𝑏",[25921,71990,472],{}," 是 FFN 的可学习参数，非线性函数 max(0, ·)（在本例中为 ReLU）引入了模型所需的非线性，使其能够学习更复杂的模式。FFN 对模型的参数数量以及由此引起的内存占用和计算负荷负有重要责任。在每个 Transformer 层中，多头注意力（MHA）从输入的不同部分汇总信息后，FFN 对每个位置的这些汇总信息进行独立处理。这种并行处理能力是 Transformer 的关键优势，使其能够有效处理序列。然而，这也意味着计算负荷和内存需求会随着输入序列的长度和网络深度而增加。",[13,71993,71994],{},"基于 Transformer 的语言模型中，自注意力机制和前馈神经网络的组合使得这些模型能够捕捉各种语言背景和细微差别，在各种自然语言处理任务中树立了新的基准。然而，训练和推理所需的计算资源较多已经成为研究的一个重要领域，着重优化这些方面而不会显著影响性能。Transformer 模型还包括其他关键组件，例如位置编码，它添加了有关序列中每个标记位置的信息，以及多头注意力机制，它使得模型能够在不同的表示空间中关注序列的不同部分。",[7759,71996,71998],{"id":71997},"_22-gpu和其他加速器","2.2 GPU和其他加速器",[13,72000,72001],{},"对于 LLM 的迅速发展，很大程度上归功于 GPU 架构和其他加速器的发展，这些是提高模型性能和效率的核心。 GPU（图形处理单元）已成为这一领域的基石，主要是因为其卓越的并行处理能力。与专为顺序处理而设计的传统CPU不同，GPU由数千个小型高效核心组成，旨在同时处理多个任务。这使它们非常适合处理在深度学习计算中普遍存在的矩阵和向量运算，特别是针对基于 Transformer 的模型。",[13,72003,72004],{},"典型的 GPU 架构包括流式多处理器（SM）阵列，每个 SM 包含多个核，这些核共享一个公共指令单元，但可以并行执行独立的线程。此外，每个 SM 内的共享内存（SRAM）允许线程之间进行高效的数据交换和同步，极大地优化了 LLM 计算所需的内存访问模式。这种设计对 LLM 中的计算密集型任务特别有益，如 Transformer 中的自注意力和前馈网络的计算。GPU 还配备了高带宽内存（HBM），这使得数据传输速率更快，大大减少了大规模计算中与内存访问相关的瓶颈。此外，最新的 GPU 架构，如 NVIDIA 的 Ampere 和 Hopper 架构，不断提供增强功能并突破 LLM 计算的极限，例如改进的内存带宽和容量，更高的每秒浮点运算（FLOPS），专门的混合精度计算单元（例如张量核心），以及更有效地利用资源，进一步加强了 LLM 的性能。其中一些支持各种精度格式，包括 FP32（32位浮点）、TF32（张量浮点-32）、FP16（16位浮点）、BF16（脑浮点）、甚至 INT8\u002FINT4，从而在计算速度和数值精度之间提供灵活的权衡，这对 LLM 性能的优化至关重要。",[13,72006,72007],{},"除了 GPU 以外，研究人员还探索了大量的硬件平台用于低量化感知部署，其中包括 CPU、移动和边缘设备、ASIC，以及专用加速器如 TPU、FPGA 和来自各个制造商的其他新兴 AI 芯片（如苹果M2 Ultra，AWS Inferentia，SambaNova，Cerebras ，Graphcore IPU）。这项调查主要强调了基于 GPU 使用的研究，以及推动这一重点的几个技术动机。由于其架构创新和卓越的计算能力，GPU 在过去几年中主导了大规模深度学习领域的研究。此外，GPU 的编程语言，如 NVIDIA 的 CUDA 和 AMD 的ROCm，可以对线程层次结构进行精细控制，使研究人员能够利用GPU内在的大规模并行性。这吸引了众多开发者在这些 GPU 之上构建成熟的软件生态系统，促进了大部分重要和先进的低量化感知研究。虽然其他硬件平台确实在特定环境中具有独特的优势，但围绕 GPU 的广泛的研究、开发和部署使其成为深入理解低量化感知推理方法的重要参考。考虑到硬件的相似性，其他硬件平台也可以从本调研中讨论的设计理念、见解和方法中受益。",[7759,72009,72011],{"id":72010},"_23-llm-推断","2.3 LLM 推断",[13,72013,72014],{},"LLM 推断，特别是在像 GPT（生成式预训练 Transformer）这样的模型中，通常采用自回归解码方法。这种方法对于这些模型生成文本至关重要，确保每个新生成的单词或标记都考虑了到目前为止生成的整个序列。自回归解码按照顺序预测序列中的下一个标记，考虑到所有先前的标记，如算法 1 所示。",[13,72016,72017],{},"![Algorithm 1](img\u002FAlgorithm 1.png)",[13,72019,72020,72021,72024,72025,72027],{},"在这里，𝑃 (𝑦|𝑋",[25921,72022,72023],{},"𝑡−1",") 代表给定当前序列 𝑋",[25921,72026,72023],{}," 时下一个令牌 𝑦 的概率，⊕ 表示连接操作。argmax 函数用于在每一步选择最有可能的下一个令牌。",[13,72029,72030],{},"这种自回归方法在生成连贯的和上下文适当的文本的 LLM 推断中是基础性的。它确保每个生成的标记都是基于对先前生成内容的全面理解条件，从而使 LLM 能够生成高度相关和流畅的文本序列。之前的研究提供了对基于 Transformer 的 LLM 推断算法强度（例如，计算 FLOPS、I\u002FO 和内存消耗）的深入分析，以及对成本估计的广泛实证结果（例如，根据自回归解码算法执行模型推断延迟）。LLM 推断的优化是一个复杂的问题，因为不同的算法配置和系统设置可能存在不同的最优策略。",[7759,72032,72034],{"id":72033},"_24-挑战","2.4 挑战",[13,72036,72037],{},"本节描述了实现高效的 LLM 服务的各种挑战。",[49,72039,72040,72043,72046,72049,72052],{},[52,72041,72042],{},"**延迟和响应时间。**在大型语言模型的推断中，实现低延迟和快速响应时间是非常重要的，特别是在实时应用程序（如聊天机器人、虚拟助手和交互系统）中。在不降低准确性的前提下，平衡模型复杂性和推断速度是一个关键的挑战，需要优化算法和系统架构，以最大程度地减少响应时间。",[52,72044,72045],{},"**内存占用和模型大小。**大型语言模型由于其规模和包含的大量参数而具有显著的内存需求。在内存受限的设备上部署这种模型是一个挑战，需要开发有效的模型压缩技术和系统优化方法，以减少内存占用，同时不损害性能。",[52,72047,72048],{},"**可扩展性和吞吐量。**推断系统通常在生产环境中面临不同级别的请求负载。确保可扩展性和高吞吐量，以有效处理多个同时请求，需要并行计算、请求调度和其他系统级优化方法，以有效地分配资源上的计算工作负载。",[52,72050,72051],{},"**硬件兼容性和加速。**高效利用硬件资源对于大型语言模型推理至关重要。将 LLM 模型适配到各种硬件平台和架构，包括 CPU、GPU 和专门的加速器，需要硬件感知的算法设计和优化，以充分发挥底层硬件的潜力。",[52,72053,72054],{},"**精确性和效率之间的权衡。**优化 LLM 推理的效率有时可能会牺牲模型的准确性。在模型大小、计算复杂度和性能之间取得合适的平衡是一个具有挑战性的任务，需要仔细考虑和评估各种算法和系统级技术。",[107,72056,72058],{"id":72057},"_3-分类","3 分类",[13,72060,72061],{},"目前改善 LLM 服务效率的努力可以大致分为两类，包括算法创新和系统优化，下面将分别讨论这两类。",[13,72063,72064],{},[617,72065],{"alt":72066,"src":72067},"Fig.1.","img\u002FFig.1..png",[7759,72069,72071],{"id":72070},"_31-算法创新","3.1 算法创新",[13,72073,72074],{},"本节对提出的各种算法和技术进行了全面分析，旨在通过算法进步解决大规模 Transformer 模型的性能缺陷问题。",[10548,72076,72078],{"id":72077},"_311-解码算法","3.1.1 解码算法",[13,72080,72081],{},"在本章中，我们将回顾如图 2 所示的优化 LLM 推理过程的新型解码算法。这些算法旨在降低计算复杂性，增强在生成任务中语言模型推理的整体效率。",[13,72083,72084],{},[617,72085],{"alt":72086,"src":72087},"Fig.2.","img\u002FFig.2..png",[49,72089,72090,72093,72096,72099],{},[52,72091,72092],{},"**非自回归解码。**现有 LLM 的一个主要限制是默认的自回归解码机制，逐个生成输出标记。为了解决这个问题，有一系列研究工作的代表性线路是放弃自回归生成范式，采用并行解码的输出标记。非自回归解码首先被提出用于机器翻译加速，通过在解码过程中打破单词之间的依赖关系，假设一定程度的条件独立性。为了缓解翻译质量降低，一些后续研究如半自回归解码进一步扩展这些非自回归方法，通过建模输出之间的依赖关系或迭代优化输出标记，达到保证自回归模型的质量。块状并行解码在基础 LLM 中插入一个单一的前馈层，以并行方式预测未来多个位置的输出，然后回退到由基础模型验证的最长前缀。然而，这些方法需要奢侈地重新生成具有新依赖性的新  LLM，或调整原始 LLM 的部分层，这并不总是可行的。最近一些工作致力于在一个解码步骤中生成多个标记，而无需对模型进行任何训练或修改。并行解码将贪婪自回归解码重新构造为一个可以并行解的非线性方程系统，利用雅可比和高斯-塞德尔迭代法进行快速推理。已经提出了一份关于非自回归翻译的广泛调研，总结了这个方向上的最近进展。到目前为止，由于对输出标记之间的条件依赖关系缺乏认识，大多数非自回归方法的输出质量仍然不如自回归方法可靠，尽管在解码速度上有所提升。",[52,72094,72095],{},"**探索性解码。**另一方面，通过利用推测执行和提高解码并行性，可以解决顺序执行的限制。在自回归 LLM 推理过程中，每个解码步骤都可以视为执行一个带有条件分支的程序，例如决定下一个要生成的标记。推测解码提出了一种在高效的方式下首先进行多步预测的方法（例如，使用具有更少模型参数的较小的草稿模型），并与 LLM 同时验证这些预测。然而，将推测解码应用于 LLM 仍然存在一些实际挑战，例如如何使解码预测轻量级且足够准确，以及如何使用 LLM 实现高效的并行验证。SpecInfer 首先通过引入多个小的草稿模型，配合一种基于树状结构的推测推理和标记验证机制，并提出了低延迟 LLM 服务系统的实现（第 4 节）。推测解码的主要优势在于增加了并行性而无需更改输出。这种保证来自于预测输出始终由原始 LLM 进行验证，当预测出错时会启用备用机制。",[52,72097,72098],{},"**提前退出。**一些其他研究试图利用现有 LLM 的深层多层架构，并利用提前退出机制来加速解码过程。这种方法的基本思想是，提前模型层的输出有能力自信地推断目标分布。它们可以基于内部分类器发出预测，而不必运行整个 LLM，已经探索了各种退出条件 。它们也被称为自适应计算，因为它们调整每个请求的计算量，以摊销总的推理成本，即在更容易推理的请求中使用较少的计算量。广泛而言，这些方法大多限制于内部表示所携带的信息不足，并且可能无法准确预测。",[52,72100,72101],{},"**级联推理。**根据推理请求的复杂性不同，级联推理采用一系列不同规模的 LLM 套件来最小化响应时间。CascadeBERT 不直接使用大型模型处理每个查询，而是涉及一系列对应于不同模型深度的内部分类器，并以级联的方式进行组织，根据实例的难度自适应地选择适当的分类器。Tabi 优化用于服务辨别模型（即非生成型 LLM）的方法，但采用类似的方法，将小型模型和 LLM 结合起来处理具有不同置信度的查询。Frugal-GPT 利用基于学习的方法，自适应地将查询分配给不同的 LLM API，同时优化成本和性能。并行工作联合优化模型复用和查询缓存，并分析最小化推理成本的最优性。Mixture-of-thought 将级联思想扩展到 LLM 的推理任务中以节省成本，它从 Chain-of-Thought 和 Program-of-Thought 提示中采样答案。总的来说，级联推理是提高推理效率的一个有前景的方向，但设计准确的调度机制以避免牺牲模型质量仍然具有挑战性。",[10548,72103,72105],{"id":72104},"_312-架构设计","3.1.2 架构设计",[13,72107,72108],{},"这一小节探讨了为大型语言模型量身定制的创新架构设计。研究人员已经提出了超越原始 Transformer 模型的新型模型架构，在模型大小、性能和效率之间取得平衡，为更快速和资源高效的推理开辟了新途径。",[49,72110,72111,72114],{},[52,72112,72113],{},"**配置缩减：**为了降低 LLM 推理的计算成本，一种简单直接的方法是缩减模型配置，例如使用浅层编码器或解码器，参数共享和词汇缩小。然而，减少模型参数的同时也会影响下游任务的性能。",[52,72115,72116,72117,72119],{},"**注意简化：**自注意力计算面临的一个主要挑战是计算复杂度 O(𝐿^2^)，它与输入序列长度 𝐿 呈二次比例增长。许多 Transformer 变种已经提出了简化标准注意力的更高效替代方法，以应对非常长的序列任务，如稀疏化、核化和分解。最近研究表明，使用了之前的注意力简化方法的思想，将它们推广并结合起来以缩短上下文，并减少 KV 缓存的大小，以及注意力的复杂度，虽然会略微降低解码质量（例如，滑动窗口注意力，基于哈希的注意力，扩展注意力）。这些方法中的一类是通过将上下文压缩成更少的软标记（例如，用摘要标记或地标标记替换），或根据不同的重要性指导直接删除或重新表述不重要的上下文标记（或称为语义压缩）。例如，自适应稀疏注意力采用基于学习的方法，动态地消除每个标记的无信息上下文标记。Scissorhands 和 H",[25921,72118,472],{},"O 选择几个可能对未来解码过程产生重要影响的关键标记，并保存它们的 KV 缓存。StreamingLLM 注重初始标记并在滑动窗口中保持它们，这也类似于之前的工作。FastGen 允许不同的注意力头自适应地采用不同的强调模式。表 1 展示了四个代表性类别的方法及其应用的稀疏注意力模式。然而，由于上下文的不完整，这些方法在具有更复杂的注意力分布的实际工作负载中可能面临不可避免的信息丢失。",[13,72121,72122],{},"![Table 1](img\u002FTable 1.png)",[49,72124,72125,72128,72131],{},[52,72126,72127],{},"**激活共享：**另一个方向是共享中间激活以提高注意力计算效率。注意力共享方法通过观察不同层的注意力矩阵分布之间的相似性，并重复使用这些注意力矩阵以减少计算成本。多查询注意力（MQA）使不同的头部共享一组键和值，以减少增量推理中的内存带宽需求。组查询注意力（GQA）放宽了单一键和值集的限制，使用多个集合，并且每个集合与一组查询相耦合。它们已被几个最近的公共 LLM 成功采用，并展示了它们的卓越性能，包括基于 MQA 的模型，如 Falcon、PaLM、ChatGLM2-6B 以及基于 GQA 的模型，如 LLaMA-2 和 Mistral-7B。",[52,72129,72130],{},"**条件计算：**稀疏激活的专家混合（MoE）范式将模型的容量分配到各种“专家”，这些专家是较小的神经网络，每个专家专门处理数据的不同子集。它允许系统根据特定的路由机制仅对给定输入调用必要的专家，而不是对整个庞大模型进行计算，从而提高计算和内存效率。例如，TaskMoE 表明，与基于令牌级别的对照相比，任务级别的路由可以增加模型的容量，同时提高推理吞吐量。随着 LLM 的不断增长，MoE 体系结构是确保未来 LLM 的可扩展性和效率的一个很有前途的途径。同时，MoE 的动态特性也要求从分布式通信和 GPU 内核实现方面进行特殊的系统优化，以促进 MoE 推理效率。",[52,72132,72133],{},"**循环单元：**尽管递归神经网络（RNN）（例如，LSTM）往往难以捕捉序列中的长期依赖性，但仍有几种方法使用递归单元来代替 Transformer 模块，并在推理过程中实现线性计算和内存复杂性，如 RWKV 和 RetNet。具体来说，与先前的方法不同，这些最新的探索主要建立在线性注意力（即线性 Transformer，无注意力 Transformer）表示之上。在改革后，他们通过使用线性循环单元（例如状态空间模型，LRU）建模标记之间的相互作用，克服了注意力的 O(𝐿^2^) 瓶颈，这样更容易保持可并行化训练性质。它们的设计还包括各种位置编码模块、指数衰减机制和一堆标记式非线性 MLP 或 GLU，以提高模型的表示能力。最近，它们在模型性能和计算效率上都展现出可观的结果。然而，循环单元能否成功地替换 LLM 中的 Transformer 仍然是一个悬而未决的问题（尤其是对于长序列）。",[10548,72135,72137],{"id":72136},"_313-模型压缩","3.1.3 模型压缩",[13,72139,72140],{},"在这里，我们深入探讨模型压缩技术，旨在通过创建更高效、更紧凑的模型，减少 LLM 的内存占用和计算需求，而不会显著降低性能。",[49,72142,72143,72146],{},[52,72144,72145],{},"**知识蒸馏：**一个研究方向是知识蒸馏，它训练一个小的学生模型，使用大型教师模型的监督来进行。在这个方向上，大多数以前的方法都是探索白盒蒸馏，需要访问整个教师模型的参数。由于出现了基于 API 的 LLM 服务（如 ChatGPT），一些黑盒蒸馏模型引起了很多关注，比如 Alpaca、Vicuna 、WizardLM 等。相比原始的 LLM（如 GPT-4），这些模型通常具有更少的模型参数，但在各种下游任务上展现出了有希望的性能。",[52,72147,72148],{},"**网络修剪：**网络修剪方法在过去几年中得到了广泛研究，但并非所有方法都直接适用于 LLM。必须考虑重新训练可能产生的巨大计算成本，并评估修剪是否会根据基础系统的实现产生可辨识的推理效率提升。一些最近的方法在 LLM 上应用结构修剪方法，去除整个结构化的 LLM 组件，实现了 GPU 速度的高效提升。例如，Deja Vu 通过上下文稀疏性假设去除了特定关注力头和 MLP 参数而不修改预训练模型。还有一些最新的无结构方法，通常能够实现 LLM 压缩的 50-60% 的稀疏度。值得注意的是，它们可以进一步推广到半结构化的 N:M 稀疏度（即 2:4 和 4:8），利用 NVIDIA 稀疏张量核加速获得显著的推理加速。LoSparse 和 DSFormer 利用低秩因式分解将模型权重近似为一个小的稠密和一个稀疏的半结构化矩阵。Flash-LLM 通过提供基于张量核的无结构修剪内存高效 SpMM 实现，放宽了这一要求。PowerInfer 假设这些稀疏激活的神经元存在不均匀访问，并提出了 GPU-CPU 混合推理引擎，使 GPU 和 CPU 处理不同的神经元。",[7759,72150,72152],{"id":72151},"_32-系统优化","3.2 系统优化",[13,72154,72155],{},"本节探讨了 LLM 推理系统优化技术，以加速 LLM 推理而不修改 LLM 计算语义。这一工作的目标是通过改进用于大语言模型推理的基础系统和框架来提高系统效率。",[10548,72157,72159],{"id":72158},"_321-低比特量化","3.2.1 低比特量化",[13,72161,72162],{},"本节探讨了最先进的低比特量化技术，这些技术可以有效表示模型权重和激活。通过使用较少的比特（即少于 32 位）来表示数值，这些方法显著减少了内存消耗，并且可以加速在硬件平台上的推断。一种方法是对 LLM 进行量化，这些量化方法可以简单地分类为两个方向：量化感知训练（QAT）和训练后量化（PTQ）。 PTQ 将模型权重甚至激活的计算精度减小到 INT8 或 INT4，通过使用自定义 CUDA 核或编译获得效率优势，例如 W8A16（即仅权重量化为 INT8 且 FP16 或 BF16 激活）、GPTQ 中的 W4A16 、SmoothQuant 中的 W8A8 和 W4A4 。硬件的发展也符合这些需求。其中的一项支持证据是，NVIDIA 最近的架构，如 Turing 和 Ampere，已经包含了 INT8 和 INT4 张量核心，而最新的 Hopper 架构已经取消了 INT4 支持，但引入了 FP8 张量核心以获得更好的数值精度（例如，H100 GPU 对 FP8 可以达到 60 倍的 TFLOPS，而 FP32 只有 60 倍）。现有方法通常采用各种量化函数，包括均匀量化方法（即四舍五入）和非均匀量化方法。为了减轻低精度带来的性能损失，QAT 在模型训练期间集成了量化。值得注意的是，由于底层系统实现的挑战，低精度量化方法可能会导致推断速度较常规精度水平（如 FP16）更慢。虽然低精度方法显著减少了模型部署的资源需求，但也有研究表明，由于存在缩放规律的影响，量化方法可能对模型的推断性能产生显著影响。此外，量化也已应用于上下文压缩（例如 CacheGen ）和内存高效微调（例如 QLoRA、PEQA），从而降低了 LLM 推断的内存消耗。",[10548,72164,72166],{"id":72165},"_322并行计算","3.2.2并行计算",[13,72168,72169],{},"本节旨在探讨针对大型语言模型量身定制的并行计算策略。利用现代硬件架构的并行处理能力，这些方法可以将计算分布在多个核心或设备上，在推理过程中实现显著的加速。",[49,72171,72172,72178],{},[52,72173,72174,72177],{},[22,72175,72176],{},"模型并行性:"," 大多数模型并行方法首先是为了分布式训练大规模深度神经网络而提出的，特别是对于基于 Transformer 的模型。例如，张量模型并行（TP）将模型层（例如注意力，FFN）从内部维度（例如头部，隐藏层）分割为多个部分，并将每个部分部署在单独的设备（例如 GPU）上。它可以通过并行计算显著减少推理延迟，被广泛用于同一台机器内的多个 GPU，特别是对于具有高速 NVLink 连接的场景。PaLM 推理通过涉及 2D 张量并行对大规模 Transformer 推理进行了扩展，并声称对于大型集群（超过 256 个设备）具有更低的理论通信复杂性。对于只有一个头部用于键和值的多查询注意力，它进一步涉及数据并行来实现混合张量划分策略。管道模型并行（PP）在多个设备上按顺序排列模型层。每个设备负责一个由多个连续模型层组成的管道阶段。虽然 PP 可以显著增加单位时间内处理的输入数量（吞吐量），但它并不像 TP 一样固有地减少从开始到结束处理单个输入所需的时间（延迟）。序列并行（SP）具有各种不同的设计和实现，但其 LLM 推理的关键思想是通过在序列长度维度上将长序列的处理分布到多个 GPU 上来分担计算和存储负载。不同的并行技术引入了不同程度的通信开销和计算延迟。为了实现最佳性能和资源利用，先前的方法广泛研究了自动并行性的分布式训练（例如 Alpa，FlexFlow，Galvatron）。通过将其成本模型替换为适应 Transformer 模型的自回归推理的可预测运行时，可以轻松将以前的自动搜索算法（例如动态规划，整数线性规划）应用于 LLM 服务（例如 AlpaServe、FlexFlow-Serve、SpotServe），并确定最有效的并行策略而无需手动干预。除了有限的设备存储器（例如 GPU DRAM）之外，还有一些方法使卸载技术能够使用更大但更慢的存储器（例如 CPU DRAM）来保存模型参数和 KV 缓存。",[52,72179,72180],{},"**去中心化推理：**这一方法结合了模型和数据的并行处理，多个分散的自愿节点合作处理数据并推断输出。这种方法在硬件资源地理分布的情况下尤其有用。受众包计算的启发，Petals 使用通过互联网协作的普通 GPU 来运行大小为 BLOOM-176B 的模型。去中心化推理开辟了一条新的道路，使被忽视的消费级 GPU 可以用于运行 LLM，但也面临着几个实际挑战，例如设备异构性、有限的计算和内存容量、低带宽网络、容错和隐私保护。",[10548,72182,72184],{"id":72183},"_323-内存管理","3.2.3 内存管理",[13,72186,72187],{},"高效的内存管理仍然是 LLM 模型服务中面临的主要挑战，特别是考虑到 Transformer 架构的内存密集型特性。随着对于长序列推理需求的增长，与模型权重和其他激活所需的工作空间相比，KV 缓存的内存占用成为一个主要的优化目标。由于在逐步解码的过程中，KV 缓存内存会动态且不可预测地增长和缩小，基于假设的朴素方法（如 FasterTransformer）预分配了一块连续的内存，其最大序列长度是预先设定的。这种方法会严重浪费内存，因为它无法适应变化的输入批次长度和复杂的解码情况（例如 beam search 和并行解码）下生成多个输出序列的需求。vLLM 提出了分页式注意力机制，将 KV 缓存划分为非连续的内存块，并显著提高了批次大小和吞吐量。SpecInfer 提出了树形注意力和深度优先树遍历方法，以消除多个输出序列共享相同前缀时多余的 KV 缓存分配。LightLLM 采用更细粒度的基于标记的内存管理机制来进一步减少内存使用。然而，这种碎片化内存管理机制的开销也带来了新的挑战。特别是在采用其他优化方法来增加批次大小的情况下，这些细粒度的内存管理方法可能只带来较小的吞吐量提升，而大幅增加推理延迟。很明显，LLM 推理中的内存优化与其他算法创新和系统级优化密切相关。尽管某些方法在特定工作负载下表现良好，但它们可能相互抵消，导致整体性能下降。在该领域中，如何在内存效率和计算性能之间取得合适的平衡仍然是一个开放且紧迫的挑战。",[10548,72189,72191],{"id":72190},"_324-请求调度","3.2.4 请求调度",[13,72193,72194],{},"有效地调度传入的推理请求对于优化 LLM 服务至关重要。本节回顾了最大化资源利用率、保证响应时间在延迟服务水平目标（SLO）内，并有效处理不断变化的请求负载的请求调度算法。LLM 服务的请求调度与通用 ML 服务技术有共同之处，因为两者都旨在有效地管理传入请求并优化资源利用。这些共同之处包括动态批处理、抢占、优先级、交换、模型选择、成本效率、负载平衡和资源分配。然而，LLM 服务还引入了独特的挑战，这是由于其独特的特点，例如庞大的模型大小，迭代自回归解码机制，未知的变量输出长度和上下文信息的状态管理。",[13,72196,72197],{},"早期的 LLM（Language Model）服务系统（例如，基于 NVIDIA Triton 的  FasterTransformer）只支持请求级别的调度，这与之前的方法类似。Orca 首次注意到生成型 LLM 和之前 ML 推断系统的请求级别调度之间存在差距。考虑到可变的输出序列长度，它以迭代的粒度来调度引擎的执行，采用先到先服务（FCFS）的顺序，并批处理一组选择的操作，以提高硬件利用率。许多后续的方法都继承了选择批处理和迭代级别调度策略，例如 vLLM 和 RayLLM 中的连续批处理以及 TensorRT-LLM 中的在途批处理。此外，SpecInfer 通过迭代选择一批请求来进行推理和验证的假设解码进行了扩展。FastServe 关注作业完成时间（JCT），并通过迭代级别的抢占来优先处理输入长度较短的请求，而不采用 FCFS 策略。SARATHI 旨在解决分布式推断中因长度不同的初始迭代导致的流水线泡沫问题。为了充分利用 GPU 计算能力，它将输入提示分成均匀的块，并尽可能地与其他请求的解码迭代一起处理，这也被 DeepSpeed-FastGen 所采用，称为动态 SplitFuse。S3 引入了一个输出序列长度预测器，并帮助在 GPU 内存限制下调度更多并发请求，以实现更大的批处理大小和更高的推断吞吐量。",[10548,72199,72201],{"id":72200},"_325内核优化","3.2.5内核优化",[13,72203,72204],{},"在这一小节中，我们深入探讨了针对语言模型推断过程中特定操作性能的核级优化。这些优化利用硬件特定的功能和软件技术来加速关键的计算核心。",[49,72206,72207,72210,72213,72216,72219],{},[52,72208,72209],{},"**核融合：**为了减少核心启动和内存访问的开销，以前的深度神经网络框架和编译器普遍采用了核融合。由于 LLM 推断不需要后向计算，存在更多的核融合机会。一些现代 Transformer 推断引擎（如 FasterTransformer、TenTrans、TurboTransformers、LightSeq、ByteTransforme）和编译器（如 Welder）建议将 1)  具有相同形状的 GEMM（例如，用于查询、键值对的三个线性变换）和 2)  加偏置与其他非 GEMM 核心（如残差连接、层归一化和激活函数（例如 ReLU））融合。在这些中，融合的多头注意力核心的优化已得到深入探讨，并将在下面的部分中讨论。",[52,72211,72212],{},"**个性化关注：**为了使 GPU 上的关注操作高效运行，定制或针对关注计算特别定制 GPU 内核至关重要。例如，cuDNN 提供了融合的多头关注内核 API。同时，也有几个实现项目为了获得更好的性能进行了开源。这些可以大致分为两类，由于特殊的自回归解码机制。一类是针对第一次迭代（即初始\u002F填充\u002F上下文\u002F提示阶段），并行处理输入提示中的所有标记。例如， xFormers 使用 CUTLASS 将在线 softmax 技巧扩展到整个关注计算。另一类是针对后续迭代（即增量\u002F解码\u002F生成阶段），内核每次只生成一个输出标记。对于自回归解码，常见做法是保存先前计算的键和值，以便在生成新标记时只需要计算单个查询，而不是重新运行整个序列。该领域的优化主要方向是最大化线程利用率并最小化设备上的高带宽内存（即使用共享内存或寄存器）。通常会将工作负载并行化在批次大小和头数维度上（例如，Faster-Transformer）以分配工作负载。一些进一步通过将 KV 缓存分割成块来并行化序列长度维度，但最后需要减少块级结果，例如 FlashDecoding 。后续的研究 FlashDecoding++ 通过引入预先已知的统一最大值来消除了部分 softmax 的同步。根据工作负载选择正确的并行维度以实现更好的线程利用率是必要的。",[52,72214,72215],{},"**采样优化：**采样算法的选择可以极大地影响 LLM 生成的质量。默认的贪婪采样总是选择具有最高概率的标记。并行采样技术，例如波束搜索，通过在每次迭代中保持固定数量（即波束宽度）的得分最高的序列来高效地解码近似最优序列。各种随机采样技术（例如 top-𝑘、top-𝑝、temperature 调节）已被提出，以引入随机性以获得更多样化的输出。然而，它们仍然面临一些实际的系统挑战。其中之一是来自冗余 KV 缓存（§3.2.3）的增加的内存压力，另一个是由 LLM 的庞大词汇（即数万个）引起的采样效率问题。例如， LightSeq 提供了一种高效的分层实现，将词汇表划分为 𝑘 个组，在每个组中使用少量的 GPU 指令检索候选项，然后重新对这些候选项进行排序以获取前 𝑘 个标记。",[52,72217,72218],{},"**变长序列长度：**LLM 推理的另一个独特挑战是序列的输入长度和输出长度均可变，并且后者事先未知。加快推理速度的一种方法是一次处理多个序列（§3.2.4）。然而，当一批序列具有可变的输入长度时，通常会使用填充将它们全部变为相同长度以进行批处理，从而浪费了计算和内存资源。为了缓解其中的一些低效问题，可以采用各种策略。打包技术将序列存储在连续的内存空间中，无需填充，在进行注意力计算之前才进行解包。松散张量使用由编译器生成的内核，支持最小填充的计算。将序列分桶为较小的计算粒度（例如块）也是减少填充标记内存使用的一种可能解决方案。由于初始阶段和增量阶段的混合执行，将输入提示分桶]还给内存管理和请求调度带来了新的挑战（§3.2.4）。",[52,72220,72221],{},"**自动编译：**大多数现有的 LLM 推理系统使用供应商特定的库作为其后端，例如 cuBLAS、cuDNN 和 CUTLASS，它们提供了经过优化的内核实现。为了进一步提高推理效率，它们还在为特定LLM运算符（例如注意力）手动编写内核上做出了很大努力，适用于 NVIDIA GPU。尽管已经有了这些工作，但仍然存在使用自动 DNN 编译器的趋势，例如 TVM（例如 Unity、Relax 和 TensorIR）、MLIR、JAX、OpenAI Triton、TASO 和 TorchInductor。编译方法可以帮助发现更高效的运算符实现（例如表达式推导），更重要的是，推动适应其他硬件平台的切换，包括移动和边缘设备、CPU、DL 加速器和其他类型的 GPU（例如 AMD GPU 和 Apple M2 Ultra）。",[107,72223,72225],{"id":72224},"_4-软件框架","4 软件框架",[13,72227,72228],{},"生成式 LLM 服务需要一整套优化和许多最近的研究已经开始开发软件框架，以提供高效的 LLM 推断部署服务。接下来，我们将重新审视这些系统，并在表 2 中对几个代表性的开源基于 GPU 的 LLM 服务系统进行全面分析。该分析不包括一些流行的相关项目，包括：1）针对其他硬件的专门解决方案（例如 PopTransformer 、CTranslate2、lammap.cpp 和 ggml）和 2）在其他系统的基础上构建的部署解决方案，比如 OpenLLM（vLLM）、xinference（ggml + vLLM + xFormers）、LMDeploy （FasterTransformer）、gpt-fast（PyTorch）、DeepSpeed-MII 和 DeepSpeed-FastGen（DeepSpeed-Inference），以及 RayLLM 和 RayServe（vLLM）。",[13,72230,72231],{},"![Table 2](img\u002FTable 2.png)",[13,72233,72234],{},"我们比较了这些最先进的 LLM 服务系统，并总结了它们在几个方面的区别。首先，这些系统中大多数支持张量并行，以实现多 GPU 推断并提高系统性能。其中一些还支持流水并行或卸载以支持在多节点或资源受限环境下的推断。其次，部分系统从 Orca 中学习并实现了迭代级调度。第三，我们调查了这些系统的注意力核，并介绍了它们分别在初始和增量阶段的实现。在初始阶段，它们通常采用分批通用矩阵乘法（GEMM）方法（例如 cuBLAS、torch、Relay），并且一些系统利用在线 softmax 技巧来减少 HBM 访问（例如 Flash-attention、xFormers）。增量阶段更具挑战性，因为每个标记的生成方案导致计算强度较低。为了提高 GPU 利用率，FasterTransformer 手动将注意力计算（例如线性投影、位置偏置、点积、softmax 等）融合为单个高性能的内核模板，并涉及几种内核优化技术，例如使用共享存储器进行缓存、通过 warp-shuffle 指令进行规约、利用张量核心和多精度支持的半矩阵乘和累加（HMMA）。FlexFlow-Serve 支持推测解码并提供基于树的并行解码内核，以验证来自多个序列（即来自多个小模型、不同的 beam 或并行采样）的推测标记，具有零内存冗余和最大线程并行性。vLLM 通过将 KV 缓存分区为多个页面来扩展了来自 FasterTransformer 的融合多头注意力（MHA）内核，以消除冗余的内存使用，尤其适用于并行采样场景。LightLLM 采用了更细粒度的基于标记的 KV 缓存分割方法。",[13,72236,72237,72238,72241,72242,72245],{},"请注意，还有一些其他值得注意的方面没有在以上讨论中涉及。例如，即使对于最流行的 Flash 和 Paged 注意力核，它们在这些系统中通常以不同的方式实现。TGI 直接导入原始的 Flash\u002FPaged 注意力库，LightLLM 采用由 OpenAI Triton 实现的核，MLC-LLM 通过 TVM 生成核，而 TensorRT-LLM 修改自 FasterTransformer 的融合注意力核以支持分页注意力。还有一个例子是有关输入感知核选择的。在初始阶段，TensorRT-LLM 根据上下文长度从 cuBLAS 和 Flash 注意力中进行选择。除了注意力计算，对于线性投影算子，最近还有一种趋势是用通用矩阵-向量乘积（GEMV）替换 GEMM，以更有效地处理小批量大小（即1）的情况。这些系统还有许多其他不同的特性，比如编程语言（如 C++、Python），低精度支持（如 FP16、INT8），支持的硬件和模型。总之，这些不同的设计和实现选择很大程度上是由它们优化目标的优先级确定的。例如，vLLM 提出了分页注意力以提高更高吞吐量（𝑇",[25921,72239,72240],{},"𝑝𝑡","）的批处理大小，而FlexFlow-Serve利用SpecInfer加速解码以降低延迟（𝐿",[25921,72243,72244],{},"𝑎𝑡","）。基本上，低延迟和高吞吐量是 LLM 服务系统的双重优化目标，代表了互补但常常冲突的目标，需要一种平衡的策略来优化单个任务的快速响应和在指定时间范围内处理的任务数量之间的权衡。一些最近的研究进一步将响应延迟分解为 TTFT + TPOT × 输出序列长度，其中 TTFT 代表首个标记的时间，TPOT 代表每个输出标记的时间。前者由初始阶段的处理速度驱动，而后者则直接取决于增量解码期间的每次迭代执行时间。区分这两个指标对 LLM 服务提供者有益，导致不同的系统设计选择和用户体验（例如，更快的应用响应，更长的提示）。此外，减少财务成本也是一些 LLM 服务系统的设计和实施的重要和实际目标。虽然不太可能有一种大小适合所有的解决方案，但我们相信未来的 LLM 服务系统将继续整合这些不同的特性，从而不断提高系统效率和硬件利用率。",[107,72247,72249],{"id":72248},"_5-基准测试","5 基准测试",[13,72251,72252],{},"在比较各种低延迟模型（LLM）服务系统的性能时，建立一个全面且可复现的基准测试对于学术界和工业界都是至关重要的努力。它不仅可以帮助 LLM 用户选择正确的系统解决方案，还能鼓励研究人员和开发者紧跟先进的优化。不幸的是，尽管有一些先前的报告，到目前为止，社区还没有推出一个足够令人信服的基准测试，考虑到所有影响因素。这主要是因为存在着许多评估设置，包括模型配置、硬件环境和请求负载等等。在有限的设置组合下进行测试无法得出可靠的结论。例如，某些系统优化技术只在高负载或低负载条件下才能实现性能优势，相反，它们甚至可能起到负面作用。此外，在测量推断延迟时，如何排除与 GPU 推断无关的额外开销（比如请求调度开销、本质网络延迟等）由于系统设计的差异也是一个具有挑战性的话题。此外，公正的基准测试还需要考虑模型输出内容的严格对齐，这在许多测试中经常被忽视。",[107,72254,72256],{"id":72255},"_6-与其他调查的连接","6 与其他调查的连接",[13,72258,72259],{},"我们关于高效生成式 LLM 提供和推理的调查，既补充了现有文献的范围，又延伸了其领域，同时保持了独特的关注点。在相关工作中，在探索更通用的 Transformer 模型和特定领域加速器的设计方面是最接近的。然而，我们的调查通过专门关注生成性 LLM 服务而有所不同，这是一个微妙的领域，而不是其他研究的中心焦点。此外，一些研究深入探讨了 LLM 推理在 GPU 和新型加速器上的效率实验调查，提供了与我们关注的提供效率直接相关的宝贵经验见解。此外，LLMCarbon 处理了 LLM 部署日益重要的一个方面：其环境影响（例如，碳足迹）。虽然我们的调查主要关注性能效率，但由这些研究提供的环境观点无疑是与我们更广义讨论相关并值得尊重的。一些调查和基准提供了模型压缩和量化的宝贵见解。这些研究为我们间接支持相关方向的探索奠定了基础。一些研究为理解 LLM 的有效性（例如准确性、困惑度、事实性等）提供了重要背景，但这超出了本调查的范围。我们的调查还承认了之前关于大规模 DNN 模型分布式训练的调查的贡献，因为它们为必须考虑 LLM 提供的背景提供了信息。总的来说，我们的调查处于各种研究之中，汲取并促进对 LLM 提供效率的更全面理解，包括算法创新和系统优化。通过整合这些不同领域的见解，我们旨在提供最新领域进展和挑战的微妙和全面概述。",[107,72261,72263],{"id":72262},"_7-未来的方向","7 未来的方向",[13,72265,72266],{},"随着我们站在 LLM 进步的前沿，不仅要了解这些技术的现状，还要预测和塑造它们的未来轨迹，这一点变得越来越重要。特别是在生成 LLM 服务的领域，存在着广阔的未开发的可能性和新兴的挑战。这个领域的快速演变需要一种前瞻性的方法，其中识别创新和改进的潜在途径至关重要。这种远见不仅使我们能够适应即将到来的技术转变，而且还引导研究界解决最相关和有影响力的领域。在这个背景下，我们概述了几个有前途的未来研究和开发方向，每个方向都有潜力显著提高生成 LLM 服务的效率。",[49,72268,72269,72272,72275,72278,72281,72284],{},[52,72270,72271],{},"**硬件加速器的开发和提升。**通过开发和完善专用的硬件加速器，并辅以硬件和软件优化的协同设计方法，未来提升生成式 LLM 服务效率的进展可能会得到显著推动。例如，将内存集成到处理单元附近或优化芯片架构，使其更好地与 LLM 算法的数据流相适应，可以显著减少延迟和能耗。最近的 GPU 进展已经体现了这种方法，比如 NVIDIA 的霍珀架构，它展示了 HBM 和 SRAM 容量、内存带宽、计算单元和双向带宽方面的改进，直接有益于 LLM 的处理。在这一领域持续创新可能包括设计本质上调整到生成式 LLM 的计算模式的硬件，例如优化这些模型中普遍存在的注意力机制和张量运算的特定需求，最终影响 LLM 服务系统的设计和实施。",[52,72273,72274],{},"**高效和有效的解码算法。**更加高效的解码算法的发展可以大幅提高服务效率。受到更加资源高效利用 LLM 所包含的广泛知识需求的激励，未来的工作可以探索替代传统自回归方法的替代方法，并解锁实时应用的生成速度，同时保持解码质量。一个有前途的方向是广义推断，因为它能够保留相同的生成质量。具体来说，小规模的推测模型可以推广到其他形式的方法，比如知识检索器和用户定义函数，可以比 LLM 更有效地生成草稿标记。例如，最近有一些后续的作品，用提前退出或非自回归解码替代了草稿模型。总之，开发高效的解码算法，如推测解码，结合底层系统优化，代表了提升生成式 LLM 服务效率的重要机会。",[52,72276,72277],{},"**长上下文\u002F序列场景的优化。**随着 LLM 的应用不断扩展到更复杂的场景，处理更长上下文或序列的需求正在稳步增长。为了处理长序列工作负载，需要从算法和系统两方面解决挑战。在 LLM 方面，当序列长度超过训练中观察到的长度时，往往会出现长度泛化失败，即使启用相对位置编码或在更长的语料库上微调后也没能解决。甚至对于声称支持超长上下文的一些模型，研究发现它们出现了\"中间损失\"的情况。目前的方法尝试通过减少计算序列长度来缓解这些限制，同时保留相关信息，比如检索增强、序列压缩和缓存。对于 LLM 服务系统来说，更长的序列会带来关键挑战，包括更多的内存消耗和 KV 缓存访问，以及自注意力计算复杂性的二次增长。",[52,72279,72280],{},"**探索替代架构。**尽管 Transformer 模型和自注意机制目前占据主导地位，但探索替代架构是未来研究的有前途的方向。DL 领域在历史上一直看到主导架构的不断变换，每次新的范式转变都带来重大进展。考虑到这一趋势，重要的是考虑其他可以提供独特优势的架构方法，特别是为了提高计算效率。例如，最近一些研究探索了无注意力方法，使用纯 MLP（多层感知器）架构来替换注意力机制。DNN 模型架构的演变不仅是自然的进展，也是必要的探索，以揭示构建 LLM 更有效和高效的方法。",[52,72282,72283],{},"**在复杂环境中部署的探索。**随着 LLM 应用范围的扩大，一个关键的未来方向是探索和优化它们在各种复杂环境下的部署。这种探索超越了传统的基于云的部署，还包括边缘计算、混合计算（结合云计算和边缘计算）、分散计算和利用更可负担的资源（如按需实例）的场景。每个环境都对 LLM 服务提出了独特的挑战和机遇。例如，边缘计算可以通过在靠近数据源的位置处理数据来实现更快的响应时间和减少带宽使用，但它也带来了有限的计算资源和存储容量的挑战。混合计算提供了一种平衡的方法，但需要先进的管理来高效地分配计算任务。分散计算为众包计算资源提供了有前途的途径，但也涉及到数据隐私和安全方面的额外考虑。在抢占式资源上进行 LLM 服务可以显著降低货币成本，但需要容错机制来处理其固有的不可预测性和变异性，确保一致的性能和系统可靠性。成功应对这些复杂环境的挑战，将对更强大、可扩展和高效的 LLM 应用至关重要。",[52,72285,72286],{},"**对特定要求的自动调整。**各种应用特定的要求创造了广泛的创新 LLM 服务优化机会，例如参数高效微调，从外部向量存储中检索，在线学习和知识更新，多模式工作负载，以及将不同 LLM 的能力链接在一起。这些独特的挑战还要求将 LLM 服务技术自动而平稳地整合到现有的IT基础设施中，通过将优化空间扩展至整个 LLM 的生命周期，包括数据获取和处理，AutoML 和模型管理，资源分配，以及性能监控。",[107,72288,72290],{"id":72289},"_8-结论","8 结论",[13,72292,72293],{},"高效的 LLM 服务是向广大用户开放先进 AI 技术的基础步骤。本调查旨在为研究人员、从业人员和开发者提供对现有方法论的全面了解，使他们能够在实际环境中部署 LLM 时做出明智的决策。通过整合最新的算法和系统研究成果，本调查论文希望加速进展，促进在高效 LLM 服务解决方案的探索中形成创新。",{"title":119,"searchDepth":144,"depth":144,"links":72295},[72296,72300,72306,72310,72311,72312,72313,72314],{"id":71915,"depth":132,"text":71916,"children":72297},[72298,72299],{"id":71928,"depth":144,"text":71929},{"id":71935,"depth":144,"text":71936},{"id":71942,"depth":132,"text":71943,"children":72301},[72302,72303,72304,72305],{"id":71946,"depth":144,"text":71947},{"id":71997,"depth":144,"text":71998},{"id":72010,"depth":144,"text":72011},{"id":72033,"depth":144,"text":72034},{"id":72057,"depth":132,"text":72058,"children":72307},[72308,72309],{"id":72070,"depth":144,"text":72071},{"id":72151,"depth":144,"text":72152},{"id":72224,"depth":132,"text":72225},{"id":72248,"depth":132,"text":72249},{"id":72255,"depth":132,"text":72256},{"id":72262,"depth":132,"text":72263},{"id":72289,"depth":132,"text":72290},{},"Paper Reading\u002F5. Towards Efficient Generative Large Language Model Serving\u002F大模型推理加速综述.md","\u002Fundergraduate\u002Fnote-89674a8f00e8",{"title":71869,"description":71878},"undergraduate\u002Fnote-89674a8f00e8",[794,7744,246,6380,14542],"jwei6YW6In7NE5Le9fdEtoTwP0s4Dfsw3m-VWdHJRJA",{"id":72323,"title":72324,"assetBase":239,"author":8,"body":72325,"category":72563,"collection":72564,"date":72565,"description":72566,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":72567,"navigation":128,"originalPath":72568,"path":72569,"seo":72570,"source":23330,"stem":72571,"tags":72572,"weight":25298,"__hash__":72574},"content\u002Fundergraduate\u002Fnote-8ec9a00bfd09.md","Overview：从学习笔记到可靠 AI 系统",{"type":10,"value":72326,"toc":72551},[72327,72336,72339,72342,72349,72352,72356,72359,72364,72367,72371,72374,72378,72381,72385,72388,72391,72468,72474,72478,72481,72484,72498,72502,72505,72508,72511,72548],[72,72328,72329],{},[13,72330,72331,72332,72335],{},"这条地址来自我本科阶段的 ",[17,72333,72334],{},"MyLearningNotes","。2026 年，我没有把它删掉，而是把它改造成整个知识花园的入口。旧链接仍然有效，页面承担的任务已经从“列出学过哪些课程”变成“解释这些积累正在通向哪里”。",[107,72337,72338],{"id":72338},"一条没有被截断的学习路径",[13,72340,72341],{},"本科时，我学习数据科学与大数据技术，最初写笔记的动机很朴素：把算法、数据库、计算机网络、机器学习和 Spark 等课程真正弄懂，也让复习资料能够被下一次学习复用。",[13,72343,72344,72345,72348],{},"那些文档有明显的时代印记。它们围绕课程章节组织，夹杂应试重点、调试记录和当时尚未完成的计划。部分依赖、命令与结论在今天已经过时，因此它们更适合作为",[22,72346,72347],{},"学习过程的原始切片","，而非始终正确的技术手册。",[13,72350,72351],{},"但它们留下了一种后来越来越重要的习惯：写下结论，也写下结论从哪里来；保存能运行的答案，也保存失败、修正和上下文。",[107,72353,72355],{"id":72354},"现在我在解决什么问题","现在，我在解决什么问题",[13,72357,72358],{},"目前我是一名计算机科学与技术硕士研究生，关注大模型应用、可靠性验证、语义检索与 Agent 工作流的交界处。我的核心问题可以压缩成一句话：",[72,72360,72361],{},[13,72362,72363],{},"当模型给出一个聪明、流畅而且看似合理的结果时，我们凭什么相信它，又怎样让它被复现、质疑和继续使用？",[13,72365,72366],{},"围绕这个问题，我的工作逐渐形成三条相互连接的主线：",[23090,72368,72370],{"id":72369},"_1-让输出拥有证据","1. 让输出拥有证据",[13,72372,72373],{},"把检索来源、实验条件、反例和语义一致性放回推理链，识别低置信输出。可靠性不只是一项最终评分，它应当参与系统作出每一步决定。",[23090,72375,72377],{"id":72376},"_2-让反馈进入建模循环","2. 让反馈进入建模循环",[13,72379,72380],{},"在 AutoEDM 等研究中，我尝试让解释信号参与特征生成与模型搜索。系统不只寻找更高的指标，也要说明哪些特征产生了作用、为什么保留它们，以及下一轮应该怎样变化。",[23090,72382,72384],{"id":72383},"_3-让-agent-的行动可以审计","3. 让 Agent 的行动可以审计",[13,72386,72387],{},"把目标、权限、证据、验收条件和失败边界写成显式合同。Agent 可以自主执行，但每次行动都应留下责任链，知道做了什么、依据什么、怎样撤回或重做。",[107,72389,72390],{"id":72390},"项目是这些问题的实验场",[8366,72392,72393,72406],{},[8369,72394,72395],{},[8372,72396,72397,72400,72403],{},[8375,72398,72399],{},"项目",[8375,72401,72402],{},"它在解决什么",[8375,72404,72405],{},"我真正关心的设计命题",[8386,72407,72408,72423,72438,72453],{},[8372,72409,72410,72417,72420],{},[8391,72411,72412],{},[5009,72413,72416],{"href":72414,"rel":72415},"https:\u002F\u002Fgithub.com\u002Fh0ll0w-AkuZr0guY\u002Fscholarflow-agent",[23647],"ScholarFlow",[8391,72418,72419],{},"把研究问题拆成主张、证据、实验与交付合同",[8391,72421,72422],{},"一句话怎样变成可定位、可复现、可质疑的研究任务",[8372,72424,72425,72432,72435],{},[8391,72426,72427],{},[5009,72428,72431],{"href":72429,"rel":72430},"https:\u002F\u002Fakuzr0guy.space\u002Fchronicle-memory\u002F",[23647],"Chronicle Memory",[8391,72433,72434],{},"为手账、口述史、传记与日志保留证据边界",[8391,72436,72437],{},"怎样同时保存叙事温度、原始材料、事实与推断",[8372,72439,72440,72447,72450],{},[8391,72441,72442],{},[5009,72443,72446],{"href":72444,"rel":72445},"https:\u002F\u002Fgithub.com\u002Fh0ll0w-AkuZr0guY\u002Flet-code-in-pad",[23647],"Let Code in Pad",[8391,72448,72449],{},"在电脑与平板之间组织离线知识和算法练习",[8391,72451,72452],{},"同一份内容怎样在录入、遮蔽、复习与同步之间切换形态",[8372,72454,72455,72462,72465],{},[8391,72456,72457],{},[5009,72458,72461],{"href":72459,"rel":72460},"https:\u002F\u002Fgithub.com\u002Fh0ll0w-AkuZr0guY\u002Fh0ll0w-AkuZr0guY.github.io",[23647],"Aiznoyer Atlas",[8391,72463,72464],{},"统一本科笔记、研究写作、算法题库和多仓库内容源",[8391,72466,72467],{},"知识怎样脱离某一次框架迁移，长期保持可搜索、可连接、可扩展",[13,72469,72470,72471],{},"这些项目的外观不同，底层关心的是同一件事：",[22,72472,72473],{},"把容易消失的上下文，变成能够被验证和再次使用的结构。",[107,72475,72477],{"id":72476},"ai-让会写代码的含义发生了变化","AI 让“会写代码”的含义发生了变化",[13,72479,72480],{},"越来越多代码可以由 AI 辅助生成，项目的新旧和代码量因此不再足以说明竞争力。真正稀缺的部分向上游移动：能否提出值得解决的问题，建立正确的约束，辨认模型隐藏的假设，并设计出可验证、可维护、对真实用户有意义的系统。",[13,72482,72483],{},"我仍然重视工程实现，因为想法只有进入真实环境才会暴露边界。但我更希望这些实现能回答几个具体问题：",[49,72485,72486,72489,72492,72495],{},[52,72487,72488],{},"问题为什么值得解决？",[52,72490,72491],{},"系统凭什么认为自己做对了？",[52,72493,72494],{},"失败时能否找到证据、恢复现场并继续迭代？",[52,72496,72497],{},"换一个模型、设备或内容仓库后，知识是否仍然存在？",[107,72499,72501],{"id":72500},"atlas-如何组织这些积累","Atlas 如何组织这些积累",[13,72503,72504],{},"今天的 Atlas 已经从单仓库博客变成内容与框架分离的知识系统。内容仓库保存统一格式的 Markdown、图片与知识关系；Nuxt 框架负责检索、阅读、算法工作台、成员页面和知识图谱；新的 GitHub 数据源只要遵守协议，就能加入同一个博客家庭。",[13,72506,72507],{},"这套结构保留了本科阶段的 53 篇学习文档，也接入后来的写作与算法内容。迁移没有把历史洗成一份整齐却失真的履历，而是给每条记录补上来源、时间、主题和可继续延伸的路径。",[107,72509,72510],{"id":72510},"从这里继续阅读",[49,72512,72513,72520,72527,72534,72541],{},[52,72514,72515,72519],{},[5009,72516,72518],{"href":72517},"\u002Fwriting","博客","：学习笔记、技术文章与研究过程的统一入口。",[52,72521,72522,72526],{},[5009,72523,72525],{"href":72524},"\u002Falgorithms","算法工作台","：可以遮蔽参考答案、保存本地作答并反复练习。",[52,72528,72529,72533],{},[5009,72530,72532],{"href":72531},"\u002Fmap","知识图谱","：从概念和文档之间的连接寻找下一条阅读路径。",[52,72535,72536,72540],{},[5009,72537,72539],{"href":72538},"\u002F#projects","项目与交互案例","：直接体验各个项目试图解决的具体困难。",[52,72542,72543,72547],{},[5009,72544,72546],{"href":72545},"\u002Fme","我的页面","：管理个人 API Key，并使用站内 AI 辅助能力。",[13,72549,72550],{},"如果你正在阅读一篇旧笔记，请把发布日期当作它的一部分。若发现错误，欢迎通过对应 GitHub 仓库提交 Issue 或 Pull Request。知识花园的意义从来不是证明过去已经完美，而是让今天能够看见过去的依据，并从那里继续生长。",{"title":119,"searchDepth":144,"depth":144,"links":72552},[72553,72554,72559,72560,72561,72562],{"id":72338,"depth":132,"text":72338},{"id":72354,"depth":132,"text":72355,"children":72555},[72556,72557,72558],{"id":72369,"depth":138,"text":72370},{"id":72376,"depth":138,"text":72377},{"id":72383,"depth":138,"text":72384},{"id":72390,"depth":132,"text":72390},{"id":72476,"depth":132,"text":72477},{"id":72500,"depth":132,"text":72501},{"id":72510,"depth":132,"text":72510},"Overview","知识总览","2026-08-02","这条旧 README 路径如今是一张动态导航图：它解释这些本科笔记怎样生长为研究、项目与可持续扩展的知识基础设施。",{},"README.md","\u002Fundergraduate\u002Fnote-8ec9a00bfd09",{"title":72324,"description":72566},"undergraduate\u002Fnote-8ec9a00bfd09",[14968,9133,72573,14541,246,6380],"知识管理","7Iwpb_hr5v0cvY-GPnzQyIQ6xWBC1axDZ2FeuUVE868",{"id":72576,"title":72577,"assetBase":239,"author":8,"body":72578,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":73928,"navigation":128,"originalPath":73929,"path":73930,"seo":73931,"source":23330,"stem":73932,"tags":73933,"weight":250,"__hash__":73934},"content\u002Fundergraduate\u002Fnote-8f6674bc858b.md","Spark从0到1（下）",{"type":10,"value":72579,"toc":73894},[72580,72583,72587,72589,72593,72596,72610,72614,72617,72655,72659,72662,72665,72669,72671,72675,72679,72682,72688,72691,72695,72698,72702,72706,72709,72712,72716,72719,72723,72728,72836,72839,72842,72847,72851,72855,72858,72861,73030,73033,73048,73052,73057,73060,73253,73257,73260,73265,73268,73272,73278,73282,73285,73290,73293,73298,73301,73305,73310,73313,73316,73321,73324,73328,73331,73333,73337,73341,73348,73352,73359,73361,73369,73373,73380,73384,73388,73391,73394,73397,73401,73405,73408,73411,73415,73419,73422,73425,73429,73434,73439,73443,73447,73455,73459,73470,73474,73478,73481,73484,73487,73491,73495,73498,73510,73513,73516,73523,73527,73531,73535,73543,73547,73558,73560,73564,73568,73571,73575,73579,73583,73586,73589,73592,73596,73600,73603,73608,73613,73618,73632,73637,73641,73645,73648,73651,73655,73658,73661,73664,73668,73671,73676,73690,73693,73697,73700,73704,73707,73710,73714,73717,73720,73723,73727,73730,73732,73736,73739,73744,73751,73755,73769,73773,73777,73780,73786,73790,73793,73796,73800,73804,73807,73811,73814,73817,73821,73827,73830,73834,73838,73841,73846,73852,73856,73859,73863,73866,73871,73876,73878,73892],[4517,72581,72577],{"id":72582},"spark从0到1下",[107,72584,72586],{"id":72585},"第四章-spark-streaming流计算","第四章 Spark Streaming：流计算",[7759,72588,27767],{"id":27706},[10548,72590,72592],{"id":72591},"_1流计算","（1）流计算",[13,72594,72595],{},"流数据是一组顺序、大量、快速、连续可达的数据序列，可被视为一个随时间延续而不断增长的动态数据集合。具有以下特点：",[49,72597,72598,72601,72604,72607],{},[52,72599,72600],{},"数据实时到达",[52,72602,72603],{},"数据到达次序独立，不受应用系统控制",[52,72605,72606],{},"数据规模宏大且不能预知其最大值",[52,72608,72609],{},"数据一经处理，除非特意保存，否则不能被再次取出处理，如果再次提取数据则代价昂贵",[10548,72611,72613],{"id":72612},"_2批处理与流处理","（2）批处理与流处理",[13,72615,72616],{},"根据数据处理的时效性，大数据处理系统可分为批大数据处理系统和流大数据处理系统两类。",[49,72618,72619,72641],{},[52,72620,72621,72622],{},"批处理\n",[49,72623,72624,72638],{},[52,72625,72626,72627],{},"批处理主要操作大容量静态数据集，并在计算过程完成后返回结果。批处理模式中使用的数据集通常符合下列特征：\n",[49,72628,72629,72632,72635],{},[52,72630,72631],{},"有界，批处理数据集代表数据的有限集合",[52,72633,72634],{},"持久，数据通常始终存储在某种类型的持久存储位置中。",[52,72636,72637],{},"量大，批处理操作通常是处理极为海量的数据集的唯一方法。",[52,72639,72640],{},"批处理非常适合需要访问全套记录才能完成的计算工作，例如在计算总数和平均数时，必须将数据集作为一个整体加以处理。",[52,72642,72643,72644],{},"流处理\n",[49,72645,72646,72649,72652],{},[52,72647,72648],{},"流处理系统会对随时进入系统的数据进行计算。相比批处理模式，这是一种截然不同的处理方式。流处理方式无须针对整个数据集执行操作，而是对系统传输的每个数据项执行操作。",[52,72650,72651],{},"流处理中的数据集是“无边界”的，完整数据集只能代表截至目前已经进入到系统中的数据总量；流处理工作是基于事件的，除非明确停止否则没有“尽头”；流处理结果立即可用；并会随着新数据的抵达持续更新。",[52,72653,72654],{},"流处理很适合用来处理必须对变动或者峰值做出响应，并且关注一段时间的变化趋势的数据。",[10548,72656,72658],{"id":72657},"_3spark-sreaming","（3）Spark Sreaming",[13,72660,72661],{},"Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多，例如：Kafka、 Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark 的高度抽象原语 如：map、reduce、join、window 等进行运算。而结果也能保存在很多地方，如 HDFS，数据库等。",[13,72663,72664],{},"和 Spark 基于 RDD 的概念很相似，Spark Streaming 使用离散化流(discretized stream)作为抽象表示，叫作 DStream。DStream 是随时间推移而收到的数据的序列。在内部，每个时间区间收到的数据都作为 RDD 存在，而 DStream 是由这些 RDD 所组成的序列（因此得名“离散化”）。所以 简单来讲，DStream 就是对 RDD 在实时数据处理场景的一种封装。",[7759,72666,72668],{"id":72667},"_2spark-streaming架构","2、Spark Streaming架构",[10548,72670,61907],{"id":61906},[13,72672,72673],{},[617,72674],{"alt":119,"src":30157},[10548,72676,72678],{"id":72677},"_2背压机制","（2）背压机制",[13,72680,72681],{},"Spark 1.5 以前版本，用户如果要限制 Receiver 的数据接收速率，可以通过设置静态配制参数“spark.streaming.receiver.maxRate”的值来实现，此举虽然可以通过限制接收速率，来适配当前的处理能力，防止内存溢出，但也会引入其它问题。比如：producer 数据生产高于 maxRate，当 前集群处理能力也高于 maxRate，这就会造成资源利用率下降等问题。",[13,72683,72684,72685],{},"为了更好的协调数据接收速率与资源处理能力，1.5 版本开始 Spark Streaming 可以动态控制 数据接收速率来适配集群数据处理能力。",[22,72686,72687],{},"背压机制（即 Spark Streaming Backpressure）: 根据 JobScheduler 反馈作业的执行信息来动态调整 Receiver 数据接收率。",[13,72689,72690],{},"通过属性“spark.streaming.backpressure.enabled”来控制是否启用 backpressure 机制，默认值 false，即不启用。",[7759,72692,72694],{"id":72693},"_3运行原理","3、运行原理",[13,72696,72697],{},"Spark Streaming是构建在Spark Core上的实时流计算框架，扩展了Spark Core处理流式大数据的能力。Spark Streaming将数据流以时间片为单位分割形成一系列RDD（一个RDD对应一块分割数据），这些RDD在Spark Streaming中用一个抽象数据模型DStream（Discretized Stream，离散流）来描述，DStream表示从数据源获取的持续性数据流和经过转换后的数据流。",[10548,72699,72701],{"id":72700},"dstream和rdd的对应关系","DStream和RDD的对应关系",[13,72703,72704],{},[617,72705],{"alt":119,"src":30871},[13,72707,72708],{},"DStream可以通过输入数据源来创建，比如Kafka、Flume和Kinesis；也可以通过对其他DStream应用进行map、reduce、join等操作来创建。使用RDD操作处理DStream中的每一个RDD，每个RDD都会生成一个Spark job，然后提交给Spark集群进行计算，批量生成最终的结果，最后将结果批量输出到HDFS或者数据库以及前端页面展示等。",[10548,72710,72711],{"id":72711},"基本工作原理",[13,72713,72714],{},[617,72715],{"alt":119,"src":30924},[13,72717,72718],{},"Spark Streaming使用“微批次”的架构，即把流式计算当作一系列连续的小规模批处理来对待。Spark Streaming从输入源中读取数据，并把数据分组为小的批次。新的批次按均匀的时间间隔被创建出来，即在每个时间区间开始时，一个新的批次被创建出来，并且在该区间内收到的数据都会被添加到这个批次中；在时间区间结束时，批次停止增长。其中，时间区间的长短是由批处理间隔决定的，批处理间隔一般设为500ms到几秒，由应用开发者配置。每次输入批次都会生成一个RDD，Spark以作业的方式处理和生成其他的RDD，然后就可以对其他的RDD进行转换操作，最后将RDD经过行动操作生成的中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加，最后形成“批”形式的结果流给外部系统。",[7759,72720,72722],{"id":72721},"_4以wordcount入门dstream","4、以WordCount入门DStream",[72,72724,72725],{},[13,72726,72727],{},"需求：使用 netcat 工具向 9999 端口不断的发送数据，通过 SparkStreaming 读取端口数据并统计不同单词出现的次数",[114,72729,72731],{"className":23406,"code":72730,"language":23408,"meta":119,"style":119},"object StreamWordCount {\n     def main(args: Array[String]): Unit = {\n        \u002F\u002F1.初始化 Spark 配置信息\n        val sparkConf = new SparkConf().setMaster(\"local[*]\").setAppName(\"StreamWordCount\")\n        \u002F\u002F2.初始化 SparkStreamingContext\n        val ssc = new StreamingContext(sparkConf, Seconds(3))\n        \u002F\u002F3.通过监控端口创建 DStream，读进来的数据为一行行\n        val lineStreams = ssc.socketTextStream(\"linux1\", 9999)\n        \u002F\u002F将每一行数据做切分，形成一个个单词\n        val wordStreams = lineStreams.flatMap(_.split(\" \"))\n        \u002F\u002F将单词映射成元组（word,1）\n         val wordAndOneStreams = wordStreams.map((_, 1))\n        \u002F\u002F将相同的单词次数做统计\n        val wordAndCountStreams = wordAndOneStreams.reduceByKey(_+_)\n        \u002F\u002F打印\n        wordAndCountStreams.print()\n        \u002F\u002F启动 SparkStreamingContext\n        ssc.start()\n        ssc.awaitTermination()\n    }\n}\n",[17,72732,72733,72738,72743,72748,72753,72758,72763,72768,72773,72778,72783,72788,72793,72798,72803,72808,72813,72818,72823,72828,72832],{"__ignoreMap":119},[78,72734,72735],{"class":124,"line":125},[78,72736,72737],{},"object StreamWordCount {\n",[78,72739,72740],{"class":124,"line":132},[78,72741,72742],{},"     def main(args: Array[String]): Unit = {\n",[78,72744,72745],{"class":124,"line":138},[78,72746,72747],{},"        \u002F\u002F1.初始化 Spark 配置信息\n",[78,72749,72750],{"class":124,"line":144},[78,72751,72752],{},"        val sparkConf = new SparkConf().setMaster(\"local[*]\").setAppName(\"StreamWordCount\")\n",[78,72754,72755],{"class":124,"line":150},[78,72756,72757],{},"        \u002F\u002F2.初始化 SparkStreamingContext\n",[78,72759,72760],{"class":124,"line":156},[78,72761,72762],{},"        val ssc = new StreamingContext(sparkConf, Seconds(3))\n",[78,72764,72765],{"class":124,"line":162},[78,72766,72767],{},"        \u002F\u002F3.通过监控端口创建 DStream，读进来的数据为一行行\n",[78,72769,72770],{"class":124,"line":168},[78,72771,72772],{},"        val lineStreams = ssc.socketTextStream(\"linux1\", 9999)\n",[78,72774,72775],{"class":124,"line":174},[78,72776,72777],{},"        \u002F\u002F将每一行数据做切分，形成一个个单词\n",[78,72779,72780],{"class":124,"line":180},[78,72781,72782],{},"        val wordStreams = lineStreams.flatMap(_.split(\" \"))\n",[78,72784,72785],{"class":124,"line":186},[78,72786,72787],{},"        \u002F\u002F将单词映射成元组（word,1）\n",[78,72789,72790],{"class":124,"line":192},[78,72791,72792],{},"         val wordAndOneStreams = wordStreams.map((_, 1))\n",[78,72794,72795],{"class":124,"line":198},[78,72796,72797],{},"        \u002F\u002F将相同的单词次数做统计\n",[78,72799,72800],{"class":124,"line":204},[78,72801,72802],{},"        val wordAndCountStreams = wordAndOneStreams.reduceByKey(_+_)\n",[78,72804,72805],{"class":124,"line":210},[78,72806,72807],{},"        \u002F\u002F打印\n",[78,72809,72810],{"class":124,"line":216},[78,72811,72812],{},"        wordAndCountStreams.print()\n",[78,72814,72815],{"class":124,"line":222},[78,72816,72817],{},"        \u002F\u002F启动 SparkStreamingContext\n",[78,72819,72820],{"class":124,"line":421},[78,72821,72822],{},"        ssc.start()\n",[78,72824,72825],{"class":124,"line":427},[78,72826,72827],{},"        ssc.awaitTermination()\n",[78,72829,72830],{"class":124,"line":433},[78,72831,15810],{},[78,72833,72834],{"class":124,"line":2443},[78,72835,23518],{},[10548,72837,72838],{"id":72838},"解析",[13,72840,72841],{},"Discretized Stream 是 Spark Streaming 的基础抽象，代表持续性的数据流和经过各种 Spark 原语操作后的结果数据流。在内部实现上，DStream 是一系列连续的 RDD 来表示。每个 RDD 含有 一段时间间隔内的数据。",[72,72843,72844],{},[13,72845,72846],{},"因此，实际上可以将一段时间内的处理当成一个完整的RDD执行，以上述例子为例，Streaming监听3秒一打印，那么在这3秒内读取到的数据就是一个完整的RDD，各批次之间的数据互不干涉。比如你在前3秒发送了两个hello spark，一个hello streaming，第四秒发送了一个hello spark，那么实际上的输出是两个批次，第一批次为(hello, 3) (spark, 2) (streaming, 1)；第二批次为(hello, 1) (streaming, 1)。批次之间不会累计，但是我们任能通过构建RDD对各批次结果进行聚合。",[7759,72848,72850],{"id":72849},"_5不同数据源","5、不同数据源",[10548,72852,72854],{"id":72853},"_1自定义数据源","（1）自定义数据源",[13,72856,72857],{},"需求：自定义数据源，实现监控某个端口号，获取该端口号内容。",[13,72859,72860],{},"提示：需要继承 Receiver，并实现 onStart、onStop 方法来自定义数据源采集。",[114,72862,72864],{"className":23406,"code":72863,"language":23408,"meta":119,"style":119},"class CustomerReceiver(host: String, port: Int) extends Receiver[String](StorageLevel.MEMORY_ONLY) {\n    \u002F\u002F最初启动的时候，调用该方法，作用为：读数据并将数据发送给 Spark\n    override def onStart(): Unit = {\n        new Thread(\"Socket Receiver\") {\n            override def run() {\n                receive()\n            }\n        }.start()\n    }\n \n    \u002F\u002F读数据并将数据发送给 Spark\n    def receive(): Unit = {\n        \u002F\u002F创建一个 Socket\n        var socket: Socket = new Socket(host, port)\n        \u002F\u002F定义一个变量，用来接收端口传过来的数据\n        var input: String = null\n        \u002F\u002F创建一个 BufferedReader 用于读取端口传来的数据\n        val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, \n                                StandardCharsets.UTF_8))\n        \u002F\u002F读取数据\n        input = reader.readLine()\n        \u002F\u002F当 receiver 没有关闭并且输入数据不为空，则循环发送数据给 Spark\n        while (!isStopped() && input != null) {\n            store(input)\n            input = reader.readLine()\n        }\n        \u002F\u002F跳出循环则关闭资源\n        reader.close()\n        socket.close()\n        \u002F\u002F重启任务\n        restart(\"restart\")\n    }\n    override def onStop(): Unit = {}\n}\n",[17,72865,72866,72871,72876,72881,72886,72891,72896,72900,72905,72909,72913,72918,72923,72928,72933,72938,72943,72948,72953,72958,72963,72968,72973,72978,72983,72988,72992,72997,73002,73007,73012,73017,73021,73026],{"__ignoreMap":119},[78,72867,72868],{"class":124,"line":125},[78,72869,72870],{},"class CustomerReceiver(host: String, port: Int) extends Receiver[String](StorageLevel.MEMORY_ONLY) {\n",[78,72872,72873],{"class":124,"line":132},[78,72874,72875],{},"    \u002F\u002F最初启动的时候，调用该方法，作用为：读数据并将数据发送给 Spark\n",[78,72877,72878],{"class":124,"line":138},[78,72879,72880],{},"    override def onStart(): Unit = {\n",[78,72882,72883],{"class":124,"line":144},[78,72884,72885],{},"        new Thread(\"Socket Receiver\") {\n",[78,72887,72888],{"class":124,"line":150},[78,72889,72890],{},"            override def run() {\n",[78,72892,72893],{"class":124,"line":156},[78,72894,72895],{},"                receive()\n",[78,72897,72898],{"class":124,"line":162},[78,72899,9615],{},[78,72901,72902],{"class":124,"line":168},[78,72903,72904],{},"        }.start()\n",[78,72906,72907],{"class":124,"line":174},[78,72908,15810],{},[78,72910,72911],{"class":124,"line":180},[78,72912,12089],{},[78,72914,72915],{"class":124,"line":186},[78,72916,72917],{},"    \u002F\u002F读数据并将数据发送给 Spark\n",[78,72919,72920],{"class":124,"line":192},[78,72921,72922],{},"    def receive(): Unit = {\n",[78,72924,72925],{"class":124,"line":198},[78,72926,72927],{},"        \u002F\u002F创建一个 Socket\n",[78,72929,72930],{"class":124,"line":204},[78,72931,72932],{},"        var socket: Socket = new Socket(host, port)\n",[78,72934,72935],{"class":124,"line":210},[78,72936,72937],{},"        \u002F\u002F定义一个变量，用来接收端口传过来的数据\n",[78,72939,72940],{"class":124,"line":216},[78,72941,72942],{},"        var input: String = null\n",[78,72944,72945],{"class":124,"line":222},[78,72946,72947],{},"        \u002F\u002F创建一个 BufferedReader 用于读取端口传来的数据\n",[78,72949,72950],{"class":124,"line":421},[78,72951,72952],{},"        val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, \n",[78,72954,72955],{"class":124,"line":427},[78,72956,72957],{},"                                StandardCharsets.UTF_8))\n",[78,72959,72960],{"class":124,"line":433},[78,72961,72962],{},"        \u002F\u002F读取数据\n",[78,72964,72965],{"class":124,"line":2443},[78,72966,72967],{},"        input = reader.readLine()\n",[78,72969,72970],{"class":124,"line":2448},[78,72971,72972],{},"        \u002F\u002F当 receiver 没有关闭并且输入数据不为空，则循环发送数据给 Spark\n",[78,72974,72975],{"class":124,"line":2454},[78,72976,72977],{},"        while (!isStopped() && input != null) {\n",[78,72979,72980],{"class":124,"line":2460},[78,72981,72982],{},"            store(input)\n",[78,72984,72985],{"class":124,"line":2465},[78,72986,72987],{},"            input = reader.readLine()\n",[78,72989,72990],{"class":124,"line":2470},[78,72991,10054],{},[78,72993,72994],{"class":124,"line":2903},[78,72995,72996],{},"        \u002F\u002F跳出循环则关闭资源\n",[78,72998,72999],{"class":124,"line":2909},[78,73000,73001],{},"        reader.close()\n",[78,73003,73004],{"class":124,"line":11477},[78,73005,73006],{},"        socket.close()\n",[78,73008,73009],{"class":124,"line":13374},[78,73010,73011],{},"        \u002F\u002F重启任务\n",[78,73013,73014],{"class":124,"line":13380},[78,73015,73016],{},"        restart(\"restart\")\n",[78,73018,73019],{"class":124,"line":13386},[78,73020,15810],{},[78,73022,73023],{"class":124,"line":13722},[78,73024,73025],{},"    override def onStop(): Unit = {}\n",[78,73027,73028],{"class":124,"line":13727},[78,73029,23518],{},[13,73031,73032],{},"使用方式：",[114,73034,73036],{"className":23406,"code":73035,"language":23408,"meta":119,"style":119},"\u002F\u002F3.创建自定义 receiver 的 Streaming\nval lineStream = ssc.receiverStream(new CustomerReceiver(\"hadoop102\", 9999))\n",[17,73037,73038,73043],{"__ignoreMap":119},[78,73039,73040],{"class":124,"line":125},[78,73041,73042],{},"\u002F\u002F3.创建自定义 receiver 的 Streaming\n",[78,73044,73045],{"class":124,"line":132},[78,73046,73047],{},"val lineStream = ssc.receiverStream(new CustomerReceiver(\"hadoop102\", 9999))\n",[10548,73049,73051],{"id":73050},"_2kafka数据源重点","（2）Kafka数据源（重点）",[13,73053,73054],{},[22,73055,73056],{},"Kafka 0-10 Direct 模式",[13,73058,73059],{},"需求：通过 SparkStreaming 从 Kafka 读取数据，并将读取过来的数据做简单计算，最终打印到控制台。",[114,73061,73063],{"className":23406,"code":73062,"language":23408,"meta":119,"style":119},"import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}\nimport org.apache.spark.SparkConf\nimport org.apache.spark.streaming.dstream.{DStream, InputDStream}\nimport org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}\nimport org.apache.spark.streaming.{Seconds, StreamingContext}\n\nobject DirectAPI {\n     def main(args: Array[String]): Unit = {\n        \u002F\u002F1.创建 SparkConf\n        val sparkConf: SparkConf = new SparkConf().setAppName(\"ReceiverWordCount\").setMaster(\"local[*]\")\n        \u002F\u002F2.创建 StreamingContext\n        val ssc = new StreamingContext(sparkConf, Seconds(3))\n        \u002F\u002F3.定义 Kafka 参数\n        val kafkaPara: Map[String, Object] = Map[String, Object](\n            ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> \n                                \"linux1:9092,linux2:9092,linux3:9092\",\n            ConsumerConfig.GROUP_ID_CONFIG -> \"atguigu\",\n                                \"key.deserializer\" -> \n                                    \"org.apache.kafka.common.serialization.StringDeserializer\",\n                                \"value.deserializer\" -> \n                                    \"org.apache.kafka.common.serialization.StringDeserializer\"\n            )\n        \u002F\u002F4.读取 Kafka 数据创建 DStream\n        val kafkaDStream: InputDStream[ConsumerRecord[String, String]] = \n                                KafkaUtils.createDirectStream[String, String](ssc,\n                                LocationStrategies.PreferConsistent,\n                                ConsumerStrategies.Subscribe[String, String](Set(\"atguigu\"), kafkaPara))\n        \u002F\u002F5.将每条消息的 KV 取出\n        val valueDStream: DStream[String] = kafkaDStream.map(record => record.value())\n        \u002F\u002F6.计算 WordCount\n        valueDStream.flatMap(_.split(\" \"))\n                                            .map((_, 1))\n                                            .reduceByKey(_ + _)\n                                            .print()\n        \u002F\u002F7.开启任务\n        ssc.start()\n        ssc.awaitTermination()\n    }\n}\n",[17,73064,73065,73070,73075,73080,73085,73090,73094,73099,73103,73108,73113,73118,73122,73127,73132,73137,73142,73147,73152,73157,73162,73167,73172,73177,73182,73187,73192,73197,73202,73207,73212,73217,73222,73227,73232,73237,73241,73245,73249],{"__ignoreMap":119},[78,73066,73067],{"class":124,"line":125},[78,73068,73069],{},"import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}\n",[78,73071,73072],{"class":124,"line":132},[78,73073,73074],{},"import org.apache.spark.SparkConf\n",[78,73076,73077],{"class":124,"line":138},[78,73078,73079],{},"import org.apache.spark.streaming.dstream.{DStream, InputDStream}\n",[78,73081,73082],{"class":124,"line":144},[78,73083,73084],{},"import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}\n",[78,73086,73087],{"class":124,"line":150},[78,73088,73089],{},"import org.apache.spark.streaming.{Seconds, StreamingContext}\n",[78,73091,73092],{"class":124,"line":156},[78,73093,129],{"emptyLinePlaceholder":128},[78,73095,73096],{"class":124,"line":162},[78,73097,73098],{},"object DirectAPI {\n",[78,73100,73101],{"class":124,"line":168},[78,73102,72742],{},[78,73104,73105],{"class":124,"line":174},[78,73106,73107],{},"        \u002F\u002F1.创建 SparkConf\n",[78,73109,73110],{"class":124,"line":180},[78,73111,73112],{},"        val sparkConf: SparkConf = new SparkConf().setAppName(\"ReceiverWordCount\").setMaster(\"local[*]\")\n",[78,73114,73115],{"class":124,"line":186},[78,73116,73117],{},"        \u002F\u002F2.创建 StreamingContext\n",[78,73119,73120],{"class":124,"line":192},[78,73121,72762],{},[78,73123,73124],{"class":124,"line":198},[78,73125,73126],{},"        \u002F\u002F3.定义 Kafka 参数\n",[78,73128,73129],{"class":124,"line":204},[78,73130,73131],{},"        val kafkaPara: Map[String, Object] = Map[String, Object](\n",[78,73133,73134],{"class":124,"line":210},[78,73135,73136],{},"            ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> \n",[78,73138,73139],{"class":124,"line":216},[78,73140,73141],{},"                                \"linux1:9092,linux2:9092,linux3:9092\",\n",[78,73143,73144],{"class":124,"line":222},[78,73145,73146],{},"            ConsumerConfig.GROUP_ID_CONFIG -> \"atguigu\",\n",[78,73148,73149],{"class":124,"line":421},[78,73150,73151],{},"                                \"key.deserializer\" -> \n",[78,73153,73154],{"class":124,"line":427},[78,73155,73156],{},"                                    \"org.apache.kafka.common.serialization.StringDeserializer\",\n",[78,73158,73159],{"class":124,"line":433},[78,73160,73161],{},"                                \"value.deserializer\" -> \n",[78,73163,73164],{"class":124,"line":2443},[78,73165,73166],{},"                                    \"org.apache.kafka.common.serialization.StringDeserializer\"\n",[78,73168,73169],{"class":124,"line":2448},[78,73170,73171],{},"            )\n",[78,73173,73174],{"class":124,"line":2454},[78,73175,73176],{},"        \u002F\u002F4.读取 Kafka 数据创建 DStream\n",[78,73178,73179],{"class":124,"line":2460},[78,73180,73181],{},"        val kafkaDStream: InputDStream[ConsumerRecord[String, String]] = \n",[78,73183,73184],{"class":124,"line":2465},[78,73185,73186],{},"                                KafkaUtils.createDirectStream[String, String](ssc,\n",[78,73188,73189],{"class":124,"line":2470},[78,73190,73191],{},"                                LocationStrategies.PreferConsistent,\n",[78,73193,73194],{"class":124,"line":2903},[78,73195,73196],{},"                                ConsumerStrategies.Subscribe[String, String](Set(\"atguigu\"), kafkaPara))\n",[78,73198,73199],{"class":124,"line":2909},[78,73200,73201],{},"        \u002F\u002F5.将每条消息的 KV 取出\n",[78,73203,73204],{"class":124,"line":11477},[78,73205,73206],{},"        val valueDStream: DStream[String] = kafkaDStream.map(record => record.value())\n",[78,73208,73209],{"class":124,"line":13374},[78,73210,73211],{},"        \u002F\u002F6.计算 WordCount\n",[78,73213,73214],{"class":124,"line":13380},[78,73215,73216],{},"        valueDStream.flatMap(_.split(\" \"))\n",[78,73218,73219],{"class":124,"line":13386},[78,73220,73221],{},"                                            .map((_, 1))\n",[78,73223,73224],{"class":124,"line":13722},[78,73225,73226],{},"                                            .reduceByKey(_ + _)\n",[78,73228,73229],{"class":124,"line":13727},[78,73230,73231],{},"                                            .print()\n",[78,73233,73234],{"class":124,"line":13953},[78,73235,73236],{},"        \u002F\u002F7.开启任务\n",[78,73238,73239],{"class":124,"line":13958},[78,73240,72822],{},[78,73242,73243],{"class":124,"line":13964},[78,73244,72827],{},[78,73246,73247],{"class":124,"line":13969},[78,73248,15810],{},[78,73250,73251],{"class":124,"line":24170},[78,73252,23518],{},[7759,73254,73256],{"id":73255},"_6操作dstream","6、操作DStream",[13,73258,73259],{},"DStream 上的操作与 RDD 的类似，分为 Transformations（转换）和 Output Operations（输 出）两种，此外转换操作中还有一些比较特殊的原语，如：updateStateByKey()、transform()以及 各种 Window 相关的原语。",[72,73261,73262],{},[13,73263,73264],{},"可以简单分为三类：无状态转换操作、有状态转换操作、输出操作",[13,73266,73267],{},"这里只对各种操作进行一个简单的概述，并不对其中的代码做过多分析，开发环境中需要的时候可以针对性查找。",[10548,73269,73271],{"id":73270},"_1无状态转换操作","（1）无状态转换操作",[13,73273,73274,73275],{},"无状态转化操作就是把简单的 RDD 转化操作应用到每个批次上，也就是转化 DStream 中的每 一个 RDD。注意，",[22,73276,73277],{},"针对键值对的 DStream 转化操作(比如 reduceByKey())要添加 import StreamingContext._才能在 Scala 中使用。",[13,73279,73280],{},[617,73281],{"alt":119,"src":30959},[13,73283,73284],{},"需要记住的是，尽管这些函数看起来像作用在整个流上一样，但事实上每个 DStream 在内部是由许多 RDD（批次）组成，且无状态转化操作是分别应用到每个 RDD 上的。",[13,73286,73287],{},[22,73288,73289],{},"Transform",[13,73291,73292],{},"Transform 允许 DStream 上执行任意的 RDD-to-RDD 函数。即使这些函数并没有在 DStream 的 API 中暴露出来，通过该函数可以方便的扩展 Spark API。该函数每一批次调度一次。其实也就是对 DStream 中的 RDD 应用转换。",[13,73294,73295],{},[22,73296,73297],{},"join",[13,73299,73300],{},"两个流之间的 join 需要两个流的批次大小一致，这样才能做到同时触发计算。计算过程就是 对当前批次的两个流中各自的 RDD 进行 join，与两个 RDD 的 join 效果相同。",[10548,73302,73304],{"id":73303},"_2有状态转换操作","（2）有状态转换操作",[13,73306,73307],{},[22,73308,73309],{},"UpdateStateByKey",[13,73311,73312],{},"UpdateStateByKey 原语用于记录历史记录，有时，我们需要在 DStream 中跨批次维护状态(例 如流计算中累加 wordcount)。针对这种情况，updateStateByKey()为我们提供了对一个状态变量的访问，用于键值对形式的 DStream。给定一个由(键，事件)对构成的 DStream，并传递一个指 定如何根据新的事件更新每个键对应状态的函数，它可以构建出一个新的 DStream，其内部数据为(键，状态) 对。",[13,73314,73315],{},"updateStateByKey() 的结果会是一个新的 DStream，其内部的 RDD 序列是由每个时间区间对应的(键，状态)对组成的。",[13,73317,73318],{},[22,73319,73320],{},"WindowOperations",[13,73322,73323],{},"Window Operations 可以设置窗口的大小和滑动窗口的间隔来动态的获取当前 Steaming 的允许状态。所有基于窗口的操作都需要两个参数，分别为窗口时长以及滑动步长。",[10548,73325,73327],{"id":73326},"_3输出","（3）输出",[13,73329,73330],{},"输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库 或输出到屏幕上)。与 RDD 中的惰性求值类似，如果一个 DStream 及其派生出的 DStream 都没 有被执行输出操作，那么这些 DStream 就都不会被求值。如果 StreamingContext 中没有设定输出 操作，整个 context 就都不会启动。",[23289,73332],{},[107,73334,73336],{"id":73335},"第五章-spark-graphx图计算-spark-mllib机器学习","第五章 Spark GraphX：图计算 && Spark MLlib：机器学习",[7759,73338,73340],{"id":73339},"_1spark-graphx","1、Spark GraphX",[13,73342,73343],{},[5009,73344,73347],{"href":73345,"rel":73346},"https:\u002F\u002Fjuejin.cn\u002Fpost\u002F6926541204372848654",[23647],"大数据开发-Spark-初识Spark-Graph && 快速入门",[7759,73349,73351],{"id":73350},"_2spark-mllib","2、Spark MLlib",[13,73353,73354],{},[5009,73355,73358],{"href":73356,"rel":73357},"https:\u002F\u002Fjuejin.cn\u002Fpost\u002F7069390174437769246",[23647],"初识 Spark MLlib 机器学习",[23289,73360],{},[72,73362,73363,73366],{},[13,73364,73365],{},"以下内容为进阶知识咯！虽说考试是考一点点的GraphX和MLlib，但是拜托，这是Spark从0到1，不是考试从0到100哦！所以后续重点介绍Spark内核和最最最常见的灵魂发问：数据倾斜的解决办法。",[13,73367,73368],{},"Spark内核会省略掉一些比较底层的调度策略（虽然确实很重要），主要从Shuffle和底层执行原理以及内存管理进行介绍。",[107,73370,73372],{"id":73371},"第六章-spark-shuffle解析","第六章 Spark Shuffle解析",[13,73374,73375,73376,73379],{},"在 MapReduce 框架中，Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁，Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中。由",[22,73377,73378],{},"于 Shuffle 涉及磁盘的读写和网络 I\u002FO，因此 Shuffle 性能的高低直接影响整个程序的性能。"," Spark 也有 Map 阶段和 Reduce 阶段，因此也会出现 Shuffle 。",[7759,73381,73383],{"id":73382},"_1shuffle-的核心要点","1、Shuffle 的核心要点",[13,73385,73386],{},[617,73387],{"alt":119,"src":31273},[13,73389,73390],{},"在划分 stage 时，最后一个 stage 称为 finalStage，它本质上是一个 ResultStage 对象，前面的所有 stage 被称为 ShuffleMapStage。",[13,73392,73393],{},"ShuffleMapStage 的结束伴随着 shuffle 文件的写磁盘。",[13,73395,73396],{},"ResultStage 基本上对应代码中的 action 算子，即将一个函数应用在 RDD 的各个 partition 的数据集上，意味着一个 job 的运行结束。",[7759,73398,73400],{"id":73399},"_2hashshuffle解析","2、HashShuffle解析",[10548,73402,73404],{"id":73403},"_1未优化的hashshuffle","（1）未优化的HashShuffle",[13,73406,73407],{},"这里我们先明确一个假设前提：每个 Executor 只有 1 个 CPU core，也就是说，无论这 个 Executor 上分配多少个 task 线程，同一时间都只能执行一个 task 线程。",[13,73409,73410],{},"有 3 个 Reducer，从 Task 开始那边各自把自己进行 Hash 计算(分区器： hash\u002Fnumreduce 取模)，分类出 3 个不同的类别，每个 Task 都分成 3 种类别的数据，想把不 同的数据汇聚然后计算出最终的结果，所以 Reducer 会在每个 Task 中把属于自己类别的数 据收集过来，汇聚成一个同类别的大集合，每 1 个 Task 输出 3 份本地文件，这里有 4 个 Mapper Tasks，所以总共输出了 4 个 Tasks x 3 个分类文件 = 12 个本地小文件。",[13,73412,73413],{},[617,73414],{"alt":119,"src":31282},[10548,73416,73418],{"id":73417},"_2优化后的hashshuffle","（2）优化后的HashShuffle",[13,73420,73421],{},"优化的 HashShuffle 过程就是启用合并机制，合并机制就是复用 buffer，开启合并机制 的配置是 spark.shuffle.consolidateFiles。该参数默认值为 false，将其设置为 true 即可开启优化机制。通常来说，如果我们使用 HashShuffleManager，那么都建议开启这个选项。",[13,73423,73424],{},"这里还是有 4 个 Tasks，数据类别还是分成 3 种类型，因为 Hash 算法会根据你的 Key  进行分类，在同一个进程中，无论是有多少过 Task，都会把同样的 Key 放在同一个 Buffer 里，然后把 Buffer 中的数据写入以 Core 数量为单位的本地文件中，(一个 Core 只有一种类 型的 Key 的数据)，每 1 个 Task 所在的进程中，分别写入共同进程中的 3 份本地文件，这里 有 4 个 Mapper Tasks，所以总共输出是 2 个 Cores x 3 个分类文件 = 6 个本地小文件。",[13,73426,73427],{},[617,73428],{"alt":119,"src":31302},[72,73430,73431],{},[13,73432,73433],{},"简单来说优化后的HashShuffle通过复用Buffer，减小了生成的文件数量，加快了后续的ReduceTask。",[13,73435,73436],{},[22,73437,73438],{},"在 Spark 2.0 版本中， Hash Shuffle 方式己经不再使用。",[7759,73440,73442],{"id":73441},"_3基于hashshuffle机制的优缺点","3、基于HashShuffle机制的优缺点",[13,73444,73445],{},[22,73446,20689],{},[49,73448,73449,73452],{},[52,73450,73451],{},"可以省略不必要的排序开销。",[52,73453,73454],{},"避免了排序所需的内存开销。",[13,73456,73457],{},[22,73458,20692],{},[49,73460,73461,73464,73467],{},[52,73462,73463],{},"生产的文件过多，会对文件系统造成压力。",[52,73465,73466],{},"大量小文件的随机读写带来一定的磁盘开销。",[52,73468,73469],{},"数据块写入时所需的缓存空间也会随之增加，对内存造成压力。",[7759,73471,73473],{"id":73472},"_4sortshuffle解析","4、SortShuffle解析",[10548,73475,73477],{"id":73476},"_1普通sortshuffle","（1）普通SortShuffle",[13,73479,73480],{},"在该模式下，数据会先写入一个数据结构，reduceByKey 写入 Map，一边通过 Map 局部聚合，一遍写入内存。Join 算子写入 ArrayList 直接写入内存中。然后需要判断是否达到阈值，如果达到就会将内存数据结构的数据写入到磁盘，清空内存数据结构。",[13,73482,73483],{},"在溢写磁盘前，先根据 key 进行排序，排序过后的数据，会分批写入到磁盘文件中。默认批次为 10000 条，数据会以每批一万条写入到磁盘文件。写入磁盘文件通过缓冲区溢写的方式，每次溢写都会产生一个磁盘文件，也就是说一个 Task 过程会产生多个临时文件。",[13,73485,73486],{},"**最后在每个 Task 中，将所有的临时文件合并，这就是 merge 过程，此过程将所有临时文件读取出来，一次写入到最终文件。**意味着一个 Task 的所有数据都在这一个文件中。同时单独写一份索引文件，标识下游各个Task的数据在文件中的索引，start offset和end offset。",[13,73488,73489],{},[617,73490],{"alt":119,"src":31317},[10548,73492,73494],{"id":73493},"_2bypass-sortshuffle","（2）bypass SortShuffle",[13,73496,73497],{},"bypass 运行机制的触发条件如下：",[49,73499,73500,73507],{},[52,73501,73502,73503,73506],{},"shuffle reduce task 数量小于等于 ",[22,73504,73505],{},"spark.shuffle.sort.bypassMergeThreshold"," 参数的值，默认为 200。",[52,73508,73509],{},"不是聚合类的 shuffle 算子（比如 reduceByKey）。",[13,73511,73512],{},"此时 task 会为每个 reduce 端的 task 都创建一个临时磁盘文件，并将数据按 key 进行 hash 然后根据 key 的 hash 值，将 key 写入对应的磁盘文件之中。当然，写入磁盘文件时也是先写入内存缓冲，缓冲写满之后再溢写到磁盘文件的。最后，同样会将所有临时磁盘文件都合并成一个磁盘文件，并创建一个单独的索引文件。",[13,73514,73515],{},"该过程的磁盘写机制其实跟未经优化的 HashShuffleManager 是一模一样的，因为都要创建数量惊人的磁盘文件，只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件，也让该机制相对未经优化的 HashShuffleManager 来说，shuffle read 的性能会更好。",[13,73517,73518,73519,73522],{},"而该机制与普通 SortShuffleManager 运行机制的不同在于：",[22,73520,73521],{},"不会进行排序","。也就是说， 启用该机制的最大好处在于，shuffle write 过程中，不需要进行数据的排序操作，也就节省掉了这部分的性能开销。",[13,73524,73525],{},[617,73526],{"alt":119,"src":31335},[7759,73528,73530],{"id":73529},"_5基于sort-的-shuffle-机制的优缺点","5、基于Sort 的 Shuffle 机制的优缺点",[13,73532,73533],{},[22,73534,20689],{},[49,73536,73537,73540],{},[52,73538,73539],{},"小文件的数量大量减少，Mapper 端的内存占用变少",[52,73541,73542],{},"Spark 不仅可以处理小规模的数据，即使处理大规模的数据，也不会很容易达到性能瓶颈。",[13,73544,73545],{},[22,73546,20692],{},[49,73548,73549,73552,73555],{},[52,73550,73551],{},"如果 Mapper 中 Task 的数量过大，依旧会产生很多小文件，此时在 Shuffle 传数据的过程中到 Reducer 端，Reducer 会需要同时大量地记 录进行反序列化，导致大量内存消耗和 GC 负担巨大，造成系统缓慢，甚至崩溃",[52,73553,73554],{},"强制了在 Mapper 端必须要排序，即使数据本身并不需要排序",[52,73556,73557],{},"它要基于记录本身进行排序，这就是 Sort-Based Shuffle 最致命的性能 消耗。",[23289,73559],{},[107,73561,73563],{"id":73562},"第七章-spark内存管理","第七章 Spark内存管理",[7759,73565,73567],{"id":73566},"_1堆内和堆外内存规划","1、堆内和堆外内存规划",[13,73569,73570],{},"作为一个 JVM 进程，Executor 的内存管理建立在 JVM 的内存管理之上，Spark 对 JVM 的堆内（On-heap）空间进行了更为详细的分配，以充分利用内存。同时，Spark 引入了堆外 （Off-heap）内存，使之可以直接在工作节点的系统内存中开辟空间，进一步优化了内存的使用。堆内内存受到 JVM 统一管理，堆外内存是直接向操作系统进行内存的申请和释放。",[13,73572,73573],{},[617,73574],{"alt":119,"src":31471},[7759,73576,73578],{"id":73577},"_2内存空间分配","2、内存空间分配",[10548,73580,73582],{"id":73581},"_1静态内存分配","（1）静态内存分配",[13,73584,73585],{},"在 Spark 最初采用的静态内存管理机制下，存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的，但用户可以应用程序启动前进行配置。",[13,73587,73588],{},"Storage 内存和 Execution 内存都有预留空间，目的是防止 OOM，因为 Spark 堆内内存大小 的记录是不准确的，需要留出保险区域。",[13,73590,73591],{},"堆外的空间分配较为简单，只有存储内存和执行内存，如下图所示。可用的执行内存和存储 内存占用的空间大小直接由参数 spark.memory.storageFraction 决定，由于堆外内存占用的空 间可以被精确计算，所以无需再设定保险区域。",[13,73593,73594],{},[617,73595],{"alt":119,"src":31499},[10548,73597,73599],{"id":73598},"_2统一内存管理","（2）统一内存管理",[13,73601,73602],{},"Spark1.6 之后引入的统一内存管理机制，与静态内存管理的区别在于存储内存和执行内存共享同一块空间，可以动态占用对方的空闲区域。",[13,73604,73605],{},[617,73606],{"alt":119,"src":73607},"img\u002F7.3.png",[13,73609,73610],{},[617,73611],{"alt":119,"src":73612},"img\u002F7.4.png",[13,73614,73615],{},[22,73616,73617],{},"动态占用机制规则",[49,73619,73620,73623,73626,73629],{},[52,73621,73622],{},"设定基本的存储内存和执行内存区域（spark.storage.storageFraction 参数），该设定确定了双方各自拥有的空间的范围；",[52,73624,73625],{},"双方的空间都不足时，则存储到硬盘；若己方空间不足而对方空余时，可借用对方的空间;（存储空间不足是指不足以放下一个完整的 Block）",[52,73627,73628],{},"执行内存的空间被对方占用后，可让对方将占用的部分转存到硬盘，然后”归还”借用的空间；",[52,73630,73631],{},"存储内存的空间被对方占用后，无法让对方”归还”，因为需要考虑 Shuffle 过程中的很多因素，实现起来较为复杂。",[13,73633,73634],{},[617,73635],{"alt":119,"src":73636},"img\u002F7.5.png",[7759,73638,73640],{"id":73639},"_3存储内存管理","3、存储内存管理",[10548,73642,73644],{"id":73643},"_1rdd的持久化机制","（1）RDD的持久化机制",[13,73646,73647],{},"弹性分布式数据集（RDD）作为 Spark 最根本的数据抽象，是只读的分区记录（Partition）的集合，只能基于在稳定物理存储中的数据集上创建，或者在其他已有的 RDD 上执行转换（Transformation）操作产生一个新的 RDD。转换后的 RDD 与原始的 RDD 之间产生的依赖关系，构成了血统（Lineage）。凭借血统，Spark 保证了每一个 RDD 都可以被重新恢复。但 RDD 的所有转换都是惰性的，即只有当一个返回结果给 Driver 的行动（Action）发生时， Spark 才会创建任务读取 RDD，然后真正触发转换的执行。",[13,73649,73650],{},"RDD 的持久化由 Spark 的 Storage 模块负责，实现了 RDD 与物理存储的解耦合。Storage 模块负责管理 Spark 在计算过程中产生的数据，将那些在内存或磁盘、在本地或远程存取数据的功能封装了起来。在具体实现时 Driver 端和 Executor 端的 Storage 模块构成了主从式的架构，即 Driver 端的 BlockManager 为 Master，Executor 端的 BlockManager 为 Slave。 Storage 模块在逻辑上以 Block 为基本存储单位，RDD 的每个 Partition 经过处理后唯一对应 一个 Block（BlockId 的格式为 rdd_RDD-ID_PARTITION-ID ）。Driver 端的 Master 负责整个 Spark 应用程序的 Block 的元数据信息的管理和维护，而 Executor 端的 Slave 需要将 Block 的更新等状态上报到 Master，同时接收 Master 的命令，例如新增或删除一个 RDD。",[10548,73652,73654],{"id":73653},"_2rdd的缓存过程","（2）RDD的缓存过程",[13,73656,73657],{},"RDD 在缓存到存储内存之前，Partition 中的数据一般以迭代器（Iterator）的数据结构来访问，这是 Scala 语言中一种遍历数据集合的方法。通过 Iterator 可以获取分区中每一条序 列化或者非序列化的数据项(Record)，这些 Record 的对象实例在逻辑上占用了 JVM 堆内内 存的 other 部分的空间，同一 Partition 的不同 Record 的存储空间并不连续。",[13,73659,73660],{},"RDD 在缓存到存储内存之后，Partition 被转换成 Block，Record 在堆内或堆外存储内存中占用一块连续的空间。将 Partition 由不连续的存储空间转换为连续存储空间的过程，Spark 称之为\"展开\"（Unroll）。",[13,73662,73663],{},"采样估算其所需的 Unroll 空间并进行申请，空间不足时可以中断，释放已占用的 Unroll 空间。 如果最终 Unroll 成功，当前 Partition 所占用的 Unroll 空间被转换为正常的缓存 RDD 的存储空间。",[10548,73665,73667],{"id":73666},"_3淘汰与落盘","（3）淘汰与落盘",[13,73669,73670],{},"由于同一个 Executor 的所有的计算任务共享有限的存储内存空间，当有新的 Block 需 要缓存但是剩余空间不足且无法动态占用时，就要对 LinkedHashMap 中的旧 Block 进行淘 汰（Eviction），而被淘汰的 Block 如果其存储级别中同时包含存储到磁盘的要求，则要对其 进行落盘（Drop），否则直接删除该 Block。",[13,73672,73673],{},[22,73674,73675],{},"存储内存的淘汰规则",[49,73677,73678,73681,73684,73687],{},[52,73679,73680],{},"被淘汰的旧 Block 要与新 Block 的 MemoryMode 相同，即同属于堆外或堆内内存；",[52,73682,73683],{},"新旧 Block 不能属于同一个 RDD，避免循环淘汰；",[52,73685,73686],{},"旧 Block 所属 RDD 不能处于被读状态，避免引发一致性问题；",[52,73688,73689],{},"遍历 LinkedHashMap 中 Block，按照最近最少使用（LRU）的顺序淘汰，直到满足新 Block 所需的空间。其中 LRU 是 LinkedHashMap 的特性。",[13,73691,73692],{},"落盘的流程则比较简单，如果其存储级别符合_useDisk 为 true 的条件，再根据其_deserialized 判断是否是非序列化的形式，若是则对其进行序列化，最后将数据存储到磁盘，在 Storage 模块中更新其信息",[7759,73694,73696],{"id":73695},"_4执行内存管理","4、执行内存管理",[13,73698,73699],{},"执行内存主要用来存储任务在执行 Shuffle 时占用的内存，Shuffle 是按照一定规则对 RDD 数据重新分区的过程。",[10548,73701,73703],{"id":73702},"_1shuffle-writer","（1）Shuffle Writer",[13,73705,73706],{},"若在 map 端选择普通的排序方式，会采用 ExternalSorter 进行外排，在内存中存储数据时主要占用堆内执行空间。",[13,73708,73709],{},"若在 map 端选择 Tungsten 的排序方式，则采用 ShuffleExternalSorter 直接对以序列化形式存储的数据排序，在内存中存储数据时可以占用堆外或堆内执行空间，取决于用户是否开启 了堆外内存以及堆外执行内存是否足够。",[10548,73711,73713],{"id":73712},"_2shuffle-read","（2）Shuffle Read",[13,73715,73716],{},"在对 reduce 端的数据进行聚合时，要将数据交给 Aggregator 处理，在内存中存储数据时占用堆内执行空间。",[13,73718,73719],{},"如果需要进行最终结果排序，则要将再次将数据交给 ExternalSorter 处理，占用堆内执行空间。",[13,73721,73722],{},"在 ExternalSorter 和 Aggregator 中，Spark 会使用一种叫 AppendOnlyMap 的哈希表在堆内执 行内存中存储数据，但在 Shuffle 过程中所有数据并不能都保存到该哈希表中，当这个哈希表占用的内存会进行周期性地采样估算，当其大到一定程度，无法再从 MemoryManager 申请到新的执行内存时，Spark 就会将其全部内容存储到磁盘文件中，这个过程被称为溢存 (Spill)，溢存到磁盘的文件最后会被归并(Merge)。",[10548,73724,73726],{"id":73725},"_3总结","（3）总结",[13,73728,73729],{},"Spark 的存储内存和执行内存有着截然不同的管理方式：对于存储内存来说，Spark 用一个 LinkedHashMap 来集中管理所有的 Block，Block 由需要缓存的 RDD 的 Partition 转化而成； 而对于执行内存，Spark 用 AppendOnlyMap 来存储 Shuffle 过程中的数据，在 Tungsten 排序中甚至抽象成为页式内存管理，开辟了全新的 JVM 内存管理机制。",[23289,73731],{},[107,73733,73735],{"id":73734},"第八章-数据倾斜","第八章 数据倾斜",[13,73737,73738],{},"数据倾斜就是数据分到各个区的数量不太均匀，可以自定义分区器,想怎么分就怎么分。",[13,73740,73741],{},[22,73742,73743],{},"Spark 中的数据倾斜问题主要指 shuffle 过程中出现的数据倾斜问题，是由于不同的 key 对应的数据量不同导致的不同 task 所处理的数据量不同的问题。",[13,73745,73746,73747,73750],{},"注意，要区分开",[22,73748,73749],{},"数据倾斜与数据过量","这两种情况，数据倾斜是指少数 task 被分配了绝大多数的数据，因此少数 task 运行缓慢；数据过量是指所有 task 被分配的数据量都很大，相差不多，所有 task 都运行缓慢。",[7759,73752,73754],{"id":73753},"_1数据倾斜的表现","1、数据倾斜的表现",[49,73756,73757,73760,73763,73766],{},[52,73758,73759],{},"Spark 作业的大部分 task 都执行迅速，只有有限的几个 task 执行的非常慢，此时可能出现了数据倾斜，作业可以运行，但是运行得非常慢；",[52,73761,73762],{},"Spark 作业的大部分 task 都执行迅速，但是有的 task 在运行过程中会突然报出 OOM，反复执行几次都在某一个 task 报出 OOM 错误，此时可能出现了数据倾斜，作业无法正常运行。",[52,73764,73765],{},"定位数据倾斜问题：查阅代码中的 shuffle 算子，例如 reduceByKey、countByKey、groupByKey、 join 等算子，根据代码逻辑判断此处是否会出现数据倾斜；",[52,73767,73768],{},"查看 Spark 作业的 log 文件，log 文件对于错误的记录会精确到代码的某一行，可以根据异常定位到的代码位置来明确错误发生在第几个 stage， 对应的 shuffle算子是哪一个。",[7759,73770,73772],{"id":73771},"_2方案一预聚合原始数据","2、方案一：预聚合原始数据",[10548,73774,73776],{"id":73775},"_1避免shuffle过程","（1）避免shuffle过程",[13,73778,73779],{},"绝大多数情况下，Spark 作业的数据来源都是 Hive 表，这些 Hive 表基本都是经过 ETL 之后的昨天的数据。 为了避免数据倾斜，我们可以考虑避免 shuffle 过程，如果避免了 shuffle 过程，那么从根本上就消除了发生数据倾斜问题的可能。 如果 Spark 作业的数据来源于 Hive 表，那么可以先在 Hive 表中对数据进行聚合， 例如按照 key 进行分组，将同一 key 对应的所有 value 用一种特殊的格式拼接到 一个字符串里去，这样，一个 key 就只有一条数据了；之后，对一个 key 的所有 value 进行处理时，只需要进行 map 操作即可，无需再进行任何的 shuffle 操作。",[13,73781,73782,73783],{},"通过上述方式就避免了执行 shuffle 操作，也就不可能会发生任何的数据倾斜问题。 对于 Hive 表中数据的操作，不一定是拼接成一个字符串，也可以是直接对 key 的每一条数据进行累计计算。 ",[22,73784,73785],{},"要区分开，处理的数据量大和数据倾斜的区别。",[10548,73787,73789],{"id":73788},"_2增大key粒度减小数据倾斜的可能性增大每个task的数据量","（2）增大Key粒度（减小数据倾斜的可能性，增大每个Task的数据量）",[13,73791,73792],{},"如果没有办法对每个 key 聚合出来一条数据，在特定场景下，可以考虑扩大 key 的聚合粒度。",[13,73794,73795],{},"例如，目前有 10 万条用户数据，当前 key 的粒度是（省，城市，区，日期）， 现在我们考虑扩大粒度，将 key 的粒度扩大为（省，城市，日期），这样的话， key 的数量会减少，key 之间的数据量差异也有可能会减少，由此可以减轻数据倾斜的现象和问题。（此方法只针对特定类型的数据有效，当应用场景不适宜时， 会加重数据倾斜）",[7759,73797,73799],{"id":73798},"_3方案二预处理导致倾斜的key","3、方案二：预处理导致倾斜的Key",[10548,73801,73803],{"id":73802},"_1过滤","（1）过滤",[13,73805,73806],{},"如果在 Spark 作业中允许丢弃某些数据，那么可以考虑将可能导致数据倾斜的 key 进行过滤，滤除可能导致数据倾斜的 key 对应的数据，这样，在 Spark 作业中就不会发生数据倾斜了。",[10548,73808,73810],{"id":73809},"_2使用随机key","（2）使用随机Key",[13,73812,73813],{},"当使用了类似于 groupByKey、reduceByKey 这样的算子时，可以考虑使用随机 key 实现双重聚合。",[13,73815,73816],{},"此方法对于由 groupByKey、reduceByKey 这类算子造成的数据倾斜有比较好的效果，仅仅适用于聚合类的 shuffle 操作，适用范围相对较窄。如果是 join 类的 shuffle 操作，还得用其他的解决方案。",[10548,73818,73820],{"id":73819},"_3sample-采样对倾斜-key-单独进行-join","（3）sample 采样对倾斜 key 单独进行 join",[13,73822,73823,73824],{},"在 Spark 中，",[22,73825,73826],{},"如果某个 RDD 只有一个 key，那么在 shuffle 过程中会默认将此 key 对应的数据打散，由不同的 reduce 端 task 进行处理。",[13,73828,73829],{},"所以当由单个 key 导致数据倾斜时，可有将发生数据倾斜的 key 单独提取出来， 组成一个RDD，然后用这个原本会导致倾斜的key组成的RDD和其他RDD单独join， 此时，根据 Spark 的运行机制，此 RDD 中的数据会在 shuffle 阶段被分散到多个 task 。",[13,73831,73832],{},[617,73833],{"alt":119,"src":62619},[7759,73835,73837],{"id":73836},"_4方案三提高reduce并行度","4、方案三：提高reduce并行度",[13,73839,73840],{},"当方案一和方案二对于数据倾斜的处理没有很好的效果时，可以考虑提高 shuffle 过程中的 reduce 端并行度，reduce 端并行度的提高就增加了 reduce 端 task 的数量，那么每个 task 分配到的数据量就会相应减少，由此缓解数据倾斜问题。",[13,73842,73843],{},[22,73844,73845],{},"缺陷",[13,73847,73848,73851],{},[22,73849,73850],{},"提高 reduce 端并行度并没有从根本上改变数据倾斜的本质和问题（方案一和方 案二从根本上避免了数据倾斜的发生）","，只是尽可能地去缓解和减轻 shuffle reduce task 的数据压力，以及数据倾斜的问题，适用于有较多 key 对应的数据量都比较大的情况。",[7759,73853,73855],{"id":73854},"_5方案四使用map-join","5、方案四：使用map join",[13,73857,73858],{},"正常情况下，join 操作都会执行 shuffle 过程，并且执行的是 reduce join，也就是先将所有相同的 key 和对应的 value 汇聚到一个 reduce task 中，然后再进行 join。",[13,73860,73861],{},[617,73862],{"alt":119,"src":62640},[13,73864,73865],{},"普通的 join 是会走 shuffle 过程的，而一旦 shuffle，就相当于会将相同 key 的数据拉取到一个 shuffle read task 中再进行 join，此时就是 reduce join。 但是如果一个 RDD 是比较小的，则可以采用广播小 RDD 全量数据+map 算子来实现与 join 同样的效果，也就是 map join，此时就不会发生 shuffle 操作，也就不会发生数据倾斜。",[13,73867,73868],{},[22,73869,73870],{},"注意：RDD 是并不能直接进行广播的，只能将 RDD 内部的数据通过 collect 拉取到 Driver 内存然后再进行广播。",[72,73872,73873],{},[13,73874,73875],{},"简单来说就是将少且散的数据全局到Driver端，直接消费到其他比较大的数据集中。",[23289,73877],{},[72,73879,73880,73883,73886,73889],{},[13,73881,73882],{},"应该不会有人真的看到这里吧~~",[13,73884,73885],{},"其实文档还有Spark调优没有写，但是碍于篇幅和我的精神状态，暂时就不准备夹在这个文档中间了。毕竟这也只是从0到1嘛，不是从1到1.5。",[13,73887,73888],{},"理论固然是重要的，但是千万别忘了代码实践。如果你想在简历上写了解Spark的话，上面这些基础基本上是吃透了的，同时还要熟读Spark的八股面经（认真脸）。当然，个人认为最好的提升方式就是直接写个项目，找找网上的Spark Streaming项目做一下，能够更加方便你了解Spark的工作原理。",[13,73890,73891],{},"如果你能在这学得比任课老师教的还好，那么我觉得该文档就有了它的价值。——Alexie-Z-Yevich 2023.4.20",[226,73893,228],{},{"title":119,"searchDepth":144,"depth":144,"links":73895},[73896,73904,73908,73915,73921],{"id":72585,"depth":132,"text":72586,"children":73897},[73898,73899,73900,73901,73902,73903],{"id":27706,"depth":144,"text":27767},{"id":72667,"depth":144,"text":72668},{"id":72693,"depth":144,"text":72694},{"id":72721,"depth":144,"text":72722},{"id":72849,"depth":144,"text":72850},{"id":73255,"depth":144,"text":73256},{"id":73335,"depth":132,"text":73336,"children":73905},[73906,73907],{"id":73339,"depth":144,"text":73340},{"id":73350,"depth":144,"text":73351},{"id":73371,"depth":132,"text":73372,"children":73909},[73910,73911,73912,73913,73914],{"id":73382,"depth":144,"text":73383},{"id":73399,"depth":144,"text":73400},{"id":73441,"depth":144,"text":73442},{"id":73472,"depth":144,"text":73473},{"id":73529,"depth":144,"text":73530},{"id":73562,"depth":132,"text":73563,"children":73916},[73917,73918,73919,73920],{"id":73566,"depth":144,"text":73567},{"id":73577,"depth":144,"text":73578},{"id":73639,"depth":144,"text":73640},{"id":73695,"depth":144,"text":73696},{"id":73734,"depth":132,"text":73735,"children":73922},[73923,73924,73925,73926,73927],{"id":73753,"depth":144,"text":73754},{"id":73771,"depth":144,"text":73772},{"id":73798,"depth":144,"text":73799},{"id":73836,"depth":144,"text":73837},{"id":73854,"depth":144,"text":73855},{},"我的大学\u002F大三下学期\u002FSpark大数据分析技术\u002FSpark从0到1（下）.md","\u002Fundergraduate\u002Fnote-8f6674bc858b",{"title":72577,"description":119},"undergraduate\u002Fnote-8f6674bc858b",[14541,23378,10715,6380],"Wg7l-BXbT3LeQlsH0Zr4_Dj92gpcWqraezUEv0lynAw",{"id":73936,"title":73937,"assetBase":239,"author":8,"body":73938,"category":23936,"collection":23324,"date":23325,"description":74038,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":74039,"navigation":128,"originalPath":74040,"path":74041,"seo":74042,"source":23330,"stem":74043,"tags":74044,"weight":250,"__hash__":74045},"content\u002Fundergraduate\u002Fnote-935f3d25a90b.md","IEEE参会学习感悟",{"type":10,"value":73939,"toc":74036},[73940,73943,73952,73955,73966,73969,73976,73979,73982,73994,73997,74000,74003,74014,74019,74029],[4517,73941,73937],{"id":73942},"ieee参会学习感悟",[13,73944,73945,73946,73951],{},"这两天参加了 ",[596,73947,73948],{},[22,73949,73950],{},"The 10th IEEE International Conference on Cyber Security and Cloud Computing(IEEE CSCloud 2023) & The 9th IEEE International Conference on Edge Computing and Scalable Cloud(IEEE EdgeCom 2023)"," 会议，简称为第十届 IEEE 网络安全与云计算国际会议和第九届 IEEE 边缘计算和可扩展云国际会议。当然不是作为优秀代表或是什么杰出学者参会，而是作为背景板有幸聆听了一些前沿技术。",[13,73953,73954],{},"说来惭愧，一开始还是很认真听得，但是后来就有些力不从心啦，毕竟水平和见识还远远赶不上这些专家，所以记录下我认真听得这几位教授的发言，为我的未来提供一丝可能性。",[13,73956,73957,73958,73961,73962,73965],{},"印象最深的就是第一位来自",[22,73959,73960],{},"华中科技大学的讲者金海","老师，他主讲：",[22,73963,73964],{},"基于数据流的图计算加速器","。下面是我对他讲解的一些个人理解和解读（不一定正确，留给未来的我评判）。",[13,73967,73968],{},"首先是大数据时代数据的存储模式，在我大学的学习中，已经初步了解到数据存储到数据库中大体上就是本来的形式（转码\u002F加密实际上也是数据本来的形式），学习大数据后发现NoSQL更倾向于存储非结构化的数据，其中以Redis为主将数据转换器为文档、KV结构存储为时下最热门的方式。但是这也并非是当下最优的存储结构，因为即使是KV数据都要求数据间有一定相关性（计数的KV不是此处我所说的），事实上海量数据中大部分数据可能并无直接关联，而是形成一个数据集后才能有直接关联。举个简单的例子：CPU和贵州并没有直接关联，但是当CPU和其他数据集合成数据中心的整体，就能和贵州有关联了。在传统的数据库或是KV的NoSQL上其实也能做到数据不关联、数据集关联，但我认为其中最大的区别就是“可复用性”，该样式的数据集只能整块关联，如果存在缺少或是冗余的字段，那么可能效率就不如新建一个数据集了。",[13,73970,73971,73972,73975],{},"这时候就引入了金海教授所说的：",[22,73973,73974],{},"将大数据抽象成图计算","。每个数据集就是一块图，可以不用考虑数据在图中的分布，也无需关联的图完全交叠。同时还可以讲完整的计算流程抽象成图结构，类似于函数，只在意结果而不在意过程实现。那么这么看来，图计算、图存储确实可能会是大数据不久的未来。不过金海教授的图和常规的图不一样，从他的讲解中，传统图在理想情况下是稠密数据，但是实际上是稀疏的，访问随机且无序。他们团队的设计架构就是为了解决传统图的问题，提高计算密集性和计算效率。",[13,73977,73978],{},"在此之前首先讲讲控制流的发展再来对比数据流的优势。从计算机的体系结构设计就离不开控制流，我们都知道计算机中有程序计数器无论是CPU、GPU实际上都是异步工作的，但是海量数据处理不可避免出现同步计算的情况，如果两个数据具有一定相关性，那么一定需要等到被关联的一方计算完成后才能计算关联方。上段没讲到的图的最大优势就在这里：降低了数据集之间的依赖关系，使得不需要一个数据集计算完才能进行下一步，多个图之间可以同步计算。那么回到控制流上来，控制流并没有利用上图的这种优势，依序执行的底层使得解决同步开销问题会特别麻烦，那么在现在大模型时代，真正的同步就需要不断的加入CPU、GPU、DPU等硬件支持，超过一定规模后这显然是不划算的。",[13,73980,73981],{},"再简单介绍下控制流的发展：在早期图计算中IBM使用CPU、Japan CREST使用CPU、NVIDIA使用GPU、中科睿芯ICT SmarCO－2使用的是DPU－m；当下比较热门的是Apache Hive使用的控制流、Intel Graph使用的自研存算一体芯片、ICT GraphDyns的转移系统以及UC Riverside等，本质上都是控制流实现的，这就是为什么AI爆火后大家疯狂抢卡，毕竟一张卡不够，就上两张嘛。",[72,73983,73984,73987],{},[13,73985,73986],{},"这里插一句：存算一体芯片被在场各专家认为是下一个时代的主流，如同苹果最近M2 Ultra 192G 显存内存一体、NVIDIA\u002FAMD相继推出企业工作站的存算一体大芯片，在对NLP等处理上面有着天然的优势（虽然具体是啥我也不知道），非常契合AI时代的模型训练。",[13,73988,73989,73990,73993],{},"补充：现在清楚了，",[22,73991,73992],{},"存算一体极大减小了异构架构之间传输的开销","，效率高很多",[13,73995,73996],{},"数据流就不存在同步开销的问题，控制流如果处理核心少会造成性能的浪费，但是数据流可以在细粒度上实现高资源利用率，同时因为图计算可以使得计算性能的提高不受限于设计模式，所以基于数据流的图计算的确能够很大程度上降本增效。后面就是金海教授团队在TPU上对加速器的设置与实践了，我还是才疏学浅了些，感兴趣大家可以看看金海教授的论文。最后还是说回图：图目前主要有三个大方向：图计算、图挖掘和图学习，图是动态非独立的，因此对于非结构化有很好的兼容性。",[13,73998,73999],{},"最后是一点私话，也是我对金海教授这么推崇的原因：一是他是第一个讲的，同时也通俗易懂，我特意为了参加这个会议回了趟学校（虽然是白嫖咯）；二是最近在尝试用Spark Streaming企图做一个数据流的项目，虽然经过这次会议还是没能思考出具体做什么，但是金海教授所言给了一个很好的方向，Spark GraphX和Spark Mllib如果综合起来，说不定可以做出些不一样的东西出来，不过这不是眼下最迫切的，所以也不需要马上就有目标。再次感谢金海教授！",[13,74001,74002],{},"后面还有两篇稍微认真听了的，但是都没有第一篇那么容易理解，可能是和我所学方向以及自身水平有关，也可能是因为这毕竟是个国际会议，所以后面的讲者有些采用的是英语叙述，本人英语小白，听天书也正常。",[13,74004,74005,74006,74009,74010,74013],{},"比较感兴趣的其一是",[22,74007,74008],{},"上海交通大学吴帆","教授主讲的：",[22,74011,74012],{},"大小模型端协同智能计算","。我简单概述下就是：当今时代大模型成为趋势，但是大模型只能存在云端，个人终端没有空间去存储大模型；同时因为个性化服务的推崇，指望大模型提供个性化服务很容易达到性能瓶颈。与此同时，终端设备的算力也在不断提高（其实我们现在的手机性能已经远远过剩了）。由此，为了平衡端云两侧的负载，吴帆教授团队提出：在端侧使用小模型进行定向、客制化服务，以减轻大模型的压力和开销，同时敏感数据保存在小模型（端侧），脱敏数据上传至中继\u002F云端辅助大模型迭代升级。他提出：现在主流的联邦方式：剪枝、量化、知识蒸馏，本质上都是将大模型变小，实际上会影响大模型性能，因此在模型上不做妥协，而将一部分计算下放到个人终端的小模型中。同时吴帆教授讲解了他在淘宝用脱敏用户数据实践的例子，目前的APP中有6兆左右的大小就是该团队合作的小模型。（这也让我感慨为什么APP总是忽大忽小，毕竟群众就是最好的检验品）下面是我对吴帆教授讲述的流程的一个简单的理解，如有不对，欢迎大家指正。",[13,74015,74016],{},[617,74017],{"alt":119,"src":74018},"img\u002FIEEE\u002F1.png",[13,74020,74021,74022,74009,74025,74028],{},"还有一篇比较感兴趣的是",[22,74023,74024],{},"东南大学的东方",[22,74026,74027],{},"面向ALOT应用的端边云协同计算框架","。官方解释：*边缘计算 edge computing 是指在靠近物或数据源头的一侧，采用网络、计算、存储、应用核心能力为一体的开放平台，就近提供最近端服务。其应用程序在边缘侧发起，产生更快的网络服务响应，满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。边缘计算处于物理实体和工业连接之间，或处于物理实体的顶端。而云端计算，仍然可以访问边缘计算的历史数据。*虽然东方教授花了大量时间讲解如何进行低延时、高效能的自适应感知智能计算，但是最吸引我的还是后面他讲的关于隐私安全的部分。他介绍了目前主要的保护隐私的方式：通过差分隐私（即本地加噪声等方式）提升联邦模式下的隐私安全。差分隐私就和我们常用的Jwt一样，加slat的效果比转码译码效果会好很多。但是差分隐私任然存在问题：非独立同分布会影响模型精度；同样大小的噪声在多轮训练后反而降低了模型的收敛速度。这里我猜是因为加了噪声相当于强行扩大了结果的摆动区间，当训练接近收敛的时候容易因为过大的区间发生震荡。所以东方教授提到使用动态差分，通过训练结果动态调整噪声大小，一是减小了模型不收敛的风险，二是在保证了隐私保护效果的同时，动态的噪声使得回显破解变得更加困难，因为基本上动态噪声是由计算机根据结果自己调整生成的。",[13,74030,74031,74032,74035],{},"其实不少教授讲解的都非常好，但是一个是我自身后期乏力，专业知识不太能跟上，二个是英语实在是太难懂了，确实是有心无力。像",[22,74033,74034],{},"金鑫教授讲的云计算、伍军教授讲的数字孪生、李东升教授讲的高性能机器学习","，都让我当时眼前一亮，同时也让我看到了自身的浅薄。但是还是值得高兴：我从来没有在此刻觉得我上的大学是有用的，即使远说不上半只脚踏进了这个圈子，但是我能听懂圈子的一部分了，未来？嗅着味就来了！",{"title":119,"searchDepth":144,"depth":144,"links":74037},[],"这两天参加了 The 10th IEEE International Conference on Cyber Security and Cloud Computing(IEEE CSCloud 2023) & The 9th IEEE International Conference on Edge Computing and Scalable Cloud(IEEE EdgeCom 2023) 会议，简称为第十届 IEEE 网络安全与云计算国际会议和第九届 IEEE 边缘计算和可扩展云国际会议。当然不是作为优秀代表或是什么杰出学者参会，而是作为背景板有幸聆听了一些前沿技术。",{},"Little Tips\u002FIEEE参会学习感悟.md","\u002Fundergraduate\u002Fnote-935f3d25a90b",{"title":73937,"description":74038},"undergraduate\u002Fnote-935f3d25a90b",[794,7744,23378,10715,6380,14542,23333],"Ak-xFX84n1ncBBTVedVaMJ3k29Q-4ll5I3mJxKtN87w",{"id":74047,"title":74048,"assetBase":239,"author":8,"body":74049,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":74470,"navigation":128,"originalPath":74471,"path":74472,"seo":74473,"source":23330,"stem":74474,"tags":74475,"weight":250,"__hash__":74476},"content\u002Fundergraduate\u002Fnote-9e66932b46d2.md","SQL小练2",{"type":10,"value":74050,"toc":74466},[74051,74088,74092,74095,74097,74102,74122,74127,74147,74154,74161,74168,74170,74172,74176,74336,74340,74464],[72,74052,74053,74057,74059,74061,74064,74066,74068,74070,74073,74076,74079,74082,74085],{},[13,74054,74055],{},[22,74056,23957],{},[13,74058,33647],{},[13,74060,33650],{},[13,74062,74063],{},"（1）EXPLOD && POSEXPLOD",[13,74065,28654],{},[13,74067,28672],{},[13,74069,63809],{},[13,74071,74072],{},"（5）",[13,74074,74075],{},"（6）",[13,74077,74078],{},"（7）",[13,74080,74081],{},"（8）",[13,74083,74084],{},"（9）",[13,74086,74087],{},"（10）",[7759,74089,74091],{"id":74090},"_1sql语法explod和posexplod的具体操作","1、SQL语法explod和posexplod的具体操作",[13,74093,74094],{},"SQL语法中的explode和posexplode都是表值生成器函数，它们可以将一个数组或映射类型的列拆分成多行。explode函数只返回数组的元素或映射的键和值，而posexplode函数还返回数组或映射中元素的位置。explode和posexplode函数通常和lateral view子句一起使用，以便在查询中引用拆分后的列。",[13,74096,34660],{},[2285,74098,74099],{},[52,74100,74101],{},"使用explode函数将一个包含多个单词的字符串拆分成多行。",[114,74103,74105],{"className":33693,"code":74104,"language":33695,"meta":119,"style":119},"select word\nfrom sentence\nlateral view explode(split(sentence, ' ')) t as word;\n",[17,74106,74107,74112,74117],{"__ignoreMap":119},[78,74108,74109],{"class":124,"line":125},[78,74110,74111],{},"select word\n",[78,74113,74114],{"class":124,"line":132},[78,74115,74116],{},"from sentence\n",[78,74118,74119],{"class":124,"line":138},[78,74120,74121],{},"lateral view explode(split(sentence, ' ')) t as word;\n",[2285,74123,74124],{"start":132},[52,74125,74126],{},"使用posexplode函数将一个包含多个数字的数组拆分成多行，并显示每个数字在数组中的位置。",[114,74128,74130],{"className":33693,"code":74129,"language":33695,"meta":119,"style":119},"select pos, num\nfrom numbers\nlateral view posexplode(array) t as pos, num;\n",[17,74131,74132,74137,74142],{"__ignoreMap":119},[78,74133,74134],{"class":124,"line":125},[78,74135,74136],{},"select pos, num\n",[78,74138,74139],{"class":124,"line":132},[78,74140,74141],{},"from numbers\n",[78,74143,74144],{"class":124,"line":138},[78,74145,74146],{},"lateral view posexplode(array) t as pos, num;\n",[13,74148,74149,74150],{},"(1) posexplode 表值生成器函数 - Azure Databricks - Databricks SQL. ",[5009,74151,74152],{"href":74152,"rel":74153},"https:\u002F\u002Flearn.microsoft.com\u002Fzh-cn\u002Fazure\u002Fdatabricks\u002Fsql\u002Flanguage-manual\u002Ffunctions\u002Fposexplode",[23647],[13,74155,74156,74157],{},"(2) Hive--sql中的explode()函数和posexplode()函数_dzysunshine的博客-CSDN博客. ",[5009,74158,74159],{"href":74159,"rel":74160},"https:\u002F\u002Fblog.csdn.net\u002Fdzysunshine\u002Farticle\u002Fdetails\u002F101110467",[23647],[13,74162,74163,74164],{},"(3) Hive中的explode使用全解 - 知乎. ",[5009,74165,74166],{"href":74166,"rel":74167},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F115918587",[23647],[23289,74169],{},[7759,74171,35045],{"id":35045},[10548,74173,74175],{"id":74174},"_1产生连续数","（1）产生连续数",[114,74177,74179],{"className":33693,"code":74178,"language":33695,"meta":119,"style":119},"输出结果如下所示：\n1\n2\n3\n4\n5\n...\n100\n参考答案：\n不 借 助 其 他 任 何 外 表 ， 实 现 产 生 连 续 数 值 ！\n\n此处给出两种解法，其一：\nselect id_start+pos as id\nfrom(\n     select 1 as id_start,\n            1000000 as id_end\n) m lateral view posexplode(split(space(id_end-id_start), ' ')) t as pos, val\n\nSQL解释：\n1. 在子查询中，创建一个临时表m，包含两个常量列id_start和id_end，分别赋值为1和1000000。\n2. 在主查询中，使用lateral view和posexplode函数，将m表中的id_end-id_start（即999999）转换为一个包含999999个空格的字符串，并将其拆分成多行，每行包含一个空格字符和它在字符串中的位置（从0开始）。\n3. 在主查询中，使用select语句，将m表中的id_start（即1）加上t表中的pos（即空格字符的位置），得到一个从1到1000000的连续整数序列，并将其命名为id。\n\n其二：\nselect row_number() over() as id\nfrom(\n    select split(space(99), ' ') as x) t\nlateral view explode(x) ex;\n\nSQL解释：\n1. 在子查询中，创建一个临时表t，包含一个数组列x，该列的值为一个包含99个空格的字符串，使用split函数将其按照空格分隔成一个数组。\n2. 在主查询中，使用lateral view和explode函数，将t表中的x列拆分成多行，每行包含一个空格字符，并命名为ex.col。\n3. 在主查询中，使用select语句和row_number函数，为每一行生成一个自增的序号，并将其命名为id。由于每一行都是一个空格字符，所以序号就相当于从1到100的连续整数序列。\n",[17,74180,74181,74185,74190,74195,74199,74204,74209,74214,74219,74223,74228,74232,74237,74242,74247,74252,74257,74262,74266,74270,74275,74280,74285,74289,74294,74299,74303,74308,74313,74317,74321,74326,74331],{"__ignoreMap":119},[78,74182,74183],{"class":124,"line":125},[78,74184,35217],{},[78,74186,74187],{"class":124,"line":132},[78,74188,74189],{},"1\n",[78,74191,74192],{"class":124,"line":138},[78,74193,74194],{},"2\n",[78,74196,74197],{"class":124,"line":144},[78,74198,23108],{},[78,74200,74201],{"class":124,"line":150},[78,74202,74203],{},"4\n",[78,74205,74206],{"class":124,"line":156},[78,74207,74208],{},"5\n",[78,74210,74211],{"class":124,"line":162},[78,74212,74213],{},"...\n",[78,74215,74216],{"class":124,"line":168},[78,74217,74218],{},"100\n",[78,74220,74221],{"class":124,"line":174},[78,74222,35528],{},[78,74224,74225],{"class":124,"line":180},[78,74226,74227],{},"不 借 助 其 他 任 何 外 表 ， 实 现 产 生 连 续 数 值 ！\n",[78,74229,74230],{"class":124,"line":186},[78,74231,129],{"emptyLinePlaceholder":128},[78,74233,74234],{"class":124,"line":192},[78,74235,74236],{},"此处给出两种解法，其一：\n",[78,74238,74239],{"class":124,"line":198},[78,74240,74241],{},"select id_start+pos as id\n",[78,74243,74244],{"class":124,"line":204},[78,74245,74246],{},"from(\n",[78,74248,74249],{"class":124,"line":210},[78,74250,74251],{},"     select 1 as id_start,\n",[78,74253,74254],{"class":124,"line":216},[78,74255,74256],{},"            1000000 as id_end\n",[78,74258,74259],{"class":124,"line":222},[78,74260,74261],{},") m lateral view posexplode(split(space(id_end-id_start), ' ')) t as pos, val\n",[78,74263,74264],{"class":124,"line":421},[78,74265,129],{"emptyLinePlaceholder":128},[78,74267,74268],{"class":124,"line":427},[78,74269,35428],{},[78,74271,74272],{"class":124,"line":433},[78,74273,74274],{},"1. 在子查询中，创建一个临时表m，包含两个常量列id_start和id_end，分别赋值为1和1000000。\n",[78,74276,74277],{"class":124,"line":2443},[78,74278,74279],{},"2. 在主查询中，使用lateral view和posexplode函数，将m表中的id_end-id_start（即999999）转换为一个包含999999个空格的字符串，并将其拆分成多行，每行包含一个空格字符和它在字符串中的位置（从0开始）。\n",[78,74281,74282],{"class":124,"line":2448},[78,74283,74284],{},"3. 在主查询中，使用select语句，将m表中的id_start（即1）加上t表中的pos（即空格字符的位置），得到一个从1到1000000的连续整数序列，并将其命名为id。\n",[78,74286,74287],{"class":124,"line":2454},[78,74288,129],{"emptyLinePlaceholder":128},[78,74290,74291],{"class":124,"line":2460},[78,74292,74293],{},"其二：\n",[78,74295,74296],{"class":124,"line":2465},[78,74297,74298],{},"select row_number() over() as id\n",[78,74300,74301],{"class":124,"line":2470},[78,74302,74246],{},[78,74304,74305],{"class":124,"line":2903},[78,74306,74307],{},"    select split(space(99), ' ') as x) t\n",[78,74309,74310],{"class":124,"line":2909},[78,74311,74312],{},"lateral view explode(x) ex;\n",[78,74314,74315],{"class":124,"line":11477},[78,74316,129],{"emptyLinePlaceholder":128},[78,74318,74319],{"class":124,"line":13374},[78,74320,35428],{},[78,74322,74323],{"class":124,"line":13380},[78,74324,74325],{},"1. 在子查询中，创建一个临时表t，包含一个数组列x，该列的值为一个包含99个空格的字符串，使用split函数将其按照空格分隔成一个数组。\n",[78,74327,74328],{"class":124,"line":13386},[78,74329,74330],{},"2. 在主查询中，使用lateral view和explode函数，将t表中的x列拆分成多行，每行包含一个空格字符，并命名为ex.col。\n",[78,74332,74333],{"class":124,"line":13722},[78,74334,74335],{},"3. 在主查询中，使用select语句和row_number函数，为每一行生成一个自增的序号，并将其命名为id。由于每一行都是一个空格字符，所以序号就相当于从1到100的连续整数序列。\n",[10548,74337,74339],{"id":74338},"_2数据展开","（2）数据展开",[114,74341,74343],{"className":33693,"code":74342,"language":33695,"meta":119,"style":119},"问题描述：如何将字符串\"1-5,16,11-13,9\"扩展成\n\"1,2,3,4,5,16,11,12,13,9\"？注意顺序不变。\n\n\n参考答案：\nselect concat_ws(',',collect_list(cast(rn as string)))\nfrom(\n    select a.rn, b.num, b.pos\n    from(\n        select row_number() over() as rn\n        from (select split(space(20), ' ') as x) t -- space(20)可灵活调整\n        lateral view explode(x) pe\n) a lateral view outer\nposexplode(split('1-5,16,11-13,9', ',')) b as pos, num\nwhere a.rn between cast(split(num, '-')[0] as int) and cast(split(num, '-')[1] a\ns int) or a.rn = num\norder by pos, rn\n) t;\n\nSQL解释：\n1. 在子查询中，创建一个临时表a，包含一个列rn，该列的值为从1到21（由space(20)决定）的连续整数序列，使用row_number函数和lateral view explode函数实现。\n2. 在子查询中，创建一个临时表b，包含两个列pos和num，分别表示给定字符串（'1-5,16,11-13,9'）中每个子串（以逗号分隔）在原字符串中的位置（从0开始）和值。\n3. 在子查询中，使用lateral view outer posexplode函数将b表中的num列拆分成多行，并保留原来的pos列。如果num是一个单个数字（如16或9），则拆分后只有一行；如果num是一个范围（如1-5或11-13），则拆分后有多行，并且每行都是范围内的一个整数。\n4. 在子查询中，使用join语句将a表和b表连接起来，并使用where条件过滤出符合范围要求的rn值。例如，当num为1-5时，只保留rn为1到5之间的行；当num为16时，只保留rn为16的行。同时使用order by语句按照pos和rn排序结果集。\n5. 在主查询中，使用select语句和concat_ws函数将结果集中的rn列转换为字符串，并用逗号连接起来。同时使用collect_list函数将所有行合并成一行。最终得到一个包含给定字符串指定范围内的整数的逗号分隔的字符串。\n",[17,74344,74345,74350,74355,74359,74363,74367,74372,74376,74381,74386,74391,74396,74401,74406,74411,74416,74421,74426,74431,74435,74439,74444,74449,74454,74459],{"__ignoreMap":119},[78,74346,74347],{"class":124,"line":125},[78,74348,74349],{},"问题描述：如何将字符串\"1-5,16,11-13,9\"扩展成\n",[78,74351,74352],{"class":124,"line":132},[78,74353,74354],{},"\"1,2,3,4,5,16,11,12,13,9\"？注意顺序不变。\n",[78,74356,74357],{"class":124,"line":138},[78,74358,129],{"emptyLinePlaceholder":128},[78,74360,74361],{"class":124,"line":144},[78,74362,129],{"emptyLinePlaceholder":128},[78,74364,74365],{"class":124,"line":150},[78,74366,35528],{},[78,74368,74369],{"class":124,"line":156},[78,74370,74371],{},"select concat_ws(',',collect_list(cast(rn as string)))\n",[78,74373,74374],{"class":124,"line":162},[78,74375,74246],{},[78,74377,74378],{"class":124,"line":168},[78,74379,74380],{},"    select a.rn, b.num, b.pos\n",[78,74382,74383],{"class":124,"line":174},[78,74384,74385],{},"    from(\n",[78,74387,74388],{"class":124,"line":180},[78,74389,74390],{},"        select row_number() over() as rn\n",[78,74392,74393],{"class":124,"line":186},[78,74394,74395],{},"        from (select split(space(20), ' ') as x) t -- space(20)可灵活调整\n",[78,74397,74398],{"class":124,"line":192},[78,74399,74400],{},"        lateral view explode(x) pe\n",[78,74402,74403],{"class":124,"line":198},[78,74404,74405],{},") a lateral view outer\n",[78,74407,74408],{"class":124,"line":204},[78,74409,74410],{},"posexplode(split('1-5,16,11-13,9', ',')) b as pos, num\n",[78,74412,74413],{"class":124,"line":210},[78,74414,74415],{},"where a.rn between cast(split(num, '-')[0] as int) and cast(split(num, '-')[1] a\n",[78,74417,74418],{"class":124,"line":216},[78,74419,74420],{},"s int) or a.rn = num\n",[78,74422,74423],{"class":124,"line":222},[78,74424,74425],{},"order by pos, rn\n",[78,74427,74428],{"class":124,"line":421},[78,74429,74430],{},") t;\n",[78,74432,74433],{"class":124,"line":427},[78,74434,129],{"emptyLinePlaceholder":128},[78,74436,74437],{"class":124,"line":433},[78,74438,35428],{},[78,74440,74441],{"class":124,"line":2443},[78,74442,74443],{},"1. 在子查询中，创建一个临时表a，包含一个列rn，该列的值为从1到21（由space(20)决定）的连续整数序列，使用row_number函数和lateral view explode函数实现。\n",[78,74445,74446],{"class":124,"line":2448},[78,74447,74448],{},"2. 在子查询中，创建一个临时表b，包含两个列pos和num，分别表示给定字符串（'1-5,16,11-13,9'）中每个子串（以逗号分隔）在原字符串中的位置（从0开始）和值。\n",[78,74450,74451],{"class":124,"line":2454},[78,74452,74453],{},"3. 在子查询中，使用lateral view outer posexplode函数将b表中的num列拆分成多行，并保留原来的pos列。如果num是一个单个数字（如16或9），则拆分后只有一行；如果num是一个范围（如1-5或11-13），则拆分后有多行，并且每行都是范围内的一个整数。\n",[78,74455,74456],{"class":124,"line":2460},[78,74457,74458],{},"4. 在子查询中，使用join语句将a表和b表连接起来，并使用where条件过滤出符合范围要求的rn值。例如，当num为1-5时，只保留rn为1到5之间的行；当num为16时，只保留rn为16的行。同时使用order by语句按照pos和rn排序结果集。\n",[78,74460,74461],{"class":124,"line":2465},[78,74462,74463],{},"5. 在主查询中，使用select语句和concat_ws函数将结果集中的rn列转换为字符串，并用逗号连接起来。同时使用collect_list函数将所有行合并成一行。最终得到一个包含给定字符串指定范围内的整数的逗号分隔的字符串。\n",[226,74465,228],{},{"title":119,"searchDepth":144,"depth":144,"links":74467},[74468,74469],{"id":74090,"depth":144,"text":74091},{"id":35045,"depth":144,"text":35045},{},"Little Tips\u002FSQL小练2.md","\u002Fundergraduate\u002Fnote-9e66932b46d2",{"title":74048,"description":119},"undergraduate\u002Fnote-9e66932b46d2",[10715,35725],"5GwbsKeFmWTZ3xrC0bhWKqYj0MBvLq4th-qpsyP1g-8",{"id":74478,"title":74479,"assetBase":239,"author":8,"body":74480,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":75311,"navigation":128,"originalPath":75312,"path":75313,"seo":75314,"source":23330,"stem":75315,"tags":75316,"weight":250,"__hash__":75317},"content\u002Fundergraduate\u002Fnote-a065487b1560.md","JavaWeb",{"type":10,"value":74481,"toc":75300},[74482,74485,74499,74503,74507,74510,74513,74519,74538,74554,74556,74560,74563,74566,74569,74572,74574,74578,74581,74584,74587,74590,74592,74596,74600,74603,74617,74619,74623,74628,74630,74634,74666,74668,74672,74675,74677,74681,74695,74738,74749,74751,74755,74759,74762,74765,74784,74786,74790,74798,74807,74809,74813,74816,74819,74821,74825,74829,74832,74834,74838,74901,74903,74907,74910,74912,74916,74930,74933,74936,74939,74942,74945,74948,74951,74954,74957,74960,74963,74966,74969,74971,74975,74979,74982,74984,74988,75002,75004,75008,75011,75056,75058,75062,75073,75075,75079,75083,75097,75117,75119,75123,75131,75133,75137,75145,75147,75151,75155,75158,75160,75164,75167,75169,75173,75203,75205,75209,75213,75216,75219,75230,75232,75236,75239,75241,75245,75248,75251,75254,75257,75260,75263,75265,75269,75273,75276,75282,75285,75291,75297],[4517,74483,74479],{"id":74484},"javaweb",[72,74486,74487,74496],{},[13,74488,74489,74490,74495],{},"写在前面：这篇文档旨在对于",[5009,74491,74494],{"href":74492,"rel":74493},"https:\u002F\u002Fgithub.com\u002FLyfive\u002FHnusterComputer\u002Fblob\u002Fmain\u002FJavaWeb\u002FJavaWeb%E5%A4%8D%E4%B9%A0%E6%96%87%E6%A1%A3.md",[23647],"LyFive的文档","进行一个补充（也就是仅自用的意思），我的更注重于详细的通俗易懂文字描述以及课后习题的解答，而他的主要是给大家画了流程图，方便大家了解体系结构。建议先看他那版后再来参阅我的OWO。",[13,74497,74498],{},"​                                                                                                                                                                       ——By Alexie-Z-Yevich 2022.5.9",[7759,74500,74502],{"id":74501},"第一章-web应用开发简介","第一章 Web应用开发简介",[10548,74504,74506],{"id":74505},"_1什么是cs结构什么是bs结构他们各有什么优缺点","1、什么是C\u002FS结构？什么是B\u002FS结构？他们各有什么优缺点？",[13,74508,74509],{},"C\u002FS即客户端\u002F服务器结构，服务器常采用高性能的PC或工作站，并采用大型数据库；B\u002FS即浏览器\u002F服务器结构，客户端不需要开发任何用户界面，而统一采用浏览器，通过Web浏览器向Web服务器发送请求。",[13,74511,74512],{},"优缺点：",[13,74514,28636,74515,74518],{},[22,74516,74517],{},"C\u002FS结构开发成本高于B\u002FS结构","，在C\u002FS结构中开发者需要对所有机型机型进行适配，而在B\u002FS结构中只需要兼容浏览器服务即可；",[13,74520,74521,74522,74525,74526,74529,74530,74533,74534,74537],{},"（2）C\u002FS结构的客户端负责与用于交互、收集用户信息、完成通过网络向服务器请求对数据库信息进行处理工作；B\u002FS结构的客户端把事务处理逻辑部分交给服务器处理，客户端只需要进行显示。对于",[22,74523,74524],{},"复杂的功能","来说，",[22,74527,74528],{},"C\u002FS结构劣于B\u002FS结构","，因为客户端程序庞大；但对于",[22,74531,74532],{},"服务器负载较重","，出现“崩溃”现象时，",[22,74535,74536],{},"C\u002FS结构优于B\u002FS结构","，因为数据能够得以保全。",[13,74539,28672,74540,74543,74544,27386,74547,52816,74550,74553],{},[22,74541,74542],{},"C\u002FS结构适用于专人使用","的系统，",[22,74545,74546],{},"安全性比较高",[22,74548,74549],{},"B\u002FS结构适用于多人使用",[22,74551,74552],{},"相对安全性低","一些。",[23289,74555],{},[10548,74557,74559],{"id":74558},"_2常见的cs和bs结构的例子","2、常见的C\u002FS和B\u002FS结构的例子",[13,74561,74562],{},"（1）下载的游戏-----网页游戏；",[13,74564,74565],{},"（2）QQ-----QQ邮箱；",[13,74567,74568],{},"（3）企业微信-----教务网。",[13,74570,74571],{},"（简单理解：一切网站访问的都属于B\u002FS结构，一切APP、客户端访问的都属于C\u002FS结构）",[23289,74573],{},[10548,74575,74577],{"id":74576},"_3web客户端技术有哪些web服务器端技术有哪些","3、Web客户端技术有哪些？Web服务器端技术有哪些？",[13,74579,74580],{},"客户端技术：",[13,74582,74583],{},"（1）HTML；（2）CSS；（3）Flash；（4）客户端脚本技术（JavaScript、TypeScript等）",[13,74585,74586],{},"服务器端技术：",[13,74588,74589],{},"（1）CGI；（2）ASP；（3）PHP；（4）ASP.NET；（5）JSP",[23289,74591],{},[7759,74593,74595],{"id":74594},"第二章-网页前端开发基础","第二章 网页前端开发基础",[10548,74597,74599],{"id":74598},"_1html由哪几部分组成","1、HTML由哪几部分组成？",[13,74601,74602],{},"HTML文档主要由4个主要标记组成。",[49,74604,74605,74608,74611,74614],{},[52,74606,74607],{},"\u003Chtml>标记：是html文件的开头，html页面的所有标记都要放在标记\n中，此标记没有实质性的功能。但是HTML文件不可缺少的部分。",[52,74609,74610],{},"\u003Chead>标记：是HTML文件的头标记，作用是放置HTML文件的信息。如：标题、css样式代码等。",[52,74612,74613],{},"\u003Ctitle>标记：网页标题，放置在head内。",[52,74615,74616],{},"\u003Cbody>标记：是HTML页面的主体标记。页面的所有内容都定义在body标记内。",[23289,74618],{},[10548,74620,74622],{"id":74621},"_2html有哪些常用标记都有什么作用","2、HTML有哪些常用标记？都有什么作用？",[49,74624,74625],{},[52,74626,74627],{},"这个在LyFive的文档中有详细的描述，这里就不过多赘述。",[23289,74629],{},[10548,74631,74633],{"id":74632},"_3input标记有几种输入类型","3、\u003Cinput>标记有几种输入类型？",[49,74635,74636,74639,74642,74645,74648,74651,74654,74657,74660,74663],{},[52,74637,74638],{},"text文本框",[52,74640,74641],{},"password密码域",[52,74643,74644],{},"file文件域",[52,74646,74647],{},"radio单选按钮",[52,74649,74650],{},"checkbox复选按钮",[52,74652,74653],{},"submit提交按钮",[52,74655,74656],{},"reset重置按钮",[52,74658,74659],{},"button普通按钮",[52,74661,74662],{},"hidden隐藏域",[52,74664,74665],{},"image图像域",[23289,74667],{},[10548,74669,74671],{"id":74670},"_4什么是csscss有哪些效果","4、什么是CSS？CSS有哪些效果？",[13,74673,74674],{},"CSS（层叠样式表）是W3C协会为弥补HTML在显示属性设定上的不足而制定的一套扩展样式标准。通过引入CSS可以对HTML文件进行美化，不必要引入过多资源，加快页面访问速度。",[23289,74676],{},[10548,74678,74680],{"id":74679},"_5如何为一个html页面添加css效果","5、如何为一个HTML页面添加CSS效果？",[49,74682,74683,74686,74689,74692],{},[52,74684,74685],{},"内样式：直接写在HTML标签内，通过style=“”引入CSS样式。",[52,74687,74688],{},"内嵌式：在页面中使用\u003Cstyle>标签，将CSS代码包含在其中。",[52,74690,74691],{},"链接式：将CSS代码写在*.css文件里，在HTML中使用\u003Clink href='*.css'>链接外部文件。（href：CSS文档的绝对或相对路径；rel：定义外部文档与调用文档的关系）",[52,74693,74694],{},"导入式：@import 是 CSS 2.1 特有的。",[114,74696,74698],{"className":41615,"code":74697,"language":41617,"meta":119,"style":119},"\u003C!--导入式引入外部样式-->\n\u003Cstyle>\n    @import url(\"css\u002Fstyle.css\");\n\u003C\u002Fstyle>\n",[17,74699,74700,74705,74713,74729],{"__ignoreMap":119},[78,74701,74702],{"class":124,"line":125},[78,74703,74704],{"class":41624},"\u003C!--导入式引入外部样式-->\n",[78,74706,74707,74709,74711],{"class":124,"line":132},[78,74708,41631],{"class":41630},[78,74710,226],{"class":41634},[78,74712,41653],{"class":41630},[78,74714,74715,74718,74721,74723,74726],{"class":124,"line":138},[78,74716,74717],{"class":41694},"    @import",[78,74719,74720],{"class":41755}," url",[78,74722,4594],{"class":41630},[78,74724,74725],{"class":41644},"\"css\u002Fstyle.css\"",[78,74727,74728],{"class":41630},");\n",[78,74730,74731,74734,74736],{"class":124,"line":144},[78,74732,74733],{"class":41630},"\u003C\u002F",[78,74735,226],{"class":41634},[78,74737,41653],{"class":41630},[13,74739,74740,74741,74744,74745],{},"**链接式与导入式的区别：**首先 link 和 import 语法结构不同，前者 ",[74742,74743],"link",{}," 是 html 标签，只能放入 html 源代码中使用，后者 import 可看作 css 样式，作用是引入 css 样式功能。import 在 html 使用时需要 ",[226,74746,74748],{"type":74747},"text\u002Fcss"," 标签，同时可以直接“@import url(CSS文件路径地址);” 放入 css 文件或 css 代码里引入其他 css 文件。",[23289,74750],{},[7759,74752,74754],{"id":74753},"第三章-javascript脚本语言","第三章 JavaScript脚本语言",[10548,74756,74758],{"id":74757},"_1什么是javascriptjavascript和java是什么关系","1、什么是JavaScript？JavaScript和Java是什么关系？",[13,74760,74761],{},"JavaScript是一种基于对象和事件驱动并具有安全和性能的解释性脚本语言，在Web应用中得到了非常广泛的应用。他不需要进行编译，而是直接嵌入在http页面中。js常用来进行数据验证、控制浏览器以及生成时钟、日历和时间戳文档等。",[13,74763,74764],{},"JavaScript与Java除了语法有一些相似之外，两者毫不相关。",[13,74766,74767,74768,1011,74771,1011,74774,1011,74777,1011,74780,74783],{},"JS具有",[22,74769,74770],{},"解释性",[22,74772,74773],{},"基于对象",[22,74775,74776],{},"事件驱动",[22,74778,74779],{},"安全性",[22,74781,74782],{},"跨平台","的特点。",[23289,74785],{},[10548,74787,74789],{"id":74788},"_2javascript脚本如何调用javascript有哪些常用的属性和方法","2、JavaScript脚本如何调用？JavaScript有哪些常用的属性和方法？",[49,74791,74792,74795],{},[52,74793,74794],{},"直接嵌入：在HTML代码中直接使用\u003Cscript>标签引入JS代码。",[52,74796,74797],{},"链接：在\u003Cscript>标签中使用src属性引入外部的*.js文件。",[13,74799,74800,74801,74806],{},"常用属性和方法直接参考",[5009,74802,74805],{"href":74803,"rel":74804},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript",[23647],"JS的官方文档","。选择写几个即可。",[23289,74808],{},[10548,74810,74812],{"id":74811},"_3什么是ajax如何用ajax实时更新前台页面数据","3、什么是Ajax？如何用Ajax实时更新前台页面数据？",[13,74814,74815],{},"Ajax的意思是异步的JavaScript和xml，它是js、xml、css、dom等多种已有技术的组合，可以实现客户端的异步请求操作，进而不需要刷新页面的情况下与服务器进行通信，减少用户的等待时间，减轻服务器和带宽的负担，提供更好的服务响应。",[13,74817,74818],{},"Ajax接收前端发来的信息，通过XMLHttpRequest对象向后端发送请求，同时接收response对象，将它部署到前端页面。",[23289,74820],{},[7759,74822,74824],{"id":74823},"第五章-走进jsp","第五章 走进JSP",[10548,74826,74828],{"id":74827},"_1什么是jsp","1、什么是JSP？",[13,74830,74831],{},"JSP是在HTML代码中嵌入Java代码片段和JSP标签，构成了JSP网页。主要由指令标签、HTML语句、注释、嵌入Java代码、JSP动作标签等5个元素组成。",[23289,74833],{},[10548,74835,74837],{"id":74836},"_2jsp有哪些指令标签","2、JSP有哪些指令标签？",[49,74839,74840,74851,74859,74873,74884],{},[52,74841,74842,74843],{},"page指令：定义整个JSP页面的相关属性，这些属性会在解析成Servlet时转换为对应的Java程序代\n码。",[49,74844,74845,74848],{},[52,74846,74847],{},"格式： \u003C%@ page attr1 = \"value1\" attr2 = \"value2\" %>",[52,74849,74850],{},"属性： import 导包，pageEncoding 文件编码，contentType 设置页面文件类型\n（如\"text\u002Fhtml\")，include 导入其他文件(和CPP的include基本一致)",[52,74852,74853,74854],{},"嵌入Java代码",[49,74855,74856],{},[52,74857,74858],{},"格式 \u003C% JavaCode %>",[52,74860,74861,74862],{},"声明",[49,74863,74864,74867,74870],{},[52,74865,74866],{},"格式 \u003C%! JavaCode %>",[52,74868,74869],{},"声明全局变量： \u003C%! long startTime = System.nanoTime(); %>",[52,74871,74872],{},"声明全局方法： \u003C%! int Max(int a,int b){return a > b ? a : b ;} %>",[52,74874,74875,74876],{},"JSP表达式",[49,74877,74878,74881],{},[52,74879,74880],{},"格式 \u003C%= 表达式 %>",[52,74882,74883],{},"例如： \u003C%= 2*Math.PI %>会把2Pi的结果直接输出在页面上，类型为字符串",[52,74885,74886,74887],{},"注释",[49,74888,74889,74892,74895,74898],{},[52,74890,74891],{},"HTML注释： ",[52,74893,74894],{},"JSP注释： \u003C%-- 注释内容 --%>",[52,74896,74897],{},"动态注释： 把JSP代码嵌入到HTL注释内，如 ",[52,74899,74900],{},"JSP内部注释和Java注释一致。 \u002F\u002F 和 \u002F* *\u002F",[23289,74902],{},[10548,74904,74906],{"id":74905},"_3如何在jsp中运行java程序","3、如何在JSP中运行Java程序？",[13,74908,74909],{},"见上体的标签。",[23289,74911],{},[10548,74913,74915],{"id":74914},"_4什么是request对象什么是response对象什么是session对象什么是application对象这些对象有哪些共同点和不同点","4、什么是request对象？什么是response对象？什么是session对象？什么是application对象？这些对象有哪些共同点和不同点？",[49,74917,74918,74921,74924,74927],{},[52,74919,74920],{},"request对象：是javax.servlet.http.HTTPServletRequest类型的对象。代表了客户端的请求信息，主要用于接收HTTP传送到服务器端的数据（包括头信息Header、系统信息、请求方式Methods以及请求参数Params等）。作用域为一次请求。",[52,74922,74923],{},"response对象：代表的是对客户端的响应，主要是将JSP容器处理过的对象传回客户端。作用域为只在JSP页面内有效。",[52,74925,74926],{},"session对象：由服务器自动创建的与用户请求相关的对象。一个用户对应一个session对象，用于保存用户的信息，追踪用户的操作状态。（内部使用Map类来保存数据）",[52,74928,74929],{},"application对象：可将信息保存在服务器中直到服务器关闭（类似于缓存区？），相比于session对象，application对象的生命周期更长，类似于系统的“全局变量”。",[13,74931,74932],{},"共同点：",[13,74934,74935],{},"都是asp中的作用域。（作用域详细的说就是 “信息共享的范围”，也就是一个信息能够在多大的范围内有效）",[13,74937,74938],{},"不同点：",[13,74940,74941],{},"作用域大小各不相同，作用对象也不同。request主要作用于请求；response作用于JSP页面；session和application作用于用户，但是session与用户是一对一关系，而application与用户是一对多关系。",[13,74943,74944],{},"request、response以协议为基础，为此他们面向的是参数Parameter、头信息Header；sesession、application以Attribute属性为基础，为此属性的增删改查基本都一致。",[13,74946,74947],{},"**扩展：**cookie是小段的文本信息，通过cookie可以标识用户身份、记录用户名及密码、追踪重复用户。cookie是由服务端生成的。",[13,74949,74950],{},"cookie和session的区别：",[13,74952,74953],{},"1、cookie存储在客户端，SESSION存储在服务器；",[13,74955,74956],{},"2、cookie机制保持连接，通信时压力在客户端；session机制保持连接，通信时压力在服务器；",[13,74958,74959],{},"3、session机制更安全，因为cookie存放在客户端，容易被窃取。但是session机制依赖于sessionID,而sessionID保存在cookie中，一旦客户端禁用了cookie，session也将失效；",[13,74961,74962],{},"4、cookie是以文本的形式存储在客户端，存储量有限(\u003C=4KB)；session可以无限量地往里面添加内容；",[13,74964,74965],{},"5、cookie支持跨域名访问，session不支持跨域名访问；",[13,74967,74968],{},"6、cookie可以设置为长期有效，而session会随会话窗口关闭而失效。",[23289,74970],{},[7759,74972,74974],{"id":74973},"第六章-servlet技术","第六章 Servlet技术",[10548,74976,74978],{"id":74977},"_1webxml文件是做什么用的","1、web.xml文件是做什么用的？",[13,74980,74981],{},"web.xml用来配置Servlet，使Servlet对象能够正常运行。（告知web容器哪一个请求调用哪一个Servlet对象处理，对Servlet起到一个注册的作用）",[23289,74983],{},[10548,74985,74987],{"id":74986},"_2servlet都有哪些接口这些接口都有什么作用","2、Servlet都有哪些接口？这些接口都有什么作用？",[49,74989,74990,74993,74996,74999],{},[52,74991,74992],{},"Servlet接口：Servlet运行需要Servlet容器的支持，servlet容器通过调用Servlet对象提供了标准的API接口，对请求进行处理。简单来说就是Servet的生命周期，包含init初始化、service处理请求、getServlet config获取配置信息、getServletInfo返回配置信息、destory销毁对象五个过程。",[52,74994,74995],{},"ServletConfig接口：封装Servlet的配置信息，每个Servlet都有且只有一个ServletConfig对象。",[52,74997,74998],{},"HttpServletRequest接口：继承于javax.servlet.ServletRequest接口，用于接收前端传来的的基本信息（路径、参数、类型、方法等）。",[52,75000,75001],{},"HttpservletResponse接口：继承于javax.servlet.ServletResponse接口，用于向前端发送后端的处理信息（cookie、状态码等）。",[23289,75003],{},[10548,75005,75007],{"id":75006},"_3如何指定项目默认页面","3、如何指定项目默认页面？",[13,75009,75010],{},"在web.xml中对servlet进行配置，通过配置\u003Cservlet-mapping>指定项目默认页面。",[114,75012,75014],{"className":23652,"code":75013,"language":23654,"meta":119,"style":119},"\u003Cservlet>\n        \u003Cservlet-name>Servlet\u003C\u002Fservlet-name>  \u002F\u002F 设置Servlet名字\n        \u003Cservlet-class>com.*.Servlet\u003C\u002Fservlet-class>  \u002F\u002F 导入class类文件\n\u003C\u002Fservlet>\n\u003Cservlet-mapping>\n        \u003Cservlet-name>Servlet\u003C\u002Fservlet-name>  \u002F\u002F 找到映射对象\n        \u003Curl-parttern>\u002F\u003C\u002Furl-parttern>  \u002F\u002F 设置映射地址\n\u003C\u002Fservlet-mapping>\n",[17,75015,75016,75021,75026,75031,75036,75041,75046,75051],{"__ignoreMap":119},[78,75017,75018],{"class":124,"line":125},[78,75019,75020],{},"\u003Cservlet>\n",[78,75022,75023],{"class":124,"line":132},[78,75024,75025],{},"        \u003Cservlet-name>Servlet\u003C\u002Fservlet-name>  \u002F\u002F 设置Servlet名字\n",[78,75027,75028],{"class":124,"line":138},[78,75029,75030],{},"        \u003Cservlet-class>com.*.Servlet\u003C\u002Fservlet-class>  \u002F\u002F 导入class类文件\n",[78,75032,75033],{"class":124,"line":144},[78,75034,75035],{},"\u003C\u002Fservlet>\n",[78,75037,75038],{"class":124,"line":150},[78,75039,75040],{},"\u003Cservlet-mapping>\n",[78,75042,75043],{"class":124,"line":156},[78,75044,75045],{},"        \u003Cservlet-name>Servlet\u003C\u002Fservlet-name>  \u002F\u002F 找到映射对象\n",[78,75047,75048],{"class":124,"line":162},[78,75049,75050],{},"        \u003Curl-parttern>\u002F\u003C\u002Furl-parttern>  \u002F\u002F 设置映射地址\n",[78,75052,75053],{"class":124,"line":168},[78,75054,75055],{},"\u003C\u002Fservlet-mapping>\n",[23289,75057],{},[10548,75059,75061],{"id":75060},"_4如何使用过滤器过滤器中有哪些方法它们运行的顺序是什么","4、如何使用过滤器？过滤器中有哪些方法？它们运行的顺序是什么？",[49,75063,75064,75067,75070],{},[52,75065,75066],{},"在web.xml中配置\u003Cfilter>标签以及\u003Cfilter-mapping>标签配置过滤器。",[52,75068,75069],{},"过滤器中的方法：init初始化、doFilter执行过滤操作、destory销毁（主要方法）。",[52,75071,75072],{},"运行顺序：初始化->执行->销毁，但是注意：过滤器之间同样有优先顺序，在web.xml上面的配置先于下面的配置执行，因此需要注意过滤器把其他过滤器给过滤掉了。",[23289,75074],{},[7759,75076,75078],{"id":75077},"第七章-数据库技术","第七章 数据库技术",[10548,75080,75082],{"id":75081},"_1简述jdbc连接数据库的基本步骤","1、简述JDBC连接数据库的基本步骤。",[49,75084,75085,75088,75091,75094],{},[52,75086,75087],{},"导入JDBC驱动；",[52,75089,75090],{},"输入数据库信息连接数据库；",[52,75092,75093],{},"预载SQL语句；",[52,75095,75096],{},"更新数据库。（这个是老师上课讲的，没有照着书本来）",[114,75098,75100],{"className":23652,"code":75099,"language":23654,"meta":119,"style":119},"Class.forName(\"com.mysql.jdbc.Driver\");  \u002F\u002F 导入驱动（需要try\u002Fcatch语句包裹）\nConnection connection = DriverManager.getConnection(\"jdbc:mysql:\u002F\u002F127.0.0.1:3306\u002FMysqlDatabase\", \"username\", \"password\");\nPreparedStatement preparedStatement = connection.preparedStatement(\"select * from MysqlTable\");  \u002F\u002F 动态加载将预载和更新融为一步。\n",[17,75101,75102,75107,75112],{"__ignoreMap":119},[78,75103,75104],{"class":124,"line":125},[78,75105,75106],{},"Class.forName(\"com.mysql.jdbc.Driver\");  \u002F\u002F 导入驱动（需要try\u002Fcatch语句包裹）\n",[78,75108,75109],{"class":124,"line":132},[78,75110,75111],{},"Connection connection = DriverManager.getConnection(\"jdbc:mysql:\u002F\u002F127.0.0.1:3306\u002FMysqlDatabase\", \"username\", \"password\");\n",[78,75113,75114],{"class":124,"line":138},[78,75115,75116],{},"PreparedStatement preparedStatement = connection.preparedStatement(\"select * from MysqlTable\");  \u002F\u002F 动态加载将预载和更新融为一步。\n",[23289,75118],{},[10548,75120,75122],{"id":75121},"_2执行动态sql语句的接口是什么-3jdbc提供的两种实现数据查询的方法是什么","2、执行动态SQL语句的接口是什么？& 3、JDBC提供的两种实现数据查询的方法是什么？",[49,75124,75125,75128],{},[52,75126,75127],{},"Statement接口执行静态SQL语句；",[52,75129,75130],{},"PreparedStatement接口执行动态SQL语句。",[23289,75132],{},[10548,75134,75136],{"id":75135},"_4statement类中的两个方法executequery和executeupdate两者的区别是什么","4、Statement类中的两个方法：executeQuery()和executeUpdate()，两者的区别是什么？",[49,75138,75139,75142],{},[52,75140,75141],{},"executeUpdate()：返回int类型数值，代表影响数据库记录的条数；（对于增删改操作）",[52,75143,75144],{},"executeQuery()：返回ResultSet类型的结果集，包含了返回的所有信息。（对应查操作）",[23289,75146],{},[7759,75148,75150],{"id":75149},"第九章-spring-mvc框架","第九章 Spring MVC框架",[10548,75152,75154],{"id":75153},"_1mvc模式由哪几部分组成","1、MVC模式由哪几部分组成？",[13,75156,75157],{},"MVC（Model-View-Controller，模型-视图-控制器）是一个存在服务器表达层的模型。",[23289,75159],{},[10548,75161,75163],{"id":75162},"_2web-inf目录下的资源有什么特点需要如何访问","2、WEB-INF目录下的资源有什么特点？需要如何访问？",[13,75165,75166],{},"WEB-INF目录下存放安全性较高的资源文件，不能直接通过浏览器直接访问的，需要通过服务器来访问。在外部通过配置控制层映射访问文件。",[23289,75168],{},[10548,75170,75172],{"id":75171},"_3spring-mvc的拦截器有哪些方法这些方法各有什么特点","3、Spring MVC的拦截器有哪些方法？这些方法各有什么特点？",[49,75174,75175,75189],{},[52,75176,75177,75178],{},"HanderInterceptor接口：",[49,75179,75180,75183,75186],{},[52,75181,75182],{},"preHandle：对请求进行判断，决定程序是否继续执行；",[52,75184,75185],{},"postHandle：同意处理返回的视图；",[52,75187,75188],{},"agterCompletion：进行统一的异常或者日志处理操作。",[52,75190,75191,75192],{},"WebRequestInterceptor接口：",[49,75193,75194,75197,75200],{},[52,75195,75196],{},"preHandle：方法的前期准备；",[52,75198,75199],{},"postHandle：改变ModelMap中的属性来改变Controller最终返回的Model模型；",[52,75201,75202],{},"agterCompletion：将WebRequest参数中不需要的准备资源释放掉。",[23289,75204],{},[7759,75206,75208],{"id":75207},"第十一章-spring框架","第十一章 Spring框架",[10548,75210,75212],{"id":75211},"_1什么是ioc注入如何使用spring框架进行注入","1、什么是IoC注入？如何使用Spring框架进行注入？",[13,75214,75215],{},"IoC（控制反转）和DI密不可分，IoC是在设计的角度看Spring，DI是在Sping的角度看代码，角度不同但是含义一样：依赖注入--将原本实例化的功能从开发者给到了Spring。",[13,75217,75218],{},"注入方法：",[49,75220,75221,75224,75227],{},[52,75222,75223],{},"接口注入：实现容器所规定的接口，使程序代码和容器的API绑定在一起；",[52,75225,75226],{},"Setter注入：基于JavaBean的Setter方法为属性赋值；",[52,75228,75229],{},"构造器注入：基于构造方法为属性赋值，在实例化对象的同时完成了属性的初始化。",[23289,75231],{},[10548,75233,75235],{"id":75234},"_2什么是aop","2、什么是AOP？",[13,75237,75238],{},"AOP是一种思想，即面向切面编程。基于Java的代理机制，使方法与类分离。",[23289,75240],{},[10548,75242,75244],{"id":75243},"_3spring框架有哪些项目开发优势","3、Spring框架有哪些项目开发优势？",[13,75246,75247],{},"1.低侵入式设计，重复代码量少；",[13,75249,75250],{},"2.独立于各种应用服务器，基于Spring框架的应用，可以真正实现一个代码，多平台复用；",[13,75252,75253],{},"3.Spring的DI机制降低了业务对象替换的复杂性，提高了组件之间的解耦；",[13,75255,75256],{},"4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理，从而提供了更好的复用；",[13,75258,75259],{},"5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合，并简化了底层的数据库访问；",[13,75261,75262],{},"6.Spring并不强制应用完全依赖于Spring，开发者可自由选用Spring框架的部分或全部。",[23289,75264],{},[7759,75266,75268],{"id":75267},"第十二章-ssm框架整合应用","第十二章 SSM框架整合应用",[10548,75270,75272],{"id":75271},"什么是ssm","什么是SSM？",[13,75274,75275],{},"SSM（Spring+SpringMVC+MyBatis）框架集由Spring、MyBatis两个开源框架整合而成（SpringMVC是Spring中的部分内容），常作为数据源较简单的web项目的框架。",[13,75277,75278,75281],{},[22,75279,75280],{},"Spring","\nSpring就像是整个项目中装配bean的大工厂，在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。",[13,75283,75284],{},"Spring的核心思想是IoC（控制反转），即不再需要程序员去显式地 new 一个对象，而是让Spring框架帮你来完成这一切。",[13,75286,75287,75290],{},[22,75288,75289],{},"SpringMVC","\nSpringMVC在项目中拦截用户请求，它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责，将用户请求通过HandlerMapping去匹配Controller，Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。",[13,75292,75293,75296],{},[22,75294,75295],{},"Mybatis","\nmybatis是对jdbc的封装，它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件，Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时，通过sqlSessionFactory拿到一个sqlSession，再执行sql命令。",[226,75298,75299],{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":119,"searchDepth":144,"depth":144,"links":75301},[75302,75303,75304,75305,75306,75307,75308,75309,75310],{"id":74501,"depth":144,"text":74502},{"id":74594,"depth":144,"text":74595},{"id":74753,"depth":144,"text":74754},{"id":74823,"depth":144,"text":74824},{"id":74973,"depth":144,"text":74974},{"id":75077,"depth":144,"text":75078},{"id":75149,"depth":144,"text":75150},{"id":75207,"depth":144,"text":75208},{"id":75267,"depth":144,"text":75268},{},"我的大学\u002F大二下学期\u002FJavaWeb.md","\u002Fundergraduate\u002Fnote-a065487b1560",{"title":74479,"description":119},"undergraduate\u002Fnote-a065487b1560",[10715],"VVQfom78mHXJIBLBGgpIUnM7HrXMO98VCCK4HmLs7ng",{"id":75319,"title":75320,"assetBase":239,"author":8,"body":75321,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":78157,"navigation":128,"originalPath":78158,"path":78159,"seo":78160,"source":23330,"stem":78161,"tags":78162,"weight":250,"__hash__":78163},"content\u002Fundergraduate\u002Fnote-a9ec87552e26.md","Python ETL",{"type":10,"value":75322,"toc":78137},[75323,75327,75340,75344,75348,75351,75354,75357,75361,75367,75384,75387,75395,75398,75403,75417,75420,75422,75426,75432,75438,75452,75455,75458,75491,75493,75496,75500,75504,75509,75549,75554,75760,75765,75940,75945,75956,76175,76179,76182,76215,76250,76555,76559,76577,76650,76655,76661,76666,76796,76815,76822,76862,77124,77130,77136,77209,77214,77499,77504,77930,77935,78117,78119,78123,78127,78131,78135],[4517,75324,75326],{"id":75325},"etl工程","ETL工程",[72,75328,75329,75331,75334,75337],{},[13,75330,23957],{},[13,75332,75333],{},"如果说前端和后端岗位的供需是逐年轮换的，那么不赶巧，我大数据这边在考研前主要需求语言是Java，偏向于数据开发；在我考完研之后再看实习就是Python，偏向数据分析。。。",[13,75335,75336],{},"人不能因噎废食，有时候在时代浪潮的作用下微乎其微，不可能等到Java重新成为大数据岗位主流语言的那天再去找工作，因此乘着这个“机会”，学习了下Python的项目结构、ETL完整的流程以及FineBI、Kettle等工具的使用。",[13,75338,75339],{},"最重要的还是对项目结构的学习，系统的项目结构了解也方便未来看懂其他人的代码，能够很好快速的适应Python项目开发。",[107,75341,75343],{"id":75342},"一etl","一、ETL",[7759,75345,75347],{"id":75346},"_1什么是etl","1、什么是ETL？",[13,75349,75350],{},"E: 数据抽取-- 抽取的是其他数据源中的数据",[13,75352,75353],{},"T: 数据转换-- 将数据转换为统一的格式,消除异常值,缺失值,对于错误的逻辑进行修改",[13,75355,75356],{},"L: 数据加载-- 将不同数据源的数据处理后加载到数仓或者输出到指定位置",[7759,75358,75360],{"id":75359},"_2常见的数据存储格式","2、常见的数据存储格式",[13,75362,75363,75366],{},[22,75364,75365],{},"结构化数据:"," 每一个数据都可以使用行索引和列索引标记,同时使用行和列索引可以标记一个唯一的值",[49,75368,75369,75372,75375,75378],{},[52,75370,75371],{},"数据库中的表",[52,75373,75374],{},"Excel",[52,75376,75377],{},"CSV数据格式",[52,75379,75380,75381,4604],{},"TSV数据格式(其实就是CSV格式的数据,但是分隔符用的是制表位",[17,75382,75383],{},"\\t",[13,75385,75386],{},"**半结构化数据:**数据中的一部分数据是结构化数据,或者可以转换为结构化数据",[49,75388,75389,75392],{},[52,75390,75391],{},"JSON数据格式",[52,75393,75394],{},"XML数据格式",[13,75396,75397],{},"==注意: JSON数据和XML数据在任何情况下,都可以互相转换. 半结构化数据,通常会转换为结构化数据后,再做分析.==",[13,75399,75400],{},[22,75401,75402],{},"非结构化数据:",[49,75404,75405,75408,75411,75414],{},[52,75406,75407],{},"markdown文本",[52,75409,75410],{},"word文档",[52,75412,75413],{},"mp3",[52,75415,75416],{},"avi、mp4",[13,75418,75419],{},"==注意: 非结构化数据,一般我们不做分析,可以提取其中的一部分,或者其中的规律,保存为结构化数据后再做分析.==",[23289,75421],{},[107,75423,75425],{"id":75424},"二python项目结构","二、Python项目结构",[13,75427,75428,75429],{},"(project name)工程名称: ",[17,75430,75431],{},"python_etl",[13,75433,75434,75435,8661],{},"工程名称可以随意定义,但是要符合标识符的",[22,75436,75437],{},"命名规则",[49,75439,75440,75443,75446,75449],{},[52,75441,75442],{},"不能使用关键字",[52,75444,75445],{},"只能使用字母数字和下划线",[52,75447,75448],{},"不能以数字开头",[52,75450,75451],{},"严格区分大小写",[13,75453,75454],{},"标识符: 程序员自己定义的,具有特殊功能或含义的字符组合",[13,75456,75457],{},"关键字: 系统或者解释器定义的,具有特殊功能或者含义的字符组合",[72,75459,75460,75463,75480,75485,75488],{},[13,75461,75462],{},"5个目录:",[49,75464,75465,75468,75471,75474,75477],{},[52,75466,75467],{},"config：保存整个ETL工程的配置信息",[52,75469,75470],{},"model：保存项目的数据模型文件",[52,75472,75473],{},"test：保存单元测试的代码文件",[52,75475,75476],{},"util：保存项目的工具文件",[52,75478,75479],{},"learn：保存项目开发过程中的一些基础知识讲解练习文件（实际不需要）",[13,75481,75482],{},[22,75483,75484],{},"问题: 什么时候创建package 什么时候创建directory???",[13,75486,75487],{},"如果你当前目录中的文件可能被其他文件引用就是用package",[13,75489,75490],{},"如果你当前文件目录中的文件不会被任何文件引用就使用directory  例如:  logs  learn",[23289,75492],{},[13,75494,75495],{},"![](img\u002FPython ETL\u002F1.png)",[107,75497,75499],{"id":75498},"三python常用模块","三、Python常用模块",[39316,75501,75503],{"id":75502},"_61-日志模块理解","6.1 日志模块(理解)",[13,75505,75506],{},[17,75507,75508],{},"import logging",[72,75510,75511,75514,75537,75540],{},[13,75512,75513],{},"核心理解:",[2285,75515,75516,75519,75525,75531],{"start":250},[52,75517,75518],{},"导入模块  (==自己的文件名不要和内置模块名称重名,否则内置模块无法使用==)",[52,75520,75521,75522],{},"日志管理对象: 负责日志的收集工作 - ",[17,75523,75524],{},"相当于执法记录仪",[52,75526,75527,75528],{},"日志处理器: 负责日志的输出形式管理(终端\u002F文件) - ",[17,75529,75530],{},"相当于将记录仪连接的打印机",[52,75532,75533,75534],{},"日志格式: 负责日志的输出格式管理 - ",[17,75535,75536],{},"相当于打印机中的墨盒",[13,75538,75539],{},"日志格式:",[114,75541,75543],{"className":116,"code":75542,"language":118,"meta":119,"style":119},"'%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]：%(message)s'\n",[17,75544,75545],{"__ignoreMap":119},[78,75546,75547],{"class":124,"line":125},[78,75548,75542],{},[13,75550,75551],{},[22,75552,75553],{},"logging日志模块的基本使用",[114,75555,75557],{"className":116,"code":75556,"language":118,"meta":119,"style":119},"\"\"\"\nlogging模块: 主要是为了记录程序运行期间产生的日志信息\n\n日志器对象的创建和配置\n1. 日志器对象的创建\n2. 日志处理器的创建\n3. 将日志处理器绑定到日志器对象上\n\n日志的输出\n1. 设置日志输出级别\n2. 输出不同级别的日志信息\n\"\"\"\n# 0.导入模块\nimport logging\n\n####################### 日志器对象的创建和配置  #####################\n# 1. 日志器对象的创建\nlogger = logging.getLogger()\n# 2. 日志处理器的创建\nstream_handler = logging.StreamHandler()\n# 3. 将日志处理器绑定到日志器对象上\nlogger.addHandler(stream_handler)\n\n############################ 日志的输出  #######################\n# 1. 设置日志输出级别 (默认warning及warning级别以上的日志信息会被输出)\n# 忘记日志自己别的数据值,因为如果使用10 20 30 就会做不到见名知意,降低代码的可读性\nlogger.setLevel(logging.INFO)\n\n# 2. 输出不同级别的日志信息\n\"\"\"\n日志级别 5个:\ndebug: 代码调试时输出的日志信息\ninfo: 代码正常运行过程中输出的日志信息\nwarning: 代码的运行结果可能和预期结果发生偏差时输出的日志信息\nerror: 代码出现异常时输出的日志信息\ncritical: 一般我们遇不到,遇到了解决不了的问题 例如: 磁盘或者内存空间已满等.\n\"\"\"\nlogger.debug('这是一个debug级别的日志信息')\nlogger.info('这是一个info级别的日志信息')\nlogger.warning('这是一个warning级别的日志信息')\nlogger.error('这是一个error级别的日志信息')\nlogger.critical('这是一个critical级别的日志信息')\n",[17,75558,75559,75563,75568,75572,75577,75582,75587,75592,75596,75601,75606,75611,75615,75620,75625,75629,75634,75639,75644,75649,75654,75659,75664,75668,75673,75678,75683,75688,75692,75697,75701,75706,75711,75716,75721,75726,75731,75735,75740,75745,75750,75755],{"__ignoreMap":119},[78,75560,75561],{"class":124,"line":125},[78,75562,46994],{},[78,75564,75565],{"class":124,"line":132},[78,75566,75567],{},"logging模块: 主要是为了记录程序运行期间产生的日志信息\n",[78,75569,75570],{"class":124,"line":138},[78,75571,129],{"emptyLinePlaceholder":128},[78,75573,75574],{"class":124,"line":144},[78,75575,75576],{},"日志器对象的创建和配置\n",[78,75578,75579],{"class":124,"line":150},[78,75580,75581],{},"1. 日志器对象的创建\n",[78,75583,75584],{"class":124,"line":156},[78,75585,75586],{},"2. 日志处理器的创建\n",[78,75588,75589],{"class":124,"line":162},[78,75590,75591],{},"3. 将日志处理器绑定到日志器对象上\n",[78,75593,75594],{"class":124,"line":168},[78,75595,129],{"emptyLinePlaceholder":128},[78,75597,75598],{"class":124,"line":174},[78,75599,75600],{},"日志的输出\n",[78,75602,75603],{"class":124,"line":180},[78,75604,75605],{},"1. 设置日志输出级别\n",[78,75607,75608],{"class":124,"line":186},[78,75609,75610],{},"2. 输出不同级别的日志信息\n",[78,75612,75613],{"class":124,"line":192},[78,75614,46994],{},[78,75616,75617],{"class":124,"line":198},[78,75618,75619],{},"# 0.导入模块\n",[78,75621,75622],{"class":124,"line":204},[78,75623,75624],{},"import logging\n",[78,75626,75627],{"class":124,"line":210},[78,75628,129],{"emptyLinePlaceholder":128},[78,75630,75631],{"class":124,"line":216},[78,75632,75633],{},"####################### 日志器对象的创建和配置  #####################\n",[78,75635,75636],{"class":124,"line":222},[78,75637,75638],{},"# 1. 日志器对象的创建\n",[78,75640,75641],{"class":124,"line":421},[78,75642,75643],{},"logger = logging.getLogger()\n",[78,75645,75646],{"class":124,"line":427},[78,75647,75648],{},"# 2. 日志处理器的创建\n",[78,75650,75651],{"class":124,"line":433},[78,75652,75653],{},"stream_handler = logging.StreamHandler()\n",[78,75655,75656],{"class":124,"line":2443},[78,75657,75658],{},"# 3. 将日志处理器绑定到日志器对象上\n",[78,75660,75661],{"class":124,"line":2448},[78,75662,75663],{},"logger.addHandler(stream_handler)\n",[78,75665,75666],{"class":124,"line":2454},[78,75667,129],{"emptyLinePlaceholder":128},[78,75669,75670],{"class":124,"line":2460},[78,75671,75672],{},"############################ 日志的输出  #######################\n",[78,75674,75675],{"class":124,"line":2465},[78,75676,75677],{},"# 1. 设置日志输出级别 (默认warning及warning级别以上的日志信息会被输出)\n",[78,75679,75680],{"class":124,"line":2470},[78,75681,75682],{},"# 忘记日志自己别的数据值,因为如果使用10 20 30 就会做不到见名知意,降低代码的可读性\n",[78,75684,75685],{"class":124,"line":2903},[78,75686,75687],{},"logger.setLevel(logging.INFO)\n",[78,75689,75690],{"class":124,"line":2909},[78,75691,129],{"emptyLinePlaceholder":128},[78,75693,75694],{"class":124,"line":11477},[78,75695,75696],{},"# 2. 输出不同级别的日志信息\n",[78,75698,75699],{"class":124,"line":13374},[78,75700,46994],{},[78,75702,75703],{"class":124,"line":13380},[78,75704,75705],{},"日志级别 5个:\n",[78,75707,75708],{"class":124,"line":13386},[78,75709,75710],{},"debug: 代码调试时输出的日志信息\n",[78,75712,75713],{"class":124,"line":13722},[78,75714,75715],{},"info: 代码正常运行过程中输出的日志信息\n",[78,75717,75718],{"class":124,"line":13727},[78,75719,75720],{},"warning: 代码的运行结果可能和预期结果发生偏差时输出的日志信息\n",[78,75722,75723],{"class":124,"line":13953},[78,75724,75725],{},"error: 代码出现异常时输出的日志信息\n",[78,75727,75728],{"class":124,"line":13958},[78,75729,75730],{},"critical: 一般我们遇不到,遇到了解决不了的问题 例如: 磁盘或者内存空间已满等.\n",[78,75732,75733],{"class":124,"line":13964},[78,75734,46994],{},[78,75736,75737],{"class":124,"line":13969},[78,75738,75739],{},"logger.debug('这是一个debug级别的日志信息')\n",[78,75741,75742],{"class":124,"line":24170},[78,75743,75744],{},"logger.info('这是一个info级别的日志信息')\n",[78,75746,75747],{"class":124,"line":24175},[78,75748,75749],{},"logger.warning('这是一个warning级别的日志信息')\n",[78,75751,75752],{"class":124,"line":24180},[78,75753,75754],{},"logger.error('这是一个error级别的日志信息')\n",[78,75756,75757],{"class":124,"line":24186},[78,75758,75759],{},"logger.critical('这是一个critical级别的日志信息')\n",[13,75761,75762],{},[22,75763,75764],{},"logging日志模块设置日志输出格式",[114,75766,75768],{"className":116,"code":75767,"language":118,"meta":119,"style":119},"\"\"\"\n日志器对象的创建和配置\n1. 日志器对象的创建\n2. 日志处理器的创建\n3. 将日志处理器绑定到日志器对象上\n4. 创建一个格式对象\n5. 将日志格式对象绑定到日志处理器上\n\n日志的输出\n1. 设置日志输出级别\n2. 输出不同级别的日志信息\n\"\"\"\n# 导包\nimport logging\n\n##################### 日志器对象的创建和配置 #####################\n# 1. 日志器对象的创建\nlogger = logging.getLogger()\n\n# 2. 日志处理器的创建\nstream_handler = logging.StreamHandler()\n\n# 3. 将日志处理器绑定到日志器对象上\nlogger.addHandler(stream_handler)\n\n# TODO: 4. 创建一个格式对象\nfmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]：%(message)s')\n\n# TODO: 5. 将日志格式对象绑定到日志处理器上\nstream_handler.setFormatter(fmt)\n\n########################## 日志的输出 ##########################\n# 1. 设置日志输出级别\nlogger.setLevel(logging.INFO)\n# 2. 输出不同级别的日志信息\nlogger.debug('这是一个debug级别的日志信息')\nlogger.info('这是一个info级别的日志信息')\nlogger.warning('这是一个warning级别的日志信息')\nlogger.error('这是一个error级别的日志信息')\nlogger.critical('这是一个critical级别的日志信息')\n",[17,75769,75770,75774,75778,75782,75786,75790,75795,75800,75804,75808,75812,75816,75820,75825,75829,75833,75838,75842,75846,75850,75854,75858,75862,75866,75870,75874,75879,75884,75888,75893,75898,75902,75907,75912,75916,75920,75924,75928,75932,75936],{"__ignoreMap":119},[78,75771,75772],{"class":124,"line":125},[78,75773,46994],{},[78,75775,75776],{"class":124,"line":132},[78,75777,75576],{},[78,75779,75780],{"class":124,"line":138},[78,75781,75581],{},[78,75783,75784],{"class":124,"line":144},[78,75785,75586],{},[78,75787,75788],{"class":124,"line":150},[78,75789,75591],{},[78,75791,75792],{"class":124,"line":156},[78,75793,75794],{},"4. 创建一个格式对象\n",[78,75796,75797],{"class":124,"line":162},[78,75798,75799],{},"5. 将日志格式对象绑定到日志处理器上\n",[78,75801,75802],{"class":124,"line":168},[78,75803,129],{"emptyLinePlaceholder":128},[78,75805,75806],{"class":124,"line":174},[78,75807,75600],{},[78,75809,75810],{"class":124,"line":180},[78,75811,75605],{},[78,75813,75814],{"class":124,"line":186},[78,75815,75610],{},[78,75817,75818],{"class":124,"line":192},[78,75819,46994],{},[78,75821,75822],{"class":124,"line":198},[78,75823,75824],{},"# 导包\n",[78,75826,75827],{"class":124,"line":204},[78,75828,75624],{},[78,75830,75831],{"class":124,"line":210},[78,75832,129],{"emptyLinePlaceholder":128},[78,75834,75835],{"class":124,"line":216},[78,75836,75837],{},"##################### 日志器对象的创建和配置 #####################\n",[78,75839,75840],{"class":124,"line":222},[78,75841,75638],{},[78,75843,75844],{"class":124,"line":421},[78,75845,75643],{},[78,75847,75848],{"class":124,"line":427},[78,75849,129],{"emptyLinePlaceholder":128},[78,75851,75852],{"class":124,"line":433},[78,75853,75648],{},[78,75855,75856],{"class":124,"line":2443},[78,75857,75653],{},[78,75859,75860],{"class":124,"line":2448},[78,75861,129],{"emptyLinePlaceholder":128},[78,75863,75864],{"class":124,"line":2454},[78,75865,75658],{},[78,75867,75868],{"class":124,"line":2460},[78,75869,75663],{},[78,75871,75872],{"class":124,"line":2465},[78,75873,129],{"emptyLinePlaceholder":128},[78,75875,75876],{"class":124,"line":2470},[78,75877,75878],{},"# TODO: 4. 创建一个格式对象\n",[78,75880,75881],{"class":124,"line":2903},[78,75882,75883],{},"fmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]：%(message)s')\n",[78,75885,75886],{"class":124,"line":2909},[78,75887,129],{"emptyLinePlaceholder":128},[78,75889,75890],{"class":124,"line":11477},[78,75891,75892],{},"# TODO: 5. 将日志格式对象绑定到日志处理器上\n",[78,75894,75895],{"class":124,"line":13374},[78,75896,75897],{},"stream_handler.setFormatter(fmt)\n",[78,75899,75900],{"class":124,"line":13380},[78,75901,129],{"emptyLinePlaceholder":128},[78,75903,75904],{"class":124,"line":13386},[78,75905,75906],{},"########################## 日志的输出 ##########################\n",[78,75908,75909],{"class":124,"line":13722},[78,75910,75911],{},"# 1. 设置日志输出级别\n",[78,75913,75914],{"class":124,"line":13727},[78,75915,75687],{},[78,75917,75918],{"class":124,"line":13953},[78,75919,75696],{},[78,75921,75922],{"class":124,"line":13958},[78,75923,75739],{},[78,75925,75926],{"class":124,"line":13964},[78,75927,75744],{},[78,75929,75930],{"class":124,"line":13969},[78,75931,75749],{},[78,75933,75934],{"class":124,"line":24170},[78,75935,75754],{},[78,75937,75938],{"class":124,"line":24175},[78,75939,75759],{},[13,75941,75942],{},[22,75943,75944],{},"logging模块将日志输出到文件中",[72,75946,75947,75950,75953],{},[13,75948,75949],{},"==本质就是更换日志处理器类型==",[13,75951,75952],{},"StreamHandler: 将日志信息输出到终端上",[13,75954,75955],{},"FileHandler: 将日志信息输出到文件中",[114,75957,75959],{"className":116,"code":75958,"language":118,"meta":119,"style":119},"\"\"\"\n日志器对象的创建和配置\n1. 日志器对象的创建\n2. 创建换一个文件类型的日志处理器\n3. 将日志处理器绑定到日志器对象上\n4. 创建一个格式对象\n5. 将日志格式对象绑定到日志处理器上\n\n日志的输出\n1. 设置日志输出级别\n2. 输出不同级别的日志信息\n\n\n常用的日志处理器有两种\nStreamHandler: 流式日志处理器,将日志信息输出到终端中\nFileHandler: 文件日志处理器,将日志信息输出到文件中\n\"\"\"\n# 导入logging模块\nimport logging\n\n#################### 日志器对象的创建和配置 ####################\n# 1. 日志器对象的创建\nlogger = logging.getLogger()\n\n# TODO: 2. 创建换一个文件类型的日志处理器\n# 注意: filename要传入一个log文件的路径,可以使用绝对路径也可以使用相对路径,但是文件目录一定要存在,文件可以不存在\n# 举例: ..\u002Flogs\u002Ftest.log 路径中 logs目录必须存在, test.log可以不存在\nfile_handler = logging.FileHandler(\n    filename='..\u002Flogs\u002Ftest.log',\n    mode='a',\n    encoding='utf8'\n)\n# 3. 将日志处理器绑定到日志器对象上\nlogger.addHandler(file_handler)\n# 4. 创建一个格式对象\nfmt = logging.Formatter('%(asctime)s - [%(levelname)s] - %(filename)s[%(lineno)d]：%(message)s')\n# 5. 将日志格式对象绑定到日志处理器上\nfile_handler.setFormatter(fmt)\n\n\n######################### 日志的输出 #######################\n# 1. 设置日志输出级别\nlogger.setLevel(logging.INFO)\n# 2. 输出不同级别的日志信息\nlogger.debug('这是一个debug级别的日志信息')\nlogger.info('这是一个info级别的日志信息')\nlogger.warning('这是一个warning级别的日志信息')\nlogger.error('这是一个error级别的日志信息')\nlogger.critical('这是一个critical级别的日志信息')\n",[17,75960,75961,75965,75969,75973,75978,75982,75986,75990,75994,75998,76002,76006,76010,76014,76019,76024,76029,76033,76038,76042,76046,76051,76055,76059,76063,76068,76073,76078,76083,76088,76093,76098,76102,76106,76111,76116,76120,76125,76130,76134,76138,76143,76147,76151,76155,76159,76163,76167,76171],{"__ignoreMap":119},[78,75962,75963],{"class":124,"line":125},[78,75964,46994],{},[78,75966,75967],{"class":124,"line":132},[78,75968,75576],{},[78,75970,75971],{"class":124,"line":138},[78,75972,75581],{},[78,75974,75975],{"class":124,"line":144},[78,75976,75977],{},"2. 创建换一个文件类型的日志处理器\n",[78,75979,75980],{"class":124,"line":150},[78,75981,75591],{},[78,75983,75984],{"class":124,"line":156},[78,75985,75794],{},[78,75987,75988],{"class":124,"line":162},[78,75989,75799],{},[78,75991,75992],{"class":124,"line":168},[78,75993,129],{"emptyLinePlaceholder":128},[78,75995,75996],{"class":124,"line":174},[78,75997,75600],{},[78,75999,76000],{"class":124,"line":180},[78,76001,75605],{},[78,76003,76004],{"class":124,"line":186},[78,76005,75610],{},[78,76007,76008],{"class":124,"line":192},[78,76009,129],{"emptyLinePlaceholder":128},[78,76011,76012],{"class":124,"line":198},[78,76013,129],{"emptyLinePlaceholder":128},[78,76015,76016],{"class":124,"line":204},[78,76017,76018],{},"常用的日志处理器有两种\n",[78,76020,76021],{"class":124,"line":210},[78,76022,76023],{},"StreamHandler: 流式日志处理器,将日志信息输出到终端中\n",[78,76025,76026],{"class":124,"line":216},[78,76027,76028],{},"FileHandler: 文件日志处理器,将日志信息输出到文件中\n",[78,76030,76031],{"class":124,"line":222},[78,76032,46994],{},[78,76034,76035],{"class":124,"line":421},[78,76036,76037],{},"# 导入logging模块\n",[78,76039,76040],{"class":124,"line":427},[78,76041,75624],{},[78,76043,76044],{"class":124,"line":433},[78,76045,129],{"emptyLinePlaceholder":128},[78,76047,76048],{"class":124,"line":2443},[78,76049,76050],{},"#################### 日志器对象的创建和配置 ####################\n",[78,76052,76053],{"class":124,"line":2448},[78,76054,75638],{},[78,76056,76057],{"class":124,"line":2454},[78,76058,75643],{},[78,76060,76061],{"class":124,"line":2460},[78,76062,129],{"emptyLinePlaceholder":128},[78,76064,76065],{"class":124,"line":2465},[78,76066,76067],{},"# TODO: 2. 创建换一个文件类型的日志处理器\n",[78,76069,76070],{"class":124,"line":2470},[78,76071,76072],{},"# 注意: filename要传入一个log文件的路径,可以使用绝对路径也可以使用相对路径,但是文件目录一定要存在,文件可以不存在\n",[78,76074,76075],{"class":124,"line":2903},[78,76076,76077],{},"# 举例: ..\u002Flogs\u002Ftest.log 路径中 logs目录必须存在, test.log可以不存在\n",[78,76079,76080],{"class":124,"line":2909},[78,76081,76082],{},"file_handler = logging.FileHandler(\n",[78,76084,76085],{"class":124,"line":11477},[78,76086,76087],{},"    filename='..\u002Flogs\u002Ftest.log',\n",[78,76089,76090],{"class":124,"line":13374},[78,76091,76092],{},"    mode='a',\n",[78,76094,76095],{"class":124,"line":13380},[78,76096,76097],{},"    encoding='utf8'\n",[78,76099,76100],{"class":124,"line":13386},[78,76101,8041],{},[78,76103,76104],{"class":124,"line":13722},[78,76105,75658],{},[78,76107,76108],{"class":124,"line":13727},[78,76109,76110],{},"logger.addHandler(file_handler)\n",[78,76112,76113],{"class":124,"line":13953},[78,76114,76115],{},"# 4. 创建一个格式对象\n",[78,76117,76118],{"class":124,"line":13958},[78,76119,75883],{},[78,76121,76122],{"class":124,"line":13964},[78,76123,76124],{},"# 5. 将日志格式对象绑定到日志处理器上\n",[78,76126,76127],{"class":124,"line":13969},[78,76128,76129],{},"file_handler.setFormatter(fmt)\n",[78,76131,76132],{"class":124,"line":24170},[78,76133,129],{"emptyLinePlaceholder":128},[78,76135,76136],{"class":124,"line":24175},[78,76137,129],{"emptyLinePlaceholder":128},[78,76139,76140],{"class":124,"line":24180},[78,76141,76142],{},"######################### 日志的输出 #######################\n",[78,76144,76145],{"class":124,"line":24186},[78,76146,75911],{},[78,76148,76149],{"class":124,"line":24192},[78,76150,75687],{},[78,76152,76153],{"class":124,"line":24198},[78,76154,75696],{},[78,76156,76157],{"class":124,"line":24204},[78,76158,75739],{},[78,76160,76161],{"class":124,"line":24210},[78,76162,75744],{},[78,76164,76165],{"class":124,"line":24215},[78,76166,75749],{},[78,76168,76169],{"class":124,"line":24220},[78,76170,75754],{},[78,76172,76173],{"class":124,"line":24226},[78,76174,75759],{},[39316,76176,76178],{"id":76177},"_62-time模块理解","6.2 time模块(理解)",[13,76180,76181],{},"==理解大于记忆==",[72,76183,76184,76189],{},[13,76185,76186],{},[22,76187,76188],{},"time模块的基本使用：",[49,76190,76191,76194,76197,76200,76203,76206,76209,76212],{},[52,76192,76193],{},"time.sleep(数字)：程序休眠几秒钟",[52,76195,76196],{},"time.time()：获取当前时间的时间戳（以秒为单位）",[52,76198,76199],{},"time.time_ns()：获取当前时间的时间戳（以纳秒为单位）",[52,76201,76202],{},"time.localtime()：获取当前的本地时间，结果是一个 struct_time 类的对象",[52,76204,76205],{},"time.localtime(时间戳-秒)：返回时间戳对应的本地时间，结果是一个 struct_time 类的对象",[52,76207,76208],{},"time.mktime(struct_time对象)：返回时间对应的时间戳（秒为单位）",[52,76210,76211],{},"time.strftime(格式化字符串, 日期)：将日期数据（struct_time对象）格式化一个字符串",[52,76213,76214],{},"time.strptime(日期字符串，格式化字符串)：将日期字符串转换为一个日期数据（struct_time对象）",[114,76216,76218],{"className":44613,"code":76217,"language":44615,"meta":119,"style":119},"%Y：4位数字的年份\n%m：2位数字的月份\n%d：2位数字的日期\n%H：24小时制的小时\n%M：2位数字的分钟\n%S：2位数字的秒\n",[17,76219,76220,76225,76230,76235,76240,76245],{"__ignoreMap":119},[78,76221,76222],{"class":124,"line":125},[78,76223,76224],{},"%Y：4位数字的年份\n",[78,76226,76227],{"class":124,"line":132},[78,76228,76229],{},"%m：2位数字的月份\n",[78,76231,76232],{"class":124,"line":138},[78,76233,76234],{},"%d：2位数字的日期\n",[78,76236,76237],{"class":124,"line":144},[78,76238,76239],{},"%H：24小时制的小时\n",[78,76241,76242],{"class":124,"line":150},[78,76243,76244],{},"%M：2位数字的分钟\n",[78,76246,76247],{"class":124,"line":156},[78,76248,76249],{},"%S：2位数字的秒\n",[114,76251,76253],{"className":116,"code":76252,"language":118,"meta":119,"style":119},"\"\"\"\n**time模块的基本使用：**\n\n- time.sleep(数字)：程序休眠几秒钟\n- time.time()：获取当前时间的时间戳（以秒为单位）\n- time.time_ns()：获取当前时间的时间戳（以纳秒为单位）\n- time.localtime()：获取当前的本地时间，结果是一个 struct_time 类的对象\n- time.localtime(时间戳-秒)：返回时间戳对应的本地时间，结果是一个 struct_time 类的对象\n- time.mktime(struct_time对象)：返回时间对应的时间戳（秒为单位）\n- time.strftime(格式化字符串, 日期)：将日期数据（struct_time对象）格式化一个字符串\n- time.strptime(日期字符串，格式化字符串)：将日期字符串转换为一个日期数据（struct_time对象）\n\"\"\"\n# 导入模块\nimport time\n\n# time.sleep(数字)：程序休眠几秒钟\nprint('hello')\ntime.sleep(1)\nprint('world')\n\n# time.time()：获取当前时间的时间戳（以秒为单位）\ndate_float1 = time.time()\nprint(date_float1) # 1672285269.896592\n\n# time.time_ns()：获取当前时间的时间戳（以纳秒为单位）\ndate_float2 = time.time_ns()\nprint(date_float2) # 1672285402027404100\n\n# time.localtime()：获取当前的本地时间，结果是一个 struct_time 类的对象\n# time.struct_time(tm_year=2022, tm_mon=12, tm_mday=29, tm_hour=11, tm_min=44, tm_sec=52, tm_wday=3, tm_yday=363, tm_isdst=0)\ndate1 = time.localtime()\nprint(date1)\nprint(date1.tm_year)\nprint(date1.tm_mon)\n...\n\n# time.localtime(时间戳-秒)：返回时间戳对应的本地时间，结果是一个 struct_time 类的对象\n# 将一个数值型的时间戳,转换为struct_time时间类型\ndate2 = time.localtime(1672285269.896592)\nprint(date2)\n\n# time.mktime(struct_time对象)：返回时间对应的时间戳（秒为单位）\n# 将一个时间从struct_time时间类型转换为数值型的时间戳\ndate_float3 = time.mktime(date2)\nprint(date_float3) # 这种方式的转换有时间损失,以秒为单位进行了四舍五入\n\n# time.strftime(格式化字符串, 日期)：将日期数据（struct_time对象）格式化一个字符串\n# 将时间类型的数据按照一定的格式转换为字符串类型的数据\n\"\"\"\n%Y：4位数字的年份\n%m：2位数字的月份\n%d：2位数字的日期\n%H：24小时制的小时\n%M：2位数字的分钟\n%S：2位数字的秒\n\"\"\"\ndate_str1 = time.strftime('%Y年%m月%d日 %H时%M分%S秒', date2)\nprint(date_str1)\n\n# time.strptime(日期字符串，格式化字符串)：将日期字符串转换为一个日期数据（struct_time对象）\n# 将字符串类型的时间数据,转换为struct_time类型数据\n# 重点: 时间字符串和时间格式要完全统一,否则无法正常转换\ndate3 = time.strptime('2022年11月11日 08时02分24秒', '%Y年%m月%d日 %H时%M分%S秒')\nprint(date3)\n",[17,76254,76255,76259,76264,76268,76273,76278,76283,76288,76293,76298,76303,76308,76312,76317,76322,76326,76331,76336,76341,76346,76350,76355,76360,76365,76369,76374,76379,76384,76388,76393,76398,76403,76408,76413,76418,76422,76426,76431,76436,76441,76446,76450,76455,76460,76465,76470,76474,76479,76484,76488,76492,76496,76500,76504,76508,76512,76516,76521,76526,76530,76535,76540,76545,76550],{"__ignoreMap":119},[78,76256,76257],{"class":124,"line":125},[78,76258,46994],{},[78,76260,76261],{"class":124,"line":132},[78,76262,76263],{},"**time模块的基本使用：**\n",[78,76265,76266],{"class":124,"line":138},[78,76267,129],{"emptyLinePlaceholder":128},[78,76269,76270],{"class":124,"line":144},[78,76271,76272],{},"- time.sleep(数字)：程序休眠几秒钟\n",[78,76274,76275],{"class":124,"line":150},[78,76276,76277],{},"- time.time()：获取当前时间的时间戳（以秒为单位）\n",[78,76279,76280],{"class":124,"line":156},[78,76281,76282],{},"- time.time_ns()：获取当前时间的时间戳（以纳秒为单位）\n",[78,76284,76285],{"class":124,"line":162},[78,76286,76287],{},"- time.localtime()：获取当前的本地时间，结果是一个 struct_time 类的对象\n",[78,76289,76290],{"class":124,"line":168},[78,76291,76292],{},"- time.localtime(时间戳-秒)：返回时间戳对应的本地时间，结果是一个 struct_time 类的对象\n",[78,76294,76295],{"class":124,"line":174},[78,76296,76297],{},"- time.mktime(struct_time对象)：返回时间对应的时间戳（秒为单位）\n",[78,76299,76300],{"class":124,"line":180},[78,76301,76302],{},"- time.strftime(格式化字符串, 日期)：将日期数据（struct_time对象）格式化一个字符串\n",[78,76304,76305],{"class":124,"line":186},[78,76306,76307],{},"- time.strptime(日期字符串，格式化字符串)：将日期字符串转换为一个日期数据（struct_time对象）\n",[78,76309,76310],{"class":124,"line":192},[78,76311,46994],{},[78,76313,76314],{"class":124,"line":198},[78,76315,76316],{},"# 导入模块\n",[78,76318,76319],{"class":124,"line":204},[78,76320,76321],{},"import time\n",[78,76323,76324],{"class":124,"line":210},[78,76325,129],{"emptyLinePlaceholder":128},[78,76327,76328],{"class":124,"line":216},[78,76329,76330],{},"# time.sleep(数字)：程序休眠几秒钟\n",[78,76332,76333],{"class":124,"line":222},[78,76334,76335],{},"print('hello')\n",[78,76337,76338],{"class":124,"line":421},[78,76339,76340],{},"time.sleep(1)\n",[78,76342,76343],{"class":124,"line":427},[78,76344,76345],{},"print('world')\n",[78,76347,76348],{"class":124,"line":433},[78,76349,129],{"emptyLinePlaceholder":128},[78,76351,76352],{"class":124,"line":2443},[78,76353,76354],{},"# time.time()：获取当前时间的时间戳（以秒为单位）\n",[78,76356,76357],{"class":124,"line":2448},[78,76358,76359],{},"date_float1 = time.time()\n",[78,76361,76362],{"class":124,"line":2454},[78,76363,76364],{},"print(date_float1) # 1672285269.896592\n",[78,76366,76367],{"class":124,"line":2460},[78,76368,129],{"emptyLinePlaceholder":128},[78,76370,76371],{"class":124,"line":2465},[78,76372,76373],{},"# time.time_ns()：获取当前时间的时间戳（以纳秒为单位）\n",[78,76375,76376],{"class":124,"line":2470},[78,76377,76378],{},"date_float2 = time.time_ns()\n",[78,76380,76381],{"class":124,"line":2903},[78,76382,76383],{},"print(date_float2) # 1672285402027404100\n",[78,76385,76386],{"class":124,"line":2909},[78,76387,129],{"emptyLinePlaceholder":128},[78,76389,76390],{"class":124,"line":11477},[78,76391,76392],{},"# time.localtime()：获取当前的本地时间，结果是一个 struct_time 类的对象\n",[78,76394,76395],{"class":124,"line":13374},[78,76396,76397],{},"# time.struct_time(tm_year=2022, tm_mon=12, tm_mday=29, tm_hour=11, tm_min=44, tm_sec=52, tm_wday=3, tm_yday=363, tm_isdst=0)\n",[78,76399,76400],{"class":124,"line":13380},[78,76401,76402],{},"date1 = time.localtime()\n",[78,76404,76405],{"class":124,"line":13386},[78,76406,76407],{},"print(date1)\n",[78,76409,76410],{"class":124,"line":13722},[78,76411,76412],{},"print(date1.tm_year)\n",[78,76414,76415],{"class":124,"line":13727},[78,76416,76417],{},"print(date1.tm_mon)\n",[78,76419,76420],{"class":124,"line":13953},[78,76421,74213],{},[78,76423,76424],{"class":124,"line":13958},[78,76425,129],{"emptyLinePlaceholder":128},[78,76427,76428],{"class":124,"line":13964},[78,76429,76430],{},"# time.localtime(时间戳-秒)：返回时间戳对应的本地时间，结果是一个 struct_time 类的对象\n",[78,76432,76433],{"class":124,"line":13969},[78,76434,76435],{},"# 将一个数值型的时间戳,转换为struct_time时间类型\n",[78,76437,76438],{"class":124,"line":24170},[78,76439,76440],{},"date2 = time.localtime(1672285269.896592)\n",[78,76442,76443],{"class":124,"line":24175},[78,76444,76445],{},"print(date2)\n",[78,76447,76448],{"class":124,"line":24180},[78,76449,129],{"emptyLinePlaceholder":128},[78,76451,76452],{"class":124,"line":24186},[78,76453,76454],{},"# time.mktime(struct_time对象)：返回时间对应的时间戳（秒为单位）\n",[78,76456,76457],{"class":124,"line":24192},[78,76458,76459],{},"# 将一个时间从struct_time时间类型转换为数值型的时间戳\n",[78,76461,76462],{"class":124,"line":24198},[78,76463,76464],{},"date_float3 = time.mktime(date2)\n",[78,76466,76467],{"class":124,"line":24204},[78,76468,76469],{},"print(date_float3) # 这种方式的转换有时间损失,以秒为单位进行了四舍五入\n",[78,76471,76472],{"class":124,"line":24210},[78,76473,129],{"emptyLinePlaceholder":128},[78,76475,76476],{"class":124,"line":24215},[78,76477,76478],{},"# time.strftime(格式化字符串, 日期)：将日期数据（struct_time对象）格式化一个字符串\n",[78,76480,76481],{"class":124,"line":24220},[78,76482,76483],{},"# 将时间类型的数据按照一定的格式转换为字符串类型的数据\n",[78,76485,76486],{"class":124,"line":24226},[78,76487,46994],{},[78,76489,76490],{"class":124,"line":24232},[78,76491,76224],{},[78,76493,76494],{"class":124,"line":24238},[78,76495,76229],{},[78,76497,76498],{"class":124,"line":24244},[78,76499,76234],{},[78,76501,76502],{"class":124,"line":24250},[78,76503,76239],{},[78,76505,76506],{"class":124,"line":24256},[78,76507,76244],{},[78,76509,76510],{"class":124,"line":24262},[78,76511,76249],{},[78,76513,76514],{"class":124,"line":24267},[78,76515,46994],{},[78,76517,76518],{"class":124,"line":24273},[78,76519,76520],{},"date_str1 = time.strftime('%Y年%m月%d日 %H时%M分%S秒', date2)\n",[78,76522,76523],{"class":124,"line":24279},[78,76524,76525],{},"print(date_str1)\n",[78,76527,76528],{"class":124,"line":24284},[78,76529,129],{"emptyLinePlaceholder":128},[78,76531,76532],{"class":124,"line":24290},[78,76533,76534],{},"# time.strptime(日期字符串，格式化字符串)：将日期字符串转换为一个日期数据（struct_time对象）\n",[78,76536,76537],{"class":124,"line":24296},[78,76538,76539],{},"# 将字符串类型的时间数据,转换为struct_time类型数据\n",[78,76541,76542],{"class":124,"line":24302},[78,76543,76544],{},"# 重点: 时间字符串和时间格式要完全统一,否则无法正常转换\n",[78,76546,76547],{"class":124,"line":24308},[78,76548,76549],{},"date3 = time.strptime('2022年11月11日 08时02分24秒', '%Y年%m月%d日 %H时%M分%S秒')\n",[78,76551,76552],{"class":124,"line":24314},[78,76553,76554],{},"print(date3)\n",[39316,76556,76558],{"id":76557},"_63-unittest模块掌握","6.3 unittest模块(掌握)",[72,76560,76561,76566,76569,76574],{},[13,76562,76563],{},[22,76564,76565],{},"问题1:什么叫单元测试?",[13,76567,76568],{},"对于软件中最小的可测试单元进行检测或检查的方式就是单元测试",[13,76570,76571],{},[22,76572,76573],{},"问题2: 单元测试在企业开发中一般是谁来写??",[13,76575,76576],{},"如果企业中测试工程师能力极强,可以由他来写,但是通常由开发人员来写,测试人员点击运行查看结果即可.",[114,76578,76580],{"className":116,"code":76579,"language":118,"meta":119,"style":119},"from unittest import TestCase\n\nclass 自定义单元测试类(TestCase):\n    def setUp(self) -> None:\n        \"\"\"该方法会在每个单元测试方法执行之前自动执行一次，可以做一些单元测试前的初始工作\"\"\"\n        pass\n\n    # 注意：所有的单元测试方法名必须以 test 开头，否则不能被 unittest 识别\n    def test_单元测试方法1(self):\n        pass\n\n    def test_单元测试方法2(self):\n        pass\n\n    ...\n",[17,76581,76582,76587,76591,76596,76601,76606,76611,76615,76620,76625,76629,76633,76638,76642,76646],{"__ignoreMap":119},[78,76583,76584],{"class":124,"line":125},[78,76585,76586],{},"from unittest import TestCase\n",[78,76588,76589],{"class":124,"line":132},[78,76590,129],{"emptyLinePlaceholder":128},[78,76592,76593],{"class":124,"line":138},[78,76594,76595],{},"class 自定义单元测试类(TestCase):\n",[78,76597,76598],{"class":124,"line":144},[78,76599,76600],{},"    def setUp(self) -> None:\n",[78,76602,76603],{"class":124,"line":150},[78,76604,76605],{},"        \"\"\"该方法会在每个单元测试方法执行之前自动执行一次，可以做一些单元测试前的初始工作\"\"\"\n",[78,76607,76608],{"class":124,"line":156},[78,76609,76610],{},"        pass\n",[78,76612,76613],{"class":124,"line":162},[78,76614,129],{"emptyLinePlaceholder":128},[78,76616,76617],{"class":124,"line":168},[78,76618,76619],{},"    # 注意：所有的单元测试方法名必须以 test 开头，否则不能被 unittest 识别\n",[78,76621,76622],{"class":124,"line":174},[78,76623,76624],{},"    def test_单元测试方法1(self):\n",[78,76626,76627],{"class":124,"line":180},[78,76628,76610],{},[78,76630,76631],{"class":124,"line":186},[78,76632,129],{"emptyLinePlaceholder":128},[78,76634,76635],{"class":124,"line":192},[78,76636,76637],{},"    def test_单元测试方法2(self):\n",[78,76639,76640],{"class":124,"line":198},[78,76641,76610],{},[78,76643,76644],{"class":124,"line":204},[78,76645,129],{"emptyLinePlaceholder":128},[78,76647,76648],{"class":124,"line":210},[78,76649,8941],{},[13,76651,76652],{},[22,76653,76654],{},"运行单元测试代码,出现如下情况的原因是你的文件名称不符合标识符的命名规则",[13,76656,76657],{},[617,76658],{"alt":76659,"src":76660},"1672287171197","..\u002F..\u002FETL\u002FDAY1\u002F02_%E7%AC%94%E8%AE%B0\u002Fday01-%E7%9F%A5%E8%AF%86%E5%A4%8D%E4%B9%A0.assets\u002F1672287171197.png",[13,76662,76663],{},[22,76664,76665],{},"unittest模块的使用",[114,76667,76669],{"className":116,"code":76668,"language":118,"meta":119,"style":119},"\"\"\"\nunittest模块主要是用于做单元测试\n\n1. 创建一个测试类\n2. 书写setup方法 在测试方法执行前执行\n3. 书写tearDown方法,在测试方法执行后执行\n4. 书写测试方法\n\"\"\"\n# 导入unittest模块\nfrom unittest import TestCase\n\nclass TestDemo(TestCase):\n\n    def setUp(self) -> None:\n        \"\"\"在测试方法执行前执行\"\"\"\n        print('setUp方法被执行...')\n\n    def tearDown(self) -> None:\n        \"\"\"在测试方法执行后执行\"\"\"\n        print('tearDown方法被执行...')\n\n    # 所有的测试方法,必须以test开头,否则无法进行单元测试\n    def test_func1(self):\n        print('测试方法1被执行....')\n\n    def test_func2(self):\n        print('测试方法2被执行....')\n",[17,76670,76671,76675,76680,76684,76689,76694,76699,76704,76708,76713,76717,76721,76726,76730,76734,76739,76744,76748,76753,76758,76763,76767,76772,76777,76782,76786,76791],{"__ignoreMap":119},[78,76672,76673],{"class":124,"line":125},[78,76674,46994],{},[78,76676,76677],{"class":124,"line":132},[78,76678,76679],{},"unittest模块主要是用于做单元测试\n",[78,76681,76682],{"class":124,"line":138},[78,76683,129],{"emptyLinePlaceholder":128},[78,76685,76686],{"class":124,"line":144},[78,76687,76688],{},"1. 创建一个测试类\n",[78,76690,76691],{"class":124,"line":150},[78,76692,76693],{},"2. 书写setup方法 在测试方法执行前执行\n",[78,76695,76696],{"class":124,"line":156},[78,76697,76698],{},"3. 书写tearDown方法,在测试方法执行后执行\n",[78,76700,76701],{"class":124,"line":162},[78,76702,76703],{},"4. 书写测试方法\n",[78,76705,76706],{"class":124,"line":168},[78,76707,46994],{},[78,76709,76710],{"class":124,"line":174},[78,76711,76712],{},"# 导入unittest模块\n",[78,76714,76715],{"class":124,"line":180},[78,76716,76586],{},[78,76718,76719],{"class":124,"line":186},[78,76720,129],{"emptyLinePlaceholder":128},[78,76722,76723],{"class":124,"line":192},[78,76724,76725],{},"class TestDemo(TestCase):\n",[78,76727,76728],{"class":124,"line":198},[78,76729,129],{"emptyLinePlaceholder":128},[78,76731,76732],{"class":124,"line":204},[78,76733,76600],{},[78,76735,76736],{"class":124,"line":210},[78,76737,76738],{},"        \"\"\"在测试方法执行前执行\"\"\"\n",[78,76740,76741],{"class":124,"line":216},[78,76742,76743],{},"        print('setUp方法被执行...')\n",[78,76745,76746],{"class":124,"line":222},[78,76747,129],{"emptyLinePlaceholder":128},[78,76749,76750],{"class":124,"line":421},[78,76751,76752],{},"    def tearDown(self) -> None:\n",[78,76754,76755],{"class":124,"line":427},[78,76756,76757],{},"        \"\"\"在测试方法执行后执行\"\"\"\n",[78,76759,76760],{"class":124,"line":433},[78,76761,76762],{},"        print('tearDown方法被执行...')\n",[78,76764,76765],{"class":124,"line":2443},[78,76766,129],{"emptyLinePlaceholder":128},[78,76768,76769],{"class":124,"line":2448},[78,76770,76771],{},"    # 所有的测试方法,必须以test开头,否则无法进行单元测试\n",[78,76773,76774],{"class":124,"line":2454},[78,76775,76776],{},"    def test_func1(self):\n",[78,76778,76779],{"class":124,"line":2460},[78,76780,76781],{},"        print('测试方法1被执行....')\n",[78,76783,76784],{"class":124,"line":2465},[78,76785,129],{"emptyLinePlaceholder":128},[78,76787,76788],{"class":124,"line":2470},[78,76789,76790],{},"    def test_func2(self):\n",[78,76792,76793],{"class":124,"line":2903},[78,76794,76795],{},"        print('测试方法2被执行....')\n",[72,76797,76798,76801],{},[13,76799,76800],{},"注意事项:",[2285,76802,76803,76806,76809,76812],{},[52,76804,76805],{},"测试文件名称要遵守标识符的命名规则,无论是否被调用",[52,76807,76808],{},"测试类,必须继承自TestCase",[52,76810,76811],{},"测试方法必须方法名以test_开头,否则无法识别",[52,76813,76814],{},"-> None提示该方法没有返回值,但是是一个软性限制**(如果不遵循则报警告不会崩溃**)",[39316,76816,76818,76819,4604],{"id":76817},"_64-os模块重要","6.4 OS模块(",[22,76820,76821],{},"重要",[72,76823,76824,76829,76837,76842],{},[13,76825,76826],{},[22,76827,76828],{},"os模块的使用：",[49,76830,76831,76834],{},[52,76832,76833],{},"os.getcwd()：获取当前程序的运行工作路径",[52,76835,76836],{},"os.listdir(目录)：获取指定目录下的内容，返回一个list",[13,76838,76839],{},[22,76840,76841],{},"os.path模块的使用：",[49,76843,76844,76847,76850,76853,76856,76859],{},[52,76845,76846],{},"os.path.abspath(路径)：返回指定路径的绝对路径",[52,76848,76849],{},"os.path.dirname(路径)：返回指定路径的上一级路径",[52,76851,76852],{},"os.path.basename(路径)：返回指定路径的最后一部分",[52,76854,76855],{},"os.path.join(路径1, 路径2)：将两个路径进行拼接",[52,76857,76858],{},"os.path.isfile(路径)：判断指定路径是不是一个文件，是返回True，否则返回False",[52,76860,76861],{},"os.path.isdir(路径)：判断指定路径是不是一个文件夹，是返回True，否则返回False",[114,76863,76865],{"className":116,"code":76864,"language":118,"meta":119,"style":119},"\"\"\"\nos模块的使用：\n- os.getcwd()：获取当前程序的运行工作路径\n- os.listdir(目录)：获取指定目录下的内容，返回一个list\n\nos.path模块的使用：\n\n- os.path.abspath(路径)：返回指定路径的绝对路径\n- os.path.dirname(路径)：返回指定路径的上一级路径\n- os.path.basename(路径)：返回指定路径的最后一部分\n- os.path.join(路径1, 路径2)：将两个路径进行拼接\n- os.path.isfile(路径)：判断指定路径是不是一个文件，是返回True，否则返回False\n- os.path.isdir(路径)：判断指定路径是不是一个文件夹，是返回True，否则返回False\n\"\"\"\n# __file__ 系统内置变量,用来表示当前文件所在位置的绝对路径\nprint(__file__)\n\n# 导入os 模块\nimport os\n\n# os.getcwd()：获取当前程序的运行工作路径 : 当前文件所在的目录的绝对路径\nprint(os.getcwd())\n\n# os.listdir(目录)：获取指定目录下的内容，返回一个list\n# 如果括号内什么也不写,获取的就是当前文件所在目录中所有文件的名称\nprint(os.listdir())\n# 如果在括号内填写目录的路径,则获取的就是指定目录中的文件名称列表\n# 注意我们使用的目录层级符号,如果是\\要注意转译或者改为\u002F\nprint(os.listdir('C:\\\\Users\\\\admin\\\\Desktop\\\\深圳36期-ETL阶段'))\nprint(os.listdir('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段'))\n\n# os.path.abspath(路径)：返回指定路径的绝对路径\nprint(os.path.abspath('..\u002F'))\n\n# os.path.dirname(路径)：返回指定路径的上一级路径\n# 返回当前路径文件所在目录的路径\nprint(os.path.dirname(__file__))\n# print(os.path.dirname('..\u002F')) # 如果给他的是相对路径,那么他返回的也是相对路径,一般获取dirname不适用相对路径\nprint(os.path.dirname(os.path.abspath('..\u002F'))) # 使用的时候转换为绝对路径\n\n# os.path.basename(路径)：返回指定路径的最后一部分\n# 返回当前路径的文件名称\nprint(os.path.basename(__file__))\n# print(os.path.basename('..\u002F')) # 在开发中basename也会使用绝对路径\nprint(os.path.basename('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段\u002Fpython_etl'))\n\n# os.path.join(路径1, 路径2)：将两个路径进行拼接\n# 一般为了防止出现拼接错误,我们会在路径1的末尾添加\u002F,在路径2的开头删除斜杠\nprint(os.path.join('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段\u002F', 'python_etl\u002Flearn(实际开发中不需要)'))\n\n# os.path.isfile(路径)：判断指定路径是不是一个文件，是返回True，否则返回False\nprint(os.path.isfile(__file__))\n# os.path.isdir(路径)：判断指定路径是不是一个文件夹，是返回True，否则返回False\nprint(os.path.isdir(__file__))\n\n",[17,76866,76867,76871,76876,76881,76886,76890,76895,76899,76904,76909,76914,76919,76924,76929,76933,76938,76943,76947,76952,76956,76960,76965,76970,76974,76979,76984,76989,76994,76999,77004,77009,77013,77018,77023,77027,77032,77037,77042,77047,77052,77056,77061,77066,77071,77076,77081,77085,77090,77095,77100,77104,77109,77114,77119],{"__ignoreMap":119},[78,76868,76869],{"class":124,"line":125},[78,76870,46994],{},[78,76872,76873],{"class":124,"line":132},[78,76874,76875],{},"os模块的使用：\n",[78,76877,76878],{"class":124,"line":138},[78,76879,76880],{},"- os.getcwd()：获取当前程序的运行工作路径\n",[78,76882,76883],{"class":124,"line":144},[78,76884,76885],{},"- os.listdir(目录)：获取指定目录下的内容，返回一个list\n",[78,76887,76888],{"class":124,"line":150},[78,76889,129],{"emptyLinePlaceholder":128},[78,76891,76892],{"class":124,"line":156},[78,76893,76894],{},"os.path模块的使用：\n",[78,76896,76897],{"class":124,"line":162},[78,76898,129],{"emptyLinePlaceholder":128},[78,76900,76901],{"class":124,"line":168},[78,76902,76903],{},"- os.path.abspath(路径)：返回指定路径的绝对路径\n",[78,76905,76906],{"class":124,"line":174},[78,76907,76908],{},"- os.path.dirname(路径)：返回指定路径的上一级路径\n",[78,76910,76911],{"class":124,"line":180},[78,76912,76913],{},"- os.path.basename(路径)：返回指定路径的最后一部分\n",[78,76915,76916],{"class":124,"line":186},[78,76917,76918],{},"- os.path.join(路径1, 路径2)：将两个路径进行拼接\n",[78,76920,76921],{"class":124,"line":192},[78,76922,76923],{},"- os.path.isfile(路径)：判断指定路径是不是一个文件，是返回True，否则返回False\n",[78,76925,76926],{"class":124,"line":198},[78,76927,76928],{},"- os.path.isdir(路径)：判断指定路径是不是一个文件夹，是返回True，否则返回False\n",[78,76930,76931],{"class":124,"line":204},[78,76932,46994],{},[78,76934,76935],{"class":124,"line":210},[78,76936,76937],{},"# __file__ 系统内置变量,用来表示当前文件所在位置的绝对路径\n",[78,76939,76940],{"class":124,"line":216},[78,76941,76942],{},"print(__file__)\n",[78,76944,76945],{"class":124,"line":222},[78,76946,129],{"emptyLinePlaceholder":128},[78,76948,76949],{"class":124,"line":421},[78,76950,76951],{},"# 导入os 模块\n",[78,76953,76954],{"class":124,"line":427},[78,76955,7771],{},[78,76957,76958],{"class":124,"line":433},[78,76959,129],{"emptyLinePlaceholder":128},[78,76961,76962],{"class":124,"line":2443},[78,76963,76964],{},"# os.getcwd()：获取当前程序的运行工作路径 : 当前文件所在的目录的绝对路径\n",[78,76966,76967],{"class":124,"line":2448},[78,76968,76969],{},"print(os.getcwd())\n",[78,76971,76972],{"class":124,"line":2454},[78,76973,129],{"emptyLinePlaceholder":128},[78,76975,76976],{"class":124,"line":2460},[78,76977,76978],{},"# os.listdir(目录)：获取指定目录下的内容，返回一个list\n",[78,76980,76981],{"class":124,"line":2465},[78,76982,76983],{},"# 如果括号内什么也不写,获取的就是当前文件所在目录中所有文件的名称\n",[78,76985,76986],{"class":124,"line":2470},[78,76987,76988],{},"print(os.listdir())\n",[78,76990,76991],{"class":124,"line":2903},[78,76992,76993],{},"# 如果在括号内填写目录的路径,则获取的就是指定目录中的文件名称列表\n",[78,76995,76996],{"class":124,"line":2909},[78,76997,76998],{},"# 注意我们使用的目录层级符号,如果是\\要注意转译或者改为\u002F\n",[78,77000,77001],{"class":124,"line":11477},[78,77002,77003],{},"print(os.listdir('C:\\\\Users\\\\admin\\\\Desktop\\\\深圳36期-ETL阶段'))\n",[78,77005,77006],{"class":124,"line":13374},[78,77007,77008],{},"print(os.listdir('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段'))\n",[78,77010,77011],{"class":124,"line":13380},[78,77012,129],{"emptyLinePlaceholder":128},[78,77014,77015],{"class":124,"line":13386},[78,77016,77017],{},"# os.path.abspath(路径)：返回指定路径的绝对路径\n",[78,77019,77020],{"class":124,"line":13722},[78,77021,77022],{},"print(os.path.abspath('..\u002F'))\n",[78,77024,77025],{"class":124,"line":13727},[78,77026,129],{"emptyLinePlaceholder":128},[78,77028,77029],{"class":124,"line":13953},[78,77030,77031],{},"# os.path.dirname(路径)：返回指定路径的上一级路径\n",[78,77033,77034],{"class":124,"line":13958},[78,77035,77036],{},"# 返回当前路径文件所在目录的路径\n",[78,77038,77039],{"class":124,"line":13964},[78,77040,77041],{},"print(os.path.dirname(__file__))\n",[78,77043,77044],{"class":124,"line":13969},[78,77045,77046],{},"# print(os.path.dirname('..\u002F')) # 如果给他的是相对路径,那么他返回的也是相对路径,一般获取dirname不适用相对路径\n",[78,77048,77049],{"class":124,"line":24170},[78,77050,77051],{},"print(os.path.dirname(os.path.abspath('..\u002F'))) # 使用的时候转换为绝对路径\n",[78,77053,77054],{"class":124,"line":24175},[78,77055,129],{"emptyLinePlaceholder":128},[78,77057,77058],{"class":124,"line":24180},[78,77059,77060],{},"# os.path.basename(路径)：返回指定路径的最后一部分\n",[78,77062,77063],{"class":124,"line":24186},[78,77064,77065],{},"# 返回当前路径的文件名称\n",[78,77067,77068],{"class":124,"line":24192},[78,77069,77070],{},"print(os.path.basename(__file__))\n",[78,77072,77073],{"class":124,"line":24198},[78,77074,77075],{},"# print(os.path.basename('..\u002F')) # 在开发中basename也会使用绝对路径\n",[78,77077,77078],{"class":124,"line":24204},[78,77079,77080],{},"print(os.path.basename('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段\u002Fpython_etl'))\n",[78,77082,77083],{"class":124,"line":24210},[78,77084,129],{"emptyLinePlaceholder":128},[78,77086,77087],{"class":124,"line":24215},[78,77088,77089],{},"# os.path.join(路径1, 路径2)：将两个路径进行拼接\n",[78,77091,77092],{"class":124,"line":24220},[78,77093,77094],{},"# 一般为了防止出现拼接错误,我们会在路径1的末尾添加\u002F,在路径2的开头删除斜杠\n",[78,77096,77097],{"class":124,"line":24226},[78,77098,77099],{},"print(os.path.join('C:\u002FUsers\u002Fadmin\u002FDesktop\u002F深圳36期-ETL阶段\u002F', 'python_etl\u002Flearn(实际开发中不需要)'))\n",[78,77101,77102],{"class":124,"line":24232},[78,77103,129],{"emptyLinePlaceholder":128},[78,77105,77106],{"class":124,"line":24238},[78,77107,77108],{},"# os.path.isfile(路径)：判断指定路径是不是一个文件，是返回True，否则返回False\n",[78,77110,77111],{"class":124,"line":24244},[78,77112,77113],{},"print(os.path.isfile(__file__))\n",[78,77115,77116],{"class":124,"line":24250},[78,77117,77118],{},"# os.path.isdir(路径)：判断指定路径是不是一个文件夹，是返回True，否则返回False\n",[78,77120,77121],{"class":124,"line":24256},[78,77122,77123],{},"print(os.path.isdir(__file__))\n",[39316,77125,77127,77128,4604],{"id":77126},"_65-pymysql模块重要","6.5 pymysql模块(",[22,77129,76821],{},[13,77131,77132],{},[617,77133],{"alt":77134,"src":77135},"image-20181006231547917","..\u002F..\u002FETL\u002FDAY1\u002F02_%E7%AC%94%E8%AE%B0\u002Fday01-%E7%9F%A5%E8%AF%86%E5%A4%8D%E4%B9%A0.assets\u002Fimage-20181006231547917.png",[72,77137,77138,77143,77146,77149,77154,77174,77179,77184,77189,77194,77199,77204],{},[13,77139,77140],{},[22,77141,77142],{},"注:",[13,77144,77145],{},"pymysql模块属于第三方模块，使用前必须提前安装！！！",[13,77147,77148],{},"pip install pymysql或通过pycharm直接安装",[13,77150,77151],{},[22,77152,77153],{},"操作步骤:",[2285,77155,77156,77159,77162,77165,77168,77171],{},[52,77157,77158],{},"导入模块",[52,77160,77161],{},"创建连接",[52,77163,77164],{},"创建游标",[52,77166,77167],{},"执行sql\u002F获取查询集",[52,77169,77170],{},"关闭游标",[52,77172,77173],{},"关闭连接",[13,77175,77176],{},[22,77177,77178],{},"分类:",[2285,77180,77181],{},[52,77182,77183],{},"建表建库语句",[49,77185,77186],{},[52,77187,77188],{},"直接使用execute进行执行,不需要commit提交",[2285,77190,77191],{"start":132},[52,77192,77193],{},"非查询语句(增删改)",[49,77195,77196],{},[52,77197,77198],{},"直接使用excute进行执行,需要使用commit提交",[2285,77200,77201],{"start":138},[52,77202,77203],{},"查询语句",[49,77205,77206],{},[52,77207,77208],{},"直接使用excute进行执行,需要使用cursor.fetchall\u002Ffetchone\u002Ffetchmany进行结果集查询",[13,77210,77211],{},[22,77212,77213],{},"数据库和数据表的创建",[114,77215,77217],{"className":116,"code":77216,"language":118,"meta":119,"style":119},"\"\"\"\n操作步骤:\n\n1. 导入模块\n2. 创建连接\n3. 创建游标\n4. 执行sql\u002F获取查询集\n5. 关闭游标\n6. 关闭连接\n\"\"\"\n############################ 数据库的创建 ########################\n# # 1. 导入模块\n# import pymysql\n# # 2. 创建连接\n# conn = pymysql.connect(\n#     host='127.0.0.1',\n#     port=3306,\n#     user='root',\n#     password='123456',\n#     charset='utf8'\n# )\n# # 3. 创建游标\n# cursor = conn.cursor()\n# # 4. 执行sql\u002F获取查询集\n# sql = 'create database python charset=\"utf8\";'\n# row_num = cursor.execute(sql)\n# if row_num > 0:\n#     print('数据库创建成功...')\n#\n# # 5. 关闭游标\n# cursor.close()\n# # 6. 关闭连接\n# conn.close()\n\n############################ 数据表的创建 ########################\n# 1. 导入模块\nimport pymysql\n# 2. 创建连接\nconn = pymysql.connect(\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='123456',\n    charset='utf8',\n    database='python'\n)\n# 3. 创建游标\ncursor = conn.cursor()\n# 4. 执行sql\u002F获取查询集\nsql = 'create table person(id int, name varchar(100));'\nrow_num = cursor.execute(sql)\nif row_num > 0:\n    print('数据表创建成功...')\n# 5. 关闭游标\ncursor.close()\n# 6. 关闭连接\nconn.close()\n",[17,77218,77219,77223,77228,77232,77237,77242,77247,77252,77257,77262,77266,77271,77276,77281,77286,77291,77296,77301,77306,77311,77316,77321,77326,77331,77336,77341,77346,77351,77356,77361,77366,77371,77376,77381,77385,77390,77395,77400,77405,77410,77415,77420,77425,77430,77435,77440,77444,77449,77454,77459,77464,77469,77474,77479,77484,77489,77494],{"__ignoreMap":119},[78,77220,77221],{"class":124,"line":125},[78,77222,46994],{},[78,77224,77225],{"class":124,"line":132},[78,77226,77227],{},"操作步骤:\n",[78,77229,77230],{"class":124,"line":138},[78,77231,129],{"emptyLinePlaceholder":128},[78,77233,77234],{"class":124,"line":144},[78,77235,77236],{},"1. 导入模块\n",[78,77238,77239],{"class":124,"line":150},[78,77240,77241],{},"2. 创建连接\n",[78,77243,77244],{"class":124,"line":156},[78,77245,77246],{},"3. 创建游标\n",[78,77248,77249],{"class":124,"line":162},[78,77250,77251],{},"4. 执行sql\u002F获取查询集\n",[78,77253,77254],{"class":124,"line":168},[78,77255,77256],{},"5. 关闭游标\n",[78,77258,77259],{"class":124,"line":174},[78,77260,77261],{},"6. 关闭连接\n",[78,77263,77264],{"class":124,"line":180},[78,77265,46994],{},[78,77267,77268],{"class":124,"line":186},[78,77269,77270],{},"############################ 数据库的创建 ########################\n",[78,77272,77273],{"class":124,"line":192},[78,77274,77275],{},"# # 1. 导入模块\n",[78,77277,77278],{"class":124,"line":198},[78,77279,77280],{},"# import pymysql\n",[78,77282,77283],{"class":124,"line":204},[78,77284,77285],{},"# # 2. 创建连接\n",[78,77287,77288],{"class":124,"line":210},[78,77289,77290],{},"# conn = pymysql.connect(\n",[78,77292,77293],{"class":124,"line":216},[78,77294,77295],{},"#     host='127.0.0.1',\n",[78,77297,77298],{"class":124,"line":222},[78,77299,77300],{},"#     port=3306,\n",[78,77302,77303],{"class":124,"line":421},[78,77304,77305],{},"#     user='root',\n",[78,77307,77308],{"class":124,"line":427},[78,77309,77310],{},"#     password='123456',\n",[78,77312,77313],{"class":124,"line":433},[78,77314,77315],{},"#     charset='utf8'\n",[78,77317,77318],{"class":124,"line":2443},[78,77319,77320],{},"# )\n",[78,77322,77323],{"class":124,"line":2448},[78,77324,77325],{},"# # 3. 创建游标\n",[78,77327,77328],{"class":124,"line":2454},[78,77329,77330],{},"# cursor = conn.cursor()\n",[78,77332,77333],{"class":124,"line":2460},[78,77334,77335],{},"# # 4. 执行sql\u002F获取查询集\n",[78,77337,77338],{"class":124,"line":2465},[78,77339,77340],{},"# sql = 'create database python charset=\"utf8\";'\n",[78,77342,77343],{"class":124,"line":2470},[78,77344,77345],{},"# row_num = cursor.execute(sql)\n",[78,77347,77348],{"class":124,"line":2903},[78,77349,77350],{},"# if row_num > 0:\n",[78,77352,77353],{"class":124,"line":2909},[78,77354,77355],{},"#     print('数据库创建成功...')\n",[78,77357,77358],{"class":124,"line":11477},[78,77359,77360],{},"#\n",[78,77362,77363],{"class":124,"line":13374},[78,77364,77365],{},"# # 5. 关闭游标\n",[78,77367,77368],{"class":124,"line":13380},[78,77369,77370],{},"# cursor.close()\n",[78,77372,77373],{"class":124,"line":13386},[78,77374,77375],{},"# # 6. 关闭连接\n",[78,77377,77378],{"class":124,"line":13722},[78,77379,77380],{},"# conn.close()\n",[78,77382,77383],{"class":124,"line":13727},[78,77384,129],{"emptyLinePlaceholder":128},[78,77386,77387],{"class":124,"line":13953},[78,77388,77389],{},"############################ 数据表的创建 ########################\n",[78,77391,77392],{"class":124,"line":13958},[78,77393,77394],{},"# 1. 导入模块\n",[78,77396,77397],{"class":124,"line":13964},[78,77398,77399],{},"import pymysql\n",[78,77401,77402],{"class":124,"line":13969},[78,77403,77404],{},"# 2. 创建连接\n",[78,77406,77407],{"class":124,"line":24170},[78,77408,77409],{},"conn = pymysql.connect(\n",[78,77411,77412],{"class":124,"line":24175},[78,77413,77414],{},"    host='127.0.0.1',\n",[78,77416,77417],{"class":124,"line":24180},[78,77418,77419],{},"    port=3306,\n",[78,77421,77422],{"class":124,"line":24186},[78,77423,77424],{},"    user='root',\n",[78,77426,77427],{"class":124,"line":24192},[78,77428,77429],{},"    password='123456',\n",[78,77431,77432],{"class":124,"line":24198},[78,77433,77434],{},"    charset='utf8',\n",[78,77436,77437],{"class":124,"line":24204},[78,77438,77439],{},"    database='python'\n",[78,77441,77442],{"class":124,"line":24210},[78,77443,8041],{},[78,77445,77446],{"class":124,"line":24215},[78,77447,77448],{},"# 3. 创建游标\n",[78,77450,77451],{"class":124,"line":24220},[78,77452,77453],{},"cursor = conn.cursor()\n",[78,77455,77456],{"class":124,"line":24226},[78,77457,77458],{},"# 4. 执行sql\u002F获取查询集\n",[78,77460,77461],{"class":124,"line":24232},[78,77462,77463],{},"sql = 'create table person(id int, name varchar(100));'\n",[78,77465,77466],{"class":124,"line":24238},[78,77467,77468],{},"row_num = cursor.execute(sql)\n",[78,77470,77471],{"class":124,"line":24244},[78,77472,77473],{},"if row_num > 0:\n",[78,77475,77476],{"class":124,"line":24250},[78,77477,77478],{},"    print('数据表创建成功...')\n",[78,77480,77481],{"class":124,"line":24256},[78,77482,77483],{},"# 5. 关闭游标\n",[78,77485,77486],{"class":124,"line":24262},[78,77487,77488],{},"cursor.close()\n",[78,77490,77491],{"class":124,"line":24267},[78,77492,77493],{},"# 6. 关闭连接\n",[78,77495,77496],{"class":124,"line":24273},[78,77497,77498],{},"conn.close()\n",[13,77500,77501],{},[22,77502,77503],{},"数据记录的增删改操作",[114,77505,77507],{"className":116,"code":77506,"language":118,"meta":119,"style":119},"\"\"\"\n操作步骤:\n\n1. 导入模块\n2. 创建连接\n3. 创建游标\n4. 执行sql\u002F获取查询集\n    在增删改数据时,要注意数据提交\n5. 关闭游标\n6. 关闭连接\n\"\"\"\n###################### 增 ####################\n# 1. 导入模块\nimport pymysql\n\n# 2. 创建连接\nconn = pymysql.connect(\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='123456',\n    charset='utf8',\n    database='python'\n)\n# 3. 创建游标\ncursor = conn.cursor()\n# 4. 执行sql\u002F获取查询集\nsql = 'insert into person values(1, \"小明\"),(2,\"小芳\");'\n# 执行sql语句\nrow_num = cursor.execute(sql)\nif row_num > 0:\n    print('数据记录插入成功....')\n\n# 只要是事务型操作(增删改),就必须提交后才能生效(sql数据的执行都是在内存中的,只有commit之后才能落盘)\nconn.commit()\n\n# 5. 关闭游标\ncursor.close()\n# 6. 关闭连接\nconn.close()\n\n###################### 删 ####################\n# 1. 导入模块\nimport pymysql\n\n# 2. 创建连接\nconn = pymysql.connect(\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='123456',\n    charset='utf8',\n    database='python'\n)\n# 3. 创建游标\ncursor = conn.cursor()\n# 4. 执行sql\u002F获取查询集\nsql = 'delete from person where id=1;'\n# 执行sql语句\nrow_num = cursor.execute(sql)\nif row_num > 0:\n    print('数据记录删除成功....')\n\n# 只要是事务型操作(增删改),就必须提交后才能生效(sql数据的执行都是在内存中的,只有commit之后才能落盘)\nconn.commit()\n\n# 5. 关闭游标\ncursor.close()\n# 6. 关闭连接\nconn.close()\n\n\n###################### 该 ####################\n# 1. 导入模块\nimport pymysql\n\n# 2. 创建连接\nconn = pymysql.connect(\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='123456',\n    charset='utf8',\n    database='python'\n)\n# 3. 创建游标\ncursor = conn.cursor()\n# 4. 执行sql\u002F获取查询集\nsql = 'update person set name=\"小华\" where id = 2;'\n# 执行sql语句\nrow_num = cursor.execute(sql)\nif row_num > 0:\n    print('数据记录修改成功....')\n\n# 只要是事务型操作(增删改),就必须提交后才能生效(sql数据的执行都是在内存中的,只有commit之后才能落盘)\nconn.commit()\n\n# 5. 关闭游标\ncursor.close()\n\n# 6. 关闭连接\nconn.close()\n",[17,77508,77509,77513,77517,77521,77525,77529,77533,77537,77542,77546,77550,77554,77559,77563,77567,77571,77575,77579,77583,77587,77591,77595,77599,77603,77607,77611,77615,77619,77624,77629,77633,77637,77642,77646,77651,77656,77660,77664,77668,77672,77676,77680,77685,77689,77693,77697,77701,77705,77709,77713,77717,77721,77725,77729,77733,77737,77741,77745,77750,77754,77758,77762,77767,77771,77775,77779,77783,77787,77791,77795,77799,77803,77807,77812,77816,77820,77824,77828,77832,77836,77840,77844,77848,77852,77856,77860,77864,77868,77872,77877,77881,77885,77889,77894,77898,77902,77906,77910,77914,77918,77922,77926],{"__ignoreMap":119},[78,77510,77511],{"class":124,"line":125},[78,77512,46994],{},[78,77514,77515],{"class":124,"line":132},[78,77516,77227],{},[78,77518,77519],{"class":124,"line":138},[78,77520,129],{"emptyLinePlaceholder":128},[78,77522,77523],{"class":124,"line":144},[78,77524,77236],{},[78,77526,77527],{"class":124,"line":150},[78,77528,77241],{},[78,77530,77531],{"class":124,"line":156},[78,77532,77246],{},[78,77534,77535],{"class":124,"line":162},[78,77536,77251],{},[78,77538,77539],{"class":124,"line":168},[78,77540,77541],{},"    在增删改数据时,要注意数据提交\n",[78,77543,77544],{"class":124,"line":174},[78,77545,77256],{},[78,77547,77548],{"class":124,"line":180},[78,77549,77261],{},[78,77551,77552],{"class":124,"line":186},[78,77553,46994],{},[78,77555,77556],{"class":124,"line":192},[78,77557,77558],{},"###################### 增 ####################\n",[78,77560,77561],{"class":124,"line":198},[78,77562,77394],{},[78,77564,77565],{"class":124,"line":204},[78,77566,77399],{},[78,77568,77569],{"class":124,"line":210},[78,77570,129],{"emptyLinePlaceholder":128},[78,77572,77573],{"class":124,"line":216},[78,77574,77404],{},[78,77576,77577],{"class":124,"line":222},[78,77578,77409],{},[78,77580,77581],{"class":124,"line":421},[78,77582,77414],{},[78,77584,77585],{"class":124,"line":427},[78,77586,77419],{},[78,77588,77589],{"class":124,"line":433},[78,77590,77424],{},[78,77592,77593],{"class":124,"line":2443},[78,77594,77429],{},[78,77596,77597],{"class":124,"line":2448},[78,77598,77434],{},[78,77600,77601],{"class":124,"line":2454},[78,77602,77439],{},[78,77604,77605],{"class":124,"line":2460},[78,77606,8041],{},[78,77608,77609],{"class":124,"line":2465},[78,77610,77448],{},[78,77612,77613],{"class":124,"line":2470},[78,77614,77453],{},[78,77616,77617],{"class":124,"line":2903},[78,77618,77458],{},[78,77620,77621],{"class":124,"line":2909},[78,77622,77623],{},"sql = 'insert into person values(1, \"小明\"),(2,\"小芳\");'\n",[78,77625,77626],{"class":124,"line":11477},[78,77627,77628],{},"# 执行sql语句\n",[78,77630,77631],{"class":124,"line":13374},[78,77632,77468],{},[78,77634,77635],{"class":124,"line":13380},[78,77636,77473],{},[78,77638,77639],{"class":124,"line":13386},[78,77640,77641],{},"    print('数据记录插入成功....')\n",[78,77643,77644],{"class":124,"line":13722},[78,77645,129],{"emptyLinePlaceholder":128},[78,77647,77648],{"class":124,"line":13727},[78,77649,77650],{},"# 只要是事务型操作(增删改),就必须提交后才能生效(sql数据的执行都是在内存中的,只有commit之后才能落盘)\n",[78,77652,77653],{"class":124,"line":13953},[78,77654,77655],{},"conn.commit()\n",[78,77657,77658],{"class":124,"line":13958},[78,77659,129],{"emptyLinePlaceholder":128},[78,77661,77662],{"class":124,"line":13964},[78,77663,77483],{},[78,77665,77666],{"class":124,"line":13969},[78,77667,77488],{},[78,77669,77670],{"class":124,"line":24170},[78,77671,77493],{},[78,77673,77674],{"class":124,"line":24175},[78,77675,77498],{},[78,77677,77678],{"class":124,"line":24180},[78,77679,129],{"emptyLinePlaceholder":128},[78,77681,77682],{"class":124,"line":24186},[78,77683,77684],{},"###################### 删 ####################\n",[78,77686,77687],{"class":124,"line":24192},[78,77688,77394],{},[78,77690,77691],{"class":124,"line":24198},[78,77692,77399],{},[78,77694,77695],{"class":124,"line":24204},[78,77696,129],{"emptyLinePlaceholder":128},[78,77698,77699],{"class":124,"line":24210},[78,77700,77404],{},[78,77702,77703],{"class":124,"line":24215},[78,77704,77409],{},[78,77706,77707],{"class":124,"line":24220},[78,77708,77414],{},[78,77710,77711],{"class":124,"line":24226},[78,77712,77419],{},[78,77714,77715],{"class":124,"line":24232},[78,77716,77424],{},[78,77718,77719],{"class":124,"line":24238},[78,77720,77429],{},[78,77722,77723],{"class":124,"line":24244},[78,77724,77434],{},[78,77726,77727],{"class":124,"line":24250},[78,77728,77439],{},[78,77730,77731],{"class":124,"line":24256},[78,77732,8041],{},[78,77734,77735],{"class":124,"line":24262},[78,77736,77448],{},[78,77738,77739],{"class":124,"line":24267},[78,77740,77453],{},[78,77742,77743],{"class":124,"line":24273},[78,77744,77458],{},[78,77746,77747],{"class":124,"line":24279},[78,77748,77749],{},"sql = 'delete from person where id=1;'\n",[78,77751,77752],{"class":124,"line":24284},[78,77753,77628],{},[78,77755,77756],{"class":124,"line":24290},[78,77757,77468],{},[78,77759,77760],{"class":124,"line":24296},[78,77761,77473],{},[78,77763,77764],{"class":124,"line":24302},[78,77765,77766],{},"    print('数据记录删除成功....')\n",[78,77768,77769],{"class":124,"line":24308},[78,77770,129],{"emptyLinePlaceholder":128},[78,77772,77773],{"class":124,"line":24314},[78,77774,77650],{},[78,77776,77777],{"class":124,"line":24320},[78,77778,77655],{},[78,77780,77781],{"class":124,"line":24325},[78,77782,129],{"emptyLinePlaceholder":128},[78,77784,77785],{"class":124,"line":24331},[78,77786,77483],{},[78,77788,77789],{"class":124,"line":25115},[78,77790,77488],{},[78,77792,77793],{"class":124,"line":25121},[78,77794,77493],{},[78,77796,77797],{"class":124,"line":25127},[78,77798,77498],{},[78,77800,77801],{"class":124,"line":25132},[78,77802,129],{"emptyLinePlaceholder":128},[78,77804,77805],{"class":124,"line":25137},[78,77806,129],{"emptyLinePlaceholder":128},[78,77808,77809],{"class":124,"line":25143},[78,77810,77811],{},"###################### 该 ####################\n",[78,77813,77814],{"class":124,"line":25149},[78,77815,77394],{},[78,77817,77818],{"class":124,"line":25155},[78,77819,77399],{},[78,77821,77822],{"class":124,"line":25161},[78,77823,129],{"emptyLinePlaceholder":128},[78,77825,77826],{"class":124,"line":25166},[78,77827,77404],{},[78,77829,77830],{"class":124,"line":25172},[78,77831,77409],{},[78,77833,77834],{"class":124,"line":25178},[78,77835,77414],{},[78,77837,77838],{"class":124,"line":25184},[78,77839,77419],{},[78,77841,77842],{"class":124,"line":25190},[78,77843,77424],{},[78,77845,77846],{"class":124,"line":25196},[78,77847,77429],{},[78,77849,77850],{"class":124,"line":25202},[78,77851,77434],{},[78,77853,77854],{"class":124,"line":25207},[78,77855,77439],{},[78,77857,77858],{"class":124,"line":25212},[78,77859,8041],{},[78,77861,77862],{"class":124,"line":25218},[78,77863,77448],{},[78,77865,77866],{"class":124,"line":25224},[78,77867,77453],{},[78,77869,77870],{"class":124,"line":25230},[78,77871,77458],{},[78,77873,77874],{"class":124,"line":25236},[78,77875,77876],{},"sql = 'update person set name=\"小华\" where id = 2;'\n",[78,77878,77879],{"class":124,"line":25241},[78,77880,77628],{},[78,77882,77883],{"class":124,"line":25246},[78,77884,77468],{},[78,77886,77887],{"class":124,"line":25252},[78,77888,77473],{},[78,77890,77891],{"class":124,"line":25258},[78,77892,77893],{},"    print('数据记录修改成功....')\n",[78,77895,77896],{"class":124,"line":25264},[78,77897,129],{"emptyLinePlaceholder":128},[78,77899,77900],{"class":124,"line":25269},[78,77901,77650],{},[78,77903,77904],{"class":124,"line":25274},[78,77905,77655],{},[78,77907,77908],{"class":124,"line":25280},[78,77909,129],{"emptyLinePlaceholder":128},[78,77911,77912],{"class":124,"line":25286},[78,77913,77483],{},[78,77915,77916],{"class":124,"line":25292},[78,77917,77488],{},[78,77919,77920],{"class":124,"line":25298},[78,77921,129],{"emptyLinePlaceholder":128},[78,77923,77924],{"class":124,"line":51654},[78,77925,77493],{},[78,77927,77928],{"class":124,"line":51659},[78,77929,77498],{},[13,77931,77932],{},[22,77933,77934],{},"数据记录的查询操作",[114,77936,77938],{"className":116,"code":77937,"language":118,"meta":119,"style":119},"\"\"\"\n操作步骤:\n\n1. 导入模块\n2. 创建连接\n3. 创建游标\n4. 执行sql\u002F获取查询集\n    查询操作不需要数据提交,但是要进行结果集的处理\n5. 关闭游标\n6. 关闭连接\n\"\"\"\n\n# 1. 导入模块\nimport pymysql\n\n# 2. 创建连接\nconn = pymysql.connect(\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='123456',\n    charset='utf8',\n    database='python'\n)\n\n# 3. 创建游标\ncursor = conn.cursor()\n\n# 4. 执行sql\nsql = 'select * from person where id > 1;'\ncursor.execute(sql)\n# 获取查询集\n# query_set = cursor.fetchall()  # 获取全部的数据\n# query_set =  cursor.fetchone()  # 获取一条数据\nquery_set = cursor.fetchmany(3)  # 获取3条数据\nprint(query_set)\n\n# 5. 关闭游标\ncursor.close()\n\n# 6. 关闭连接\nconn.close()\n",[17,77939,77940,77944,77948,77952,77956,77960,77964,77968,77973,77977,77981,77985,77989,77993,77997,78001,78005,78009,78013,78017,78021,78025,78029,78033,78037,78041,78045,78049,78053,78058,78063,78068,78073,78078,78083,78088,78093,78097,78101,78105,78109,78113],{"__ignoreMap":119},[78,77941,77942],{"class":124,"line":125},[78,77943,46994],{},[78,77945,77946],{"class":124,"line":132},[78,77947,77227],{},[78,77949,77950],{"class":124,"line":138},[78,77951,129],{"emptyLinePlaceholder":128},[78,77953,77954],{"class":124,"line":144},[78,77955,77236],{},[78,77957,77958],{"class":124,"line":150},[78,77959,77241],{},[78,77961,77962],{"class":124,"line":156},[78,77963,77246],{},[78,77965,77966],{"class":124,"line":162},[78,77967,77251],{},[78,77969,77970],{"class":124,"line":168},[78,77971,77972],{},"    查询操作不需要数据提交,但是要进行结果集的处理\n",[78,77974,77975],{"class":124,"line":174},[78,77976,77256],{},[78,77978,77979],{"class":124,"line":180},[78,77980,77261],{},[78,77982,77983],{"class":124,"line":186},[78,77984,46994],{},[78,77986,77987],{"class":124,"line":192},[78,77988,129],{"emptyLinePlaceholder":128},[78,77990,77991],{"class":124,"line":198},[78,77992,77394],{},[78,77994,77995],{"class":124,"line":204},[78,77996,77399],{},[78,77998,77999],{"class":124,"line":210},[78,78000,129],{"emptyLinePlaceholder":128},[78,78002,78003],{"class":124,"line":216},[78,78004,77404],{},[78,78006,78007],{"class":124,"line":222},[78,78008,77409],{},[78,78010,78011],{"class":124,"line":421},[78,78012,77414],{},[78,78014,78015],{"class":124,"line":427},[78,78016,77419],{},[78,78018,78019],{"class":124,"line":433},[78,78020,77424],{},[78,78022,78023],{"class":124,"line":2443},[78,78024,77429],{},[78,78026,78027],{"class":124,"line":2448},[78,78028,77434],{},[78,78030,78031],{"class":124,"line":2454},[78,78032,77439],{},[78,78034,78035],{"class":124,"line":2460},[78,78036,8041],{},[78,78038,78039],{"class":124,"line":2465},[78,78040,129],{"emptyLinePlaceholder":128},[78,78042,78043],{"class":124,"line":2470},[78,78044,77448],{},[78,78046,78047],{"class":124,"line":2903},[78,78048,77453],{},[78,78050,78051],{"class":124,"line":2909},[78,78052,129],{"emptyLinePlaceholder":128},[78,78054,78055],{"class":124,"line":11477},[78,78056,78057],{},"# 4. 执行sql\n",[78,78059,78060],{"class":124,"line":13374},[78,78061,78062],{},"sql = 'select * from person where id > 1;'\n",[78,78064,78065],{"class":124,"line":13380},[78,78066,78067],{},"cursor.execute(sql)\n",[78,78069,78070],{"class":124,"line":13386},[78,78071,78072],{},"# 获取查询集\n",[78,78074,78075],{"class":124,"line":13722},[78,78076,78077],{},"# query_set = cursor.fetchall()  # 获取全部的数据\n",[78,78079,78080],{"class":124,"line":13727},[78,78081,78082],{},"# query_set =  cursor.fetchone()  # 获取一条数据\n",[78,78084,78085],{"class":124,"line":13953},[78,78086,78087],{},"query_set = cursor.fetchmany(3)  # 获取3条数据\n",[78,78089,78090],{"class":124,"line":13958},[78,78091,78092],{},"print(query_set)\n",[78,78094,78095],{"class":124,"line":13964},[78,78096,129],{"emptyLinePlaceholder":128},[78,78098,78099],{"class":124,"line":13969},[78,78100,77483],{},[78,78102,78103],{"class":124,"line":24170},[78,78104,77488],{},[78,78106,78107],{"class":124,"line":24175},[78,78108,129],{"emptyLinePlaceholder":128},[78,78110,78111],{"class":124,"line":24180},[78,78112,77493],{},[78,78114,78115],{"class":124,"line":24186},[78,78116,77498],{},[23289,78118],{},[107,78120,78122],{"id":78121},"四python常用工具类","四、Python常用工具类",[107,78124,78126],{"id":78125},"五model模型详解","五、Model模型详解",[107,78128,78130],{"id":78129},"六etl流程控制","六、ETL流程控制",[107,78132,78134],{"id":78133},"七finebikettle简介","七、FineBI、Kettle简介",[226,78136,228],{},{"title":119,"searchDepth":144,"depth":144,"links":78138},[78139,78143,78144,78153,78154,78155,78156],{"id":75342,"depth":132,"text":75343,"children":78140},[78141,78142],{"id":75346,"depth":144,"text":75347},{"id":75359,"depth":144,"text":75360},{"id":75424,"depth":132,"text":75425},{"id":75498,"depth":132,"text":75499,"children":78145},[78146,78147,78148,78149,78151],{"id":75502,"depth":150,"text":75503},{"id":76177,"depth":150,"text":76178},{"id":76557,"depth":150,"text":76558},{"id":76817,"depth":150,"text":78150},"6.4 OS模块(重要)",{"id":77126,"depth":150,"text":78152},"6.5 pymysql模块(重要)",{"id":78121,"depth":132,"text":78122},{"id":78125,"depth":132,"text":78126},{"id":78129,"depth":132,"text":78130},{"id":78133,"depth":132,"text":78134},{},"Little Tips\u002FPython ETL.md","\u002Fundergraduate\u002Fnote-a9ec87552e26",{"title":75320,"description":119},"undergraduate\u002Fnote-a9ec87552e26",[23378,10715,35725],"IUMk8x8EIYNmpWHDcozYphZld-b7SgMGuh16yh2cGGs",{"id":78165,"title":78166,"assetBase":78167,"author":8,"body":78168,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":92947,"navigation":128,"originalPath":92948,"path":92949,"seo":92950,"source":23330,"stem":92951,"tags":92952,"weight":250,"__hash__":92953},"content\u002Fundergraduate\u002Fnote-aa2f385e1ecc.md","计算智能导论","\u002Fcontent-assets\u002Fundergraduate\u002Fnote-aa2f385e1ecc",{"type":10,"value":78169,"toc":92911},[78170,78172,78184,78186,78190,78194,78201,78203,78207,78210,78213,78216,78219,78221,78225,78229,78235,78237,78241,78244,78247,78250,78256,78261,78263,78267,78273,78279,78285,78291,78297,78299,78303,78306,78309,78313,78319,78328,78337,78346,78350,78357,78363,78367,78373,78379,78385,78389,78392,78395,78401,78407,78413,78415,78419,78422,78425,78427,78431,78435,78438,78441,78444,78447,78450,78806,78809,78812,78814,78818,78821,78824,78827,78830,78833,78920,78923,78927,78930,79408,79410,79414,79417,79419,79423,79427,79435,79439,81702,81706,83517,83519,83523,83529,83670,83672,83676,83679,83847,83850,83852,83856,83862,83868,83871,83874,84324,84327,84329,84333,84337,84340,84854,84858,84861,85364,85367,85369,85373,85377,85380,85383,85386,85389,85392,85394,85398,85401,85492,85501,85505,85733,85750,85754,85883,85886,85890,85893,85896,86099,86102,86105,86324,86327,86331,86334,86530,86533,86734,86737,86791,86794,87128,87131,87307,87310,87607,87610,87806,87808,87812,87825,87828,87831,87838,88272,88275,88277,88281,88284,88288,88291,88294,88598,88601,88772,88775,88921,88924,89074,89078,89081,89084,89088,89093,89097,89100,89661,89664,90121,90124,90898,90901,90904,90907,91270,91273,91276,91699,91705,91708,91716,91719,91724,91727,91732,91735,91740,91743,91745,91749,91753,91756,91758,91761,91764,91767,91772,92104,92107,92110,92113,92538,92541,92544,92843,92845,92849,92852,92855,92858,92860,92863,92866,92874,92876,92879,92882,92887,92893,92899,92902,92905,92908],[4517,78171,78166],{"id":78166},[72,78173,78174,78178,78181],{},[13,78175,78176],{},[22,78177,23957],{},[13,78179,78180],{},"首先，这是自用的复习资料，发出来如果未来被本校学弟学妹看见了那是属实荣幸；其次，这本书本身就是有不少问题的，如果在我的文档里发现了bug不要惊慌，属于正常操作，有能力的话还请更改了之后push到Github并在最后留下你的足迹；最后，这只是一个零基础学渣在考前一周的复习，内容完全按照考点来设置，建议给人预习留个念想啥的，以及给摆烂人最后突击用的。",[13,78182,78183],{},"修改于2022\u002F7\u002F1，已经考完试了，现在的版本是在原有基础上对整个文档进行的一个补充完善，通过从考试的试卷来阐述只需要完善的复习要点，所有内容都放在第4章之后的2.0补充内容中。",[23289,78185],{},[107,78187,78189],{"id":78188},"第1章-绪论从人工智能到计算智能","第1章 绪论——从人工智能到计算智能",[7759,78191,78193],{"id":78192},"_1计算智能定义p11","1、计算智能定义（P11）",[13,78195,78196,78197,78200],{},"计算智能系统是在",[22,78198,78199],{},"神经网络、模糊系统、进化计算","三个分支发展相对成熟的基础上，通过相互之间的有机融合而形成的新的科学方法，也是智能理论和技术发展的崭新阶段。当一个系统仅仅处理底层数据，具有模式识别的部分，并且不使用AI意义中的知识，那么这个系统就是计算智能系统。",[23289,78202],{},[7759,78204,78206],{"id":78205},"_2人工神经网络的特点p10","2、人工神经网络的特点（P10）",[13,78208,78209],{},"（1）信息的分布表示记忆在大量神经元中。每个神经元存储许多信息的部分内容，信息在神经网络中的记忆反映在神经元间突触的连接强度上。",[13,78211,78212],{},"（2）神经网络运算的全局并行和局部操作。神经网络具有高度的并行结构和并行实现能力，因而有较好的耐故障能力和较快的总体处理能力。",[13,78214,78215],{},"（3）处理的非线性。神经网络具有非线性特性，这源于其近似任何非线性映射（变换）的能力。",[13,78217,78218],{},"（4）较强的学习能力。神经网络是通过研究系统过去的数据记录进行训练的。一个经过适当训练的神经系统具有归纳全部数据，因此，神经网络能够解决那些由数学模型或描述规则难以处理的控制过程的问题。",[23289,78220],{},[107,78222,78224],{"id":78223},"第2章-进化算法","第2章 进化算法",[7759,78226,78228],{"id":78227},"_1遗传算法的基本框架p40","1、遗传算法的基本框架（P40）",[13,78230,78231],{},[617,78232],{"alt":78233,"src":78234},"遗传算法的基本框架","%E8%AE%A1%E7%AE%97%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA%EF%BC%88%E5%BA%94%E8%AF%95%E4%B8%BA%E4%B8%BB%EF%BC%89\u002F%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A1%86%E6%9E%B6.png",[23289,78236],{},[7759,78238,78240],{"id":78239},"_2遗传算法的优点p40","2、遗传算法的优点（P40）",[13,78242,78243],{},"（1）**遗传算法直接以目标函数值作为搜索信息。**传统的优化算法往往不只需要目标函数值，还需要目标函数的导数等其他信息，这样对于许多函数无法求导或很难求导的函数，遗传算法就比较方便。",[13,78245,78246],{},"（2）**遗传算法同时进行解空间的多点搜索。**传统的优化算法往往从解空间的一个初始节点开始搜索，这样容易陷入局部极值点。遗传算法进行群体搜索，并且在搜索的过程中引入遗传运算，使群体又可以不断进化，这些是遗传算法所特有的一种隐含并行性，因此，遗传算法更适合大规模复杂问题的优化。",[13,78248,78249],{},"（3）**遗传算法使用概率搜索技术。**遗传算法属于一种自适应概率搜索技术，其选择、交叉、变异等运算都是以一种概率的方式来进行的，从而增加了其搜索过程的灵活性。实践和理论都已证明，在一定条件下遗传算法总是以概率1收敛于问题的最优解。",[13,78251,63809,78252,78255],{},[22,78253,78254],{},"遗传算法在解空间进行高效启发式搜索","，而非盲目地穷举或完全随机搜索。",[13,78257,74072,78258],{},[22,78259,78260],{},"遗传算法计算简单、功能强。",[23289,78262],{},[7759,78264,78266],{"id":78265},"_3遗传算法的五个关键问题p41","3、遗传算法的五个关键问题（P41）",[13,78268,78269,78270,67],{},"（1）对问题的潜在解进行基因的表示，即",[22,78271,78272],{},"编码问题",[13,78274,78275,78276,67],{},"（2）构建一组潜在的解决方案，即",[22,78277,78278],{},"种群初始化问题",[13,78280,78281,78282,67],{},"（3）根据潜在解的适应性来评价解的好坏，即",[22,78283,78284],{},"个体评价问题",[13,78286,78287,78288,67],{},"（4）改变后代基因组成的遗传算子（选择、交叉、变异等），即",[22,78289,78290],{},"遗传算子问题",[13,78292,78293,78294,67],{},"（5）设置遗传算法所用的参数值（种群大小、应用遗传算子的概率等），即",[22,78295,78296],{},"参数选择问题",[23289,78298],{},[7759,78300,78302],{"id":78301},"_4遗传编码p41","4、遗传编码（P41）",[10548,78304,78305],{"id":78305},"定义",[13,78307,78308],{},"由问题空间向GA编码空间的映射称为编码，而由编码空间向问题空间的映射称为译码。",[10548,78310,78312],{"id":78311},"_1编码的分类","1、编码的分类",[13,78314,78315,78316,29665],{},"（1）根据采用的符号，编码可以分为",[22,78317,78318],{},"二进制编码、实数编码和整数排列编码",[13,78320,78321,78322,52204,78325,67],{},"（2）根据编码采用的结构，编码可以分为",[22,78323,78324],{},"一维编码",[22,78326,78327],{},"多维编码",[13,78329,78330,78331,52204,78334,67],{},"（3）根据编码采用的长度，编码可分为",[22,78332,78333],{},"固定长度编码",[22,78335,78336],{},"可变长度编码",[13,78338,78339,78340,52204,78343,21291],{},"（4）根据编码的内容，编码可分为",[22,78341,78342],{},"仅对解进行编码的方法",[22,78344,78345],{},"对解+参数进行编码的方法",[10548,78347,78349],{"id":78348},"_2码空间和解空间","2、码空间和解空间",[13,78351,78352,78353,78356],{},"遗传算法的一个特点就是个体存在于码空间和解空间：",[22,78354,78355],{},"遗传操作在码空间，而评价和选择在解空间","，通过自然选择将染色体和解连接起来。",[13,78358,78359],{},[617,78360],{"alt":78361,"src":78362},"遗传算子","%E8%AE%A1%E7%AE%97%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA%EF%BC%88%E5%BA%94%E8%AF%95%E4%B8%BA%E4%B8%BB%EF%BC%89\u002F%E9%81%97%E4%BC%A0%E7%AE%97%E5%AD%90.png",[10548,78364,78366],{"id":78365},"_3非字符编码的三个问题","3、非字符编码的三个问题",[13,78368,28636,78369,78372],{},[22,78370,78371],{},"染色体的可行性","，是指染色体经过解码之后，是否存在于给定问题的可行域。",[13,78374,28654,78375,78378],{},[22,78376,78377],{},"染色体的合法性","，编码空间中的染色体必须对应问题空间中的某一潜在解，即每个编码必须有意义。",[13,78380,28672,78381,78384],{},[22,78382,78383],{},"映射的唯一性","，染色体和潜在解必须一一对应。",[10548,78386,78388],{"id":78387},"_4编码性能评价","4、编码性能评价",[13,78390,78391],{},"码空间到解空间有以下三种情况：1对1映射、n对1映射和1对n映射。",[13,78393,78394],{},"1对1映射是三种映射中最好的；1对n映射是三种映射中最差的，存在适应度评价问题；n对1映射则会存在资源的浪费。",[13,78396,28636,78397,78400],{},[22,78398,78399],{},"不冗余","：码空间到解空间是1对1映射；",[13,78402,28654,78403,78406],{},[22,78404,78405],{},"合法性","：对编码的任意排列对应一个解；",[13,78408,28672,78409,78412],{},[22,78410,78411],{},"完备性","：任意一个解都对应一个排列。",[23289,78414],{},[7759,78416,78418],{"id":78417},"_5适应度函数p54","5、适应度函数（P54）",[13,78420,78421],{},"遗传算法在进化搜索中基本不用外部信息，仅以目标函数即适应度函数为依据，利用种群每个个体的适应度来指导搜索。遗传算法的目标函数不受连续可微的约束，且定义域可以为任意集合。",[13,78423,78424],{},"适应度函数值是选择操作的依据，适应度函数的选取直接影响到遗传算法的收敛速度以及能否找到最优解。",[23289,78426],{},[107,78428,78430],{"id":78429},"第3章-模糊逻辑","第3章 模糊逻辑",[7759,78432,78434],{"id":78433},"_1概率与模糊p165","1、概率与模糊（P165）",[10548,78436,78437],{"id":78437},"相似之处",[13,78439,78440],{},"（1）都可以用来刻画不确定性。",[13,78442,78443],{},"（2）都通过单位间隔【0，1】中的数来表述不确定性，即映射的值域是相同的，均为【0，1】。",[13,78445,78446],{},"（3）都兼有集合和命题的结合律、交换律、分配律。",[10548,78448,78449],{"id":78449},"区别",[78,78451,78453],{"className":78452},[4566],[78,78454,78456,78543],{"className":78455},[4570],[78,78457,78459],{"className":78458},[4574],[4576,78460,78461],{"xmlns":4578,"display":4579},[4581,78462,78463,78540],{},[4584,78464,78465,78468,78470,78473,78475,78477,78483,78485,78488,78490,78492,78494,78496,78498,78504,78506,78508,78510,78512,78514,78516,78518,78520,78523,78525,78527,78533,78535,78537],{},[4587,78466,78467],{},"（",[7077,78469,469],{},[4587,78471,78472],{},"）经典集合论中",[4596,78474,17143],{},[4591,78476,63356],{},[4614,78478,78479,78481],{},[4596,78480,17143],{},[4596,78482,43678],{},[4591,78484,4609],{},[4596,78486,78487],{"mathvariant":7101},"∅",[4591,78489,2066],{"separator":1419},[4596,78491,7062],{},[4591,78493,4594],{"stretchy":4593},[4596,78495,17143],{},[4591,78497,63356],{},[4614,78499,78500,78502],{},[4596,78501,17143],{},[4596,78503,43678],{},[4591,78505,4604],{"stretchy":4593},[4591,78507,4609],{},[4596,78509,7062],{},[4591,78511,4594],{"stretchy":4593},[4596,78513,78487],{"mathvariant":7101},[4591,78515,4604],{"stretchy":4593},[4591,78517,4609],{},[7077,78519,2949],{},[4587,78521,78522],{},"代表概率上不可能的事件；模糊集合建立在",[4596,78524,17143],{},[4591,78526,63356],{},[4614,78528,78529,78531],{},[4596,78530,17143],{},[4596,78532,43678],{},[4591,78534,4609],{},[4596,78536,78487],{"mathvariant":7101},[4587,78538,78539],{},"的基础上。",[4647,78541,78542],{"encoding":4649},"（1）经典集合论中A\\cap A^C = \\varnothing,P(A\\cap A^C) = P(\\varnothing) = 0代表概率上不可能的事件；模糊集合建立在A\\cap A^C = \\varnothing的基础上。",[78,78544,78546,78573,78617,78651,78698,78725,78749,78793],{"className":78545,"ariaHidden":1419},[4654],[78,78547,78549,78552,78555,78558,78561,78564,78567,78570],{"className":78548},[4658],[78,78550],{"className":78551,"style":18224},[4662],[78,78553,78467],{"className":78554},[4667,6184],[78,78556,469],{"className":78557},[4667],[78,78559,78472],{"className":78560},[4667,6184],[78,78562,17143],{"className":78563},[4667,4678],[78,78565],{"className":78566,"style":5143},[4739],[78,78568,63356],{"className":78569},[7450],[78,78571],{"className":78572,"style":5143},[4739],[78,78574,78576,78579,78608,78611,78614],{"className":78575},[4658],[78,78577],{"className":78578,"style":5206},[4662],[78,78580,78582,78585],{"className":78581},[4667],[78,78583,17143],{"className":78584},[4667,4678],[78,78586,78588],{"className":78587},[4689],[78,78589,78591],{"className":78590},[4693],[78,78592,78594],{"className":78593},[4698],[78,78595,78597],{"className":78596,"style":5206},[4702],[78,78598,78599,78602],{"style":5209},[78,78600],{"className":78601,"style":4711},[4710],[78,78603,78605],{"className":78604},[4715,4716,4717,4718],[78,78606,43678],{"className":78607,"style":5133},[4667,4678,4718],[78,78609],{"className":78610,"style":4740},[4739],[78,78612,4609],{"className":78613},[4744],[78,78615],{"className":78616,"style":4740},[4739],[78,78618,78620,78623,78627,78630,78633,78636,78639,78642,78645,78648],{"className":78619},[4658],[78,78621],{"className":78622,"style":4663},[4662],[78,78624,78487],{"className":78625},[4667,78626],"amsrm",[78,78628,2066],{"className":78629},[5126],[78,78631],{"className":78632,"style":4839},[4739],[78,78634,7062],{"className":78635,"style":5219},[4667,4678],[78,78637,4594],{"className":78638},[4674],[78,78640,17143],{"className":78641},[4667,4678],[78,78643],{"className":78644,"style":5143},[4739],[78,78646,63356],{"className":78647},[7450],[78,78649],{"className":78650,"style":5143},[4739],[78,78652,78654,78657,78686,78689,78692,78695],{"className":78653},[4658],[78,78655],{"className":78656,"style":5162},[4662],[78,78658,78660,78663],{"className":78659},[4667],[78,78661,17143],{"className":78662},[4667,4678],[78,78664,78666],{"className":78665},[4689],[78,78667,78669],{"className":78668},[4693],[78,78670,78672],{"className":78671},[4698],[78,78673,78675],{"className":78674,"style":5206},[4702],[78,78676,78677,78680],{"style":5209},[78,78678],{"className":78679,"style":4711},[4710],[78,78681,78683],{"className":78682},[4715,4716,4717,4718],[78,78684,43678],{"className":78685,"style":5133},[4667,4678,4718],[78,78687,4604],{"className":78688},[4682],[78,78690],{"className":78691,"style":4740},[4739],[78,78693,4609],{"className":78694},[4744],[78,78696],{"className":78697,"style":4740},[4739],[78,78699,78701,78704,78707,78710,78713,78716,78719,78722],{"className":78700},[4658],[78,78702],{"className":78703,"style":4663},[4662],[78,78705,7062],{"className":78706,"style":5219},[4667,4678],[78,78708,4594],{"className":78709},[4674],[78,78711,78487],{"className":78712},[4667,78626],[78,78714,4604],{"className":78715},[4682],[78,78717],{"className":78718,"style":4740},[4739],[78,78720,4609],{"className":78721},[4744],[78,78723],{"className":78724,"style":4740},[4739],[78,78726,78728,78731,78734,78737,78740,78743,78746],{"className":78727},[4658],[78,78729],{"className":78730,"style":18224},[4662],[78,78732,2949],{"className":78733},[4667],[78,78735,78522],{"className":78736},[4667,6184],[78,78738,17143],{"className":78739},[4667,4678],[78,78741],{"className":78742,"style":5143},[4739],[78,78744,63356],{"className":78745},[7450],[78,78747],{"className":78748,"style":5143},[4739],[78,78750,78752,78755,78784,78787,78790],{"className":78751},[4658],[78,78753],{"className":78754,"style":5206},[4662],[78,78756,78758,78761],{"className":78757},[4667],[78,78759,17143],{"className":78760},[4667,4678],[78,78762,78764],{"className":78763},[4689],[78,78765,78767],{"className":78766},[4693],[78,78768,78770],{"className":78769},[4698],[78,78771,78773],{"className":78772,"style":5206},[4702],[78,78774,78775,78778],{"style":5209},[78,78776],{"className":78777,"style":4711},[4710],[78,78779,78781],{"className":78780},[4715,4716,4717,4718],[78,78782,43678],{"className":78783,"style":5133},[4667,4678,4718],[78,78785],{"className":78786,"style":4740},[4739],[78,78788,4609],{"className":78789},[4744],[78,78791],{"className":78792,"style":4740},[4739],[78,78794,78796,78800,78803],{"className":78795},[4658],[78,78797],{"className":78798,"style":78799},[4662],"height:0.765em;vertical-align:-0.0817em;",[78,78801,78487],{"className":78802},[4667,78626],[78,78804,78539],{"className":78805},[4667,6184],[13,78807,78808],{},"（2）经典集合A中某个元素x的概率在x发生之后，就会变为0或1；模糊集合A中某个元素x的隶属度不会发生变化。",[13,78810,78811],{},"（3）概率是事件是否发生的不确定性；模糊是事件发生的程度。",[23289,78813],{},[7759,78815,78817],{"id":78816},"_2模糊集合的表示方法p170","2、模糊集合的表示方法（P170）",[10548,78819,78820],{"id":78820},"列举法",[13,78822,78823],{},"只适用于有限集合。当论域U是离散域时，一般可以用扎德（Zadeh）表示法、序偶表示法和向量表示法表示。这三种方法均属于列举法。",[13,78825,78826],{},"（具体三者的公式见书P170）",[10548,78828,78829],{"id":78829},"描述法",[13,78831,78832],{},"对于无限集，可以使用描述法表示集合，即",[78,78834,78836],{"className":78835},[4566],[78,78837,78839,78871],{"className":78838},[4570],[78,78840,78842],{"className":78841},[4574],[4576,78843,78844],{"xmlns":4578,"display":4579},[4581,78845,78846,78868],{},[4584,78847,78848,78850,78852,78854,78856,78858,78860,78862,78864,78866],{},[4596,78849,17143],{},[4591,78851,4609],{},[4591,78853,55608],{"stretchy":4593},[4596,78855,4598],{},[4596,78857,63346],{"mathvariant":7101},[4596,78859,7062],{},[4591,78861,4594],{"stretchy":4593},[4596,78863,4598],{},[4591,78865,4604],{"stretchy":4593},[4591,78867,63381],{"stretchy":4593},[4647,78869,78870],{"encoding":4649},"A = \\{x | P(x) \\}",[78,78872,78874,78892],{"className":78873,"ariaHidden":1419},[4654],[78,78875,78877,78880,78883,78886,78889],{"className":78876},[4658],[78,78878],{"className":78879,"style":18224},[4662],[78,78881,17143],{"className":78882},[4667,4678],[78,78884],{"className":78885,"style":4740},[4739],[78,78887,4609],{"className":78888},[4744],[78,78890],{"className":78891,"style":4740},[4739],[78,78893,78895,78898,78901,78904,78907,78910,78913,78916],{"className":78894},[4658],[78,78896],{"className":78897,"style":4663},[4662],[78,78899,55608],{"className":78900},[4674],[78,78902,4598],{"className":78903},[4667,4678],[78,78905,63346],{"className":78906},[4667],[78,78908,7062],{"className":78909,"style":5219},[4667,4678],[78,78911,4594],{"className":78912},[4674],[78,78914,4598],{"className":78915},[4667,4678],[78,78917,78919],{"className":78918},[4682],")}",[13,78921,78922],{},"其中，P(x)表示x满足性质P。",[10548,78924,78926],{"id":78925},"隶属度函数法重点","隶属度函数法（重点）",[13,78928,78929],{},"论域E上的模糊集合A是由隶属度函数确定的，所以可以用隶属度函数来表示模糊集合A。模糊集合可表示为：",[78,78931,78933],{"className":78932},[4566],[78,78934,78936,79048],{"className":78935},[4570],[78,78937,78939],{"className":78938},[4574],[4576,78940,78941],{"xmlns":4578,"display":4579},[4581,78942,78943,79045],{},[4584,78944,78945,78948,78950,78952,78954,78956],{},[4596,78946,78947],{},"μ",[4591,78949,4594],{"stretchy":4593},[4596,78951,4598],{},[4591,78953,4604],{"stretchy":4593},[4591,78955,4609],{},[4584,78957,78958,78960],{},[4591,78959,55608],{"fence":1419},[37085,78961,78962,78982,79024],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,78963,78964],{},[37094,78965,78966],{},[37101,78967,78968],{"scriptlevel":2949,"displaystyle":4593},[4584,78969,78970,78972,78974,78976,78978,78980],{},[7077,78971,469],{},[4591,78973,2066],{"separator":1419},[4587,78975,55499],{},[4596,78977,4598],{},[4591,78979,63351],{},[4596,78981,17143],{},[37091,78983,78984],{},[37094,78985,78986],{},[37101,78987,78988],{"scriptlevel":2949,"displaystyle":4593},[4584,78989,78990,78992,78994,79000,79002,79004,79006,79008,79010,79012,79014,79016,79019,79021],{},[7077,78991,2949],{},[4591,78993,41631],{},[4600,78995,78996,78998],{},[4596,78997,78947],{},[4596,78999,17143],{},[4591,79001,4594],{"stretchy":4593},[4596,79003,4598],{},[4591,79005,4604],{"stretchy":4593},[4591,79007,41631],{},[7077,79009,469],{},[4591,79011,2066],{"separator":1419},[4587,79013,55499],{},[4596,79015,17143],{},[4587,79017,79018],{},"在一定程度上属于",[4596,79020,17143],{},[4587,79022,79023],{},"时",[37091,79025,79026],{},[37094,79027,79028],{},[37101,79029,79030],{"scriptlevel":2949,"displaystyle":4593},[4584,79031,79032,79034,79036,79038,79040,79043],{},[7077,79033,2949],{},[4591,79035,2066],{"separator":1419},[4587,79037,55499],{},[4596,79039,4598],{},[4591,79041,79042],{"mathvariant":7101},"∉",[4596,79044,17143],{},[4647,79046,79047],{"encoding":4649},"\\mu(x) =\n\\begin{cases} \n1, 当x\\in A \\\\ \n0 \u003C \\mu_A(x) \u003C 1,当A在一定程度上属于A时 \\\\\n0, 当x\\notin A\n\\end{cases}",[78,79049,79051,79078],{"className":79050,"ariaHidden":1419},[4654],[78,79052,79054,79057,79060,79063,79066,79069,79072,79075],{"className":79053},[4658],[78,79055],{"className":79056,"style":4663},[4662],[78,79058,78947],{"className":79059},[4667,4678],[78,79061,4594],{"className":79062},[4674],[78,79064,4598],{"className":79065},[4667,4678],[78,79067,4604],{"className":79068},[4682],[78,79070],{"className":79071,"style":4740},[4739],[78,79073,4609],{"className":79074},[4744],[78,79076],{"className":79077,"style":4740},[4739],[78,79079,79081,79084],{"className":79080},[4658],[78,79082],{"className":79083,"style":56016},[4662],[78,79085,79087,79165,79405],{"className":79086},[18342],[78,79088,79090],{"className":79089},[4674],[78,79091,79093],{"className":79092},[56026,56027],[78,79094,79096,79157],{"className":79095},[4693,4694],[78,79097,79099,79154],{"className":79098},[4698],[78,79100,79102,79112,79123,79133,79144],{"className":79101,"style":56037},[4702],[78,79103,79104,79107],{"style":56040},[78,79105],{"className":79106,"style":56044},[4710],[78,79108,79110],{"className":79109},[56048,56049],[78,79111,56052],{},[78,79113,79114,79117],{"style":56055},[78,79115],{"className":79116,"style":56044},[4710],[78,79118,79119],{"style":56061},[5884,79120,79121],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,79122],{"d":56071},[78,79124,79125,79128],{"style":56074},[78,79126],{"className":79127,"style":56044},[4710],[78,79129,79131],{"className":79130},[56048,56049],[78,79132,56083],{},[78,79134,79135,79138],{"style":56086},[78,79136],{"className":79137,"style":56044},[4710],[78,79139,79140],{"style":56061},[5884,79141,79142],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,79143],{"d":56071},[78,79145,79146,79149],{"style":56098},[78,79147],{"className":79148,"style":56044},[4710],[78,79150,79152],{"className":79151},[56048,56049],[78,79153,56107],{},[78,79155,4726],{"className":79156},[4725],[78,79158,79160],{"className":79159},[4698],[78,79161,79163],{"className":79162,"style":56117},[4702],[78,79164],{},[78,79166,79168],{"className":79167},[4667],[78,79169,79171],{"className":79170},[37085],[78,79172,79174],{"className":79173},[38098],[78,79175,79177,79397],{"className":79176},[4693,4694],[78,79178,79180,79394],{"className":79179},[4698],[78,79181,79183,79218,79320],{"className":79182,"style":56138},[4702],[78,79184,79185,79188],{"style":56141},[78,79186],{"className":79187,"style":56145},[4710],[78,79189,79191,79194,79197,79200,79203,79206,79209,79212,79215],{"className":79190},[4667],[78,79192,469],{"className":79193},[4667],[78,79195,2066],{"className":79196},[5126],[78,79198],{"className":79199,"style":4839},[4739],[78,79201,55499],{"className":79202},[4667,6184],[78,79204,4598],{"className":79205},[4667,4678],[78,79207],{"className":79208,"style":4740},[4739],[78,79210,63351],{"className":79211},[4744],[78,79213],{"className":79214,"style":4740},[4739],[78,79216,17143],{"className":79217},[4667,4678],[78,79219,79220,79223],{"style":56318},[78,79221],{"className":79222,"style":56145},[4710],[78,79224,79226,79229,79232,79235,79238,79278,79281,79284,79287,79290,79293,79296,79299,79302,79305,79308,79311,79314,79317],{"className":79225},[4667],[78,79227,2949],{"className":79228},[4667],[78,79230],{"className":79231,"style":4740},[4739],[78,79233,41631],{"className":79234},[4744],[78,79236],{"className":79237,"style":4740},[4739],[78,79239,79241,79244],{"className":79240},[4667],[78,79242,78947],{"className":79243},[4667,4678],[78,79245,79247],{"className":79246},[4689],[78,79248,79250,79270],{"className":79249},[4693,4694],[78,79251,79253,79267],{"className":79252},[4698],[78,79254,79256],{"className":79255,"style":63412},[4702],[78,79257,79258,79261],{"style":4706},[78,79259],{"className":79260,"style":4711},[4710],[78,79262,79264],{"className":79263},[4715,4716,4717,4718],[78,79265,17143],{"className":79266},[4667,4678,4718],[78,79268,4726],{"className":79269},[4725],[78,79271,79273],{"className":79272},[4698],[78,79274,79276],{"className":79275,"style":4733},[4702],[78,79277],{},[78,79279,4594],{"className":79280},[4674],[78,79282,4598],{"className":79283},[4667,4678],[78,79285,4604],{"className":79286},[4682],[78,79288],{"className":79289,"style":4740},[4739],[78,79291,41631],{"className":79292},[4744],[78,79294],{"className":79295,"style":4740},[4739],[78,79297,469],{"className":79298},[4667],[78,79300,2066],{"className":79301},[5126],[78,79303],{"className":79304,"style":4839},[4739],[78,79306,55499],{"className":79307},[4667,6184],[78,79309,17143],{"className":79310},[4667,4678],[78,79312,79018],{"className":79313},[4667,6184],[78,79315,17143],{"className":79316},[4667,4678],[78,79318,79023],{"className":79319},[4667,6184],[78,79321,79322,79325],{"style":56444},[78,79323],{"className":79324,"style":56145},[4710],[78,79326,79328,79331,79334,79337,79340,79343,79346,79388,79391],{"className":79327},[4667],[78,79329,2949],{"className":79330},[4667],[78,79332,2066],{"className":79333},[5126],[78,79335],{"className":79336,"style":4839},[4739],[78,79338,55499],{"className":79339},[4667,6184],[78,79341,4598],{"className":79342},[4667,4678],[78,79344],{"className":79345,"style":4740},[4739],[78,79347,79349,79355],{"className":79348},[4744],[78,79350,79352],{"className":79351},[4667],[78,79353,63351],{"className":79354},[4744],[78,79356,79359],{"className":79357},[4667,79358],"vbox",[78,79360,79363],{"className":79361},[79362],"thinbox",[78,79364,79367,79370,79384],{"className":79365},[79366],"llap",[78,79368],{"className":79369,"style":4663},[4662],[78,79371,79374],{"className":79372},[79373],"inner",[78,79375,79377,79380],{"className":79376},[4667],[78,79378,7102],{"className":79379},[4667],[78,79381],{"className":79382,"style":79383},[4739],"margin-right:0.0556em;",[78,79385],{"className":79386},[79387],"fix",[78,79389],{"className":79390,"style":4740},[4739],[78,79392,17143],{"className":79393},[4667,4678],[78,79395,4726],{"className":79396},[4725],[78,79398,79400],{"className":79399},[4698],[78,79401,79403],{"className":79402,"style":56564},[4702],[78,79404],{},[78,79406],{"className":79407},[4682,4761],[23289,79409],{},[7759,79411,79413],{"id":79412},"_3模糊集合的几何图示p172","3、模糊集合的几何图示（P172）",[13,79415,79416],{},"详细见书P172。",[23289,79418],{},[7759,79420,79422],{"id":79421},"_4模糊集合的基本运算p174","4、模糊集合的基本运算（P174）",[10548,79424,79426],{"id":79425},"_1相关运算的定义","（1）相关运算的定义",[78,79428,79431],{"className":79429,"title":79430,"style":26001},[25999],"ParseError: KaTeX parse error: Got function '\\overline' with no arguments as subscript at position 408: …rightarrow \\mu_\\̲o̲v̲e̲r̲l̲i̲n̲e̲{A}(x) = 1 - \\m…",[78,79432,79434],{"className":79433},[6184],"相等：  A = B \\Leftrightarrow \\mu_A(x) = \\mu_B(x) \\\\\n包含：  A \\subseteq B \\Leftrightarrow \\mu_A(x) \\leq \\mu_B(x) \\\\\n交集：  C = A \\cap B \\Leftrightarrow \\mu_A(x) = min(\\mu_A(x), \\mu_B(x)) = \\mu_A(x) \\land \\mu_A(x) \\\\\n其中,“\\land”为Zadeh算子，表示“取最小值”运算 \\\\\n并集：  C = A \\cup B \\Leftrightarrow \\mu_A(x) = max(\\mu_A(x), \\mu_B(x)) = \\mu_A(x) \\lor \\mu_B(x) \\\\\n其中,“\\lor”为Zadeh算子，表示“最大”运算 \\\\\n补集：  \\overline{A} \\Leftrightarrow \\mu_\\overline{A}(x) = 1 - \\mu_A(x) \\\\\n代数集： 模糊集的代数集，记为AB，其隶属度函数定义为 \\mu_{AB} = \\mu_A \\mu_B \\\\\n代数和：模糊集A、B的代数和，记为A⊕B，其隶属度函数定义为 \\mu_{A⊕B} = \\mu_A + \\mu_B - \\mu_{AB} \\\\\n绝对差：模糊集A、B的代数差，以|A - B|表示，其隶属度函数定义为\\mu_{|A-B|} = \\mu_A - \\mu_B",[10548,79436,79438],{"id":79437},"_2基本定律","（2）基本定律",[78,79440,79442],{"className":79441},[4566],[78,79443,79445,79873],{"className":79444},[4570],[78,79446,79448],{"className":79447},[4574],[4576,79449,79450],{"xmlns":4578,"display":4579},[4581,79451,79452,79870],{},[4584,79453,79454,79457,79459,79461,79463,79465,79467,79469,79472,79474,79477,79479,79481,79483,79485,79488,79490,79492,79494,79496,79498,79500,79502,79504,79506,79508,79510,79512,79514,79516,79518,79520,79522,79524,79526,79528,79530,79532,79534,79536,79538,79540,79542,79544,79546,79548,79550,79552,79554,79557,79559,79561,79563,79565,79567,79569,79571,79573,79575,79577,79579,79581,79583,79585,79587,79589,79591,79594,79596,79598,79600,79602,79604,79606,79608,79610,79612,79614,79616,79618,79620,79622,79624,79626,79628,79630,79632,79634,79636,79638,79640,79642,79644,79646,79648,79650,79652,79654,79656,79658,79660,79662,79664,79666,79668,79670,79672,79674,79676,79679,79681,79683,79686,79688,79690,79692,79694,79696,79698,79700,79702,79704,79706,79709,79711,79713,79715,79717,79719,79721,79723,79725,79727,79729,79731,79733,79735,79738,79740,79742,79744,79746,79748,79750,79752,79754,79756,79758,79760,79762,79764,79766,79768,79770,79772,79774,79776,79778,79780,79783,79785,79788,79802,79804,79810,79812,79818,79820,79823,79835,79837,79843,79845,79851,79853,79856,79866,79868],{},[4587,79455,79456],{},"幂等律：",[4596,79458,17143],{},[4591,79460,63356],{},[4596,79462,17143],{},[4591,79464,4609],{},[4596,79466,17143],{},[4739,79468],{"linebreak":52940},[4587,79470,79471],{},"             ",[4596,79473,17143],{},[4591,79475,79476],{},"∪",[4596,79478,17143],{},[4591,79480,4609],{},[4596,79482,17143],{},[4739,79484],{"linebreak":52940},[4587,79486,79487],{},"结合律：",[4596,79489,17143],{},[4591,79491,63356],{},[4591,79493,4594],{"stretchy":4593},[4596,79495,17148],{},[4591,79497,63356],{},[4596,79499,43678],{},[4591,79501,4604],{"stretchy":4593},[4591,79503,4609],{},[4591,79505,4594],{"stretchy":4593},[4596,79507,17143],{},[4591,79509,63356],{},[4596,79511,17148],{},[4591,79513,4604],{"stretchy":4593},[4591,79515,63356],{},[4596,79517,43678],{},[4739,79519],{"linebreak":52940},[4587,79521,79471],{},[4596,79523,17143],{},[4591,79525,79476],{},[4591,79527,4594],{"stretchy":4593},[4596,79529,17148],{},[4591,79531,79476],{},[4596,79533,43678],{},[4591,79535,4604],{"stretchy":4593},[4591,79537,4609],{},[4591,79539,4594],{"stretchy":4593},[4596,79541,17143],{},[4591,79543,79476],{},[4596,79545,17148],{},[4591,79547,4604],{"stretchy":4593},[4591,79549,79476],{},[4596,79551,43678],{},[4739,79553],{"linebreak":52940},[4587,79555,79556],{},"交换律：",[4596,79558,17143],{},[4591,79560,63356],{},[4596,79562,17148],{},[4591,79564,4609],{},[4596,79566,17148],{},[4591,79568,63356],{},[4596,79570,17143],{},[4739,79572],{"linebreak":52940},[4587,79574,79471],{},[4596,79576,17143],{},[4591,79578,79476],{},[4596,79580,17148],{},[4591,79582,4609],{},[4596,79584,17148],{},[4591,79586,79476],{},[4596,79588,17143],{},[4739,79590],{"linebreak":52940},[4587,79592,79593],{},"分配律：",[4596,79595,17143],{},[4591,79597,63356],{},[4591,79599,4594],{"stretchy":4593},[4596,79601,17148],{},[4591,79603,79476],{},[4596,79605,43678],{},[4591,79607,4604],{"stretchy":4593},[4591,79609,4609],{},[4591,79611,4594],{"stretchy":4593},[4596,79613,17143],{},[4591,79615,63356],{},[4596,79617,17148],{},[4591,79619,4604],{"stretchy":4593},[4591,79621,79476],{},[4591,79623,4594],{"stretchy":4593},[4596,79625,17143],{},[4591,79627,63356],{},[4596,79629,43678],{},[4591,79631,4604],{"stretchy":4593},[4739,79633],{"linebreak":52940},[4587,79635,79471],{},[4596,79637,17143],{},[4591,79639,79476],{},[4591,79641,4594],{"stretchy":4593},[4596,79643,17148],{},[4591,79645,63356],{},[4596,79647,43678],{},[4591,79649,4604],{"stretchy":4593},[4591,79651,4609],{},[4591,79653,4594],{"stretchy":4593},[4596,79655,17143],{},[4591,79657,79476],{},[4596,79659,17148],{},[4591,79661,4604],{"stretchy":4593},[4591,79663,63356],{},[4591,79665,4594],{"stretchy":4593},[4596,79667,17143],{},[4591,79669,79476],{},[4596,79671,43678],{},[4591,79673,4604],{"stretchy":4593},[4739,79675],{"linebreak":52940},[4587,79677,79678],{},"同一律：",[4596,79680,17143],{},[4591,79682,63356],{},[4596,79684,79685],{},"U",[4591,79687,4609],{},[4596,79689,17143],{},[4739,79691],{"linebreak":52940},[4587,79693,79471],{},[4596,79695,17143],{},[4591,79697,79476],{},[4596,79699,78487],{"mathvariant":7101},[4591,79701,4609],{},[4596,79703,17143],{},[4739,79705],{"linebreak":52940},[4587,79707,79708],{},"零一律：",[4596,79710,17143],{},[4591,79712,79476],{},[4596,79714,79685],{},[4591,79716,4609],{},[4596,79718,79685],{},[4739,79720],{"linebreak":52940},[4587,79722,79471],{},[4596,79724,17143],{},[4591,79726,63356],{},[4596,79728,78487],{"mathvariant":7101},[4591,79730,4609],{},[4596,79732,78487],{"mathvariant":7101},[4739,79734],{"linebreak":52940},[4587,79736,79737],{},"吸收律：",[4596,79739,17143],{},[4591,79741,63356],{},[4591,79743,4594],{"stretchy":4593},[4596,79745,17143],{},[4591,79747,79476],{},[4596,79749,17148],{},[4591,79751,4604],{"stretchy":4593},[4591,79753,4609],{},[4596,79755,17143],{},[4739,79757],{"linebreak":52940},[4587,79759,79471],{},[4596,79761,17143],{},[4591,79763,79476],{},[4591,79765,4594],{"stretchy":4593},[4596,79767,17143],{},[4591,79769,63356],{},[4596,79771,17148],{},[4591,79773,4604],{"stretchy":4593},[4591,79775,4609],{},[4596,79777,17143],{},[4739,79779],{"linebreak":52940},[4587,79781,79782],{},"德",[4591,79784,17848],{},[4587,79786,79787],{},"摩根律：",[79789,79790,79791,79799],"mover",{"accent":1419},[4584,79792,79793,79795,79797],{},[4596,79794,17143],{},[4591,79796,63356],{},[4596,79798,17148],{},[4591,79800,79801],{"stretchy":1419},"‾",[4591,79803,4609],{},[79789,79805,79806,79808],{"accent":1419},[4596,79807,17143],{},[4591,79809,79801],{"stretchy":1419},[4591,79811,79476],{},[79789,79813,79814,79816],{"accent":1419},[4596,79815,17148],{},[4591,79817,79801],{"stretchy":1419},[4739,79819],{"linebreak":52940},[4587,79821,79822],{},"                    ",[79789,79824,79825,79833],{"accent":1419},[4584,79826,79827,79829,79831],{},[4596,79828,17143],{},[4591,79830,79476],{},[4596,79832,17148],{},[4591,79834,79801],{"stretchy":1419},[4591,79836,4609],{},[79789,79838,79839,79841],{"accent":1419},[4596,79840,17143],{},[4591,79842,79801],{"stretchy":1419},[4591,79844,63356],{},[79789,79846,79847,79849],{"accent":1419},[4596,79848,17148],{},[4591,79850,79801],{"stretchy":1419},[4739,79852],{"linebreak":52940},[4587,79854,79855],{},"双重否定率：",[79789,79857,79858,79864],{"accent":1419},[79789,79859,79860,79862],{"accent":1419},[4596,79861,17143],{},[4591,79863,79801],{"stretchy":1419},[4591,79865,79801],{"stretchy":1419},[4591,79867,4609],{},[4596,79869,17143],{},[4647,79871,79872],{"encoding":4649},"幂等律： A \\cap A = A  \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup A = A \\\\\n结合律：A \\cap (B \\cap C) = (A \\cap B) \\cap C \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup (B \\cup C) = (A \\cup B) \\cup C \\\\\n交换律：A \\cap B = B \\cap A \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup B = B \\cup A \\\\\n分配律：A \\cap (B \\cup C) = (A \\cap B) \\cup (A \\cap C) \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup (B \\cap C) = (A \\cup B) \\cap (A \\cup C) \\\\\n同一律：A \\cap U = A \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup \\varnothing = A \\\\\n零一律：A \\cup U = U \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cap \\varnothing = \\varnothing \\\\\n吸收律：A \\cap (A \\cup B) = A \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ A \\cup (A \\cap B) = A \\\\\n德-摩根律：\\overline{A \\cap B} = \\overline{A} \\cup \\overline{B} \\\\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\overline{A \\cup B} = \\overline{A} \\cap \\overline{B} \\\\\n双重否定率：\\overline{\\overline A} = A",[78,79874,79876,79897,79915,79924,79927,79985,80003,80012,80015,80036,80057,80078,80099,80120,80129,80132,80189,80210,80231,80252,80273,80282,80285,80306,80324,80342,80351,80354,80411,80429,80447,80456,80459,80480,80501,80522,80543,80564,80585,80597,80600,80657,80678,80699,80720,80741,80762,80774,80777,80798,80817,80826,80829,80886,80905,80914,80917,80938,80956,80965,80968,81025,81043,81052,81055,81076,81097,81118,81127,81130,81187,81208,81229,81238,81241,81259,81324,81370,81407,81410,81528,81574,81611,81614,81693],{"className":79875,"ariaHidden":1419},[4654],[78,79877,79879,79882,79885,79888,79891,79894],{"className":79878},[4658],[78,79880],{"className":79881,"style":18224},[4662],[78,79883,79456],{"className":79884},[4667,6184],[78,79886,17143],{"className":79887},[4667,4678],[78,79889],{"className":79890,"style":5143},[4739],[78,79892,63356],{"className":79893},[7450],[78,79895],{"className":79896,"style":5143},[4739],[78,79898,79900,79903,79906,79909,79912],{"className":79899},[4658],[78,79901],{"className":79902,"style":18224},[4662],[78,79904,17143],{"className":79905},[4667,4678],[78,79907],{"className":79908,"style":4740},[4739],[78,79910,4609],{"className":79911},[4744],[78,79913],{"className":79914,"style":4740},[4739],[78,79916,79918,79921],{"className":79917},[4658],[78,79919],{"className":79920,"style":18224},[4662],[78,79922,17143],{"className":79923},[4667,4678],[78,79925],{"className":79926},[4739,52940],[78,79928,79930,79933,79937,79940,79943,79946,79949,79952,79955,79958,79961,79964,79967,79970,79973,79976,79979,79982],{"className":79929},[4658],[78,79931],{"className":79932,"style":18224},[4662],[78,79934,79936],{"className":79935},[4739]," ",[78,79938,79936],{"className":79939},[4739],[78,79941,79936],{"className":79942},[4739],[78,79944,79936],{"className":79945},[4739],[78,79947,79936],{"className":79948},[4739],[78,79950,79936],{"className":79951},[4739],[78,79953,79936],{"className":79954},[4739],[78,79956,79936],{"className":79957},[4739],[78,79959,79936],{"className":79960},[4739],[78,79962,79936],{"className":79963},[4739],[78,79965,79936],{"className":79966},[4739],[78,79968,79936],{"className":79969},[4739],[78,79971,79936],{"className":79972},[4739],[78,79974,17143],{"className":79975},[4667,4678],[78,79977],{"className":79978,"style":5143},[4739],[78,79980,79476],{"className":79981},[7450],[78,79983],{"className":79984,"style":5143},[4739],[78,79986,79988,79991,79994,79997,80000],{"className":79987},[4658],[78,79989],{"className":79990,"style":18224},[4662],[78,79992,17143],{"className":79993},[4667,4678],[78,79995],{"className":79996,"style":4740},[4739],[78,79998,4609],{"className":79999},[4744],[78,80001],{"className":80002,"style":4740},[4739],[78,80004,80006,80009],{"className":80005},[4658],[78,80007],{"className":80008,"style":18224},[4662],[78,80010,17143],{"className":80011},[4667,4678],[78,80013],{"className":80014},[4739,52940],[78,80016,80018,80021,80024,80027,80030,80033],{"className":80017},[4658],[78,80019],{"className":80020,"style":18224},[4662],[78,80022,79487],{"className":80023},[4667,6184],[78,80025,17143],{"className":80026},[4667,4678],[78,80028],{"className":80029,"style":5143},[4739],[78,80031,63356],{"className":80032},[7450],[78,80034],{"className":80035,"style":5143},[4739],[78,80037,80039,80042,80045,80048,80051,80054],{"className":80038},[4658],[78,80040],{"className":80041,"style":4663},[4662],[78,80043,4594],{"className":80044},[4674],[78,80046,17148],{"className":80047,"style":17276},[4667,4678],[78,80049],{"className":80050,"style":5143},[4739],[78,80052,63356],{"className":80053},[7450],[78,80055],{"className":80056,"style":5143},[4739],[78,80058,80060,80063,80066,80069,80072,80075],{"className":80059},[4658],[78,80061],{"className":80062,"style":4663},[4662],[78,80064,43678],{"className":80065,"style":5133},[4667,4678],[78,80067,4604],{"className":80068},[4682],[78,80070],{"className":80071,"style":4740},[4739],[78,80073,4609],{"className":80074},[4744],[78,80076],{"className":80077,"style":4740},[4739],[78,80079,80081,80084,80087,80090,80093,80096],{"className":80080},[4658],[78,80082],{"className":80083,"style":4663},[4662],[78,80085,4594],{"className":80086},[4674],[78,80088,17143],{"className":80089},[4667,4678],[78,80091],{"className":80092,"style":5143},[4739],[78,80094,63356],{"className":80095},[7450],[78,80097],{"className":80098,"style":5143},[4739],[78,80100,80102,80105,80108,80111,80114,80117],{"className":80101},[4658],[78,80103],{"className":80104,"style":4663},[4662],[78,80106,17148],{"className":80107,"style":17276},[4667,4678],[78,80109,4604],{"className":80110},[4682],[78,80112],{"className":80113,"style":5143},[4739],[78,80115,63356],{"className":80116},[7450],[78,80118],{"className":80119,"style":5143},[4739],[78,80121,80123,80126],{"className":80122},[4658],[78,80124],{"className":80125,"style":18224},[4662],[78,80127,43678],{"className":80128,"style":5133},[4667,4678],[78,80130],{"className":80131},[4739,52940],[78,80133,80135,80138,80141,80144,80147,80150,80153,80156,80159,80162,80165,80168,80171,80174,80177,80180,80183,80186],{"className":80134},[4658],[78,80136],{"className":80137,"style":18224},[4662],[78,80139,79936],{"className":80140},[4739],[78,80142,79936],{"className":80143},[4739],[78,80145,79936],{"className":80146},[4739],[78,80148,79936],{"className":80149},[4739],[78,80151,79936],{"className":80152},[4739],[78,80154,79936],{"className":80155},[4739],[78,80157,79936],{"className":80158},[4739],[78,80160,79936],{"className":80161},[4739],[78,80163,79936],{"className":80164},[4739],[78,80166,79936],{"className":80167},[4739],[78,80169,79936],{"className":80170},[4739],[78,80172,79936],{"className":80173},[4739],[78,80175,79936],{"className":80176},[4739],[78,80178,17143],{"className":80179},[4667,4678],[78,80181],{"className":80182,"style":5143},[4739],[78,80184,79476],{"className":80185},[7450],[78,80187],{"className":80188,"style":5143},[4739],[78,80190,80192,80195,80198,80201,80204,80207],{"className":80191},[4658],[78,80193],{"className":80194,"style":4663},[4662],[78,80196,4594],{"className":80197},[4674],[78,80199,17148],{"className":80200,"style":17276},[4667,4678],[78,80202],{"className":80203,"style":5143},[4739],[78,80205,79476],{"className":80206},[7450],[78,80208],{"className":80209,"style":5143},[4739],[78,80211,80213,80216,80219,80222,80225,80228],{"className":80212},[4658],[78,80214],{"className":80215,"style":4663},[4662],[78,80217,43678],{"className":80218,"style":5133},[4667,4678],[78,80220,4604],{"className":80221},[4682],[78,80223],{"className":80224,"style":4740},[4739],[78,80226,4609],{"className":80227},[4744],[78,80229],{"className":80230,"style":4740},[4739],[78,80232,80234,80237,80240,80243,80246,80249],{"className":80233},[4658],[78,80235],{"className":80236,"style":4663},[4662],[78,80238,4594],{"className":80239},[4674],[78,80241,17143],{"className":80242},[4667,4678],[78,80244],{"className":80245,"style":5143},[4739],[78,80247,79476],{"className":80248},[7450],[78,80250],{"className":80251,"style":5143},[4739],[78,80253,80255,80258,80261,80264,80267,80270],{"className":80254},[4658],[78,80256],{"className":80257,"style":4663},[4662],[78,80259,17148],{"className":80260,"style":17276},[4667,4678],[78,80262,4604],{"className":80263},[4682],[78,80265],{"className":80266,"style":5143},[4739],[78,80268,79476],{"className":80269},[7450],[78,80271],{"className":80272,"style":5143},[4739],[78,80274,80276,80279],{"className":80275},[4658],[78,80277],{"className":80278,"style":18224},[4662],[78,80280,43678],{"className":80281,"style":5133},[4667,4678],[78,80283],{"className":80284},[4739,52940],[78,80286,80288,80291,80294,80297,80300,80303],{"className":80287},[4658],[78,80289],{"className":80290,"style":18224},[4662],[78,80292,79556],{"className":80293},[4667,6184],[78,80295,17143],{"className":80296},[4667,4678],[78,80298],{"className":80299,"style":5143},[4739],[78,80301,63356],{"className":80302},[7450],[78,80304],{"className":80305,"style":5143},[4739],[78,80307,80309,80312,80315,80318,80321],{"className":80308},[4658],[78,80310],{"className":80311,"style":18224},[4662],[78,80313,17148],{"className":80314,"style":17276},[4667,4678],[78,80316],{"className":80317,"style":4740},[4739],[78,80319,4609],{"className":80320},[4744],[78,80322],{"className":80323,"style":4740},[4739],[78,80325,80327,80330,80333,80336,80339],{"className":80326},[4658],[78,80328],{"className":80329,"style":18224},[4662],[78,80331,17148],{"className":80332,"style":17276},[4667,4678],[78,80334],{"className":80335,"style":5143},[4739],[78,80337,63356],{"className":80338},[7450],[78,80340],{"className":80341,"style":5143},[4739],[78,80343,80345,80348],{"className":80344},[4658],[78,80346],{"className":80347,"style":18224},[4662],[78,80349,17143],{"className":80350},[4667,4678],[78,80352],{"className":80353},[4739,52940],[78,80355,80357,80360,80363,80366,80369,80372,80375,80378,80381,80384,80387,80390,80393,80396,80399,80402,80405,80408],{"className":80356},[4658],[78,80358],{"className":80359,"style":18224},[4662],[78,80361,79936],{"className":80362},[4739],[78,80364,79936],{"className":80365},[4739],[78,80367,79936],{"className":80368},[4739],[78,80370,79936],{"className":80371},[4739],[78,80373,79936],{"className":80374},[4739],[78,80376,79936],{"className":80377},[4739],[78,80379,79936],{"className":80380},[4739],[78,80382,79936],{"className":80383},[4739],[78,80385,79936],{"className":80386},[4739],[78,80388,79936],{"className":80389},[4739],[78,80391,79936],{"className":80392},[4739],[78,80394,79936],{"className":80395},[4739],[78,80397,79936],{"className":80398},[4739],[78,80400,17143],{"className":80401},[4667,4678],[78,80403],{"className":80404,"style":5143},[4739],[78,80406,79476],{"className":80407},[7450],[78,80409],{"className":80410,"style":5143},[4739],[78,80412,80414,80417,80420,80423,80426],{"className":80413},[4658],[78,80415],{"className":80416,"style":18224},[4662],[78,80418,17148],{"className":80419,"style":17276},[4667,4678],[78,80421],{"className":80422,"style":4740},[4739],[78,80424,4609],{"className":80425},[4744],[78,80427],{"className":80428,"style":4740},[4739],[78,80430,80432,80435,80438,80441,80444],{"className":80431},[4658],[78,80433],{"className":80434,"style":18224},[4662],[78,80436,17148],{"className":80437,"style":17276},[4667,4678],[78,80439],{"className":80440,"style":5143},[4739],[78,80442,79476],{"className":80443},[7450],[78,80445],{"className":80446,"style":5143},[4739],[78,80448,80450,80453],{"className":80449},[4658],[78,80451],{"className":80452,"style":18224},[4662],[78,80454,17143],{"className":80455},[4667,4678],[78,80457],{"className":80458},[4739,52940],[78,80460,80462,80465,80468,80471,80474,80477],{"className":80461},[4658],[78,80463],{"className":80464,"style":18224},[4662],[78,80466,79593],{"className":80467},[4667,6184],[78,80469,17143],{"className":80470},[4667,4678],[78,80472],{"className":80473,"style":5143},[4739],[78,80475,63356],{"className":80476},[7450],[78,80478],{"className":80479,"style":5143},[4739],[78,80481,80483,80486,80489,80492,80495,80498],{"className":80482},[4658],[78,80484],{"className":80485,"style":4663},[4662],[78,80487,4594],{"className":80488},[4674],[78,80490,17148],{"className":80491,"style":17276},[4667,4678],[78,80493],{"className":80494,"style":5143},[4739],[78,80496,79476],{"className":80497},[7450],[78,80499],{"className":80500,"style":5143},[4739],[78,80502,80504,80507,80510,80513,80516,80519],{"className":80503},[4658],[78,80505],{"className":80506,"style":4663},[4662],[78,80508,43678],{"className":80509,"style":5133},[4667,4678],[78,80511,4604],{"className":80512},[4682],[78,80514],{"className":80515,"style":4740},[4739],[78,80517,4609],{"className":80518},[4744],[78,80520],{"className":80521,"style":4740},[4739],[78,80523,80525,80528,80531,80534,80537,80540],{"className":80524},[4658],[78,80526],{"className":80527,"style":4663},[4662],[78,80529,4594],{"className":80530},[4674],[78,80532,17143],{"className":80533},[4667,4678],[78,80535],{"className":80536,"style":5143},[4739],[78,80538,63356],{"className":80539},[7450],[78,80541],{"className":80542,"style":5143},[4739],[78,80544,80546,80549,80552,80555,80558,80561],{"className":80545},[4658],[78,80547],{"className":80548,"style":4663},[4662],[78,80550,17148],{"className":80551,"style":17276},[4667,4678],[78,80553,4604],{"className":80554},[4682],[78,80556],{"className":80557,"style":5143},[4739],[78,80559,79476],{"className":80560},[7450],[78,80562],{"className":80563,"style":5143},[4739],[78,80565,80567,80570,80573,80576,80579,80582],{"className":80566},[4658],[78,80568],{"className":80569,"style":4663},[4662],[78,80571,4594],{"className":80572},[4674],[78,80574,17143],{"className":80575},[4667,4678],[78,80577],{"className":80578,"style":5143},[4739],[78,80580,63356],{"className":80581},[7450],[78,80583],{"className":80584,"style":5143},[4739],[78,80586,80588,80591,80594],{"className":80587},[4658],[78,80589],{"className":80590,"style":4663},[4662],[78,80592,43678],{"className":80593,"style":5133},[4667,4678],[78,80595,4604],{"className":80596},[4682],[78,80598],{"className":80599},[4739,52940],[78,80601,80603,80606,80609,80612,80615,80618,80621,80624,80627,80630,80633,80636,80639,80642,80645,80648,80651,80654],{"className":80602},[4658],[78,80604],{"className":80605,"style":18224},[4662],[78,80607,79936],{"className":80608},[4739],[78,80610,79936],{"className":80611},[4739],[78,80613,79936],{"className":80614},[4739],[78,80616,79936],{"className":80617},[4739],[78,80619,79936],{"className":80620},[4739],[78,80622,79936],{"className":80623},[4739],[78,80625,79936],{"className":80626},[4739],[78,80628,79936],{"className":80629},[4739],[78,80631,79936],{"className":80632},[4739],[78,80634,79936],{"className":80635},[4739],[78,80637,79936],{"className":80638},[4739],[78,80640,79936],{"className":80641},[4739],[78,80643,79936],{"className":80644},[4739],[78,80646,17143],{"className":80647},[4667,4678],[78,80649],{"className":80650,"style":5143},[4739],[78,80652,79476],{"className":80653},[7450],[78,80655],{"className":80656,"style":5143},[4739],[78,80658,80660,80663,80666,80669,80672,80675],{"className":80659},[4658],[78,80661],{"className":80662,"style":4663},[4662],[78,80664,4594],{"className":80665},[4674],[78,80667,17148],{"className":80668,"style":17276},[4667,4678],[78,80670],{"className":80671,"style":5143},[4739],[78,80673,63356],{"className":80674},[7450],[78,80676],{"className":80677,"style":5143},[4739],[78,80679,80681,80684,80687,80690,80693,80696],{"className":80680},[4658],[78,80682],{"className":80683,"style":4663},[4662],[78,80685,43678],{"className":80686,"style":5133},[4667,4678],[78,80688,4604],{"className":80689},[4682],[78,80691],{"className":80692,"style":4740},[4739],[78,80694,4609],{"className":80695},[4744],[78,80697],{"className":80698,"style":4740},[4739],[78,80700,80702,80705,80708,80711,80714,80717],{"className":80701},[4658],[78,80703],{"className":80704,"style":4663},[4662],[78,80706,4594],{"className":80707},[4674],[78,80709,17143],{"className":80710},[4667,4678],[78,80712],{"className":80713,"style":5143},[4739],[78,80715,79476],{"className":80716},[7450],[78,80718],{"className":80719,"style":5143},[4739],[78,80721,80723,80726,80729,80732,80735,80738],{"className":80722},[4658],[78,80724],{"className":80725,"style":4663},[4662],[78,80727,17148],{"className":80728,"style":17276},[4667,4678],[78,80730,4604],{"className":80731},[4682],[78,80733],{"className":80734,"style":5143},[4739],[78,80736,63356],{"className":80737},[7450],[78,80739],{"className":80740,"style":5143},[4739],[78,80742,80744,80747,80750,80753,80756,80759],{"className":80743},[4658],[78,80745],{"className":80746,"style":4663},[4662],[78,80748,4594],{"className":80749},[4674],[78,80751,17143],{"className":80752},[4667,4678],[78,80754],{"className":80755,"style":5143},[4739],[78,80757,79476],{"className":80758},[7450],[78,80760],{"className":80761,"style":5143},[4739],[78,80763,80765,80768,80771],{"className":80764},[4658],[78,80766],{"className":80767,"style":4663},[4662],[78,80769,43678],{"className":80770,"style":5133},[4667,4678],[78,80772,4604],{"className":80773},[4682],[78,80775],{"className":80776},[4739,52940],[78,80778,80780,80783,80786,80789,80792,80795],{"className":80779},[4658],[78,80781],{"className":80782,"style":18224},[4662],[78,80784,79678],{"className":80785},[4667,6184],[78,80787,17143],{"className":80788},[4667,4678],[78,80790],{"className":80791,"style":5143},[4739],[78,80793,63356],{"className":80794},[7450],[78,80796],{"className":80797,"style":5143},[4739],[78,80799,80801,80804,80808,80811,80814],{"className":80800},[4658],[78,80802],{"className":80803,"style":18224},[4662],[78,80805,79685],{"className":80806,"style":80807},[4667,4678],"margin-right:0.109em;",[78,80809],{"className":80810,"style":4740},[4739],[78,80812,4609],{"className":80813},[4744],[78,80815],{"className":80816,"style":4740},[4739],[78,80818,80820,80823],{"className":80819},[4658],[78,80821],{"className":80822,"style":18224},[4662],[78,80824,17143],{"className":80825},[4667,4678],[78,80827],{"className":80828},[4739,52940],[78,80830,80832,80835,80838,80841,80844,80847,80850,80853,80856,80859,80862,80865,80868,80871,80874,80877,80880,80883],{"className":80831},[4658],[78,80833],{"className":80834,"style":18224},[4662],[78,80836,79936],{"className":80837},[4739],[78,80839,79936],{"className":80840},[4739],[78,80842,79936],{"className":80843},[4739],[78,80845,79936],{"className":80846},[4739],[78,80848,79936],{"className":80849},[4739],[78,80851,79936],{"className":80852},[4739],[78,80854,79936],{"className":80855},[4739],[78,80857,79936],{"className":80858},[4739],[78,80860,79936],{"className":80861},[4739],[78,80863,79936],{"className":80864},[4739],[78,80866,79936],{"className":80867},[4739],[78,80869,79936],{"className":80870},[4739],[78,80872,79936],{"className":80873},[4739],[78,80875,17143],{"className":80876},[4667,4678],[78,80878],{"className":80879,"style":5143},[4739],[78,80881,79476],{"className":80882},[7450],[78,80884],{"className":80885,"style":5143},[4739],[78,80887,80889,80893,80896,80899,80902],{"className":80888},[4658],[78,80890],{"className":80891,"style":80892},[4662],"height:0.6633em;vertical-align:-0.0817em;",[78,80894,78487],{"className":80895},[4667,78626],[78,80897],{"className":80898,"style":4740},[4739],[78,80900,4609],{"className":80901},[4744],[78,80903],{"className":80904,"style":4740},[4739],[78,80906,80908,80911],{"className":80907},[4658],[78,80909],{"className":80910,"style":18224},[4662],[78,80912,17143],{"className":80913},[4667,4678],[78,80915],{"className":80916},[4739,52940],[78,80918,80920,80923,80926,80929,80932,80935],{"className":80919},[4658],[78,80921],{"className":80922,"style":18224},[4662],[78,80924,79708],{"className":80925},[4667,6184],[78,80927,17143],{"className":80928},[4667,4678],[78,80930],{"className":80931,"style":5143},[4739],[78,80933,79476],{"className":80934},[7450],[78,80936],{"className":80937,"style":5143},[4739],[78,80939,80941,80944,80947,80950,80953],{"className":80940},[4658],[78,80942],{"className":80943,"style":18224},[4662],[78,80945,79685],{"className":80946,"style":80807},[4667,4678],[78,80948],{"className":80949,"style":4740},[4739],[78,80951,4609],{"className":80952},[4744],[78,80954],{"className":80955,"style":4740},[4739],[78,80957,80959,80962],{"className":80958},[4658],[78,80960],{"className":80961,"style":18224},[4662],[78,80963,79685],{"className":80964,"style":80807},[4667,4678],[78,80966],{"className":80967},[4739,52940],[78,80969,80971,80974,80977,80980,80983,80986,80989,80992,80995,80998,81001,81004,81007,81010,81013,81016,81019,81022],{"className":80970},[4658],[78,80972],{"className":80973,"style":18224},[4662],[78,80975,79936],{"className":80976},[4739],[78,80978,79936],{"className":80979},[4739],[78,80981,79936],{"className":80982},[4739],[78,80984,79936],{"className":80985},[4739],[78,80987,79936],{"className":80988},[4739],[78,80990,79936],{"className":80991},[4739],[78,80993,79936],{"className":80994},[4739],[78,80996,79936],{"className":80997},[4739],[78,80999,79936],{"className":81000},[4739],[78,81002,79936],{"className":81003},[4739],[78,81005,79936],{"className":81006},[4739],[78,81008,79936],{"className":81009},[4739],[78,81011,79936],{"className":81012},[4739],[78,81014,17143],{"className":81015},[4667,4678],[78,81017],{"className":81018,"style":5143},[4739],[78,81020,63356],{"className":81021},[7450],[78,81023],{"className":81024,"style":5143},[4739],[78,81026,81028,81031,81034,81037,81040],{"className":81027},[4658],[78,81029],{"className":81030,"style":80892},[4662],[78,81032,78487],{"className":81033},[4667,78626],[78,81035],{"className":81036,"style":4740},[4739],[78,81038,4609],{"className":81039},[4744],[78,81041],{"className":81042,"style":4740},[4739],[78,81044,81046,81049],{"className":81045},[4658],[78,81047],{"className":81048,"style":80892},[4662],[78,81050,78487],{"className":81051},[4667,78626],[78,81053],{"className":81054},[4739,52940],[78,81056,81058,81061,81064,81067,81070,81073],{"className":81057},[4658],[78,81059],{"className":81060,"style":18224},[4662],[78,81062,79737],{"className":81063},[4667,6184],[78,81065,17143],{"className":81066},[4667,4678],[78,81068],{"className":81069,"style":5143},[4739],[78,81071,63356],{"className":81072},[7450],[78,81074],{"className":81075,"style":5143},[4739],[78,81077,81079,81082,81085,81088,81091,81094],{"className":81078},[4658],[78,81080],{"className":81081,"style":4663},[4662],[78,81083,4594],{"className":81084},[4674],[78,81086,17143],{"className":81087},[4667,4678],[78,81089],{"className":81090,"style":5143},[4739],[78,81092,79476],{"className":81093},[7450],[78,81095],{"className":81096,"style":5143},[4739],[78,81098,81100,81103,81106,81109,81112,81115],{"className":81099},[4658],[78,81101],{"className":81102,"style":4663},[4662],[78,81104,17148],{"className":81105,"style":17276},[4667,4678],[78,81107,4604],{"className":81108},[4682],[78,81110],{"className":81111,"style":4740},[4739],[78,81113,4609],{"className":81114},[4744],[78,81116],{"className":81117,"style":4740},[4739],[78,81119,81121,81124],{"className":81120},[4658],[78,81122],{"className":81123,"style":18224},[4662],[78,81125,17143],{"className":81126},[4667,4678],[78,81128],{"className":81129},[4739,52940],[78,81131,81133,81136,81139,81142,81145,81148,81151,81154,81157,81160,81163,81166,81169,81172,81175,81178,81181,81184],{"className":81132},[4658],[78,81134],{"className":81135,"style":18224},[4662],[78,81137,79936],{"className":81138},[4739],[78,81140,79936],{"className":81141},[4739],[78,81143,79936],{"className":81144},[4739],[78,81146,79936],{"className":81147},[4739],[78,81149,79936],{"className":81150},[4739],[78,81152,79936],{"className":81153},[4739],[78,81155,79936],{"className":81156},[4739],[78,81158,79936],{"className":81159},[4739],[78,81161,79936],{"className":81162},[4739],[78,81164,79936],{"className":81165},[4739],[78,81167,79936],{"className":81168},[4739],[78,81170,79936],{"className":81171},[4739],[78,81173,79936],{"className":81174},[4739],[78,81176,17143],{"className":81177},[4667,4678],[78,81179],{"className":81180,"style":5143},[4739],[78,81182,79476],{"className":81183},[7450],[78,81185],{"className":81186,"style":5143},[4739],[78,81188,81190,81193,81196,81199,81202,81205],{"className":81189},[4658],[78,81191],{"className":81192,"style":4663},[4662],[78,81194,4594],{"className":81195},[4674],[78,81197,17143],{"className":81198},[4667,4678],[78,81200],{"className":81201,"style":5143},[4739],[78,81203,63356],{"className":81204},[7450],[78,81206],{"className":81207,"style":5143},[4739],[78,81209,81211,81214,81217,81220,81223,81226],{"className":81210},[4658],[78,81212],{"className":81213,"style":4663},[4662],[78,81215,17148],{"className":81216,"style":17276},[4667,4678],[78,81218,4604],{"className":81219},[4682],[78,81221],{"className":81222,"style":4740},[4739],[78,81224,4609],{"className":81225},[4744],[78,81227],{"className":81228,"style":4740},[4739],[78,81230,81232,81235],{"className":81231},[4658],[78,81233],{"className":81234,"style":18224},[4662],[78,81236,17143],{"className":81237},[4667,4678],[78,81239],{"className":81240},[4739,52940],[78,81242,81244,81247,81250,81253,81256],{"className":81243},[4658],[78,81245],{"className":81246,"style":63901},[4662],[78,81248,79782],{"className":81249},[4667,6184],[78,81251],{"className":81252,"style":5143},[4739],[78,81254,17848],{"className":81255},[7450],[78,81257],{"className":81258,"style":5143},[4739],[78,81260,81262,81266,81269,81315,81318,81321],{"className":81261},[4658],[78,81263],{"className":81264,"style":81265},[4662],"height:0.8833em;",[78,81267,79787],{"className":81268},[4667,6184],[78,81270,81273],{"className":81271},[4667,81272],"overline",[78,81274,81276],{"className":81275},[4693],[78,81277,81279],{"className":81278},[4698],[78,81280,81282,81305],{"className":81281,"style":81265},[4702],[78,81283,81284,81287],{"style":5824},[78,81285],{"className":81286,"style":4781},[4710],[78,81288,81290,81293,81296,81299,81302],{"className":81289},[4667],[78,81291,17143],{"className":81292},[4667,4678],[78,81294],{"className":81295,"style":5143},[4739],[78,81297,63356],{"className":81298},[7450],[78,81300],{"className":81301,"style":5143},[4739],[78,81303,17148],{"className":81304,"style":17276},[4667,4678],[78,81306,81308,81311],{"style":81307},"top:-3.8033em;",[78,81309],{"className":81310,"style":4781},[4710],[78,81312],{"className":81313,"style":4927},[81314],"overline-line",[78,81316],{"className":81317,"style":4740},[4739],[78,81319,4609],{"className":81320},[4744],[78,81322],{"className":81323,"style":4740},[4739],[78,81325,81327,81330,81361,81364,81367],{"className":81326},[4658],[78,81328],{"className":81329,"style":81265},[4662],[78,81331,81333],{"className":81332},[4667,81272],[78,81334,81336],{"className":81335},[4693],[78,81337,81339],{"className":81338},[4698],[78,81340,81342,81353],{"className":81341,"style":81265},[4702],[78,81343,81344,81347],{"style":5824},[78,81345],{"className":81346,"style":4781},[4710],[78,81348,81350],{"className":81349},[4667],[78,81351,17143],{"className":81352},[4667,4678],[78,81354,81355,81358],{"style":81307},[78,81356],{"className":81357,"style":4781},[4710],[78,81359],{"className":81360,"style":4927},[81314],[78,81362],{"className":81363,"style":5143},[4739],[78,81365,79476],{"className":81366},[7450],[78,81368],{"className":81369,"style":5143},[4739],[78,81371,81373,81376],{"className":81372},[4658],[78,81374],{"className":81375,"style":81265},[4662],[78,81377,81379],{"className":81378},[4667,81272],[78,81380,81382],{"className":81381},[4693],[78,81383,81385],{"className":81384},[4698],[78,81386,81388,81399],{"className":81387,"style":81265},[4702],[78,81389,81390,81393],{"style":5824},[78,81391],{"className":81392,"style":4781},[4710],[78,81394,81396],{"className":81395},[4667],[78,81397,17148],{"className":81398,"style":17276},[4667,4678],[78,81400,81401,81404],{"style":81307},[78,81402],{"className":81403,"style":4781},[4710],[78,81405],{"className":81406,"style":4927},[81314],[78,81408],{"className":81409},[4739,52940],[78,81411,81413,81416,81419,81422,81425,81428,81431,81434,81437,81440,81443,81446,81449,81452,81455,81458,81461,81464,81467,81470,81473,81476,81519,81522,81525],{"className":81412},[4658],[78,81414],{"className":81415,"style":81265},[4662],[78,81417,79936],{"className":81418},[4739],[78,81420,79936],{"className":81421},[4739],[78,81423,79936],{"className":81424},[4739],[78,81426,79936],{"className":81427},[4739],[78,81429,79936],{"className":81430},[4739],[78,81432,79936],{"className":81433},[4739],[78,81435,79936],{"className":81436},[4739],[78,81438,79936],{"className":81439},[4739],[78,81441,79936],{"className":81442},[4739],[78,81444,79936],{"className":81445},[4739],[78,81447,79936],{"className":81448},[4739],[78,81450,79936],{"className":81451},[4739],[78,81453,79936],{"className":81454},[4739],[78,81456,79936],{"className":81457},[4739],[78,81459,79936],{"className":81460},[4739],[78,81462,79936],{"className":81463},[4739],[78,81465,79936],{"className":81466},[4739],[78,81468,79936],{"className":81469},[4739],[78,81471,79936],{"className":81472},[4739],[78,81474,79936],{"className":81475},[4739],[78,81477,81479],{"className":81478},[4667,81272],[78,81480,81482],{"className":81481},[4693],[78,81483,81485],{"className":81484},[4698],[78,81486,81488,81511],{"className":81487,"style":81265},[4702],[78,81489,81490,81493],{"style":5824},[78,81491],{"className":81492,"style":4781},[4710],[78,81494,81496,81499,81502,81505,81508],{"className":81495},[4667],[78,81497,17143],{"className":81498},[4667,4678],[78,81500],{"className":81501,"style":5143},[4739],[78,81503,79476],{"className":81504},[7450],[78,81506],{"className":81507,"style":5143},[4739],[78,81509,17148],{"className":81510,"style":17276},[4667,4678],[78,81512,81513,81516],{"style":81307},[78,81514],{"className":81515,"style":4781},[4710],[78,81517],{"className":81518,"style":4927},[81314],[78,81520],{"className":81521,"style":4740},[4739],[78,81523,4609],{"className":81524},[4744],[78,81526],{"className":81527,"style":4740},[4739],[78,81529,81531,81534,81565,81568,81571],{"className":81530},[4658],[78,81532],{"className":81533,"style":81265},[4662],[78,81535,81537],{"className":81536},[4667,81272],[78,81538,81540],{"className":81539},[4693],[78,81541,81543],{"className":81542},[4698],[78,81544,81546,81557],{"className":81545,"style":81265},[4702],[78,81547,81548,81551],{"style":5824},[78,81549],{"className":81550,"style":4781},[4710],[78,81552,81554],{"className":81553},[4667],[78,81555,17143],{"className":81556},[4667,4678],[78,81558,81559,81562],{"style":81307},[78,81560],{"className":81561,"style":4781},[4710],[78,81563],{"className":81564,"style":4927},[81314],[78,81566],{"className":81567,"style":5143},[4739],[78,81569,63356],{"className":81570},[7450],[78,81572],{"className":81573,"style":5143},[4739],[78,81575,81577,81580],{"className":81576},[4658],[78,81578],{"className":81579,"style":81265},[4662],[78,81581,81583],{"className":81582},[4667,81272],[78,81584,81586],{"className":81585},[4693],[78,81587,81589],{"className":81588},[4698],[78,81590,81592,81603],{"className":81591,"style":81265},[4702],[78,81593,81594,81597],{"style":5824},[78,81595],{"className":81596,"style":4781},[4710],[78,81598,81600],{"className":81599},[4667],[78,81601,17148],{"className":81602,"style":17276},[4667,4678],[78,81604,81605,81608],{"style":81307},[78,81606],{"className":81607,"style":4781},[4710],[78,81609],{"className":81610,"style":4927},[81314],[78,81612],{"className":81613},[4739,52940],[78,81615,81617,81621,81624,81684,81687,81690],{"className":81616},[4658],[78,81618],{"className":81619,"style":81620},[4662],"height:1.0833em;",[78,81622,79855],{"className":81623},[4667,6184],[78,81625,81627],{"className":81626},[4667,81272],[78,81628,81630],{"className":81629},[4693],[78,81631,81633],{"className":81632},[4698],[78,81634,81636,81675],{"className":81635,"style":81620},[4702],[78,81637,81638,81641],{"style":5824},[78,81639],{"className":81640,"style":4781},[4710],[78,81642,81644],{"className":81643},[4667],[78,81645,81647],{"className":81646},[4667,81272],[78,81648,81650],{"className":81649},[4693],[78,81651,81653],{"className":81652},[4698],[78,81654,81656,81667],{"className":81655,"style":81265},[4702],[78,81657,81658,81661],{"style":5824},[78,81659],{"className":81660,"style":4781},[4710],[78,81662,81664],{"className":81663},[4667],[78,81665,17143],{"className":81666},[4667,4678],[78,81668,81669,81672],{"style":81307},[78,81670],{"className":81671,"style":4781},[4710],[78,81673],{"className":81674,"style":4927},[81314],[78,81676,81678,81681],{"style":81677},"top:-4.0033em;",[78,81679],{"className":81680,"style":4781},[4710],[78,81682],{"className":81683,"style":4927},[81314],[78,81685],{"className":81686,"style":4740},[4739],[78,81688,4609],{"className":81689},[4744],[78,81691],{"className":81692,"style":4740},[4739],[78,81694,81696,81699],{"className":81695},[4658],[78,81697],{"className":81698,"style":18224},[4662],[78,81700,17143],{"className":81701},[4667,4678],[10548,81703,81705],{"id":81704},"_3一些常用的算子","(3)一些常用的算子",[78,81707,81709],{"className":81708},[4566],[78,81710,81712,82281],{"className":81711},[4570],[78,81713,81715],{"className":81714},[4574],[4576,81716,81717],{"xmlns":4578,"display":4579},[4581,81718,81719,82278],{},[37085,81720,81721,81784,81824,81875,81903,81941,81969,82019,82059,82108,82136,82216],{"rowspacing":37087,"columnalign":37088,"columnspacing":37089},[37091,81722,81723,81752],{},[37094,81724,81725],{},[37101,81726,81727],{"scriptlevel":2949,"displaystyle":1419},[4584,81728,81729,81732,81734,81736,81738,81740,81743,81745,81747,81749],{},[4596,81730,81731],{},"Z",[4596,81733,5009],{},[4596,81735,5245],{},[4596,81737,4618],{},[4596,81739,26052],{},[4587,81741,81742],{},"算子（",[4591,81744,37170],{},[4587,81746,52816],{},[4591,81748,37210],{},[4587,81750,81751],{},"）：",[37094,81753,81754],{},[37101,81755,81756],{"scriptlevel":2949,"displaystyle":1419},[4584,81757,81758,81760,81762,81764,81766,81768,81770,81772,81774,81776,81778,81780,81782],{},[4584,81759],{},[4596,81761,5009],{},[4591,81763,37210],{},[4596,81765,12172],{},[4591,81767,4609],{},[4596,81769,5058],{},[4596,81771,5009],{},[4596,81773,4598],{},[4591,81775,55608],{"stretchy":4593},[4596,81777,5009],{},[4591,81779,2066],{"separator":1419},[4596,81781,12172],{},[4591,81783,63381],{"stretchy":4593},[37091,81785,81786,81792],{},[37094,81787,81788],{},[37101,81789,81790],{"scriptlevel":2949,"displaystyle":1419},[4584,81791],{},[37094,81793,81794],{},[37101,81795,81796],{"scriptlevel":2949,"displaystyle":1419},[4584,81797,81798,81800,81802,81804,81806,81808,81810,81812,81814,81816,81818,81820,81822],{},[4584,81799],{},[4596,81801,5009],{},[4591,81803,37170],{},[4596,81805,12172],{},[4591,81807,4609],{},[4596,81809,5058],{},[4596,81811,39],{},[4596,81813,19],{},[4591,81815,55608],{"stretchy":4593},[4596,81817,5009],{},[4591,81819,2066],{"separator":1419},[4596,81821,12172],{},[4591,81823,63381],{"stretchy":4593},[37091,81825,81826,81843],{},[37094,81827,81828],{},[37101,81829,81830],{"scriptlevel":2949,"displaystyle":1419},[4584,81831,81832,81835,81837,81839,81841],{},[4587,81833,81834],{},"取大、乘积算子（",[4591,81836,37210],{},[4587,81838,52816],{},[4591,81840,17162],{},[4587,81842,81751],{},[37094,81844,81845],{},[37101,81846,81847],{"scriptlevel":2949,"displaystyle":1419},[4584,81848,81849,81851,81853,81855,81857,81859,81861,81863,81865,81867,81869,81871,81873],{},[4584,81850],{},[4596,81852,5009],{},[4591,81854,37210],{},[4596,81856,12172],{},[4591,81858,4609],{},[4596,81860,5058],{},[4596,81862,5009],{},[4596,81864,4598],{},[4591,81866,55608],{"stretchy":4593},[4596,81868,5009],{},[4591,81870,2066],{"separator":1419},[4596,81872,12172],{},[4591,81874,63381],{"stretchy":4593},[37091,81876,81877,81883],{},[37094,81878,81879],{},[37101,81880,81881],{"scriptlevel":2949,"displaystyle":1419},[4584,81882],{},[37094,81884,81885],{},[37101,81886,81887],{"scriptlevel":2949,"displaystyle":1419},[4584,81888,81889,81891,81893,81895,81897,81899,81901],{},[4584,81890],{},[4596,81892,5009],{},[4591,81894,17162],{},[4596,81896,12172],{},[4591,81898,4609],{},[4596,81900,5009],{},[4596,81902,12172],{},[37091,81904,81905,81912],{},[37094,81906,81907],{},[37101,81908,81909],{"scriptlevel":2949,"displaystyle":1419},[4587,81910,81911],{},"环和、乘积算子（⨣，）：",[37094,81913,81914],{},[37101,81915,81916],{"scriptlevel":2949,"displaystyle":1419},[4584,81917,81918,81920,81922,81925,81927,81929,81931,81933,81935,81937,81939],{},[4584,81919],{},[4596,81921,5009],{},[4587,81923,81924],{},"⨣",[4596,81926,12172],{},[4591,81928,4609],{},[4596,81930,5009],{},[4591,81932,7351],{},[4596,81934,12172],{},[4591,81936,17848],{},[4596,81938,5009],{},[4596,81940,12172],{},[37091,81942,81943,81949],{},[37094,81944,81945],{},[37101,81946,81947],{"scriptlevel":2949,"displaystyle":1419},[4584,81948],{},[37094,81950,81951],{},[37101,81952,81953],{"scriptlevel":2949,"displaystyle":1419},[4584,81954,81955,81957,81959,81961,81963,81965,81967],{},[4584,81956],{},[4596,81958,5009],{},[4591,81960,17162],{},[4596,81962,12172],{},[4591,81964,4609],{},[4596,81966,5009],{},[4596,81968,12172],{},[37091,81970,81971,81989],{},[37094,81972,81973],{},[37101,81974,81975],{"scriptlevel":2949,"displaystyle":1419},[4584,81976,81977,81980,81983,81985,81987],{},[4587,81978,81979],{},"有界和、取小算子（",[4591,81981,81982],{},"⊕",[4587,81984,52816],{},[4591,81986,37170],{},[4587,81988,81751],{},[37094,81990,81991],{},[37101,81992,81993],{"scriptlevel":2949,"displaystyle":1419},[4584,81994,81995,81997,81999,82001,82003,82005,82007,82009,82011,82013,82015,82017],{},[4584,81996],{},[4596,81998,5009],{},[4591,82000,81982],{},[4596,82002,12172],{},[4591,82004,4609],{},[7077,82006,469],{},[4591,82008,37170],{},[4591,82010,4594],{"stretchy":4593},[4596,82012,5009],{},[4591,82014,7351],{},[4596,82016,12172],{},[4591,82018,4604],{"stretchy":4593},[37091,82020,82021,82027],{},[37094,82022,82023],{},[37101,82024,82025],{"scriptlevel":2949,"displaystyle":1419},[4584,82026],{},[37094,82028,82029],{},[37101,82030,82031],{"scriptlevel":2949,"displaystyle":1419},[4584,82032,82033,82035,82037,82039,82041,82043,82045,82047,82049,82051,82053,82055,82057],{},[4584,82034],{},[4596,82036,5009],{},[4591,82038,37170],{},[4596,82040,12172],{},[4591,82042,4609],{},[4596,82044,5058],{},[4596,82046,39],{},[4596,82048,19],{},[4591,82050,55608],{"stretchy":4593},[4596,82052,5009],{},[4591,82054,2066],{"separator":1419},[4596,82056,12172],{},[4591,82058,63381],{"stretchy":4593},[37091,82060,82061,82078],{},[37094,82062,82063],{},[37101,82064,82065],{"scriptlevel":2949,"displaystyle":1419},[4584,82066,82067,82070,82072,82074,82076],{},[4587,82068,82069],{},"有界和、乘积算子（",[4591,82071,81982],{},[4587,82073,52816],{},[4591,82075,17162],{},[4587,82077,81751],{},[37094,82079,82080],{},[37101,82081,82082],{"scriptlevel":2949,"displaystyle":1419},[4584,82083,82084,82086,82088,82090,82092,82094,82096,82098,82100,82102,82104,82106],{},[4584,82085],{},[4596,82087,5009],{},[4591,82089,81982],{},[4596,82091,12172],{},[4591,82093,4609],{},[7077,82095,469],{},[4591,82097,37170],{},[4591,82099,4594],{"stretchy":4593},[4596,82101,5009],{},[4591,82103,7351],{},[4596,82105,12172],{},[4591,82107,4604],{"stretchy":4593},[37091,82109,82110,82116],{},[37094,82111,82112],{},[37101,82113,82114],{"scriptlevel":2949,"displaystyle":1419},[4584,82115],{},[37094,82117,82118],{},[37101,82119,82120],{"scriptlevel":2949,"displaystyle":1419},[4584,82121,82122,82124,82126,82128,82130,82132,82134],{},[4584,82123],{},[4596,82125,5009],{},[4591,82127,17162],{},[4596,82129,12172],{},[4591,82131,4609],{},[4596,82133,5009],{},[4596,82135,12172],{},[37091,82137,82138,82176],{},[37094,82139,82140],{},[37101,82141,82142],{"scriptlevel":2949,"displaystyle":1419},[4584,82143,82144,82146,82148,82150,82152,82154,82156,82158,82160,82166,82168,82174],{},[4596,82145,7065],{},[4596,82147,39],{},[4596,82149,19],{},[4596,82151,262],{},[4596,82153,5009],{},[4596,82155,39],{},[4596,82157,19],{},[4587,82159,81742],{},[4614,82161,82162,82164],{},[4596,82163,52813],{},[4591,82165,7351],{},[4587,82167,52816],{},[4614,82169,82170,82172],{},[4596,82171,52813],{},[4591,82173,17848],{},[4587,82175,81751],{},[37094,82177,82178],{},[37101,82179,82180],{"scriptlevel":2949,"displaystyle":1419},[4584,82181,82182,82184,82186,82192,82194,82196],{},[4584,82183],{},[4596,82185,5009],{},[4614,82187,82188,82190],{},[4596,82189,52813],{},[4591,82191,7351],{},[4596,82193,12172],{},[4591,82195,4609],{},[4611,82197,82198,82206],{},[4584,82199,82200,82202,82204],{},[4596,82201,5009],{},[4591,82203,7351],{},[4596,82205,12172],{},[4584,82207,82208,82210,82212,82214],{},[7077,82209,469],{},[4591,82211,7351],{},[4596,82213,5009],{},[4596,82215,12172],{},[37091,82217,82218,82224],{},[37094,82219,82220],{},[37101,82221,82222],{"scriptlevel":2949,"displaystyle":1419},[4584,82223],{},[37094,82225,82226],{},[37101,82227,82228],{"scriptlevel":2949,"displaystyle":1419},[4584,82229,82230,82232,82234,82240,82242,82244],{},[4584,82231],{},[4596,82233,5009],{},[4614,82235,82236,82238],{},[4596,82237,52813],{},[4591,82239,17848],{},[4596,82241,12172],{},[4591,82243,4609],{},[4611,82245,82246,82252],{},[4584,82247,82248,82250],{},[4596,82249,5009],{},[4596,82251,12172],{},[4584,82253,82254,82256,82258,82260,82262,82264,82266,82268,82270,82272,82274,82276],{},[7077,82255,469],{},[4591,82257,7351],{},[4591,82259,4594],{"stretchy":4593},[7077,82261,469],{},[4591,82263,17848],{},[4596,82265,5009],{},[4591,82267,4604],{"stretchy":4593},[4591,82269,4594],{"stretchy":4593},[7077,82271,469],{},[4591,82273,17848],{},[4596,82275,12172],{},[4591,82277,4604],{"stretchy":4593},[4647,82279,82280],{"encoding":4649},"\\begin{aligned}\nZadeh算子（\\land，\\lor）：& a \\lor b = max\\{a,b\\} \\\\\n& a \\land b = min\\{a,b\\} \\\\\n取大、乘积算子（\\lor，\\cdot）： & a \\lor b = max\\{a,b\\} \\\\\n& a \\cdot b = ab \\\\\n环和、乘积算子（⨣，）：& a ⨣ b = a + b - ab \\\\\n& a \\cdot b = ab \\\\\n有界和、取小算子（⊕，\\land）：& a ⊕ b = 1 \\land (a + b) \\\\\n& a \\land b = min\\{a, b\\} \\\\\n有界和、乘积算子（⊕，\\cdot）：& a ⊕ b = 1 \\land (a + b) \\\\\n& a \\cdot b = ab \\\\\nEinsain算子（ε^+，ε^-）：& a ε^+ b = \\frac{a + b}{1 + ab} \\\\\n& a ε^- b = \\frac{ab}{1 + (1-a)(1 - b)}\n\\end{aligned}",[78,82282,82284],{"className":82283,"ariaHidden":1419},[4654],[78,82285,82287,82291],{"className":82286},[4658],[78,82288],{"className":82289,"style":82290},[4662],"height:19.7482em;vertical-align:-9.6241em;",[78,82292,82294],{"className":82293},[4667],[78,82295,82297,82645],{"className":82296},[37085],[78,82298,82300],{"className":82299},[37883],[78,82301,82303,82636],{"className":82302},[4693,4694],[78,82304,82306,82633],{"className":82305},[4698],[78,82307,82310,82362,82371,82407,82416,82436,82445,82481,82490,82526,82535,82624],{"className":82308,"style":82309},[4702],"height:10.1241em;",[78,82311,82313,82317],{"style":82312},"top:-12.6555em;",[78,82314],{"className":82315,"style":82316},[4710],"height:3.3714em;",[78,82318,82320,82323,82326,82329,82332,82335,82338,82341,82344,82347,82350,82353,82356,82359],{"className":82319},[4667],[78,82321,81731],{"className":82322,"style":5133},[4667,4678],[78,82324,5009],{"className":82325},[4667,4678],[78,82327,5245],{"className":82328},[4667,4678],[78,82330,4618],{"className":82331},[4667,4678],[78,82333,26052],{"className":82334},[4667,4678],[78,82336,81742],{"className":82337},[4667,6184],[78,82339],{"className":82340,"style":5143},[4739],[78,82342,37170],{"className":82343},[7450],[78,82345],{"className":82346,"style":5143},[4739],[78,82348,52816],{"className":82349},[4667,6184],[78,82351],{"className":82352,"style":5143},[4739],[78,82354,37210],{"className":82355},[7450],[78,82357],{"className":82358,"style":5143},[4739],[78,82360,81751],{"className":82361},[4667,6184],[78,82363,82365,82368],{"style":82364},"top:-11.1555em;",[78,82366],{"className":82367,"style":82316},[4710],[78,82369],{"className":82370},[4667],[78,82372,82374,82377],{"style":82373},"top:-9.6555em;",[78,82375],{"className":82376,"style":82316},[4710],[78,82378,82380,82383,82386,82389,82392,82395,82398,82401,82404],{"className":82379},[4667],[78,82381,81834],{"className":82382},[4667,6184],[78,82384],{"className":82385,"style":5143},[4739],[78,82387,37210],{"className":82388},[7450],[78,82390],{"className":82391,"style":5143},[4739],[78,82393,52816],{"className":82394},[4667,6184],[78,82396],{"className":82397,"style":5143},[4739],[78,82399,17162],{"className":82400},[7450],[78,82402],{"className":82403,"style":5143},[4739],[78,82405,81751],{"className":82406},[4667,6184],[78,82408,82410,82413],{"style":82409},"top:-8.1555em;",[78,82411],{"className":82412,"style":82316},[4710],[78,82414],{"className":82415},[4667],[78,82417,82419,82422],{"style":82418},"top:-6.6555em;",[78,82420],{"className":82421,"style":82316},[4710],[78,82423,82425,82429,82432],{"className":82424},[4667],[78,82426,82428],{"className":82427},[4667,6184],"环和、乘积算子（",[78,82430,81924],{"className":82431},[4667],[78,82433,82435],{"className":82434},[4667,6184],"，）：",[78,82437,82439,82442],{"style":82438},"top:-5.1555em;",[78,82440],{"className":82441,"style":82316},[4710],[78,82443],{"className":82444},[4667],[78,82446,82448,82451],{"style":82447},"top:-3.6555em;",[78,82449],{"className":82450,"style":82316},[4710],[78,82452,82454,82457,82460,82463,82466,82469,82472,82475,82478],{"className":82453},[4667],[78,82455,81979],{"className":82456},[4667,6184],[78,82458],{"className":82459,"style":5143},[4739],[78,82461,81982],{"className":82462},[7450],[78,82464],{"className":82465,"style":5143},[4739],[78,82467,52816],{"className":82468},[4667,6184],[78,82470],{"className":82471,"style":5143},[4739],[78,82473,37170],{"className":82474},[7450],[78,82476],{"className":82477,"style":5143},[4739],[78,82479,81751],{"className":82480},[4667,6184],[78,82482,82484,82487],{"style":82483},"top:-2.1555em;",[78,82485],{"className":82486,"style":82316},[4710],[78,82488],{"className":82489},[4667],[78,82491,82493,82496],{"style":82492},"top:-0.6555em;",[78,82494],{"className":82495,"style":82316},[4710],[78,82497,82499,82502,82505,82508,82511,82514,82517,82520,82523],{"className":82498},[4667],[78,82500,82069],{"className":82501},[4667,6184],[78,82503],{"className":82504,"style":5143},[4739],[78,82506,81982],{"className":82507},[7450],[78,82509],{"className":82510,"style":5143},[4739],[78,82512,52816],{"className":82513},[4667,6184],[78,82515],{"className":82516,"style":5143},[4739],[78,82518,17162],{"className":82519},[7450],[78,82521],{"className":82522,"style":5143},[4739],[78,82524,81751],{"className":82525},[4667,6184],[78,82527,82529,82532],{"style":82528},"top:0.8445em;",[78,82530],{"className":82531,"style":82316},[4710],[78,82533],{"className":82534},[4667],[78,82536,82538,82541],{"style":82537},"top:2.8759em;",[78,82539],{"className":82540,"style":82316},[4710],[78,82542,82544,82547,82550,82553,82557,82560,82589,82592,82621],{"className":82543},[4667],[78,82545,7065],{"className":82546,"style":7153},[4667,4678],[78,82548,7201],{"className":82549},[4667,4678],[78,82551,262],{"className":82552},[4667,4678],[78,82554,82556],{"className":82555},[4667,4678],"ain",[78,82558,81742],{"className":82559},[4667,6184],[78,82561,82563,82566],{"className":82562},[4667],[78,82564,52813],{"className":82565},[4667,4678],[78,82567,82569],{"className":82568},[4689],[78,82570,82572],{"className":82571},[4693],[78,82573,82575],{"className":82574},[4698],[78,82576,82578],{"className":82577,"style":53493},[4702],[78,82579,82580,82583],{"style":5209},[78,82581],{"className":82582,"style":4711},[4710],[78,82584,82586],{"className":82585},[4715,4716,4717,4718],[78,82587,7351],{"className":82588},[7450,4718],[78,82590,52816],{"className":82591},[4667,6184],[78,82593,82595,82598],{"className":82594},[4667],[78,82596,52813],{"className":82597},[4667,4678],[78,82599,82601],{"className":82600},[4689],[78,82602,82604],{"className":82603},[4693],[78,82605,82607],{"className":82606},[4698],[78,82608,82610],{"className":82609,"style":53493},[4702],[78,82611,82612,82615],{"style":5209},[78,82613],{"className":82614,"style":4711},[4710],[78,82616,82618],{"className":82617},[4715,4716,4717,4718],[78,82619,17848],{"className":82620},[7450,4718],[78,82622,81751],{"className":82623},[4667,6184],[78,82625,82627,82630],{"style":82626},"top:5.3167em;",[78,82628],{"className":82629,"style":82316},[4710],[78,82631],{"className":82632},[4667],[78,82634,4726],{"className":82635},[4725],[78,82637,82639],{"className":82638},[4698],[78,82640,82643],{"className":82641,"style":82642},[4702],"height:9.6241em;",[78,82644],{},[78,82646,82648],{"className":82647},[38098],[78,82649,82651,83509],{"className":82650},[4693,4694],[78,82652,82654,83506],{"className":82653},[4698],[78,82655,82657,82716,82773,82832,82871,82927,82965,83033,83089,83157,83195,83338],{"className":82656,"style":82309},[4702],[78,82658,82659,82662],{"style":82312},[78,82660],{"className":82661,"style":82316},[4710],[78,82663,82665,82668,82671,82674,82677,82680,82683,82686,82689,82692,82695,82698,82701,82704,82707,82710,82713],{"className":82664},[4667],[78,82666],{"className":82667},[4667],[78,82669,5009],{"className":82670},[4667,4678],[78,82672],{"className":82673,"style":5143},[4739],[78,82675,37210],{"className":82676},[7450],[78,82678],{"className":82679,"style":5143},[4739],[78,82681,12172],{"className":82682},[4667,4678],[78,82684],{"className":82685,"style":4740},[4739],[78,82687,4609],{"className":82688},[4744],[78,82690],{"className":82691,"style":4740},[4739],[78,82693,5177],{"className":82694},[4667,4678],[78,82696,4598],{"className":82697},[4667,4678],[78,82699,55608],{"className":82700},[4674],[78,82702,5009],{"className":82703},[4667,4678],[78,82705,2066],{"className":82706},[5126],[78,82708],{"className":82709,"style":4839},[4739],[78,82711,12172],{"className":82712},[4667,4678],[78,82714,63381],{"className":82715},[4682],[78,82717,82718,82721],{"style":82364},[78,82719],{"className":82720,"style":82316},[4710],[78,82722,82724,82727,82730,82733,82736,82739,82742,82745,82748,82751,82755,82758,82761,82764,82767,82770],{"className":82723},[4667],[78,82725],{"className":82726},[4667],[78,82728,5009],{"className":82729},[4667,4678],[78,82731],{"className":82732,"style":5143},[4739],[78,82734,37170],{"className":82735},[7450],[78,82737],{"className":82738,"style":5143},[4739],[78,82740,12172],{"className":82741},[4667,4678],[78,82743],{"className":82744,"style":4740},[4739],[78,82746,4609],{"className":82747},[4744],[78,82749],{"className":82750,"style":4740},[4739],[78,82752,82754],{"className":82753},[4667,4678],"min",[78,82756,55608],{"className":82757},[4674],[78,82759,5009],{"className":82760},[4667,4678],[78,82762,2066],{"className":82763},[5126],[78,82765],{"className":82766,"style":4839},[4739],[78,82768,12172],{"className":82769},[4667,4678],[78,82771,63381],{"className":82772},[4682],[78,82774,82775,82778],{"style":82373},[78,82776],{"className":82777,"style":82316},[4710],[78,82779,82781,82784,82787,82790,82793,82796,82799,82802,82805,82808,82811,82814,82817,82820,82823,82826,82829],{"className":82780},[4667],[78,82782],{"className":82783},[4667],[78,82785,5009],{"className":82786},[4667,4678],[78,82788],{"className":82789,"style":5143},[4739],[78,82791,37210],{"className":82792},[7450],[78,82794],{"className":82795,"style":5143},[4739],[78,82797,12172],{"className":82798},[4667,4678],[78,82800],{"className":82801,"style":4740},[4739],[78,82803,4609],{"className":82804},[4744],[78,82806],{"className":82807,"style":4740},[4739],[78,82809,5177],{"className":82810},[4667,4678],[78,82812,4598],{"className":82813},[4667,4678],[78,82815,55608],{"className":82816},[4674],[78,82818,5009],{"className":82819},[4667,4678],[78,82821,2066],{"className":82822},[5126],[78,82824],{"className":82825,"style":4839},[4739],[78,82827,12172],{"className":82828},[4667,4678],[78,82830,63381],{"className":82831},[4682],[78,82833,82834,82837],{"style":82409},[78,82835],{"className":82836,"style":82316},[4710],[78,82838,82840,82843,82846,82849,82852,82855,82858,82861,82864,82867],{"className":82839},[4667],[78,82841],{"className":82842},[4667],[78,82844,5009],{"className":82845},[4667,4678],[78,82847],{"className":82848,"style":5143},[4739],[78,82850,17162],{"className":82851},[7450],[78,82853],{"className":82854,"style":5143},[4739],[78,82856,12172],{"className":82857},[4667,4678],[78,82859],{"className":82860,"style":4740},[4739],[78,82862,4609],{"className":82863},[4744],[78,82865],{"className":82866,"style":4740},[4739],[78,82868,82870],{"className":82869},[4667,4678],"ab",[78,82872,82873,82876],{"style":82418},[78,82874],{"className":82875,"style":82316},[4710],[78,82877,82879,82882,82885,82888,82891,82894,82897,82900,82903,82906,82909,82912,82915,82918,82921,82924],{"className":82878},[4667],[78,82880],{"className":82881},[4667],[78,82883,5009],{"className":82884},[4667,4678],[78,82886,81924],{"className":82887},[4667],[78,82889,12172],{"className":82890},[4667,4678],[78,82892],{"className":82893,"style":4740},[4739],[78,82895,4609],{"className":82896},[4744],[78,82898],{"className":82899,"style":4740},[4739],[78,82901,5009],{"className":82902},[4667,4678],[78,82904],{"className":82905,"style":5143},[4739],[78,82907,7351],{"className":82908},[7450],[78,82910],{"className":82911,"style":5143},[4739],[78,82913,12172],{"className":82914},[4667,4678],[78,82916],{"className":82917,"style":5143},[4739],[78,82919,17848],{"className":82920},[7450],[78,82922],{"className":82923,"style":5143},[4739],[78,82925,82870],{"className":82926},[4667,4678],[78,82928,82929,82932],{"style":82438},[78,82930],{"className":82931,"style":82316},[4710],[78,82933,82935,82938,82941,82944,82947,82950,82953,82956,82959,82962],{"className":82934},[4667],[78,82936],{"className":82937},[4667],[78,82939,5009],{"className":82940},[4667,4678],[78,82942],{"className":82943,"style":5143},[4739],[78,82945,17162],{"className":82946},[7450],[78,82948],{"className":82949,"style":5143},[4739],[78,82951,12172],{"className":82952},[4667,4678],[78,82954],{"className":82955,"style":4740},[4739],[78,82957,4609],{"className":82958},[4744],[78,82960],{"className":82961,"style":4740},[4739],[78,82963,82870],{"className":82964},[4667,4678],[78,82966,82967,82970],{"style":82447},[78,82968],{"className":82969,"style":82316},[4710],[78,82971,82973,82976,82979,82982,82985,82988,82991,82994,82997,83000,83003,83006,83009,83012,83015,83018,83021,83024,83027,83030],{"className":82972},[4667],[78,82974],{"className":82975},[4667],[78,82977,5009],{"className":82978},[4667,4678],[78,82980],{"className":82981,"style":5143},[4739],[78,82983,81982],{"className":82984},[7450],[78,82986],{"className":82987,"style":5143},[4739],[78,82989,12172],{"className":82990},[4667,4678],[78,82992],{"className":82993,"style":4740},[4739],[78,82995,4609],{"className":82996},[4744],[78,82998],{"className":82999,"style":4740},[4739],[78,83001,469],{"className":83002},[4667],[78,83004],{"className":83005,"style":5143},[4739],[78,83007,37170],{"className":83008},[7450],[78,83010],{"className":83011,"style":5143},[4739],[78,83013,4594],{"className":83014},[4674],[78,83016,5009],{"className":83017},[4667,4678],[78,83019],{"className":83020,"style":5143},[4739],[78,83022,7351],{"className":83023},[7450],[78,83025],{"className":83026,"style":5143},[4739],[78,83028,12172],{"className":83029},[4667,4678],[78,83031,4604],{"className":83032},[4682],[78,83034,83035,83038],{"style":82483},[78,83036],{"className":83037,"style":82316},[4710],[78,83039,83041,83044,83047,83050,83053,83056,83059,83062,83065,83068,83071,83074,83077,83080,83083,83086],{"className":83040},[4667],[78,83042],{"className":83043},[4667],[78,83045,5009],{"className":83046},[4667,4678],[78,83048],{"className":83049,"style":5143},[4739],[78,83051,37170],{"className":83052},[7450],[78,83054],{"className":83055,"style":5143},[4739],[78,83057,12172],{"className":83058},[4667,4678],[78,83060],{"className":83061,"style":4740},[4739],[78,83063,4609],{"className":83064},[4744],[78,83066],{"className":83067,"style":4740},[4739],[78,83069,82754],{"className":83070},[4667,4678],[78,83072,55608],{"className":83073},[4674],[78,83075,5009],{"className":83076},[4667,4678],[78,83078,2066],{"className":83079},[5126],[78,83081],{"className":83082,"style":4839},[4739],[78,83084,12172],{"className":83085},[4667,4678],[78,83087,63381],{"className":83088},[4682],[78,83090,83091,83094],{"style":82492},[78,83092],{"className":83093,"style":82316},[4710],[78,83095,83097,83100,83103,83106,83109,83112,83115,83118,83121,83124,83127,83130,83133,83136,83139,83142,83145,83148,83151,83154],{"className":83096},[4667],[78,83098],{"className":83099},[4667],[78,83101,5009],{"className":83102},[4667,4678],[78,83104],{"className":83105,"style":5143},[4739],[78,83107,81982],{"className":83108},[7450],[78,83110],{"className":83111,"style":5143},[4739],[78,83113,12172],{"className":83114},[4667,4678],[78,83116],{"className":83117,"style":4740},[4739],[78,83119,4609],{"className":83120},[4744],[78,83122],{"className":83123,"style":4740},[4739],[78,83125,469],{"className":83126},[4667],[78,83128],{"className":83129,"style":5143},[4739],[78,83131,37170],{"className":83132},[7450],[78,83134],{"className":83135,"style":5143},[4739],[78,83137,4594],{"className":83138},[4674],[78,83140,5009],{"className":83141},[4667,4678],[78,83143],{"className":83144,"style":5143},[4739],[78,83146,7351],{"className":83147},[7450],[78,83149],{"className":83150,"style":5143},[4739],[78,83152,12172],{"className":83153},[4667,4678],[78,83155,4604],{"className":83156},[4682],[78,83158,83159,83162],{"style":82528},[78,83160],{"className":83161,"style":82316},[4710],[78,83163,83165,83168,83171,83174,83177,83180,83183,83186,83189,83192],{"className":83164},[4667],[78,83166],{"className":83167},[4667],[78,83169,5009],{"className":83170},[4667,4678],[78,83172],{"className":83173,"style":5143},[4739],[78,83175,17162],{"className":83176},[7450],[78,83178],{"className":83179,"style":5143},[4739],[78,83181,12172],{"className":83182},[4667,4678],[78,83184],{"className":83185,"style":4740},[4739],[78,83187,4609],{"className":83188},[4744],[78,83190],{"className":83191,"style":4740},[4739],[78,83193,82870],{"className":83194},[4667,4678],[78,83196,83197,83200],{"style":82537},[78,83198],{"className":83199,"style":82316},[4710],[78,83201,83203,83206,83209,83238,83241,83244,83247,83250],{"className":83202},[4667],[78,83204],{"className":83205},[4667],[78,83207,5009],{"className":83208},[4667,4678],[78,83210,83212,83215],{"className":83211},[4667],[78,83213,52813],{"className":83214},[4667,4678],[78,83216,83218],{"className":83217},[4689],[78,83219,83221],{"className":83220},[4693],[78,83222,83224],{"className":83223},[4698],[78,83225,83227],{"className":83226,"style":53493},[4702],[78,83228,83229,83232],{"style":5209},[78,83230],{"className":83231,"style":4711},[4710],[78,83233,83235],{"className":83234},[4715,4716,4717,4718],[78,83236,7351],{"className":83237},[7450,4718],[78,83239,12172],{"className":83240},[4667,4678],[78,83242],{"className":83243,"style":4740},[4739],[78,83245,4609],{"className":83246},[4744],[78,83248],{"className":83249,"style":4740},[4739],[78,83251,83253,83256,83335],{"className":83252},[4667],[78,83254],{"className":83255},[4674,4761],[78,83257,83259],{"className":83258},[4611],[78,83260,83262,83326],{"className":83261},[4693,4694],[78,83263,83265,83323],{"className":83264},[4698],[78,83266,83269,83292,83300],{"className":83267,"style":83268},[4702],"height:1.3714em;",[78,83270,83271,83274],{"style":4777},[78,83272],{"className":83273,"style":4781},[4710],[78,83275,83277,83280,83283,83286,83289],{"className":83276},[4667],[78,83278,469],{"className":83279},[4667],[78,83281],{"className":83282,"style":5143},[4739],[78,83284,7351],{"className":83285},[7450],[78,83287],{"className":83288,"style":5143},[4739],[78,83290,82870],{"className":83291},[4667,4678],[78,83293,83294,83297],{"style":4919},[78,83295],{"className":83296,"style":4781},[4710],[78,83298],{"className":83299,"style":4927},[4926],[78,83301,83302,83305],{"style":4930},[78,83303],{"className":83304,"style":4781},[4710],[78,83306,83308,83311,83314,83317,83320],{"className":83307},[4667],[78,83309,5009],{"className":83310},[4667,4678],[78,83312],{"className":83313,"style":5143},[4739],[78,83315,7351],{"className":83316},[7450],[78,83318],{"className":83319,"style":5143},[4739],[78,83321,12172],{"className":83322},[4667,4678],[78,83324,4726],{"className":83325},[4725],[78,83327,83329],{"className":83328},[4698],[78,83330,83333],{"className":83331,"style":83332},[4702],"height:0.7693em;",[78,83334],{},[78,83336],{"className":83337},[4682,4761],[78,83339,83340,83343],{"style":82626},[78,83341],{"className":83342,"style":82316},[4710],[78,83344,83346,83349,83352,83381,83384,83387,83390,83393],{"className":83345},[4667],[78,83347],{"className":83348},[4667],[78,83350,5009],{"className":83351},[4667,4678],[78,83353,83355,83358],{"className":83354},[4667],[78,83356,52813],{"className":83357},[4667,4678],[78,83359,83361],{"className":83360},[4689],[78,83362,83364],{"className":83363},[4693],[78,83365,83367],{"className":83366},[4698],[78,83368,83370],{"className":83369,"style":53493},[4702],[78,83371,83372,83375],{"style":5209},[78,83373],{"className":83374,"style":4711},[4710],[78,83376,83378],{"className":83377},[4715,4716,4717,4718],[78,83379,17848],{"className":83380},[7450,4718],[78,83382,12172],{"className":83383},[4667,4678],[78,83385],{"className":83386,"style":4740},[4739],[78,83388,4609],{"className":83389},[4744],[78,83391],{"className":83392,"style":4740},[4739],[78,83394,83396,83399,83503],{"className":83395},[4667],[78,83397],{"className":83398},[4674,4761],[78,83400,83402],{"className":83401},[4611],[78,83403,83405,83495],{"className":83404},[4693,4694],[78,83406,83408,83492],{"className":83407},[4698],[78,83409,83411,83473,83481],{"className":83410,"style":83268},[4702],[78,83412,83413,83416],{"style":4777},[78,83414],{"className":83415,"style":4781},[4710],[78,83417,83419,83422,83425,83428,83431,83434,83437,83440,83443,83446,83449,83452,83455,83458,83461,83464,83467,83470],{"className":83418},[4667],[78,83420,469],{"className":83421},[4667],[78,83423],{"className":83424,"style":5143},[4739],[78,83426,7351],{"className":83427},[7450],[78,83429],{"className":83430,"style":5143},[4739],[78,83432,4594],{"className":83433},[4674],[78,83435,469],{"className":83436},[4667],[78,83438],{"className":83439,"style":5143},[4739],[78,83441,17848],{"className":83442},[7450],[78,83444],{"className":83445,"style":5143},[4739],[78,83447,5009],{"className":83448},[4667,4678],[78,83450,4604],{"className":83451},[4682],[78,83453,4594],{"className":83454},[4674],[78,83456,469],{"className":83457},[4667],[78,83459],{"className":83460,"style":5143},[4739],[78,83462,17848],{"className":83463},[7450],[78,83465],{"className":83466,"style":5143},[4739],[78,83468,12172],{"className":83469},[4667,4678],[78,83471,4604],{"className":83472},[4682],[78,83474,83475,83478],{"style":4919},[78,83476],{"className":83477,"style":4781},[4710],[78,83479],{"className":83480,"style":4927},[4926],[78,83482,83483,83486],{"style":4930},[78,83484],{"className":83485,"style":4781},[4710],[78,83487,83489],{"className":83488},[4667],[78,83490,82870],{"className":83491},[4667,4678],[78,83493,4726],{"className":83494},[4725],[78,83496,83498],{"className":83497},[4698],[78,83499,83501],{"className":83500,"style":17380},[4702],[78,83502],{},[78,83504],{"className":83505},[4682,4761],[78,83507,4726],{"className":83508},[4725],[78,83510,83512],{"className":83511},[4698],[78,83513,83515],{"className":83514,"style":82642},[4702],[78,83516],{},[23289,83518],{},[7759,83520,83522],{"id":83521},"_5隶属度函数定义p178","5、隶属度函数定义（P178）",[13,83524,83525,83526,83528],{},"论域U上的一个模糊集A由隶属函数",[596,83527,78947],{},"A(x)唯一确定，表示x隶属于集合A的程度，故认为二者是等同的，即",[78,83530,83532],{"className":83531},[4566],[78,83533,83535,83569],{"className":83534},[4570],[78,83536,83538],{"className":83537},[4574],[4576,83539,83540],{"xmlns":4578,"display":4579},[4581,83541,83542,83566],{},[4584,83543,83544,83550,83552,83554,83556,83558,83560,83562,83564],{},[4600,83545,83546,83548],{},[4596,83547,78947],{},[4596,83549,17143],{},[4591,83551,8661],{},[4596,83553,79685],{},[4591,83555,37501],{},[4591,83557,17845],{"stretchy":4593},[7077,83559,2949],{},[4591,83561,2066],{"separator":1419},[7077,83563,469],{},[4591,83565,17857],{"stretchy":4593},[4647,83567,83568],{"encoding":4649},"\\mu_A: U \\longrightarrow[0,1]",[78,83570,83572,83627,83646],{"className":83571,"ariaHidden":1419},[4654],[78,83573,83575,83578,83618,83621,83624],{"className":83574},[4658],[78,83576],{"className":83577,"style":16971},[4662],[78,83579,83581,83584],{"className":83580},[4667],[78,83582,78947],{"className":83583},[4667,4678],[78,83585,83587],{"className":83586},[4689],[78,83588,83590,83610],{"className":83589},[4693,4694],[78,83591,83593,83607],{"className":83592},[4698],[78,83594,83596],{"className":83595,"style":63412},[4702],[78,83597,83598,83601],{"style":4706},[78,83599],{"className":83600,"style":4711},[4710],[78,83602,83604],{"className":83603},[4715,4716,4717,4718],[78,83605,17143],{"className":83606},[4667,4678,4718],[78,83608,4726],{"className":83609},[4725],[78,83611,83613],{"className":83612},[4698],[78,83614,83616],{"className":83615,"style":4733},[4702],[78,83617],{},[78,83619],{"className":83620,"style":4740},[4739],[78,83622,8661],{"className":83623},[4744],[78,83625],{"className":83626,"style":4740},[4739],[78,83628,83630,83634,83637,83640,83643],{"className":83629},[4658],[78,83631],{"className":83632,"style":83633},[4662],"height:0.6943em;vertical-align:-0.011em;",[78,83635,79685],{"className":83636,"style":80807},[4667,4678],[78,83638],{"className":83639,"style":4740},[4739],[78,83641,37501],{"className":83642},[4744],[78,83644],{"className":83645,"style":4740},[4739],[78,83647,83649,83652,83655,83658,83661,83664,83667],{"className":83648},[4658],[78,83650],{"className":83651,"style":4663},[4662],[78,83653,17845],{"className":83654},[4674],[78,83656,2949],{"className":83657},[4667],[78,83659,2066],{"className":83660},[5126],[78,83662],{"className":83663,"style":4839},[4739],[78,83665,469],{"className":83666},[4667],[78,83668,17857],{"className":83669},[4682],[23289,83671],{},[7759,83673,83675],{"id":83674},"_6α水平载集的定义和计算p189","6、α水平载集的定义和计算（P189）",[13,83677,83678],{},"α水平载集是指隶属度大于等于α的元素组成的集合，可表示为",[78,83680,83682],{"className":83681},[4566],[78,83683,83685,83725],{"className":83684},[4570],[78,83686,83688],{"className":83687},[4574],[4576,83689,83690],{"xmlns":4578,"display":4579},[4581,83691,83692,83722],{},[4584,83693,83694,83700,83702,83704,83706,83708,83714,83716,83718,83720],{},[4600,83695,83696,83698],{},[4596,83697,17143],{},[4596,83699,55518],{},[4591,83701,4609],{},[4591,83703,55608],{"stretchy":4593},[4596,83705,4598],{},[4596,83707,63346],{"mathvariant":7101},[4600,83709,83710,83712],{},[4596,83711,78947],{},[4596,83713,17143],{},[4591,83715,4594],{"stretchy":4593},[4596,83717,4598],{},[4591,83719,4604],{"stretchy":4593},[4591,83721,63381],{"stretchy":4593},[4647,83723,83724],{"encoding":4649},"A_\\alpha =  \\{ x | \\mu_A(x)\\}",[78,83726,83728,83783],{"className":83727,"ariaHidden":1419},[4654],[78,83729,83731,83734,83774,83777,83780],{"className":83730},[4658],[78,83732],{"className":83733,"style":20406},[4662],[78,83735,83737,83740],{"className":83736},[4667],[78,83738,17143],{"className":83739},[4667,4678],[78,83741,83743],{"className":83742},[4689],[78,83744,83746,83766],{"className":83745},[4693,4694],[78,83747,83749,83763],{"className":83748},[4698],[78,83750,83752],{"className":83751,"style":5279},[4702],[78,83753,83754,83757],{"style":4706},[78,83755],{"className":83756,"style":4711},[4710],[78,83758,83760],{"className":83759},[4715,4716,4717,4718],[78,83761,55518],{"className":83762,"style":55822},[4667,4678,4718],[78,83764,4726],{"className":83765},[4725],[78,83767,83769],{"className":83768},[4698],[78,83770,83772],{"className":83771,"style":4733},[4702],[78,83773],{},[78,83775],{"className":83776,"style":4740},[4739],[78,83778,4609],{"className":83779},[4744],[78,83781],{"className":83782,"style":4740},[4739],[78,83784,83786,83789,83792,83795,83798,83838,83841,83844],{"className":83785},[4658],[78,83787],{"className":83788,"style":4663},[4662],[78,83790,55608],{"className":83791},[4674],[78,83793,4598],{"className":83794},[4667,4678],[78,83796,63346],{"className":83797},[4667],[78,83799,83801,83804],{"className":83800},[4667],[78,83802,78947],{"className":83803},[4667,4678],[78,83805,83807],{"className":83806},[4689],[78,83808,83810,83830],{"className":83809},[4693,4694],[78,83811,83813,83827],{"className":83812},[4698],[78,83814,83816],{"className":83815,"style":63412},[4702],[78,83817,83818,83821],{"style":4706},[78,83819],{"className":83820,"style":4711},[4710],[78,83822,83824],{"className":83823},[4715,4716,4717,4718],[78,83825,17143],{"className":83826},[4667,4678,4718],[78,83828,4726],{"className":83829},[4725],[78,83831,83833],{"className":83832},[4698],[78,83834,83836],{"className":83835,"style":4733},[4702],[78,83837],{},[78,83839,4594],{"className":83840},[4674],[78,83842,4598],{"className":83843},[4667,4678],[78,83845,78919],{"className":83846},[4682],[13,83848,83849],{},"**注意：**模糊子集本身没有确定边界，其水平载集有确定边界，并且不再是模糊集合，而是一个确定集合。",[23289,83851],{},[7759,83853,83855],{"id":83854},"_7模糊集合p194","7、模糊集合（P194）",[13,83857,83858,83859,83861],{},"（1）如果关系R是XxY的一个模糊子集，则称R为XxY的一个模糊关系，其隶属度函数为",[596,83860,78947],{},"R(x，y)。",[13,83863,83864,83865,83867],{},"**注意：**隶属度函数",[596,83866,78947],{},"R(x，y）表示x、y具有R的程度。",[13,83869,83870],{},"（2）若一个矩阵元素取值在【0，1】区间内，则称该矩阵为模糊矩阵。同普通矩阵一样，模糊单位阵记为I；模糊零矩阵记为0。",[13,83872,83873],{},"（3）模糊矩阵的表示。当X和Y都是有限集合时，模糊关系也可以用MR来表示。设X = { x1 , x2 , …  , xi , …xn }，Y = { y1 , y2 , …  , yi , …yn }，则MR可以表示为",[78,83875,83877],{"className":83876},[4566],[78,83878,83880,83963],{"className":83879},[4570],[78,83881,83883],{"className":83882},[4574],[4576,83884,83885],{"xmlns":4578,"display":4579},[4581,83886,83887,83960],{},[4584,83888,83889,83896,83898,83900,83910,83922,83924,83934,83936,83942,83944,83950,83952,83958],{},[4600,83890,83891,83894],{},[4596,83892,83893],{},"M",[4596,83895,27152],{},[4591,83897,4609],{},[4591,83899,17845],{"stretchy":4593},[4600,83901,83902,83904],{},[4596,83903,17132],{},[4584,83905,83906,83908],{},[4596,83907,39],{},[4596,83909,4635],{},[4600,83911,83912,83914],{},[4591,83913,17857],{"stretchy":4593},[4584,83915,83916,83918,83920],{},[4596,83917,5058],{},[4591,83919,43664],{},[4596,83921,19],{},[4591,83923,2066],{"separator":1419},[4600,83925,83926,83928],{},[4596,83927,17132],{},[4584,83929,83930,83932],{},[4596,83931,39],{},[4596,83933,4635],{},[4591,83935,4609],{},[4600,83937,83938,83940],{},[4596,83939,78947],{},[4596,83941,27152],{},[4591,83943,4594],{"stretchy":4593},[4600,83945,83946,83948],{},[4596,83947,4598],{},[4596,83949,39],{},[4591,83951,2066],{"separator":1419},[4600,83953,83954,83956],{},[4596,83955,16867],{},[4596,83957,39],{},[4591,83959,4604],{"stretchy":4593},[4647,83961,83962],{"encoding":4649},"M_R = [r_{ij}]_{m \\times n} , r_{ij} = \\mu_R(x_i,y_i)",[78,83964,83966,84022,84186],{"className":83965,"ariaHidden":1419},[4654],[78,83967,83969,83972,84013,84016,84019],{"className":83968},[4658],[78,83970],{"className":83971,"style":20406},[4662],[78,83973,83975,83978],{"className":83974},[4667],[78,83976,83893],{"className":83977,"style":80807},[4667,4678],[78,83979,83981],{"className":83980},[4689],[78,83982,83984,84005],{"className":83983},[4693,4694],[78,83985,83987,84002],{"className":83986},[4698],[78,83988,83990],{"className":83989,"style":63412},[4702],[78,83991,83993,83996],{"style":83992},"top:-2.55em;margin-left:-0.109em;margin-right:0.05em;",[78,83994],{"className":83995,"style":4711},[4710],[78,83997,83999],{"className":83998},[4715,4716,4717,4718],[78,84000,27152],{"className":84001,"style":38285},[4667,4678,4718],[78,84003,4726],{"className":84004},[4725],[78,84006,84008],{"className":84007},[4698],[78,84009,84011],{"className":84010,"style":4733},[4702],[78,84012],{},[78,84014],{"className":84015,"style":4740},[4739],[78,84017,4609],{"className":84018},[4744],[78,84020],{"className":84021,"style":4740},[4739],[78,84023,84025,84029,84032,84077,84128,84131,84134,84177,84180,84183],{"className":84024},[4658],[78,84026],{"className":84027,"style":84028},[4662],"height:1.0361em;vertical-align:-0.2861em;",[78,84030,17845],{"className":84031},[4674],[78,84033,84035,84038],{"className":84034},[4667],[78,84036,17132],{"className":84037,"style":17251},[4667,4678],[78,84039,84041],{"className":84040},[4689],[78,84042,84044,84069],{"className":84043},[4693,4694],[78,84045,84047,84066],{"className":84046},[4698],[78,84048,84050],{"className":84049,"style":4703},[4702],[78,84051,84053,84056],{"style":84052},"top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;",[78,84054],{"className":84055,"style":4711},[4710],[78,84057,84059],{"className":84058},[4715,4716,4717,4718],[78,84060,84062],{"className":84061},[4667,4718],[78,84063,84065],{"className":84064,"style":4823},[4667,4678,4718],"ij",[78,84067,4726],{"className":84068},[4725],[78,84070,84072],{"className":84071},[4698],[78,84073,84075],{"className":84074,"style":6178},[4702],[78,84076],{},[78,84078,84080,84083],{"className":84079},[4682],[78,84081,17857],{"className":84082},[4682],[78,84084,84086],{"className":84085},[4689],[78,84087,84089,84119],{"className":84088},[4693,4694],[78,84090,84092,84116],{"className":84091},[4698],[78,84093,84096],{"className":84094,"style":84095},[4702],"height:0.2583em;",[78,84097,84098,84101],{"style":4706},[78,84099],{"className":84100,"style":4711},[4710],[78,84102,84104],{"className":84103},[4715,4716,4717,4718],[78,84105,84107,84110,84113],{"className":84106},[4667,4718],[78,84108,5058],{"className":84109},[4667,4678,4718],[78,84111,43664],{"className":84112},[7450,4718],[78,84114,19],{"className":84115},[4667,4678,4718],[78,84117,4726],{"className":84118},[4725],[78,84120,84122],{"className":84121},[4698],[78,84123,84126],{"className":84124,"style":84125},[4702],"height:0.2083em;",[78,84127],{},[78,84129,2066],{"className":84130},[5126],[78,84132],{"className":84133,"style":4839},[4739],[78,84135,84137,84140],{"className":84136},[4667],[78,84138,17132],{"className":84139,"style":17251},[4667,4678],[78,84141,84143],{"className":84142},[4689],[78,84144,84146,84169],{"className":84145},[4693,4694],[78,84147,84149,84166],{"className":84148},[4698],[78,84150,84152],{"className":84151,"style":4703},[4702],[78,84153,84154,84157],{"style":84052},[78,84155],{"className":84156,"style":4711},[4710],[78,84158,84160],{"className":84159},[4715,4716,4717,4718],[78,84161,84163],{"className":84162},[4667,4718],[78,84164,84065],{"className":84165,"style":4823},[4667,4678,4718],[78,84167,4726],{"className":84168},[4725],[78,84170,84172],{"className":84171},[4698],[78,84173,84175],{"className":84174,"style":6178},[4702],[78,84176],{},[78,84178],{"className":84179,"style":4740},[4739],[78,84181,4609],{"className":84182},[4744],[78,84184],{"className":84185,"style":4740},[4739],[78,84187,84189,84192,84232,84235,84275,84278,84281,84321],{"className":84188},[4658],[78,84190],{"className":84191,"style":4663},[4662],[78,84193,84195,84198],{"className":84194},[4667],[78,84196,78947],{"className":84197},[4667,4678],[78,84199,84201],{"className":84200},[4689],[78,84202,84204,84224],{"className":84203},[4693,4694],[78,84205,84207,84221],{"className":84206},[4698],[78,84208,84210],{"className":84209,"style":63412},[4702],[78,84211,84212,84215],{"style":4706},[78,84213],{"className":84214,"style":4711},[4710],[78,84216,84218],{"className":84217},[4715,4716,4717,4718],[78,84219,27152],{"className":84220,"style":38285},[4667,4678,4718],[78,84222,4726],{"className":84223},[4725],[78,84225,84227],{"className":84226},[4698],[78,84228,84230],{"className":84229,"style":4733},[4702],[78,84231],{},[78,84233,4594],{"className":84234},[4674],[78,84236,84238,84241],{"className":84237},[4667],[78,84239,4598],{"className":84240},[4667,4678],[78,84242,84244],{"className":84243},[4689],[78,84245,84247,84267],{"className":84246},[4693,4694],[78,84248,84250,84264],{"className":84249},[4698],[78,84251,84253],{"className":84252,"style":4703},[4702],[78,84254,84255,84258],{"style":4706},[78,84256],{"className":84257,"style":4711},[4710],[78,84259,84261],{"className":84260},[4715,4716,4717,4718],[78,84262,39],{"className":84263},[4667,4678,4718],[78,84265,4726],{"className":84266},[4725],[78,84268,84270],{"className":84269},[4698],[78,84271,84273],{"className":84272,"style":4733},[4702],[78,84274],{},[78,84276,2066],{"className":84277},[5126],[78,84279],{"className":84280,"style":4839},[4739],[78,84282,84284,84287],{"className":84283},[4667],[78,84285,16867],{"className":84286,"style":5187},[4667,4678],[78,84288,84290],{"className":84289},[4689],[78,84291,84293,84313],{"className":84292},[4693,4694],[78,84294,84296,84310],{"className":84295},[4698],[78,84297,84299],{"className":84298,"style":4703},[4702],[78,84300,84301,84304],{"style":63415},[78,84302],{"className":84303,"style":4711},[4710],[78,84305,84307],{"className":84306},[4715,4716,4717,4718],[78,84308,39],{"className":84309},[4667,4678,4718],[78,84311,4726],{"className":84312},[4725],[78,84314,84316],{"className":84315},[4698],[78,84317,84319],{"className":84318,"style":4733},[4702],[78,84320],{},[78,84322,4604],{"className":84323},[4682],[13,84325,84326],{},"(关于3，建议大家还是看一下书本P194的例题来快速理解，当然这个例题是有错误的，需要大家自己甄别了)",[23289,84328],{},[7759,84330,84332],{"id":84331},"_8极大运算p196","8、极大运算（P196）",[10548,84334,84336],{"id":84335},"_1极大-极小复合运算","（1）极大-极小复合运算",[13,84338,84339],{},"设R1和R2分别是定义在XxY和YxZ上的两个模糊关系，R1和R2的极大-极小复合运算可得到一个模糊关系（集合），可表示为",[78,84341,84343],{"className":84342},[4566],[78,84344,84346,84456],{"className":84345},[4570],[78,84347,84349],{"className":84348},[4574],[4576,84350,84351],{"xmlns":4578,"display":4579},[4581,84352,84353,84453],{},[4584,84354,84355,84361,84364,84370,84372,84374,84376,84378,84380,84382,84384,84386,84388,84399,84401,84403,84405,84415,84417,84419,84421,84423,84425,84427,84437,84439,84441,84443,84445,84447,84449,84451],{},[4600,84356,84357,84359],{},[4596,84358,27152],{},[7077,84360,469],{},[4587,84362,84363],{},"○",[4600,84365,84366,84368],{},[4596,84367,27152],{},[7077,84369,472],{},[4591,84371,4609],{},[4591,84373,55608],{"stretchy":4593},[4591,84375,17845],{"stretchy":4593},[4591,84377,4594],{"stretchy":4593},[4596,84379,4598],{},[4591,84381,2066],{"separator":1419},[4596,84383,25949],{},[4591,84385,4604],{"stretchy":4593},[4591,84387,2066],{"separator":1419},[4628,84389,84390,84397],{},[4584,84391,84392,84395],{},[4596,84393,84394],{},"max",[4591,84396,17553],{},[4596,84398,16867],{},[4596,84400,82754],{},[4591,84402,17553],{},[4591,84404,17845],{"stretchy":4593},[4600,84406,84407,84409],{},[4596,84408,78947],{},[4600,84410,84411,84413],{},[4596,84412,27152],{},[7077,84414,469],{},[4591,84416,4594],{"stretchy":4593},[4596,84418,4598],{},[4591,84420,2066],{"separator":1419},[4596,84422,16867],{},[4591,84424,4604],{"stretchy":4593},[4591,84426,2066],{"separator":1419},[4600,84428,84429,84431],{},[4596,84430,78947],{},[4600,84432,84433,84435],{},[4596,84434,27152],{},[7077,84436,472],{},[4591,84438,4594],{"stretchy":4593},[4596,84440,16867],{},[4591,84442,2066],{"separator":1419},[4596,84444,25949],{},[4591,84446,4604],{"stretchy":4593},[4591,84448,17857],{"stretchy":4593},[4591,84450,17857],{"stretchy":4593},[4591,84452,63381],{"stretchy":4593},[4647,84454,84455],{"encoding":4649},"R_1 ○ R_2 = \\{ [(x , z), \\max \\limits_{y} \\min [\\mu_{R_1}(x,y),\\mu_{R_2}(y,z)]] \\}",[78,84457,84459,84558],{"className":84458,"ariaHidden":1419},[4654],[78,84460,84462,84465,84506,84509,84549,84552,84555],{"className":84461},[4658],[78,84463],{"className":84464,"style":20406},[4662],[78,84466,84468,84471],{"className":84467},[4667],[78,84469,27152],{"className":84470,"style":38285},[4667,4678],[78,84472,84474],{"className":84473},[4689],[78,84475,84477,84498],{"className":84476},[4693,4694],[78,84478,84480,84495],{"className":84479},[4698],[78,84481,84483],{"className":84482,"style":18264},[4702],[78,84484,84486,84489],{"style":84485},"top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;",[78,84487],{"className":84488,"style":4711},[4710],[78,84490,84492],{"className":84491},[4715,4716,4717,4718],[78,84493,469],{"className":84494},[4667,4718],[78,84496,4726],{"className":84497},[4725],[78,84499,84501],{"className":84500},[4698],[78,84502,84504],{"className":84503,"style":4733},[4702],[78,84505],{},[78,84507,84363],{"className":84508},[4667],[78,84510,84512,84515],{"className":84511},[4667],[78,84513,27152],{"className":84514,"style":38285},[4667,4678],[78,84516,84518],{"className":84517},[4689],[78,84519,84521,84541],{"className":84520},[4693,4694],[78,84522,84524,84538],{"className":84523},[4698],[78,84525,84527],{"className":84526,"style":18264},[4702],[78,84528,84529,84532],{"style":84485},[78,84530],{"className":84531,"style":4711},[4710],[78,84533,84535],{"className":84534},[4715,4716,4717,4718],[78,84536,472],{"className":84537},[4667,4718],[78,84539,4726],{"className":84540},[4725],[78,84542,84544],{"className":84543},[4698],[78,84545,84547],{"className":84546,"style":4733},[4702],[78,84548],{},[78,84550],{"className":84551,"style":4740},[4739],[78,84553,4609],{"className":84554},[4744],[78,84556],{"className":84557,"style":4740},[4739],[78,84559,84561,84565,84569,84572,84575,84578,84581,84584,84587,84590,84638,84641,84644,84647,84731,84734,84737,84740,84743,84746,84749,84752,84755,84835,84838,84841,84844,84847,84850],{"className":84560},[4658],[78,84562],{"className":84563,"style":84564},[4662],"height:1.5861em;vertical-align:-0.8361em;",[78,84566,84568],{"className":84567},[4674],"{[(",[78,84570,4598],{"className":84571},[4667,4678],[78,84573,2066],{"className":84574},[5126],[78,84576],{"className":84577,"style":4839},[4739],[78,84579,25949],{"className":84580,"style":43903},[4667,4678],[78,84582,4604],{"className":84583},[4682],[78,84585,2066],{"className":84586},[5126],[78,84588],{"className":84589,"style":4839},[4739],[78,84591,84593],{"className":84592},[4788,52401],[78,84594,84596,84629],{"className":84595},[4693,4694],[78,84597,84599,84626],{"className":84598},[4698],[78,84600,84602,84616],{"className":84601,"style":16838},[4702],[78,84603,84604,84607],{"style":52413},[78,84605],{"className":84606,"style":4781},[4710],[78,84608,84610],{"className":84609},[4715,4716,4717,4718],[78,84611,84613],{"className":84612},[4667,4718],[78,84614,16867],{"className":84615,"style":5187},[4667,4678,4718],[78,84617,84618,84621],{"style":5824},[78,84619],{"className":84620,"style":4781},[4710],[78,84622,84623],{},[78,84624,84394],{"className":84625},[4788],[78,84627,4726],{"className":84628},[4725],[78,84630,84632],{"className":84631},[4698],[78,84633,84636],{"className":84634,"style":84635},[4702],"height:0.8361em;",[78,84637],{},[78,84639],{"className":84640,"style":4839},[4739],[78,84642,82754],{"className":84643},[4788],[78,84645,17845],{"className":84646},[4674],[78,84648,84650,84653],{"className":84649},[4667],[78,84651,78947],{"className":84652},[4667,4678],[78,84654,84656],{"className":84655},[4689],[78,84657,84659,84722],{"className":84658},[4693,4694],[78,84660,84662,84719],{"className":84661},[4698],[78,84663,84665],{"className":84664,"style":63412},[4702],[78,84666,84667,84670],{"style":4706},[78,84668],{"className":84669,"style":4711},[4710],[78,84671,84673],{"className":84672},[4715,4716,4717,4718],[78,84674,84676],{"className":84675},[4667,4718],[78,84677,84679,84682],{"className":84678},[4667,4718],[78,84680,27152],{"className":84681,"style":38285},[4667,4678,4718],[78,84683,84685],{"className":84684},[4689],[78,84686,84688,84710],{"className":84687},[4693,4694],[78,84689,84691,84707],{"className":84690},[4698],[78,84692,84695],{"className":84693,"style":84694},[4702],"height:0.3173em;",[78,84696,84698,84701],{"style":84697},"top:-2.357em;margin-left:-0.0077em;margin-right:0.0714em;",[78,84699],{"className":84700,"style":4896},[4710],[78,84702,84704],{"className":84703},[4715,4900,4901,4718],[78,84705,469],{"className":84706},[4667,4718],[78,84708,4726],{"className":84709},[4725],[78,84711,84713],{"className":84712},[4698],[78,84714,84717],{"className":84715,"style":84716},[4702],"height:0.143em;",[78,84718],{},[78,84720,4726],{"className":84721},[4725],[78,84723,84725],{"className":84724},[4698],[78,84726,84729],{"className":84727,"style":84728},[4702],"height:0.2501em;",[78,84730],{},[78,84732,4594],{"className":84733},[4674],[78,84735,4598],{"className":84736},[4667,4678],[78,84738,2066],{"className":84739},[5126],[78,84741],{"className":84742,"style":4839},[4739],[78,84744,16867],{"className":84745,"style":5187},[4667,4678],[78,84747,4604],{"className":84748},[4682],[78,84750,2066],{"className":84751},[5126],[78,84753],{"className":84754,"style":4839},[4739],[78,84756,84758,84761],{"className":84757},[4667],[78,84759,78947],{"className":84760},[4667,4678],[78,84762,84764],{"className":84763},[4689],[78,84765,84767,84827],{"className":84766},[4693,4694],[78,84768,84770,84824],{"className":84769},[4698],[78,84771,84773],{"className":84772,"style":63412},[4702],[78,84774,84775,84778],{"style":4706},[78,84776],{"className":84777,"style":4711},[4710],[78,84779,84781],{"className":84780},[4715,4716,4717,4718],[78,84782,84784],{"className":84783},[4667,4718],[78,84785,84787,84790],{"className":84786},[4667,4718],[78,84788,27152],{"className":84789,"style":38285},[4667,4678,4718],[78,84791,84793],{"className":84792},[4689],[78,84794,84796,84816],{"className":84795},[4693,4694],[78,84797,84799,84813],{"className":84798},[4698],[78,84800,84802],{"className":84801,"style":84694},[4702],[78,84803,84804,84807],{"style":84697},[78,84805],{"className":84806,"style":4896},[4710],[78,84808,84810],{"className":84809},[4715,4900,4901,4718],[78,84811,472],{"className":84812},[4667,4718],[78,84814,4726],{"className":84815},[4725],[78,84817,84819],{"className":84818},[4698],[78,84820,84822],{"className":84821,"style":84716},[4702],[78,84823],{},[78,84825,4726],{"className":84826},[4725],[78,84828,84830],{"className":84829},[4698],[78,84831,84833],{"className":84832,"style":84728},[4702],[78,84834],{},[78,84836,4594],{"className":84837},[4674],[78,84839,16867],{"className":84840,"style":5187},[4667,4678],[78,84842,2066],{"className":84843},[5126],[78,84845],{"className":84846,"style":4839},[4739],[78,84848,25949],{"className":84849,"style":43903},[4667,4678],[78,84851,84853],{"className":84852},[4682],")]]}",[10548,84855,84857],{"id":84856},"_2极大-乘积复合运算","（2）极大-乘积复合运算",[13,84859,84860],{},"设R1和R2分别是定义在XxY和YxZ上的两个模糊关系，R1和R2的极大-乘积复合运算可得到一个模糊关系（集合），可表示为",[78,84862,84864],{"className":84863},[4566],[78,84865,84867,84971],{"className":84866},[4570],[78,84868,84870],{"className":84869},[4574],[4576,84871,84872],{"xmlns":4578,"display":4579},[4581,84873,84874,84968],{},[4584,84875,84876,84882,84884,84890,84892,84894,84896,84898,84900,84902,84904,84906,84908,84918,84920,84930,84932,84934,84936,84938,84940,84942,84952,84954,84956,84958,84960,84962,84964,84966],{},[4600,84877,84878,84880],{},[4596,84879,27152],{},[7077,84881,469],{},[4587,84883,84363],{},[4600,84885,84886,84888],{},[4596,84887,27152],{},[7077,84889,472],{},[4591,84891,4609],{},[4591,84893,55608],{"stretchy":4593},[4591,84895,17845],{"stretchy":4593},[4591,84897,4594],{"stretchy":4593},[4596,84899,4598],{},[4591,84901,2066],{"separator":1419},[4596,84903,25949],{},[4591,84905,4604],{"stretchy":4593},[4591,84907,2066],{"separator":1419},[4628,84909,84910,84916],{},[4584,84911,84912,84914],{},[4596,84913,84394],{},[4591,84915,17553],{},[4596,84917,16867],{},[4591,84919,17845],{"stretchy":4593},[4600,84921,84922,84924],{},[4596,84923,78947],{},[4600,84925,84926,84928],{},[4596,84927,27152],{},[7077,84929,469],{},[4591,84931,4594],{"stretchy":4593},[4596,84933,4598],{},[4591,84935,2066],{"separator":1419},[4596,84937,16867],{},[4591,84939,4604],{"stretchy":4593},[4591,84941,43664],{},[4600,84943,84944,84946],{},[4596,84945,78947],{},[4600,84947,84948,84950],{},[4596,84949,27152],{},[7077,84951,472],{},[4591,84953,4594],{"stretchy":4593},[4596,84955,16867],{},[4591,84957,2066],{"separator":1419},[4596,84959,25949],{},[4591,84961,4604],{"stretchy":4593},[4591,84963,17857],{"stretchy":4593},[4591,84965,17857],{"stretchy":4593},[4591,84967,63381],{"stretchy":4593},[4647,84969,84970],{"encoding":4649},"R_1 ○ R_2 = \\{ [(x , z), \\max \\limits_{y}[\\mu_{R_1}(x,y) \\times \\mu_{R_2}(y,z)]] \\}",[78,84972,84974,85072,85259],{"className":84973,"ariaHidden":1419},[4654],[78,84975,84977,84980,85020,85023,85063,85066,85069],{"className":84976},[4658],[78,84978],{"className":84979,"style":20406},[4662],[78,84981,84983,84986],{"className":84982},[4667],[78,84984,27152],{"className":84985,"style":38285},[4667,4678],[78,84987,84989],{"className":84988},[4689],[78,84990,84992,85012],{"className":84991},[4693,4694],[78,84993,84995,85009],{"className":84994},[4698],[78,84996,84998],{"className":84997,"style":18264},[4702],[78,84999,85000,85003],{"style":84485},[78,85001],{"className":85002,"style":4711},[4710],[78,85004,85006],{"className":85005},[4715,4716,4717,4718],[78,85007,469],{"className":85008},[4667,4718],[78,85010,4726],{"className":85011},[4725],[78,85013,85015],{"className":85014},[4698],[78,85016,85018],{"className":85017,"style":4733},[4702],[78,85019],{},[78,85021,84363],{"className":85022},[4667],[78,85024,85026,85029],{"className":85025},[4667],[78,85027,27152],{"className":85028,"style":38285},[4667,4678],[78,85030,85032],{"className":85031},[4689],[78,85033,85035,85055],{"className":85034},[4693,4694],[78,85036,85038,85052],{"className":85037},[4698],[78,85039,85041],{"className":85040,"style":18264},[4702],[78,85042,85043,85046],{"style":84485},[78,85044],{"className":85045,"style":4711},[4710],[78,85047,85049],{"className":85048},[4715,4716,4717,4718],[78,85050,472],{"className":85051},[4667,4718],[78,85053,4726],{"className":85054},[4725],[78,85056,85058],{"className":85057},[4698],[78,85059,85061],{"className":85060,"style":4733},[4702],[78,85062],{},[78,85064],{"className":85065,"style":4740},[4739],[78,85067,4609],{"className":85068},[4744],[78,85070],{"className":85071,"style":4740},[4739],[78,85073,85075,85078,85081,85084,85087,85090,85093,85096,85099,85102,85149,85152,85232,85235,85238,85241,85244,85247,85250,85253,85256],{"className":85074},[4658],[78,85076],{"className":85077,"style":84564},[4662],[78,85079,84568],{"className":85080},[4674],[78,85082,4598],{"className":85083},[4667,4678],[78,85085,2066],{"className":85086},[5126],[78,85088],{"className":85089,"style":4839},[4739],[78,85091,25949],{"className":85092,"style":43903},[4667,4678],[78,85094,4604],{"className":85095},[4682],[78,85097,2066],{"className":85098},[5126],[78,85100],{"className":85101,"style":4839},[4739],[78,85103,85105],{"className":85104},[4788,52401],[78,85106,85108,85141],{"className":85107},[4693,4694],[78,85109,85111,85138],{"className":85110},[4698],[78,85112,85114,85128],{"className":85113,"style":16838},[4702],[78,85115,85116,85119],{"style":52413},[78,85117],{"className":85118,"style":4781},[4710],[78,85120,85122],{"className":85121},[4715,4716,4717,4718],[78,85123,85125],{"className":85124},[4667,4718],[78,85126,16867],{"className":85127,"style":5187},[4667,4678,4718],[78,85129,85130,85133],{"style":5824},[78,85131],{"className":85132,"style":4781},[4710],[78,85134,85135],{},[78,85136,84394],{"className":85137},[4788],[78,85139,4726],{"className":85140},[4725],[78,85142,85144],{"className":85143},[4698],[78,85145,85147],{"className":85146,"style":84635},[4702],[78,85148],{},[78,85150,17845],{"className":85151},[4674],[78,85153,85155,85158],{"className":85154},[4667],[78,85156,78947],{"className":85157},[4667,4678],[78,85159,85161],{"className":85160},[4689],[78,85162,85164,85224],{"className":85163},[4693,4694],[78,85165,85167,85221],{"className":85166},[4698],[78,85168,85170],{"className":85169,"style":63412},[4702],[78,85171,85172,85175],{"style":4706},[78,85173],{"className":85174,"style":4711},[4710],[78,85176,85178],{"className":85177},[4715,4716,4717,4718],[78,85179,85181],{"className":85180},[4667,4718],[78,85182,85184,85187],{"className":85183},[4667,4718],[78,85185,27152],{"className":85186,"style":38285},[4667,4678,4718],[78,85188,85190],{"className":85189},[4689],[78,85191,85193,85213],{"className":85192},[4693,4694],[78,85194,85196,85210],{"className":85195},[4698],[78,85197,85199],{"className":85198,"style":84694},[4702],[78,85200,85201,85204],{"style":84697},[78,85202],{"className":85203,"style":4896},[4710],[78,85205,85207],{"className":85206},[4715,4900,4901,4718],[78,85208,469],{"className":85209},[4667,4718],[78,85211,4726],{"className":85212},[4725],[78,85214,85216],{"className":85215},[4698],[78,85217,85219],{"className":85218,"style":84716},[4702],[78,85220],{},[78,85222,4726],{"className":85223},[4725],[78,85225,85227],{"className":85226},[4698],[78,85228,85230],{"className":85229,"style":84728},[4702],[78,85231],{},[78,85233,4594],{"className":85234},[4674],[78,85236,4598],{"className":85237},[4667,4678],[78,85239,2066],{"className":85240},[5126],[78,85242],{"className":85243,"style":4839},[4739],[78,85245,16867],{"className":85246,"style":5187},[4667,4678],[78,85248,4604],{"className":85249},[4682],[78,85251],{"className":85252,"style":5143},[4739],[78,85254,43664],{"className":85255},[7450],[78,85257],{"className":85258,"style":5143},[4739],[78,85260,85262,85266,85346,85349,85352,85355,85358,85361],{"className":85261},[4658],[78,85263],{"className":85264,"style":85265},[4662],"height:1.0001em;vertical-align:-0.2501em;",[78,85267,85269,85272],{"className":85268},[4667],[78,85270,78947],{"className":85271},[4667,4678],[78,85273,85275],{"className":85274},[4689],[78,85276,85278,85338],{"className":85277},[4693,4694],[78,85279,85281,85335],{"className":85280},[4698],[78,85282,85284],{"className":85283,"style":63412},[4702],[78,85285,85286,85289],{"style":4706},[78,85287],{"className":85288,"style":4711},[4710],[78,85290,85292],{"className":85291},[4715,4716,4717,4718],[78,85293,85295],{"className":85294},[4667,4718],[78,85296,85298,85301],{"className":85297},[4667,4718],[78,85299,27152],{"className":85300,"style":38285},[4667,4678,4718],[78,85302,85304],{"className":85303},[4689],[78,85305,85307,85327],{"className":85306},[4693,4694],[78,85308,85310,85324],{"className":85309},[4698],[78,85311,85313],{"className":85312,"style":84694},[4702],[78,85314,85315,85318],{"style":84697},[78,85316],{"className":85317,"style":4896},[4710],[78,85319,85321],{"className":85320},[4715,4900,4901,4718],[78,85322,472],{"className":85323},[4667,4718],[78,85325,4726],{"className":85326},[4725],[78,85328,85330],{"className":85329},[4698],[78,85331,85333],{"className":85332,"style":84716},[4702],[78,85334],{},[78,85336,4726],{"className":85337},[4725],[78,85339,85341],{"className":85340},[4698],[78,85342,85344],{"className":85343,"style":84728},[4702],[78,85345],{},[78,85347,4594],{"className":85348},[4674],[78,85350,16867],{"className":85351,"style":5187},[4667,4678],[78,85353,2066],{"className":85354},[5126],[78,85356],{"className":85357,"style":4839},[4739],[78,85359,25949],{"className":85360,"style":43903},[4667,4678],[78,85362,84853],{"className":85363},[4682],[13,85365,85366],{},"关于两个的实际运算见书P197，太多了题主懒得打，其实很好理解，拿极大-极小复合运算举例，极大在前面，那么极大就把极小运算包裹，先做一个极小的矩阵运算后对结果矩阵进行一个极大运算。",[23289,85368],{},[107,85370,85372],{"id":85371},"第4章-人工神经网络","第4章 人工神经网络",[7759,85374,85376],{"id":85375},"_1生物神经系统的特点p261","1、生物神经系统的特点（P261）",[13,85378,85379],{},"（1）生物神经元之间相互连接，其连接强度决定了信号传递的强弱；",[13,85381,85382],{},"（2）神经元之间的连接强度是可以随着训练改变的；",[13,85384,85385],{},"（3）信号可以起刺激作用，也可以起抑制作用；",[13,85387,85388],{},"（4）一个神经元接收信号的累积效果决定了该神经元的状态；",[13,85390,85391],{},"（5）每一个神经元有一个动作阈值。",[23289,85393],{},[7759,85395,85397],{"id":85396},"_2激活函数p263","2、激活函数（P263）",[13,85399,85400],{},"激活函数模拟的是生物神经元对输入信息的处理。激活函数对输入感知器的信息进行处理，并决定其是否有对应的输出以及输出幅度有多大，也可以称为激励函数、活化函数、传递函数等，表达式为",[78,85402,85404],{"className":85403},[4566],[78,85405,85407,85435],{"className":85406},[4570],[78,85408,85410],{"className":85409},[4574],[4576,85411,85412],{"xmlns":4578,"display":4579},[4581,85413,85414,85432],{},[4584,85415,85416,85418,85420,85422,85424,85426,85428,85430],{},[4596,85417,16867],{},[4591,85419,4609],{},[4596,85421,25923],{},[4591,85423,4594],{"stretchy":4593},[4596,85425,18038],{},[4591,85427,7351],{},[4596,85429,12172],{},[4591,85431,4604],{"stretchy":4593},[4647,85433,85434],{"encoding":4649},"y = \\varphi(u + b)",[78,85436,85438,85456,85480],{"className":85437,"ariaHidden":1419},[4654],[78,85439,85441,85444,85447,85450,85453],{"className":85440},[4658],[78,85442],{"className":85443,"style":16971},[4662],[78,85445,16867],{"className":85446,"style":5187},[4667,4678],[78,85448],{"className":85449,"style":4740},[4739],[78,85451,4609],{"className":85452},[4744],[78,85454],{"className":85455,"style":4740},[4739],[78,85457,85459,85462,85465,85468,85471,85474,85477],{"className":85458},[4658],[78,85460],{"className":85461,"style":4663},[4662],[78,85463,25923],{"className":85464},[4667,4678],[78,85466,4594],{"className":85467},[4674],[78,85469,18038],{"className":85470},[4667,4678],[78,85472],{"className":85473,"style":5143},[4739],[78,85475,7351],{"className":85476},[7450],[78,85478],{"className":85479,"style":5143},[4739],[78,85481,85483,85486,85489],{"className":85482},[4658],[78,85484],{"className":85485,"style":4663},[4662],[78,85487,12172],{"className":85488},[4667,4678],[78,85490,4604],{"className":85491},[4682],[13,85493,25995,85494,85496,85497,85500],{},[596,85495,25923],{},"(*)表示激活函数。激活函数是感知器处理的核心部分，",[22,85498,85499],{},"引入激活函数增加了神经网络的非线性特性","，从而使得神经网络能够实现各种复杂功能。如果没有激活函数，无论叠加多少层神经网络，起计算过程都只是线性计算，结果也是个普通矩阵而失去了强大的映射能力。激活函数在神经网络中的地位可见一斑。常见的激活函数：",[10548,85502,85504],{"id":85503},"_1硬极限传输函数","（1）硬极限传输函数",[78,85506,85508],{"className":85507},[4566],[78,85509,85511,85580],{"className":85510},[4570],[78,85512,85514],{"className":85513},[4574],[4576,85515,85516],{"xmlns":4578,"display":4579},[4581,85517,85518,85577],{},[4584,85519,85520,85522,85524,85526,85528,85530],{},[4596,85521,5053],{},[4591,85523,4594],{"stretchy":4593},[4596,85525,19],{},[4591,85527,4604],{"stretchy":4593},[4591,85529,4609],{},[4584,85531,85532,85534],{},[4591,85533,55608],{"fence":1419},[37085,85535,85536,85556],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,85537,85538],{},[37094,85539,85540],{},[37101,85541,85542],{"scriptlevel":2949,"displaystyle":4593},[4584,85543,85544,85547,85549,85551,85554],{},[4596,85545,85546],{},"β",[4591,85548,2066],{"separator":1419},[4596,85550,19],{},[4591,85552,85553],{},"≥",[4596,85555,17463],{},[37091,85557,85558],{},[37094,85559,85560],{},[37101,85561,85562],{"scriptlevel":2949,"displaystyle":4593},[4584,85563,85564,85566,85569,85571,85573,85575],{},[4591,85565,17848],{},[4596,85567,85568],{},"γ",[4591,85570,2066],{"separator":1419},[4596,85572,19],{},[4591,85574,41631],{},[4596,85576,17463],{},[4647,85578,85579],{"encoding":4649},"f(n) = \n\\begin{cases}\n\\beta, n \\geq \\theta \\\\\n- \\gamma , n \u003C \\theta\n\\end{cases}",[78,85581,85583,85610],{"className":85582,"ariaHidden":1419},[4654],[78,85584,85586,85589,85592,85595,85598,85601,85604,85607],{"className":85585},[4658],[78,85587],{"className":85588,"style":4663},[4662],[78,85590,5053],{"className":85591,"style":5170},[4667,4678],[78,85593,4594],{"className":85594},[4674],[78,85596,19],{"className":85597},[4667,4678],[78,85599,4604],{"className":85600},[4682],[78,85602],{"className":85603,"style":4740},[4739],[78,85605,4609],{"className":85606},[4744],[78,85608],{"className":85609,"style":4740},[4739],[78,85611,85613,85617],{"className":85612},[4658],[78,85614],{"className":85615,"style":85616},[4662],"height:3em;vertical-align:-1.25em;",[78,85618,85620,85629,85730],{"className":85619},[18342],[78,85621,85625],{"className":85622,"style":85624},[4674,85623],"delimcenter","top:0em;",[78,85626,55608],{"className":85627},[56026,85628],"size4",[78,85630,85632],{"className":85631},[4667],[78,85633,85635],{"className":85634},[37085],[78,85636,85638],{"className":85637},[38098],[78,85639,85641,85721],{"className":85640},[4693,4694],[78,85642,85644,85718],{"className":85643},[4698],[78,85645,85648,85682],{"className":85646,"style":85647},[4702],"height:1.69em;",[78,85649,85651,85654],{"style":85650},"top:-3.69em;",[78,85652],{"className":85653,"style":56145},[4710],[78,85655,85657,85661,85664,85667,85670,85673,85676,85679],{"className":85656},[4667],[78,85658,85546],{"className":85659,"style":85660},[4667,4678],"margin-right:0.0528em;",[78,85662,2066],{"className":85663},[5126],[78,85665],{"className":85666,"style":4839},[4739],[78,85668,19],{"className":85669},[4667,4678],[78,85671],{"className":85672,"style":4740},[4739],[78,85674,85553],{"className":85675},[4744],[78,85677],{"className":85678,"style":4740},[4739],[78,85680,17463],{"className":85681,"style":17251},[4667,4678],[78,85683,85685,85688],{"style":85684},"top:-2.25em;",[78,85686],{"className":85687,"style":56145},[4710],[78,85689,85691,85694,85697,85700,85703,85706,85709,85712,85715],{"className":85690},[4667],[78,85692,17848],{"className":85693},[4667],[78,85695,85568],{"className":85696,"style":79383},[4667,4678],[78,85698,2066],{"className":85699},[5126],[78,85701],{"className":85702,"style":4839},[4739],[78,85704,19],{"className":85705},[4667,4678],[78,85707],{"className":85708,"style":4740},[4739],[78,85710,41631],{"className":85711},[4744],[78,85713],{"className":85714,"style":4740},[4739],[78,85716,17463],{"className":85717,"style":17251},[4667,4678],[78,85719,4726],{"className":85720},[4725],[78,85722,85724],{"className":85723},[4698],[78,85725,85728],{"className":85726,"style":85727},[4702],"height:1.19em;",[78,85729],{},[78,85731],{"className":85732},[4682,4761],[13,85734,85735,85736,1011,85738,85740,85741,85743,85744,85746,85747,85749],{},"其中，β、",[596,85737,85568],{},[596,85739,17463],{},"均为非负实数，",[596,85742,17463],{},"为阈值。当β=1、",[596,85745,85568],{},"=0时，函数表现为二值形式；当β=1、",[596,85748,85568],{},"=1时，函数表示为双极形式。",[10548,85751,85753],{"id":85752},"_2线性传输函数","（2）线性传输函数",[78,85755,85757],{"className":85756},[4566],[78,85758,85760,85795],{"className":85759},[4570],[78,85761,85763],{"className":85762},[4574],[4576,85764,85765],{"xmlns":4578,"display":4579},[4581,85766,85767,85792],{},[4584,85768,85769,85771,85773,85775,85777,85779,85786,85788,85790],{},[4596,85770,5053],{},[4591,85772,4594],{"stretchy":4593},[4596,85774,19],{},[4591,85776,4604],{"stretchy":4593},[4591,85778,4609],{},[4614,85780,85781,85784],{},[4596,85782,85783],{},"w",[4596,85785,5074],{},[4596,85787,13],{},[4591,85789,7351],{},[4596,85791,12172],{},[4647,85793,85794],{"encoding":4649},"f(n) = w^Tp + b",[78,85796,85798,85825,85874],{"className":85797,"ariaHidden":1419},[4654],[78,85799,85801,85804,85807,85810,85813,85816,85819,85822],{"className":85800},[4658],[78,85802],{"className":85803,"style":4663},[4662],[78,85805,5053],{"className":85806,"style":5170},[4667,4678],[78,85808,4594],{"className":85809},[4674],[78,85811,19],{"className":85812},[4667,4678],[78,85814,4604],{"className":85815},[4682],[78,85817],{"className":85818,"style":4740},[4739],[78,85820,4609],{"className":85821},[4744],[78,85823],{"className":85824,"style":4740},[4739],[78,85826,85828,85832,85862,85865,85868,85871],{"className":85827},[4658],[78,85829],{"className":85830,"style":85831},[4662],"height:1.0858em;vertical-align:-0.1944em;",[78,85833,85835,85839],{"className":85834},[4667],[78,85836,85783],{"className":85837,"style":85838},[4667,4678],"margin-right:0.0269em;",[78,85840,85842],{"className":85841},[4689],[78,85843,85845],{"className":85844},[4693],[78,85846,85848],{"className":85847},[4698],[78,85849,85851],{"className":85850,"style":5206},[4702],[78,85852,85853,85856],{"style":5209},[78,85854],{"className":85855,"style":4711},[4710],[78,85857,85859],{"className":85858},[4715,4716,4717,4718],[78,85860,5074],{"className":85861,"style":5219},[4667,4678,4718],[78,85863,13],{"className":85864},[4667,4678],[78,85866],{"className":85867,"style":5143},[4739],[78,85869,7351],{"className":85870},[7450],[78,85872],{"className":85873,"style":5143},[4739],[78,85875,85877,85880],{"className":85876},[4658],[78,85878],{"className":85879,"style":16794},[4662],[78,85881,12172],{"className":85882},[4667,4678],[13,85884,85885],{},"当b = 0时，传输函数关于原点中心对称，这是常见的一种形式。",[10548,85887,85889],{"id":85888},"_3对数s型函数","（3）对数S型函数",[13,85891,85892],{},"对数S型函数的两种形式分别为逻辑斯特函数和压缩函数。",[13,85894,85895],{},"【1】逻辑斯特函数（Logistic Function）",[78,85897,85899],{"className":85898},[4566],[78,85900,85902,85948],{"className":85901},[4570],[78,85903,85905],{"className":85904},[4574],[4576,85906,85907],{"xmlns":4578,"display":4579},[4581,85908,85909,85945],{},[4584,85910,85911,85913,85915,85917,85919,85921],{},[4596,85912,5053],{},[4591,85914,4594],{"stretchy":4593},[4596,85916,19],{},[4591,85918,4604],{"stretchy":4593},[4591,85920,4609],{},[4611,85922,85923,85925],{},[7077,85924,469],{},[4584,85926,85927,85929,85931],{},[7077,85928,469],{},[4591,85930,7351],{},[4614,85932,85933,85935],{},[4596,85934,4618],{},[4584,85936,85937,85939,85941,85943],{},[4591,85938,17848],{},[4596,85940,5245],{},[4591,85942,43664],{},[4596,85944,19],{},[4647,85946,85947],{"encoding":4649},"f(n) = \\frac{1}{1 + e^{-d \\times n}}",[78,85949,85951,85978],{"className":85950,"ariaHidden":1419},[4654],[78,85952,85954,85957,85960,85963,85966,85969,85972,85975],{"className":85953},[4658],[78,85955],{"className":85956,"style":4663},[4662],[78,85958,5053],{"className":85959,"style":5170},[4667,4678],[78,85961,4594],{"className":85962},[4674],[78,85964,19],{"className":85965},[4667,4678],[78,85967,4604],{"className":85968},[4682],[78,85970],{"className":85971,"style":4740},[4739],[78,85973,4609],{"className":85974},[4744],[78,85976],{"className":85977,"style":4740},[4739],[78,85979,85981,85985],{"className":85980},[4658],[78,85982],{"className":85983,"style":85984},[4662],"height:2.0908em;vertical-align:-0.7693em;",[78,85986,85988,85991,86096],{"className":85987},[4667],[78,85989],{"className":85990},[4674,4761],[78,85992,85994],{"className":85993},[4611],[78,85995,85997,86088],{"className":85996},[4693,4694],[78,85998,86000,86085],{"className":85999},[4698],[78,86001,86004,86066,86074],{"className":86002,"style":86003},[4702],"height:1.3214em;",[78,86005,86006,86009],{"style":4777},[78,86007],{"className":86008,"style":4781},[4710],[78,86010,86012,86015,86018,86021,86024],{"className":86011},[4667],[78,86013,469],{"className":86014},[4667],[78,86016],{"className":86017,"style":5143},[4739],[78,86019,7351],{"className":86020},[7450],[78,86022],{"className":86023,"style":5143},[4739],[78,86025,86027,86030],{"className":86026},[4667],[78,86028,4618],{"className":86029},[4667,4678],[78,86031,86033],{"className":86032},[4689],[78,86034,86036],{"className":86035},[4693],[78,86037,86039],{"className":86038},[4698],[78,86040,86043],{"className":86041,"style":86042},[4702],"height:0.7751em;",[78,86044,86045,86048],{"style":19600},[78,86046],{"className":86047,"style":4711},[4710],[78,86049,86051],{"className":86050},[4715,4716,4717,4718],[78,86052,86054,86057,86060,86063],{"className":86053},[4667,4718],[78,86055,17848],{"className":86056},[4667,4718],[78,86058,5245],{"className":86059},[4667,4678,4718],[78,86061,43664],{"className":86062},[7450,4718],[78,86064,19],{"className":86065},[4667,4678,4718],[78,86067,86068,86071],{"style":4919},[78,86069],{"className":86070,"style":4781},[4710],[78,86072],{"className":86073,"style":4927},[4926],[78,86075,86076,86079],{"style":4930},[78,86077],{"className":86078,"style":4781},[4710],[78,86080,86082],{"className":86081},[4667],[78,86083,469],{"className":86084},[4667],[78,86086,4726],{"className":86087},[4725],[78,86089,86091],{"className":86090},[4698],[78,86092,86094],{"className":86093,"style":83332},[4702],[78,86095],{},[78,86097],{"className":86098},[4682,4761],[13,86100,86101],{},"其中，d为常实数，函数的饱和值为0和1。",[13,86103,86104],{},"【2】压缩函数（Squashing Function）",[78,86106,86108],{"className":86107},[4566],[78,86109,86111,86163],{"className":86110},[4570],[78,86112,86114],{"className":86113},[4574],[4576,86115,86116],{"xmlns":4578,"display":4579},[4581,86117,86118,86160],{},[4584,86119,86120,86122,86124,86126,86128,86130],{},[4596,86121,5053],{},[4591,86123,4594],{"stretchy":4593},[4596,86125,19],{},[4591,86127,4604],{"stretchy":4593},[4591,86129,4609],{},[4611,86131,86132,86140],{},[4584,86133,86134,86136,86138],{},[4596,86135,43673],{},[4591,86137,7351],{},[4596,86139,26052],{},[4584,86141,86142,86144,86146],{},[7077,86143,469],{},[4591,86145,7351],{},[4614,86147,86148,86150],{},[4596,86149,4618],{},[4584,86151,86152,86154,86156,86158],{},[4591,86153,17848],{},[4596,86155,5245],{},[4591,86157,43664],{},[4596,86159,19],{},[4647,86161,86162],{"encoding":4649},"f(n) = \\frac{g + h}{1 + e^{-d \\times n}}",[78,86164,86166,86193],{"className":86165,"ariaHidden":1419},[4654],[78,86167,86169,86172,86175,86178,86181,86184,86187,86190],{"className":86168},[4658],[78,86170],{"className":86171,"style":4663},[4662],[78,86173,5053],{"className":86174,"style":5170},[4667,4678],[78,86176,4594],{"className":86177},[4674],[78,86179,19],{"className":86180},[4667,4678],[78,86182,4604],{"className":86183},[4682],[78,86185],{"className":86186,"style":4740},[4739],[78,86188,4609],{"className":86189},[4744],[78,86191],{"className":86192,"style":4740},[4739],[78,86194,86196,86200],{"className":86195},[4658],[78,86197],{"className":86198,"style":86199},[4662],"height:2.1408em;vertical-align:-0.7693em;",[78,86201,86203,86206,86321],{"className":86202},[4667],[78,86204],{"className":86205},[4674,4761],[78,86207,86209],{"className":86208},[4611],[78,86210,86212,86313],{"className":86211},[4693,4694],[78,86213,86215,86310],{"className":86214},[4698],[78,86216,86218,86279,86287],{"className":86217,"style":83268},[4702],[78,86219,86220,86223],{"style":4777},[78,86221],{"className":86222,"style":4781},[4710],[78,86224,86226,86229,86232,86235,86238],{"className":86225},[4667],[78,86227,469],{"className":86228},[4667],[78,86230],{"className":86231,"style":5143},[4739],[78,86233,7351],{"className":86234},[7450],[78,86236],{"className":86237,"style":5143},[4739],[78,86239,86241,86244],{"className":86240},[4667],[78,86242,4618],{"className":86243},[4667,4678],[78,86245,86247],{"className":86246},[4689],[78,86248,86250],{"className":86249},[4693],[78,86251,86253],{"className":86252},[4698],[78,86254,86256],{"className":86255,"style":86042},[4702],[78,86257,86258,86261],{"style":19600},[78,86259],{"className":86260,"style":4711},[4710],[78,86262,86264],{"className":86263},[4715,4716,4717,4718],[78,86265,86267,86270,86273,86276],{"className":86266},[4667,4718],[78,86268,17848],{"className":86269},[4667,4718],[78,86271,5245],{"className":86272},[4667,4678,4718],[78,86274,43664],{"className":86275},[7450,4718],[78,86277,19],{"className":86278},[4667,4678,4718],[78,86280,86281,86284],{"style":4919},[78,86282],{"className":86283,"style":4781},[4710],[78,86285],{"className":86286,"style":4927},[4926],[78,86288,86289,86292],{"style":4930},[78,86290],{"className":86291,"style":4781},[4710],[78,86293,86295,86298,86301,86304,86307],{"className":86294},[4667],[78,86296,43673],{"className":86297,"style":5187},[4667,4678],[78,86299],{"className":86300,"style":5143},[4739],[78,86302,7351],{"className":86303},[7450],[78,86305],{"className":86306,"style":5143},[4739],[78,86308,26052],{"className":86309},[4667,4678],[78,86311,4726],{"className":86312},[4725],[78,86314,86316],{"className":86315},[4698],[78,86317,86319],{"className":86318,"style":83332},[4702],[78,86320],{},[78,86322],{"className":86323},[4682,4761],[13,86325,86326],{},"其中，g、h、d为常数，函数的饱和值为g和g+h。",[10548,86328,86330],{"id":86329},"_4其他常见传输函数","（4）其他常见传输函数",[13,86332,86333],{},"【1】硬极限函数（Hardlim）",[78,86335,86337],{"className":86336},[4566],[78,86338,86340,86398],{"className":86339},[4570],[78,86341,86343],{"className":86342},[4574],[4576,86344,86345],{"xmlns":4578,"display":4579},[4581,86346,86347,86395],{},[4584,86348,86349,86351,86353],{},[4596,86350,5053],{},[4591,86352,4609],{},[4584,86354,86355,86357],{},[4591,86356,55608],{"fence":1419},[37085,86358,86359,86377],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,86360,86361],{},[37094,86362,86363],{},[37101,86364,86365],{"scriptlevel":2949,"displaystyle":4593},[4584,86366,86367,86369,86371,86373,86375],{},[7077,86368,2949],{},[4591,86370,2066],{"separator":1419},[4596,86372,19],{},[4591,86374,41631],{},[7077,86376,2949],{},[37091,86378,86379],{},[37094,86380,86381],{},[37101,86382,86383],{"scriptlevel":2949,"displaystyle":4593},[4584,86384,86385,86387,86389,86391,86393],{},[7077,86386,469],{},[4591,86388,2066],{"separator":1419},[4596,86390,19],{},[4591,86392,85553],{},[7077,86394,2949],{},[4647,86396,86397],{"encoding":4649},"f = \n\\begin{cases}\n0, n \u003C 0 \\\\\n1, n \\geq 0\n\\end{cases}",[78,86399,86401,86419],{"className":86400,"ariaHidden":1419},[4654],[78,86402,86404,86407,86410,86413,86416],{"className":86403},[4658],[78,86405],{"className":86406,"style":43725},[4662],[78,86408,5053],{"className":86409,"style":5170},[4667,4678],[78,86411],{"className":86412,"style":4740},[4739],[78,86414,4609],{"className":86415},[4744],[78,86417],{"className":86418,"style":4740},[4739],[78,86420,86422,86425],{"className":86421},[4658],[78,86423],{"className":86424,"style":85616},[4662],[78,86426,86428,86434,86527],{"className":86427},[18342],[78,86429,86431],{"className":86430,"style":85624},[4674,85623],[78,86432,55608],{"className":86433},[56026,85628],[78,86435,86437],{"className":86436},[4667],[78,86438,86440],{"className":86439},[37085],[78,86441,86443],{"className":86442},[38098],[78,86444,86446,86519],{"className":86445},[4693,4694],[78,86447,86449,86516],{"className":86448},[4698],[78,86450,86452,86484],{"className":86451,"style":85647},[4702],[78,86453,86454,86457],{"style":85650},[78,86455],{"className":86456,"style":56145},[4710],[78,86458,86460,86463,86466,86469,86472,86475,86478,86481],{"className":86459},[4667],[78,86461,2949],{"className":86462},[4667],[78,86464,2066],{"className":86465},[5126],[78,86467],{"className":86468,"style":4839},[4739],[78,86470,19],{"className":86471},[4667,4678],[78,86473],{"className":86474,"style":4740},[4739],[78,86476,41631],{"className":86477},[4744],[78,86479],{"className":86480,"style":4740},[4739],[78,86482,2949],{"className":86483},[4667],[78,86485,86486,86489],{"style":85684},[78,86487],{"className":86488,"style":56145},[4710],[78,86490,86492,86495,86498,86501,86504,86507,86510,86513],{"className":86491},[4667],[78,86493,469],{"className":86494},[4667],[78,86496,2066],{"className":86497},[5126],[78,86499],{"className":86500,"style":4839},[4739],[78,86502,19],{"className":86503},[4667,4678],[78,86505],{"className":86506,"style":4740},[4739],[78,86508,85553],{"className":86509},[4744],[78,86511],{"className":86512,"style":4740},[4739],[78,86514,2949],{"className":86515},[4667],[78,86517,4726],{"className":86518},[4725],[78,86520,86522],{"className":86521},[4698],[78,86523,86525],{"className":86524,"style":85727},[4702],[78,86526],{},[78,86528],{"className":86529},[4682,4761],[13,86531,86532],{},"【2】对称极限函数（Hardlims）",[78,86534,86536],{"className":86535},[4566],[78,86537,86539,86599],{"className":86538},[4570],[78,86540,86542],{"className":86541},[4574],[4576,86543,86544],{"xmlns":4578,"display":4579},[4581,86545,86546,86596],{},[4584,86547,86548,86550,86552],{},[4596,86549,5053],{},[4591,86551,4609],{},[4584,86553,86554,86556],{},[4591,86555,55608],{"fence":1419},[37085,86557,86558,86578],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,86559,86560],{},[37094,86561,86562],{},[37101,86563,86564],{"scriptlevel":2949,"displaystyle":4593},[4584,86565,86566,86568,86570,86572,86574,86576],{},[4591,86567,17848],{},[7077,86569,469],{},[4591,86571,2066],{"separator":1419},[4596,86573,19],{},[4591,86575,41631],{},[7077,86577,2949],{},[37091,86579,86580],{},[37094,86581,86582],{},[37101,86583,86584],{"scriptlevel":2949,"displaystyle":4593},[4584,86585,86586,86588,86590,86592,86594],{},[7077,86587,469],{},[4591,86589,2066],{"separator":1419},[4596,86591,19],{},[4591,86593,85553],{},[7077,86595,2949],{},[4647,86597,86598],{"encoding":4649},"f = \n\\begin{cases}\n-1, n \u003C 0 \\\\\n1, n \\geq 0\n\\end{cases}",[78,86600,86602,86620],{"className":86601,"ariaHidden":1419},[4654],[78,86603,86605,86608,86611,86614,86617],{"className":86604},[4658],[78,86606],{"className":86607,"style":43725},[4662],[78,86609,5053],{"className":86610,"style":5170},[4667,4678],[78,86612],{"className":86613,"style":4740},[4739],[78,86615,4609],{"className":86616},[4744],[78,86618],{"className":86619,"style":4740},[4739],[78,86621,86623,86626],{"className":86622},[4658],[78,86624],{"className":86625,"style":85616},[4662],[78,86627,86629,86635,86731],{"className":86628},[18342],[78,86630,86632],{"className":86631,"style":85624},[4674,85623],[78,86633,55608],{"className":86634},[56026,85628],[78,86636,86638],{"className":86637},[4667],[78,86639,86641],{"className":86640},[37085],[78,86642,86644],{"className":86643},[38098],[78,86645,86647,86723],{"className":86646},[4693,4694],[78,86648,86650,86720],{"className":86649},[4698],[78,86651,86653,86688],{"className":86652,"style":85647},[4702],[78,86654,86655,86658],{"style":85650},[78,86656],{"className":86657,"style":56145},[4710],[78,86659,86661,86664,86667,86670,86673,86676,86679,86682,86685],{"className":86660},[4667],[78,86662,17848],{"className":86663},[4667],[78,86665,469],{"className":86666},[4667],[78,86668,2066],{"className":86669},[5126],[78,86671],{"className":86672,"style":4839},[4739],[78,86674,19],{"className":86675},[4667,4678],[78,86677],{"className":86678,"style":4740},[4739],[78,86680,41631],{"className":86681},[4744],[78,86683],{"className":86684,"style":4740},[4739],[78,86686,2949],{"className":86687},[4667],[78,86689,86690,86693],{"style":85684},[78,86691],{"className":86692,"style":56145},[4710],[78,86694,86696,86699,86702,86705,86708,86711,86714,86717],{"className":86695},[4667],[78,86697,469],{"className":86698},[4667],[78,86700,2066],{"className":86701},[5126],[78,86703],{"className":86704,"style":4839},[4739],[78,86706,19],{"className":86707},[4667,4678],[78,86709],{"className":86710,"style":4740},[4739],[78,86712,85553],{"className":86713},[4744],[78,86715],{"className":86716,"style":4740},[4739],[78,86718,2949],{"className":86719},[4667],[78,86721,4726],{"className":86722},[4725],[78,86724,86726],{"className":86725},[4698],[78,86727,86729],{"className":86728,"style":85727},[4702],[78,86730],{},[78,86732],{"className":86733},[4682,4761],[13,86735,86736],{},"【3】线性函数（Pureline）",[78,86738,86740],{"className":86739},[4566],[78,86741,86743,86761],{"className":86742},[4570],[78,86744,86746],{"className":86745},[4574],[4576,86747,86748],{"xmlns":4578,"display":4579},[4581,86749,86750,86758],{},[4584,86751,86752,86754,86756],{},[4596,86753,5053],{},[4591,86755,4609],{},[4596,86757,19],{},[4647,86759,86760],{"encoding":4649},"f = n",[78,86762,86764,86782],{"className":86763,"ariaHidden":1419},[4654],[78,86765,86767,86770,86773,86776,86779],{"className":86766},[4658],[78,86768],{"className":86769,"style":43725},[4662],[78,86771,5053],{"className":86772,"style":5170},[4667,4678],[78,86774],{"className":86775,"style":4740},[4739],[78,86777,4609],{"className":86778},[4744],[78,86780],{"className":86781,"style":4740},[4739],[78,86783,86785,86788],{"className":86784},[4658],[78,86786],{"className":86787,"style":16838},[4662],[78,86789,19],{"className":86790},[4667,4678],[13,86792,86793],{},"【4】饱和线性函数（Satlin）",[78,86795,86797],{"className":86796},[4566],[78,86798,86800,86880],{"className":86799},[4570],[78,86801,86803],{"className":86802},[4574],[4576,86804,86805],{"xmlns":4578,"display":4579},[4581,86806,86807,86877],{},[4584,86808,86809,86811,86813],{},[4596,86810,5053],{},[4591,86812,4609],{},[4584,86814,86815,86817],{},[4591,86816,55608],{"fence":1419},[37085,86818,86819,86837,86859],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,86820,86821],{},[37094,86822,86823],{},[37101,86824,86825],{"scriptlevel":2949,"displaystyle":4593},[4584,86826,86827,86829,86831,86833,86835],{},[7077,86828,2949],{},[4591,86830,2066],{"separator":1419},[4596,86832,19],{},[4591,86834,41631],{},[7077,86836,2949],{},[37091,86838,86839],{},[37094,86840,86841],{},[37101,86842,86843],{"scriptlevel":2949,"displaystyle":4593},[4584,86844,86845,86847,86849,86851,86853,86855,86857],{},[4596,86846,19],{},[4591,86848,2066],{"separator":1419},[7077,86850,2949],{},[4591,86852,52344],{},[4596,86854,19],{},[4591,86856,52344],{},[7077,86858,469],{},[37091,86860,86861],{},[37094,86862,86863],{},[37101,86864,86865],{"scriptlevel":2949,"displaystyle":4593},[4584,86866,86867,86869,86871,86873,86875],{},[7077,86868,469],{},[4591,86870,2066],{"separator":1419},[4596,86872,19],{},[4591,86874,52294],{},[7077,86876,469],{},[4647,86878,86879],{"encoding":4649},"f = \n\\begin{cases}\n0, n \u003C 0 \\\\\nn, 0 \\leq n \\leq 1 \\\\\n1, n > 1\n\\end{cases}",[78,86881,86883,86901],{"className":86882,"ariaHidden":1419},[4654],[78,86884,86886,86889,86892,86895,86898],{"className":86885},[4658],[78,86887],{"className":86888,"style":43725},[4662],[78,86890,5053],{"className":86891,"style":5170},[4667,4678],[78,86893],{"className":86894,"style":4740},[4739],[78,86896,4609],{"className":86897},[4744],[78,86899],{"className":86900,"style":4740},[4739],[78,86902,86904,86907],{"className":86903},[4658],[78,86905],{"className":86906,"style":56016},[4662],[78,86908,86910,86988,87125],{"className":86909},[18342],[78,86911,86913],{"className":86912},[4674],[78,86914,86916],{"className":86915},[56026,56027],[78,86917,86919,86980],{"className":86918},[4693,4694],[78,86920,86922,86977],{"className":86921},[4698],[78,86923,86925,86935,86946,86956,86967],{"className":86924,"style":56037},[4702],[78,86926,86927,86930],{"style":56040},[78,86928],{"className":86929,"style":56044},[4710],[78,86931,86933],{"className":86932},[56048,56049],[78,86934,56052],{},[78,86936,86937,86940],{"style":56055},[78,86938],{"className":86939,"style":56044},[4710],[78,86941,86942],{"style":56061},[5884,86943,86944],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,86945],{"d":56071},[78,86947,86948,86951],{"style":56074},[78,86949],{"className":86950,"style":56044},[4710],[78,86952,86954],{"className":86953},[56048,56049],[78,86955,56083],{},[78,86957,86958,86961],{"style":56086},[78,86959],{"className":86960,"style":56044},[4710],[78,86962,86963],{"style":56061},[5884,86964,86965],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,86966],{"d":56071},[78,86968,86969,86972],{"style":56098},[78,86970],{"className":86971,"style":56044},[4710],[78,86973,86975],{"className":86974},[56048,56049],[78,86976,56107],{},[78,86978,4726],{"className":86979},[4725],[78,86981,86983],{"className":86982},[4698],[78,86984,86986],{"className":86985,"style":56117},[4702],[78,86987],{},[78,86989,86991],{"className":86990},[4667],[78,86992,86994],{"className":86993},[37085],[78,86995,86997],{"className":86996},[38098],[78,86998,87000,87117],{"className":86999},[4693,4694],[78,87001,87003,87114],{"className":87002},[4698],[78,87004,87006,87038,87082],{"className":87005,"style":56138},[4702],[78,87007,87008,87011],{"style":56141},[78,87009],{"className":87010,"style":56145},[4710],[78,87012,87014,87017,87020,87023,87026,87029,87032,87035],{"className":87013},[4667],[78,87015,2949],{"className":87016},[4667],[78,87018,2066],{"className":87019},[5126],[78,87021],{"className":87022,"style":4839},[4739],[78,87024,19],{"className":87025},[4667,4678],[78,87027],{"className":87028,"style":4740},[4739],[78,87030,41631],{"className":87031},[4744],[78,87033],{"className":87034,"style":4740},[4739],[78,87036,2949],{"className":87037},[4667],[78,87039,87040,87043],{"style":56318},[78,87041],{"className":87042,"style":56145},[4710],[78,87044,87046,87049,87052,87055,87058,87061,87064,87067,87070,87073,87076,87079],{"className":87045},[4667],[78,87047,19],{"className":87048},[4667,4678],[78,87050,2066],{"className":87051},[5126],[78,87053],{"className":87054,"style":4839},[4739],[78,87056,2949],{"className":87057},[4667],[78,87059],{"className":87060,"style":4740},[4739],[78,87062,52344],{"className":87063},[4744],[78,87065],{"className":87066,"style":4740},[4739],[78,87068,19],{"className":87069},[4667,4678],[78,87071],{"className":87072,"style":4740},[4739],[78,87074,52344],{"className":87075},[4744],[78,87077],{"className":87078,"style":4740},[4739],[78,87080,469],{"className":87081},[4667],[78,87083,87084,87087],{"style":56444},[78,87085],{"className":87086,"style":56145},[4710],[78,87088,87090,87093,87096,87099,87102,87105,87108,87111],{"className":87089},[4667],[78,87091,469],{"className":87092},[4667],[78,87094,2066],{"className":87095},[5126],[78,87097],{"className":87098,"style":4839},[4739],[78,87100,19],{"className":87101},[4667,4678],[78,87103],{"className":87104,"style":4740},[4739],[78,87106,52294],{"className":87107},[4744],[78,87109],{"className":87110,"style":4740},[4739],[78,87112,469],{"className":87113},[4667],[78,87115,4726],{"className":87116},[4725],[78,87118,87120],{"className":87119},[4698],[78,87121,87123],{"className":87122,"style":56564},[4702],[78,87124],{},[78,87126],{"className":87127},[4682,4761],[13,87129,87130],{},"【5】对称饱和线性函数（Satlins）",[78,87132,87134],{"className":87133},[4566],[78,87135,87137,87173],{"className":87136},[4570],[78,87138,87140],{"className":87139},[4574],[4576,87141,87142],{"xmlns":4578,"display":4579},[4581,87143,87144,87170],{},[4584,87145,87146,87148,87150],{},[4596,87147,5053],{},[4591,87149,4609],{},[4611,87151,87152,87154],{},[7077,87153,469],{},[4584,87155,87156,87158,87160],{},[7077,87157,469],{},[4591,87159,7351],{},[4614,87161,87162,87164],{},[4596,87163,4618],{},[4584,87165,87166,87168],{},[4591,87167,17848],{},[4596,87169,19],{},[4647,87171,87172],{"encoding":4649},"f = \\frac{1}{1 + e^{-n}}",[78,87174,87176,87194],{"className":87175,"ariaHidden":1419},[4654],[78,87177,87179,87182,87185,87188,87191],{"className":87178},[4658],[78,87180],{"className":87181,"style":43725},[4662],[78,87183,5053],{"className":87184,"style":5170},[4667,4678],[78,87186],{"className":87187,"style":4740},[4739],[78,87189,4609],{"className":87190},[4744],[78,87192],{"className":87193,"style":4740},[4739],[78,87195,87197,87200],{"className":87196},[4658],[78,87198],{"className":87199,"style":85984},[4662],[78,87201,87203,87206,87304],{"className":87202},[4667],[78,87204],{"className":87205},[4674,4761],[78,87207,87209],{"className":87208},[4611],[78,87210,87212,87296],{"className":87211},[4693,4694],[78,87213,87215,87293],{"className":87214},[4698],[78,87216,87218,87274,87282],{"className":87217,"style":86003},[4702],[78,87219,87220,87223],{"style":4777},[78,87221],{"className":87222,"style":4781},[4710],[78,87224,87226,87229,87232,87235,87238],{"className":87225},[4667],[78,87227,469],{"className":87228},[4667],[78,87230],{"className":87231,"style":5143},[4739],[78,87233,7351],{"className":87234},[7450],[78,87236],{"className":87237,"style":5143},[4739],[78,87239,87241,87244],{"className":87240},[4667],[78,87242,4618],{"className":87243},[4667,4678],[78,87245,87247],{"className":87246},[4689],[78,87248,87250],{"className":87249},[4693],[78,87251,87253],{"className":87252},[4698],[78,87254,87257],{"className":87255,"style":87256},[4702],"height:0.6973em;",[78,87258,87259,87262],{"style":19600},[78,87260],{"className":87261,"style":4711},[4710],[78,87263,87265],{"className":87264},[4715,4716,4717,4718],[78,87266,87268,87271],{"className":87267},[4667,4718],[78,87269,17848],{"className":87270},[4667,4718],[78,87272,19],{"className":87273},[4667,4678,4718],[78,87275,87276,87279],{"style":4919},[78,87277],{"className":87278,"style":4781},[4710],[78,87280],{"className":87281,"style":4927},[4926],[78,87283,87284,87287],{"style":4930},[78,87285],{"className":87286,"style":4781},[4710],[78,87288,87290],{"className":87289},[4667],[78,87291,469],{"className":87292},[4667],[78,87294,4726],{"className":87295},[4725],[78,87297,87299],{"className":87298},[4698],[78,87300,87302],{"className":87301,"style":83332},[4702],[78,87303],{},[78,87305],{"className":87306},[4682,4761],[13,87308,87309],{},"【6】双曲正切S型函数（Tansigs）",[78,87311,87313],{"className":87312},[4566],[78,87314,87316,87374],{"className":87315},[4570],[78,87317,87319],{"className":87318},[4574],[4576,87320,87321],{"xmlns":4578,"display":4579},[4581,87322,87323,87371],{},[4584,87324,87325,87327,87329],{},[4596,87326,5053],{},[4591,87328,4609],{},[4611,87330,87331,87351],{},[4584,87332,87333,87339,87341],{},[4614,87334,87335,87337],{},[4596,87336,4618],{},[4596,87338,19],{},[4591,87340,17848],{},[4614,87342,87343,87345],{},[4596,87344,4618],{},[4584,87346,87347,87349],{},[4591,87348,17848],{},[4596,87350,19],{},[4584,87352,87353,87359,87361],{},[4614,87354,87355,87357],{},[4596,87356,4618],{},[4596,87358,19],{},[4591,87360,7351],{},[4614,87362,87363,87365],{},[4596,87364,4618],{},[4584,87366,87367,87369],{},[4591,87368,17848],{},[4596,87370,19],{},[4647,87372,87373],{"encoding":4649},"f = \\frac{e^n - e^{-n}}{e^n + e^{-n}}",[78,87375,87377,87395],{"className":87376,"ariaHidden":1419},[4654],[78,87378,87380,87383,87386,87389,87392],{"className":87379},[4658],[78,87381],{"className":87382,"style":43725},[4662],[78,87384,5053],{"className":87385,"style":5170},[4667,4678],[78,87387],{"className":87388,"style":4740},[4739],[78,87390,4609],{"className":87391},[4744],[78,87393],{"className":87394,"style":4740},[4739],[78,87396,87398,87402],{"className":87397},[4658],[78,87399],{"className":87400,"style":87401},[4662],"height:2.2177em;vertical-align:-0.7693em;",[78,87403,87405,87408,87604],{"className":87404},[4667],[78,87406],{"className":87407},[4674,4761],[78,87409,87411],{"className":87410},[4611],[78,87412,87414,87596],{"className":87413},[4693,4694],[78,87415,87417,87593],{"className":87416},[4698],[78,87418,87421,87503,87511],{"className":87419,"style":87420},[4702],"height:1.4483em;",[78,87422,87423,87426],{"style":4777},[78,87424],{"className":87425,"style":4781},[4710],[78,87427,87429,87459,87462,87465,87468],{"className":87428},[4667],[78,87430,87432,87435],{"className":87431},[4667],[78,87433,4618],{"className":87434},[4667,4678],[78,87436,87438],{"className":87437},[4689],[78,87439,87441],{"className":87440},[4693],[78,87442,87444],{"className":87443},[4698],[78,87445,87448],{"className":87446,"style":87447},[4702],"height:0.5904em;",[78,87449,87450,87453],{"style":19600},[78,87451],{"className":87452,"style":4711},[4710],[78,87454,87456],{"className":87455},[4715,4716,4717,4718],[78,87457,19],{"className":87458},[4667,4678,4718],[78,87460],{"className":87461,"style":5143},[4739],[78,87463,7351],{"className":87464},[7450],[78,87466],{"className":87467,"style":5143},[4739],[78,87469,87471,87474],{"className":87470},[4667],[78,87472,4618],{"className":87473},[4667,4678],[78,87475,87477],{"className":87476},[4689],[78,87478,87480],{"className":87479},[4693],[78,87481,87483],{"className":87482},[4698],[78,87484,87486],{"className":87485,"style":87256},[4702],[78,87487,87488,87491],{"style":19600},[78,87489],{"className":87490,"style":4711},[4710],[78,87492,87494],{"className":87493},[4715,4716,4717,4718],[78,87495,87497,87500],{"className":87496},[4667,4718],[78,87498,17848],{"className":87499},[4667,4718],[78,87501,19],{"className":87502},[4667,4678,4718],[78,87504,87505,87508],{"style":4919},[78,87506],{"className":87507,"style":4781},[4710],[78,87509],{"className":87510,"style":4927},[4926],[78,87512,87513,87516],{"style":4930},[78,87514],{"className":87515,"style":4781},[4710],[78,87517,87519,87548,87551,87554,87557],{"className":87518},[4667],[78,87520,87522,87525],{"className":87521},[4667],[78,87523,4618],{"className":87524},[4667,4678],[78,87526,87528],{"className":87527},[4689],[78,87529,87531],{"className":87530},[4693],[78,87532,87534],{"className":87533},[4698],[78,87535,87537],{"className":87536,"style":56349},[4702],[78,87538,87539,87542],{"style":4958},[78,87540],{"className":87541,"style":4711},[4710],[78,87543,87545],{"className":87544},[4715,4716,4717,4718],[78,87546,19],{"className":87547},[4667,4678,4718],[78,87549],{"className":87550,"style":5143},[4739],[78,87552,17848],{"className":87553},[7450],[78,87555],{"className":87556,"style":5143},[4739],[78,87558,87560,87563],{"className":87559},[4667],[78,87561,4618],{"className":87562},[4667,4678],[78,87564,87566],{"className":87565},[4689],[78,87567,87569],{"className":87568},[4693],[78,87570,87572],{"className":87571},[4698],[78,87573,87576],{"className":87574,"style":87575},[4702],"height:0.7713em;",[78,87577,87578,87581],{"style":4958},[78,87579],{"className":87580,"style":4711},[4710],[78,87582,87584],{"className":87583},[4715,4716,4717,4718],[78,87585,87587,87590],{"className":87586},[4667,4718],[78,87588,17848],{"className":87589},[4667,4718],[78,87591,19],{"className":87592},[4667,4678,4718],[78,87594,4726],{"className":87595},[4725],[78,87597,87599],{"className":87598},[4698],[78,87600,87602],{"className":87601,"style":83332},[4702],[78,87603],{},[78,87605],{"className":87606},[4682,4761],[13,87608,87609],{},"【7】正线性函数（Poslin）",[78,87611,87613],{"className":87612},[4566],[78,87614,87616,87674],{"className":87615},[4570],[78,87617,87619],{"className":87618},[4574],[4576,87620,87621],{"xmlns":4578,"display":4579},[4581,87622,87623,87671],{},[4584,87624,87625,87627,87629],{},[4596,87626,5053],{},[4591,87628,4609],{},[4584,87630,87631,87633],{},[4591,87632,55608],{"fence":1419},[37085,87634,87635,87653],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,87636,87637],{},[37094,87638,87639],{},[37101,87640,87641],{"scriptlevel":2949,"displaystyle":4593},[4584,87642,87643,87645,87647,87649,87651],{},[7077,87644,2949],{},[4591,87646,2066],{"separator":1419},[4596,87648,19],{},[4591,87650,41631],{},[7077,87652,2949],{},[37091,87654,87655],{},[37094,87656,87657],{},[37101,87658,87659],{"scriptlevel":2949,"displaystyle":4593},[4584,87660,87661,87663,87665,87667,87669],{},[4596,87662,19],{},[4591,87664,2066],{"separator":1419},[4596,87666,19],{},[4591,87668,85553],{},[7077,87670,2949],{},[4647,87672,87673],{"encoding":4649},"f = \n\\begin{cases}\n0, n \u003C 0 \\\\\nn, n \\geq 0\n\\end{cases}",[78,87675,87677,87695],{"className":87676,"ariaHidden":1419},[4654],[78,87678,87680,87683,87686,87689,87692],{"className":87679},[4658],[78,87681],{"className":87682,"style":43725},[4662],[78,87684,5053],{"className":87685,"style":5170},[4667,4678],[78,87687],{"className":87688,"style":4740},[4739],[78,87690,4609],{"className":87691},[4744],[78,87693],{"className":87694,"style":4740},[4739],[78,87696,87698,87701],{"className":87697},[4658],[78,87699],{"className":87700,"style":85616},[4662],[78,87702,87704,87710,87803],{"className":87703},[18342],[78,87705,87707],{"className":87706,"style":85624},[4674,85623],[78,87708,55608],{"className":87709},[56026,85628],[78,87711,87713],{"className":87712},[4667],[78,87714,87716],{"className":87715},[37085],[78,87717,87719],{"className":87718},[38098],[78,87720,87722,87795],{"className":87721},[4693,4694],[78,87723,87725,87792],{"className":87724},[4698],[78,87726,87728,87760],{"className":87727,"style":85647},[4702],[78,87729,87730,87733],{"style":85650},[78,87731],{"className":87732,"style":56145},[4710],[78,87734,87736,87739,87742,87745,87748,87751,87754,87757],{"className":87735},[4667],[78,87737,2949],{"className":87738},[4667],[78,87740,2066],{"className":87741},[5126],[78,87743],{"className":87744,"style":4839},[4739],[78,87746,19],{"className":87747},[4667,4678],[78,87749],{"className":87750,"style":4740},[4739],[78,87752,41631],{"className":87753},[4744],[78,87755],{"className":87756,"style":4740},[4739],[78,87758,2949],{"className":87759},[4667],[78,87761,87762,87765],{"style":85684},[78,87763],{"className":87764,"style":56145},[4710],[78,87766,87768,87771,87774,87777,87780,87783,87786,87789],{"className":87767},[4667],[78,87769,19],{"className":87770},[4667,4678],[78,87772,2066],{"className":87773},[5126],[78,87775],{"className":87776,"style":4839},[4739],[78,87778,19],{"className":87779},[4667,4678],[78,87781],{"className":87782,"style":4740},[4739],[78,87784,85553],{"className":87785},[4744],[78,87787],{"className":87788,"style":4740},[4739],[78,87790,2949],{"className":87791},[4667],[78,87793,4726],{"className":87794},[4725],[78,87796,87798],{"className":87797},[4698],[78,87799,87801],{"className":87800,"style":85727},[4702],[78,87802],{},[78,87804],{"className":87805},[4682,4761],[23289,87807],{},[7759,87809,87811],{"id":87810},"_3离散单输出感知机训练算法p268","3、离散单输出感知机训练算法（P268）",[13,87813,87814,87815,87818,87819,87821,87822,87824],{},"训练样本集为{（X，Y）| Y }，其中Y为输入向量X对应的输出。权向量W = （",[596,87816,87817],{},"ω","1，",[596,87820,87817],{},"2，…，",[596,87823,87817],{},"n），其中n为输入向量的维数。输入向量X = （x1，x2，…，xn ），其中n为输入向量的维数。输出向量O=（0，1）。激活函数为f。",[10548,87826,87827],{"id":87827},"算法的具体流程",[13,87829,87830],{},"（1）随机初始化权向量W；",[13,87832,87833,87834,87837],{},"（2）对每个样本（X，Y），计算O = f（XW），对i∈",[78,87835,87836],{}," 1 , n","，n为样本数，执行下式：",[78,87839,87841],{"className":87840},[4566],[78,87842,87844,87930],{"className":87843},[4570],[78,87845,87847],{"className":87846},[4574],[4576,87848,87849],{"xmlns":4578,"display":4579},[4581,87850,87851,87927],{},[4584,87852,87853,87859,87861],{},[4600,87854,87855,87857],{},[4596,87856,6107],{},[4596,87858,39],{},[4591,87860,4609],{},[4584,87862,87863,87865],{},[4591,87864,55608],{"fence":1419},[37085,87866,87867,87897],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,87868,87869],{},[37094,87870,87871],{},[37101,87872,87873],{"scriptlevel":2949,"displaystyle":4593},[4584,87874,87875,87881,87883,87889,87891,87893,87895],{},[4600,87876,87877,87879],{},[4596,87878,6107],{},[4596,87880,39],{},[4591,87882,7351],{},[4600,87884,87885,87887],{},[4596,87886,55556],{},[4596,87888,39],{},[4591,87890,2066],{"separator":1419},[4596,87892,52274],{},[4591,87894,41631],{},[4596,87896,63871],{},[37091,87898,87899],{},[37094,87900,87901],{},[37101,87902,87903],{"scriptlevel":2949,"displaystyle":4593},[4584,87904,87905,87911,87913,87919,87921,87923,87925],{},[4600,87906,87907,87909],{},[4596,87908,6107],{},[4596,87910,39],{},[4591,87912,17848],{},[4600,87914,87915,87917],{},[4596,87916,55556],{},[4596,87918,39],{},[4591,87920,2066],{"separator":1419},[4596,87922,52274],{},[4591,87924,52294],{},[4596,87926,63871],{},[4647,87928,87929],{"encoding":4649},"W_i = \n\\begin{cases}\nW_i + X_i, O \u003C Y \\\\\nW_i - X_i, O > Y\n\\end{cases}",[78,87931,87933,87988],{"className":87932,"ariaHidden":1419},[4654],[78,87934,87936,87939,87979,87982,87985],{"className":87935},[4658],[78,87937],{"className":87938,"style":20406},[4662],[78,87940,87942,87945],{"className":87941},[4667],[78,87943,6107],{"className":87944,"style":5219},[4667,4678],[78,87946,87948],{"className":87947},[4689],[78,87949,87951,87971],{"className":87950},[4693,4694],[78,87952,87954,87968],{"className":87953},[4698],[78,87955,87957],{"className":87956,"style":4703},[4702],[78,87958,87959,87962],{"style":6159},[78,87960],{"className":87961,"style":4711},[4710],[78,87963,87965],{"className":87964},[4715,4716,4717,4718],[78,87966,39],{"className":87967},[4667,4678,4718],[78,87969,4726],{"className":87970},[4725],[78,87972,87974],{"className":87973},[4698],[78,87975,87977],{"className":87976,"style":4733},[4702],[78,87978],{},[78,87980],{"className":87981,"style":4740},[4739],[78,87983,4609],{"className":87984},[4744],[78,87986],{"className":87987,"style":4740},[4739],[78,87989,87991,87994],{"className":87990},[4658],[78,87992],{"className":87993,"style":85616},[4662],[78,87995,87997,88003,88269],{"className":87996},[18342],[78,87998,88000],{"className":87999,"style":85624},[4674,85623],[78,88001,55608],{"className":88002},[56026,85628],[78,88004,88006],{"className":88005},[4667],[78,88007,88009],{"className":88008},[37085],[78,88010,88012],{"className":88011},[38098],[78,88013,88015,88261],{"className":88014},[4693,4694],[78,88016,88018,88258],{"className":88017},[4698],[78,88019,88021,88140],{"className":88020,"style":85647},[4702],[78,88022,88023,88026],{"style":85650},[78,88024],{"className":88025,"style":56145},[4710],[78,88027,88029,88069,88072,88075,88078,88119,88122,88125,88128,88131,88134,88137],{"className":88028},[4667],[78,88030,88032,88035],{"className":88031},[4667],[78,88033,6107],{"className":88034,"style":5219},[4667,4678],[78,88036,88038],{"className":88037},[4689],[78,88039,88041,88061],{"className":88040},[4693,4694],[78,88042,88044,88058],{"className":88043},[4698],[78,88045,88047],{"className":88046,"style":4703},[4702],[78,88048,88049,88052],{"style":6159},[78,88050],{"className":88051,"style":4711},[4710],[78,88053,88055],{"className":88054},[4715,4716,4717,4718],[78,88056,39],{"className":88057},[4667,4678,4718],[78,88059,4726],{"className":88060},[4725],[78,88062,88064],{"className":88063},[4698],[78,88065,88067],{"className":88066,"style":4733},[4702],[78,88068],{},[78,88070],{"className":88071,"style":5143},[4739],[78,88073,7351],{"className":88074},[7450],[78,88076],{"className":88077,"style":5143},[4739],[78,88079,88081,88084],{"className":88080},[4667],[78,88082,55556],{"className":88083,"style":55911},[4667,4678],[78,88085,88087],{"className":88086},[4689],[78,88088,88090,88111],{"className":88089},[4693,4694],[78,88091,88093,88108],{"className":88092},[4698],[78,88094,88096],{"className":88095,"style":4703},[4702],[78,88097,88099,88102],{"style":88098},"top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;",[78,88100],{"className":88101,"style":4711},[4710],[78,88103,88105],{"className":88104},[4715,4716,4717,4718],[78,88106,39],{"className":88107},[4667,4678,4718],[78,88109,4726],{"className":88110},[4725],[78,88112,88114],{"className":88113},[4698],[78,88115,88117],{"className":88116,"style":4733},[4702],[78,88118],{},[78,88120,2066],{"className":88121},[5126],[78,88123],{"className":88124,"style":4839},[4739],[78,88126,52274],{"className":88127,"style":17251},[4667,4678],[78,88129],{"className":88130,"style":4740},[4739],[78,88132,41631],{"className":88133},[4744],[78,88135],{"className":88136,"style":4740},[4739],[78,88138,63871],{"className":88139,"style":5143},[4667,4678],[78,88141,88142,88145],{"style":85684},[78,88143],{"className":88144,"style":56145},[4710],[78,88146,88148,88188,88191,88194,88197,88237,88240,88243,88246,88249,88252,88255],{"className":88147},[4667],[78,88149,88151,88154],{"className":88150},[4667],[78,88152,6107],{"className":88153,"style":5219},[4667,4678],[78,88155,88157],{"className":88156},[4689],[78,88158,88160,88180],{"className":88159},[4693,4694],[78,88161,88163,88177],{"className":88162},[4698],[78,88164,88166],{"className":88165,"style":4703},[4702],[78,88167,88168,88171],{"style":6159},[78,88169],{"className":88170,"style":4711},[4710],[78,88172,88174],{"className":88173},[4715,4716,4717,4718],[78,88175,39],{"className":88176},[4667,4678,4718],[78,88178,4726],{"className":88179},[4725],[78,88181,88183],{"className":88182},[4698],[78,88184,88186],{"className":88185,"style":4733},[4702],[78,88187],{},[78,88189],{"className":88190,"style":5143},[4739],[78,88192,17848],{"className":88193},[7450],[78,88195],{"className":88196,"style":5143},[4739],[78,88198,88200,88203],{"className":88199},[4667],[78,88201,55556],{"className":88202,"style":55911},[4667,4678],[78,88204,88206],{"className":88205},[4689],[78,88207,88209,88229],{"className":88208},[4693,4694],[78,88210,88212,88226],{"className":88211},[4698],[78,88213,88215],{"className":88214,"style":4703},[4702],[78,88216,88217,88220],{"style":88098},[78,88218],{"className":88219,"style":4711},[4710],[78,88221,88223],{"className":88222},[4715,4716,4717,4718],[78,88224,39],{"className":88225},[4667,4678,4718],[78,88227,4726],{"className":88228},[4725],[78,88230,88232],{"className":88231},[4698],[78,88233,88235],{"className":88234,"style":4733},[4702],[78,88236],{},[78,88238,2066],{"className":88239},[5126],[78,88241],{"className":88242,"style":4839},[4739],[78,88244,52274],{"className":88245,"style":17251},[4667,4678],[78,88247],{"className":88248,"style":4740},[4739],[78,88250,52294],{"className":88251},[4744],[78,88253],{"className":88254,"style":4740},[4739],[78,88256,63871],{"className":88257,"style":5143},[4667,4678],[78,88259,4726],{"className":88260},[4725],[78,88262,88264],{"className":88263},[4698],[78,88265,88267],{"className":88266,"style":85727},[4702],[78,88268],{},[78,88270],{"className":88271},[4682,4761],[13,88273,88274],{},"（3）重复第（2）项，直到训练完成。",[23289,88276],{},[7759,88278,88280],{"id":88279},"_4梯度下降方法p276","4、梯度下降方法（P276）",[13,88282,88283],{},"梯度下降方法是最常见的训练神经网络参数的方法之一。",[10548,88285,88287],{"id":88286},"_1损失函数","1、损失函数",[13,88289,88290],{},"在机器学习中每个算法都会有一个目标函数，而算法的运行求解过程通常也就是这个算法的优化求解过程。在一些算法求解问题中，常会使用损失函数作为目标函数。损失函数代表的是预测值和真实值之间的差异程度，那么只要找到一个解使得二者之间的差异最小，该解就可以理解为此时的一个最优解。通常损失函数越好，则模型的性能也越好。常见的损失函数有如下几种：",[13,88292,88293],{},"【1】0 - 1损失函数（0 - 1 Loss Function）：",[78,88295,88297],{"className":88296},[4566],[78,88298,88300,88388],{"className":88299},[4570],[78,88301,88303],{"className":88302},[4574],[4576,88304,88305],{"xmlns":4578,"display":4579},[4581,88306,88307,88385],{},[4584,88308,88309,88312,88314,88316,88318,88320,88322,88324,88326,88328,88330],{},[4596,88310,88311],{},"L",[4591,88313,4594],{"stretchy":4593},[4596,88315,63871],{},[4591,88317,2066],{"separator":1419},[4596,88319,5053],{},[4591,88321,4594],{"stretchy":4593},[4596,88323,4598],{},[4591,88325,4604],{"stretchy":4593},[4591,88327,4604],{"stretchy":4593},[4591,88329,4609],{},[4584,88331,88332,88334],{},[4591,88333,55608],{"fence":1419},[37085,88335,88336,88361],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,88337,88338],{},[37094,88339,88340],{},[37101,88341,88342],{"scriptlevel":2949,"displaystyle":4593},[4584,88343,88344,88346,88348,88350,88353,88355,88357,88359],{},[7077,88345,469],{},[4591,88347,2066],{"separator":1419},[4596,88349,63871],{},[4591,88351,88352],{"mathvariant":7101},"≠",[4596,88354,5053],{},[4591,88356,4594],{"stretchy":4593},[4596,88358,4598],{},[4591,88360,4604],{"stretchy":4593},[37091,88362,88363],{},[37094,88364,88365],{},[37101,88366,88367],{"scriptlevel":2949,"displaystyle":4593},[4584,88368,88369,88371,88373,88375,88377,88379,88381,88383],{},[7077,88370,2949],{},[4591,88372,2066],{"separator":1419},[4596,88374,63871],{},[4591,88376,4609],{},[4596,88378,5053],{},[4591,88380,4594],{"stretchy":4593},[4596,88382,4598],{},[4591,88384,4604],{"stretchy":4593},[4647,88386,88387],{"encoding":4649},"L(Y, f(x)) = \n\\begin{cases}\n1, Y \\neq f(x) \\\\\n0, Y = f(x)\n\\end{cases}",[78,88389,88391,88433],{"className":88390,"ariaHidden":1419},[4654],[78,88392,88394,88397,88400,88403,88406,88409,88412,88415,88418,88421,88424,88427,88430],{"className":88393},[4658],[78,88395],{"className":88396,"style":4663},[4662],[78,88398,88311],{"className":88399},[4667,4678],[78,88401,4594],{"className":88402},[4674],[78,88404,63871],{"className":88405,"style":5143},[4667,4678],[78,88407,2066],{"className":88408},[5126],[78,88410],{"className":88411,"style":4839},[4739],[78,88413,5053],{"className":88414,"style":5170},[4667,4678],[78,88416,4594],{"className":88417},[4674],[78,88419,4598],{"className":88420},[4667,4678],[78,88422,38757],{"className":88423},[4682],[78,88425],{"className":88426,"style":4740},[4739],[78,88428,4609],{"className":88429},[4744],[78,88431],{"className":88432,"style":4740},[4739],[78,88434,88436,88439],{"className":88435},[4658],[78,88437],{"className":88438,"style":85616},[4662],[78,88440,88442,88448,88595],{"className":88441},[18342],[78,88443,88445],{"className":88444,"style":85624},[4674,85623],[78,88446,55608],{"className":88447},[56026,85628],[78,88449,88451],{"className":88450},[4667],[78,88452,88454],{"className":88453},[37085],[78,88455,88457],{"className":88456},[38098],[78,88458,88460,88587],{"className":88459},[4693,4694],[78,88461,88463,88584],{"className":88462},[4698],[78,88464,88466,88543],{"className":88465,"style":85647},[4702],[78,88467,88468,88471],{"style":85650},[78,88469],{"className":88470,"style":56145},[4710],[78,88472,88474,88477,88480,88483,88486,88489,88528,88531,88534,88537,88540],{"className":88473},[4667],[78,88475,469],{"className":88476},[4667],[78,88478,2066],{"className":88479},[5126],[78,88481],{"className":88482,"style":4839},[4739],[78,88484,63871],{"className":88485,"style":5143},[4667,4678],[78,88487],{"className":88488,"style":4740},[4739],[78,88490,88492,88521,88525],{"className":88491},[4744],[78,88493,88495],{"className":88494},[4744],[78,88496,88498],{"className":88497},[4667,79358],[78,88499,88501],{"className":88500},[79362],[78,88502,88505,88508,88518],{"className":88503},[88504],"rlap",[78,88506],{"className":88507,"style":43725},[4662],[78,88509,88511],{"className":88510},[79373],[78,88512,88514],{"className":88513},[4667],[78,88515,88517],{"className":88516},[4744],"",[78,88519],{"className":88520},[79387],[78,88522],{"className":88523},[4739,88524],"nobreak",[78,88526,4609],{"className":88527},[4744],[78,88529],{"className":88530,"style":4740},[4739],[78,88532,5053],{"className":88533,"style":5170},[4667,4678],[78,88535,4594],{"className":88536},[4674],[78,88538,4598],{"className":88539},[4667,4678],[78,88541,4604],{"className":88542},[4682],[78,88544,88545,88548],{"style":85684},[78,88546],{"className":88547,"style":56145},[4710],[78,88549,88551,88554,88557,88560,88563,88566,88569,88572,88575,88578,88581],{"className":88550},[4667],[78,88552,2949],{"className":88553},[4667],[78,88555,2066],{"className":88556},[5126],[78,88558],{"className":88559,"style":4839},[4739],[78,88561,63871],{"className":88562,"style":5143},[4667,4678],[78,88564],{"className":88565,"style":4740},[4739],[78,88567,4609],{"className":88568},[4744],[78,88570],{"className":88571,"style":4740},[4739],[78,88573,5053],{"className":88574,"style":5170},[4667,4678],[78,88576,4594],{"className":88577},[4674],[78,88579,4598],{"className":88580},[4667,4678],[78,88582,4604],{"className":88583},[4682],[78,88585,4726],{"className":88586},[4725],[78,88588,88590],{"className":88589},[4698],[78,88591,88593],{"className":88592,"style":85727},[4702],[78,88594],{},[78,88596],{"className":88597},[4682,4761],[13,88599,88600],{},"【2】平方损失函数（Quadratic Loss Function）：",[78,88602,88604],{"className":88603},[4566],[78,88605,88607,88659],{"className":88606},[4570],[78,88608,88610],{"className":88609},[4574],[4576,88611,88612],{"xmlns":4578,"display":4579},[4581,88613,88614,88656],{},[4584,88615,88616,88618,88620,88622,88624,88626,88628,88630,88632,88634,88636,88638,88640,88642,88644,88646,88648,88650],{},[4596,88617,88311],{},[4591,88619,4594],{"stretchy":4593},[4596,88621,63871],{},[4591,88623,2066],{"separator":1419},[4596,88625,5053],{},[4591,88627,4594],{"stretchy":4593},[4596,88629,4598],{},[4591,88631,4604],{"stretchy":4593},[4591,88633,4604],{"stretchy":4593},[4591,88635,4609],{},[4591,88637,4594],{"stretchy":4593},[4596,88639,63871],{},[4591,88641,17848],{},[4596,88643,5053],{},[4591,88645,4594],{"stretchy":4593},[4596,88647,4598],{},[4591,88649,4604],{"stretchy":4593},[4614,88651,88652,88654],{},[4591,88653,4604],{"stretchy":4593},[7077,88655,472],{},[4647,88657,88658],{"encoding":4649},"L(Y, f(x)) = (Y - f(x)) ^ 2",[78,88660,88662,88704,88725],{"className":88661,"ariaHidden":1419},[4654],[78,88663,88665,88668,88671,88674,88677,88680,88683,88686,88689,88692,88695,88698,88701],{"className":88664},[4658],[78,88666],{"className":88667,"style":4663},[4662],[78,88669,88311],{"className":88670},[4667,4678],[78,88672,4594],{"className":88673},[4674],[78,88675,63871],{"className":88676,"style":5143},[4667,4678],[78,88678,2066],{"className":88679},[5126],[78,88681],{"className":88682,"style":4839},[4739],[78,88684,5053],{"className":88685,"style":5170},[4667,4678],[78,88687,4594],{"className":88688},[4674],[78,88690,4598],{"className":88691},[4667,4678],[78,88693,38757],{"className":88694},[4682],[78,88696],{"className":88697,"style":4740},[4739],[78,88699,4609],{"className":88700},[4744],[78,88702],{"className":88703,"style":4740},[4739],[78,88705,88707,88710,88713,88716,88719,88722],{"className":88706},[4658],[78,88708],{"className":88709,"style":4663},[4662],[78,88711,4594],{"className":88712},[4674],[78,88714,63871],{"className":88715,"style":5143},[4667,4678],[78,88717],{"className":88718,"style":5143},[4739],[78,88720,17848],{"className":88721},[7450],[78,88723],{"className":88724,"style":5143},[4739],[78,88726,88728,88731,88734,88737,88740,88743],{"className":88727},[4658],[78,88729],{"className":88730,"style":53782},[4662],[78,88732,5053],{"className":88733,"style":5170},[4667,4678],[78,88735,4594],{"className":88736},[4674],[78,88738,4598],{"className":88739},[4667,4678],[78,88741,4604],{"className":88742},[4682],[78,88744,88746,88749],{"className":88745},[4682],[78,88747,4604],{"className":88748},[4682],[78,88750,88752],{"className":88751},[4689],[78,88753,88755],{"className":88754},[4693],[78,88756,88758],{"className":88757},[4698],[78,88759,88761],{"className":88760,"style":53807},[4702],[78,88762,88763,88766],{"style":5209},[78,88764],{"className":88765,"style":4711},[4710],[78,88767,88769],{"className":88768},[4715,4716,4717,4718],[78,88770,472],{"className":88771},[4667,4718],[13,88773,88774],{},"【3】绝对损失函数（Absolute Loss Function）：",[78,88776,88778],{"className":88777},[4566],[78,88779,88781,88833],{"className":88780},[4570],[78,88782,88784],{"className":88783},[4574],[4576,88785,88786],{"xmlns":4578,"display":4579},[4581,88787,88788,88830],{},[4584,88789,88790,88792,88794,88796,88798,88800,88802,88804,88806,88808,88810,88812,88814,88816,88818,88820,88822,88824,88826,88828],{},[4596,88791,88311],{},[4591,88793,4594],{"stretchy":4593},[4596,88795,63871],{},[4591,88797,2066],{"separator":1419},[4596,88799,5053],{},[4591,88801,4594],{"stretchy":4593},[4596,88803,4598],{},[4591,88805,4604],{"stretchy":4593},[4591,88807,4604],{"stretchy":4593},[4591,88809,4609],{},[4596,88811,63346],{"mathvariant":7101},[4596,88813,63346],{"mathvariant":7101},[4596,88815,63871],{},[4591,88817,17848],{},[4596,88819,5053],{},[4591,88821,4594],{"stretchy":4593},[4596,88823,4598],{},[4591,88825,4604],{"stretchy":4593},[4596,88827,63346],{"mathvariant":7101},[4596,88829,63346],{"mathvariant":7101},[4647,88831,88832],{"encoding":4649},"L(Y, f(x)) = ||Y - f(x)||",[78,88834,88836,88878,88900],{"className":88835,"ariaHidden":1419},[4654],[78,88837,88839,88842,88845,88848,88851,88854,88857,88860,88863,88866,88869,88872,88875],{"className":88838},[4658],[78,88840],{"className":88841,"style":4663},[4662],[78,88843,88311],{"className":88844},[4667,4678],[78,88846,4594],{"className":88847},[4674],[78,88849,63871],{"className":88850,"style":5143},[4667,4678],[78,88852,2066],{"className":88853},[5126],[78,88855],{"className":88856,"style":4839},[4739],[78,88858,5053],{"className":88859,"style":5170},[4667,4678],[78,88861,4594],{"className":88862},[4674],[78,88864,4598],{"className":88865},[4667,4678],[78,88867,38757],{"className":88868},[4682],[78,88870],{"className":88871,"style":4740},[4739],[78,88873,4609],{"className":88874},[4744],[78,88876],{"className":88877,"style":4740},[4739],[78,88879,88881,88884,88888,88891,88894,88897],{"className":88880},[4658],[78,88882],{"className":88883,"style":4663},[4662],[78,88885,88887],{"className":88886},[4667],"∣∣",[78,88889,63871],{"className":88890,"style":5143},[4667,4678],[78,88892],{"className":88893,"style":5143},[4739],[78,88895,17848],{"className":88896},[7450],[78,88898],{"className":88899,"style":5143},[4739],[78,88901,88903,88906,88909,88912,88915,88918],{"className":88902},[4658],[78,88904],{"className":88905,"style":4663},[4662],[78,88907,5053],{"className":88908,"style":5170},[4667,4678],[78,88910,4594],{"className":88911},[4674],[78,88913,4598],{"className":88914},[4667,4678],[78,88916,4604],{"className":88917},[4682],[78,88919,88887],{"className":88920},[4667],[13,88922,88923],{},"【4】对数损失函数（Logarithmic Loss Function）或对数似然损失函数（Log-Likelihood Loss Function）：",[78,88925,88927],{"className":88926},[4566],[78,88928,88930,88985],{"className":88929},[4570],[78,88931,88933],{"className":88932},[4574],[4576,88934,88935],{"xmlns":4578,"display":4579},[4581,88936,88937,88982],{},[4584,88938,88939,88941,88943,88945,88947,88949,88951,88953,88955,88957,88959,88961,88963,88965,88968,88970,88972,88974,88976,88978,88980],{},[4596,88940,88311],{},[4591,88942,4594],{"stretchy":4593},[4596,88944,63871],{},[4591,88946,2066],{"separator":1419},[4596,88948,7062],{},[4591,88950,4594],{"stretchy":4593},[4596,88952,63871],{},[4596,88954,63346],{"mathvariant":7101},[4596,88956,55556],{},[4591,88958,4604],{"stretchy":4593},[4591,88960,4604],{"stretchy":4593},[4591,88962,4609],{},[4591,88964,17848],{},[4596,88966,88967],{},"lg",[4591,88969,17553],{},[4596,88971,7062],{},[4591,88973,4594],{"stretchy":4593},[4596,88975,63871],{},[4596,88977,63346],{"mathvariant":7101},[4596,88979,55556],{},[4591,88981,4604],{"stretchy":4593},[4647,88983,88984],{"encoding":4649},"L(Y, P(Y|X)) = -\\lg P(Y|X)",[78,88986,88988,89036],{"className":88987,"ariaHidden":1419},[4654],[78,88989,88991,88994,88997,89000,89003,89006,89009,89012,89015,89018,89021,89024,89027,89030,89033],{"className":88990},[4658],[78,88992],{"className":88993,"style":4663},[4662],[78,88995,88311],{"className":88996},[4667,4678],[78,88998,4594],{"className":88999},[4674],[78,89001,63871],{"className":89002,"style":5143},[4667,4678],[78,89004,2066],{"className":89005},[5126],[78,89007],{"className":89008,"style":4839},[4739],[78,89010,7062],{"className":89011,"style":5219},[4667,4678],[78,89013,4594],{"className":89014},[4674],[78,89016,63871],{"className":89017,"style":5143},[4667,4678],[78,89019,63346],{"className":89020},[4667],[78,89022,55556],{"className":89023,"style":55911},[4667,4678],[78,89025,38757],{"className":89026},[4682],[78,89028],{"className":89029,"style":4740},[4739],[78,89031,4609],{"className":89032},[4744],[78,89034],{"className":89035,"style":4740},[4739],[78,89037,89039,89042,89045,89048,89053,89056,89059,89062,89065,89068,89071],{"className":89038},[4658],[78,89040],{"className":89041,"style":4663},[4662],[78,89043,17848],{"className":89044},[4667],[78,89046],{"className":89047,"style":4839},[4739],[78,89049,7132,89051],{"className":89050},[4788],[78,89052,43673],{"style":53053},[78,89054],{"className":89055,"style":4839},[4739],[78,89057,7062],{"className":89058,"style":5219},[4667,4678],[78,89060,4594],{"className":89061},[4674],[78,89063,63871],{"className":89064,"style":5143},[4667,4678],[78,89066,63346],{"className":89067},[4667],[78,89069,55556],{"className":89070,"style":55911},[4667,4678],[78,89072,4604],{"className":89073},[4682],[10548,89075,89077],{"id":89076},"_2梯度的理解","2、梯度的理解",[13,89079,89080],{},"在多元函数中对各个参数求偏导，最后把各个参数的偏导数用向量的方式表示出来即梯度。从二维到三维函数的图像中可知，梯度可以代表函数在这个参数上的变化速度快慢，梯度越大则变化越快。沿着梯度变换的方向直至梯度为0，该处通常是一个局部的高点或者低点，即极大值或者极小值，在函数中这恰恰可以视为函数的最终解。",[13,89082,89083],{},"在人工神经网络的训练中，需要最小化损失函数时，可以通过梯度下降方法来进行多次迭代求得最优解。在函数图像上，最低点就是最小化的损失函数结果。同理，如果要求解梯度的最大值，则可以采用梯度上升的方式得到一个梯度最大值，其对应的是损失函数的极大值。两者之间也可以互相转换，例如原本是求损失函数的极大值，经过取反可以变为求解一个损失函数的极小值。另外，这种求解方法求得的解是局部极大或极小值，但不一定是全局最大或最小值。",[10548,89085,89087],{"id":89086},"_3梯度下降的学习规则","3、梯度下降的学习规则",[13,89089,89090],{},[22,89091,89092],{},"学习率 X 负梯度",[10548,89094,89096],{"id":89095},"_4梯度下降方法的实现","4、梯度下降方法的实现",[13,89098,89099],{},"（1）确定优化模型的假设函数和损失函数。以线性回归为例，假设函数如下：",[78,89101,89103],{"className":89102},[4566],[78,89104,89106,89196],{"className":89105},[4570],[78,89107,89109],{"className":89108},[4574],[4576,89110,89111],{"xmlns":4578,"display":4579},[4581,89112,89113,89193],{},[4584,89114,89115,89121,89123,89129,89131,89137,89139,89141,89143,89145,89151,89153,89155,89161,89163,89169,89175,89177,89179,89181,89187],{},[4600,89116,89117,89119],{},[4596,89118,26052],{},[4596,89120,17463],{},[4591,89122,4594],{"stretchy":4593},[4600,89124,89125,89127],{},[4596,89126,4598],{},[7077,89128,469],{},[4591,89130,2066],{"separator":1419},[4600,89132,89133,89135],{},[4596,89134,4598],{},[7077,89136,472],{},[4591,89138,2066],{"separator":1419},[4591,89140,18198],{},[4587,89142,18201],{},[4591,89144,2066],{"separator":1419},[4600,89146,89147,89149],{},[4596,89148,4598],{},[4596,89150,19],{},[4591,89152,4604],{"stretchy":4593},[4591,89154,4609],{},[4600,89156,89157,89159],{},[4596,89158,17463],{},[7077,89160,2949],{},[4591,89162,7351],{},[4600,89164,89165,89167],{},[4596,89166,17463],{},[7077,89168,469],{},[4600,89170,89171,89173],{},[4596,89172,4598],{},[7077,89174,469],{},[4591,89176,7351],{},[4591,89178,18198],{},[4591,89180,7351],{},[4600,89182,89183,89185],{},[4596,89184,17463],{},[4596,89186,4598],{},[4600,89188,89189,89191],{},[4596,89190,4598],{},[4596,89192,19],{},[4647,89194,89195],{"encoding":4649},"h_\\theta(x_1, x_2, \\cdots, x_n) = \\theta_0 + \\theta_1x_1 + \\cdots + \\theta_xx_n",[78,89197,89199,89407,89462,89557,89575],{"className":89198,"ariaHidden":1419},[4654],[78,89200,89202,89205,89245,89248,89288,89291,89294,89334,89337,89340,89343,89346,89349,89352,89355,89395,89398,89401,89404],{"className":89201},[4658],[78,89203],{"className":89204,"style":4663},[4662],[78,89206,89208,89211],{"className":89207},[4667],[78,89209,26052],{"className":89210},[4667,4678],[78,89212,89214],{"className":89213},[4689],[78,89215,89217,89237],{"className":89216},[4693,4694],[78,89218,89220,89234],{"className":89219},[4698],[78,89221,89223],{"className":89222,"style":5566},[4702],[78,89224,89225,89228],{"style":4706},[78,89226],{"className":89227,"style":4711},[4710],[78,89229,89231],{"className":89230},[4715,4716,4717,4718],[78,89232,17463],{"className":89233,"style":17251},[4667,4678,4718],[78,89235,4726],{"className":89236},[4725],[78,89238,89240],{"className":89239},[4698],[78,89241,89243],{"className":89242,"style":4733},[4702],[78,89244],{},[78,89246,4594],{"className":89247},[4674],[78,89249,89251,89254],{"className":89250},[4667],[78,89252,4598],{"className":89253},[4667,4678],[78,89255,89257],{"className":89256},[4689],[78,89258,89260,89280],{"className":89259},[4693,4694],[78,89261,89263,89277],{"className":89262},[4698],[78,89264,89266],{"className":89265,"style":18264},[4702],[78,89267,89268,89271],{"style":4706},[78,89269],{"className":89270,"style":4711},[4710],[78,89272,89274],{"className":89273},[4715,4716,4717,4718],[78,89275,469],{"className":89276},[4667,4718],[78,89278,4726],{"className":89279},[4725],[78,89281,89283],{"className":89282},[4698],[78,89284,89286],{"className":89285,"style":4733},[4702],[78,89287],{},[78,89289,2066],{"className":89290},[5126],[78,89292],{"className":89293,"style":4839},[4739],[78,89295,89297,89300],{"className":89296},[4667],[78,89298,4598],{"className":89299},[4667,4678],[78,89301,89303],{"className":89302},[4689],[78,89304,89306,89326],{"className":89305},[4693,4694],[78,89307,89309,89323],{"className":89308},[4698],[78,89310,89312],{"className":89311,"style":18264},[4702],[78,89313,89314,89317],{"style":4706},[78,89315],{"className":89316,"style":4711},[4710],[78,89318,89320],{"className":89319},[4715,4716,4717,4718],[78,89321,472],{"className":89322},[4667,4718],[78,89324,4726],{"className":89325},[4725],[78,89327,89329],{"className":89328},[4698],[78,89330,89332],{"className":89331,"style":4733},[4702],[78,89333],{},[78,89335,2066],{"className":89336},[5126],[78,89338],{"className":89339,"style":4839},[4739],[78,89341,18198],{"className":89342},[18342],[78,89344],{"className":89345,"style":4839},[4739],[78,89347],{"className":89348,"style":4839},[4739],[78,89350,2066],{"className":89351},[5126],[78,89353],{"className":89354,"style":4839},[4739],[78,89356,89358,89361],{"className":89357},[4667],[78,89359,4598],{"className":89360},[4667,4678],[78,89362,89364],{"className":89363},[4689],[78,89365,89367,89387],{"className":89366},[4693,4694],[78,89368,89370,89384],{"className":89369},[4698],[78,89371,89373],{"className":89372,"style":5279},[4702],[78,89374,89375,89378],{"style":4706},[78,89376],{"className":89377,"style":4711},[4710],[78,89379,89381],{"className":89380},[4715,4716,4717,4718],[78,89382,19],{"className":89383},[4667,4678,4718],[78,89385,4726],{"className":89386},[4725],[78,89388,89390],{"className":89389},[4698],[78,89391,89393],{"className":89392,"style":4733},[4702],[78,89394],{},[78,89396,4604],{"className":89397},[4682],[78,89399],{"className":89400,"style":4740},[4739],[78,89402,4609],{"className":89403},[4744],[78,89405],{"className":89406,"style":4740},[4739],[78,89408,89410,89413,89453,89456,89459],{"className":89409},[4658],[78,89411],{"className":89412,"style":5260},[4662],[78,89414,89416,89419],{"className":89415},[4667],[78,89417,17463],{"className":89418,"style":17251},[4667,4678],[78,89420,89422],{"className":89421},[4689],[78,89423,89425,89445],{"className":89424},[4693,4694],[78,89426,89428,89442],{"className":89427},[4698],[78,89429,89431],{"className":89430,"style":18264},[4702],[78,89432,89433,89436],{"style":84052},[78,89434],{"className":89435,"style":4711},[4710],[78,89437,89439],{"className":89438},[4715,4716,4717,4718],[78,89440,2949],{"className":89441},[4667,4718],[78,89443,4726],{"className":89444},[4725],[78,89446,89448],{"className":89447},[4698],[78,89449,89451],{"className":89450,"style":4733},[4702],[78,89452],{},[78,89454],{"className":89455,"style":5143},[4739],[78,89457,7351],{"className":89458},[7450],[78,89460],{"className":89461,"style":5143},[4739],[78,89463,89465,89468,89508,89548,89551,89554],{"className":89464},[4658],[78,89466],{"className":89467,"style":5260},[4662],[78,89469,89471,89474],{"className":89470},[4667],[78,89472,17463],{"className":89473,"style":17251},[4667,4678],[78,89475,89477],{"className":89476},[4689],[78,89478,89480,89500],{"className":89479},[4693,4694],[78,89481,89483,89497],{"className":89482},[4698],[78,89484,89486],{"className":89485,"style":18264},[4702],[78,89487,89488,89491],{"style":84052},[78,89489],{"className":89490,"style":4711},[4710],[78,89492,89494],{"className":89493},[4715,4716,4717,4718],[78,89495,469],{"className":89496},[4667,4718],[78,89498,4726],{"className":89499},[4725],[78,89501,89503],{"className":89502},[4698],[78,89504,89506],{"className":89505,"style":4733},[4702],[78,89507],{},[78,89509,89511,89514],{"className":89510},[4667],[78,89512,4598],{"className":89513},[4667,4678],[78,89515,89517],{"className":89516},[4689],[78,89518,89520,89540],{"className":89519},[4693,4694],[78,89521,89523,89537],{"className":89522},[4698],[78,89524,89526],{"className":89525,"style":18264},[4702],[78,89527,89528,89531],{"style":4706},[78,89529],{"className":89530,"style":4711},[4710],[78,89532,89534],{"className":89533},[4715,4716,4717,4718],[78,89535,469],{"className":89536},[4667,4718],[78,89538,4726],{"className":89539},[4725],[78,89541,89543],{"className":89542},[4698],[78,89544,89546],{"className":89545,"style":4733},[4702],[78,89547],{},[78,89549],{"className":89550,"style":5143},[4739],[78,89552,7351],{"className":89553},[7450],[78,89555],{"className":89556,"style":5143},[4739],[78,89558,89560,89563,89566,89569,89572],{"className":89559},[4658],[78,89561],{"className":89562,"style":18992},[4662],[78,89564,18198],{"className":89565},[18342],[78,89567],{"className":89568,"style":5143},[4739],[78,89570,7351],{"className":89571},[7450],[78,89573],{"className":89574,"style":5143},[4739],[78,89576,89578,89581,89621],{"className":89577},[4658],[78,89579],{"className":89580,"style":5260},[4662],[78,89582,89584,89587],{"className":89583},[4667],[78,89585,17463],{"className":89586,"style":17251},[4667,4678],[78,89588,89590],{"className":89589},[4689],[78,89591,89593,89613],{"className":89592},[4693,4694],[78,89594,89596,89610],{"className":89595},[4698],[78,89597,89599],{"className":89598,"style":5279},[4702],[78,89600,89601,89604],{"style":84052},[78,89602],{"className":89603,"style":4711},[4710],[78,89605,89607],{"className":89606},[4715,4716,4717,4718],[78,89608,4598],{"className":89609},[4667,4678,4718],[78,89611,4726],{"className":89612},[4725],[78,89614,89616],{"className":89615},[4698],[78,89617,89619],{"className":89618,"style":4733},[4702],[78,89620],{},[78,89622,89624,89627],{"className":89623},[4667],[78,89625,4598],{"className":89626},[4667,4678],[78,89628,89630],{"className":89629},[4689],[78,89631,89633,89653],{"className":89632},[4693,4694],[78,89634,89636,89650],{"className":89635},[4698],[78,89637,89639],{"className":89638,"style":5279},[4702],[78,89640,89641,89644],{"style":4706},[78,89642],{"className":89643,"style":4711},[4710],[78,89645,89647],{"className":89646},[4715,4716,4717,4718],[78,89648,19],{"className":89649},[4667,4678,4718],[78,89651,4726],{"className":89652},[4725],[78,89654,89656],{"className":89655},[4698],[78,89657,89659],{"className":89658,"style":4733},[4702],[78,89660],{},[13,89662,89663],{},"其中，θi（i = 0，1，2，…，θn）为模型参数，xi（i = 0，1，2，…，n ）为每个样本的n个特征值。θ0可以看作θ0x0（x0=1），故",[78,89665,89667],{"className":89666},[4566],[78,89668,89670,89749],{"className":89669},[4570],[78,89671,89673],{"className":89672},[4574],[4576,89674,89675],{"xmlns":4578,"display":4579},[4581,89676,89677,89746],{},[4584,89678,89679,89685,89687,89693,89695,89701,89703,89705,89707,89709,89715,89717,89719,89734,89740],{},[4600,89680,89681,89683],{},[4596,89682,26052],{},[4596,89684,17463],{},[4591,89686,4594],{"stretchy":4593},[4600,89688,89689,89691],{},[4596,89690,4598],{},[7077,89692,469],{},[4591,89694,2066],{"separator":1419},[4600,89696,89697,89699],{},[4596,89698,4598],{},[7077,89700,472],{},[4591,89702,2066],{"separator":1419},[4591,89704,18198],{},[4587,89706,18201],{},[4591,89708,2066],{"separator":1419},[4600,89710,89711,89713],{},[4596,89712,4598],{},[4596,89714,19],{},[4591,89716,4604],{"stretchy":4593},[4591,89718,4609],{},[89720,89721,89722,89724,89732],"munderover",{},[4591,89723,4632],{},[4584,89725,89726,89728,89730],{},[4596,89727,39],{},[4591,89729,4609],{},[7077,89731,2949],{},[4596,89733,19],{},[4600,89735,89736,89738],{},[4596,89737,17463],{},[4596,89739,39],{},[4600,89741,89742,89744],{},[4596,89743,4598],{},[4596,89745,39],{},[4647,89747,89748],{"encoding":4649},"h_\\theta(x_1, x_2, \\cdots, x_n) = \\sum_{i=0}^n \\theta_ix_i",[78,89750,89752,89960],{"className":89751,"ariaHidden":1419},[4654],[78,89753,89755,89758,89798,89801,89841,89844,89847,89887,89890,89893,89896,89899,89902,89905,89908,89948,89951,89954,89957],{"className":89754},[4658],[78,89756],{"className":89757,"style":4663},[4662],[78,89759,89761,89764],{"className":89760},[4667],[78,89762,26052],{"className":89763},[4667,4678],[78,89765,89767],{"className":89766},[4689],[78,89768,89770,89790],{"className":89769},[4693,4694],[78,89771,89773,89787],{"className":89772},[4698],[78,89774,89776],{"className":89775,"style":5566},[4702],[78,89777,89778,89781],{"style":4706},[78,89779],{"className":89780,"style":4711},[4710],[78,89782,89784],{"className":89783},[4715,4716,4717,4718],[78,89785,17463],{"className":89786,"style":17251},[4667,4678,4718],[78,89788,4726],{"className":89789},[4725],[78,89791,89793],{"className":89792},[4698],[78,89794,89796],{"className":89795,"style":4733},[4702],[78,89797],{},[78,89799,4594],{"className":89800},[4674],[78,89802,89804,89807],{"className":89803},[4667],[78,89805,4598],{"className":89806},[4667,4678],[78,89808,89810],{"className":89809},[4689],[78,89811,89813,89833],{"className":89812},[4693,4694],[78,89814,89816,89830],{"className":89815},[4698],[78,89817,89819],{"className":89818,"style":18264},[4702],[78,89820,89821,89824],{"style":4706},[78,89822],{"className":89823,"style":4711},[4710],[78,89825,89827],{"className":89826},[4715,4716,4717,4718],[78,89828,469],{"className":89829},[4667,4718],[78,89831,4726],{"className":89832},[4725],[78,89834,89836],{"className":89835},[4698],[78,89837,89839],{"className":89838,"style":4733},[4702],[78,89840],{},[78,89842,2066],{"className":89843},[5126],[78,89845],{"className":89846,"style":4839},[4739],[78,89848,89850,89853],{"className":89849},[4667],[78,89851,4598],{"className":89852},[4667,4678],[78,89854,89856],{"className":89855},[4689],[78,89857,89859,89879],{"className":89858},[4693,4694],[78,89860,89862,89876],{"className":89861},[4698],[78,89863,89865],{"className":89864,"style":18264},[4702],[78,89866,89867,89870],{"style":4706},[78,89868],{"className":89869,"style":4711},[4710],[78,89871,89873],{"className":89872},[4715,4716,4717,4718],[78,89874,472],{"className":89875},[4667,4718],[78,89877,4726],{"className":89878},[4725],[78,89880,89882],{"className":89881},[4698],[78,89883,89885],{"className":89884,"style":4733},[4702],[78,89886],{},[78,89888,2066],{"className":89889},[5126],[78,89891],{"className":89892,"style":4839},[4739],[78,89894,18198],{"className":89895},[18342],[78,89897],{"className":89898,"style":4839},[4739],[78,89900],{"className":89901,"style":4839},[4739],[78,89903,2066],{"className":89904},[5126],[78,89906],{"className":89907,"style":4839},[4739],[78,89909,89911,89914],{"className":89910},[4667],[78,89912,4598],{"className":89913},[4667,4678],[78,89915,89917],{"className":89916},[4689],[78,89918,89920,89940],{"className":89919},[4693,4694],[78,89921,89923,89937],{"className":89922},[4698],[78,89924,89926],{"className":89925,"style":5279},[4702],[78,89927,89928,89931],{"style":4706},[78,89929],{"className":89930,"style":4711},[4710],[78,89932,89934],{"className":89933},[4715,4716,4717,4718],[78,89935,19],{"className":89936},[4667,4678,4718],[78,89938,4726],{"className":89939},[4725],[78,89941,89943],{"className":89942},[4698],[78,89944,89946],{"className":89945,"style":4733},[4702],[78,89947],{},[78,89949,4604],{"className":89950},[4682],[78,89952],{"className":89953,"style":4740},[4739],[78,89955,4609],{"className":89956},[4744],[78,89958],{"className":89959,"style":4740},[4739],[78,89961,89963,89967,90038,90041,90081],{"className":89962},[4658],[78,89964],{"className":89965,"style":89966},[4662],"height:2.9291em;vertical-align:-1.2777em;",[78,89968,89970],{"className":89969},[4788,52401],[78,89971,89973,90029],{"className":89972},[4693,4694],[78,89974,89976,90026],{"className":89975},[4698],[78,89977,89980,90002,90014],{"className":89978,"style":89979},[4702],"height:1.6514em;",[78,89981,89983,89987],{"style":89982},"top:-1.8723em;margin-left:0em;",[78,89984],{"className":89985,"style":89986},[4710],"height:3.05em;",[78,89988,89990],{"className":89989},[4715,4716,4717,4718],[78,89991,89993,89996,89999],{"className":89992},[4667,4718],[78,89994,39],{"className":89995},[4667,4678,4718],[78,89997,4609],{"className":89998},[4744,4718],[78,90000,2949],{"className":90001},[4667,4718],[78,90003,90005,90008],{"style":90004},"top:-3.05em;",[78,90006],{"className":90007,"style":89986},[4710],[78,90009,90010],{},[78,90011,4632],{"className":90012},[4788,4792,90013],"large-op",[78,90015,90017,90020],{"style":90016},"top:-4.3em;margin-left:0em;",[78,90018],{"className":90019,"style":89986},[4710],[78,90021,90023],{"className":90022},[4715,4716,4717,4718],[78,90024,19],{"className":90025},[4667,4678,4718],[78,90027,4726],{"className":90028},[4725],[78,90030,90032],{"className":90031},[4698],[78,90033,90036],{"className":90034,"style":90035},[4702],"height:1.2777em;",[78,90037],{},[78,90039],{"className":90040,"style":4839},[4739],[78,90042,90044,90047],{"className":90043},[4667],[78,90045,17463],{"className":90046,"style":17251},[4667,4678],[78,90048,90050],{"className":90049},[4689],[78,90051,90053,90073],{"className":90052},[4693,4694],[78,90054,90056,90070],{"className":90055},[4698],[78,90057,90059],{"className":90058,"style":4703},[4702],[78,90060,90061,90064],{"style":84052},[78,90062],{"className":90063,"style":4711},[4710],[78,90065,90067],{"className":90066},[4715,4716,4717,4718],[78,90068,39],{"className":90069},[4667,4678,4718],[78,90071,4726],{"className":90072},[4725],[78,90074,90076],{"className":90075},[4698],[78,90077,90079],{"className":90078,"style":4733},[4702],[78,90080],{},[78,90082,90084,90087],{"className":90083},[4667],[78,90085,4598],{"className":90086},[4667,4678],[78,90088,90090],{"className":90089},[4689],[78,90091,90093,90113],{"className":90092},[4693,4694],[78,90094,90096,90110],{"className":90095},[4698],[78,90097,90099],{"className":90098,"style":4703},[4702],[78,90100,90101,90104],{"style":4706},[78,90102],{"className":90103,"style":4711},[4710],[78,90105,90107],{"className":90106},[4715,4716,4717,4718],[78,90108,39],{"className":90109},[4667,4678,4718],[78,90111,4726],{"className":90112},[4725],[78,90114,90116],{"className":90115},[4698],[78,90117,90119],{"className":90118,"style":4733},[4702],[78,90120],{},[13,90122,90123],{},"对应的损失函数为",[78,90125,90127],{"className":90126},[4566],[78,90128,90130,90263],{"className":90129},[4570],[78,90131,90133],{"className":90132},[4574],[4576,90134,90135],{"xmlns":4578,"display":4579},[4581,90136,90137,90260],{},[4584,90138,90139,90142,90144,90150,90152,90158,90160,90162,90164,90166,90172,90174,90176,90186,90200,90202,90208,90210,90218,90220,90228,90230,90232,90234,90236,90244,90246,90248,90254],{},[4596,90140,90141],{},"J",[4591,90143,4594],{"stretchy":4593},[4600,90145,90146,90148],{},[4596,90147,4598],{},[7077,90149,469],{},[4591,90151,2066],{"separator":1419},[4600,90153,90154,90156],{},[4596,90155,4598],{},[7077,90157,472],{},[4591,90159,2066],{"separator":1419},[4591,90161,18198],{},[4587,90163,18201],{},[4591,90165,2066],{"separator":1419},[4600,90167,90168,90170],{},[4596,90169,4598],{},[4596,90171,19],{},[4591,90173,4604],{"stretchy":4593},[4591,90175,4609],{},[4611,90177,90178,90180],{},[7077,90179,469],{},[4584,90181,90182,90184],{},[7077,90183,472],{},[4596,90185,5058],{},[89720,90187,90188,90190,90198],{},[4591,90189,4632],{},[4584,90191,90192,90194,90196],{},[4596,90193,4635],{},[4591,90195,4609],{},[7077,90197,2949],{},[4596,90199,5058],{},[4591,90201,4594],{"stretchy":4593},[4600,90203,90204,90206],{},[4596,90205,26052],{},[4596,90207,17463],{},[4591,90209,4594],{"stretchy":4593},[26080,90211,90212,90214,90216],{},[4596,90213,4598],{},[7077,90215,2949],{},[4596,90217,4635],{},[4591,90219,2066],{"separator":1419},[26080,90221,90222,90224,90226],{},[4596,90223,4598],{},[7077,90225,469],{},[4596,90227,4635],{},[4591,90229,2066],{"separator":1419},[4591,90231,18198],{},[4587,90233,18201],{},[4591,90235,2066],{"separator":1419},[26080,90237,90238,90240,90242],{},[4596,90239,4598],{},[4596,90241,19],{},[4596,90243,4635],{},[4591,90245,4604],{"stretchy":4593},[4591,90247,17848],{},[4600,90249,90250,90252],{},[4596,90251,16867],{},[4596,90253,4635],{},[4614,90255,90256,90258],{},[4591,90257,4604],{"stretchy":4593},[7077,90259,472],{},[4647,90261,90262],{"encoding":4649},"J(x_1, x_2, \\cdots, x_n) = \\frac{1}{2m} \\sum_{j=0}^m (h_\\theta (x_0^j, x_1^j, \\cdots, x_n^j) - y_j)^2",[78,90264,90266,90438,90822],{"className":90265,"ariaHidden":1419},[4654],[78,90267,90269,90272,90276,90279,90319,90322,90325,90365,90368,90371,90374,90377,90380,90383,90386,90426,90429,90432,90435],{"className":90268},[4658],[78,90270],{"className":90271,"style":4663},[4662],[78,90273,90141],{"className":90274,"style":90275},[4667,4678],"margin-right:0.0962em;",[78,90277,4594],{"className":90278},[4674],[78,90280,90282,90285],{"className":90281},[4667],[78,90283,4598],{"className":90284},[4667,4678],[78,90286,90288],{"className":90287},[4689],[78,90289,90291,90311],{"className":90290},[4693,4694],[78,90292,90294,90308],{"className":90293},[4698],[78,90295,90297],{"className":90296,"style":18264},[4702],[78,90298,90299,90302],{"style":4706},[78,90300],{"className":90301,"style":4711},[4710],[78,90303,90305],{"className":90304},[4715,4716,4717,4718],[78,90306,469],{"className":90307},[4667,4718],[78,90309,4726],{"className":90310},[4725],[78,90312,90314],{"className":90313},[4698],[78,90315,90317],{"className":90316,"style":4733},[4702],[78,90318],{},[78,90320,2066],{"className":90321},[5126],[78,90323],{"className":90324,"style":4839},[4739],[78,90326,90328,90331],{"className":90327},[4667],[78,90329,4598],{"className":90330},[4667,4678],[78,90332,90334],{"className":90333},[4689],[78,90335,90337,90357],{"className":90336},[4693,4694],[78,90338,90340,90354],{"className":90339},[4698],[78,90341,90343],{"className":90342,"style":18264},[4702],[78,90344,90345,90348],{"style":4706},[78,90346],{"className":90347,"style":4711},[4710],[78,90349,90351],{"className":90350},[4715,4716,4717,4718],[78,90352,472],{"className":90353},[4667,4718],[78,90355,4726],{"className":90356},[4725],[78,90358,90360],{"className":90359},[4698],[78,90361,90363],{"className":90362,"style":4733},[4702],[78,90364],{},[78,90366,2066],{"className":90367},[5126],[78,90369],{"className":90370,"style":4839},[4739],[78,90372,18198],{"className":90373},[18342],[78,90375],{"className":90376,"style":4839},[4739],[78,90378],{"className":90379,"style":4839},[4739],[78,90381,2066],{"className":90382},[5126],[78,90384],{"className":90385,"style":4839},[4739],[78,90387,90389,90392],{"className":90388},[4667],[78,90390,4598],{"className":90391},[4667,4678],[78,90393,90395],{"className":90394},[4689],[78,90396,90398,90418],{"className":90397},[4693,4694],[78,90399,90401,90415],{"className":90400},[4698],[78,90402,90404],{"className":90403,"style":5279},[4702],[78,90405,90406,90409],{"style":4706},[78,90407],{"className":90408,"style":4711},[4710],[78,90410,90412],{"className":90411},[4715,4716,4717,4718],[78,90413,19],{"className":90414},[4667,4678,4718],[78,90416,4726],{"className":90417},[4725],[78,90419,90421],{"className":90420},[4698],[78,90422,90424],{"className":90423,"style":4733},[4702],[78,90425],{},[78,90427,4604],{"className":90428},[4682],[78,90430],{"className":90431,"style":4740},[4739],[78,90433,4609],{"className":90434},[4744],[78,90436],{"className":90437,"style":4740},[4739],[78,90439,90441,90445,90511,90514,90579,90582,90622,90625,90679,90682,90685,90736,90739,90742,90745,90748,90751,90754,90757,90810,90813,90816,90819],{"className":90440},[4658],[78,90442],{"className":90443,"style":90444},[4662],"height:3.0652em;vertical-align:-1.4138em;",[78,90446,90448,90451,90508],{"className":90447},[4667],[78,90449],{"className":90450},[4674,4761],[78,90452,90454],{"className":90453},[4611],[78,90455,90457,90499],{"className":90456},[4693,4694],[78,90458,90460,90496],{"className":90459},[4698],[78,90461,90463,90477,90485],{"className":90462,"style":86003},[4702],[78,90464,90465,90468],{"style":4777},[78,90466],{"className":90467,"style":4781},[4710],[78,90469,90471,90474],{"className":90470},[4667],[78,90472,472],{"className":90473},[4667],[78,90475,5058],{"className":90476},[4667,4678],[78,90478,90479,90482],{"style":4919},[78,90480],{"className":90481,"style":4781},[4710],[78,90483],{"className":90484,"style":4927},[4926],[78,90486,90487,90490],{"style":4930},[78,90488],{"className":90489,"style":4781},[4710],[78,90491,90493],{"className":90492},[4667],[78,90494,469],{"className":90495},[4667],[78,90497,4726],{"className":90498},[4725],[78,90500,90502],{"className":90501},[4698],[78,90503,90506],{"className":90504,"style":90505},[4702],"height:0.686em;",[78,90507],{},[78,90509],{"className":90510},[4682,4761],[78,90512],{"className":90513,"style":4839},[4739],[78,90515,90517],{"className":90516},[4788,52401],[78,90518,90520,90570],{"className":90519},[4693,4694],[78,90521,90523,90567],{"className":90522},[4698],[78,90524,90526,90546,90556],{"className":90525,"style":89979},[4702],[78,90527,90528,90531],{"style":89982},[78,90529],{"className":90530,"style":89986},[4710],[78,90532,90534],{"className":90533},[4715,4716,4717,4718],[78,90535,90537,90540,90543],{"className":90536},[4667,4718],[78,90538,4635],{"className":90539,"style":4823},[4667,4678,4718],[78,90541,4609],{"className":90542},[4744,4718],[78,90544,2949],{"className":90545},[4667,4718],[78,90547,90548,90551],{"style":90004},[78,90549],{"className":90550,"style":89986},[4710],[78,90552,90553],{},[78,90554,4632],{"className":90555},[4788,4792,90013],[78,90557,90558,90561],{"style":90016},[78,90559],{"className":90560,"style":89986},[4710],[78,90562,90564],{"className":90563},[4715,4716,4717,4718],[78,90565,5058],{"className":90566},[4667,4678,4718],[78,90568,4726],{"className":90569},[4725],[78,90571,90573],{"className":90572},[4698],[78,90574,90577],{"className":90575,"style":90576},[4702],"height:1.4138em;",[78,90578],{},[78,90580,4594],{"className":90581},[4674],[78,90583,90585,90588],{"className":90584},[4667],[78,90586,26052],{"className":90587},[4667,4678],[78,90589,90591],{"className":90590},[4689],[78,90592,90594,90614],{"className":90593},[4693,4694],[78,90595,90597,90611],{"className":90596},[4698],[78,90598,90600],{"className":90599,"style":5566},[4702],[78,90601,90602,90605],{"style":4706},[78,90603],{"className":90604,"style":4711},[4710],[78,90606,90608],{"className":90607},[4715,4716,4717,4718],[78,90609,17463],{"className":90610,"style":17251},[4667,4678,4718],[78,90612,4726],{"className":90613},[4725],[78,90615,90617],{"className":90616},[4698],[78,90618,90620],{"className":90619,"style":4733},[4702],[78,90621],{},[78,90623,4594],{"className":90624},[4674],[78,90626,90628,90631],{"className":90627},[4667],[78,90629,4598],{"className":90630},[4667,4678],[78,90632,90634],{"className":90633},[4689],[78,90635,90637,90670],{"className":90636},[4693,4694],[78,90638,90640,90667],{"className":90639},[4698],[78,90641,90644,90656],{"className":90642,"style":90643},[4702],"height:0.9426em;",[78,90645,90647,90650],{"style":90646},"top:-2.4337em;margin-left:0em;margin-right:0.05em;",[78,90648],{"className":90649,"style":4711},[4710],[78,90651,90653],{"className":90652},[4715,4716,4717,4718],[78,90654,2949],{"className":90655},[4667,4718],[78,90657,90658,90661],{"style":26245},[78,90659],{"className":90660,"style":4711},[4710],[78,90662,90664],{"className":90663},[4715,4716,4717,4718],[78,90665,4635],{"className":90666,"style":4823},[4667,4678,4718],[78,90668,4726],{"className":90669},[4725],[78,90671,90673],{"className":90672},[4698],[78,90674,90677],{"className":90675,"style":90676},[4702],"height:0.2663em;",[78,90678],{},[78,90680,2066],{"className":90681},[5126],[78,90683],{"className":90684,"style":4839},[4739],[78,90686,90688,90691],{"className":90687},[4667],[78,90689,4598],{"className":90690},[4667,4678],[78,90692,90694],{"className":90693},[4689],[78,90695,90697,90728],{"className":90696},[4693,4694],[78,90698,90700,90725],{"className":90699},[4698],[78,90701,90703,90714],{"className":90702,"style":90643},[4702],[78,90704,90705,90708],{"style":90646},[78,90706],{"className":90707,"style":4711},[4710],[78,90709,90711],{"className":90710},[4715,4716,4717,4718],[78,90712,469],{"className":90713},[4667,4718],[78,90715,90716,90719],{"style":26245},[78,90717],{"className":90718,"style":4711},[4710],[78,90720,90722],{"className":90721},[4715,4716,4717,4718],[78,90723,4635],{"className":90724,"style":4823},[4667,4678,4718],[78,90726,4726],{"className":90727},[4725],[78,90729,90731],{"className":90730},[4698],[78,90732,90734],{"className":90733,"style":90676},[4702],[78,90735],{},[78,90737,2066],{"className":90738},[5126],[78,90740],{"className":90741,"style":4839},[4739],[78,90743,18198],{"className":90744},[18342],[78,90746],{"className":90747,"style":4839},[4739],[78,90749],{"className":90750,"style":4839},[4739],[78,90752,2066],{"className":90753},[5126],[78,90755],{"className":90756,"style":4839},[4739],[78,90758,90760,90763],{"className":90759},[4667],[78,90761,4598],{"className":90762},[4667,4678],[78,90764,90766],{"className":90765},[4689],[78,90767,90769,90802],{"className":90768},[4693,4694],[78,90770,90772,90799],{"className":90771},[4698],[78,90773,90776,90788],{"className":90774,"style":90775},[4702],"height:0.8747em;",[78,90777,90779,90782],{"style":90778},"top:-2.453em;margin-left:0em;margin-right:0.05em;",[78,90780],{"className":90781,"style":4711},[4710],[78,90783,90785],{"className":90784},[4715,4716,4717,4718],[78,90786,19],{"className":90787},[4667,4678,4718],[78,90789,90790,90793],{"style":5209},[78,90791],{"className":90792,"style":4711},[4710],[78,90794,90796],{"className":90795},[4715,4716,4717,4718],[78,90797,4635],{"className":90798,"style":4823},[4667,4678,4718],[78,90800,4726],{"className":90801},[4725],[78,90803,90805],{"className":90804},[4698],[78,90806,90808],{"className":90807,"style":26326},[4702],[78,90809],{},[78,90811,4604],{"className":90812},[4682],[78,90814],{"className":90815,"style":5143},[4739],[78,90817,17848],{"className":90818},[7450],[78,90820],{"className":90821,"style":5143},[4739],[78,90823,90825,90829,90869],{"className":90824},[4658],[78,90826],{"className":90827,"style":90828},[4662],"height:1.1502em;vertical-align:-0.2861em;",[78,90830,90832,90835],{"className":90831},[4667],[78,90833,16867],{"className":90834,"style":5187},[4667,4678],[78,90836,90838],{"className":90837},[4689],[78,90839,90841,90861],{"className":90840},[4693,4694],[78,90842,90844,90858],{"className":90843},[4698],[78,90845,90847],{"className":90846,"style":4703},[4702],[78,90848,90849,90852],{"style":63415},[78,90850],{"className":90851,"style":4711},[4710],[78,90853,90855],{"className":90854},[4715,4716,4717,4718],[78,90856,4635],{"className":90857,"style":4823},[4667,4678,4718],[78,90859,4726],{"className":90860},[4725],[78,90862,90864],{"className":90863},[4698],[78,90865,90867],{"className":90866,"style":6178},[4702],[78,90868],{},[78,90870,90872,90875],{"className":90871},[4682],[78,90873,4604],{"className":90874},[4682],[78,90876,90878],{"className":90877},[4689],[78,90879,90881],{"className":90880},[4693],[78,90882,90884],{"className":90883},[4698],[78,90885,90887],{"className":90886,"style":53807},[4702],[78,90888,90889,90892],{"style":5209},[78,90890],{"className":90891,"style":4711},[4710],[78,90893,90895],{"className":90894},[4715,4716,4717,4718],[78,90896,472],{"className":90897},[4667,4718],[13,90899,90900],{},"（2）初始化参数：θi（i = 0，1，2，…，θn）、算法终止误差为ε、梯度下降步长为α。θ可以随机生成，步长初始化为1；ε根据需要的精确度来设置，ε越小可能算法运行时间就越长。后续可以根据运行结果再调整参数。",[13,90902,90903],{},"（3）算法过程如下：",[13,90905,90906],{},"【1】求梯度：",[78,90908,90910],{"className":90909},[4566],[78,90911,90913,90981],{"className":90912},[4570],[78,90914,90916],{"className":90915},[4574],[4576,90917,90918],{"xmlns":4578,"display":4579},[4581,90919,90920,90978],{},[4584,90921,90922,90929,90931,90933,90944,90946,90948,90954,90956,90962,90964,90966,90968,90970,90976],{},[4600,90923,90924,90927],{},[4596,90925,90926],{"mathvariant":7101},"∇",[4596,90928,39],{},[4591,90930,4609],{},[4596,90932,55518],{},[4611,90934,90935,90938],{},[4596,90936,90937],{"mathvariant":7101},"∂",[4584,90939,90940,90942],{},[4596,90941,90937],{"mathvariant":7101},[4596,90943,17463],{},[4596,90945,90141],{},[4591,90947,4594],{"stretchy":4593},[4600,90949,90950,90952],{},[4596,90951,17463],{},[7077,90953,2949],{},[4591,90955,2066],{"separator":1419},[4600,90957,90958,90960],{},[4596,90959,17463],{},[7077,90961,469],{},[4591,90963,2066],{"separator":1419},[4591,90965,18198],{},[4587,90967,18201],{},[4591,90969,2066],{"separator":1419},[4600,90971,90972,90974],{},[4596,90973,17463],{},[4596,90975,19],{},[4591,90977,4604],{"stretchy":4593},[4647,90979,90980],{"encoding":4649},"\\nabla_i = \\alpha \\frac{\\partial}{\\partial \\theta}J(\\theta_0, \\theta_1,\\cdots, \\theta_n)",[78,90982,90984,91039],{"className":90983,"ariaHidden":1419},[4654],[78,90985,90987,90990,91030,91033,91036],{"className":90986},[4658],[78,90988],{"className":90989,"style":20406},[4662],[78,90991,90993,90996],{"className":90992},[4667],[78,90994,90926],{"className":90995},[4667],[78,90997,90999],{"className":90998},[4689],[78,91000,91002,91022],{"className":91001},[4693,4694],[78,91003,91005,91019],{"className":91004},[4698],[78,91006,91008],{"className":91007,"style":4703},[4702],[78,91009,91010,91013],{"style":4706},[78,91011],{"className":91012,"style":4711},[4710],[78,91014,91016],{"className":91015},[4715,4716,4717,4718],[78,91017,39],{"className":91018},[4667,4678,4718],[78,91020,4726],{"className":91021},[4725],[78,91023,91025],{"className":91024},[4698],[78,91026,91028],{"className":91027,"style":4733},[4702],[78,91029],{},[78,91031],{"className":91032,"style":4740},[4739],[78,91034,4609],{"className":91035},[4744],[78,91037],{"className":91038,"style":4740},[4739],[78,91040,91042,91046,91049,91114,91117,91120,91160,91163,91166,91206,91209,91212,91215,91218,91221,91224,91227,91267],{"className":91041},[4658],[78,91043],{"className":91044,"style":91045},[4662],"height:2.0574em;vertical-align:-0.686em;",[78,91047,55518],{"className":91048,"style":55822},[4667,4678],[78,91050,91052,91055,91111],{"className":91051},[4667],[78,91053],{"className":91054},[4674,4761],[78,91056,91058],{"className":91057},[4611],[78,91059,91061,91103],{"className":91060},[4693,4694],[78,91062,91064,91100],{"className":91063},[4698],[78,91065,91067,91081,91089],{"className":91066,"style":83268},[4702],[78,91068,91069,91072],{"style":4777},[78,91070],{"className":91071,"style":4781},[4710],[78,91073,91075,91078],{"className":91074},[4667],[78,91076,90937],{"className":91077,"style":79383},[4667],[78,91079,17463],{"className":91080,"style":17251},[4667,4678],[78,91082,91083,91086],{"style":4919},[78,91084],{"className":91085,"style":4781},[4710],[78,91087],{"className":91088,"style":4927},[4926],[78,91090,91091,91094],{"style":4930},[78,91092],{"className":91093,"style":4781},[4710],[78,91095,91097],{"className":91096},[4667],[78,91098,90937],{"className":91099,"style":79383},[4667],[78,91101,4726],{"className":91102},[4725],[78,91104,91106],{"className":91105},[4698],[78,91107,91109],{"className":91108,"style":90505},[4702],[78,91110],{},[78,91112],{"className":91113},[4682,4761],[78,91115,90141],{"className":91116,"style":90275},[4667,4678],[78,91118,4594],{"className":91119},[4674],[78,91121,91123,91126],{"className":91122},[4667],[78,91124,17463],{"className":91125,"style":17251},[4667,4678],[78,91127,91129],{"className":91128},[4689],[78,91130,91132,91152],{"className":91131},[4693,4694],[78,91133,91135,91149],{"className":91134},[4698],[78,91136,91138],{"className":91137,"style":18264},[4702],[78,91139,91140,91143],{"style":84052},[78,91141],{"className":91142,"style":4711},[4710],[78,91144,91146],{"className":91145},[4715,4716,4717,4718],[78,91147,2949],{"className":91148},[4667,4718],[78,91150,4726],{"className":91151},[4725],[78,91153,91155],{"className":91154},[4698],[78,91156,91158],{"className":91157,"style":4733},[4702],[78,91159],{},[78,91161,2066],{"className":91162},[5126],[78,91164],{"className":91165,"style":4839},[4739],[78,91167,91169,91172],{"className":91168},[4667],[78,91170,17463],{"className":91171,"style":17251},[4667,4678],[78,91173,91175],{"className":91174},[4689],[78,91176,91178,91198],{"className":91177},[4693,4694],[78,91179,91181,91195],{"className":91180},[4698],[78,91182,91184],{"className":91183,"style":18264},[4702],[78,91185,91186,91189],{"style":84052},[78,91187],{"className":91188,"style":4711},[4710],[78,91190,91192],{"className":91191},[4715,4716,4717,4718],[78,91193,469],{"className":91194},[4667,4718],[78,91196,4726],{"className":91197},[4725],[78,91199,91201],{"className":91200},[4698],[78,91202,91204],{"className":91203,"style":4733},[4702],[78,91205],{},[78,91207,2066],{"className":91208},[5126],[78,91210],{"className":91211,"style":4839},[4739],[78,91213,18198],{"className":91214},[18342],[78,91216],{"className":91217,"style":4839},[4739],[78,91219],{"className":91220,"style":4839},[4739],[78,91222,2066],{"className":91223},[5126],[78,91225],{"className":91226,"style":4839},[4739],[78,91228,91230,91233],{"className":91229},[4667],[78,91231,17463],{"className":91232,"style":17251},[4667,4678],[78,91234,91236],{"className":91235},[4689],[78,91237,91239,91259],{"className":91238},[4693,4694],[78,91240,91242,91256],{"className":91241},[4698],[78,91243,91245],{"className":91244,"style":5279},[4702],[78,91246,91247,91250],{"style":84052},[78,91248],{"className":91249,"style":4711},[4710],[78,91251,91253],{"className":91252},[4715,4716,4717,4718],[78,91254,19],{"className":91255},[4667,4678,4718],[78,91257,4726],{"className":91258},[4725],[78,91260,91262],{"className":91261},[4698],[78,91263,91265],{"className":91264,"style":4733},[4702],[78,91266],{},[78,91268,4604],{"className":91269},[4682],[13,91271,91272],{},"【2】若|∇i| \u003C ε，则运行结束，输出θi（i= 0，1，2，…，n）；若|∇i| >= ε，则运行下一步；",[13,91274,91275],{},"【3】更新所有的θ：",[78,91277,91279],{"className":91278},[4566],[78,91280,91282,91356],{"className":91281},[4570],[78,91283,91285],{"className":91284},[4574],[4576,91286,91287],{"xmlns":4578,"display":4579},[4581,91288,91289,91353],{},[4584,91290,91291,91297,91299,91305,91307,91309,91319,91321,91323,91329,91331,91337,91339,91341,91343,91345,91351],{},[4600,91292,91293,91295],{},[4596,91294,17463],{},[4596,91296,39],{},[4591,91298,4609],{},[4600,91300,91301,91303],{},[4596,91302,17463],{},[4596,91304,39],{},[4591,91306,17848],{},[4596,91308,55518],{},[4611,91310,91311,91313],{},[4596,91312,90937],{"mathvariant":7101},[4584,91314,91315,91317],{},[4596,91316,90937],{"mathvariant":7101},[4596,91318,17463],{},[4596,91320,90141],{},[4591,91322,4594],{"stretchy":4593},[4600,91324,91325,91327],{},[4596,91326,17463],{},[7077,91328,2949],{},[4591,91330,2066],{"separator":1419},[4600,91332,91333,91335],{},[4596,91334,17463],{},[7077,91336,469],{},[4591,91338,2066],{"separator":1419},[4591,91340,18198],{},[4587,91342,18201],{},[4591,91344,2066],{"separator":1419},[4600,91346,91347,91349],{},[4596,91348,17463],{},[4596,91350,19],{},[4591,91352,4604],{"stretchy":4593},[4647,91354,91355],{"encoding":4649},"\\theta_i = \\theta_i -  \\alpha \\frac{\\partial}{\\partial \\theta}J(\\theta_0, \\theta_1,\\cdots, \\theta_n)",[78,91357,91359,91414,91469],{"className":91358,"ariaHidden":1419},[4654],[78,91360,91362,91365,91405,91408,91411],{"className":91361},[4658],[78,91363],{"className":91364,"style":5260},[4662],[78,91366,91368,91371],{"className":91367},[4667],[78,91369,17463],{"className":91370,"style":17251},[4667,4678],[78,91372,91374],{"className":91373},[4689],[78,91375,91377,91397],{"className":91376},[4693,4694],[78,91378,91380,91394],{"className":91379},[4698],[78,91381,91383],{"className":91382,"style":4703},[4702],[78,91384,91385,91388],{"style":84052},[78,91386],{"className":91387,"style":4711},[4710],[78,91389,91391],{"className":91390},[4715,4716,4717,4718],[78,91392,39],{"className":91393},[4667,4678,4718],[78,91395,4726],{"className":91396},[4725],[78,91398,91400],{"className":91399},[4698],[78,91401,91403],{"className":91402,"style":4733},[4702],[78,91404],{},[78,91406],{"className":91407,"style":4740},[4739],[78,91409,4609],{"className":91410},[4744],[78,91412],{"className":91413,"style":4740},[4739],[78,91415,91417,91420,91460,91463,91466],{"className":91416},[4658],[78,91418],{"className":91419,"style":5260},[4662],[78,91421,91423,91426],{"className":91422},[4667],[78,91424,17463],{"className":91425,"style":17251},[4667,4678],[78,91427,91429],{"className":91428},[4689],[78,91430,91432,91452],{"className":91431},[4693,4694],[78,91433,91435,91449],{"className":91434},[4698],[78,91436,91438],{"className":91437,"style":4703},[4702],[78,91439,91440,91443],{"style":84052},[78,91441],{"className":91442,"style":4711},[4710],[78,91444,91446],{"className":91445},[4715,4716,4717,4718],[78,91447,39],{"className":91448},[4667,4678,4718],[78,91450,4726],{"className":91451},[4725],[78,91453,91455],{"className":91454},[4698],[78,91456,91458],{"className":91457,"style":4733},[4702],[78,91459],{},[78,91461],{"className":91462,"style":5143},[4739],[78,91464,17848],{"className":91465},[7450],[78,91467],{"className":91468,"style":5143},[4739],[78,91470,91472,91475,91478,91543,91546,91549,91589,91592,91595,91635,91638,91641,91644,91647,91650,91653,91656,91696],{"className":91471},[4658],[78,91473],{"className":91474,"style":91045},[4662],[78,91476,55518],{"className":91477,"style":55822},[4667,4678],[78,91479,91481,91484,91540],{"className":91480},[4667],[78,91482],{"className":91483},[4674,4761],[78,91485,91487],{"className":91486},[4611],[78,91488,91490,91532],{"className":91489},[4693,4694],[78,91491,91493,91529],{"className":91492},[4698],[78,91494,91496,91510,91518],{"className":91495,"style":83268},[4702],[78,91497,91498,91501],{"style":4777},[78,91499],{"className":91500,"style":4781},[4710],[78,91502,91504,91507],{"className":91503},[4667],[78,91505,90937],{"className":91506,"style":79383},[4667],[78,91508,17463],{"className":91509,"style":17251},[4667,4678],[78,91511,91512,91515],{"style":4919},[78,91513],{"className":91514,"style":4781},[4710],[78,91516],{"className":91517,"style":4927},[4926],[78,91519,91520,91523],{"style":4930},[78,91521],{"className":91522,"style":4781},[4710],[78,91524,91526],{"className":91525},[4667],[78,91527,90937],{"className":91528,"style":79383},[4667],[78,91530,4726],{"className":91531},[4725],[78,91533,91535],{"className":91534},[4698],[78,91536,91538],{"className":91537,"style":90505},[4702],[78,91539],{},[78,91541],{"className":91542},[4682,4761],[78,91544,90141],{"className":91545,"style":90275},[4667,4678],[78,91547,4594],{"className":91548},[4674],[78,91550,91552,91555],{"className":91551},[4667],[78,91553,17463],{"className":91554,"style":17251},[4667,4678],[78,91556,91558],{"className":91557},[4689],[78,91559,91561,91581],{"className":91560},[4693,4694],[78,91562,91564,91578],{"className":91563},[4698],[78,91565,91567],{"className":91566,"style":18264},[4702],[78,91568,91569,91572],{"style":84052},[78,91570],{"className":91571,"style":4711},[4710],[78,91573,91575],{"className":91574},[4715,4716,4717,4718],[78,91576,2949],{"className":91577},[4667,4718],[78,91579,4726],{"className":91580},[4725],[78,91582,91584],{"className":91583},[4698],[78,91585,91587],{"className":91586,"style":4733},[4702],[78,91588],{},[78,91590,2066],{"className":91591},[5126],[78,91593],{"className":91594,"style":4839},[4739],[78,91596,91598,91601],{"className":91597},[4667],[78,91599,17463],{"className":91600,"style":17251},[4667,4678],[78,91602,91604],{"className":91603},[4689],[78,91605,91607,91627],{"className":91606},[4693,4694],[78,91608,91610,91624],{"className":91609},[4698],[78,91611,91613],{"className":91612,"style":18264},[4702],[78,91614,91615,91618],{"style":84052},[78,91616],{"className":91617,"style":4711},[4710],[78,91619,91621],{"className":91620},[4715,4716,4717,4718],[78,91622,469],{"className":91623},[4667,4718],[78,91625,4726],{"className":91626},[4725],[78,91628,91630],{"className":91629},[4698],[78,91631,91633],{"className":91632,"style":4733},[4702],[78,91634],{},[78,91636,2066],{"className":91637},[5126],[78,91639],{"className":91640,"style":4839},[4739],[78,91642,18198],{"className":91643},[18342],[78,91645],{"className":91646,"style":4839},[4739],[78,91648],{"className":91649,"style":4839},[4739],[78,91651,2066],{"className":91652},[5126],[78,91654],{"className":91655,"style":4839},[4739],[78,91657,91659,91662],{"className":91658},[4667],[78,91660,17463],{"className":91661,"style":17251},[4667,4678],[78,91663,91665],{"className":91664},[4689],[78,91666,91668,91688],{"className":91667},[4693,4694],[78,91669,91671,91685],{"className":91670},[4698],[78,91672,91674],{"className":91673,"style":5279},[4702],[78,91675,91676,91679],{"style":84052},[78,91677],{"className":91678,"style":4711},[4710],[78,91680,91682],{"className":91681},[4715,4716,4717,4718],[78,91683,19],{"className":91684},[4667,4678,4718],[78,91686,4726],{"className":91687},[4725],[78,91689,91691],{"className":91690},[4698],[78,91692,91694],{"className":91693,"style":4733},[4702],[78,91695],{},[78,91697,4604],{"className":91698},[4682],[13,91700,91701,91702],{},"更新完，转步骤【1】。",[22,91703,91704],{},"（重点公式）",[13,91706,91707],{},"【4】加快收敛的方法：",[49,91709,91710,91713],{},[52,91711,91712],{},"特征缩放。在多特征问题中保证特征有相近的尺度将有利于梯度下降。",[52,91714,91715],{},"通过调整学习率来更改收敛速度。学习率过小会导致梯度下降方法收敛过慢，但过大也可能使得网络不能收敛。",[13,91717,91718],{},"【5】多种梯度下降方法：",[49,91720,91721],{},[52,91722,91723],{},"批量梯度下降方法（Batch Gradient Descent）",[13,91725,91726],{},"这是梯度下降方法中使用最多的形式之一，其具体操作是在更新参数时，使用所有的样本来进行更新。缺点在于由于训练的样本大，训练速度会变慢。",[49,91728,91729],{},[52,91730,91731],{},"随机梯度下降方法（Stochastic Grandient Descent）",[13,91733,91734],{},"该方法和批量梯度下降方法原理类似，区别在于求梯度时没有采用所有的样本数据，而仅仅选取一个样本求解梯度。其优点在于只采用一个样本迭代，故训练速度极快；缺点在于迭代方向变化很大，不过很快收敛到局部最优解。",[49,91736,91737],{},[52,91738,91739],{},"小批量梯度下降方法（Mini-batch Gradient Descent）",[13,91741,91742],{},"该方法综合了上述两种方式的优缺点，即对于m个样本，就采用x个样本来迭代，1\u003Cx\u003Cm，可以根据样本数据调整x的值。",[23289,91744],{},[7759,91746,91748],{"id":91747},"_5误差反向传播算法p280最后一个大题","5、误差反向传播算法(P280最后一个大题)",[10548,91750,91752],{"id":91751},"原理选择题","原理（选择题）",[13,91754,91755],{},"在消息正向传播的过程中，信息经过输入层到达隐含层，再经过多个隐含层的处理后到达输出层；比较输出结果和正确结果，将误差作为一个目标函数进行反向传播，对每一层依次求神经元权值的偏导数，构成目标函数对权值的梯度，网络权重再依次完成更新调整。依此往复，直到输出达到目标值完成训练。",[10548,91757,25480],{"id":25480},[13,91759,91760],{},"利用输出误差推算前一层的误差，再用推算误差算出更前一层的误差，直到计算出所有层的误差估计。",[10548,91762,91763],{"id":91763},"前向传播",[13,91765,91766],{},"前向传播简而言之就是从输入层开始，信号输入神经元，经过加权偏置激活函数的处理输出，称为下一级的输入参数，如此往复直到从输出层输出。",[13,91768,91769],{},[22,91770,91771],{},"主要公式",[78,91773,91775],{"className":91774},[4566],[78,91776,91778,91846],{"className":91777},[4570],[78,91779,91781],{"className":91780},[4574],[4576,91782,91783],{"xmlns":4578,"display":4579},[4581,91784,91785,91843],{},[4584,91786,91787,91793,91795,91801,91813,91815,91821,91823,91829,91831,91833,91835,91841],{},[4614,91788,91789,91791],{},[4596,91790,25949],{},[4596,91792,7132],{},[4591,91794,4609],{},[4614,91796,91797,91799],{},[4596,91798,6107],{},[4596,91800,7132],{},[4614,91802,91803,91805],{},[4596,91804,5009],{},[4584,91806,91807,91809,91811],{},[4596,91808,7132],{},[4591,91810,17848],{},[7077,91812,469],{},[4591,91814,7351],{},[4614,91816,91817,91819],{},[4596,91818,12172],{},[4596,91820,7132],{},[4739,91822],{"linebreak":52940},[4614,91824,91825,91827],{},[4596,91826,5009],{},[4596,91828,7132],{},[4591,91830,4609],{},[4596,91832,5053],{},[4591,91834,4594],{"stretchy":4593},[4614,91836,91837,91839],{},[4596,91838,25949],{},[4596,91840,7132],{},[4591,91842,4604],{"stretchy":4593},[4647,91844,91845],{"encoding":4649},"z^l = W^la^{l-1} + b^l \\\\\na^l = f(z^l)",[78,91847,91849,91894,91977,92012,92015,92059],{"className":91848,"ariaHidden":1419},[4654],[78,91850,91852,91856,91885,91888,91891],{"className":91851},[4658],[78,91853],{"className":91854,"style":91855},[4662],"height:0.8991em;",[78,91857,91859,91862],{"className":91858},[4667],[78,91860,25949],{"className":91861,"style":43903},[4667,4678],[78,91863,91865],{"className":91864},[4689],[78,91866,91868],{"className":91867},[4693],[78,91869,91871],{"className":91870},[4698],[78,91872,91874],{"className":91873,"style":91855},[4702],[78,91875,91876,91879],{"style":5209},[78,91877],{"className":91878,"style":4711},[4710],[78,91880,91882],{"className":91881},[4715,4716,4717,4718],[78,91883,7132],{"className":91884,"style":7300},[4667,4678,4718],[78,91886],{"className":91887,"style":4740},[4739],[78,91889,4609],{"className":91890},[4744],[78,91892],{"className":91893,"style":4740},[4739],[78,91895,91897,91901,91930,91968,91971,91974],{"className":91896},[4658],[78,91898],{"className":91899,"style":91900},[4662],"height:0.9824em;vertical-align:-0.0833em;",[78,91902,91904,91907],{"className":91903},[4667],[78,91905,6107],{"className":91906,"style":5219},[4667,4678],[78,91908,91910],{"className":91909},[4689],[78,91911,91913],{"className":91912},[4693],[78,91914,91916],{"className":91915},[4698],[78,91917,91919],{"className":91918,"style":91855},[4702],[78,91920,91921,91924],{"style":5209},[78,91922],{"className":91923,"style":4711},[4710],[78,91925,91927],{"className":91926},[4715,4716,4717,4718],[78,91928,7132],{"className":91929,"style":7300},[4667,4678,4718],[78,91931,91933,91936],{"className":91932},[4667],[78,91934,5009],{"className":91935},[4667,4678],[78,91937,91939],{"className":91938},[4689],[78,91940,91942],{"className":91941},[4693],[78,91943,91945],{"className":91944},[4698],[78,91946,91948],{"className":91947,"style":91855},[4702],[78,91949,91950,91953],{"style":5209},[78,91951],{"className":91952,"style":4711},[4710],[78,91954,91956],{"className":91955},[4715,4716,4717,4718],[78,91957,91959,91962,91965],{"className":91958},[4667,4718],[78,91960,7132],{"className":91961,"style":7300},[4667,4678,4718],[78,91963,17848],{"className":91964},[7450,4718],[78,91966,469],{"className":91967},[4667,4718],[78,91969],{"className":91970,"style":5143},[4739],[78,91972,7351],{"className":91973},[7450],[78,91975],{"className":91976,"style":5143},[4739],[78,91978,91980,91983],{"className":91979},[4658],[78,91981],{"className":91982,"style":91855},[4662],[78,91984,91986,91989],{"className":91985},[4667],[78,91987,12172],{"className":91988},[4667,4678],[78,91990,91992],{"className":91991},[4689],[78,91993,91995],{"className":91994},[4693],[78,91996,91998],{"className":91997},[4698],[78,91999,92001],{"className":92000,"style":91855},[4702],[78,92002,92003,92006],{"style":5209},[78,92004],{"className":92005,"style":4711},[4710],[78,92007,92009],{"className":92008},[4715,4716,4717,4718],[78,92010,7132],{"className":92011,"style":7300},[4667,4678,4718],[78,92013],{"className":92014},[4739,52940],[78,92016,92018,92021,92050,92053,92056],{"className":92017},[4658],[78,92019],{"className":92020,"style":91855},[4662],[78,92022,92024,92027],{"className":92023},[4667],[78,92025,5009],{"className":92026},[4667,4678],[78,92028,92030],{"className":92029},[4689],[78,92031,92033],{"className":92032},[4693],[78,92034,92036],{"className":92035},[4698],[78,92037,92039],{"className":92038,"style":91855},[4702],[78,92040,92041,92044],{"style":5209},[78,92042],{"className":92043,"style":4711},[4710],[78,92045,92047],{"className":92046},[4715,4716,4717,4718],[78,92048,7132],{"className":92049,"style":7300},[4667,4678,4718],[78,92051],{"className":92052,"style":4740},[4739],[78,92054,4609],{"className":92055},[4744],[78,92057],{"className":92058,"style":4740},[4739],[78,92060,92062,92066,92069,92072,92101],{"className":92061},[4658],[78,92063],{"className":92064,"style":92065},[4662],"height:1.1491em;vertical-align:-0.25em;",[78,92067,5053],{"className":92068,"style":5170},[4667,4678],[78,92070,4594],{"className":92071},[4674],[78,92073,92075,92078],{"className":92074},[4667],[78,92076,25949],{"className":92077,"style":43903},[4667,4678],[78,92079,92081],{"className":92080},[4689],[78,92082,92084],{"className":92083},[4693],[78,92085,92087],{"className":92086},[4698],[78,92088,92090],{"className":92089,"style":91855},[4702],[78,92091,92092,92095],{"style":5209},[78,92093],{"className":92094,"style":4711},[4710],[78,92096,92098],{"className":92097},[4715,4716,4717,4718],[78,92099,7132],{"className":92100,"style":7300},[4667,4678,4718],[78,92102,4604],{"className":92103},[4682],[10548,92105,92106],{"id":92106},"反向传播",[13,92108,92109],{},"反向传播以前向传播为基础，从前向传播得到的参数前反向推导更新每一层的权重和偏置。",[13,92111,92112],{},"假定以误差平方作为损失函数，将该目标函数作为优化目标：",[78,92114,92116],{"className":92115},[4566],[78,92117,92119,92192],{"className":92118},[4570],[78,92120,92122],{"className":92121},[4574],[4576,92123,92124],{"xmlns":4578,"display":4579},[4581,92125,92126,92189],{},[4584,92127,92128,92130,92132,92134,92136,92138,92140,92142,92148,92162,92164,92175,92177,92183],{},[4596,92129,90141],{},[4591,92131,4594],{"stretchy":4593},[4596,92133,6107],{},[4591,92135,2066],{"separator":1419},[4596,92137,12172],{},[4591,92139,4604],{"stretchy":4593},[4591,92141,4609],{},[4611,92143,92144,92146],{},[7077,92145,469],{},[7077,92147,472],{},[89720,92149,92150,92152,92160],{},[4591,92151,4632],{},[4584,92153,92154,92156,92158],{},[4596,92155,4635],{},[4591,92157,4609],{},[7077,92159,469],{},[4596,92161,7132],{},[4591,92163,4594],{"stretchy":4593},[4600,92165,92166,92173],{},[79789,92167,92168,92170],{"accent":1419},[4596,92169,16867],{},[4591,92171,92172],{},"^",[4596,92174,39],{},[4591,92176,17848],{},[4600,92178,92179,92181],{},[4596,92180,16867],{},[4596,92182,39],{},[4614,92184,92185,92187],{},[4591,92186,4604],{"stretchy":4593},[7077,92188,472],{},[4647,92190,92191],{"encoding":4649},"J (W, b) = \\frac{1}{2} \\sum_{j = 1}^l (\\hat y_i - y_i) ^2",[78,92193,92195,92231,92463],{"className":92194,"ariaHidden":1419},[4654],[78,92196,92198,92201,92204,92207,92210,92213,92216,92219,92222,92225,92228],{"className":92197},[4658],[78,92199],{"className":92200,"style":4663},[4662],[78,92202,90141],{"className":92203,"style":90275},[4667,4678],[78,92205,4594],{"className":92206},[4674],[78,92208,6107],{"className":92209,"style":5219},[4667,4678],[78,92211,2066],{"className":92212},[5126],[78,92214],{"className":92215,"style":4839},[4739],[78,92217,12172],{"className":92218},[4667,4678],[78,92220,4604],{"className":92221},[4682],[78,92223],{"className":92224,"style":4740},[4739],[78,92226,4609],{"className":92227},[4744],[78,92229],{"className":92230,"style":4740},[4739],[78,92232,92234,92238,92300,92303,92368,92371,92454,92457,92460],{"className":92233},[4658],[78,92235],{"className":92236,"style":92237},[4662],"height:3.2499em;vertical-align:-1.4138em;",[78,92239,92241,92244,92297],{"className":92240},[4667],[78,92242],{"className":92243},[4674,4761],[78,92245,92247],{"className":92246},[4611],[78,92248,92250,92289],{"className":92249},[4693,4694],[78,92251,92253,92286],{"className":92252},[4698],[78,92254,92256,92267,92275],{"className":92255,"style":86003},[4702],[78,92257,92258,92261],{"style":4777},[78,92259],{"className":92260,"style":4781},[4710],[78,92262,92264],{"className":92263},[4667],[78,92265,472],{"className":92266},[4667],[78,92268,92269,92272],{"style":4919},[78,92270],{"className":92271,"style":4781},[4710],[78,92273],{"className":92274,"style":4927},[4926],[78,92276,92277,92280],{"style":4930},[78,92278],{"className":92279,"style":4781},[4710],[78,92281,92283],{"className":92282},[4667],[78,92284,469],{"className":92285},[4667],[78,92287,4726],{"className":92288},[4725],[78,92290,92292],{"className":92291},[4698],[78,92293,92295],{"className":92294,"style":90505},[4702],[78,92296],{},[78,92298],{"className":92299},[4682,4761],[78,92301],{"className":92302,"style":4839},[4739],[78,92304,92306],{"className":92305},[4788,52401],[78,92307,92309,92360],{"className":92308},[4693,4694],[78,92310,92312,92357],{"className":92311},[4698],[78,92313,92316,92336,92346],{"className":92314,"style":92315},[4702],"height:1.8361em;",[78,92317,92318,92321],{"style":89982},[78,92319],{"className":92320,"style":89986},[4710],[78,92322,92324],{"className":92323},[4715,4716,4717,4718],[78,92325,92327,92330,92333],{"className":92326},[4667,4718],[78,92328,4635],{"className":92329,"style":4823},[4667,4678,4718],[78,92331,4609],{"className":92332},[4744,4718],[78,92334,469],{"className":92335},[4667,4718],[78,92337,92338,92341],{"style":90004},[78,92339],{"className":92340,"style":89986},[4710],[78,92342,92343],{},[78,92344,4632],{"className":92345},[4788,4792,90013],[78,92347,92348,92351],{"style":90016},[78,92349],{"className":92350,"style":89986},[4710],[78,92352,92354],{"className":92353},[4715,4716,4717,4718],[78,92355,7132],{"className":92356,"style":7300},[4667,4678,4718],[78,92358,4726],{"className":92359},[4725],[78,92361,92363],{"className":92362},[4698],[78,92364,92366],{"className":92365,"style":90576},[4702],[78,92367],{},[78,92369,4594],{"className":92370},[4674],[78,92372,92374,92420],{"className":92373},[4667],[78,92375,92378],{"className":92376},[4667,92377],"accent",[78,92379,92381,92411],{"className":92380},[4693,4694],[78,92382,92384,92408],{"className":92383},[4698],[78,92385,92387,92395],{"className":92386,"style":16794},[4702],[78,92388,92389,92392],{"style":5824},[78,92390],{"className":92391,"style":4781},[4710],[78,92393,16867],{"className":92394,"style":5187},[4667,4678],[78,92396,92397,92400],{"style":5824},[78,92398],{"className":92399,"style":4781},[4710],[78,92401,92405],{"className":92402,"style":92404},[92403],"accent-body","left:-0.1944em;",[78,92406,92172],{"className":92407},[4667],[78,92409,4726],{"className":92410},[4725],[78,92412,92414],{"className":92413},[4698],[78,92415,92418],{"className":92416,"style":92417},[4702],"height:0.1944em;",[78,92419],{},[78,92421,92423],{"className":92422},[4689],[78,92424,92426,92446],{"className":92425},[4693,4694],[78,92427,92429,92443],{"className":92428},[4698],[78,92430,92432],{"className":92431,"style":4703},[4702],[78,92433,92434,92437],{"style":63415},[78,92435],{"className":92436,"style":4711},[4710],[78,92438,92440],{"className":92439},[4715,4716,4717,4718],[78,92441,39],{"className":92442},[4667,4678,4718],[78,92444,4726],{"className":92445},[4725],[78,92447,92449],{"className":92448},[4698],[78,92450,92452],{"className":92451,"style":4733},[4702],[78,92453],{},[78,92455],{"className":92456,"style":5143},[4739],[78,92458,17848],{"className":92459},[7450],[78,92461],{"className":92462,"style":5143},[4739],[78,92464,92466,92469,92509],{"className":92465},[4658],[78,92467],{"className":92468,"style":53782},[4662],[78,92470,92472,92475],{"className":92471},[4667],[78,92473,16867],{"className":92474,"style":5187},[4667,4678],[78,92476,92478],{"className":92477},[4689],[78,92479,92481,92501],{"className":92480},[4693,4694],[78,92482,92484,92498],{"className":92483},[4698],[78,92485,92487],{"className":92486,"style":4703},[4702],[78,92488,92489,92492],{"style":63415},[78,92490],{"className":92491,"style":4711},[4710],[78,92493,92495],{"className":92494},[4715,4716,4717,4718],[78,92496,39],{"className":92497},[4667,4678,4718],[78,92499,4726],{"className":92500},[4725],[78,92502,92504],{"className":92503},[4698],[78,92505,92507],{"className":92506,"style":4733},[4702],[78,92508],{},[78,92510,92512,92515],{"className":92511},[4682],[78,92513,4604],{"className":92514},[4682],[78,92516,92518],{"className":92517},[4689],[78,92519,92521],{"className":92520},[4693],[78,92522,92524],{"className":92523},[4698],[78,92525,92527],{"className":92526,"style":53807},[4702],[78,92528,92529,92532],{"style":5209},[78,92530],{"className":92531,"style":4711},[4710],[78,92533,92535],{"className":92534},[4715,4716,4717,4718],[78,92536,472],{"className":92537},[4667,4718],[13,92539,92540],{},"其中，两个yi分别表示神经网络的输出结果和数据集给出的真实结果。",[13,92542,92543],{},"根据梯度下降方法的原理，可以按照如下方式更新参数：",[78,92545,92547],{"className":92546},[4566],[78,92548,92550,92611],{"className":92549},[4570],[78,92551,92553],{"className":92552},[4574],[4576,92554,92555],{"xmlns":4578,"display":4579},[4581,92556,92557,92608],{},[4584,92558,92559,92565,92567,92573,92575,92577,92605],{},[4614,92560,92561,92563],{},[4596,92562,6107],{},[4596,92564,7132],{},[4591,92566,4609],{},[4614,92568,92569,92571],{},[4596,92570,6107],{},[4596,92572,7132],{},[4591,92574,17848],{},[4596,92576,55518],{},[4611,92578,92579,92595],{},[4584,92580,92581,92583,92585,92587,92589,92591,92593],{},[4596,92582,90937],{"mathvariant":7101},[4596,92584,90141],{},[4591,92586,4594],{"stretchy":4593},[4596,92588,6107],{},[4591,92590,2066],{"separator":1419},[4596,92592,12172],{},[4591,92594,4604],{"stretchy":4593},[4584,92596,92597,92599],{},[4596,92598,90937],{"mathvariant":7101},[4614,92600,92601,92603],{},[4596,92602,6107],{},[4596,92604,7132],{},[4587,92606,92607],{},"     （权值调整）",[4647,92609,92610],{"encoding":4649},"W^l = W^l - \\alpha \\frac{\\partial J (W, b)}{\\partial W ^ l} \\ \\ \\ \\ \\ （权值调整）",[78,92612,92614,92658,92702],{"className":92613,"ariaHidden":1419},[4654],[78,92615,92617,92620,92649,92652,92655],{"className":92616},[4658],[78,92618],{"className":92619,"style":91855},[4662],[78,92621,92623,92626],{"className":92622},[4667],[78,92624,6107],{"className":92625,"style":5219},[4667,4678],[78,92627,92629],{"className":92628},[4689],[78,92630,92632],{"className":92631},[4693],[78,92633,92635],{"className":92634},[4698],[78,92636,92638],{"className":92637,"style":91855},[4702],[78,92639,92640,92643],{"style":5209},[78,92641],{"className":92642,"style":4711},[4710],[78,92644,92646],{"className":92645},[4715,4716,4717,4718],[78,92647,7132],{"className":92648,"style":7300},[4667,4678,4718],[78,92650],{"className":92651,"style":4740},[4739],[78,92653,4609],{"className":92654},[4744],[78,92656],{"className":92657,"style":4740},[4739],[78,92659,92661,92664,92693,92696,92699],{"className":92660},[4658],[78,92662],{"className":92663,"style":91900},[4662],[78,92665,92667,92670],{"className":92666},[4667],[78,92668,6107],{"className":92669,"style":5219},[4667,4678],[78,92671,92673],{"className":92672},[4689],[78,92674,92676],{"className":92675},[4693],[78,92677,92679],{"className":92678},[4698],[78,92680,92682],{"className":92681,"style":91855},[4702],[78,92683,92684,92687],{"style":5209},[78,92685],{"className":92686,"style":4711},[4710],[78,92688,92690],{"className":92689},[4715,4716,4717,4718],[78,92691,7132],{"className":92692,"style":7300},[4667,4678,4718],[78,92694],{"className":92695,"style":5143},[4739],[78,92697,17848],{"className":92698},[7450],[78,92700],{"className":92701,"style":5143},[4739],[78,92703,92705,92709,92712,92824,92827,92830,92833,92836,92839],{"className":92704},[4658],[78,92706],{"className":92707,"style":92708},[4662],"height:2.113em;vertical-align:-0.686em;",[78,92710,55518],{"className":92711,"style":55822},[4667,4678],[78,92713,92715,92718,92821],{"className":92714},[4667],[78,92716],{"className":92717},[4674,4761],[78,92719,92721],{"className":92720},[4611],[78,92722,92724,92813],{"className":92723},[4693,4694],[78,92725,92727,92810],{"className":92726},[4698],[78,92728,92730,92770,92778],{"className":92729,"style":52478},[4702],[78,92731,92732,92735],{"style":4777},[78,92733],{"className":92734,"style":4781},[4710],[78,92736,92738,92741],{"className":92737},[4667],[78,92739,90937],{"className":92740,"style":79383},[4667],[78,92742,92744,92747],{"className":92743},[4667],[78,92745,6107],{"className":92746,"style":5219},[4667,4678],[78,92748,92750],{"className":92749},[4689],[78,92751,92753],{"className":92752},[4693],[78,92754,92756],{"className":92755},[4698],[78,92757,92759],{"className":92758,"style":86042},[4702],[78,92760,92761,92764],{"style":19600},[78,92762],{"className":92763,"style":4711},[4710],[78,92765,92767],{"className":92766},[4715,4716,4717,4718],[78,92768,7132],{"className":92769,"style":7300},[4667,4678,4718],[78,92771,92772,92775],{"style":4919},[78,92773],{"className":92774,"style":4781},[4710],[78,92776],{"className":92777,"style":4927},[4926],[78,92779,92780,92783],{"style":4930},[78,92781],{"className":92782,"style":4781},[4710],[78,92784,92786,92789,92792,92795,92798,92801,92804,92807],{"className":92785},[4667],[78,92787,90937],{"className":92788,"style":79383},[4667],[78,92790,90141],{"className":92791,"style":90275},[4667,4678],[78,92793,4594],{"className":92794},[4674],[78,92796,6107],{"className":92797,"style":5219},[4667,4678],[78,92799,2066],{"className":92800},[5126],[78,92802],{"className":92803,"style":4839},[4739],[78,92805,12172],{"className":92806},[4667,4678],[78,92808,4604],{"className":92809},[4682],[78,92811,4726],{"className":92812},[4725],[78,92814,92816],{"className":92815},[4698],[78,92817,92819],{"className":92818,"style":90505},[4702],[78,92820],{},[78,92822],{"className":92823},[4682,4761],[78,92825,79936],{"className":92826},[4739],[78,92828,79936],{"className":92829},[4739],[78,92831,79936],{"className":92832},[4739],[78,92834,79936],{"className":92835},[4739],[78,92837,79936],{"className":92838},[4739],[78,92840,92842],{"className":92841},[4667,6184],"（权值调整）",[23289,92844],{},[107,92846,92848],{"id":92847},"_20补充","2.0补充",[13,92850,92851],{},"该部分内容为考试结束后进行实况整理分为选择题、填空题、大题三个部分（简答题并不固定，也一并放在大题之间）。",[7759,92853,92854],{"id":92854},"选择题",[13,92856,92857],{},"选择题主要以背记部分为主，字面意义上的背记部分，比如遗传算法的特点、生物神经算法的特点等内容，也就是说在简答题自己对简答题的背记能够完全应付考试中的选择题部分。",[23289,92859],{},[7759,92861,92862],{"id":92862},"填空题",[13,92864,92865],{},"填空题部分需要大家多对老师上课的知识内容进行留意（特指老师讲过5遍以上的内容），这次的填空题5空10分，后三空是一个简单的大题（参考P189 α水平载集例题改编），第一二空为：",[49,92867,92868,92871],{},[52,92869,92870],{},"老师上课常说的“假小明”指的是什么？（A：我写的是不同的输入，但是不确定答案的正确性）",[52,92872,92873],{},"老师上课最常说的七字学习规则是什么？（A：学习率x负梯度）",[23289,92875],{},[7759,92877,92878],{"id":92878},"大题",[13,92880,92881],{},"大题出的中规中矩，其余不做过多说明，最后一个大题可以参考用例：",[13,92883,92884],{},[617,92885],{"alt":37000,"src":92886},"%E8%AE%A1%E7%AE%97%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA%EF%BC%88%E5%BA%94%E8%AF%95%E4%B8%BA%E4%B8%BB%EF%BC%89\u002F%E5%A4%A7%E9%A2%981.png",[13,92888,92889],{},[617,92890],{"alt":92891,"src":92892},"大题2","%E8%AE%A1%E7%AE%97%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA%EF%BC%88%E5%BA%94%E8%AF%95%E4%B8%BA%E4%B8%BB%EF%BC%89\u002F%E5%A4%A7%E9%A2%982.png",[13,92894,92895],{},[617,92896],{"alt":92897,"src":92898},"大题3","%E8%AE%A1%E7%AE%97%E6%99%BA%E8%83%BD%E5%AF%BC%E8%AE%BA%EF%BC%88%E5%BA%94%E8%AF%95%E4%B8%BA%E4%B8%BB%EF%BC%89\u002F%E5%A4%A7%E9%A2%983.png",[107,92900,25480],{"id":92901},"总结-1",[13,92903,92904],{},"这个文档到这里就告一段落了，东西不算多，但也决说不上少了，可以看出整个科目便向数学计算和理论算法，所以真正想学好的话还是需要个人去把（丢掉的）数学学好吧。这个文档不适合作为学科学习，但可以作为入门参考资料，应付考试的理论部分看这个文档基本上是够用了，但是解题部分我更建议大家去看看书上的例题，就像我标记了重点的那几页的例题必须是需要自己去看去了解的。",[13,92906,92907],{},"因为例题太难敲了所以我就没放到文档里，不然真成应试文档了（😀），希望有机会看到这个文档的还是需要花时间去啃下这些硬骨头，后续还会慢慢出学习文档的。但是也会有出着出着自己学会了就不想出的（比如说《人工智能导论》）。最后希望能够帮到大家吧，培养优质大数据打工人！——By Alexie-Z-Yevich 2022.6.22",[13,92909,92910],{},"这门课考试还真没为难大家，比较难的就最后一题需要计算，但是其实老师上课都已经讲过了并且在复习阶段都已经教过大家怎么去写。分值也不算太高，最后一个大题占16分，其余都是送分题，需要补充的东西并不多，基本上以这个文档内容来说完全足够了。——By Alexie-Z-Yevich 2022.7.1",{"title":119,"searchDepth":144,"depth":144,"links":92912},[92913,92917,92924,92934,92941,92946],{"id":78188,"depth":132,"text":78189,"children":92914},[92915,92916],{"id":78192,"depth":144,"text":78193},{"id":78205,"depth":144,"text":78206},{"id":78223,"depth":132,"text":78224,"children":92918},[92919,92920,92921,92922,92923],{"id":78227,"depth":144,"text":78228},{"id":78239,"depth":144,"text":78240},{"id":78265,"depth":144,"text":78266},{"id":78301,"depth":144,"text":78302},{"id":78417,"depth":144,"text":78418},{"id":78429,"depth":132,"text":78430,"children":92925},[92926,92927,92928,92929,92930,92931,92932,92933],{"id":78433,"depth":144,"text":78434},{"id":78816,"depth":144,"text":78817},{"id":79412,"depth":144,"text":79413},{"id":79421,"depth":144,"text":79422},{"id":83521,"depth":144,"text":83522},{"id":83674,"depth":144,"text":83675},{"id":83854,"depth":144,"text":83855},{"id":84331,"depth":144,"text":84332},{"id":85371,"depth":132,"text":85372,"children":92935},[92936,92937,92938,92939,92940],{"id":85375,"depth":144,"text":85376},{"id":85396,"depth":144,"text":85397},{"id":87810,"depth":144,"text":87811},{"id":88279,"depth":144,"text":88280},{"id":91747,"depth":144,"text":91748},{"id":92847,"depth":132,"text":92848,"children":92942},[92943,92944,92945],{"id":92854,"depth":144,"text":92854},{"id":92862,"depth":144,"text":92862},{"id":92878,"depth":144,"text":92878},{"id":92901,"depth":132,"text":25480},{},"我的大学\u002F大二下学期\u002F计算智能导论（应试为主）\u002F计算智能导论.md","\u002Fundergraduate\u002Fnote-aa2f385e1ecc",{"title":78166,"description":119},"undergraduate\u002Fnote-aa2f385e1ecc",[7744,246,14542],"2kGEx3lZCi949Rnmb5ep-yzkFWVjx2JcBTxXEeurO2A",{"id":92955,"title":92956,"assetBase":239,"author":8,"body":92957,"category":23936,"collection":23324,"date":23325,"description":92961,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":93643,"navigation":128,"originalPath":93644,"path":93645,"seo":93646,"source":23330,"stem":93647,"tags":93648,"weight":250,"__hash__":93649},"content\u002Fundergraduate\u002Fnote-ae54b0c17072.md","腾讯音乐海笔复盘",{"type":10,"value":92958,"toc":93640},[92959,92962,92965,92968,92971,92990,92993,92995,92998,93004,93007,93010,93194,93197,93374,93377,93638],[13,92960,92961],{},"2023.3.23",[13,92963,92964],{},"今天进行了腾讯音乐的数据工程海笔，一个都没写出来真的臊得慌。趁着还记得来进行一下简单的复盘。",[13,92966,92967],{},"首先数据工程和前后端的试题都不同，前后端是3+1，三个算法+一个结构性思维题；数据工程是2+1+2，两个SQL题+一个算法题+两个组件的结构性思维题。两个SQL其实比较简单，但是我SQL并没有想象中的熟练，且听说ac机有点点怪（这不是主要原因），所以没有写出来。题目不太好描述，所以后续搜集到了题目会进行更新。算法是个dfs算法，我算法也不强，想到了递归、想到了指针但是没想到dfs，真该死。。。",[13,92969,92970],{},"两个组件的题也是，简单描述下就是：",[49,92972,92973,92976],{},[52,92974,92975],{},"手写Kafka消费者工程代码，写一个固定格式的5分钟定时消费的代码",[52,92977,92978,92979],{},"flume\n",[49,92980,92981,92984,92987],{},[52,92982,92983],{},"维护一个实时排序用什么算法？手写关键代码",[52,92985,92986],{},"遇到海量数据时flume背压了，可能的情况和解决方案？",[52,92988,92989],{},"结合存储和性能给出的调优、选择方案",[13,92991,92992],{},"很遗憾，我这两个组件的面经都没背，甚至于flume都没有学，所以最后半小时在那一个字都憋不出。下面就对这个算法进行简单复盘。",[7759,92994,246],{"id":246},[13,92996,92997],{},"给定一个字符串和一个字符串数组，输出所有能用字符串数组拼接成字符串的情况。数组中的字符串可重复使用。",[114,92999,93002],{"className":93000,"code":93001,"language":299},[297],"例1：\n输入：String s = \"nowcoder\"; String[] arr = {\"now\", \"coder\", \"no\", \"wcoder\"};\n输出：{\"now coder\", \"no wcoder\"}\n\n例2：\n输入：String s = \"nownowcoder\"; String[] arr = {\"now\", \"coder\", \"no\", \"wcoder\"};\n输出：{\"now now coder\", \"now no wcoder\"}\n\n例3：\n输入：String s = \"nowcoder\"; String[] arr = {\"nowcoder\"};\n输出：{\"nowcoder\"}\n\n例4：\n输入：String s = \"nowcoder\"; String[] arr = {\"now\", \"wcoder\"};\n输出：{}\n",[17,93003,93001],{"__ignoreMap":119},[13,93005,93006],{},"为了显著提高我自己的技术，以后的算法笔记采用双版本进行书写。",[13,93008,93009],{},"Java版本：",[114,93011,93013],{"className":23652,"code":93012,"language":23654,"meta":119,"style":119},"import java.util.*;\n\npublic class Main {\n    public static void main(String[] args) {\n        Solution s = new Solution();\n        String s1 = \"nowcoder\";\n        String[] s2 = {\"now\", \"coder\", \"no\", \"wcoder\"};\n        String[] s3 = s.maxIn(s1, s2);\n        for (int i = 0; i \u003C s3.length; i++) {\n            System.out.println(s3[i]);\n        }\n\n    }\n}\n\nclass Solution {\n    List\u003CString> res = new ArrayList\u003C>();\n    String a;\n    String[] ss;\n    public String[] maxIn(String s, String[] arr) {\n        a = s;\n        ss = arr;\n        dfs(0, \"\");\n        return res.toArray(new String[res.size()]);\n    }\n\n    public void dfs(int parm, String s) {\n        if (parm >= a.length()) res.add(s);\n        if (parm \u003C a.length()) {\n            for(int i = 0; i \u003C ss.length; i++) {\n                int len = parm + ss[i].length();\n                if(len \u003C= a.length() && a.substring(parm, len).equals(ss[i])){\n                    if(parm == 0) dfs(len, ss[i]);\n                    else dfs(len, s + \" \" + ss[i]);\n                }\n            }\n        }\n    }\n}\n",[17,93014,93015,93019,93023,93027,93031,93036,93041,93046,93051,93056,93061,93065,93069,93073,93077,93081,93086,93091,93096,93101,93106,93111,93116,93121,93126,93130,93134,93139,93144,93149,93154,93159,93164,93169,93174,93178,93182,93186,93190],{"__ignoreMap":119},[78,93016,93017],{"class":124,"line":125},[78,93018,23544],{},[78,93020,93021],{"class":124,"line":132},[78,93022,129],{"emptyLinePlaceholder":128},[78,93024,93025],{"class":124,"line":138},[78,93026,36328],{},[78,93028,93029],{"class":124,"line":144},[78,93030,23558],{},[78,93032,93033],{"class":124,"line":150},[78,93034,93035],{},"        Solution s = new Solution();\n",[78,93037,93038],{"class":124,"line":156},[78,93039,93040],{},"        String s1 = \"nowcoder\";\n",[78,93042,93043],{"class":124,"line":162},[78,93044,93045],{},"        String[] s2 = {\"now\", \"coder\", \"no\", \"wcoder\"};\n",[78,93047,93048],{"class":124,"line":168},[78,93049,93050],{},"        String[] s3 = s.maxIn(s1, s2);\n",[78,93052,93053],{"class":124,"line":174},[78,93054,93055],{},"        for (int i = 0; i \u003C s3.length; i++) {\n",[78,93057,93058],{"class":124,"line":180},[78,93059,93060],{},"            System.out.println(s3[i]);\n",[78,93062,93063],{"class":124,"line":186},[78,93064,10054],{},[78,93066,93067],{"class":124,"line":192},[78,93068,129],{"emptyLinePlaceholder":128},[78,93070,93071],{"class":124,"line":198},[78,93072,15810],{},[78,93074,93075],{"class":124,"line":204},[78,93076,23518],{},[78,93078,93079],{"class":124,"line":210},[78,93080,129],{"emptyLinePlaceholder":128},[78,93082,93083],{"class":124,"line":216},[78,93084,93085],{},"class Solution {\n",[78,93087,93088],{"class":124,"line":222},[78,93089,93090],{},"    List\u003CString> res = new ArrayList\u003C>();\n",[78,93092,93093],{"class":124,"line":421},[78,93094,93095],{},"    String a;\n",[78,93097,93098],{"class":124,"line":427},[78,93099,93100],{},"    String[] ss;\n",[78,93102,93103],{"class":124,"line":433},[78,93104,93105],{},"    public String[] maxIn(String s, String[] arr) {\n",[78,93107,93108],{"class":124,"line":2443},[78,93109,93110],{},"        a = s;\n",[78,93112,93113],{"class":124,"line":2448},[78,93114,93115],{},"        ss = arr;\n",[78,93117,93118],{"class":124,"line":2454},[78,93119,93120],{},"        dfs(0, \"\");\n",[78,93122,93123],{"class":124,"line":2460},[78,93124,93125],{},"        return res.toArray(new String[res.size()]);\n",[78,93127,93128],{"class":124,"line":2465},[78,93129,15810],{},[78,93131,93132],{"class":124,"line":2470},[78,93133,129],{"emptyLinePlaceholder":128},[78,93135,93136],{"class":124,"line":2903},[78,93137,93138],{},"    public void dfs(int parm, String s) {\n",[78,93140,93141],{"class":124,"line":2909},[78,93142,93143],{},"        if (parm >= a.length()) res.add(s);\n",[78,93145,93146],{"class":124,"line":11477},[78,93147,93148],{},"        if (parm \u003C a.length()) {\n",[78,93150,93151],{"class":124,"line":13374},[78,93152,93153],{},"            for(int i = 0; i \u003C ss.length; i++) {\n",[78,93155,93156],{"class":124,"line":13380},[78,93157,93158],{},"                int len = parm + ss[i].length();\n",[78,93160,93161],{"class":124,"line":13386},[78,93162,93163],{},"                if(len \u003C= a.length() && a.substring(parm, len).equals(ss[i])){\n",[78,93165,93166],{"class":124,"line":13722},[78,93167,93168],{},"                    if(parm == 0) dfs(len, ss[i]);\n",[78,93170,93171],{"class":124,"line":13727},[78,93172,93173],{},"                    else dfs(len, s + \" \" + ss[i]);\n",[78,93175,93176],{"class":124,"line":13953},[78,93177,9912],{},[78,93179,93180],{"class":124,"line":13958},[78,93181,9615],{},[78,93183,93184],{"class":124,"line":13964},[78,93185,10054],{},[78,93187,93188],{"class":124,"line":13969},[78,93189,15810],{},[78,93191,93192],{"class":124,"line":24170},[78,93193,23518],{},[13,93195,93196],{},"Scala版本：",[114,93198,93200],{"className":23406,"code":93199,"language":23408,"meta":119,"style":119},"import scala.collection.mutable.ArrayBuffer\n\nobject Main {\n  def main(args: Array[String]): Unit = {\n    val s: Solution = new Solution\n    val s1: String = \"nownowcoder\"\n    val s2: Array[String] = Array(\"now\", \"coder\", \"no\", \"wcoder\")\n    val s3: Array[String] = s.maxIn(s1, s2)\n    for (i \u003C- s3.indices) {\n      println(s3(i))\n    }\n  }\n}\n\nclass Solution {\n  private val res = ArrayBuffer[String]()\n  private var a: String = null\n  private var ss: Array[String] = null\n\n  def maxIn(s: String, arr: Array[String]): Array[String] = {\n    a = s\n    ss = arr\n    dfs(0, \"\")\n    res.toArray\n  }\n\n  private def dfs(param: Int, s: String): Unit = {\n    if (param >= a.length) res += s\n    else if (param \u003C a.length) for (i \u003C- ss.indices) {\n      val len: Int = param + ss(i).length\n      if (len \u003C= a.length && a.substring(param, len) == ss(i)) {\n        if (param == 0) dfs(len, ss(i))\n        else dfs(len, s + \" \" + ss(i))\n      }\n    }\n  }\n}\n",[17,93201,93202,93207,93211,93216,93221,93226,93231,93236,93241,93246,93251,93255,93259,93263,93267,93271,93276,93281,93286,93290,93295,93300,93305,93310,93315,93319,93323,93328,93333,93338,93343,93348,93353,93358,93362,93366,93370],{"__ignoreMap":119},[78,93203,93204],{"class":124,"line":125},[78,93205,93206],{},"import scala.collection.mutable.ArrayBuffer\n",[78,93208,93209],{"class":124,"line":132},[78,93210,129],{"emptyLinePlaceholder":128},[78,93212,93213],{"class":124,"line":138},[78,93214,93215],{},"object Main {\n",[78,93217,93218],{"class":124,"line":144},[78,93219,93220],{},"  def main(args: Array[String]): Unit = {\n",[78,93222,93223],{"class":124,"line":150},[78,93224,93225],{},"    val s: Solution = new Solution\n",[78,93227,93228],{"class":124,"line":156},[78,93229,93230],{},"    val s1: String = \"nownowcoder\"\n",[78,93232,93233],{"class":124,"line":162},[78,93234,93235],{},"    val s2: Array[String] = Array(\"now\", \"coder\", \"no\", \"wcoder\")\n",[78,93237,93238],{"class":124,"line":168},[78,93239,93240],{},"    val s3: Array[String] = s.maxIn(s1, s2)\n",[78,93242,93243],{"class":124,"line":174},[78,93244,93245],{},"    for (i \u003C- s3.indices) {\n",[78,93247,93248],{"class":124,"line":180},[78,93249,93250],{},"      println(s3(i))\n",[78,93252,93253],{"class":124,"line":186},[78,93254,15810],{},[78,93256,93257],{"class":124,"line":192},[78,93258,23513],{},[78,93260,93261],{"class":124,"line":198},[78,93262,23518],{},[78,93264,93265],{"class":124,"line":204},[78,93266,129],{"emptyLinePlaceholder":128},[78,93268,93269],{"class":124,"line":210},[78,93270,93085],{},[78,93272,93273],{"class":124,"line":216},[78,93274,93275],{},"  private val res = ArrayBuffer[String]()\n",[78,93277,93278],{"class":124,"line":222},[78,93279,93280],{},"  private var a: String = null\n",[78,93282,93283],{"class":124,"line":421},[78,93284,93285],{},"  private var ss: Array[String] = null\n",[78,93287,93288],{"class":124,"line":427},[78,93289,129],{"emptyLinePlaceholder":128},[78,93291,93292],{"class":124,"line":433},[78,93293,93294],{},"  def maxIn(s: String, arr: Array[String]): Array[String] = {\n",[78,93296,93297],{"class":124,"line":2443},[78,93298,93299],{},"    a = s\n",[78,93301,93302],{"class":124,"line":2448},[78,93303,93304],{},"    ss = arr\n",[78,93306,93307],{"class":124,"line":2454},[78,93308,93309],{},"    dfs(0, \"\")\n",[78,93311,93312],{"class":124,"line":2460},[78,93313,93314],{},"    res.toArray\n",[78,93316,93317],{"class":124,"line":2465},[78,93318,23513],{},[78,93320,93321],{"class":124,"line":2470},[78,93322,129],{"emptyLinePlaceholder":128},[78,93324,93325],{"class":124,"line":2903},[78,93326,93327],{},"  private def dfs(param: Int, s: String): Unit = {\n",[78,93329,93330],{"class":124,"line":2909},[78,93331,93332],{},"    if (param >= a.length) res += s\n",[78,93334,93335],{"class":124,"line":11477},[78,93336,93337],{},"    else if (param \u003C a.length) for (i \u003C- ss.indices) {\n",[78,93339,93340],{"class":124,"line":13374},[78,93341,93342],{},"      val len: Int = param + ss(i).length\n",[78,93344,93345],{"class":124,"line":13380},[78,93346,93347],{},"      if (len \u003C= a.length && a.substring(param, len) == ss(i)) {\n",[78,93349,93350],{"class":124,"line":13386},[78,93351,93352],{},"        if (param == 0) dfs(len, ss(i))\n",[78,93354,93355],{"class":124,"line":13722},[78,93356,93357],{},"        else dfs(len, s + \" \" + ss(i))\n",[78,93359,93360],{"class":124,"line":13727},[78,93361,23499],{},[78,93363,93364],{"class":124,"line":13953},[78,93365,15810],{},[78,93367,93368],{"class":124,"line":13958},[78,93369,23513],{},[78,93371,93372],{"class":124,"line":13964},[78,93373,23518],{},[13,93375,93376],{},"友人提供的C++版本",[114,93378,93380],{"className":51126,"code":93379,"language":51128,"meta":119,"style":119},"#include \u003Ciostream>\n#include \u003Cvector>\n\nusing namespace std;\n\nstring s;\nint n;\nvector \u003Cstring> v;\nvector \u003Cvector\u003Cstring>> ans;\nint st[30];\nint len;\n\nvoid getAns() {\n    vector \u003Cstring> vi;\n    for (int i = 0; i \u003C len; i++) {\n        vi.push_back(v[st[i]]);\n    }\n    ans.push_back(vi);\n}\n\nvoid dfs(int p) {\n    if (p == s.size()) {\n        getAns();\n        return;\n    }\n    for (int i = 0; i \u003C n; i++) {\n        int pi = p;\n        int si = 0;\n        while (pi \u003C s.size() && si \u003C v[i].size() && s[pi] == v[i][si]) {\n            pi++;\n            si++;\n        }\n        if (si >= v[i].size()) {\n            st[len++] = i;\n            dfs(pi);\n            len--;\n        }\n    }\n}\n\nint main() {\n    cin >> s;\n    cin >> n;\n    v.resize(n);\n    for (int i = 0; i \u003C n; i++) {\n        cin >> v[i];\n    }\n    dfs(0);\n    for (int i = 0; i \u003C ans.size(); i++) {\n        for (int j = 0; j \u003C ans[i].size(); j++) {\n            cout \u003C\u003C ans[i][j] \u003C\u003C \" \";\n        }\n        cout \u003C\u003C endl;\n    }\n}\n",[17,93381,93382,93387,93391,93395,93399,93403,93408,93413,93418,93423,93428,93433,93437,93442,93447,93452,93457,93461,93466,93470,93474,93479,93484,93489,93494,93498,93503,93508,93513,93518,93523,93528,93532,93537,93542,93547,93552,93556,93560,93564,93568,93573,93578,93583,93588,93592,93597,93601,93606,93611,93616,93621,93625,93630,93634],{"__ignoreMap":119},[78,93383,93384],{"class":124,"line":125},[78,93385,93386],{},"#include \u003Ciostream>\n",[78,93388,93389],{"class":124,"line":132},[78,93390,60187],{},[78,93392,93393],{"class":124,"line":138},[78,93394,129],{"emptyLinePlaceholder":128},[78,93396,93397],{"class":124,"line":144},[78,93398,51205],{},[78,93400,93401],{"class":124,"line":150},[78,93402,129],{"emptyLinePlaceholder":128},[78,93404,93405],{"class":124,"line":156},[78,93406,93407],{},"string s;\n",[78,93409,93410],{"class":124,"line":162},[78,93411,93412],{},"int n;\n",[78,93414,93415],{"class":124,"line":168},[78,93416,93417],{},"vector \u003Cstring> v;\n",[78,93419,93420],{"class":124,"line":174},[78,93421,93422],{},"vector \u003Cvector\u003Cstring>> ans;\n",[78,93424,93425],{"class":124,"line":180},[78,93426,93427],{},"int st[30];\n",[78,93429,93430],{"class":124,"line":186},[78,93431,93432],{},"int len;\n",[78,93434,93435],{"class":124,"line":192},[78,93436,129],{"emptyLinePlaceholder":128},[78,93438,93439],{"class":124,"line":198},[78,93440,93441],{},"void getAns() {\n",[78,93443,93444],{"class":124,"line":204},[78,93445,93446],{},"    vector \u003Cstring> vi;\n",[78,93448,93449],{"class":124,"line":210},[78,93450,93451],{},"    for (int i = 0; i \u003C len; i++) {\n",[78,93453,93454],{"class":124,"line":216},[78,93455,93456],{},"        vi.push_back(v[st[i]]);\n",[78,93458,93459],{"class":124,"line":222},[78,93460,15810],{},[78,93462,93463],{"class":124,"line":421},[78,93464,93465],{},"    ans.push_back(vi);\n",[78,93467,93468],{"class":124,"line":427},[78,93469,23518],{},[78,93471,93472],{"class":124,"line":433},[78,93473,129],{"emptyLinePlaceholder":128},[78,93475,93476],{"class":124,"line":2443},[78,93477,93478],{},"void dfs(int p) {\n",[78,93480,93481],{"class":124,"line":2448},[78,93482,93483],{},"    if (p == s.size()) {\n",[78,93485,93486],{"class":124,"line":2454},[78,93487,93488],{},"        getAns();\n",[78,93490,93491],{"class":124,"line":2460},[78,93492,93493],{},"        return;\n",[78,93495,93496],{"class":124,"line":2465},[78,93497,15810],{},[78,93499,93500],{"class":124,"line":2470},[78,93501,93502],{},"    for (int i = 0; i \u003C n; i++) {\n",[78,93504,93505],{"class":124,"line":2903},[78,93506,93507],{},"        int pi = p;\n",[78,93509,93510],{"class":124,"line":2909},[78,93511,93512],{},"        int si = 0;\n",[78,93514,93515],{"class":124,"line":11477},[78,93516,93517],{},"        while (pi \u003C s.size() && si \u003C v[i].size() && s[pi] == v[i][si]) {\n",[78,93519,93520],{"class":124,"line":13374},[78,93521,93522],{},"            pi++;\n",[78,93524,93525],{"class":124,"line":13380},[78,93526,93527],{},"            si++;\n",[78,93529,93530],{"class":124,"line":13386},[78,93531,10054],{},[78,93533,93534],{"class":124,"line":13722},[78,93535,93536],{},"        if (si >= v[i].size()) {\n",[78,93538,93539],{"class":124,"line":13727},[78,93540,93541],{},"            st[len++] = i;\n",[78,93543,93544],{"class":124,"line":13953},[78,93545,93546],{},"            dfs(pi);\n",[78,93548,93549],{"class":124,"line":13958},[78,93550,93551],{},"            len--;\n",[78,93553,93554],{"class":124,"line":13964},[78,93555,10054],{},[78,93557,93558],{"class":124,"line":13969},[78,93559,15810],{},[78,93561,93562],{"class":124,"line":24170},[78,93563,23518],{},[78,93565,93566],{"class":124,"line":24175},[78,93567,129],{"emptyLinePlaceholder":128},[78,93569,93570],{"class":124,"line":24180},[78,93571,93572],{},"int main() {\n",[78,93574,93575],{"class":124,"line":24186},[78,93576,93577],{},"    cin >> s;\n",[78,93579,93580],{"class":124,"line":24192},[78,93581,93582],{},"    cin >> n;\n",[78,93584,93585],{"class":124,"line":24198},[78,93586,93587],{},"    v.resize(n);\n",[78,93589,93590],{"class":124,"line":24204},[78,93591,93502],{},[78,93593,93594],{"class":124,"line":24210},[78,93595,93596],{},"        cin >> v[i];\n",[78,93598,93599],{"class":124,"line":24215},[78,93600,15810],{},[78,93602,93603],{"class":124,"line":24220},[78,93604,93605],{},"    dfs(0);\n",[78,93607,93608],{"class":124,"line":24226},[78,93609,93610],{},"    for (int i = 0; i \u003C ans.size(); i++) {\n",[78,93612,93613],{"class":124,"line":24232},[78,93614,93615],{},"        for (int j = 0; j \u003C ans[i].size(); j++) {\n",[78,93617,93618],{"class":124,"line":24238},[78,93619,93620],{},"            cout \u003C\u003C ans[i][j] \u003C\u003C \" \";\n",[78,93622,93623],{"class":124,"line":24244},[78,93624,10054],{},[78,93626,93627],{"class":124,"line":24250},[78,93628,93629],{},"        cout \u003C\u003C endl;\n",[78,93631,93632],{"class":124,"line":24256},[78,93633,15810],{},[78,93635,93636],{"class":124,"line":24262},[78,93637,23518],{},[226,93639,228],{},{"title":119,"searchDepth":144,"depth":144,"links":93641},[93642],{"id":246,"depth":144,"text":246},{},"Little Tips\u002F腾讯音乐海笔复盘.md","\u002Fundergraduate\u002Fnote-ae54b0c17072",{"title":92956,"description":92961},"undergraduate\u002Fnote-ae54b0c17072",[246,10715],"OHCY99452nOqrARYf4BAeIHcLiBV9c1PaWZlGA8CVXQ",{"id":93651,"title":93652,"assetBase":239,"author":8,"body":93653,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":96206,"navigation":128,"originalPath":96207,"path":96208,"seo":96209,"source":23330,"stem":96210,"tags":96211,"weight":250,"__hash__":96212},"content\u002Fundergraduate\u002Fnote-bbdd47434503.md","大数据存储技术备考",{"type":10,"value":93654,"toc":96190},[93655,93658,93673,93677,93680,93703,93706,93710,93716,93722,93728,93732,93743,93749,93753,93756,93762,93765,93772,93776,93791,93796,93798,93802,93820,93829,93833,93836,93847,93850,93853,93859,93862,93868,93871,93877,93880,93885,93887,93891,93894,93897,93900,93906,93909,93913,93987,93989,93993,94000,94003,94009,94012,94018,94032,94035,94038,94044,94049,94055,94061,94066,94069,94075,94079,94084,94087,94092,94095,94098,94102,94109,94115,94118,94124,94130,94133,94135,94139,94146,94152,94155,94159,94162,94173,94176,94179,94183,94186,94192,94195,94201,94204,94207,94210,94214,94222,94233,94236,94239,94243,94246,94252,94255,94258,94260,94264,94267,94273,94276,94280,94283,94289,94333,94337,94344,94350,94353,94360,94363,94369,94380,94387,94394,94397,94402,94405,94408,94411,94414,94417,94422,94428,94431,94438,94444,94447,94454,94461,94464,94467,94474,94483,94485,94489,94493,94511,94517,94522,94526,94540,94545,94549,94561,94567,94571,94588,94594,94598,94620,94626,94632,94636,94666,94668,94672,94675,94681,94685,94716,94720,94728,94731,94742,94748,94756,94762,94770,94776,94790,94792,94796,94810,94814,94817,94823,94826,94832,94836,94862,94868,94872,94898,94904,94908,94968,94972,95007,95012,95014,95018,95022,95255,95260,95263,95266,95271,95274,95277,95281,95284,95425,95427,95431,95438,95448,95452,95472,95478,95484,95491,95497,95503,95507,95510,95516,95519,95526,95530,95533,95540,95543,95551,95557,95561,95564,95567,95570,95573,95579,95584,95617,95621,95632,95659,95663,95668,95683,95686,95701,95704,95712,95716,95723,95726,95736,95742,95746,95757,95761,95769,95771,95775,95778,95787,95790,95795,95798,95801,95807,95815,95822,95826,95832,95838,95845,95850,95857,95864,95867,95872,95875,95878,95884,95889,95895,95898,95902,95905,95911,95914,95921,95939,95958,95961,95964,95970,95973,95977,96023,96025,96029,96036,96040,96043,96049,96054,96057,96063,96066,96069,96074,96077,96081,96084,96087,96117,96120,96124,96127,96131,96134,96139,96148,96153,96156,96162,96166,96169,96173,96176,96179,96184,96186],[4517,93656,30123],{"id":93657},"大数据存储技术深入分布式缓存从原理到实践",[72,93659,93660,93664,93667,93670],{},[13,93661,93662],{},[22,93663,23957],{},[13,93665,93666],{},"这份文档不仅来自个人根据老师给的提纲参考书籍手敲完成，还参考了上届学姐的复习资料，同时融合了老师的PPT和网络上一些我认为比较好的博客。如果在大题后面打了【*】，就说明这是上届学长学姐没有考过的习题，老师不会平白无故往里面加重点吧。。。所以个人认为考到的概率较大。",[13,93668,93669],{},"并且，这份文档的内容会超出复习范围不少，因为是一边学一边写的，所以把我认为有助于大家理解的部分都敲进去了，如果只是为了背书的话，那大概率看每个题目下的最后一个小问差不多了，前面的大部分都是为了进行铺垫。",[13,93671,93672],{},"同样的，如果以后的学弟学妹画完重点后发现又多了许多新玩意，欢迎大家在Issues上Q我，最好是直接push进来，让文档成为一个可升级迭代的Project。",[7759,93674,93676],{"id":93675},"一cap理论","一、CAP理论",[10548,93678,93679],{"id":93679},"分布式系统的三个特性",[49,93681,93682,93689,93696],{},[52,93683,93684,93685,93688],{},"一致性【Consistency】：在分布式系统中的所有数据备份，在",[22,93686,93687],{},"同一时刻","是否有同样的值。（等同于所有节点访问同一份最新的数据副本）",[52,93690,93691,93692,93695],{},"可用性【Availability】：在集群中一部分",[22,93693,93694],{},"节点故障","后，集群整体是否还能响应客户端的读写请求。（对数据更新具备高可用性）",[52,93697,93698,93699,93702],{},"分区容忍性【Partition tolerance】：以实际效果而言，分区相当于对通信的",[22,93700,93701],{},"时限要求","。系统如果不能在一定时间内达成数据一致性，就意味着发生了分区的情况，必须就当前操作在C和A之间做出选择。",[13,93704,93705],{},"高可用、数据一致是很多系统设计的目标，但是分区又是不可避免地事情，由此引出了以下几种选择：",[10548,93707,93709],{"id":93708},"_1ca-without-p","（1）CA without P",[13,93711,93712,93713,67],{},"如果不要求P（不允许分区），则C（强一致性）和A（可用性）是可以保证的。但其实分区不是你想不想的问题，而是始终会存在，因此",[22,93714,93715],{},"CA的系统更多的是允许分区后各子系统依然保持CA",[13,93717,93718,93719,29665],{},"典型放弃分区容忍性的例子有",[22,93720,93721],{},"关系型数据库、LDAP",[13,93723,93724],{},[617,93725],{"alt":93726,"src":93727},"放弃分区容忍性","img\u002F1.1%E6%94%BE%E5%BC%83%E5%88%86%E5%8C%BA%E5%AE%B9%E5%BF%8D%E6%80%A7.png",[10548,93729,93731],{"id":93730},"_2cp-without-a","（2）CP without A",[13,93733,93734,93735,93738,93739,93742],{},"如果不要求A（可用性），相当于",[22,93736,93737],{},"每个请求都需要在Server 之间强一致，而P（分区）会导致同步时间无限延长","，如此CP也是可以保证的。很多",[22,93740,93741],{},"传统的数据库","分布式事务都属于这种模式，分布式锁也属于此种情况。",[13,93744,93745],{},[617,93746],{"alt":93747,"src":93748},"放弃可用性","img\u002F1.2%E6%94%BE%E5%BC%83%E5%8F%AF%E7%94%A8%E6%80%A7.png",[10548,93750,93752],{"id":93751},"_3ap-without-c","（3）AP without C",[13,93754,93755],{},"要高可用并允许分区，则需放弃一致性。一旦分区发生，节点之间可能会失去联系，为了高可用，每个节点只能用本地数据提供服务，而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。",[13,93757,93758],{},[617,93759],{"alt":93760,"src":93761},"放弃一致性","img\u002F1.3%E6%94%BE%E5%BC%83%E4%B8%80%E8%87%B4%E6%80%A7.png",[13,93763,93764],{},"该理论由brewer提出，2002年Lynch与其他人证明了Brewer猜想，从而把CAP上升为一个Lynch定理。",[13,93766,93767,93768,93771],{},"Lynch的证明采用",[22,93769,93770],{},"反证法","，如果三者可同时满足，则因为允许P的存在，一定存在Server之间的丢包，如此则不能保证C。在该证明中，Lynch对CAP定义进行了更加明确的声明。",[10548,93773,93775],{"id":93774},"更加明确的cap声明圣经","更加明确的CAP声明（圣经）",[49,93777,93778,93785,93788],{},[52,93779,93780,93781,93784],{},"C：一致性被称为",[22,93782,93783],{},"原子对象","，任何的读写都应该看起来是“原子”的，或串行的。",[52,93786,93787],{},"A：对任何非失败节点都应该在有限的时间内给出请求的回应。（请求的可终止性）",[52,93789,93790],{},"P：允许节点之间丢失任意多的消息，当网络分区发生时，节点之间的消息可能会完全丢失。",[13,93792,93793],{},[22,93794,93795],{},"（没有一个软件系统同时满足CAP。这里的C指的是强一致性。针对分布式系统而言，一定满足P，即存在网络分区【网络延时】）",[23289,93797],{},[7759,93799,93801],{"id":93800},"二raft算法","二、Raft算法",[13,93803,93804,93805,93808,93809,93812,93813,93815,93816,93819],{},"Raft提供了和Paxos算法相同的功能和性能，但是它的算法结构和Paxos不同。Raft算法更加容易理解并且更容易构建实际的系统。为了提升可理解性，Raft将一致性算法分解成了几个关键模块，例如",[22,93806,93807],{},"领导人选举","【Leader Election】、",[22,93810,93811],{},"日志复制","【Log Replication】和",[22,93814,74779],{},"【Safety】",[22,93817,93818],{},"（三个子问题）","。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。Raft算法还包括一个新的机制来允许集群成员的动态改变，它利用重叠的大多数来保证安全性。",[13,93821,93822,93823,93825,93826,67],{},"Paxos和Raft都是为了实现",[22,93824,31793],{},"目标，两者的区别在于",[22,93827,93828],{},"选举的具体过程不同",[10548,93830,93832],{"id":93831},"raft选举过程","Raft选举过程",[13,93834,93835],{},"在Raft中，任何一个服务器可以扮演下面角色之一：",[49,93837,93838,93841,93844],{},[52,93839,93840],{},"领导者【Leader】：处理所有客户端交互、日志复制等动作，一般一次只有一个领导者。",[52,93842,93843],{},"选民【Follower】：类似选民，完全被动的角色，这样的服务器等待被通知投票。",[52,93845,93846],{},"候选人【Candidate】：候选人就是在选举过程中提名自己的实体，一旦选举成功，则成为领导者。",[13,93848,93849],{},"Raft算法分为两个阶段，首先是选举过程，然后在选举出来的领导人带领进行正常操作，比如日志复制等。",[13,93851,93852],{},"（1）任何一个服务器都可以成为一个候选者，它向其他服务器（选民）发出要求选举自己的请求。",[13,93854,93855],{},[617,93856],{"alt":93857,"src":93858},"candidate发出请求","img\u002F2.1candidate%E5%8F%91%E5%87%BA%E8%AF%B7%E6%B1%82.png",[13,93860,93861],{},"（2）其他服务器同意了，回复OK（同意）指令。",[13,93863,93864],{},[617,93865],{"alt":93866,"src":93867},"follower返回请求","img\u002F2.2follower%E8%BF%94%E5%9B%9E%E8%AF%B7%E6%B1%82.png",[13,93869,93870],{},"（3）这样，这个候选者就成为领导者，它可以向选民们发出要执行具体操作动作的指令，比如日志复制。",[13,93872,93873],{},[617,93874],{"alt":93875,"src":93876},"candidate发出操作指示","img\u002F2.3candidate%E5%8F%91%E5%87%BA%E6%93%8D%E4%BD%9C%E6%8C%87%E7%A4%BA.png",[13,93878,93879],{},"（4）如果一旦这个Leader宕机崩溃了，那么Follower中会有一个成为候选者，发出邀票选举，相当于再次执行（1）~（2）的步骤。",[13,93881,93882],{},[22,93883,93884],{},"总结：（1）~（2）是选举过程，（3）是具体协同执行操作的过程。",[23289,93886],{},[7759,93888,93890],{"id":93889},"三nginx负载均衡策略","三、Nginx负载均衡策略",[10548,93892,93893],{"id":93893},"负载均衡",[13,93895,93896],{},"负载均衡集群：其关键在于使用多台集群服务器共同分担计算任务，把网络请求及计算分配到集群可用服务器上去，从而达到可用性及较好的用户操作体验。",[13,93898,93899],{},"不同用户访问应用，通过负载均衡器分配到不同的节点。",[13,93901,93902],{},[617,93903],{"alt":93904,"src":93905},"负载均衡示意图","img\u002F3.1%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%A4%BA%E6%84%8F%E5%9B%BE.png",[13,93907,93908],{},"负载均衡器有硬件解决方案和软件解决方案。硬件解决方案：F5；软件解决方案：LVS、HAProxy、Nginx等。",[10548,93910,93912],{"id":93911},"nginx下的负载均衡策略","Nginx下的负载均衡策略",[49,93914,93915,93936,93953,93970],{},[52,93916,93917,93920,93921,93924,93925,93927,93928,93931,93932,93935],{},[22,93918,93919],{},"轮询","：即Round Robin，根据Nginx配置文件中的顺序，一次把客户端的Web请求分发到不同的后端服务器。（",[22,93922,93923],{},"每个请求","会按",[22,93926,39464],{},"顺序",[22,93929,93930],{},"逐一","分配到",[22,93933,93934],{},"不同","的后台服务器上。轮询策略适合服务器配置相当，无状态且短平快的服务使用**【依序逐一分发】**）",[52,93937,93938,93941,93942,93945,93946,93949,93950,28447],{},[22,93939,93940],{},"最少连接","：当前谁连接最少，分发给谁。（请求转发给",[22,93943,93944],{},"连接数最少","的后端服务器。前面的轮询策略是把请求",[22,93947,93948],{},"平均","地转发给集群中的每个后台服务器，使得它们的负载大致相同，但是有些请求可能占用的时间会很长，可能导致所在的后端负载过高。这种情况下",[22,93951,93952],{},"选用least conn策略就能达到更好的负载均衡效果。适合在请求处理时间长短不一造成服务器过载的场景。【谁少分给谁】",[52,93954,93955,93958,93959,93962,93963,93966,93967,28447],{},[22,93956,93957],{},"IP地址哈希","：确定",[22,93960,93961],{},"相同IP请求","可以转发给",[22,93964,93965],{},"同一个后端节点","处理，以方便session保持。（按照客户端的IP去分配服务器，使同一个客户端的请求都转发到同一个后台服务器，保证了Session的统一性，",[22,93968,93969],{},"可以用来解决Session的跨域问题。【相同IP可转发】",[52,93971,93972,93975,93976,93979,93980,93983,93984,28447],{},[22,93973,93974],{},"基于权重的负载均衡","：配置Nginx把请求更多地分发到高配置的后端服务器上，把相对较少的请求分发到低配服务器。（在轮询策略的基础上，另外",[22,93977,93978],{},"指定","了",[22,93981,93982],{},"轮询的几率","。权重策略可以与least conn和ip hash结合使用。权重策略比较",[22,93985,93986],{},"适合服务器的硬件配置差别较大的情况【多请求高配置】",[23289,93988],{},[7759,93990,93992],{"id":93991},"四一致性hash算法","四、一致性Hash算法",[13,93994,93995,93996,93999],{},"一致性哈希算法是在1997年由麻省理工学院提出的一种",[22,93997,93998],{},"分布式哈希(DHT)实现算法","。主要解决**单调性( Monotonicity)和分散性（Spread）**的问题。单调性简单描述是哈希的结果应能够保证原有已分配的内容可以被映射到原有缓冲中去，避免在节点增减过程中导致不能命中。",[13,94001,94002],{},"按照常用的hash算法来将对应的key哈希到一个具有2^32 次方个桶的空间中，即0~( 2^32) -1的数字空间中。现在我们可以将这些数字头尾相连，想象成一个闭合的环形。",[13,94004,94005],{},[617,94006],{"alt":94007,"src":94008},"圆形空间对应哈希","img\u002F4.1%E5%9C%86%E5%BD%A2%E7%A9%BA%E9%97%B4%E5%AF%B9%E5%BA%94%E5%93%88%E5%B8%8C.png",[13,94010,94011],{},"在一致性哈希算法中，如果一台服务器不可用，则受影响的数据仅仅是此服务器到其环空间中前一台服务器（即沿着逆时针方向行走遇到的第一台服务器）之间数据，其他不会受到影响。",[13,94013,94014],{},[617,94015],{"alt":94016,"src":94017},"一致性哈希示意","img\u002F4.2%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C%E7%A4%BA%E6%84%8F.png",[13,94019,94020,94021,94023,94024,94027,94028,94031],{},"一致性哈希的",[22,94022,20689],{},"在于",[18038,94025,94026],{},"可以任意动态添加、删除节点，每次添加、删除一个节点仅影响一致性哈希环上相邻的节点","。为了尽可能均匀地分布节点和数据，一种常见的改进算法是引入虚节点的概念，系统会创建许多",[22,94029,94030],{},"虚拟节点","，个数远大于当前节点的个数，均匀分布到一致性哈希值域环上。这种增强型方案主要解决平衡性问题，所谓平衡性（Balance）是指哈希的结果能够尽可能分布到所有的缓冲中去，这样可以使得所有的缓冲空间都得到利用。",[10548,94033,94034],{"id":94034},"具体实现流程",[13,94036,94037],{},"一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环。如假设某哈希函数H的值空间为0-2^32-1（即哈希值是一个32位无符号整型），整个哈希环如下图。（整个空间按顺时针方向组织，圆环的正上方的点代表0，0点右侧的第一个点代表1，以此类推，2、3、4、5、6……直到2^32-1。也就是说0点左侧的第一个点代表2^32-1，0和2^32-1在零点中方向重合，我们把这个由2^32-1个点组成的圆环称为Hash环）",[13,94039,94040],{},[617,94041],{"alt":94042,"src":94043},"哈希环","img\u002F4.3%E5%93%88%E5%B8%8C%E7%8E%AF.png",[49,94045,94046],{},[52,94047,94048],{},"服务器Hash到Hash环",[13,94050,94051,94052,67],{},"Node A，B，C，D四台机器，利用其IP地址进行hash",[22,94053,94054],{},"取模",[13,94056,94057],{},[617,94058],{"alt":94059,"src":94060},"哈希取模","img\u002F4.4%E5%93%88%E5%B8%8C%E5%8F%96%E6%A8%A1.png",[49,94062,94063],{},[52,94064,94065],{},"数据Key到Hash环",[13,94067,94068],{},"将数据key使用相同的函数Hash计算出哈希值，并确定此数据在环上的位置，从此位置沿环顺时针 “行走”，第⼀台遇到的服务器就是其应该定位到的服务器。",[13,94070,94071],{},[617,94072],{"alt":94073,"src":94074},"哈希计算","img\u002F4.5%E5%93%88%E5%B8%8C%E8%AE%A1%E7%AE%97.png",[10548,94076,94078],{"id":94077},"一致性hash算法的容错性和可扩展性","一致性Hash算法的容错性和可扩展性",[49,94080,94081],{},[52,94082,94083],{},"Node C宕机",[13,94085,94086],{},"![Node C宕机](img\u002F4.6Node C宕机.png)",[49,94088,94089],{},[52,94090,94091],{},"增加一台机器Node X",[13,94093,94094],{},"![Node X](img\u002F4.7Node X.png)",[13,94096,94097],{},"因此，一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据，具有较好的容错性和可扩展性。",[10548,94099,94101],{"id":94100},"hash环的数据倾斜问题","Hash环的数据倾斜问题",[13,94103,94104,94105,94108],{},"一致性Hash算法在服务节点太少时，容易因为",[22,94106,94107],{},"节点分布不均匀而造成数据倾斜","（被缓存的对象大部分集中缓存在某一台服务器上）问题，例如系统中只有两台服务器。",[13,94110,94111],{},[617,94112],{"alt":94113,"src":94114},"数据倾斜","img\u002F4.8%E6%95%B0%E6%8D%AE%E5%80%BE%E6%96%9C.png",[13,94116,94117],{},"具体做法可以在服务器IP或主机名的后面增加编号来实现。",[13,94119,94120,94121,94123],{},"为每台服务器计算三个",[22,94122,94030],{},"，于是可以分别计算“Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值，于是形成六个虚拟节点。",[13,94125,94126],{},[617,94127],{"alt":94128,"src":94129},"数据倾斜2","img\u002F4.9%E6%95%B0%E6%8D%AE%E5%80%BE%E6%96%9C2.png",[13,94131,94132],{},"这样就解决了服务节点少时数据倾斜的问题。在实际应用中，通常将虚拟节点的数设置为32甚至更大，因此即使很少的服务节点也能做到相对均匀的数据分布。",[23289,94134],{},[7759,94136,94138],{"id":94137},"五全局id生成算法","五、全局ID生成算法 【*】",[13,94140,94141,94142,94145],{},"目前TDDL（Taobao Distribute Data Layer）提供的id生成主要还是",[22,94143,94144],{},"依托数据库","来进行的，Oracle可以直接使用sequence来完成id生成，MySQL则需要DBA建立一个表专门用于生成id。",[13,94147,94148,94149,67],{},"在分布式环境下，数据库是可以拆分（sharding）的，一张表的自增机制（比如MySQL）只能保证该表唯一，在数据合并到历史库，迁移或者查询，如果",[22,94150,94151],{},"出现id冲突无异于噩梦",[13,94153,94154],{},"另外，由于数据库访问时高成本操作，也要避免每次INSERT都要到id生成器做DB层面的查询。",[10548,94156,94158],{"id":94157},"_1uuid","1、UUID",[13,94160,94161],{},"UUID由以下几部分构成：",[49,94163,94164,94167,94170],{},[52,94165,94166],{},"当前日期和时间，UUID的第一个部分与时间有关，如果你在生成一个UUID之后，过几秒又生成一个UUID，则第一个部分不同，其余相同。",[52,94168,94169],{},"时钟序列。",[52,94171,94172],{},"全局唯一的IEEE机器识别码，如果有网卡，从网卡MAC地址获得，没有网卡以其他方式获得。",[13,94174,94175],{},"**优点：**API简单、易用",[13,94177,94178],{},"**缺点：**占用空间大、字符串本身无法加工，可读性不强。",[10548,94180,94182],{"id":94181},"_2id生成表模式","2、ID生成表模式",[13,94184,94185],{},"使用id生成表，比较经典的是Flicker的案例，Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制。先创建单独的数据库，然后创建一个表：",[13,94187,94188],{},[617,94189],{"alt":94190,"src":94191},"创建表","img\u002F5.1%E5%88%9B%E5%BB%BA%E8%A1%A8.png",[13,94193,94194],{},"在我们的应用端需要做下面这两个操作，在一个事务会话里提交：",[13,94196,94197],{},[617,94198],{"alt":94199,"src":94200},"提交事务","img\u002F5.2%E6%8F%90%E4%BA%A4%E4%BA%8B%E5%8A%A1.png",[13,94202,94203],{},"这样就能拿到不断增长且不重复的ID了。从高可用角度考虑，要解决单点故障问题，Flicker的方案是启用两台数据库服务器来生成ID，通过区分auto_increment的起始值和步长来生成奇偶数的ID。",[13,94205,94206],{},"**优点：**简单易用，也有一定的高可用方案。",[13,94208,94209],{},"**缺点：**使用了mysql数据库的独特语法REPLACE INTO。",[10548,94211,94213],{"id":94212},"_3snowflake","3、Snowflake",[13,94215,94216,94217,8661],{},"Twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制，于是自己开发了一套全局唯一ID生成服务：Snowflake。GitHub地址：",[5009,94218,94221],{"href":94219,"rel":94220},"https:\u002F\u002Fgithub.com\u002Ftwitter\u002Fsnowflake%E3%80%82%E6%A0%B9%E6%8D%AEtwitter%E7%9A%84%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%EF%BC%8Csnowflake%E7%B3%BB%E7%BB%9F%E7%94%9F%E6%88%9064%E4%BD%8D%E7%9A%84ID%E3%80%82%E7%94%B13%E9%83%A8%E5%88%86%E7%BB%84%E6%88%90",[23647],"https:\u002F\u002Fgithub.com\u002Ftwitter\u002Fsnowflake。根据twitter的业务需求，snowflake系统生成64位的ID。由3部分组成",[49,94223,94224,94227,94230],{},[52,94225,94226],{},"41位的时间序列（精确到毫秒，41位的长度可以使用69年）；",[52,94228,94229],{},"10位的机器标识（10位的长度最多支持部署1024个节点）；",[52,94231,94232],{},"12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)。",[13,94234,94235],{},"**优点：**高性能，低延迟；独立的应用；按时间有序。",[13,94237,94238],{},"**缺点：**需要独立的开发和部署。",[10548,94240,94242],{"id":94241},"_4结合缓存方案","4、结合缓存方案",[13,94244,94245],{},"可以采取ID生成表模式成批获取id比如1000放到本地缓存（Local cache），这样在client使用的时候可进一步提升性能。",[13,94247,94248],{},[617,94249],{"alt":94250,"src":94251},"批量获取ID示意图","img\u002F5.3%E6%89%B9%E9%87%8F%E8%8E%B7%E5%8F%96ID%E7%A4%BA%E6%84%8F%E5%9B%BE.png",[13,94253,94254],{},"**优点：**高性能，低延迟。",[13,94256,94257],{},"**缺点：**ID不连贯。",[23289,94259],{},[7759,94261,94263],{"id":94262},"六设计一个缓存框架参考课本或者课件都可以","六、设计一个缓存框架（参考课本或者课件都可以）",[13,94265,94266],{},"参考开源缓存组件EhCache和Guava，提取它们的公共方法，可以得到最核心的，也是我们最关心的一些方法：",[13,94268,94269],{},[617,94270],{"alt":94271,"src":94272},"简单缓存的常用方法","img\u002F6.1%E7%AE%80%E5%8D%95%E7%BC%93%E5%AD%98%E7%9A%84%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95.png",[13,94274,94275],{},"可以知道缓存框架需要基本的get（获取缓存）、put（放入缓存）、remove（根据key值删除缓存）、clear（清空缓存）方法。",[10548,94277,94279],{"id":94278},"_1缓存架构介绍","1、缓存架构介绍",[13,94281,94282],{},"通过JSR107规范，我们将框架定义为客户端层、缓存提供层、缓存管理层、缓存存储层。其中缓存存储层又分为基本存储层、LRU存储层和Weak存储层。",[13,94284,94285],{},[617,94286],{"alt":94287,"src":94288},"缓存分层图","img\u002F6.2%E7%BC%93%E5%AD%98%E5%88%86%E5%B1%82%E5%9B%BE.png",[49,94290,94291,94297,94303,94309,94315,94321,94327],{},[52,94292,94293,94296],{},[22,94294,94295],{},"客户端层","：使用者直接通过该层与数据进行交互。",[52,94298,94299,94302],{},[22,94300,94301],{},"缓存提供层","：主要对缓存管理层的生命周期进行维护，负责缓存管理层的创建、保存、获取以及销毁。",[52,94304,94305,94308],{},[22,94306,94307],{},"缓存管理层","：主要对缓存客户端的生命周期进行维护，负责缓存客户端的创建、保存、获取以及销毁。",[52,94310,94311,94314],{},[22,94312,94313],{},"缓存存储层","：负责数据以什么样的形式进行存储。",[52,94316,94317,94320],{},[22,94318,94319],{},"基本存储层","：是以普通的ConcurrentHashMap为存储核心，数据不淘汰。",[52,94322,94323,94326],{},[22,94324,94325],{},"LRU存储层","：是以最近最少用为原则进行的数据存储和缓存淘汰机制。",[52,94328,94329,94332],{},[22,94330,94331],{},"Weak存储层","：是以弱引用原则的数据存储和缓存淘汰机制。",[10548,94334,94336],{"id":94335},"_2设计思路及知识点详解","2、设计思路及知识点详解",[49,94338,94339],{},[52,94340,94341],{},[22,94342,94343],{},"设计类图",[13,94345,94346],{},[617,94347],{"alt":94348,"src":94349},"类图","img\u002F6.3%E7%B1%BB%E5%9B%BE.png",[13,94351,94352],{},"根据规范，CacheProvider、CacheManager、Cache是抽象出来的最基础的缓存接口。其中 Cache是提供最终缓存实现的基础接口，其实现类是CsCache107，初始化时即持有一个BasicDataStore对象。",[49,94354,94355],{},[52,94356,94357],{},[22,94358,94359],{},"缓存框架的SPI机制",[13,94361,94362],{},"在工程结构中的META-INF\u002Fservices\u002F下面有一个javax.cache.spi.CachingProvider配置文件，里面有一个org.cachestudy.writeitbyself.jsr107.CsCaching107Provider实现类，这个配置文件实际上是利用的Java SPI机制进行组件的发现与加载。",[13,94364,94365],{},[617,94366],{"alt":94367,"src":94368},"SPI约定结构图","img\u002F6.4SPI%E7%BA%A6%E5%AE%9A%E7%BB%93%E6%9E%84%E5%9B%BE.png",[13,94370,94371,94372,94375,94376,94379],{},"SPI的全名为",[22,94373,94374],{},"Service Provider Interface","，是JDK内置的一种",[22,94377,94378],{},"服务提供发现机制","，在Java.util.ServiceLoader的文档里有比较详细的介绍。",[13,94381,94382,94383,94386],{},"Java SPI机制的思想简单来说是:在面向的对象的设计里，我们一般推荐模块之间基于接口编程，模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类，就违反了可拔插的原则，如果需要替换一种实现，就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明，这就需要一种服务发现机制。Java SPI就是提供了这样的一个机制，为某个接口寻找服务实现的机制。有点类似IoC的思想，就是",[22,94384,94385],{},"将装配的控制权移到程序之外","，在模块化设计中这个机制尤其重要。",[49,94388,94389],{},[52,94390,94391],{},[22,94392,94393],{},"解读缓存数据层（淘汰算法）",[13,94395,94396],{},"缓存数据层实际承担的责任主要是缓存数据的存储和缓存的淘汰机制，数据的存储和淘汰是基于DataStore这个接口来实现的，而这一实现则是数据存储层。目前框架一共实现了三个实现类分别是:LRUDataStore、WeakDataStore和 BaseDataStore。",[13,94398,94399],{},[22,94400,94401],{},"（1）基于引用的淘汰算法",[13,94403,94404],{},"基于引用的淘汰算法，是一种简单有效的算法，由JVM的GC进行回收。Java的引用主要分为强引用、软引用、弱引用、虚引用。",[13,94406,94407],{},"**强引用（StrongReference）：强引用是使用最普遍的引用。**如果一个对象具有强引用，那垃圾回收器绝不会回收它。当内存空间不足，Java 虚拟机宁愿抛出OutOfMemoryError错误，使程序异常终止，也不会靠随意回收具有强引用的对象来解决内存不足的问题。",[13,94409,94410],{},"**软引用（SoftReference）：如果一个对象只具有软引用，则内存空间足够，垃圾回收器就不会回收它；如果内存空间不足了，就会回收这些对象的内存。**只要垃圾回收器没有回收它，该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列（ReferenceQueue）联合使用，如果软引用所引用的对象被垃圾回收器回收，Java 虚拟机就会把这个软引用加入到与之关联的引用队列中。",[13,94412,94413],{},"**弱引用（WeakReference）：弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。**在垃圾回收器线程扫描它所管辖的内存区域的过程中，一旦发现了只具有弱引用的对象，不管当前内存空间足够与否，都会回收它的内存。不过，由于垃圾回收器是一个优先级很低的线程，因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用，如果弱引用所引用的对象被垃圾回收，Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。",[13,94415,94416],{},"**虚引用（PhantomReference）：“虚引用”顾名思义，就是形同虚设，与其他几种引用都不同，虚引用并不会决定对象的生命周期。**如果一个对象仅持有虚引用，那么它就和没有任何引用一样，在任何时候都可能被垃圾回收器回收。",[13,94418,94419],{},[22,94420,94421],{},"（2）基于LRU的淘汰算法",[13,94423,94424,94427],{},[22,94425,94426],{},"LRU （Least recently used，最近最少使用）算法根据数据的历史访问记录来进行淘汰数据","，其核心思想是“如果数据最近被访问过，那么将来被访问的概率也更高”。",[13,94429,94430],{},"缓存框架的LRU简单实现逻辑如下：我们通过维护entry的列表，在get、put时维护entry列表实现，使最少访问的键值对维持在entry列表的最尾部。在数据量超过缓存容量需要做LRU淘汰时，我们通过删除链表尾部的数据，来实现简单的LRU数据淘汰机制。",[49,94432,94433],{},[52,94434,94435],{},[22,94436,94437],{},"解读缓存管理层（CacheManager）",[13,94439,94440,94441,67],{},"接口类CacheManager所对应的正式缓存管理层，在缓存框架中CacheManager的实现类，主要负责",[22,94442,94443],{},"管理多个Cache客户端实例，以及负责缓存客户端实例的创建、销毁、获取等",[13,94445,94446],{},"缓存实例的创建和获取实际上主要是基于一个缓存池来实现的，在代码中使用的是一个ConcurrentHashMap类，可以根据多个不同的缓存名称创建多个缓存实例，从而可以并发的读取。",[49,94448,94449],{},[52,94450,94451],{},[22,94452,94453],{},"解读数据客户端层",[13,94455,94456,94457,94460],{},"缓存客户端层主要是针对实际使用者的，在工程结构中主要涉及两个类，其中一个使",[22,94458,94459],{},"用代理模式对缓存框架进行的包装","。用户在使用的时候，通过缓存管理层的CacheManager对象就可以获得其客户端对象，从而可以实现对缓存的直接操作。",[13,94462,94463],{},"整个过程其实较为简单，对象的构造方法中有一个DataStore对象，这个对象正是缓存数据存储与淘汰策略对象，这个机制已经在解读缓存数据层小节中进行了详解，get方法则是从 DataStore中获取缓存数据，put方法则是往DataStore对象中存入数据。",[10548,94465,94466],{"id":94466},"简述",[13,94468,94469,94470,94473],{},"一定一定要去看书本",[22,94471,94472],{},"P62-P75","的缓存框架的实现，虽然上述的内容都是截取自书本内容，但是省略掉了很多容易，导致阅读障碍。看书上的实例能让你对整个流程有一个大概的认知，在看上面的就是节选出来的重点了。",[13,94475,94476,94477,94482],{},"也可以直接看《",[5009,94478,94481],{"href":94479,"rel":94480},"https:\u002F\u002Fblog.51cto.com\u002Fu_15057858\u002F2691862",[23647],"手把手教你从0到1写一个简单的缓存框架","》，这个和书本上是一样的。",[23289,94484],{},[7759,94486,94488],{"id":94487},"七缓存击穿穿透雪崩现象及解决办法","七、缓存击穿、穿透、雪崩现象及解决办法",[10548,94490,94492],{"id":94491},"_1缓存击穿","1、缓存击穿",[49,94494,94495,94504],{},[52,94496,94497,94498,52816,94501,67],{},"缓存里",[22,94499,94500],{},"没有Key",[22,94502,94503],{},"数据库里有数据",[52,94505,94506,94507,94510],{},"某一个Key失效，通常是热点数据，导致",[22,94508,94509],{},"高并发","情况下，请求直接打到DB上，DB直接崩掉。",[13,94512,94513],{},[617,94514],{"alt":94515,"src":94516},"缓存击穿","img\u002F7.1%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF.png",[13,94518,94519],{},[22,94520,94521],{},"（大量的Key同时失效就会导致缓存雪崩）",[10548,94523,94525],{"id":94524},"_2缓存击穿的解决办法","2、缓存击穿的解决办法",[13,94527,94528,94529,94532,94533,94536,94537,67],{},"在",[22,94530,94531],{},"第一个查询数据","的请求上使用一个",[22,94534,94535],{},"互斥锁","来锁住它。其他的线程走到这一步拿不到锁就等着，等第一个线程查询到了数据，然后做缓存。后面的线程近来发现",[22,94538,94539],{},"已经有缓存了，就直接走缓存",[49,94541,94542],{},[52,94543,94544],{},"引申：Redis的分布式锁和redission框架。",[10548,94546,94548],{"id":94547},"_3缓存穿透","3、缓存穿透",[49,94550,94551,94554],{},[52,94552,94553],{},"缓存里没有数据，数据库里面也没有数据。",[52,94555,94556,94557,94560],{},"大量不存在的id去查询数据，会产生",[22,94558,94559],{},"大量的请求","到数据库去查询，可能会导致DB由于压力过大而宕机。",[13,94562,94563],{},[617,94564],{"alt":94565,"src":94566},"缓存穿透","img\u002F7.2%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F.png",[10548,94568,94570],{"id":94569},"_4缓存穿透的解决办法","4、缓存穿透的解决办法",[49,94572,94573,94582],{},[52,94574,94575,94578,94579],{},[22,94576,94577],{},"对空值缓存","：如果一个查询返回的数据为空（不管数据是否存在），我们仍然把这个空结果（null）进行缓存，设置空结果的过期时间会很短，最长不超过五分钟。",[22,94580,94581],{},"（保留但及时释放）",[52,94583,94584,94587],{},[22,94585,94586],{},"BloomFilter（布隆过滤器）","：在缓存之前再加一层BloomFilter，在查询的时候先去BloomFilter去查询Key是否存在，如果不存在就直接返回，存在再走缓存去查DB。",[13,94589,94590],{},[617,94591],{"alt":94592,"src":94593},"缓存穿透解决办法","img\u002F7.3%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95.png",[10548,94595,94597],{"id":94596},"_5缓存雪崩","5、缓存雪崩",[49,94599,94600,94617],{},[52,94601,94602,94605,94606,94609,94610,94613,94614,67],{},[22,94603,94604],{},"Key对应的数据存在","，但在redis中",[22,94607,94608],{},"过期","，此时若有",[22,94611,94612],{},"大量并发请求","过来，这些请求发现缓存过期一般都会从DB加载数据并回设到缓存，这个时候大并发的请求可能会",[22,94615,94616],{},"瞬间把后端DB压垮",[52,94618,94619],{},"缓存雪崩与缓存击穿的区别在于这里针对很多Key缓存，后者则是某一个Key。",[13,94621,94622],{},[617,94623],{"alt":94624,"src":94625},"正常访问","img\u002F7.4%E6%AD%A3%E5%B8%B8%E8%AE%BF%E9%97%AE.png",[13,94627,94628],{},[617,94629],{"alt":94630,"src":94631},"缓存失效瞬间","img\u002F7.5%E7%BC%93%E5%AD%98%E5%A4%B1%E6%95%88%E7%9E%AC%E9%97%B4.png",[10548,94633,94635],{"id":94634},"_6缓存雪崩的解决办法","6、缓存雪崩的解决办法",[49,94637,94638,94644,94650],{},[52,94639,94640,94643],{},[22,94641,94642],{},"构建多级缓存架构","：Nginx缓存 + Redis缓存 + 其他缓存（Encache等）",[52,94645,94646,94649],{},[22,94647,94648],{},"将缓存失效时间分散开","：比如我们可以在原有的失效时间基础上增加一个随机值，比如1~5分钟随机，这样每一个缓存的过期时间的重复率就会降低，就很难引发集体失效的事件。",[52,94651,94652,94654,94655],{},[22,94653,94535],{},"：\n",[49,94656,94657,94660],{},[52,94658,94659],{},"在第一个请求去查询数据库的时候对它加一个互斥锁，其余的查询请求都会被阻塞住，直到锁被释放，从而保护数据库。",[52,94661,94662,94665],{},[22,94663,94664],{},"降低吞吐量","，应用时要慎重。",[23289,94667],{},[7759,94669,94671],{"id":94670},"八ehcache的注解","八、Ehcache的注解【*】",[13,94673,94674],{},"Ehcache是一个用Java实现的简单、高速、线程安全的缓存管理类库，其提供了用内存、磁盘文件存储，以及分布式存储等多种灵活的管理方案。Ehcache具有快速、简单、低消耗、依赖性小、扩展性强、支持对象或序列化缓存或元素的失效、提供LRU\u002FLFU\u002FFIFO缓存策略、支持内存缓存及磁盘缓存、采用分布式缓存机制等特点。",[13,94676,94677],{},[617,94678],{"alt":94679,"src":94680},"Ehcache架构图","img\u002F8.1Ehcache%E6%9E%B6%E6%9E%84%E5%9B%BE.png",[10548,94682,94684],{"id":94683},"ehcache主要特点","Ehcache主要特点",[49,94686,94687,94690,94693,94696,94699,94702,94713],{},[52,94688,94689],{},"快速，简单。",[52,94691,94692],{},"多种缓存策略。",[52,94694,94695],{},"缓存数据有两级，",[52,94697,94698],{},"缓存数据会在虚拟机重启的过程中写入磁盘。",[52,94700,94701],{},"可以通过RMI、可插入API等方式进行分布式缓存。",[52,94703,94704,94705],{},"具有缓存和缓存管理器的侦听接口。\n",[49,94706,94707,94710],{},[52,94708,94709],{},"缓存管理器监听器。",[52,94711,94712],{},"缓存事件监听器。",[52,94714,94715],{},"提供Hibernate的缓存实现。",[10548,94717,94719],{"id":94718},"spring中ehcache缓存注解","Spring中Ehcache缓存注解",[49,94721,94722,94725],{},[52,94723,94724],{},"开启注解：\u003Ccache:annotation-driven cache-manager=\"cacheManager\"\u002F>",[52,94726,94727],{},"使用标记注解：通过对一个类进行注解修饰的方式在这个类中使用缓存注解。",[13,94729,94730],{},"部分注解用法：",[49,94732,94733],{},[52,94734,94735,94738,94739,94741],{},[22,94736,94737],{},"@Cacheable","  表明所修饰的方法是可以缓存的：当第一次调用这个方法时，它的结果会被缓存下来，在缓存的有效时间内，以后访问这个方法都直接返回缓存结果，不再执行方法中的代码段。",[2996,94740],{},"这个注解可以用condition属性来设置条件，如果不满足条件，就不使用缓存能力，直接执行方法。 可以使用key属性来指定 key 的生成规则。",[13,94743,94744],{},[617,94745],{"alt":94746,"src":94747},"Cacheable属性表","img\u002F8.2Cacheable%E5%B1%9E%E6%80%A7%E8%A1%A8.png",[49,94749,94750],{},[52,94751,94752,94755],{},[22,94753,94754],{},"@CachePut","  与@Cacheable不同，@CachePut不仅会缓存方法的结果，还会执行方法的代码段。 它支持的属性和用法都与@Cacheable一致。",[13,94757,94758],{},[617,94759],{"alt":94760,"src":94761},"CachePut属性表","img\u002F8.3CachePut%E5%B1%9E%E6%80%A7%E8%A1%A8.png",[49,94763,94764],{},[52,94765,94766,94769],{},[22,94767,94768],{},"@CacheEvict","  与@Cacheable功能相反，@CacheEvict表明所修饰的方法是用来删除失效或无用的缓存数据。",[13,94771,94772],{},[617,94773],{"alt":94774,"src":94775},"CachEvict属性表","img\u002F8.4CachEvict%E5%B1%9E%E6%80%A7%E8%A1%A8.png",[49,94777,94778,94784],{},[52,94779,94780,94783],{},[22,94781,94782],{},"@Caching"," 如果需要使用同一个缓存注解（@Cacheable、@CacheEvict或@CachePut）多次修饰一个方法，就需要用到@Caching。",[52,94785,94786,94789],{},[22,94787,94788],{},"@CacheConfig"," 与前面的缓存注解不同，这是一个类级别的注解。 如果类的所有操作都是缓存操作，你可以使用@CacheConfig来指定类，省去一些配置。",[23289,94791],{},[7759,94793,94795],{"id":94794},"九memcached的内存管理机制","九、Memcached的内存管理机制【*】",[13,94797,94798,94799,94802,94803,94806,94807,67],{},"Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、Twitter、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要手段。随着数据量的增大、访问的集中，就会造成RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。",[22,94800,94801],{},"减轻数据库压力，避免大量访问穿透到数据库","是Memcached主要的用武之地。Memcached是",[22,94804,94805],{},"高性能的分布式缓存服务器","。一般使用目的是，",[22,94808,94809],{},"通过缓存数据库查询结果，减少数据库访问次数，以提高动态Web应用的速度，提高可扩展性",[10548,94811,94813],{"id":94812},"_1memcached使用场景","1、Memcached使用场景",[13,94815,94816],{},"Memcached主要应用在减少数据库压力的场景，第一次访问，缓存数据未命中，则从数据库中获取数据并存储到Memcached中，第二次访问则直接从缓存中获取数据。",[13,94818,94819],{},[617,94820],{"alt":94821,"src":94822},"查询链路图","img\u002F9.1%E6%9F%A5%E8%AF%A2%E9%93%BE%E8%B7%AF%E5%9B%BE.png",[13,94824,94825],{},"更新链路，应用服务器对key进行更新，先对DB进行更新后，再对缓存进行更新。",[13,94827,94828],{},[617,94829],{"alt":94830,"src":94831},"更新链路图","img\u002F9.2%E6%9B%B4%E6%96%B0%E9%93%BE%E8%B7%AF%E5%9B%BE.png",[10548,94833,94835],{"id":94834},"_2memcached特征","2、Memcached特征",[49,94837,94838,94844,94850,94856],{},[52,94839,94840,94843],{},[22,94841,94842],{},"协议简单","：Memcached和客户端通信并不使用复杂的XML等格式，而是使用简单的基于文本协议或者二进制协议。",[52,94845,94846,94849],{},[22,94847,94848],{},"基于libevent的事件处理","：由于epoll，kqueue，\u002Fdev\u002Fpoll每个接口都有自己的特点，程序移植非常困难，libevent这个程序库就应运而生了。他将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。Memcached使用libevent库，因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。",[52,94851,94852,94855],{},[22,94853,94854],{},"内置内存存储方式","：为了提高性能，Memcached中保存的数据都存储在Memcached内置的内存存储空间中。由于数据仅存在于内存中，因此重启Memcached或者重启操作系统会导致全部数据消失。另外，内存容量达到指定的值之后，Memcached会自动删除不使用的内存。缓存数据的回收采用的是LRU ( Least Recently Used)算法。",[52,94857,94858,94861],{},[22,94859,94860],{},"Memcached客户端分布式","：Memcached尽管是“分布式”缓存服务器，但服务器端并没有分布式功能。各个Memcached实例不会互相通信以共享信息。它的分布式主要是通过客户端实现的。",[13,94863,94864],{},[617,94865],{"alt":94866,"src":94867},"Memcached基本结构图","img\u002F9.3Memcached%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84%E5%9B%BE.png",[10548,94869,94871],{"id":94870},"_3memcached的一些问题","3、Memcached的一些问题",[49,94873,94874,94880,94886,94892],{},[52,94875,94876,94879],{},[22,94877,94878],{},"无法备份，重启无法恢复","：重启无法恢复的问题，只能通过持久化解决。兼容Memcached的协议，持久化的解决方案有MemcacheDB，以及Tokyo Cabinet和Tokyo Tyrant配合使用。Tokyo Cabinet是一个DBM数据库，而Tokyo Tyrant是兼容Memcached协议的网络协议。",[52,94881,94882,94885],{},[22,94883,94884],{},"无法查询","：前面谈过Memcached 的存储机制，不能按各种条件的key查询，比如范围查询。",[52,94887,94888,94891],{},[22,94889,94890],{},"没有提供内置的安全机制","：当然你可以找到一些解决方案。",[52,94893,94894,94897],{},[22,94895,94896],{},"单点故障failover","：Memcached不支持任何fail-over\u002Fhigh-availability机制，因为它是作为cache使用的，不是原始数据源，这也是其一大特点。面对单点故障，可以通过主从模式解决问题。",[13,94899,94900],{},[617,94901],{"alt":94902,"src":94903},"主从缓存结构","img\u002F9.4%E4%B8%BB%E4%BB%8E%E7%BC%93%E5%AD%98%E7%BB%93%E6%9E%84.png",[10548,94905,94907],{"id":94906},"_4memcache机制","4、Memcache机制",[49,94909,94910,94918,94932,94954],{},[52,94911,94912,94913],{},"守护进程机制\n",[49,94914,94915],{},[52,94916,94917],{},"UNIX daemon",[52,94919,94920,94921],{},"Socket事件处理机制\n",[49,94922,94923,94926,94929],{},[52,94924,94925],{},"non-blocked：非阻塞",[52,94927,94928],{},"libevent：异步事件处理",[52,94930,94931],{},"epoll\u002Fkqueue",[52,94933,94934,94937],{},[22,94935,94936],{},"内存管理机制",[49,94938,94939,94944,94949],{},[52,94940,94941],{},[22,94942,94943],{},"Slab：内存分配机制",[52,94945,94946],{},[22,94947,94948],{},"LRU：对象清楚机制",[52,94950,94951],{},[22,94952,94953],{},"Hash机制：快速检索item",[52,94955,94956,94957],{},"多线程处理机制：pthread（POSIX）线程模式\n",[49,94958,94959,94962,94965],{},[52,94960,94961],{},"编译时开启：.\u002Fconfigure -enable-threads",[52,94963,94964],{},"目前还比较粗糙，锁机制locking不够完善",[52,94966,94967],{},"负载过重时，可以开启（-t线程数为CPU核数）",[10548,94969,94971],{"id":94970},"_5memcache内存管理机制","5、Memcache内存管理机制",[49,94973,94974,94988,94999],{},[52,94975,94976,94977],{},"Slab内存处理机制\n",[49,94978,94979,94982,94985],{},[52,94980,94981],{},"提前分配内存slab 1MB，再进行小对象填充chunk（不同大小的块）",[52,94983,94984],{},"避免大量重复的初始化和清理**（减轻内存管理器负担）**",[52,94986,94987],{},"避免频繁malloc\u002Ffree**（系统碎片）**",[52,94989,94990,94991],{},"懒惰检测机制\n",[49,94992,94993,94996],{},[52,94994,94995],{},"不检测item对象是否超时",[52,94997,94998],{},"get时检查item对象是否应该删除",[52,95000,95001,95002],{},"懒惰删除机制\n",[49,95003,95004],{},[52,95005,95006],{},"删除item对象时，不释放内存，做删除标记，指针放入slot回收插槽，下次分配的时候直接使用",[13,95008,95009],{},[22,95010,95011],{},"（东西只有这么点，但是如果需要详细了解过程的话建议去看下Slab的具体工作流程【PPT第6章 缓存鼻祖Memcached】以及Slab Allocation机制、Item【书本P102-P106】）",[23289,95013],{},[7759,95015,95017],{"id":95016},"十关系型数据库和非关系型数据库的优缺点分析","十、关系型数据库和非关系型数据库的优缺点分析",[10548,95019,95021],{"id":95020},"_1关系型数据库和非关系型数据库的比较","1、关系型数据库和非关系型数据库的比较",[8366,95023,95024,95040],{},[8369,95025,95026],{},[8372,95027,95028,95031,95034,95037],{},[8375,95029,95030],{"align":9247},"比较标准",[8375,95032,95033],{"align":9247},"RDBMS",[8375,95035,95036],{"align":9247},"NoSQL",[8375,95038,95039],{},"备注",[8386,95041,95042,95061,95082,95104,95128,95148,95168,95185,95201,95224,95239],{},[8372,95043,95044,95047,95050,95053],{},[8391,95045,95046],{"align":9247},"数据库原理",[8391,95048,95049],{"align":9247},"完全支持",[8391,95051,95052],{"align":9247},"部分支持",[8391,95054,95033,95055,27386,95058,95060],{},[22,95056,95057],{},"有关系代数理论作为基础",[2996,95059],{},"NoSQL没有统一的理论基础",[8372,95062,95063,95066,95069,95072],{},[8391,95064,95065],{"align":9247},"数据规模",[8391,95067,95068],{"align":9247},"大",[8391,95070,95071],{"align":9247},"超大",[8391,95073,95074,95075,95078,95079,95081],{},"RDBMS很难实现横向",[22,95076,95077],{},"扩展","，纵向扩展的空间也比较有限，性能会随着数据规模的增大而降低；",[2996,95080],{},"NoSQL可以很容易通过添加更多设备来支持更大规模的数据",[8372,95083,95084,95086,95089,95092],{},[8391,95085,64327],{"align":9247},[8391,95087,95088],{"align":9247},"固定",[8391,95090,95091],{"align":9247},"灵活",[8391,95093,95094,95095,95097,95098,27386,95101,95103],{},"RDBMS需要定义",[22,95096,64327],{},"，严格",[22,95099,95100],{},"遵守数据定义和相关约束条件",[2996,95102],{},"NoSQL不存在数据库模式，可以自由灵活定义并存储各种不同类型的数据",[8372,95105,95106,95109,95111,95114],{},[8391,95107,95108],{"align":9247},"查询效率",[8391,95110,14476],{"align":9247},[8391,95112,95113],{"align":9247},"可以实现高效的简单查询，但是不具备高度结构化查询等特性，复杂查询的性能不尽人意",[8391,95115,95116,95117,95120,95121,95123,95124,95127],{},"RDBMS借助于",[22,95118,95119],{},"索引机制","可以实现快速查询（包括记录查询和范围查询）；",[2996,95122],{},"很多NoSQL数据库没有面向复杂查询的索引，虽然NoSQL可以使用MapReduce来加速查询，但是，在",[22,95125,95126],{},"复杂查询","方面的性能仍然不如RDBMS",[8372,95129,95130,95132,95135,95138],{},[8391,95131,31793],{"align":9247},[8391,95133,95134],{"align":9247},"强一致性",[8391,95136,95137],{"align":9247},"弱一致性",[8391,95139,95140,95141,95143,95144,95147],{},"RDBMS严格遵守事务ACID模型，可以保证事务强一致性；",[2996,95142],{},"很多NoSQL数据库放松了对事务ACID四性的要求，而是",[22,95145,95146],{},"遵守BASE模型","，只能保证最终一致性",[8372,95149,95150,95153,95156,95159],{},[8391,95151,95152],{"align":9247},"数据完整性",[8391,95154,95155],{"align":9247},"容易实现",[8391,95157,95158],{"align":9247},"很难实现",[8391,95160,95161,95162,95164,95165],{},"任何一个RDBMS都可以很容易实现数据完整性，比如通过主键或者非空约束来实现实体完整性，通过主键、外键来实现参照完整性，通过约束或者触发器来实现用户自定义完整性；",[2996,95163],{},"但是，在",[22,95166,95167],{},"NoSQL数据库却无法实现",[8372,95169,95170,95173,95176,95179],{},[8391,95171,95172],{"align":9247},"扩展性",[8391,95174,95175],{"align":9247},"一般",[8391,95177,95178],{"align":9247},"好",[8391,95180,95181,95182,95184],{},"RDBMS很难实现横向扩展，纵向扩展的空间也比较有限；",[2996,95183],{},"NoSQL在设计之初就充分考虑了横向扩展的需求，可以很容易通过添加廉价设备实现扩展",[8372,95186,95187,95190,95192,95195],{},[8391,95188,95189],{"align":9247},"可用性",[8391,95191,95178],{"align":9247},[8391,95193,95194],{"align":9247},"很好",[8391,95196,95197,95198,95200],{},"RDBMS在任何时候都以保证数据一致性为优先目标，其次才是优化系统性能，随着数据规模的增大，RDBMS为了保证严格的一致性，只能提供相对较弱的可用性；",[2996,95199],{},"大多数NoSQL都能提供较高的可用性",[8372,95202,95203,95206,95209,95212],{},[8391,95204,95205],{"align":9247},"标准化",[8391,95207,95208],{"align":9247},"是",[8391,95210,95211],{"align":9247},"否",[8391,95213,95214,95215,95217,95220,95221,95223],{},"RDBMS已经标准化（SQL）；",[2996,95216],{},[22,95218,95219],{},"NoSQL还没有行业标准","，不同的NoSQL数据库都有自己的查询语言，很难规范应用程序接口；",[2996,95222],{},"Stone Braker认为：NoSQL缺乏统一查询语言，将会拖慢NoSQL发展",[8372,95225,95226,95229,95231,95233],{},[8391,95227,95228],{"align":9247},"技术支持",[8391,95230,14470],{"align":9247},[8391,95232,14473],{"align":9247},[8391,95234,95235,95236,95238],{},"RDBMS经过几十年的发展，已经非常成熟，Oracle等大型厂商都可以提供很好的技术支持；",[2996,95237],{},"NoSQL在技术支持方面仍然处于起步阶段，还不成熟，缺乏有力的技术支持",[8372,95240,95241,95244,95247,95249],{},[8391,95242,95243],{"align":9247},"可维护性",[8391,95245,95246],{"align":9247},"复杂",[8391,95248,95246],{"align":9247},[8391,95250,95251,95252,95254],{},"RDBMS需要专门的数据库管理员(DBA)维护；",[2996,95253],{},"NoSQL数据库虽然没有DBMS复杂，也难以维护",[49,95256,95257],{},[52,95258,95259],{},"关系数据库",[13,95261,95262],{},"优势：以完善的关系代数理论作为基础，有严格的标准，支持事务ACID四性，借助索引机制可以实现高效的查询，技术成熟，有专业公司的技术支持。",[13,95264,95265],{},"劣势：可扩展性较差，无法较好支持海量数据存储，数据模型过于死板、无法较好支持Web2.0应用，事务机制影响了系统的整体性能等。",[49,95267,95268],{},[52,95269,95270],{},"NoSQL数据库",[13,95272,95273],{},"优势：可以支持超大规模数据存储，灵活的数据模型可以很好地支持Web2.0应用，具有强大的横向扩展能力等。",[13,95275,95276],{},"劣势：缺乏数学理论基础，复杂查询性能不高，大都不能实现事务强一致性，很难实现数据完整性，技术尚不成熟，缺乏专业团队的技术支持，维护较困难等。",[10548,95278,95280],{"id":95279},"_2关系型数据库和非关系型数据库的优缺点","2、关系型数据库和非关系型数据库的优缺点",[13,95282,95283],{},"（上面那个表太复杂了，基本知识不到位的直接看下面这个表吧）",[8366,95285,95286,95300],{},[8369,95287,95288],{},[8372,95289,95290,95293,95296,95298],{},[8375,95291,95292],{"align":9247},"数据库类型",[8375,95294,95295],{},"特性",[8375,95297,20689],{},[8375,95299,20692],{},[8386,95301,95302,95372],{},[8372,95303,95304,95310,95330,95357],{},[8391,95305,95306,95307,95309],{"align":9247},"关系型数据库",[2996,95308],{},"SQLite、Oracle、MySQL",[8391,95311,95312,95313,95316,95317,95319,95320,27386,95323,95325,95326,95329],{},"1、关系型数据库，是指采用了",[22,95314,95315],{},"关系模型来组织数据","的数据库；",[2996,95318],{},"2、关系型数据库的最大特点就是",[22,95321,95322],{},"事务的一致性",[2996,95324],{},"3、简单来说，关系模型指的就是二维表格模型，而一个关系型数据库就是",[22,95327,95328],{},"由二维表及其之间的联系所组成的","一个数据组织。",[8391,95331,95332,95333,95336,95337,95339,95340,95343,95344,95346,95347,95350,95351,95353,95354,67],{},"1、",[22,95334,95335],{},"容易理解","：二维表结构是非常贴近逻辑世界的一个概念，关系模型相对网状、层次等其他模型来说更容易理解；",[2996,95338],{},"2、",[22,95341,95342],{},"使用方便","：通用的SQL语言使得操作关系型数据库非常方便；",[2996,95345],{},"3、",[22,95348,95349],{},"易于维护","：丰富的完整性（实体完整性、参照完整性和用户定义的完整性）大大降低了数据冗余和数据不一致的概率；",[2996,95352],{},"4、",[22,95355,95356],{},"支持SQL，可用于复杂的查询",[8391,95358,95359,95360,27386,95363,95365,95366,95368,95369,95371],{},"1、为了维护一致性所付出的巨大代价就是其读写",[22,95361,95362],{},"性能比较差",[2996,95364],{},"2、固定的表结构；",[2996,95367],{},"3、高并发读写需求；",[2996,95370],{},"4、海量数据的高效率读写。",[8372,95373,95374,95377,95401,95419],{},[8391,95375,95376],{"align":9247},"非关系型数据库MongoDb、Redis、HBase",[8391,95378,95379,95380,95383,95384,95339,95386,27386,95389,95391,95392,27386,95395,95397,95398,67],{},"1、使用",[22,95381,95382],{},"键值对","存储数据；",[2996,95385],{},[22,95387,95388],{},"分布式",[2996,95390],{},"3、一般",[22,95393,95394],{},"不支持ACID特性",[2996,95396],{},"4、非关系型数据库严格上不是一种数据库，应该是",[22,95399,95400],{},"一种数据结构化存储方法的集合",[8391,95402,95332,95403,27386,95406,95408,95409,27386,95412,95414,95415,95418],{},[22,95404,95405],{},"无需经过SQL层的解析，读写性能很高",[2996,95407],{},"2、基于键值对，数据",[22,95410,95411],{},"没有耦合性，容易扩展",[2996,95413],{},"3、存储数据的格式：NoSQL的存储格式是",[22,95416,95417],{},"Key，Value形式、文档形式、图片形式","等等，二关系型数据库则只支持基础类型。",[8391,95420,95421,95422,95424],{},"1、不提供SQL支持，学习和使用成本较高；",[2996,95423],{},"2、无事务处理，附加功能BI和报表等支持也不好。",[23289,95426],{},[7759,95428,95430],{"id":95429},"十一redis的数据结构","十一、Redis的数据结构",[13,95432,95433,95434,95437],{},"Redis（Remote Dictionary Server）远程字典服务器是一个",[22,95435,95436],{},"key-value存储系统","，由Salvatore Sanfilippo开发，使用ANSI C语言编写，遵守BSD协议。",[13,95439,95440,95441,95444,95445,67],{},"Redis运行于独立的进程，通过网络协议和应用交互，将数据保存在内存中，并提供多种手段持久化内存数据。",[22,95442,95443],{},"Redis具备跨服务器的水平拆分、复制的分布式特性","。Redis不同于Memcached将value视作黑盒，Redis的value本身具有结构化的特点，对于value提供了丰富的操作。",[22,95446,95447],{},"基于内存存储的特点使得Redis与传统的关系型数据库相比，拥有极高的吞吐量和响应性能",[10548,95449,95451],{"id":95450},"_0redis的特点","0、Redis的特点",[49,95453,95454,95460,95466],{},[52,95455,95456,95459],{},[22,95457,95458],{},"支持多种数据结构","。Redis不仅仅支持简单的key-value类型的数据，同时还提供list，set，zset，hash等数据结构的存储。",[52,95461,95462,95465],{},[22,95463,95464],{},"支持数据持久化","。Redis支持数据的持久化，可以将内存中的数据保持在磁盘中，重启的时候可以再次加载进行使用。",[52,95467,95468,95471],{},[22,95469,95470],{},"支持数据备份","。Redis支持数据的备份，即master-slave模式的数据备份。",[13,95473,95474],{},[617,95475],{"alt":95476,"src":95477},"Redis数据结构","img\u002F11.1Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.png",[13,95479,95480],{},[617,95481],{"alt":95482,"src":95483},"Redis数据结构2","img\u002F11.2Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%842.png",[13,95485,95486,95487,95490],{},"Redis没有传统关系型数据库的table模型。schema所对应的db仅以编号区分，同一个db内，key 作为顶层模型，其值是",[22,95488,95489],{},"扁平化","的，即db本身就是key值的命名空间。实际使用中，通常以“:“号作为分隔符，将命名空间值和业务key连接，作为Redis中当前db下的key值，如“article:12345”作为key值，表示article这个命名空间下id为12345的元素的key，类似于关系型数据库中的article表主键为12345的行。",[13,95492,95493,95494,67],{},"因为扁平化的特点，在Redis 中，针对key的操作变得很简单：所有操作针对1到几个（常数个） key进行，不存在关系型数据库中的类似列表查询类的操作。但是业务的多样性通常需要存储系统具有更丰富的数据结构，Redis将这样的功能放到了单条key-value 的内部，用",[22,95495,95496],{},"结构化的value对象满足业务多样性的需求",[13,95498,95499,95500,67],{},"Redis常用的value包含5种类型：",[22,95501,95502],{},"string、list、set、map、sorted-set",[10548,95504,95506],{"id":95505},"_1string","1、String",[13,95508,95509],{},"字符串类型是Redis中最基本的数据结构，它能存储任何类型的数据，包括二进制数据，序列化后的数据，JSON化的对象，甚至是一张图片，最大512M。包括3种值的类型：字符串、整数、浮点数。",[13,95511,95512,95513,67],{},"String 的底层存储：String类型的数据结构",[22,95514,95515],{},"存储方式有三种int、raw、embstr",[13,95517,95518],{},"String的应用场景：String用来存储图片，统计微博数、统计粉丝数等。",[13,95520,95521,95522,95525],{},"SDS是在原本字符数组之上，",[22,95523,95524],{},"增加了三个元数据:：len、alloc、flags","，用来解决C语言字符串的缺陷。为尽可能降低响应时间，降低某些操作的时间复杂度，并可能兼容一些C语言字符串APl，实现十分巧妙。",[10548,95527,95529],{"id":95528},"_2list","2、List",[13,95531,95532],{},"列表对象，用于存储String序列。按照插入顺序排序，元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边)，底层是个链表结构。",[13,95534,95535,95536,95539],{},"Redis的列表相当于Java语言中的LinkedList，注意它是链表而不是数组。这意味着",[22,95537,95538],{},"list的插入和删除操作非常快，时间复杂度为O(1)，但是索引定位很慢，时间复杂度为O(n)","。C语言本身没有链表这个数据结构的，所以Redis自己设计了一个链表数据结构。",[13,95541,95542],{},"List的应用场景∶",[49,95544,95545,95548],{},[52,95546,95547],{},"List实现队列：消息排队和异步逻辑处理",[52,95549,95550],{},"文章列表或者数据分页展示的应用",[13,95552,95553],{},[617,95554],{"alt":95555,"src":95556},"List数据结构","img\u002F11.3List%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.png",[10548,95558,95560],{"id":95559},"_3hashmap","3、Hash（Map）",[13,95562,95563],{},"Redis hash是一个string类型的field和value的映射表，hash特别适合用于存储对象。",[13,95565,95566],{},"Hash冲突解决：被分配到同一个哈希桶上的多个节点可以用这个单项链表连接起来。",[13,95568,95569],{},"链式哈希局限性也很明显，随着链表长度的增加，在查询这一位置上的数据的耗时就会增加，毕竟链表的查询的时间复杂度是O(n)。这时要采取rehash，对哈希表的大小进行扩展。",[13,95571,95572],{},"如果哈希表1的数据量非常大，那么在迁移至哈希表2的时候，因为会涉及大量的数据拷贝，此时可能会对Redis造成阻塞，无法服务其他请求。",[13,95574,95575],{},[617,95576],{"alt":95577,"src":95578},"Hash数据结构","img\u002F11.4Hash%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.png",[13,95580,95581],{},[22,95582,95583],{},"渐进式hash",[49,95585,95586,95589],{},[52,95587,95588],{},"Redis采用了渐进式rehash，也就是将数据的迁移的工作不再是一次性迁移完成，而是分多次迁移。",[52,95590,95591,95592],{},"在rehash进行期间：\n",[49,95593,95594,95597,95603],{},[52,95595,95596],{},"每次哈希表元素进行新增、删除、查找或者更新操作时，Redis除了会执行对应的操作之外，还会顺序将「哈希表1」中索引位置上的所有key-value迁移到「哈希表2」上；",[52,95598,95599,95602],{},[22,95600,95601],{},"查找","一个key 的值的话，先会在「哈希表1」里面进行查找，如果没找到，就会继续到哈希表2里面进行查找。",[52,95604,95605,95608,95609,95612,95613,95616],{},[22,95606,95607],{},"新增","一个key-value时，",[22,95610,95611],{},"会被保存到「哈希表2」里面","，而「哈希表1」则不再进行任何添加操作，这样保证了「",[22,95614,95615],{},"哈希表1」的key-value数量只会减少","，随着 rehash操作的完成，最终「哈希表1」就会变成空表。",[10548,95618,95620],{"id":95619},"_4set","4、Set",[13,95622,95623,95624,95627,95628,95631],{},"Set是类似List，",[22,95625,95626],{},"是String类型的无序无重复集合","。相当于Java语言中的HashSet，它",[22,95629,95630],{},"内部的键值对是无序、唯一的","。它的内部实现相当于一个特殊的字典，字典中所有的value都是一个值NULL。",[49,95633,95634,95645],{},[52,95635,95636,95637],{},"Set的底层实现：",[49,95638,95639,95642],{},[52,95640,95641],{},"针对非整型的数据，采用hashtable；",[52,95643,95644],{},"针对整型的数据，采用 intset。如果元素个数超过set-max-intset-entries（默认值：512），也会用hashtable存储。",[52,95646,95647,95648],{},"Set的应用场景",[49,95649,95650,95653,95656],{},[52,95651,95652],{},"标签。比如博客网站经常用到的文章分类标签",[52,95654,95655],{},"去重，共同好友",[52,95657,95658],{},"随机化展示",[10548,95660,95662],{"id":95661},"_5zsetsorted-set","5、Zset（Sorted-set）",[13,95664,95665],{},[22,95666,95667],{},"（zset就是sorted set。为了避免sorted set简写sset导致命令冲突，所以改为zset。）",[13,95669,95670,95671,95674,95675,95678,95679,95682],{},"Redis",[22,95672,95673],{},"有序","集合zset和集合set一样也是string类型元素的集合，且不允许重复的成员。不同的是",[22,95676,95677],{},"zset的每个元素都会关联一个分数(分数可以重复)","，redis通过分数来为集合中的成员进行",[22,95680,95681],{},"从小到大","的排序。",[13,95684,95685],{},"Zset 的底层实现︰",[49,95687,95688,95698],{},[52,95689,95690,95691,95694,95695,67],{},"Zset对象是唯一一个同时",[22,95692,95693],{},"使用了两个数据结构","来实现的Redis对象，这两个数据结构一个是跳表，一个是哈希表。这样的好处是既能",[22,95696,95697],{},"进行高效的范围查询，也能进行高效单点查询",[52,95699,95700],{},"Zset对象能支持范围查询(如ZRANGEBYSORE操作)，这是因为它的数据结构设计采用了跳表（跳表是在链表基础上改进过来的，实现了一种多层的有序链表,这样的好处是能快读定位数据。)，而又能以常数复杂度获取元素权重(如ZSCORE操作)，这是因为它同时采用了哈希表进行索引。",[13,95702,95703],{},"Zset的应用场景",[49,95705,95706,95709],{},[52,95707,95708],{},"在首页推荐10个最热门的帖子，也就是阅读量由高到低，排行榜的实现等业务。",[52,95710,95711],{},"IM中最近的会话列表",[10548,95713,95715],{"id":95714},"编外redis-cluster","（编外）Redis-Cluster",[13,95717,95718,95719,95722],{},"Redis Cluster着眼于",[22,95720,95721],{},"提高并发量","。群集至少需要3主3从，且每个实例使用不同的配置文件。",[13,95724,95725],{},"在redis-cluster架构中，redis-master节点一般用于接收读写，而redis-slave节点则一般只用于备份，其与对应的master拥有相同的slot集合，若某个redis-master意外失效，则再将其对应的slave进行升级为临时redis-master。",[13,95727,95728,95729,95732,95733,67],{},"Redis的官方文档：在cluster架构下，默认的，一般redis-master用于接收读写，而redis-slave则用于备份，",[22,95730,95731],{},"当有请求是在向slave发起时，会直接重定向到对应key所在的master来处理","。但如果不介意读取的是redis-cluster中有可能过期的数据并且对写请求不感兴趣时，则亦可",[22,95734,95735],{},"通过readonly命令，将slave设置成可读，然后通过slave获取相关的key，达到读写分离",[13,95737,95738],{},[617,95739],{"alt":95740,"src":95741},"Redis-Cluster","img\u002F11.4Redis-Cluster.png",[13,95743,95744,819],{},[22,95745,20689],{},[49,95747,95748,95751,95754],{},[52,95749,95750],{},"解决分布式负载均衡的问题。具体解决方案是分片\u002F虚拟操slot。",[52,95752,95753],{},"可实现动态扩容。",[52,95755,95756],{},"P2P模式，无中心化。",[13,95758,95759,819],{},[22,95760,20692],{},[49,95762,95763,95766],{},[52,95764,95765],{},"为了性能提升，客户端需要缓存路由器信息。",[52,95767,95768],{},"Slave在集群中充当”冷备“，不能缓解读压力。",[23289,95770],{},[7759,95772,95774],{"id":95773},"十二redis的持久化方式","十二、Redis的持久化方式",[13,95776,95777],{},"Redis对外提供数据访问服务时使用的是驻存在内存中的数据，这些数据在Redis重启之后将消失。为了让数据在重启之后得以恢复，Redis具备将数据持久化到本地磁盘的能力。",[13,95779,95780,95781,52204,95784,67],{},"Redis持久化有两种方法：",[22,95782,95783],{},"全量模式",[22,95785,95786],{},"增量模式",[10548,95788,95789],{"id":95789},"基于全量模式的持久化",[49,95791,95792],{},[52,95793,95794],{},"书本上的部分：",[13,95796,95797],{},"Redis作为一个状态节点，其”状态“可以用实例内部所有db的key-value值来定义，每一次Redis处理一个数据访问写命令修改了db的key-value数据时，Redis就发生了一次状态变迁。基于全量的持久化触发的时刻，将当时的状态（所有db的key-value值）完全保存下来，形成一个snapshot。",[13,95799,95800],{},"当Redis重启时，通过加载最近一个snapshot数据，可将Redis恢复至最近一次持久化时的状态上。",[13,95802,95803],{},[617,95804],{"alt":95805,"src":95806},"全量模式持久化","img\u002F12.1%E5%85%A8%E9%87%8F%E6%A8%A1%E5%BC%8F%E6%8C%81%E4%B9%85%E5%8C%96.png",[49,95808,95809],{},[52,95810,95811,95812,28447],{},"PPT上的内容（PPT上将这种模式称之为",[22,95813,95814],{},"RDB【快照模式】",[13,95816,95817,95818,95821],{},"RDB：Redis将内存中的",[22,95819,95820],{},"所有数据全量","写入到文件中",[13,95823,95824,819],{},[22,95825,20689],{},[13,95827,95828,95829],{},"1、每隔一段时间进行备份，",[22,95830,95831],{},"全量备份",[13,95833,95834,95835],{},"2、灾备简单，可以",[22,95836,95837],{},"远程传输",[13,95839,95840,95841,95844],{},"3、备份是fork一个",[22,95842,95843],{},"子进程","，对当前进行数据访问主进程不影响",[13,95846,95847,819],{},[22,95848,95849],{},"劣势",[13,95851,95852,95853,95856],{},"1、发生故障时，有可能",[22,95854,95855],{},"丢失最后一次备份的数据","（原因︰突然宕机，子进程已经生成了rdb文件，但主进程还没来得及用该文件覆盖旧的rdb文件。）",[13,95858,95859,95860,95863],{},"2、子进程进行",[22,95861,95862],{},"数据备份时会复制内存数据导致内存膨胀两倍","，如果复制的数据量很大就会导致CPU和内存负载往高产生卡顿",[13,95865,95866],{},"3、RDB数据持久化适合于大规模的数据恢复，并且还原速度快，如果对数据的完整性不是特别敏感（可能存在最后一次丢失的情况），那么RDB持久化方式非常合适。",[13,95868,95869,819],{},[22,95870,95871],{},"原理",[13,95873,95874],{},"1、RDB即快照模式，它是Redis默认的数据持久化方式，它会将数据库的快照保存在dump.rdb这二进制文件中。",[13,95876,95877],{},"2、Redis使用操作系统的多进程COW（Copy On Write）机制来实现快照持久化操作。",[13,95879,95880,95881,67],{},"3、RDB 实际上是Redis内部的一个定时器事件，它每隔一段固定时间就去检查触发条件。当满足条件时，Redis就会通过操作系统调用fork()来创建一个子进程，该子进程与父进程享有",[22,95882,95883],{},"相同的地址空间",[13,95885,95886],{},[22,95887,95888],{},"数据已经持久化到RDB文件，如何恢复?",[13,95890,95891,95892,67],{},"只需要把dump.rdb复制到dir目录中，redis在启动的时候机会",[22,95893,95894],{},"自动加载",[10548,95896,95897],{"id":95897},"基于增量模式的持久化",[49,95899,95900],{},[52,95901,95794],{},[13,95903,95904],{},"基于全量的持久化保存的是数据的”状态“，而增量持久化保存的则是状态的每一次”变迁“。当初始状态给定，经过相同的”变迁“序列之后，最终的状态也是确定的。因此，基于增量持久化数据，可以通过对给定初始状态之后的变迁回放，恢复出数据的终态。",[13,95906,95907],{},[617,95908],{"alt":95909,"src":95910},"增量模式持久化","img\u002F12.2%E5%A2%9E%E9%87%8F%E6%A8%A1%E5%BC%8F%E6%8C%81%E4%B9%85%E5%8C%96.png",[13,95912,95913],{},"在Redis中，增量持久化成为AOF（append-only file）方式，在此基础上以rewrite机制优化性能，Redis仅对数据的变化进行存储。",[49,95915,95916],{},[52,95917,95811,95918,28447],{},[22,95919,95920],{},"AOF【追加模式】",[13,95922,95923,95924,95927,95928,95931,95932,95935,95936,67],{},"AOF被称为追加模式，或日志模式，是Redis提供的另⼀种持久化策略，它能够",[22,95925,95926],{},"存储Redis服务器已经执行过的命令","， 并且",[22,95929,95930],{},"只记录对内存有过修改的命令","，这种数据记录方法，被叫做“",[22,95933,95934],{},"增量复制","”，其默认存储文件为 ",[22,95937,95938],{},"appendonly.aof",[13,95940,95941,95942,95945,95946,95949,95950,95953,95954,95957],{},"以日志的形式来记录用户的请求",[22,95943,95944],{},"写操作","（特别像MySQL的binlog）， ",[22,95947,95948],{},"读操作不会保存","；以",[22,95951,95952],{},"追加","的形式进行记录到appendonly.aof 这个文件中；Redis的",[22,95955,95956],{},"aof恢复","其实就是把追加的文件从头到尾全部执行⼀遍。",[13,95959,95960],{},"写入机制：内容不直接写入到磁盘，而是放到内存缓冲区，填满才落盘；",[13,95962,95963],{},"重写机制：长期运行，aof文件会越变越长。",[13,95965,95966,95967],{},"如果AOF和RDB同时开启，Redis ",[22,95968,95969],{},"只读取AOF文件的内容",[13,95971,95972],{},"解决：在运行中修改appendonly为yes:config set appendonly yes",[10548,95974,95976],{"id":95975},"rdb-aof-持久化总结","RDB && AOF 持久化总结",[8366,95978,95979,95989],{},[8369,95980,95981],{},[8372,95982,95983,95986],{},[8375,95984,95985],{},"RDB持久化",[8375,95987,95988],{},"AOF持久化",[8386,95990,95991,95999,96007,96015],{},[8372,95992,95993,95996],{},[8391,95994,95995],{},"全量备份，一次保存整个数据库。",[8391,95997,95998],{},"增量备份，一次只保存一个修改数据库的命令。",[8372,96000,96001,96004],{},[8391,96002,96003],{},"每次执行持久化操作的间隔时间较长。",[8391,96005,96006],{},"保存的间隔默认为一秒钟（Everysec）。",[8372,96008,96009,96012],{},[8391,96010,96011],{},"数据保存为二进制格式，其还原速度快。",[8391,96013,96014],{},"使用文本格式还原数据，所以数据还原速度一般。",[8372,96016,96017,96020],{},[8391,96018,96019],{},"执行SAVE命令时会阻塞服务器，但手动或者自动触发的BGSAVE不会阻塞服务器。",[8391,96021,96022],{},"AOF持久化无论何时都不会阻塞服务器。",[23289,96024],{},[7759,96026,96028],{"id":96027},"十三redis集群的演进","十三、Redis集群的演进【*】",[13,96030,71248,96031],{},[5009,96032,96035],{"href":96033,"rel":96034},"https:\u002F\u002Fblog.csdn.net\u002Fhuxiaodong1994\u002Farticle\u002Fdetails\u002F109343165",[23647],"redis集群架构的演进之路",[10548,96037,96039],{"id":96038},"_1redis的主从架构","1、Redis的主从架构",[13,96041,96042],{},"一开始我们的业务量不大时，一个redis节点就能满足我们的业务需求，当我们的业务量不断上涨，单台redis节点已经不能满足我们的业务需求时，这个时候redis的主从结构就出现了。",[13,96044,96045,96046,67],{},"redis主从结构解决的问题：redis可以部署为一个主节点，多个从节点，从节点提供读服务，主节点提供写服务，将我们的业务进行",[22,96047,96048],{},"读写分离",[49,96050,96051],{},[52,96052,96053],{},"网络中断时，主从结构如何保持数据一致性？",[13,96055,96056],{},"在redis2.8版本之前，只要主从断开连接，再次连接时，直接就是RDB全量同步；redis2.8版本之后，主从断网重连之后，会采用增量的方式进行同步，当从节点断开连接后，主节点会将操作写入到repl_backlog_buffer这个缓存区中，其中repl_backlog_buffer是一个环形的缓存区结构。",[13,96058,96059],{},[617,96060],{"alt":96061,"src":96062},"数据一致性","img\u002F13.1%E6%95%B0%E6%8D%AE%E4%B8%80%E8%87%B4%E6%80%A7.png",[13,96064,96065],{},"从主节点恢复连接之后，从节点会发送psync命名给主节点，并把自己当前的 slave_repl_offset 发给主库，主节点会根据自身的master_repl_offset与slave_repl_offset进行比较，将两者之间的相差部分命令找到。",[13,96067,96068],{},"将相差的部分增量同步给从节点，主从集群保持数据一致。",[49,96070,96071],{},[52,96072,96073],{},"存在的问题：",[13,96075,96076],{},"因为主从结构中，只有一个主节点，当主节点出现故障后，无法提供写服务操作，存在单点故障问题，无法提供高可用的服务，这个时候哨兵模式的构架就出现了。",[10548,96078,96080],{"id":96079},"_2哨兵架构","2、哨兵架构",[13,96082,96083],{},"哨兵节点就是一个特殊的redis节点，它不提供存放数据，只用来监控其他redis节点情况。",[13,96085,96086],{},"哨兵节点的主要作用分为三个方面，即监控、选主和通知功能。",[49,96088,96089,96100,96103,96114],{},[52,96090,96091,96092],{},"监控：哨兵会周期的发送PING命令给所有主从节点，在规定的时间内收到了节点的响应，就认为节点是正常，如果没有在规定时间内给出响应，就认为节点出现了故障，为了防止对主节点的误判操作，引入哨兵集群来对主节点进行监控行为，所以对于redis节点来说，又分为主观下线和客观下线。",[49,96093,96094,96097],{},[52,96095,96096],{},"主观下线：单个哨兵节点发送PING命令给所监控的主、从节点，当主从节点对响应超时，哨兵节点就任务redis节点主线故障，将节点标记为主观下线。",[52,96098,96099],{},"客观下线：当哨兵集群中，超过半数（可以调整，默认半数）以上的节点，认为某个节点发生故障，那个这个节点就被判定为客观下线。",[52,96101,96102],{},"选主：当主节点发生故障了，如何从多个从节点中选出主节点？选主的步骤一般是先筛选出符合竞选条件的从节点，然后对这些从节点进行打分操作，分数最高的节点就是新的主节点。",[52,96104,96105,96106],{},"通知：就是选举结束后，哨兵需要将新的主节点通过给客户端，让客户端可以继续进行写操作。针对客户端而言，通知可以分为主动获取和被动接受。",[49,96107,96108,96111],{},[52,96109,96110],{},"被动接受：哨兵会把新的主节点地址信息写入到实例的pubsub（switch-master）中，客户端需要订阅这个pubsub，来获取新的主节点信息，存在的问题就是当客户端错过了哨兵的通知的话，那么客户端将不会在拿到新的主节点信息。",[52,96112,96113],{},"主动拉取：客户端在访问主从库时，不能将配置写死在自身的配置中，而是需要从哨兵集群中获取redis节点信息（sentinel get-master-addr-by-name命令）。",[52,96115,96116],{},"当主从集群中的主节点故障后，如何将从节点选为新的主节点呢？",[13,96118,96119],{},"先会对从节点进行筛选，筛选的规则就是，主要就是检查从库的当前在线状态和之前的网络情况。对于之前的网络状态判断是通过参数down-after-milliseconds，来判断，如果主从节点超过这个时间点没有通信，就被认为是出现过一次断链，当超过10次以上断连时，哨兵认为其从节点的网络情况不是很好，会主动剔除这部分从节点。然后就对剩下的从节点进行打分操作，打分分为三个纬度，如果每一轮中回出现一个最高分，就会直接选出新的主节点，选举结束。三个层级分别是从库优先级、从库复制进度和从库ID号进行选举。",[49,96121,96122],{},[52,96123,96073],{},[13,96125,96126],{},"单个哨兵架构虽然解决了主从结构的单点故障问题，当主节点故障后，通过哨兵发起主从切换，可以保持redis的高可用性，但是此时哨兵节点还是只有一个，哨兵节点还是存在单点故障问题，所以哨兵集群架构就登场了。",[10548,96128,96130],{"id":96129},"_3哨兵集群结构","3、哨兵集群结构",[13,96132,96133],{},"所谓的哨兵集群结构主要解决的问题，就是哨兵的单点故障问题，防止只有一个哨兵节点，当哨兵节点出现故障后，redis集群就不可用的情况。",[49,96135,96136],{},[52,96137,96138],{},"多个哨兵之间如何通信呢？",[13,96140,96141,96142,18027,96145,96147],{},"主要是通过redis本身提供的pub\u002Fsub机制，每个哨兵和主节点redis进行连接时，会将哨兵自身的ip和port，通过主库上有一个名为“_",[596,96143,96144],{},"sentinel",[2700,96146],{},"”的频道发送，当哨兵监控这个集群时，就会订阅这个频道的消息，所以通过这种方式，哨兵之间可以拿到其他节点的ip和port。",[49,96149,96150],{},[52,96151,96152],{},"哨兵的Leader选举机制？",[13,96154,96155],{},"当我们的redis主节点出现故障后，需要由哨兵来进行主从切换，将某个从节点变成主节点，整个切换的流程是由哨兵中的某一个节点来进行操作，进行操作的节点我们称之为Leader节点。那么这个Leader节点是怎么来的呢，其选举的流程如下图：",[13,96157,96158],{},[617,96159],{"alt":96160,"src":96161},"哨兵的选举机制","img\u002F13.2%E5%93%A8%E5%85%B5%E7%9A%84%E9%80%89%E4%B8%BE%E6%9C%BA%E5%88%B6.png",[49,96163,96164],{},[52,96165,96073],{},[13,96167,96168],{},"哨兵集群结构，虽然解决了哨兵的单点问题，但是此时的结构中，只有一个redis主节点，当redis的主节点数据量过大时，redis的持久化，提供写复制时，响应时间存在过长的情况，针对这种情况，redis切片集群就出现了。",[10548,96170,96172],{"id":96171},"_4redis-cluster集群模式","4、Redis Cluster集群模式",[13,96174,96175],{},"采用redis集群模式，可以解决单点节点数据量大、写入量大产生的性能瓶颈的问题。多个节点组成一个集群，可以提高集群的性能和可靠性。redis Cluster采用哈希槽（Hash slot）方法，来处理数据和实例之间的映射关系，哈希槽最多有16384个节点。存放数据的步骤就是先将key值，通过CRC16算法获取值后，然后在和16384进行取模，看这个数据落在那个哈希槽中。",[13,96177,96178],{},"采用了redis cluster集群后，客户端访问数据时，如何知道我们的数据是落在哪个节点上呢？在我们的redis集群中，每个redis集群节点都有一个额外的TCP端口，每个节点使用TCP连接与每个其他节点连接。检测和故障转移这些步骤基本和哨兵模式类似，每个redis节点都会知道其他节点分配了哪些槽信息，当客户端使用命令来请求服务端时，如何这个命令刚好在这个节点上，直接返回数据，如何不再这个节点上，会返回对应的moved重定向命令，来告知客户端需要访问的数据所在的节点信息。",[13,96180,96181],{},[22,96182,96183],{},"（部分Redis Cluster的知识可以参考十一、Redis的数据结构中的编外）",[23289,96185],{},[7759,96187,96189],{"id":96188},"十四综合系统设计","十四、综合系统设计",{"title":119,"searchDepth":144,"depth":144,"links":96191},[96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205],{"id":93675,"depth":144,"text":93676},{"id":93800,"depth":144,"text":93801},{"id":93889,"depth":144,"text":93890},{"id":93991,"depth":144,"text":93992},{"id":94137,"depth":144,"text":94138},{"id":94262,"depth":144,"text":94263},{"id":94487,"depth":144,"text":94488},{"id":94670,"depth":144,"text":94671},{"id":94794,"depth":144,"text":94795},{"id":95016,"depth":144,"text":95017},{"id":95429,"depth":144,"text":95430},{"id":95773,"depth":144,"text":95774},{"id":96027,"depth":144,"text":96028},{"id":96188,"depth":144,"text":96189},{},"我的大学\u002F大三上学期\u002F大数据存储技术\u002F大数据存储技术备考.md","\u002Fundergraduate\u002Fnote-bbdd47434503",{"title":93652,"description":119},"undergraduate\u002Fnote-bbdd47434503",[14968,246,23378,10715],"Utr-NdLqkIa9kTorDhC1JwKJYz6vpg-KYF-sVVcbAk0",{"id":96214,"title":96215,"assetBase":239,"author":8,"body":96216,"category":23936,"collection":23324,"date":23325,"description":96220,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":97293,"navigation":128,"originalPath":97294,"path":97295,"seo":97296,"source":23330,"stem":97297,"tags":97298,"weight":250,"__hash__":97299},"content\u002Fundergraduate\u002Fnote-bf7a828f2deb.md","从ResNet入门卷积神经网络",{"type":10,"value":96217,"toc":97282},[96218,96221,96224,96309,96312,96315,96318,96327,96432,96435,96438,96447,96450,96454,96462,96473,96477,96480,96483,96488,96491,96496,96499,96502,96505,96510,96514,96517,96531,96577,96580,96583,96588,96591,96595,96598,96601,96606,96610,96613,96621,96626,96630,96659,96661,96664,96669,96673,96676,96679,96682,96685,96688,96691,96694,96697,96701,96705,96708,96711,96715,96718,96721,96724,96728,96732,96738,96741,96744,96747,96751,96754,96759,96770,96776,96779,96785,96788,96792,96795,96798,96802,97189,97192,97199,97202,97205,97209,97212,97215,97218,97221,97224,97227,97235,97247,97258,97269,97280],[13,96219,96220],{},"众所周知数据科学与大数据技术实际上是以科研性质的的数据科学和纯技术力的大数据技术组成，学一半尚且非常吃力，而我又偏偏选了大数据技术方向。但是学历太低了，大数据技术也找不到工作，刚巧老师布置了个小论文的作业，趁着五一假期，从零点一（毕竟就算有意不学，但多少还是耳目渲染了点）开始恶补数据科学部分。",[13,96222,96223],{},"拿到选题之前，我连ResNet是什么都不清楚，放以前应该是照着书猛看，但是现在有ChatGPT和NewBing等人工智能了，所以优先找它了解一些情况比较迅速。事实证明我是对的，我让NewBing给我列了个论文提纲和目录，一下子就把学习方向明了了。回答如下：",[114,96225,96227],{"className":46802,"code":96226,"language":46804,"meta":119,"style":119},"## 摘要\n深度神经网络在图像分类等任务上取得了显著的效果，但是随着网络层数的增加，训练和优化变得越来越困难。为了解决这个问题，本文介绍了一种深度残差网络（ResNet），它通过引入残差学习的机制，使得网络可以更容易地拟合恒等映射，从而避免了梯度消失和退化问题。本文详细分析了ResNet的原理和结构，并在CIFAR-10数据集上进行了实验，结果表明，ResNet可以有效地提高分类准确率，并且具有较低的参数量和计算复杂度。\n## 目录\n1. 引言\n2. 深度神经网络的挑战\n   2.1 梯度消失和爆炸\n   2.2 退化问题\n3. 深度残差网络\n   3.1 残差学习\n   3.2 网络结构\n   3.3 短路连接\n4. 实验与结果\n   4.1 数据集和实验设置\n   4.2 分类准确率\n   4.3 参数量和计算复杂度\n5. 结论与展望\n",[17,96228,96229,96234,96239,96244,96249,96254,96259,96264,96269,96274,96279,96284,96289,96294,96299,96304],{"__ignoreMap":119},[78,96230,96231],{"class":124,"line":125},[78,96232,96233],{},"## 摘要\n",[78,96235,96236],{"class":124,"line":132},[78,96237,96238],{},"深度神经网络在图像分类等任务上取得了显著的效果，但是随着网络层数的增加，训练和优化变得越来越困难。为了解决这个问题，本文介绍了一种深度残差网络（ResNet），它通过引入残差学习的机制，使得网络可以更容易地拟合恒等映射，从而避免了梯度消失和退化问题。本文详细分析了ResNet的原理和结构，并在CIFAR-10数据集上进行了实验，结果表明，ResNet可以有效地提高分类准确率，并且具有较低的参数量和计算复杂度。\n",[78,96240,96241],{"class":124,"line":138},[78,96242,96243],{},"## 目录\n",[78,96245,96246],{"class":124,"line":144},[78,96247,96248],{},"1. 引言\n",[78,96250,96251],{"class":124,"line":150},[78,96252,96253],{},"2. 深度神经网络的挑战\n",[78,96255,96256],{"class":124,"line":156},[78,96257,96258],{},"   2.1 梯度消失和爆炸\n",[78,96260,96261],{"class":124,"line":162},[78,96262,96263],{},"   2.2 退化问题\n",[78,96265,96266],{"class":124,"line":168},[78,96267,96268],{},"3. 深度残差网络\n",[78,96270,96271],{"class":124,"line":174},[78,96272,96273],{},"   3.1 残差学习\n",[78,96275,96276],{"class":124,"line":180},[78,96277,96278],{},"   3.2 网络结构\n",[78,96280,96281],{"class":124,"line":186},[78,96282,96283],{},"   3.3 短路连接\n",[78,96285,96286],{"class":124,"line":192},[78,96287,96288],{},"4. 实验与结果\n",[78,96290,96291],{"class":124,"line":198},[78,96292,96293],{},"   4.1 数据集和实验设置\n",[78,96295,96296],{"class":124,"line":204},[78,96297,96298],{},"   4.2 分类准确率\n",[78,96300,96301],{"class":124,"line":210},[78,96302,96303],{},"   4.3 参数量和计算复杂度\n",[78,96305,96306],{"class":124,"line":216},[78,96307,96308],{},"5. 结论与展望\n",[13,96310,96311],{},"第二步是针对每个小节让NewBing进行回答，虽然看上去它能直接把小论文写完了，但是事实并非一帆风顺。NewBing的上下文连贯性并不算特别好，前面几个小点还能连贯，后面就转向科普了，而且一旦一次线程爆了，一切就得重来。为了保持一致性，最终我还是选择采用他的目录内容，先学习再自己写写。（毕竟它要是真的全能写好养成习惯后我也就废了）",[13,96313,96314],{},"可能有人觉得ChatGPT会在回答上优于NewBing，让它写效果和作用会好很多。不过我个人并不建议这样，一是因为ChatGPT太优秀了，并非阻挡了自身的进步，而是它是给出的答案但凡有一句假话，给人带来的成本都是巨大的，科研是严谨的，不应该在自己不擅长的领域随意采用别人的观点；二是NewBing本质上还是一个搜索引擎，它未必能给我非常好的答案，但它能给我很多非常好的作者的博客链接，能够让我自己动手去找答案。",[13,96316,96317],{},"第三步我也没有急于直接去学习ResNet，短时间学会本来就很难，花大量时间莽撞的学习效率会很低。我先去了解了下小论文的书写格式，毕竟最终应该出来的是一篇像模像样的论文，而不是东拼西凑的文段。",[13,96319,96320,96321,96326],{},"参照文章《[知网查重入口教您论文写作的字体格式规范](",[5009,96322,96325],{"href":96323,"rel":96324},"https:\u002F\u002Fwww.cnki.ac.cn\u002Fwrite\u002F294.html#:~:text=%E7%9F%A5%E7%BD%91%E6%9F%A5%E9%87%8D%E5%85%A5%E5%8F%A3%E6%95%99%E6%82%A8%E8%AE%BA%E6%96%87%E5%86%99%E4%BD%9C%E7%9A%84%E5%AD%97%E4%BD%93%E6%A0%BC%E5%BC%8F%E8%A7%84%E8%8C%83",[23647],"https:\u002F\u002Fwww.cnki.ac.cn\u002Fwrite\u002F294.html#:~:text=知网查重入口教您论文写作的字体格式规范"," 1 1、论文标题 使用2号黑体加粗、居中。 2 2、论文副标题 使用小2号的字体，紧挨正标题下居中，文字前加破折号。 3,另起一页开始，标题使用4号黑体，内容使用5号宋体。 7 8、附录 标题使用4号黑体，内容使用5号宋体。 8 9、注释 标题使用4号黑体，内容使用5号宋体。 )》最终将格式确定如下：",[114,96328,96330],{"className":46802,"code":96329,"language":46804,"meta":119,"style":119},"1、论文标题\n    使用2号黑体加粗、居中。\n2、论文副标题\n    使用小2号的字体，紧挨正标题下居中，文字前加破折号。\n3、个人信息\n    填写姓名、专业、学号等项目时用3号楷体。\n4、目录\n    目录要另起一页开始写作，标题为3号黑体，内容使用小4号仿宋，并且要罗列出页码。\n5、正文部分\n    要保证另起一页，开始写作，论文的标题使用3号黑体完成；而主体的文字部分，一般采用用小4号宋体；并且还要注意，每段要空两个字的距离再开始写作，行距也需要保持一致。\n6、正文中不同等级的标题格式要求\n    一级标题：标题前的序号为“一、”，4号黑体；独占一行；注意末尾不加标点符号。\n    二级标题：标题前的序号为“(一)”同正文部分的字体大小相同；独占一行；注意末尾不加标点符号。\n    三级标题：标题前的序号为“1.”同正文部分的字体大小、字体类型相同。\n    四级标题：标题前的序号为“(1)”同正文部分的字体大小、字体类型相同。\n    五级标题：标题前的序号为“①”同正文部分的字体大小、字体类型相同。\n7、参考文献\n    另起一页开始，标题使用4号黑体，内容使用5号宋体。\n8、注释\n    标题使用4号黑体，内容使用5号宋体。\n",[17,96331,96332,96337,96342,96347,96352,96357,96362,96367,96372,96377,96382,96387,96392,96397,96402,96407,96412,96417,96422,96427],{"__ignoreMap":119},[78,96333,96334],{"class":124,"line":125},[78,96335,96336],{},"1、论文标题\n",[78,96338,96339],{"class":124,"line":132},[78,96340,96341],{},"    使用2号黑体加粗、居中。\n",[78,96343,96344],{"class":124,"line":138},[78,96345,96346],{},"2、论文副标题\n",[78,96348,96349],{"class":124,"line":144},[78,96350,96351],{},"    使用小2号的字体，紧挨正标题下居中，文字前加破折号。\n",[78,96353,96354],{"class":124,"line":150},[78,96355,96356],{},"3、个人信息\n",[78,96358,96359],{"class":124,"line":156},[78,96360,96361],{},"    填写姓名、专业、学号等项目时用3号楷体。\n",[78,96363,96364],{"class":124,"line":162},[78,96365,96366],{},"4、目录\n",[78,96368,96369],{"class":124,"line":168},[78,96370,96371],{},"    目录要另起一页开始写作，标题为3号黑体，内容使用小4号仿宋，并且要罗列出页码。\n",[78,96373,96374],{"class":124,"line":174},[78,96375,96376],{},"5、正文部分\n",[78,96378,96379],{"class":124,"line":180},[78,96380,96381],{},"    要保证另起一页，开始写作，论文的标题使用3号黑体完成；而主体的文字部分，一般采用用小4号宋体；并且还要注意，每段要空两个字的距离再开始写作，行距也需要保持一致。\n",[78,96383,96384],{"class":124,"line":186},[78,96385,96386],{},"6、正文中不同等级的标题格式要求\n",[78,96388,96389],{"class":124,"line":192},[78,96390,96391],{},"    一级标题：标题前的序号为“一、”，4号黑体；独占一行；注意末尾不加标点符号。\n",[78,96393,96394],{"class":124,"line":198},[78,96395,96396],{},"    二级标题：标题前的序号为“(一)”同正文部分的字体大小相同；独占一行；注意末尾不加标点符号。\n",[78,96398,96399],{"class":124,"line":204},[78,96400,96401],{},"    三级标题：标题前的序号为“1.”同正文部分的字体大小、字体类型相同。\n",[78,96403,96404],{"class":124,"line":210},[78,96405,96406],{},"    四级标题：标题前的序号为“(1)”同正文部分的字体大小、字体类型相同。\n",[78,96408,96409],{"class":124,"line":216},[78,96410,96411],{},"    五级标题：标题前的序号为“①”同正文部分的字体大小、字体类型相同。\n",[78,96413,96414],{"class":124,"line":222},[78,96415,96416],{},"7、参考文献\n",[78,96418,96419],{"class":124,"line":421},[78,96420,96421],{},"    另起一页开始，标题使用4号黑体，内容使用5号宋体。\n",[78,96423,96424],{"class":124,"line":427},[78,96425,96426],{},"8、注释\n",[78,96428,96429],{"class":124,"line":433},[78,96430,96431],{},"    标题使用4号黑体，内容使用5号宋体。\n",[13,96433,96434],{},"同样，我也找了两篇知网上的论文进行参照，不过ResNet科普的论文并不存在，大部分是使用其进行调优的，这里只是用作格式的参考。",[13,96436,96437],{},"第四步就比较枯燥无味了，主打一个查资料学习，在这里先吐槽一下我们组的选题人（虽然我不知道是谁），ResNet的前置知识有VGG使用块的网络，而想知道VGG就得去看看AlexNet，而学AlexNet就需要明白CNN到底想干嘛，而CNN是卷积神经网络的起点，也就是说你得先明白神经网络是什么，为什么要卷积。也就是说：如果这篇ResNet小论文能顺利写出来，那么写个VGG、AlexNet的问题也不大，这些是其他组的选题。回归正题，下面会记录下我在查资料过程中碰到的一些专业词汇（一般是你不知道干啥就会影响观感的），方便到时候写小论文的时候啪啪啪往上放。",[13,96439,96440,96441,96446],{},"那么，我最终决定以《",[5009,96442,96445],{"href":96443,"rel":96444},"https:\u002F\u002Fzh.d2l.ai\u002Findex.html",[23647],"动手学深度学习","》这本书的第六章卷积神经网络和第七章现代循环神经网络为起点，加上一些个博客（会在最后标注出来），开始我这从ResNet入门神经网络的文档。",[7759,96448,96449],{"id":96449},"从全连接到卷积",[10548,96451,96453],{"id":96452},"_1设计适合于计算机视觉的神经网络架构","（1）设计适合于计算机视觉的神经网络架构",[49,96455,96456,96459],{},[52,96457,96458],{},"平移不变性（translation invariance）：不管检测对象出现在图像中的哪个位置，神经网络的前面几层应该对相同的图像区域具有相似的反应，即为“平移不变性”。",[52,96460,96461],{},"局部性（locality）：神经网络的前面几层应该只探索输入图像中的局部区域，而不过度在意图像中相隔较远区域的关系，这就是“局部性”原则。最终，可以聚合这些局部特征，以在整个图像级别进行预测。",[72,96463,96464],{},[13,96465,96466,96467,96472],{},"如果你不能很好的理解这两句话的内涵，我建议作为科普看看我喜欢的一个UP主林亦LYi的《",[5009,96468,96471],{"href":96469,"rel":96470},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV19P4y1q7GD\u002F?spm_id_from=333.999.0.0&vd_source=a81ef8427e696b92de364d833142bd10",[23647],"【亦】手机杀死了摄影？","》，6分28秒开始讲解经典的人脸检测算法，很好的诠释了这两句话。",[10548,96474,96476],{"id":96475},"_2古早全连接的多层感知机","（2）【古早】全连接的多层感知机",[13,96478,96479],{},"我不是很能很好的陈述数学上的表现形式，但书上大部分以公式来进行讲解，所以在这我用自己的口语化表达简单介绍下这些流程。",[13,96481,96482],{},"首先是多层感知机：以图像为例，在计算机处理中我们可以将一张图看成是二维矩阵。这里需要了解权重张量的概念，还记得在最优化\u002F计算智能学的梯度下降吗？简而言之，权重张量就是使用梯度下降之类算法得到的两组数据之间的关联性，比如一个红色向蓝色渐变的过程，只关注首尾（输入\u002F输出）的话你是只能看到红色和蓝色的，但是微观上来说，如果这两个颜色存在关联，那么就必然会有一个红色衰减、蓝色增强的过程，嗯，我认为叫做趋势\u002F极限可能比较合适，而这个变化的幅度，也就是数学上常说的斜率，就是权重张量。",[72,96484,96485],{},[13,96486,96487],{},"权重张量是神经网络中的一个重要概念。它是一个多维数组，用于存储神经网络中每个连接的权重。在神经网络的前向传播过程中，输入数据会与权重张量相乘，然后通过激活函数进行非线性变换，最终得到输出结果。在训练过程中，权重张量会不断更新，以便更好地拟合训练数据。",[13,96489,96490],{},"那么再来看它的数学公式：",[13,96492,96493],{},[617,96494],{"alt":119,"src":96495},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F7.png",[13,96497,96498],{},"其实你很难想象他到底是想干什么，貌似这些参数该训练的都训练了，最终得到的也并不是有意义的结果。我在这里也纠结了很久，最终还是有了点头绪，别急，听我细细道来。",[13,96500,96501],{},"还是以红蓝渐变这个例子为中心，当你训练完成后，上面的每个参数应该都是已知的。这个时候我又来了一个白红蓝三色渐变的图片（不考虑缩放），你把上面训练好的二维数据往上面一贴，在误差范围内的，能够完全贴合的部分就能被“找到”，这就是识别出来了。",[13,96503,96504],{},"不过这个过程会比较漫长，因为公式中的（i，j）表示输出坐标，（k，l）表示输入坐标，四个自变量会导致计算过程指数级增长，而匹配过程又需要将输入的图从头扫到尾（极端情况下还需要反转、倒置），这种全扫描的方式就是全连接。",[72,96506,96507],{},[13,96508,96509],{},"我并不知道我讲的对不对，反正我也就学了一个下午，讲错了大家会见谅的吧！",[10548,96511,96513],{"id":96512},"_3卷积","（3）卷积",[13,96515,96516],{},"关于卷积，我们让NewBing通俗易懂的讲讲？",[72,96518,96519,96522,96525,96528],{},[13,96520,96521],{},"卷积是一种数学运算，它在图像处理和计算机视觉中非常常用。可以把它看作是一种“滤波器”，它能够提取图像中的某些特定特征。",[13,96523,96524],{},"举个例子，假设我们有一张数字图像，它由许多像素点组成。我们可以定义一个卷积核，它是一个小矩阵，包含一些数字。然后，我们将卷积核放在图像的左上角，将卷积核中的每个数字与其下方的像素值相乘，然后将所有乘积相加，得到一个新的数字。这个新数字就是卷积的结果。",[13,96526,96527],{},"接下来，我们将卷积核向右移动一个像素，重复上述过程，再得到一个新数字。我们继续这样做，直到卷积核移动到图像的右下角。最终，我们会得到一个新的矩阵，它包含了原图像经过卷积后的结果。",[13,96529,96530],{},"不同的卷积核能够提取不同的特征。例如，有些卷积核能够检测边缘，有些能够模糊图像，有些能够锐化图像等等。在卷积神经网络中，卷积核通常是通过训练学习得到的，能够自动提取图像中最有用的特征。",[72,96532,96533,96536,96539,96542,96553,96556,96571,96574],{},[13,96534,96535],{},"卷积是一种数学运算，它在信号处理和图像处理中非常常用。在数学上，卷积被定义为两个函数f和g的卷积，记为f∗g，其定义为：",[13,96537,96538],{},"(f∗g)(t) = ∫f(τ)g(t-τ)dτ",[13,96540,96541],{},"在离散情况下，卷积可以表示为：",[13,96543,96544,96545,96547,96548,43673,96550],{},"(f∗g)",[78,96546,19],{}," = ∑f",[78,96549,5535],{},[78,96551,96552],{},"n-k",[13,96554,96555],{},"在神经网络中，卷积通常用于处理图像数据。假设我们有一个图像I和一个卷积核K，它们的卷积可以表示为：",[13,96557,43693,96558,96561,96562,96564,96565,5037,96568],{},[78,96559,96560],{},"i,j"," = (I∗K)",[78,96563,96560],{}," = ∑m∑nI",[78,96566,96567],{},"m,n",[78,96569,96570],{},"i-m,j-n",[13,96572,96573],{},"其中S是卷积的结果。可以看到，卷积的过程就是将卷积核在图像上滑动，并计算每个位置上的加权和。",[13,96575,96576],{},"在卷积神经网络中，卷积层通常包含多个卷积核，每个卷积核都能够提取图像中的一种特定特征。通过堆叠多个卷积层，网络能够学习到越来越复杂的特征表示。",[13,96578,96579],{},"看了NewBing说的你可能更加迷糊了，这仿佛和全连接没有区别啊？我们通过公式可以看出权重张量参数从4个下降到了两个，这代表了稳定性显著下降，但是训练时间也会下降。我们以一个人的头像来举例：如果我需要用全连接的方式来识别，那么我就需要知道两个眼睛之间的比例、眼睛和鼻子的比例等等各种比例，但是不同部位的比例越多，其实越不利于人脸的识别，因为不同部位的误差势必会被放大。这个时候卷积就发挥它的作用了：虽然单个卷积结果的精度会下降，但是如果将其用来表示更小的窗口，实际上精度是提升了的。还是这个例子：如果一个卷积只处理鼻子的比例，一个卷积只处理眼睛的比例，最后将其综合起来，那么关于单个部位的精度实际上是提升了。同样，因为窗口更小，训练集也能更小，时间和成本都能一定程度下降（我猜的），最关键的是根据优先级可以大幅减少无用计算：比如一个合格的人像一定要露出眼睛，那如果我检测不到眼睛的图像就可以直接抛弃了，并不需要去检测鼻子，但是全连接就做不到。",[13,96581,96582],{},"这个时候我们再回来看这个数学公式：",[13,96584,96585],{},[617,96586],{"alt":119,"src":96587},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F8.png",[13,96589,96590],{},"这时候卷积神经网络的雏形就出现了。",[10548,96592,96594],{"id":96593},"_4通道","（4）通道",[13,96596,96597],{},"书上虽然叫通道，但其实我更想将其称之为维度。还是以上面提到的红蓝渐变为例，我们都知道三原色红黄蓝在计算机中为RGB三个参数，那么图像其实就不只表示为二维，按书上说的至少是三维（长、宽、颜色），当然，不勉强的来说用长、宽、深举例更方便理解：比如一个红色的球在一个蓝色的幕布前面，那么“前面”就是图像的深度。既然如此，那多出来的维度怎么表示？",[13,96599,96600],{},"答案是回到全连接。当然并不是指全部回到从前，而是参数类似于全连接。我们知道全连接的权重张量会包含两点间的长、宽作为变量，一共是4个参数。通过卷积，我们可以将两点之间的关联交给其他卷积，只处理两个变量。会有两个变量是因为需要以一个坐标作为参照，即只取一点的长、宽。那么三维呢？每个点就有了长、宽、高的变量，全连接下两点之间的权重张量就有6个参数。之后在进行卷积，就能有效地减少参数。",[72,96602,96603],{},[13,96604,96605],{},"我猜理论上如果卷积分的足够多的话，那么最终就只剩下维度\u002F通道个参数了。",[10548,96607,96609],{"id":96608},"_5卷积神经网络lenet","（5）卷积神经网络【LeNet】",[13,96611,96612],{},"总体来看，LeNet（LeNet-5）由两个部分组成：",[49,96614,96615,96618],{},[52,96616,96617],{},"卷积编码器：由两个卷积层组成;",[52,96619,96620],{},"全连接层密集块：由三个全连接层组成。",[13,96622,96623],{},[617,96624],{"alt":119,"src":96625},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F9.png",[10548,96627,96629],{"id":96628},"_5总结","（5）总结",[49,96631,96632,96635,96638,96641,96644,96647,96650,96653,96656],{},[52,96633,96634],{},"图像的平移不变性使我们以相同的方式处理局部图像，而不在乎它的位置。",[52,96636,96637],{},"局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。",[52,96639,96640],{},"在图像处理中，卷积层通常比全连接层需要更少的参数，但依旧获得高效用的模型。",[52,96642,96643],{},"卷积神经网络（CNN）是一类特殊的神经网络，它可以包含多个卷积层。",[52,96645,96646],{},"多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。",[52,96648,96649],{},"在卷积神经网络中，我们组合使用卷积层、非线性激活函数和汇聚层。",[52,96651,96652],{},"为了构造高性能的卷积神经网络，我们通常对卷积层进行排列，逐渐降低其表示的空间分辨率，同时增加通道数。",[52,96654,96655],{},"在传统的卷积神经网络中，卷积块编码得到的表征在输出之前需由一个或多个全连接层进行处理。",[52,96657,96658],{},"LeNet是最早发布的卷积神经网络之一。",[23289,96660],{},[107,96662,96663],{"id":96663},"小论文部分",[72,96665,96666],{},[13,96667,96668],{},"有了如上的基础，加上大量的查阅数据，最终得到小论文如下：",[7759,96670,96672],{"id":96671},"一引言","一、引言",[13,96674,96675],{},"深度神经网络（DNN）是一种模仿生物神经系统的计算模型，它由多层非线性单元组成，能够从数据中学习抽象和复杂的特征表示。DNN在图像分类、语音识别、自然语言处理、计算机视觉等领域取得了令人瞩目的成果，成为人工智能的重要技术之一。",[13,96677,96678],{},"然而，DNN也面临着许多挑战，其中之一就是如何有效地训练和部署深层的网络结构。随着网络层数的增加，DNN往往会遇到梯度消失或爆炸、退化问题、过拟合问题等，导致训练困难和性能下降。此外，DNN也需要大量的计算资源和存储空间，给硬件平台和系统架构带来了巨大的压力和挑战。",[13,96680,96681],{},"为了解决这些问题，研究者们提出了许多有效的方法，其中最具代表性的就是残差网络（ResNet）。ResNet是由何恺明等人于2015年提出的一种创新的网络结构，它通过引入残差学习的机制，使得网络可以更容易地拟合恒等映射，从而避免了梯度消失和退化问题。ResNet在ILSVRC 2015图像分类比赛中获得了冠军，并在其他许多任务上也取得了优异的表现⁴。",[13,96683,96684],{},"本文旨在对ResNet进行全面的介绍和分析，主要包括以下几个方面：",[13,96686,96687],{},"第二部分介绍深度神经网络面临的主要挑战，包括梯度消失和爆炸、退化问题等，并分析其原因和影响。",[13,96689,96690],{},"第三部分介绍残差网络的原理和结构，包括残差学习、短路连接、网络设计等，并分析其优势和局限性。",[13,96692,96693],{},"第四部分介绍残差网络在CIFAR-10数据集上的实验结果，包括分类准确率、参数量和计算复杂度等，并与其他网络进行对比和分析。",[13,96695,96696],{},"第五部分总结本文的主要内容，并展望残差网络的未来发展方向和应用领域。",[7759,96698,96700],{"id":96699},"二深度神经网络的挑战","二、深度神经网络的挑战",[10548,96702,96704],{"id":96703},"一梯度消失和爆炸","（一）梯度消失和爆炸",[13,96706,96707],{},"随着现代卷积神经网络的发展，各种网络卷积层次不断提高。在VGG中，卷积网络达到了19层，在GoogLeNet中，网络史无前例的达到了22层。在深度学习中，网络层数增多一般会伴着以下问题：计算资源的消耗、模型容易过拟合、梯度消失\u002F梯度爆炸问题的产生。",[13,96709,96710],{},"前两者分别可以通过GPU集群提高资源、配合Dropout正则化方法等方式解决。而对于第三者，在深度神经网络中，当网络的层数增加时，反向传播算法计算出来的梯度会不断缩小，甚至趋近于零，这就是所谓的“梯度消失”问题。当梯度接近于零时，权重更新变得非常缓慢，导致模型无法学习到正确的特征表示。与梯度消失相反，梯度爆炸是指在深度神经网络中，梯度变得非常大的情况。当梯度变得太大时，权重更新可能会变得非常剧烈，导致模型出现不稳定的训练行为。",[10548,96712,96714],{"id":96713},"二退化问题","（二）退化问题",[13,96716,96717],{},"退化问题指的是深度神经网络的精度随着层数的增加而出现下降的情况。当网络的层数较浅时，网络可以通过学习简单的特征表示来实现分类或回归等任务。但当网络的层数增加时，由于输入输出的分布变得复杂，模型需要学习更多的特征表示才能够提高模型的性能。然而，当网络的层数增加到一定程度时，网络的性能反而开始下降，这就是所谓的“退化”问题。",[13,96719,96720],{},"造成退化问题的原因主要包括两个方面：（1）梯度消失和爆炸；（2）网络权重的预训练效果不佳。",[13,96722,96723],{},"解决方式之一就是使用残差网络的来解决。残差网络(ResNet)通过增加跨层连接来解决退化问题，使得网络可以学习到更复杂的特征表示。ResNet中使用了残差块(Residual Block)，在网络中添加跨层连接，可以使得信息在网络中更加流畅地传递，避免梯度消失和退化问题。",[7759,96725,96727],{"id":96726},"三深度残差网络","三、深度残差网络",[10548,96729,96731],{"id":96730},"一理论研究","（一）理论研究",[13,96733,96734],{},[617,96735],{"alt":96736,"src":96737},"图1.1 函数类","img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F1.jpg",[13,96739,96740],{},"在没有残差的网络中，随着网络层数加深，网络的表征能力越来越强，但是网络表征能够学习到的最优点与实际中的最优点（图中的星号）往往是越来越远的，如上图中左边部分所示。",[13,96742,96743],{},"残差网络的目的是使得，随着网络深度的加深，模型的能够表征的最优点至少是不比浅层网络表征的最优点差，如上图中右边部分所示。",[13,96745,96746],{},"在实际的经验中，在神经网络的训练结果上体现为：随着搭建神经网络的层数的增加，错误率一开始下降，后来反而上升。上升的错误率不仅是在测试集上，同样也在训练集上，因此这种错误和过拟合无关。",[10548,96748,96750],{"id":96749},"二网络结构","（二）网络结构",[13,96752,96753],{},"残差网络是由一系列残差块组成的（图1）。一个残差块可以用表示为：",[13,96755,96756],{},[617,96757],{"alt":617,"src":96758},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F2.png",[13,96760,96761,96762,96765,96766,96769],{},"残差块分成两部分直接映射部分和残差部分。",[617,96763],{"alt":617,"src":96764},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F3.png","是直接映射，反应在图1中是左边的曲线；",[617,96767],{"alt":617,"src":96768},"img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F4.png","是残差部分，一般由两个或者三个卷积操作构成，即下图中右侧包含卷积的部分。",[13,96771,96772],{},[617,96773],{"alt":96774,"src":96775},"图1.2 残差块","img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F5.jpg",[13,96777,96778],{},"ResNet采用了非常深的网络结构，其中包括多个残差块。每个残差块都由两个卷积层和一个跨层连接组成，如图所示。",[13,96780,96781],{},[617,96782],{"alt":96783,"src":96784},"图1.2 残差网络激活函数","img\u002F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0\u002F6.jpg",[13,96786,96787],{},"在传统的卷积神经网络中，每个卷积层都会对输入进行变换，从而得到新的特征表示。而在ResNet中，每个残差块通过跨层连接将输入的信息直接传递到输出中。这使得网络可以学习到更加复杂的特征表示，从而提高了模型的性能。",[10548,96789,96791],{"id":96790},"三短路连接","（三）短路连接",[13,96793,96794],{},"短路连接（shortcut connections）是ResNet中非常重要的一部分。短路连接可以将输入的信息直接传递到输出中，从而避免了信息在网络中的损失。具体来说，在残差块中，短路连接可以让输入的信息直接绕过卷积层，并加到输出上。这样可以保留原始输入的信息，同时也增加了网络的深度。",[13,96796,96797],{},"除了在第一层和最后一层之外，ResNet中的每个卷积层都包含了短路连接。这种结构可以让信息在网络中更加流畅地传递，解决了传统卷积神经网络中的退化问题。同时，短路连接还可以使得网络更加容易优化，加快网络的收敛速度。",[7759,96799,96801],{"id":96800},"四实验与结果","四、实验与结果",[114,96803,96805],{"className":116,"code":96804,"language":118,"meta":119,"style":119},"import torch\nimport torch.nn as nn\n\n# 定义残差块\nclass ResidualBlock(nn.Module):\n    def __init__(self, in_channels, out_channels, stride=1):\n        super(ResidualBlock, self).__init__()\n        # 第一个卷积层\n        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)\n        self.bn1 = nn.BatchNorm2d(out_channels)\n        self.relu = nn.ReLU(inplace=True)\n        # 第二个卷积层\n        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)\n        self.bn2 = nn.BatchNorm2d(out_channels)\n        # 短路连接\n        self.shortcut = nn.Sequential()\n        if stride != 1 or in_channels != out_channels:\n            self.shortcut = nn.Sequential(\n            nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),\n            nn.BatchNorm2d(out_channels)\n        )\n\n    def forward(self, x):\n        identity = x\n        out = self.conv1(x)\n        out = self.bn1(out)\n        out = self.relu(out)\n        out = self.conv2(out)\n        out = self.bn2(out)\n        out += self.shortcut(identity)   # 短路连接\n        out = self.relu(out)\n        return out\n\n# 定义残差网络\nclass ResNet(nn.Module):\n    def __init__(self, block, num_blocks, num_classes=10):\n        super(ResNet, self).__init__()\n        self.in_channels = 16\n        # 第一层卷积层\n        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1, bias=False)\n        self.bn1 = nn.BatchNorm2d(16)\n        self.relu = nn.ReLU(inplace=True)\n        # 残差块\n        self.layer1 = self.make_layer(block, 16, num_blocks[0], stride=1)\n        self.layer2 = self.make_layer(block, 32, num_blocks[1], stride=2)\n        self.layer3 = self.make_layer(block, 64, num_blocks[2], stride=2)\n        # 全局平均池化层和全连接层\n        self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))\n        self.fc = nn.Linear(64, num_classes)\n\n    def make_layer(self, block, out_channels, num_blocks, stride):\n        strides = [stride] + [1] * (num_blocks - 1)   # 下采样的步长只在第一个残差块中使用\n        layers = []\n        for stride in strides:\n            layers.append(block(self.in_channels, out_channels, stride))\n            self.in_channels = out_channels\n        return nn.Sequential(*layers)\n\n    def forward(self, x):\n        out = self.conv1(x)\n        out = self.bn1(out)\n        out = self.relu(out)\n        out = self.layer1(out)\n        out = self.layer2(out)\n        out = self.layer3(out)\n        out = self.avg_pool(out)\n        out = out.view(out.size(0), -1)\n        out = self.fc(out)\n        return out\n\n# 创建ResNet-18模型\ndef resnet18():\n    return ResNet(ResidualBlock, [2, 2, 2])\n\n# 测试模型\nmodel = resnet18()\nprint(model)\nx = torch.randn(1, 3, 32, 32)\ny = model(x)\nprint(y.size())\n",[17,96806,96807,96811,96816,96820,96825,96830,96835,96840,96845,96850,96855,96860,96865,96870,96875,96880,96885,96890,96895,96900,96905,96909,96913,96917,96922,96927,96932,96937,96942,96947,96952,96956,96960,96964,96969,96974,96979,96984,96989,96994,96999,97004,97008,97013,97018,97023,97028,97033,97038,97043,97047,97052,97057,97062,97067,97072,97077,97082,97086,97090,97094,97098,97102,97107,97112,97117,97122,97127,97132,97136,97140,97145,97150,97155,97159,97164,97169,97174,97179,97184],{"__ignoreMap":119},[78,96808,96809],{"class":124,"line":125},[78,96810,46260],{},[78,96812,96813],{"class":124,"line":132},[78,96814,96815],{},"import torch.nn as nn\n",[78,96817,96818],{"class":124,"line":138},[78,96819,129],{"emptyLinePlaceholder":128},[78,96821,96822],{"class":124,"line":144},[78,96823,96824],{},"# 定义残差块\n",[78,96826,96827],{"class":124,"line":150},[78,96828,96829],{},"class ResidualBlock(nn.Module):\n",[78,96831,96832],{"class":124,"line":156},[78,96833,96834],{},"    def __init__(self, in_channels, out_channels, stride=1):\n",[78,96836,96837],{"class":124,"line":162},[78,96838,96839],{},"        super(ResidualBlock, self).__init__()\n",[78,96841,96842],{"class":124,"line":168},[78,96843,96844],{},"        # 第一个卷积层\n",[78,96846,96847],{"class":124,"line":174},[78,96848,96849],{},"        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)\n",[78,96851,96852],{"class":124,"line":180},[78,96853,96854],{},"        self.bn1 = nn.BatchNorm2d(out_channels)\n",[78,96856,96857],{"class":124,"line":186},[78,96858,96859],{},"        self.relu = nn.ReLU(inplace=True)\n",[78,96861,96862],{"class":124,"line":192},[78,96863,96864],{},"        # 第二个卷积层\n",[78,96866,96867],{"class":124,"line":198},[78,96868,96869],{},"        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)\n",[78,96871,96872],{"class":124,"line":204},[78,96873,96874],{},"        self.bn2 = nn.BatchNorm2d(out_channels)\n",[78,96876,96877],{"class":124,"line":210},[78,96878,96879],{},"        # 短路连接\n",[78,96881,96882],{"class":124,"line":216},[78,96883,96884],{},"        self.shortcut = nn.Sequential()\n",[78,96886,96887],{"class":124,"line":222},[78,96888,96889],{},"        if stride != 1 or in_channels != out_channels:\n",[78,96891,96892],{"class":124,"line":421},[78,96893,96894],{},"            self.shortcut = nn.Sequential(\n",[78,96896,96897],{"class":124,"line":427},[78,96898,96899],{},"            nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),\n",[78,96901,96902],{"class":124,"line":433},[78,96903,96904],{},"            nn.BatchNorm2d(out_channels)\n",[78,96906,96907],{"class":124,"line":2443},[78,96908,7680],{},[78,96910,96911],{"class":124,"line":2448},[78,96912,129],{"emptyLinePlaceholder":128},[78,96914,96915],{"class":124,"line":2454},[78,96916,6472],{},[78,96918,96919],{"class":124,"line":2460},[78,96920,96921],{},"        identity = x\n",[78,96923,96924],{"class":124,"line":2465},[78,96925,96926],{},"        out = self.conv1(x)\n",[78,96928,96929],{"class":124,"line":2470},[78,96930,96931],{},"        out = self.bn1(out)\n",[78,96933,96934],{"class":124,"line":2903},[78,96935,96936],{},"        out = self.relu(out)\n",[78,96938,96939],{"class":124,"line":2909},[78,96940,96941],{},"        out = self.conv2(out)\n",[78,96943,96944],{"class":124,"line":11477},[78,96945,96946],{},"        out = self.bn2(out)\n",[78,96948,96949],{"class":124,"line":13374},[78,96950,96951],{},"        out += self.shortcut(identity)   # 短路连接\n",[78,96953,96954],{"class":124,"line":13380},[78,96955,96936],{},[78,96957,96958],{"class":124,"line":13386},[78,96959,6507],{},[78,96961,96962],{"class":124,"line":13722},[78,96963,129],{"emptyLinePlaceholder":128},[78,96965,96966],{"class":124,"line":13727},[78,96967,96968],{},"# 定义残差网络\n",[78,96970,96971],{"class":124,"line":13953},[78,96972,96973],{},"class ResNet(nn.Module):\n",[78,96975,96976],{"class":124,"line":13958},[78,96977,96978],{},"    def __init__(self, block, num_blocks, num_classes=10):\n",[78,96980,96981],{"class":124,"line":13964},[78,96982,96983],{},"        super(ResNet, self).__init__()\n",[78,96985,96986],{"class":124,"line":13969},[78,96987,96988],{},"        self.in_channels = 16\n",[78,96990,96991],{"class":124,"line":24170},[78,96992,96993],{},"        # 第一层卷积层\n",[78,96995,96996],{"class":124,"line":24175},[78,96997,96998],{},"        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1, bias=False)\n",[78,97000,97001],{"class":124,"line":24180},[78,97002,97003],{},"        self.bn1 = nn.BatchNorm2d(16)\n",[78,97005,97006],{"class":124,"line":24186},[78,97007,96859],{},[78,97009,97010],{"class":124,"line":24192},[78,97011,97012],{},"        # 残差块\n",[78,97014,97015],{"class":124,"line":24198},[78,97016,97017],{},"        self.layer1 = self.make_layer(block, 16, num_blocks[0], stride=1)\n",[78,97019,97020],{"class":124,"line":24204},[78,97021,97022],{},"        self.layer2 = self.make_layer(block, 32, num_blocks[1], stride=2)\n",[78,97024,97025],{"class":124,"line":24210},[78,97026,97027],{},"        self.layer3 = self.make_layer(block, 64, num_blocks[2], stride=2)\n",[78,97029,97030],{"class":124,"line":24215},[78,97031,97032],{},"        # 全局平均池化层和全连接层\n",[78,97034,97035],{"class":124,"line":24220},[78,97036,97037],{},"        self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))\n",[78,97039,97040],{"class":124,"line":24226},[78,97041,97042],{},"        self.fc = nn.Linear(64, num_classes)\n",[78,97044,97045],{"class":124,"line":24232},[78,97046,129],{"emptyLinePlaceholder":128},[78,97048,97049],{"class":124,"line":24238},[78,97050,97051],{},"    def make_layer(self, block, out_channels, num_blocks, stride):\n",[78,97053,97054],{"class":124,"line":24244},[78,97055,97056],{},"        strides = [stride] + [1] * (num_blocks - 1)   # 下采样的步长只在第一个残差块中使用\n",[78,97058,97059],{"class":124,"line":24250},[78,97060,97061],{},"        layers = []\n",[78,97063,97064],{"class":124,"line":24256},[78,97065,97066],{},"        for stride in strides:\n",[78,97068,97069],{"class":124,"line":24262},[78,97070,97071],{},"            layers.append(block(self.in_channels, out_channels, stride))\n",[78,97073,97074],{"class":124,"line":24267},[78,97075,97076],{},"            self.in_channels = out_channels\n",[78,97078,97079],{"class":124,"line":24273},[78,97080,97081],{},"        return nn.Sequential(*layers)\n",[78,97083,97084],{"class":124,"line":24279},[78,97085,129],{"emptyLinePlaceholder":128},[78,97087,97088],{"class":124,"line":24284},[78,97089,6472],{},[78,97091,97092],{"class":124,"line":24290},[78,97093,96926],{},[78,97095,97096],{"class":124,"line":24296},[78,97097,96931],{},[78,97099,97100],{"class":124,"line":24302},[78,97101,96936],{},[78,97103,97104],{"class":124,"line":24308},[78,97105,97106],{},"        out = self.layer1(out)\n",[78,97108,97109],{"class":124,"line":24314},[78,97110,97111],{},"        out = self.layer2(out)\n",[78,97113,97114],{"class":124,"line":24320},[78,97115,97116],{},"        out = self.layer3(out)\n",[78,97118,97119],{"class":124,"line":24325},[78,97120,97121],{},"        out = self.avg_pool(out)\n",[78,97123,97124],{"class":124,"line":24331},[78,97125,97126],{},"        out = out.view(out.size(0), -1)\n",[78,97128,97129],{"class":124,"line":25115},[78,97130,97131],{},"        out = self.fc(out)\n",[78,97133,97134],{"class":124,"line":25121},[78,97135,6507],{},[78,97137,97138],{"class":124,"line":25127},[78,97139,129],{"emptyLinePlaceholder":128},[78,97141,97142],{"class":124,"line":25132},[78,97143,97144],{},"# 创建ResNet-18模型\n",[78,97146,97147],{"class":124,"line":25137},[78,97148,97149],{},"def resnet18():\n",[78,97151,97152],{"class":124,"line":25143},[78,97153,97154],{},"    return ResNet(ResidualBlock, [2, 2, 2])\n",[78,97156,97157],{"class":124,"line":25149},[78,97158,129],{"emptyLinePlaceholder":128},[78,97160,97161],{"class":124,"line":25155},[78,97162,97163],{},"# 测试模型\n",[78,97165,97166],{"class":124,"line":25161},[78,97167,97168],{},"model = resnet18()\n",[78,97170,97171],{"class":124,"line":25166},[78,97172,97173],{},"print(model)\n",[78,97175,97176],{"class":124,"line":25172},[78,97177,97178],{},"x = torch.randn(1, 3, 32, 32)\n",[78,97180,97181],{"class":124,"line":25178},[78,97182,97183],{},"y = model(x)\n",[78,97185,97186],{"class":124,"line":25184},[78,97187,97188],{},"print(y.size())\n",[13,97190,97191],{},"ResidualBlock类中定义了一个ResNet的残差块，这里实现的是基本的残差块结构，由两个卷积层和一个短路连接组成。其中，第一个卷积层使用3x3的卷积核，stride=1，padding=1；第二个卷积层也使用3x3的卷积核，stride=1，padding=1。如果输入和输出维度不一致，则通过1x1的卷积操作（即短路连接）将输入调整为与输出维度相同。",[13,97193,97194,97195,97198],{},"ResNet类中定义了整个ResNet网络模型。该模型中包含了多个残差块层，并通过全局平均池化层和全连接层进行分类。",[17,97196,97197],{},"make_layer","函数用于构建多个残差块，并通过for循环来重复调用残差块，形成一个完整的残差块层。在训练过程中，可以根据需求修改残差块层数目或者变换每个残差块中的卷积核大小等参数。",[13,97200,97201],{},"对于正向计算，首先对输入数据进行预处理（即conv1和bn1），然后依次执行多个残差块层，最后通过全局平均池化层将输出转换为一维向量，并通过全连接层进行分类。",[13,97203,97204],{},"该代码的训练过程通常包括以下几个步骤：定义损失函数和优化器；设置超参数，如学习率、迭代次数等；对训练集进行数据增强操作；开始训练模型，并在每个epoch结束后对验证集进行测试并计算准确率。可以根据训练过程中的验证集精度调整模型的超参数。",[7759,97206,97208],{"id":97207},"五结论与展望","五、结论与展望",[13,97210,97211],{},"该代码实现了一个ResNet-18模型，并通过CIFAR10数据集对其进行了测试。该模型具有较强的分类能力和泛化能力，且训练过程中的收敛速度较快。从代码实现的角度来看，该模型的关键部分包括残差块和残差网络。残差块使用了短路连接的方法，在保证网络深度增加的同时避免了梯度消失问题，有效提高了模型性能。而残差网络则通过多个残差块层的组合，进一步增加了网络的深度和复杂度，使得模型在图像分类等任务中表现出色。",[13,97213,97214],{},"当前，ResNet已经成为了深度学习领域中广泛应用的模型之一，并在许多计算机视觉任务中取得了不俗的表现。未来，可以考虑利用ResNet的设计思想，进一步深化网络架构，提高模型的性能和效率。其中，可能的方向包括：",[13,97216,97217],{},"模型小型化：针对移动设备等资源受限的场景，可以尝试对ResNet进行精简，减少参数量和计算复杂度，提高模型的部署效率和速度。",[13,97219,97220],{},"跨域学习：将ResNet应用于不同领域的任务中，如语音识别、自然语言处理等，探索其在多个领域中的适用性和迁移性。",[13,97222,97223],{},"模型优化：通过集成学习、超参调优、模型剪枝等方法，进一步提高ResNet的性能和泛化能力。此外，也可以考虑结合其他深度学习模型或传统机器学习方法，以达到更好的效果。",[7759,97225,97226],{"id":97226},"参考文献",[13,97228,97229,97231,97232,97234],{},[78,97230,469],{}," 阿斯顿·张,李沐.动手学深度学习",[78,97233,83893],{},".人民邮电出版社.2023",[13,97236,97237,97239,97240,21291,97243,21291],{},[78,97238,472],{}," 张贤同学.PyTorch ResNet 使用与源码解析",[78,97241,97242],{},"EB\u002FOL",[5009,97244,97245],{"href":97245,"rel":97246},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F225597229,2021-11-28",[23647],[13,97248,97249,97251,97252,21291,97254],{},[78,97250,1025],{}," 罗夏-felix.深度学习：残差网络（ResNet），理论及代码结构",[78,97253,97242],{},[5009,97255,97256],{"href":97256,"rel":97257},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F455442102.2022-01-14",[23647],[13,97259,97260,97262,97263,21291,97265],{},[78,97261,1014],{}," 大师兄.详解残差网络",[78,97264,97242],{},[5009,97266,97267],{"href":97267,"rel":97268},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F42706477.2018-08-22",[23647],[13,97270,97271,97273,97274,21291,97276],{},[78,97272,11047],{}," 晚饭吃什么.超级详细的ResNet代码解读（Pytorch）",[78,97275,97242],{},[5009,97277,97278],{"href":97278,"rel":97279},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F474790387.2023-01-14",[23647],[226,97281,228],{},{"title":119,"searchDepth":144,"depth":144,"links":97283},[97284,97285],{"id":96449,"depth":144,"text":96449},{"id":96663,"depth":132,"text":96663,"children":97286},[97287,97288,97289,97290,97291,97292],{"id":96671,"depth":144,"text":96672},{"id":96699,"depth":144,"text":96700},{"id":96726,"depth":144,"text":96727},{"id":96800,"depth":144,"text":96801},{"id":97207,"depth":144,"text":97208},{"id":97226,"depth":144,"text":97226},{},"Little Tips\u002F从ResNet入门卷积神经网络.md","\u002Fundergraduate\u002Fnote-bf7a828f2deb",{"title":96215,"description":96220},"undergraduate\u002Fnote-bf7a828f2deb",[14968,7744,246,23378,6380,14542],"uE42Xc8z8hRUlyvKU2ZkNB2Fw8f-aauXdxYnMmI0hlY",{"id":97301,"title":97302,"assetBase":239,"author":8,"body":97303,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":99001,"navigation":128,"originalPath":99002,"path":99003,"seo":99004,"source":23330,"stem":99005,"tags":99006,"weight":250,"__hash__":99007},"content\u002Fundergraduate\u002Fnote-c7d829b0c038.md","大数据平台基础备考",{"type":10,"value":97304,"toc":98952},[97305,97309,97321,97325,97329,97350,97354,97358,97362,97366,97370,97374,97377,97381,97384,97388,97401,97405,97412,97416,97429,97433,97436,97441,97445,97448,97452,97455,97459,97462,97466,97469,97472,97476,97479,97483,97486,97492,97499,97502,97507,97509,97513,97517,97520,97526,97531,97537,97541,97544,97548,97551,97555,97558,97562,97565,97569,97572,97576,97579,97583,97586,97589,97592,97596,97599,97603,97606,97610,97613,97617,97620,97624,97627,97631,97634,97638,97641,97645,97648,97654,97658,97663,97667,97673,97677,97683,97687,97693,97695,97699,97703,97706,97713,97717,97720,97724,97727,97731,97734,97738,97741,97745,97748,97751,97754,97760,97764,97767,97770,97789,97795,97798,97801,97804,97807,97810,97813,97816,97819,97823,97830,97833,97836,97842,97845,97848,97851,97854,97857,97860,97863,97866,97870,97873,97876,97883,97886,97890,97893,97897,97900,97904,97907,97911,97914,97917,97921,97924,97927,97947,97951,97954,97960,97974,97978,97981,97992,97995,97998,98015,98018,98022,98024,98032,98034,98060,98062,98066,98070,98073,98079,98083,98090,98094,98097,98101,98108,98112,98115,98119,98122,98126,98130,98207,98210,98213,98218,98222,98226,98229,98232,98235,98238,98243,98247,98250,98254,98257,98261,98264,98268,98271,98275,98278,98282,98285,98287,98291,98295,98299,98302,98305,98308,98311,98314,98318,98321,98325,98361,98364,98367,98371,98374,98378,98381,98384,98388,98391,98394,98398,98401,98405,98408,98412,98415,98426,98430,98433,98441,98445,98448,98465,98469,98472,98475,98477,98481,98484,98489,98493,98499,98503,98506,98510,98513,98517,98520,98527,98531,98534,98538,98541,98575,98579,98582,98586,98589,98606,98610,98613,98616,98619,98622,98625,98628,98631,98634,98637,98639,98643,98647,98650,98653,98656,98662,98665,98668,98671,98674,98677,98680,98683,98688,98692,98695,98701,98705,98708,98711,98714,98725,98729,98732,98749,98753,98756,98770,98772,98776,98780,98787,98793,98796,98800,98803,98807,98810,98814,98817,98821,98824,98828,98831,98835,98838,98842,98845,98849,98852,98856,98859,98863,98866,98869,98875,98878,98882,98885,98889,98892,98896,98899,98902,98906,98909,98913,98916,98920,98923,98925,98927,98930,98933,98936,98943,98946,98949],[4517,97306,97308],{"id":97307},"大数据平台基础hadoop大数据原理与应用","大数据平台基础（《Hadoop大数据原理与应用》）",[72,97310,97311,97315,97318],{},[13,97312,97313],{},[22,97314,23957],{},[13,97316,97317],{},"这是针对老师画的超多考点做的一份大体是抄书的复习文档，在阅读该文档之前，强烈建议大家先自行安装Hadoop、ZooKeeper、HBase的环境，能够配置和使用即可。在此基础上再来阅读下面的部分才能获得比较大的收获。",[13,97319,97320],{},"不然的话，看这个文档会十分的无趣！！",[107,97322,97324],{"id":97323},"第一章-大数据概述","第一章 大数据概述",[7759,97326,97328],{"id":97327},"_1简述大数据的内涵","1、简述大数据的内涵",[13,97330,97331,97332,97335,97336,97339,97340,1011,97343,1011,97346,97349],{},"大数据是大规模数据的集合体，是数据",[22,97333,97334],{},"对象","、数据集成",[22,97337,97338],{},"技术","、数据分析",[22,97341,97342],{},"应用",[22,97344,97345],{},"商业模式",[22,97347,97348],{},"思维创新","的统一体，也是一门捕捉、管理和处理数据的技术，它代表着一种全新的思维方式。",[10548,97351,97353],{"id":97352},"_1从对象角度来看大数据是数据规模超出传统数据库处理能力的数据集合","（1）从对象角度来看，大数据是数据规模超出传统数据库处理能力的数据集合",[10548,97355,97357],{"id":97356},"_2从技术角度来看大数据是从海量数据中快速获得有价值信息的技术","（2）从技术角度来看，大数据是从海量数据中快速获得有价值信息的技术",[10548,97359,97361],{"id":97360},"_3从应用角度来看大数据是对特定数据集合应用相关技术获得价值的行为","（3）从应用角度来看，大数据是对特定数据集合应用相关技术获得价值的行为",[10548,97363,97365],{"id":97364},"_4从商业模式角度来看大数据是企业获得商业价值的业务创新方向","（4）从商业模式角度来看，大数据是企业获得商业价值的业务创新方向",[10548,97367,97369],{"id":97368},"_5从思维方式来看大数据是从第三范式中分离出来的一种科研范式","（5）从思维方式来看，大数据是从第三范式中分离出来的一种科研范式",[7759,97371,97373],{"id":97372},"_2简述大数据的4v特征","2、简述大数据的4V特征",[13,97375,97376],{},"简单来说就是“量大·样多·速快·便宜”，和老妈子菜市场买菜一样。",[10548,97378,97380],{"id":97379},"_1海量化volume","（1）海量化【Volume】",[13,97382,97383],{},"大数据体量非常大，PB级别将是常态，且增长速度较快。",[10548,97385,97387],{"id":97386},"_2多样化variety","（2）多样化【Variety】",[13,97389,97390,97391,1011,97394,52204,97397,97400],{},"大数据种类繁多，一般包括",[22,97392,97393],{},"结构化",[22,97395,97396],{},"半结构化",[22,97398,97399],{},"非结构化","等几种类型。这些数据在编码方式、数据格式、应用特征等多个方面存在差异性，多信息源的并发产生了大量的异构数据。此外，不同结构的数据处理和分析方式也有所区别。",[10548,97402,97404],{"id":97403},"_3快速化velocity","（3）快速化【Velocity】",[13,97406,97407,97408,97411],{},"数据的快速流动和处理是大数据区分与传统数据挖掘的显著特征。大数据更",[22,97409,97410],{},"强调实时分析","而非批量式分析，数据输入后即刻处理，处理后丢弃。",[10548,97413,97415],{"id":97414},"_4价值密度低value","（4）价值密度低【Value】",[13,97417,97418,97419,1011,97422,52204,97425,97428],{},"大数据价值密度的高低与数据总量大小呈反比，单条数据本身并无太多价值，但庞大的数据量累计并隐藏了巨大的财富，其价值具备",[22,97420,97421],{},"稀疏性",[22,97423,97424],{},"多样性",[22,97426,97427],{},"不确定性","等特点。",[7759,97430,97432],{"id":97431},"_3举例说明大数据的关键技术","3、举例说明大数据的关键技术",[13,97434,97435],{},"大数据技术就是从各种类型的数据中快速获得有价值信息的技术。大数据处理的关键技术一般包括大数据采集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据展现和应用。",[13,97437,97438],{},[22,97439,97440],{},"（简化理解关键技术为一个数据生命周期：获取【采集】——预处理——管理【储存】——分析——展示）",[10548,97442,97444],{"id":97443},"_1大数据采集技术","（1）大数据采集技术",[13,97446,97447],{},"大数据采集一般分为大数据智能感知层和基础支撑层。大数据智能感知层主要包括数据传感体系、网络通信体系、传感适配体系、智能识别体系及软硬件资源接入系统，用于实现对结构化、半结构化、非结构化的海量数据的智能化识别、定位、跟踪、接入、传输、信号转化、监控、初步处理和管理等，重点针对大数据源的智能识别、感知、适配、传输、接入等技术。基础支撑层提供大数据服务平台所需的虚拟服务器以及结构化、半结构化及非结构化数据的数据库和物联网络资源等基础支撑环境，重点是分布式虚拟存储技术，大数据获取、存储、组织、分析和决策操作的可视化接口技术，大数据的网络传输与压缩技术，大数据隐私保护技术等。",[10548,97449,97451],{"id":97450},"_2大数据预处理技术","（2）大数据预处理技术",[13,97453,97454],{},"通过数据预处理工作，完成对已采集接收数据的辨析、抽取、清洗、归约、变换、离散化、集成等操作处理，可以是残缺的数据完整，将错误的数据纠正，多余的数据去除，进而将所需的数据挑选出来；并且进行数据集成，保证数据的一致性、准确性、完整性、时效性、可信性、可解释性。",[10548,97456,97458],{"id":97457},"_3大数据的存储及管理技术","（3）大数据的存储及管理技术",[13,97460,97461],{},"大数据的存储与管理要用存储器把采集到的数据存储起来，建立相应的数据库，并进行管理和调用，以解决大数据的可存储、可表示、可处理、可靠性及有效传输等关键问题，其研究重点是复杂的结构化、半结构化和非结构化的大数据管理与处理技术。",[10548,97463,97465],{"id":97464},"_4大数据的分析和挖掘技术","（4）大数据的分析和挖掘技术",[13,97467,97468],{},"大数据分析指的是对规模巨大的数据用适当的统计方法进行分析，以提取有用的信息并形成结论，包括可视化分析、数据挖掘算法、预测性分析、语义引擎、数据质量和数据管理等。",[13,97470,97471],{},"数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中，提取隐含在其中的、人们事先不知道的，但又潜在有用的信息和知识的过程。",[10548,97473,97475],{"id":97474},"_5大数据的展现和应用技术","（5）大数据的展现和应用技术",[13,97477,97478],{},"大数据技术能够将隐藏于海量数据中的信息和知识挖掘出来，为人类的社会经济活动提供依据，从而提高各个领域的运行效率，大大提高整个社会经济的集约化程度。",[7759,97480,97482],{"id":97481},"_4简述大数据云计算5g物联网以及人工智能之间的区别和联系","4、简述大数据、云计算、5G、物联网以及人工智能之间的区别和联系",[13,97484,97485],{},"物联网、云计算和5G是大数据的底层架构，大数据以来云计算来处理大数据，人工智能是大数据的应用场景。5G发展落地物联网才能发展，而物联网和云计算的发展则是推动大数据快速发展的主要原因，进而推动机器学习、计算机视觉、自然语言处理以及机器人学等人工智能领域迎来新的发展机遇。",[13,97487,97488],{},[617,97489],{"alt":97490,"src":97491},"大数据与物联网、云计算、人工智能、5G的关系","img\u002F1%E5%A4%A7%E6%95%B0%E6%8D%AE%E4%B8%8E%E7%89%A9%E8%81%94%E7%BD%91%E3%80%81%E4%BA%91%E8%AE%A1%E7%AE%97%E3%80%81%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E3%80%815G%E7%9A%84%E5%85%B3%E7%B3%BB.jpg",[13,97493,97494,97495,97498],{},"大数据指",[22,97496,97497],{},"无法再一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合，是需要新的处理模式才能有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产","。大数据是物联网、Web和传统信息系统发展的必然结果，它在技术体系上与云计算重点都是分布式存储和分布式计算，不同的是云计算注重服务，大数据则注重数据的价值化操作。",[13,97500,97501],{},"人工智能其实就是大数据、云计算的一个应用场景，包含机器学习，它可以从被动到主动，从模式化实行指令到自主判断根据情况实行不同的指令。",[13,97503,97504],{},[22,97505,97506],{},"（这题可能作为开放性送分题，简单来说：物理肯定是最底层的，是载体。有了硬件为依托才有云计算，5G是基于物理的云上计算【中间产物】，人工智能是云计算的产物，物理硬件获得的信息传递到云计算进行处理的数据就是大数据，也是人工智能能够反复学习的对象）",[23289,97508],{},[107,97510,97512],{"id":97511},"第二章-初识hadoop","第二章 初识Hadoop",[7759,97514,97516],{"id":97515},"_1论述hadoop生态系统构成及各个组件的基本功能","1、论述Hadoop生态系统构成及各个组件的基本功能",[13,97518,97519],{},"（关于生态系统，书本上介绍的是Hadoop2.0的部分，考虑到3.0出现后有些新的技术出现了，所以考试可以参考2.0的图，学习可以参考3.0的图）",[13,97521,97522],{},[617,97523],{"alt":97524,"src":97525},"Hadoop3.0生态系统","img\u002F2.1Hadoop3.0%E7%94%9F%E6%80%81%E7%B3%BB%E7%BB%9F.png",[13,97527,97528],{},[22,97529,97530],{},"（上3下2，3中的Common、Kafka没有画出）",[13,97532,97533],{},[617,97534],{"alt":97535,"src":97536},"Hadoop2.0生态系统","img\u002F2.2Hadoop2.0%E7%94%9F%E6%80%81%E7%B3%BB%E7%BB%9F.jpg",[10548,97538,97540],{"id":97539},"_1hadoop-common","（1）Hadoop Common",[13,97542,97543],{},"Hadoop Common是Hadoop体系中最底层的一个模块，为Hadoop各子项目提供了各种工具，是其他模块的基础。",[10548,97545,97547],{"id":97546},"_2hdfshadoop-distributed-file-system","（2）HDFS【Hadoop Distributed File System】",[13,97549,97550],{},"HDFS是Hadoop分布式文件系统，是Hadoop三大核心之一，是针对谷歌文件系统GFS的开源实现。HDFS是一个具有高容错性的文件系统，适合部署在廉价的机器上，且能提供高吞吐量的数据访问，非常适合大规模数据集的应用。",[10548,97552,97554],{"id":97553},"_3yarnyet-another-resource-negotiator","（3）YARN【Yet Another Resource Negotiator】",[13,97556,97557],{},"YARN是统一资源管理和调度框架，它解决了Hadoop1.0资源利用率低和不能兼容异构计算框架等多种问题，提供了资源隔离方案和双调度器解决方案，可在YARN上运行MapReduce、Spark、Storm、Tez等不同类型的计算框架。",[10548,97559,97561],{"id":97560},"_4mapreduce","（4）MapReduce",[13,97563,97564],{},"Hadoop MapReduce是一个分布式的、并行处理的编程模型，是针对谷歌MapReduce的开源实现。MapReduce利用函数式编程思想，将复杂的、运行于大规模集群上的并行计算过程高度抽象为Map和Reduce两个函数，其中Map是对可以并行处理的小数据集进行本地计算并输出中间结果，Reduce是对各个Map的输出结果进行汇总计算得到最终结果。",[10548,97566,97568],{"id":97567},"_5spark","（5）Spark",[13,97570,97571],{},"Spark是加州伯克利大学AMP实验室开发的新一代计算框架，对迭代计算很有优势。和MapReduce计算框架相比，Spark的性能提升明显，并且都可以与YARN进行集成。",[10548,97573,97575],{"id":97574},"_6hbase","（6）HBase",[13,97577,97578],{},"HBase是一个分布式的、面向列族的开源数据库，一般采用HDFS作为底层存储。HBase是针对谷歌Bigable的开源实现的，二者采用相同的数据类型，具有强大的非结构化数据存储能力。HBase使用ZooKeeper进行管理。",[10548,97580,97582],{"id":97581},"_7zookeeper","（7）ZooKeeper",[13,97584,97585],{},"ZooKeeper是Geogle Chubby的开源实现，是一个分布式的、开放源码的分布式应用程序协调框架，为大型分布式系统提供了高效且可靠的分布式协调服务以及诸如统一命名服务、配置服务、分布式锁等分布式基础服务，并广泛应用于Hadoop、HBase、Kafka等大型分布式系统。",[10548,97587,97588],{"id":44924},"（8）Hive",[13,97590,97591],{},"Hive是一个基于Hadoop的数据仓库工具，最早由FaceBook开发并使用。Hive还可以将SQL语句转换为MapReduce作业，并提交到Hadoop集群上运行。",[10548,97593,97595],{"id":97594},"_9pig","（9）Pig",[13,97597,97598],{},"Pig和Hive类似，也是对大型数据集进行分析和评估的工具。不过和Hive提供的SQL接口不同的是，它提供了一种高层的、面向领域的抽象语言Pig Latin。",[10548,97600,97602],{"id":97601},"_10impala","（10）Impala",[13,97604,97605],{},"Impala由Cloudera公司开发的，提供了HDFS、HBase上的海量数据进行交互式查询的SQL接口，其优点是查询非常迅速，其性能大幅领先于Hive。",[10548,97607,97609],{"id":97608},"_11mahout","（11）Mahout",[13,97611,97612],{},"Mahout是一个机器学习和数据挖掘库，它具有许多功能，包括聚类、分类、推荐过滤等。",[10548,97614,97616],{"id":97615},"_12flume","（12）Flume",[13,97618,97619],{},"Flume是由Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的框架。Flume支持在日志系统中定制各类数据发送方，用于收集数据，同时1也可提供对数据进行简单处理并写道各种数据接收方。",[10548,97621,97623],{"id":97622},"_13sqoop","（13）Sqoop",[13,97625,97626],{},"Sqoop是SQL to Hadoop的缩写，主要用于关系数据库和Hadoop之间的数据双向交换。可以借助Sqoop完成Mysql、Oracle、PostgreSQL等关系型数据库到Hadoop生态系统中HDFS、HBase、Hive等的数据导入导出操作，整个导入导出操作都是由MapReduce计算框架实现的，非常高效。",[10548,97628,97630],{"id":97629},"_14kafka","（14）Kafka",[13,97632,97633],{},"Kafka是一种高吞吐量、分布式的发布订阅消息系统，可以处理消费者在网站中的所有动作流数据。它采用Scala和Java语言编写，是一个分布式、支持分区的、多副本的，基于ZooKeeper协调的分布式消息系统。",[10548,97635,97637],{"id":97636},"_15ambari","（15）Ambari",[13,97639,97640],{},"Apache Ambari是一个基于Web的工具，支持Apache Hadoop集群的安装、部署、配置和管理。",[7759,97642,97644],{"id":97643},"_2试述hadoop的体系架构","2、试述Hadoop的体系架构",[13,97646,97647],{},"Hadoop集群采用主从架构（Master\u002FSlave），NameNode与ResourceManager为Master，DataNode与NodeManager为Slave，守护进程NameNode和DataNode负责完成HDFS的工作，守护进程ResourceManager和NodeManager则完成YARN的工作。",[13,97649,97650],{},[617,97651],{"alt":97652,"src":97653},"Hadoop集群架构","img\u002F2.3Hadoop%E9%9B%86%E7%BE%A4%E6%9E%B6%E6%9E%84.jpg",[7759,97655,97657],{"id":97656},"_3试述hadoop的运行模式及其优缺点","3、试述Hadoop的运行模式及其优缺点",[13,97659,97660],{},[22,97661,97662],{},"主要区别在计算机数量、节点数量、采用文件系统【NameNode和DataNode位置】",[10548,97664,97666],{"id":97665},"_1单机模式localstandalone-mode","（1）单机模式【Local\u002FStandalone Mode】",[13,97668,97669,97670],{},"只在一台计算机上运行，不需要任何配置。在这种模式下，Hadoop所有的守护进程都变成了一个Java进程；存储采用本地文件系统，没有采用分布式文件系统HDFS。",[22,97671,97672],{},"（单机模式配置最简单，但它与用户交互的方式不同于全分布式模式）",[10548,97674,97676],{"id":97675},"_2伪分布式模式pseudo-distributed-mode","（2）伪分布式模式【Pseudo-Distributed Mode】",[13,97678,97679,97680],{},"只在一台计算机上运行。在这种模式下，Hadoop所有的守护进程运行在一个节点上，在一个节点上模拟了一个具有Hadoop完整功能的微型集群；存储采用分布式文件系统HDFS，但是HDFS的名称节点和数据节点都位于同一台计算机上。",[22,97681,97682],{},"（节点数目受限的初学者可以采用伪分布式模式，虽然只有一个节点支撑整个Hadoop集群，但是Hadoop在伪分布式模式下的操作方式与在全分布式下的操作几乎完全相同）",[10548,97684,97686],{"id":97685},"_3全分布式模式fully-distributed-mode","（3）全分布式模式【Fully-Distributed Mode】",[13,97688,97689,97690],{},"在多台计算机上运行。在这种模式下，Hadoop的守护进程运行在多个节点上，形成一个真正意义上的集群；存储采用分布式文件系统HDFS，且HDFS的名称节点和数据节点位于不同计算机上。",[22,97691,97692],{},"（全分布式模式是使用Hadoop的最佳方式，现实中Hadoop集群的运行均采用该模式，但它需要的配置工作和架构所需要的机器集群也都是最多的）",[23289,97694],{},[107,97696,97698],{"id":97697},"第三章-分布式系统hdfs","第三章 分布式系统HDFS",[7759,97700,97702],{"id":97701},"_1简述hdfs的功能及其体系架构","1、简述HDFS的功能及其体系架构",[13,97704,97705],{},"相对于传统本地文件系统而言，分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。分布式文件系统的设计一般采用“客户机\u002F服务器”（Client\u002FServer）模式，客户端以特定的通信协议通过网络与服务器建立连接，提出文件访问请求。",[13,97707,97708,97709,97712],{},"HDFS文件系统的",[22,97710,97711],{},"基本特征","包括以下几个方面：",[10548,97714,97716],{"id":97715},"_1高容错性","（1）高容错性",[13,97718,97719],{},"HDFS把硬件出错看作一种常态，设计了能够进行快速自动进行错误检测和恢复的相应机制。",[10548,97721,97723],{"id":97722},"_2数据容量大","（2）数据容量大",[13,97725,97726],{},"HDFS集群可以支持数百个节点，以支持应用程序的大数据需求。",[10548,97728,97730],{"id":97729},"_3可扩展性","（3）可扩展性",[13,97732,97733],{},"HDFS的水平扩展性强，数据节点可以根据需要进行增删。",[10548,97735,97737],{"id":97736},"_4高吞吐量","（4）高吞吐量",[13,97739,97740],{},"HDFS的传输速率高，支持高并发大数据应用程序。",[10548,97742,97744],{"id":97743},"_5就近计算","（5）就近计算",[13,97746,97747],{},"客户请求尽可能在数据节点上直接完成计算任务，以便在大数据的业务中降低网络负担，增加吞吐量。",[13,97749,97750],{},"HDFS采用Master\u002FSlave架构模型，一个HDFS集群包括一个NameNode和多个DataNode。名称节点NameNode为主节点，数据节点DataNode为从节点，文件被划分为一系列的数据块（Block）存储在从节点DataNode上。NameNode是中心服务器，不存储数据，负责管理文件系统的命名空间（Namespace）以及客户端对文件的访问。",[13,97752,97753],{},"HDFS的体系架构中主要包括名称节点NameNode和数据节点DataNode。",[13,97755,97756],{},[617,97757],{"alt":97758,"src":97759},"HDFS的体系架构","img\u002F3.1HDFS%E7%9A%84%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84.jpg",[7759,97761,97763],{"id":97762},"_2简述hdfs的数据的读取过程","2、简述HDFS的数据的读取过程",[13,97765,97766],{},"HDFS的真实数据分散存储在DataNode上，但是读取数据时需要先经过NameNode。",[10548,97768,97769],{"id":97769},"基本过程",[13,97771,97772,97773,97776,97777,97780,97781,97784,97785,97788],{},"首先，客户端连接到NameNode",[22,97774,97775],{},"询问","某个文件的元数据信息，NameNode返回给客户端一个包含该文件各个",[22,97778,97779],{},"块位置信息","（存储在哪个DataNode）的列表；然后，客户端直接连接对应的DataNode来",[22,97782,97783],{},"并行读取","块数据；最后，当客户得到所有块后，再按照",[22,97786,97787],{},"顺序进行组装","，得到完整文件。",[13,97790,97791],{},[617,97792],{"alt":97793,"src":97794},"HDFS数据的读取过程","img\u002F3.2HDFS%E6%95%B0%E6%8D%AE%E7%9A%84%E8%AF%BB%E5%8F%96%E8%BF%87%E7%A8%8B.jpg",[10548,97796,97797],{"id":97797},"详细过程",[13,97799,97800],{},"（1）客户端生成一个FileSystem实例（DistributedFileSystem对象），并使用此实例的open()方法打开HDFS上的一个文件。",[13,97802,97803],{},"（2）DistributedFileSystem通过RPC调用向NameNode发出请求，得到文件的位置信息，即数据块编号和所在DataNode地址。对于每一个数据块，名称节点返回保存数据块的数据节点的地址，通常按照DataNode地址与客户端的距离从近到远排序。",[13,97805,97806],{},"（3）FileSystem实例获得地址信息后，生成一个FSDataInputStream对象实例返回给客户端。此实例封装了一个DFSInputStream对象，负责存储数据块信息和DataNode地址信息，并负责后续的文件内容读取内容。",[13,97808,97809],{},"（4）客户端向FSDataInputStream发出读取数据的read()调用。",[13,97811,97812],{},"（5）FSDataInputStream收到read()调用请求后，其封装的DFSInputStream选择与第一个数据块最近的DataNode，并读取相应的数据信息返回给客户端。数据块读取完成后，DFSInputStream负责关闭到对应DataNode的链接。",[13,97814,97815],{},"（6）DFSInputStream依次选择后续数据块的最近Datanode节点，并读取数据返回给客户端，直到最后一个数据块读取完毕。DFSInputStream从DataNode读取数据时，可能会碰上某个DataNode失效的情况，此时会自动选择下一个包含此数据块的最近的DataNode去读取。",[13,97817,97818],{},"（7）客户端读取完所有数据块，然后调用FSDataInputStream的close()方法关闭文件。",[7759,97820,97822],{"id":97821},"_3简述hdfs的数据的写入过程","3、简述HDFS的数据的写入过程",[13,97824,97825,97826,97829],{},"HDFS的设计遵循“",[22,97827,97828],{},"一次写入，多次读取","”的原则，所有数据只能添加不能更新。数据会被划分为等尺寸的块写入不同的DataNode中，每个块通常保存指定数量的副本（默认3个）。",[10548,97831,97769],{"id":97832},"基本过程-1",[13,97834,97835],{},"客户端向NameNode发送文件写请求，NameNode给客户分配写权限，并随机分配块的写入地址——DataNode的IP，同时兼顾副本数量和块Rack自适应算法。",[13,97837,97838],{},[617,97839],{"alt":97840,"src":97841},"HDFS数据写入的基本过程","img\u002F3.3HDFS%E6%95%B0%E6%8D%AE%E5%86%99%E5%85%A5%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%BF%87%E7%A8%8B.jpg",[10548,97843,97797],{"id":97844},"详细过程-1",[13,97846,97847],{},"（1）创建和初始化FileSystem，客户端调用create()来创建。",[13,97849,97850],{},"（2）FileSystem用RPC调用名称节点，在文件系统的命名空间中创建一个新的文件。名称节点首先确定文件原来不存在，并且客户端有创建文件的权限，然后才能创建新文件。",[13,97852,97853],{},"（3）FileSystem返回DFSOutputStream，客户端开始写入数据。",[13,97855,97856],{},"（4）DFSOutputStream将数据分成块，写入data queue。data queue由Data Streamer读取，并通知名称节点分配数据节点，用来存储数据块（每块默认复制三块）。分配的数据节点放在一个数据流管道（pipeline）里。Data Streamer将数据块写入pipeline中的第一个数据节点，第一个数据节点将数据块发送给第二个数据节点，第二个数据节点将数据块发送给第三个数据节点。",[13,97858,97859],{},"（5）DFSOutputStream为发出去的数据块保存了ack queue，等待pipeline中的数据节点告知数据写入成功。",[13,97861,97862],{},"（6）客户端结束写入数据后调用close()函数。此操作将所有的数据块写入pipeline中的数据节点，并等待ack queue返回成功。",[13,97864,97865],{},"（7）通知名称节点写入完毕。",[7759,97867,97869],{"id":97868},"_4简述hdfs有哪些可靠性机制备份节点和secondary-namenode的区别是什么工作原理","4、简述HDFS有哪些可靠性机制。备份节点和Secondary NameNode的区别是什么？（工作原理）",[13,97871,97872],{},"高可靠性的主要目标之一就是即使在系统出错的情况下也要保证数据存储的正常。常见的三种出错情况是：NameNode出错、DataNode出错和数据出错。",[13,97874,97875],{},"NameNode是HDFS集群中的单点故障所在。如果NameNode节点出现故障，是需要手工干预的。",[13,97877,97878,97879,97882],{},"HDFS通过",[22,97880,97881],{},"心跳检测","（heartbeat）来检测DataNode是否出错。正常工作情况下，每个DataNode节点周期性地向NameNode发送心跳信号。网络割裂可能破坏一部分DataNode和NameNode的通信。NameNode通过心跳信号的缺失来检测这一情况，并将这些近期不再发送心跳信号DataNode标记为“宕机”，不会再将新的I\u002FO请求发送给它们，任何存储在宕机DataNode上的数据将不再有效。DataNode的宕机可能会引起一些数据块副本系数低于指定值，NameNode会不断检测这些需要复制的数据块，一旦发现就启动复制操作。",[13,97884,97885],{},"网络传输和磁盘错误等因素都会造成数据错误。客户端再读取到数据后，会采用MD5和SHA1对数据进行校验，以确保读取到正确的数据。当客户端创建一个心得HDFS文件时，会对每一个文件块进行信息摘录，并把这些信息作为一个单独的隐藏文件保存在同一个HDFS的命名空间下。当客户端读取文件内容时，会先读取该信息文件，然后利用该信息文件对每个读取的数据块进行校验。如果校验出错，客户端可以选择从其他DataNode获取该数据块的副本，并且向NameNode报告这个文件块有错；NameNode会定期检查并重新复制这个块。",[10548,97887,97889],{"id":97888},"_1元数据备份","（1）元数据备份",[13,97891,97892],{},"在服务器系统中，发生硬件故障或者软件错误是难以避免的，所以需要对重要数据进行备份。元数据是HDFS的核心数据，可通过它对整个HDFS进行管理。FsImage和EditLog是最重要的元数据文件，所以，NameNode通常会配置支持维护多个FsImage和EditLog副本。任何对FsImage和EditLog的修改都将同步到它们的副本上。",[10548,97894,97896],{"id":97895},"_2secondary-namenode","（2）Secondary NameNode",[13,97898,97899],{},"HDFS中除了有名称节点NameNode外，还有一个辅助NameNode，称为第二名称节点Secondary NameNode。Secondary NameNode有它自身的独立角色和功能，通常认为它和NameNode是协同工作的。它是HDFS高可用的一个解决方案，但不支持热备，使用前配置即可；定期对NameNode中内存元数据进行更新和备份；默认安装在NameNode相同的节点，但是建议安装在不同的节点，以提高可靠性。",[10548,97901,97903],{"id":97902},"_3backup-node备份","（3）Backup Node备份",[13,97905,97906],{},"Hadoop2.0以后的版本新提供了一个真正意义上的备用节点，即Backup Node。Backup Node再内存中维护了一份从NameNode同步过来的FsImage，同时它还从NameNode接受EditLog文件的日志流，并把它们持久化到硬盘。Backup Node在内存中维护与NameNode一样的元数据。",[10548,97908,97910],{"id":97909},"_4hdfs-namenode-ha的高可用机制","（4）HDFS NameNode HA的高可用机制",[13,97912,97913],{},"在Hadoop1.0时代，NameNode存在单点故障问题，一旦NameNode进程不能正常工作，就会造成整个HDFS也无法使用。这可能导致生产集群上的很多框架都无法正常使用，而通过重启NameNode来进行数据恢复十分耗时。",[13,97915,97916],{},"在Hadoop2.0中，HDFS NameNode的单点故障问题得到了解决，这就是HDFS NameNode High Availability（HDFS NameNode高可用机制）。",[10548,97918,97920],{"id":97919},"_5hdfs-namenode-federation的联邦机制","（5）HDFS NameNode Federation的联邦机制",[13,97922,97923],{},"Hadoop集群的元数据信息是存放在NameNode的内存中的，当集群扩大到一定规模后，NameNode内存中存放的元数据信息可能会非常大。由于HDFS所有操作都会和NameNode进行交互，当集群很大时，NameNode的内存限制将会成为制约集群横向扩展的瓶颈。在Hadoop2.0诞生之前，HDFS中只能有一个命名空间，对于HDFS中的文件没有办法完成隔离。",[13,97925,97926],{},"在Hadoop2.0中引入了HDFS Federation联邦机制，解决了如下问题：",[49,97928,97929,97935,97941],{},[52,97930,97931,97934],{},[22,97932,97933],{},"集群扩展性","。多个NameNode分管一部分目录，使得一个集群可以扩展到更多节点，不再像Hadoop1.0中由于内存的限制而制约文件存储目录。",[52,97936,97937,97940],{},[22,97938,97939],{},"性能更高效","。多个NameNode管理不同的数据，且同时对外提供服务，将为用户提高更高的读\u002F写吞吐率。",[52,97942,97943,97946],{},[22,97944,97945],{},"良好的隔离性","。用户可以根据需要将不同的业务数据交由不同的NameNode管理，这样可以大大降低不同业务之间的影响。",[10548,97948,97950],{"id":97949},"_6hdfs-snapshots的快照机制","（6）HDFS Snapshots的快照机制",[13,97952,97953],{},"HDFS快照是文件系统在某一时刻的只读镜像，可以是一个完整的文件系统，也可以是某个目录的镜像。快照分为两种：一种是建立文件系统的索引，每次更新文件不会真正改变文件，而是开辟一个空间用来保存更改的文件；另一种是拷贝所有的文件系统。HDFS快照属于前者。",[13,97955,97956,97957],{},"HDFS快照常用于以下场景：",[22,97958,97959],{},"（快照的操作远低于外部备份的开销，可以作为备份HDFS最常用的方式）",[49,97961,97962,97965,97968,97971],{},[52,97963,97964],{},"防止用户的错误操作。管理员可以通过滚动的方式周期性地设置一个只读快照，这样在文件系统上就有若干份只读快照。如果用户意外删除一个文件，可以使用包含该文件的最新只读快照来进行恢复。",[52,97966,97967],{},"备份。管理员可以根据需求来备份整个文件系统、一个目录或单一文件。如设置一个只读快照，并使用这个快照作为整个全量备份的开始点；再如，增量备份可以通过比较两个快照的差异来产生。",[52,97969,97970],{},"试验\u002F测试。当用户需要在数据集上测试一个应用程序时，如果不做该数据集的全量备份，测试应用程序会覆盖\u002F损坏原来的生产数据集，这是非常危险的。管理员可以为用户设置一个生产数据集的快照，以便用户测试使用。在快照上的任何改变不会影响原有数据集。",[52,97972,97973],{},"灾难恢复。只读快照可以用于创建一个一致的时间点镜像，以便于拷贝到远程站点作为灾备冗余。",[10548,97975,97977],{"id":97976},"备份节点和secondary-namenode的区别","备份节点和Secondary NameNode的区别",[13,97979,97980],{},"NameNode记录了每个文件中各个块所在的数据节点的位置信息，但是并不持久化存储这些信息，而是在系统每次启动时扫描所有数据节点重构得到这些信息。只有在NameNode重启时，EditLog才会合并到FsImage文件中，从而得到一个文件系统的最新快照。但是在生产环境集群中NameNode是很少重启的，这意味着当NameNode运行很长时间后，EditLog文件会变得很大，这种情况下就会出现以下问题：",[49,97982,97983,97986,97989],{},[52,97984,97985],{},"EditLog文件变得很大后，如何去管理这个文件？",[52,97987,97988],{},"NameNode的重启会花费很长时间，因为有很多改动要合并到FsImage文件上；",[52,97990,97991],{},"如果NameNode宕机，那就丢失了很多改动，因为此时的FsImage文件时间戳比较旧。",[13,97993,97994],{},"Secondary NameNode就是为了帮助解决上述问题提出的，它的主要职责是将NameNode的EditLog合并到FsImage文件中，即对元数据进行定期更新和备份。",[10548,97996,97797],{"id":97997},"详细过程-2",[49,97999,98000,98003,98006,98009,98012],{},[52,98001,98002],{},"Secondary NameNode通知NameNode切换EditLog文件；",[52,98004,98005],{},"Secondary NameNode通过网络从NameNode下载FsImage和EditLog；",[52,98007,98008],{},"Secondary NameNode将FsImage载入内存，然后开始合并EditLog日志；",[52,98010,98011],{},"Secondary NameNode将新的FsImage发回NameNode；",[52,98013,98014],{},"NameNode用新的FsImage替换旧的FsImage。",[13,98016,98017],{},"NameNode在重启时使用新的FsImage，从而减少启动时合并EditLog文件的时间。Secondary NameNode的整个目的实在HDFS中提供一个Checkpoint Node。",[7759,98019,98021],{"id":98020},"_5试述hdfs一个名称节点的优点缺点","5、试述HDFS一个名称节点的优点、缺点",[10548,98023,20689],{"id":20689},[49,98025,98026,98029],{},[52,98027,98028],{},"一个名称节点，负责所有元数据的管理，简化分布式文件系统结构，可以保证数据不会脱离名称节点的控制；",[52,98030,98031],{},"用户数据不会经过名称节点，减轻名称节点负担，方便数据管理，数据节点扩展不会带来性能下降",[10548,98033,20692],{"id":20692},[49,98035,98036,98042,98048,98054],{},[52,98037,98038,98041],{},[22,98039,98040],{},"命名空间限制","；命名空间中的对象如文件、目录、文件块、数据节点等这些信息占用一定字节。NameNode保存全局命名空间，NameNode的内存有上限，因此保存的命名空间的大小有限制。",[52,98043,98044,98047],{},[22,98045,98046],{},"性能瓶颈","。整个分布式文件系统的吞吐量受限于单个名称节点的吞吐量。",[52,98049,98050,98053],{},[22,98051,98052],{},"隔离问题","。由于集群问题中只有一个名称节点，只有一个命名空间，因此无法对不同应用程序进行隔离。",[52,98055,98056,98059],{},[22,98057,98058],{},"集群可用性","。唯一的名称节点发送故障，导致整个节点变得不可用。",[23289,98061],{},[107,98063,98065],{"id":98064},"第四章-分布式计算框架mapreduce","第四章 分布式计算框架MapReduce",[7759,98067,98069],{"id":98068},"_1试述mapreduce作业的执行流程","1、试述MapReduce作业的执行流程",[13,98071,98072],{},"MapReduce作业的执行流程主要包括InputFormat、Map、Shuffle、Reduce、OutputFormat五个阶段。",[13,98074,98075],{},[617,98076],{"alt":98077,"src":98078},"MapReduce的作业执行流程","img\u002F4.1MapReduce%E7%9A%84%E4%BD%9C%E4%B8%9A%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B.jpg",[10548,98080,98082],{"id":98081},"_1inputformat","（1）InputFormat",[13,98084,98085,98086,98089],{},"InputFormat模块首先",[22,98087,98088],{},"对输入数据做预处理","，比如验证输入格式是否符合输入定义；然后将输入文件切分为逻辑上的多个InputSplit（InputSplit是MapReduce对文件进行处理和运算的输入单位，并没有对文件进行实际切割）；由于InputSplit是逻辑切分而非物理切分，所以还需要通过RecordReader根据InputSplit中的信息来处理InputSplit中的具体记录，加载数据并转换为适合Map任务读取的键值对\u003Ckey, value>，输入给Map任务。",[10548,98091,98093],{"id":98092},"_2map","（2）Map",[13,98095,98096],{},"Map模块会根据用户自定义的映射规则，输出一系列的\u003Ckey, value>作为中间结果。",[10548,98098,98100],{"id":98099},"_3shuffle","（3）Shuffle",[13,98102,98103,98104,98107],{},"为了让Reduce可以并行处理Map的结果，需要对Map的输出进行一定的",[22,98105,98106],{},"排序、分区、合并、归并","等操作，得到\u003Ckey, List(value)>形式的中间结果，再交给对应的Reduce进行处理。这个过程叫做Shuffle。",[10548,98109,98111],{"id":98110},"_4reduce","(4)Reduce",[13,98113,98114],{},"Reduce以一系列的\u003Ckey, List(value)>中间结果作为输入，执行用户定义的逻辑，输出\u003Ckey, value>形式的结果给OutputFormat。",[10548,98116,98118],{"id":98117},"_5outputformat","（5）OutputFormat",[13,98120,98121],{},"OutputFormat模块会验证输出目录是否已经存在以及输出结果类型是否符合配置文件中的配置类型，如果都满足，就将Reduce的结果输出到分布式系统。",[7759,98123,98125],{"id":98124},"_2与java类型相比较mapreduce中定义的数据类型有哪些特点","2、与Java类型相比较，MapReduce中定义的数据类型有哪些特点？",[10548,98127,98129],{"id":98128},"mapreduce中常见的数据类型","MapReduce中常见的数据类型",[8366,98131,98132,98141],{},[8369,98133,98134],{},[8372,98135,98136,98139],{},[8375,98137,98138],{"align":9247},"数据类型",[8375,98140,42815],{"align":9247},[8386,98142,98143,98151,98159,98167,98175,98183,98191,98199],{},[8372,98144,98145,98148],{},[8391,98146,98147],{"align":9247},"IntWritable",[8391,98149,98150],{"align":9247},"整型类型",[8372,98152,98153,98156],{},[8391,98154,98155],{"align":9247},"LongWritable",[8391,98157,98158],{"align":9247},"长整型类型",[8372,98160,98161,98164],{},[8391,98162,98163],{"align":9247},"FloatWritable",[8391,98165,98166],{"align":9247},"单精度浮点数类型",[8372,98168,98169,98172],{},[8391,98170,98171],{"align":9247},"DoubleWritable",[8391,98173,98174],{"align":9247},"双精度浮点数类型",[8372,98176,98177,98180],{},[8391,98178,98179],{"align":9247},"ByteWritable",[8391,98181,98182],{"align":9247},"字节类型",[8372,98184,98185,98188],{},[8391,98186,98187],{"align":9247},"BooleanWritable",[8391,98189,98190],{"align":9247},"布尔类型",[8372,98192,98193,98196],{},[8391,98194,98195],{"align":9247},"Text",[8391,98197,98198],{"align":9247},"UTF-8格式存储的文本类型",[8372,98200,98201,98204],{},[8391,98202,98203],{"align":9247},"NullWritable",[8391,98205,98206],{"align":9247},"空对象",[13,98208,98209],{},"（1）MapReduce是集群运算，因此必然会在执行期间进行网络传输，然而在网络中传输的数据必须是可序列化的类型。",[13,98211,98212],{},"（2）为了良好地匹配MapReduce专门设计了一套数据类型。",[13,98214,98215],{},[22,98216,98217],{},"（简单来说就是适配Hadoop设计的一套序列化数据类型）",[7759,98219,98221],{"id":98220},"_3试述shuffle机制各个阶段的主要作用重点","3、试述Shuffle机制各个阶段的主要作用（重点）",[10548,98223,98225],{"id":98224},"shuffle的作用","Shuffle的作用",[13,98227,98228],{},"对Map的输出进行一定的排序、分区、合并、归并等操作，得到\u003Ckey, List(value)>形式的中间结果，再交给对应的Reduce进行处理。",[13,98230,98231],{},"（1）Shuffle会持续接收Map阶段发来的数据，并将数据写到一个“环形缓冲区”中。缓冲区被填满时就会将覆盖掉的部分数据溢出存放到“溢出文件”中。",[13,98233,98234],{},"（2）Shuffle会对溢出文件中的数据进行排序，然后再将排序后的数据进行分区。",[13,98236,98237],{},"（3）Shuffle会生成很多个排序且分区后的溢出文件，最后会将所有溢出文件中相同分区号的内容进行合并，形成最终的第0区内容、第1区内容……",[13,98239,98240],{},[22,98241,98242],{},"（以上为书本上简单的Shuffle作用介绍，下面是网络上给出的各阶段的具体作用）",[10548,98244,98246],{"id":98245},"_1collect阶段","（1）collect阶段",[13,98248,98249],{},"将MapTask的结果输出到默认大小为 100M 的环形缓冲区，保存的是 key\u002Fvalue，Partition 分区信息等。",[10548,98251,98253],{"id":98252},"_2spill阶段","（2）spill阶段",[13,98255,98256],{},"当内存中的数据量达到一定的阀值的时候，就会将数据写入本地磁盘，在将数据写入磁盘之前需要对数据进行一次排序的操作，如果配置了 combiner，还会将有相同分区号和 key 的数据进行排序。",[10548,98258,98260],{"id":98259},"_3merge阶段","（3）merge阶段",[13,98262,98263],{},"把所有溢出的临时文件进行一次合并操作，以确保一个MapTask 最终只产生一个中间数据文件。",[10548,98265,98267],{"id":98266},"_4copy阶段","（4）copy阶段",[13,98269,98270],{},"ReduceTask 启动 Fetcher 线程到已经完成 MapTask 的节点上复制一份属于自己的数据，这些数据默认会保存在内存的缓冲区中，当内存的缓冲区达到一定的阀值的时候，就会将数据写到磁盘之上。",[10548,98272,98274],{"id":98273},"_5merge阶段","（5）merge阶段",[13,98276,98277],{},"在 ReduceTask 远程复制数据的同时，会在后台开启两个线程对内存到本地的数据文件进行合并操作。",[10548,98279,98281],{"id":98280},"_6sort阶段","（6）sort阶段",[13,98283,98284],{},"在对数据进行合并的同时，会进行排序操作，由于 MapTask阶段已经对数据进行了局部的排序，ReduceTask 只需保证 Copy 的数据的最终整体有效性即可。",[23289,98286],{},[107,98288,98290],{"id":98289},"第五章-统一资源管理和调度框架yarn","第五章 统一资源管理和调度框架YARN",[7759,98292,98294],{"id":98293},"_1试述yarn与mapreduce10相比有哪些优势","1、试述YARN与MapReduce1.0相比有哪些优势",[10548,98296,98298],{"id":98297},"简述mapreduce10存在的问题","简述MapReduce1.0存在的问题",[13,98300,98301],{},"在Hadoop1.0中，MapReduce采用Master\u002FSlave架构，有两类守护进程控制作业的执行过程，即一个JobTracker和多个TaskTracker。JobTracker负责资源管理和作业调度；TaskTracker定期向JobTracker汇报本节点的健康状况、资源使用情况、任务执行情况以及接受来自JobTracker的命令并执行。随着集群规模负载的增加，MapReduce JobTracker在内存消耗、扩展性、可靠性、性能等方面暴露出了各种缺点，具体包括以下几个方面：",[13,98303,98304],{},"（1）单点故障问题。",[13,98306,98307],{},"（2）可扩展性瓶颈。",[13,98309,98310],{},"（3）资源划分不合理。",[13,98312,98313],{},"（4）仅支持MapReduce一个计算框架。",[10548,98315,98317],{"id":98316},"yarn","YARN",[13,98319,98320],{},"Apache Hadoop YARN是Hadoop2.0资源管理和调度框架，其设计基本思路就是“放权”，即不让JobTracker承担过多功能，把MapReduce1.0中JobTracker三大功能资源管理、任务调度和任务监控进行拆分，分别交给不同的新组件承担。重新设计后YARN包括ResourceManager、ApplicationMaster和NodeManager，其中，ResourceManager负责资源管理，ApplicationMaster负责任务调度和任务监控，NodeManage负责承担原TaskTracker的功能。且源资源被划分的Slot重新设计为容器Container，NodeManage能够启动和监控容器Container。另外，原JobTracker负责存储已完成作业的作业历史。",[10548,98322,98324],{"id":98323},"mapreduce10与yarn的组成比较","Mapreduce1.0与YARN的组成比较",[8366,98326,98327,98336],{},[8369,98328,98329],{},[8372,98330,98331,98334],{},[8375,98332,98333],{"align":9247},"MapReduce1.0",[8375,98335,98317],{"align":9247},[8386,98337,98338,98346,98353],{},[8372,98339,98340,98343],{},[8391,98341,98342],{"align":9247},"JobTracker",[8391,98344,98345],{"align":9247},"ResourceManager、ApplicationMaster、Timeline Server",[8372,98347,98348,98351],{},[8391,98349,98350],{"align":9247},"TaskTracker",[8391,98352,43024],{"align":9247},[8372,98354,98355,98358],{},[8391,98356,98357],{"align":9247},"Slot",[8391,98359,98360],{"align":9247},"Container",[13,98362,98363],{},"在Hadoop1.0中，MapReduce既是一个计算框架，又是一个资源管理和调度框架。到了Hadoop2.0以后，MapReduce中资源管理和调度功能被单独分割出来形成YARN。YARN是一个纯粹的资源管理调度框架，被剥离的资源管理调度功能的MapReduce变成了MRv2。MRv2是运行在YARN上的一个纯粹的计算框架。",[39316,98365,98366],{"id":98366},"优势",[10548,98368,98370],{"id":98369},"_1可扩展性scalability","（1）可扩展性【Scalability】",[13,98372,98373],{},"与MapReduce1.0相比，YARN可以在更大规模的集群上运行。YARN利用ResourceManager和ApplicationMaster分离的架构优点可以扩展将近10000个节点和100000个任务。另外，YARN Federation的联邦机制进一步增强了集群的水平横向扩展性。",[10548,98375,98377],{"id":98376},"_2可用性availablity","（2）可用性【Availablity】",[13,98379,98380],{},"当守护进程失败时，通常需要另一个守护进程复制接管工作所需的状态，以便其继续提供服务，从而获得高可用性。",[13,98382,98383],{},"YARn对MapReduce1.0的体系架构进行了重新设计，ResourceManager和ApplicationMaster分别承担了MapReduce1.0中JobTracker的功能，高可用的服务随之成为一个分而治之的问题：先为ResourceManager提供高可用性，再为YARN应用提供高可用性。YARN的ResourceManagerHA特性通过Active\u002FStandby ResourceManager保证了YARN的高可用性；ResourceManager Restart特性保证了若ResourceManager发生单点故障，ResourceManager能尽快自动重启。",[10548,98385,98387],{"id":98386},"_3利用率utillzation","（3）利用率【Utillzation】",[13,98389,98390],{},"MapReduce1.0使用Slot表示各个节点上的计算资源。区分Slot类别的资源管理方案在一定程度上降低了Slot的利用率。同时，这种基于无类别Slot的资源划分粒度过大，往往会造成资源利用率过高或者过低。",[13,98392,98393],{},"在YARN中，一个NodeManager管理一个资源池，而不是指定固定数目的Slot。YARN上运行的MapReduce不会出现MapReduce1.0中由于集群中只有Map Slot可用而导致Reduce Task必须等待的情况。如果能够获取运行任务的资源，那么运行应用程序就会正常进行。而且，YARN中的资源是精细化管理的，每个应用程序都能够按需请求资源，而不是请求一个不可分割的、对于特定任务而言可能太大（浪费资源）或太小（可能导致失败）的Slot。",[10548,98395,98397],{"id":98396},"_4多租户multitenancy","（4）多租户【Multitenancy】",[13,98399,98400],{},"在某种程度上可以说，YARN最大的优点是向MapReduce以外的其他分布式计算框架开放了Hadoop。MapReduce仅是许多YARN应用中的一个，Spark、Tez、Storm等计算框架也都可以运行在YARN上。另外，用户甚至可以在同一个YARN集群上运行不同版本的MapReduce，这使得升级MapReduce更好管理。",[7759,98402,98404],{"id":98403},"_2试述yarn体系架构中三大核心组件及各自功能","2、试述YARN体系架构中三大核心组件及各自功能",[13,98406,98407],{},"YARN采用主从架构（Master\u002FSlave），其核心组件包括ResourceManager、ApplicationMaster和NodeManager三个。其中，ResourceManager是主进程，NodeManager是从进程，一个ResourceManager对应多个NodeManager，每个应用程序拥有一个ApplicationMaster。",[10548,98409,98411],{"id":98410},"_1resourcemanager","（1）ResourceManager",[13,98413,98414],{},"整个集群只有一个ResourceManager，负责集群资源的统一管理和调度，具体承担的功能包括：",[49,98416,98417,98420,98423],{},[52,98418,98419],{},"处理来自客户端的请求，包括启动\u002F终止应用程序；",[52,98421,98422],{},"启动\u002F监控ApplicationMaster。一旦某个ApplicationMaster出现故障，ResourceManager将会在另一个节点上启动ApplicationMaster。",[52,98424,98425],{},"监控NodeManager，接受NodeManager汇报的心跳信息并分配任务给NodeManager去执行。一旦某个NodeManager出现故障，标记该NodeManager的任务，并告诉对应的ApplicationMaster如何处理。",[10548,98427,98429],{"id":98428},"_2nodemanager","（2）NodeManager",[13,98431,98432],{},"整个集群有多个NodeManager，负责单节点资源的管理和使用，具体承担的功能包括：",[49,98434,98435,98438],{},[52,98436,98437],{},"周期性向ResourceManager汇报本节点上的资源的使用情况和各个Container的运行状态。",[52,98439,98440],{},"接受并处理来自ApplicationMaster的Container启动\u002F停止的各种命令。",[10548,98442,98444],{"id":98443},"_3applicationmaster","（3）ApplicationMaster",[13,98446,98447],{},"每个应用程序拥有一个AppliationMaster，负责管理应用资源，具体承担的功能包括：",[49,98449,98450,98453,98456,98459,98462],{},[52,98451,98452],{},"数据切分。",[52,98454,98455],{},"为应用程序\u002F作业向ResourceManager申请资源（Container），并分配给内部任务。",[52,98457,98458],{},"与NodeManager通信，以停止\u002F启动任务。",[52,98460,98461],{},"任务监控和容错，在任务执行失败时重新为该任务申请资源并重启任务。",[52,98463,98464],{},"接收并处理ResourceManager发出的命令。",[7759,98466,98468],{"id":98467},"_3试述联邦机制yarn-federation是为了解决何种问题而设计的并简述其实现原理","3、试述联邦机制YARN Federation是为了解决何种问题而设计的，并简述其实现原理",[13,98470,98471],{},"YARN可以扩展数千个节点。YARN的可伸缩性由ResourceManager确定，并且与节点数、活跃的应用程序、活跃的容器和心跳概率成比例。降低心跳可以提高可扩展性，但对利用率有害。基于联邦（Federation）的方法，通过联合多个YARN子集，可以将单个YARN集群扩展到数万个节点。YARN Federation是指将大的（10~100千个节点）集群划分成子集群的较小单元，每个集群具有自己的ResourceManager和NodeManager。联合系统（Federation System）将这些子集群拼接在一起，使它们成为应用程序的一个大型YARN集群。在此联合环境中运行的应用程序将看到单个大型YARN集群，并且能够在联合集群的任何节点上计划任务。联合集群将与子集群的ResourceManager协商并为应用程序提供资源，目标是允许单个作业无缝地“跨越”子集群。",[13,98473,98474],{},"这种设计在结构上是可扩展的，因为通过限制每个ResourceManager负责的节点数量，并且采用适当的策略可保证大多数应用程序驻留在单个子集群中，因此每个ResourceManager看到的应用程序数量也是有限的。这意味着几乎可以通过简单地添加子集的方法来线性扩展。",[23289,98476],{},[107,98478,98480],{"id":98479},"第六章-分布式协调框架zookeeper","第六章 分布式协调框架ZooKeeper",[13,98482,98483],{},"Apache ZooKeeper是一个分布式的、开放源码的分布式应用程序协调框架，是Geogle Chubby的开源实现，它为大型分布式系统中的各种协调问题提供了一个解决方案，主要用于解决分布式应用中经常遇到的一些数据管理问题，如配置问题、命名服务、分布式同步、集群管理等。",[13,98485,98486],{},[22,98487,98488],{},"（详细了解参考书本P155 6.2.4 ZooKeeper的基本概念或者自行百度）",[7759,98490,98492],{"id":98491},"_1试述zookeeper如何保证分布式数据的原子性操作","1、试述ZooKeeper如何保证分布式数据的原子性操作",[13,98494,98495,98496,98498],{},"ZooKeeper中为数据节点引入了",[22,98497,42812],{},"的概念，每个数据节点都具有三种类型的版本信息，对数据节点的任何更新操作都会引起版本的变化。",[10548,98500,98502],{"id":98501},"_1version","（1）version",[13,98504,98505],{},"当前数据节点数据内容的版本号**（强调的是变更次数，也是保证分布式数据的原子性操作的关键）**",[10548,98507,98509],{"id":98508},"_2cversion","（2）cversion",[13,98511,98512],{},"当前数据节点子节点的版本号",[10548,98514,98516],{"id":98515},"_3aversion","（3）aversion",[13,98518,98519],{},"当前数据节点的ACl版本号",[13,98521,98522,98523,98526],{},"ZooKeeper中的版本概念和传统意义上的软件版本有很大的区别，它表示对数据节点的数据内容、子节点列表或节点ACL信息的修改次数。在ZooKeeper中，version属性正是用来",[22,98524,98525],{},"实现乐观锁机制","中的“写入校验”的。在写入校验阶段，事务会检查数据在读取阶段后是否有其他事务对数据进行过更新，以确保数据更新的一致性。",[7759,98528,98530],{"id":98529},"_2试述zookeeper如何保障数据安全","2、试述ZooKeeper如何保障数据安全",[13,98532,98533],{},"ZooKeeper提供了一套完善的ACL（Acess Control List）权限控制机制来保障数据的安全。ACL即访问控制列表，是一种相对来说比较新颖且更细粒度的权限管理方式，可以针对任意用户和组进行细粒度的权限控制。",[10548,98535,98537],{"id":98536},"_1权限模式","（1）权限模式",[13,98539,98540],{},"权限模式用来确定权限验证过程中使用的检验策略。在ZooKeeper中，开发人员使用最多的就是以下四种权限模式。",[49,98542,98543,98551,98559,98567],{},[52,98544,98545,98546],{},"IP\n",[49,98547,98548],{},[52,98549,98550],{},"IP模式通过IP地址粒度进行权限控制。",[52,98552,98553,98554],{},"Digest\n",[49,98555,98556],{},[52,98557,98558],{},"Digest是最常用的控制权限模式，也更符合对于权限控制的认识，它以类似于“username:password”形式的权限标识来进行权限配置，通过区分不同应用来进行权限控制。但通过“username:password”形式配置了权限标识后，ZooKeeper会对其进行两次编码处理，分别是SHA-1算法加密和BASE64编码。",[52,98560,98561,98562],{},"World\n",[49,98563,98564],{},[52,98565,98566],{},"World是一种最开放的权限控制模式。事实上这种权限控制方式几乎没有任何作用，数据节点的访问权限对所有用户开放，即所有用户都可以在不进行任何权限校验的情况下操作该数据节点。另外，World模式也可以看作是一种特殊的Digest模式，它只有一个权限标识“world:anyone”。",[52,98568,98569,98570],{},"Super\n",[49,98571,98572],{},[52,98573,98574],{},"Super模式顾名思义就是超级用户的意思，也是一种特殊的Digest模式。在Super模式下，超级用户可以对任意ZooKeeper上的数据节点进行任何操作。",[10548,98576,98578],{"id":98577},"_2授权对象id","（2）授权对象【ID】",[13,98580,98581],{},"授权对象指的是权限赋予的用户或一个指定的实体，例如IP地址或机器等。在不同的授权模式下，授权对象是不同的。",[10548,98583,98585],{"id":98584},"_3权限","（3）权限",[13,98587,98588],{},"权限就是指那些通过权限检查后可以被允许执行的操作。在ZooKeeper中，所有对数据的操作权限被分为以下五大类：",[49,98590,98591,98594,98597,98600,98603],{},[52,98592,98593],{},"CREATE【C】：数据节点的创建权限，允许授权对象在该数据节点下创建子节点。",[52,98595,98596],{},"DELETE【D】：子节点的删除权限，允许授权对象删除该数据节点下的子节点。",[52,98598,98599],{},"READ【R】：数据节点的读取权限，允许授权对象访问该数据节点并读取其数据内容或子节点列表等。",[52,98601,98602],{},"WRITE【W】：数据节点的更新权限，允许授权对象对该数据节点进行更新操作。",[52,98604,98605],{},"ADMIN【A】：数据节点的管理权限，允许授权对象对数据节点进行ACl相关的设置操作。",[7759,98607,98609],{"id":98608},"_3试述zookeeper数据一致性的核心算法zab","3、试述ZooKeeper数据一致性的核心算法ZAB",[13,98611,98612],{},"ZooKeeper并没有完全采用Paxos算法，而是使用了一种称为ZooKeeper Atomic Broadcast（ZAB，ZooKeeper原子消息广播协议）的协议作为其数据一致性的核心算法。",[13,98614,98615],{},"ZAB协议是专门为分布式协调系统ZooKeeper设计的一种支持崩溃恢复的原子广播协议。基于该协议ZooKeeper实现了一种主备模式的系统架构来保持集群中各副本之间数据的一致性。具体来说，ZooKeeper使用一个单一的主进程来接收并处理客户端的所有事务请求，并采用ZAB的原子广播协议将服务器数据的状态进行变更，以事务Proposal的形式广播到所有的副本进程上去。ZAB协议的主备模型架构保证了同一时刻集群只能够有一个主进程来广播服务器的状态变更，因此能够很好的处理客户端大量的并发请求。另一方面，考虑到在分布式环境中，顺序执行的一些状态在变更其前后会存在一定的依赖关系，有些状态变更必须依赖于比它早生成的那些状态变更。",[13,98617,98618],{},"ZAB协议的核心是定义了那些会改变ZooKeeper服务器数据状态的事务请求的处理方式，即所有事务请求必须由一个全局唯一的服务器来协调处理，这个服务器就是Leader，而其他服务器则成为Follower。Leader服务器负责将一个客户端事务请求转换成一个事务Proposal（提议），并将该Proposal分发给集群中的所有Follower，之后Leader需要等待所有Follower的反馈。一旦超过半数Follower服务器进行了正确的反馈后，那么Leader就会再次向所有的Follower分发Commit消息，要求其将前一个Proposal进行提交。",[10548,98620,98621],{"id":98621},"具体内容",[13,98623,98624],{},"ZAB协议包括崩溃恢复和消息广播两种基本模式。",[13,98626,98627],{},"当整个服务器框架在启动过程中，或是当Leader服务器出现网络中断、崩溃推出与重启等异常情况时，ZAB协议就会进入崩溃恢复模式并选举产生新的Leader服务器。当选举产生了新的Leader服务器，同时集群中已经有过半的机器与该Leader服务器完成了状态同步后，ZAB协议就会退出崩溃恢复模式进入消息广播模式。其中，所谓的状态同步是指数据同步，用来保证集群中存在过半的机器能够和Leader服务器的数据状态保持一致。",[13,98629,98630],{},"ZooKeeper只允许唯一的一个Leader服务器来进行事务请求的处理。Leader服务器在接收到客户端的事务请求后，会生成对应的事务提议并发起一轮广播协议；而如果集群中的其他机器接收到客户端的事务请求，那么这些非Leader服务器会首先将这个事务请求转发给Leader服务器。",[13,98632,98633],{},"当Leader出现崩溃退出或是机器重启，亦或是集群中已经不存在过半的服务器与该Leader保持正常通信时，那么在重新开始新一轮的原子广播事务操作之前，所有进程首先会使用崩溃恢复协议来使彼此达到一个一致的状态，于是整个ZAB流程就会从消息广播模式进入到崩溃恢复模式。",[13,98635,98636],{},"一个机器要成为新的Leader，必须获得过半进程的支持，同时由于每个进程都有可能会崩溃，因此，在ZAB协议运行过程中，前后会出现多个Leader，并且每个进程也有可能会多次成为Leader。进入崩溃恢复模式后，只要集群中存在过半的服务器能够彼此进行正常通信，那么就可以产生一个新的Leader并再次进入消息广播模式。",[23289,98638],{},[107,98640,98642],{"id":98641},"第七章-分布式数据库hbase","第七章 分布式数据库HBase",[7759,98644,98646],{"id":98645},"_1简述hbase数据模型","1、简述HBase数据模型",[13,98648,98649],{},"逻辑上，HBase以表的形式呈现给最终用户；物理上，HBase以文件的形式存储在HDFS中。为了高效管理数据，HBase设计的一些元数据库表来提高数据存取效率。",[10548,98651,98652],{"id":98652},"逻辑模型",[13,98654,98655],{},"HBase以表（Table）的形式存储数据，每个表由行和列组成，每个列属于一个特定的列族（Column Family）。表中行和列确定的存储单元称为一个元素（Cell），每个元素保存了同一份数据的多个版本，由时间戳（Time Stamp）来标识。行键（Row Key）是数据行在表中的唯一标识，并作为检索记录的主键。在HBase中访问表中的行只有三种方式：通过单个行键访问、给定行键的范围扫描、全表扫描。行键可以是任意字符串，默认按字段顺序存储。表中的列定义为\u003Cfamiliy>:\u003Cqualifier>（\u003C列族>:\u003C限定符>），通过列族和限定符两部分可以唯一指定一个数据的存储列。元素由行键、列（\u003C列族>:\u003C限定符>）和时间戳唯一确定，元素中的数据以字节码的形式存储，没有类型之分。",[13,98657,98658],{},[617,98659],{"alt":98660,"src":98661},"HBase逻辑模型设计的相关概念及说明","img\u002F7.1HBase%E9%80%BB%E8%BE%91%E6%A8%A1%E5%9E%8B%E8%AE%BE%E8%AE%A1%E7%9A%84%E7%9B%B8%E5%85%B3%E6%A6%82%E5%BF%B5%E5%8F%8A%E8%AF%B4%E6%98%8E.jpg",[10548,98663,98664],{"id":98664},"物理模型",[13,98666,98667],{},"HBase是按照列存储的稀疏行\u002F列矩阵，其物理模型实际上就是把逻辑模型中的一个行进行分割，并按照列族存储。HBase会按照列族分别存储，属于同一个列族的数据保存在一起。同时，和每个列族一起存放的还包括行键和时间戳。",[13,98669,98670],{},"在表的逻辑视图中，有些列是空的，即这些列不存在值。在物理视图中，这些空的列不会被存储成NULL，而是根本就不会被存储。当请求这些空白单元格的时候，会返回NULL。",[13,98672,98673],{},"HBase中所有数据文件都存储在HDFS文件系统上，主要包括HFile和HLog两种文件类型。",[10548,98675,98676],{"id":98676},"元数据表",[13,98678,98679],{},"HBase的大部分操作都是在HRegionServer中完成，客户端想要插入、删除和查询数据都需要先找到对应的HRegionServer。客户端需要通过两个元数据表来找到HRegionServer和HRegion之间的对应关系，即-ROOT-和.META。它们是HBase的两张系统表，用于管理普通数据，其存储和操作方式与普通表相似，差别在于它们存储的是Region的分布情况和每个Region的详细信息，而不是普通数据。",[13,98681,98682],{},"HBase使用类似B+树的三层结构来保存Region位置信息。",[13,98684,98685],{},[617,98686],{"alt":98676,"src":98687},"img\u002F7.3%E5%85%83%E6%95%B0%E6%8D%AE%E8%A1%A8.jpg",[7759,98689,98691],{"id":98690},"_2简述hbase的体系架构","2、简述HBase的体系架构",[13,98693,98694],{},"HBase采用Master\u002FSlave架构，HBase集群成员包括Client、ZooKeeper集群、HMaster节点、HRegionServer节点。在底层，HBase将数据存储于HDFS中。",[13,98696,98697],{},[617,98698],{"alt":98699,"src":98700},"HBase体系架构","img\u002F7.4HBase%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84.jpg",[10548,98702,98704],{"id":98703},"_1client","（1）Client",[13,98706,98707],{},"HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信。对于管理类操作，Client与HMaster进行RPC；对于数据读\u002F写操作，Client与HRegionServer进行RPC。客户端包含访问HBase的接口，通常维护一些缓存来加快HBase数据的访问速度。",[10548,98709,98710],{"id":43941},"（2）ZooKeeper",[13,98712,98713],{},"ZooKeeper作为管理者，保证任何时候集群中只有一个Master。对于HBase，ZooKeeper提供以下基本功能：",[49,98715,98716,98719,98722],{},[52,98717,98718],{},"存储-ROOT-表、HMaster和HRegionServer的地址。",[52,98720,98721],{},"通过ZooKeeper，HMaster可以随时感知到各个HRegionServer的健康状态。",[52,98723,98724],{},"ZooKeeper避免HMaster单点故障问题。HBase中可以启动多个Master，通过ZooKeeper的选举机制确保只有一个为当前HBase集群的Master。",[10548,98726,98728],{"id":98727},"_3hmaster","（3）HMaster",[13,98730,98731],{},"HMaster是HBase的主服务程序。HBase中可以启动多个HMaster，通过ZooKeeper选举机制保证每个时刻只有一个HMaster运行。HMaster主要完成以下任务：",[49,98733,98734,98737,98740,98743,98746],{},[52,98735,98736],{},"管理HRegionServer，实现其负载均衡。",[52,98738,98739],{},"管理和分配HRegion。",[52,98741,98742],{},"实现DDL操作，即NameSpace和Table及Column Family的增删改等。",[52,98744,98745],{},"管理NameSpace和Table的元数据（实际存储在HDFS上）。",[52,98747,98748],{},"权限控制（ACL）。",[10548,98750,98752],{"id":98751},"_4hregionserver","（4）HRegionServer",[13,98754,98755],{},"HRegionServer是HBase的从服务程序。HBase集群中可以有多个HRegionServer，其主要功能主要包括以下几个方面：",[49,98757,98758,98761,98764,98767],{},[52,98759,98760],{},"存放和管理本地HRegion。",[52,98762,98763],{},"读\u002F写HDFS，管理Table中的数据。",[52,98765,98766],{},"Client直接通过HRegionServer读\u002F写数据（从HMaster中获取元数据，找到RowKey所在的HRegion\u002FHRegionServer后）进行数据读写。",[52,98768,98769],{},"HRegionServer和DataNode一般会放在相同的Server上，以实现数据的本地化。",[23289,98771],{},[107,98773,98775],{"id":98774},"第八章-数据仓库hive","第八章 数据仓库Hive",[7759,98777,98779],{"id":98778},"_1简述hive和传统关系数据库的区别和联系","1、简述Hive和传统关系数据库的区别和联系",[13,98781,98782,98783,98786],{},"Hive由Facebook公司开源，主要用于",[22,98784,98785],{},"解决海量结构化日志数据的离线分析","。Hive是一个基于Hadoop的数据仓库工具，可以将结构化的数据文件映射为一张表，并提供了类SQL查询语言HiveQL。Hive本质是将HiveQL语句转换成MapReduce程序，并提交到Hadoop集群上运行。Hive可让不熟悉MapReduce的开发人员直接编写SQL语句来实现对大规模数据的统计分析操作，大大降低了学习门槛，同时也提升了开发效率。Hive处理的数据存储在HDFS上，分析数据底层的实现是MapReduce，程序运行在YARN上。",[13,98788,98789],{},[617,98790],{"alt":98791,"src":98792},"Hive的基本工作流程","img\u002F8.1Hive%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B.jpg",[13,98794,98795],{},"与传统数据库相比，从内部实现原理和HiveQL语言的运行机制来看，Hive具有如下特征：",[10548,98797,98799],{"id":98798},"_1查询语言与sql接近","（1）查询语言与SQL接近",[13,98801,98802],{},"由于SQL被广泛应用在数据仓库中，因此研究人员专门针对Hive的特性设计了类SQL的查询语言HiveQL，熟悉SQL开发的开发者可以很方便地使用Hive进行开发。Hive对查询语句的解释、优化、生成查询计划是由Hive引擎完成的。",[10548,98804,98806],{"id":98805},"_2并行执行","（2）并行执行",[13,98808,98809],{},"Hive中大多数查询的执行是通用Hadoop提供的MapReduce来实现的，查询计划被转化为MapReduce任务，在Hadoop中执行（注意：有些查询没有MR任务，如select * from table）。而传统数据库通常由自己的执行引擎。",[10548,98811,98813],{"id":98812},"_3使用hdfs存储","（3）使用HDFS存储",[13,98815,98816],{},"Hive是建立在Hadoop之上的，所有Hive数据都存储在HDFS中。而数据库则可以将数据保存在块设备或者本地文件系统中。Hadoop和Hive都采用UTF-8编码。",[10548,98818,98820],{"id":98819},"_4支持多种数据格式","（4）支持多种数据格式",[13,98822,98823],{},"Hive中没有定义专门的数据格式，数据格式可以由用户指定。用户定义数据格式需要指定三个属性，即列分隔符（通常为空格、“\\t”、“\\x001”）、行分隔符（“\\n”）以及读取文件数据的方法（Hive默认的文件格式包括TextFile、SequenceFile、RCFile等）。由于在加载数据的过程中，不需要从用户数据格式到Hive定义的数据格式的转换，因此，Hive在加载的过程中不会对数据本身进行任何修改，只是将数据内容复制或者移动到相应的HDFS目录中。而在数据库中，不同的数据库有不同的存储引擎，定义了自己的数据格式。所有数据都会按照一定的组织存储，因此，数据库加载数据的过程会比较耗时。",[10548,98825,98827],{"id":98826},"_5不支持数据更新","（5）不支持数据更新",[13,98829,98830],{},"由于Hive是针对数据仓库应用设计的，因此，Hive中不支持对数据的修改和添加，所有的数据都是在加载时确定好的。而数据库中的数据通常是需要反复进行修改的，因此可以使用INSERT INTO…VALUES添加数据，使用UPDATES…SET修改数据。",[10548,98832,98834],{"id":98833},"_6不支持索引","（6）不支持索引",[13,98836,98837],{},"Hive要访问数据中满足条件的特定值时，需要暴力扫描整个数据，因此访问延迟较高。由于MapReduce的引入，Hive可以并行访问数据，因此即使没有索引，对于大数据量的访问，Hive仍然可以体现出优势。在数据库中，通常会针对一个或者几个列建立索引，因此对于少量特定条件的数据的访问，数据库可以有很高的效率和较低的延迟。",[10548,98839,98841],{"id":98840},"_7执行延迟高","（7）执行延迟高",[13,98843,98844],{},"Hive在查询数据的时候，由于没有索引，需要扫描整个表，因此延迟较高，另一个导致Hive执行延迟高的因素时MapReduce框架。由于MapReduce本身具有较高的延迟，因此在利用MapReduce执行Hive查询时，也会有较高的延迟。相对来说，数据库的执行延迟较低。当然，这个低是有条件的，即数据规模较小。当数据规模大到超过数据库处理能力的时候，Hive的并行计算优势就能够显现出来了。由于数据的访问延迟较高，决定了Hive不适合在线数据查询。",[10548,98846,98848],{"id":98847},"_8可扩展性高","（8）可扩展性高",[13,98850,98851],{},"由于Hive是建立在Hadoop之上的，因此Hive的可扩展性和Hadoop的可扩展性是一致的。而数据库由于ACID语义的严格限制，扩展性非常有限。",[10548,98853,98855],{"id":98854},"_9数据规模大","（9）数据规模大",[13,98857,98858],{},"由于Hive建立在集群上并可以利用MapReduce进行并行计算，因此可以支持很大规模的数据。对应的，数据库可以支持的数据规模较小。",[7759,98860,98862],{"id":98861},"_2试述hive的体系架构以及各组件的功能","2、试述Hive的体系架构以及各组件的功能",[13,98864,98865],{},"Hive通过给用户提供一系列交互接口，接收到用户提交的Hive脚本后，使用自身的驱动器Driver，结合元数据Metastore，将这些脚本翻译成MapReduce，并提交到Hadoop集群中执行，最后将执行结果输出到用户交互接口。",[13,98867,98868],{},"Hive的体系架构中主要包括如下组件：CLI、JDBC\u002FODBC、Thrift Server、HWI、Metastore和Driver，这些组件可以分为客户端组件和服务端组件两类。另外，Hive还需要Hadoop的支持，它使用HDFS就行存储，使用MapReduce进行计算。",[13,98870,98871],{},[617,98872],{"alt":98873,"src":98874},"Hive的体系架构","img\u002F8.2Hive%E7%9A%84%E4%BD%93%E7%B3%BB%E6%9E%B6%E6%9E%84.jpg",[39316,98876,98877],{"id":98877},"客户端组件",[10548,98879,98881],{"id":98880},"_1clicommand-line-interface","（1）CLI【Command Line Interface】",[13,98883,98884],{},"CLI是Hive命令行接口，是最常用的一种用户接口。CLI启动会同时启动一个Hive副本。CLI是和Hive交互的最简单也是最常用的方式，只需要在一个具备完整Hive环境下的Shell终端中键入hive即可启动服务。不过Hive CLI不适应于高并发的生产环境，仅仅是Hive管理员的好工具。",[10548,98886,98888],{"id":98887},"_2jdbcodbc","（2）JDBC\u002FODBC",[13,98890,98891],{},"JDBC是Java DataBase Connection规范，它定义了一系列Java访问各类数据库的访问接口，因此Hive-JDBC其实本质上扮演了一个协议转换的角色，把JDBC标准协议转换为访问Hive Server服务的协议。Hive-JDBC除了扮演网络协议转化的工作，并不承担其他工作，比如SQL的合法性校验和解析等。ODBC是一组对数据库访问的标准API，它的底层实现源码是采用C\u002FC++编写的。JDBC\u002FODBC都是通过Hive Client与Hive Server保持通信的，借助Thrift RPC协议来实现交互。",[10548,98893,98895],{"id":98894},"_3hwihive-web-interface","（3）HWI【Hive Web Interface】",[13,98897,98898],{},"HWI是Hive的Web访问接口，提供了一种可以通过浏览器来访问Hive服务的功能。",[39316,98900,98901],{"id":98901},"服务端组件",[10548,98903,98905],{"id":98904},"_1thrift-server","（1）Thrift Server",[13,98907,98908],{},"Thrift是Facebook开发的一个软件框架，它用来进行可扩展且跨语言的服务开发，Hive集成了Thrift Server服务，能让Java、Python等不同的编程语言调用Hive接口。",[10548,98910,98912],{"id":98911},"_2元数据metastore","（2）元数据【Metastore】",[13,98914,98915],{},"元数据组件用于存储Hive的元数据，包括表名、表所属的数据库（默认是default）、表的拥有者、列\u002F分区字段、表的类型（是否是外部表）、表的数据所在目录等。Hive元数据默认存储在自带的Derby数据库中，推荐使用MySQL存储Metastore。元数据对于Hive十分重要，因此Hive支持把Metastore服务独立出来，安装到远程的服务器集群里，从而解耦Hive服务和Metastore服务，保证Hive运行的健壮性。",[10548,98917,98919],{"id":98918},"_3驱动器driver","（3）驱动器【Driver】",[13,98921,98922],{},"驱动器组建的作用是将用户编写的HiveQL语句进行解析、编译、优化，生成执行计划，然后调用底层的MapReduce计算框架。",[23289,98924],{},[107,98926,25480],{"id":25480},[13,98928,98929],{},"写完这篇文档才发现：写的太多了，太详细了。。。足足1w6的字数，也不知道我这敲下来是个什么感受（可能是新键盘到了，还在体验ing）。",[13,98931,98932],{},"如果你已经能够独立自主的把前言中提到的环境都安装好，并且能够基本使用，那么这篇文档你All In基本上能加深你对Hadoop的基本理解，了解一些你在配环境时背后的意义；但如果你只是为了考试不挂科的话，（额，一般情况下老师也不会挂的）那么你至少要保证h6格式的标题的内容你都能背下来。",[13,98934,98935],{},"图片纯纯是给会配环境的人看的，而且在敲这篇文档的时候，我一直在反思：Hadoop3.x和Hadoop2.x的区别会不会很大，但是还好，我在敲完后去看了几篇讲解Hadoop3.x新特性的博客后，发现和书本上的内容并不冲突。感兴趣的可以参考如下博客：",[13,98937,98938],{},[5009,98939,98942],{"href":98940,"rel":98941},"https:\u002F\u002Fblog.csdn.net\u002Fweb18296061989\u002Farticle\u002Fdetails\u002F124264120",[23647],"(269条消息) hadoop 3.0新特性简单介绍_普通网友的博客-CSDN博客_hadoop3.0新特性",[13,98944,98945],{},"大体是在细节方面有了一些优化，但是对于上面敲的，都是鸡蛋里挑骨头了，所以放心看没毛病。不过在配置环境时我才用的已经是CentOS Stream 9、Hadoop3.3.4、JDK11了，技术的迭代肯定会造成许多问题，在配置的时候也遇到了不少的问题，很多地方和书本上也是大相径庭。如果你遇到了问题，可以第一时间——查CSDN，就别Q我了！！尚硅谷的视频是完全按照3.x的特性来讲的，如果你想认真学的话，把那个看完是个不错的选择，但是跟着别人来有时候并不能显著提升自己的水平，我的评价是：可以多去帮别人装装环境。书本上的虽然是2.x的环境，但是安装流程同样使用（大部分情况下）。",[13,98947,98948],{},"最后，这门课有用吧？真没用！没用吧？或许有用。感兴趣的各位可以学着玩玩，个人建议还是把精力放在同期的分布式上面。",[13,98950,98951],{},"——Alexie·Z·Yevich",{"title":119,"searchDepth":144,"depth":144,"links":98953},[98954,98960,98965,98972,98977,98984,98989,98993,99000],{"id":97323,"depth":132,"text":97324,"children":98955},[98956,98957,98958,98959],{"id":97327,"depth":144,"text":97328},{"id":97372,"depth":144,"text":97373},{"id":97431,"depth":144,"text":97432},{"id":97481,"depth":144,"text":97482},{"id":97511,"depth":132,"text":97512,"children":98961},[98962,98963,98964],{"id":97515,"depth":144,"text":97516},{"id":97643,"depth":144,"text":97644},{"id":97656,"depth":144,"text":97657},{"id":97697,"depth":132,"text":97698,"children":98966},[98967,98968,98969,98970,98971],{"id":97701,"depth":144,"text":97702},{"id":97762,"depth":144,"text":97763},{"id":97821,"depth":144,"text":97822},{"id":97868,"depth":144,"text":97869},{"id":98020,"depth":144,"text":98021},{"id":98064,"depth":132,"text":98065,"children":98973},[98974,98975,98976],{"id":98068,"depth":144,"text":98069},{"id":98124,"depth":144,"text":98125},{"id":98220,"depth":144,"text":98221},{"id":98289,"depth":132,"text":98290,"children":98978},[98979,98982,98983],{"id":98293,"depth":144,"text":98294,"children":98980},[98981],{"id":98366,"depth":150,"text":98366},{"id":98403,"depth":144,"text":98404},{"id":98467,"depth":144,"text":98468},{"id":98479,"depth":132,"text":98480,"children":98985},[98986,98987,98988],{"id":98491,"depth":144,"text":98492},{"id":98529,"depth":144,"text":98530},{"id":98608,"depth":144,"text":98609},{"id":98641,"depth":132,"text":98642,"children":98990},[98991,98992],{"id":98645,"depth":144,"text":98646},{"id":98690,"depth":144,"text":98691},{"id":98774,"depth":132,"text":98775,"children":98994},[98995,98996],{"id":98778,"depth":144,"text":98779},{"id":98861,"depth":144,"text":98862,"children":98997},[98998,98999],{"id":98877,"depth":150,"text":98877},{"id":98901,"depth":150,"text":98901},{"id":25480,"depth":132,"text":25480},{},"我的大学\u002F大三上学期\u002F大数据平台基础\u002F大数据平台基础备考.md","\u002Fundergraduate\u002Fnote-c7d829b0c038",{"title":97302,"description":119},"undergraduate\u002Fnote-c7d829b0c038",[14968,7744,246,23378,10715,6380,14542],"Jvw0K4LcPHMblFz9SiAk0ff3U-0wdIxriKUY0n2jKrQ",{"id":99009,"title":99010,"assetBase":239,"author":8,"body":99011,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":99471,"navigation":128,"originalPath":99472,"path":99473,"seo":99474,"source":23330,"stem":99475,"tags":99476,"weight":250,"__hash__":99477},"content\u002Fundergraduate\u002Fnote-cf7cd8ccaed6.md","百川笔试",{"type":10,"value":99012,"toc":99460},[99013,99017,99020,99023,99026,99029,99032,99035,99038,99041,99049,99051,99055,99058,99061,99064,99067,99070,99073,99350,99353,99356,99359,99452,99455,99458],[107,99014,99016],{"id":99015},"笔试题一","笔试题一：",[7759,99018,99019],{"id":99019},"要求",[13,99021,99022],{},"1、连续登场 5 次且每次至少进一个球",[13,99024,99025],{},"2、至少有一次又有 2 分球又有 3 分球",[7759,99027,99028],{"id":99028},"思路",[13,99030,99031],{},"1、按照每个时间、球员进行 group 过滤掉得分 0 的数据，并按照时间顺序只取每个球员每星期的前五条数据",[13,99033,99034],{},"2、按照星期进行聚合，得分有2有3则设置group_id为5，否则为之前的数，并将球员\u002F星期的总分的时间固定为星期的最后一天。",[13,99036,99037],{},"3、按照 group_id = 5 的数据向前找 4 个星期，向后找 4 个星期",[13,99039,99040],{},"(吐槽一下样例数据完全没有按照每周有且只有一场比赛来)",[114,99042,99043],{"className":33693,"code":119,"language":33695,"meta":119,"style":119},[17,99044,99045],{"__ignoreMap":119},[78,99046,99047],{"class":124,"line":125},[78,99048,119],{},[23289,99050],{},[107,99052,99054],{"id":99053},"笔试题二","笔试题二：",[7759,99056,99019],{"id":99057},"要求-1",[13,99059,99060],{},"1、求每一天，最多有多少人同时使用 App",[13,99062,99063],{},"2、计算 App，近半年内，每一天的第 7 日留存率",[7759,99065,99028],{"id":99066},"思路-1",[13,99068,99069],{},"1、使用的判断条件为：当天时间≥登陆时间&&当天时间≤登出时间",[13,99071,99072],{},"2、如果一个用户在当天登出后又登入，应该只算一次在线（拉链表思想）",[114,99074,99078],{"className":99075,"code":99076,"language":99077,"meta":119,"style":119},"language-mysql shiki shiki-themes github-dark","WITH t AS (\n    SELECT DISTINCT\n    u1.uid,\n    u1.login_time,\n    max( u1.logout_time ) as logout_time\nFROM\n    ( SELECT uid, date( login_ts ) AS login_time, date( logout_ts ) AS logout_time FROM user_log ) u1\n    LEFT JOIN ( SELECT uid, date( login_ts ) AS login_time, date( logout_ts ) AS logout_time FROM user_log ) u2 ON u1.logout_time = u2.login_time \nGROUP BY\n    u1.uid,\n    u1.login_time\n),\ndr as (\n    SELECT DATE(DATE_ADD((SELECT MIN(login_time) FROM t), INTERVAL seq.seq DAY)) AS date_time\n    FROM (\n        SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL \n        SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL \n        SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL \n        SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL \n        SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL \n        SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL \n        SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31\n    ) seq\n    WHERE DATE_ADD((SELECT MIN(login_time) FROM t), INTERVAL seq.seq DAY) \u003C= (SELECT MAX(logout_time) FROM t)\n)\nSELECT\n    date_time,\n    COUNT( DISTINCT t.uid ) AS max_users \nFROM\n    dr\n    LEFT JOIN t ON dr.date_time BETWEEN t.login_time \n    AND t.logout_time \nWHERE\n    t.login_time \u003C= dr.date_time AND t.logout_time >= dr.date_time \nGROUP BY\n    dr.date_time \nORDER BY\n    dr.date_time;\n    \n-- 样例数据如下：\n-- uid       login_ts           logout_ts\n-- 1    2023-09-10 00:03:10 2023-09-10 00:13:15\n-- 2    2023-09-10 11:12:56 2023-09-10 12:19:22\n-- 1    2023-09-10 23:03:10 2023-09-11 23:45:07\n-- 1    2023-09-13 23:03:10 2023-09-14 23:45:07\n\n-- 输出结果如下：\n--  date_time max_users\n-- 2023-09-10   2\n-- 2023-09-11   1\n-- 2023-09-13   1\n-- 2023-09-14   1\n\n-- t表的作用是规约时间\n-- dr表的作用是确定整个时间轴范围\n-- 第二问都可以复用\n","mysql",[17,99079,99080,99085,99090,99095,99100,99105,99109,99114,99119,99124,99128,99133,99138,99143,99148,99153,99158,99163,99168,99173,99178,99183,99188,99193,99198,99202,99206,99211,99216,99220,99225,99230,99235,99239,99244,99248,99253,99258,99263,99267,99272,99277,99282,99287,99292,99297,99301,99306,99311,99316,99321,99326,99331,99335,99340,99345],{"__ignoreMap":119},[78,99081,99082],{"class":124,"line":125},[78,99083,99084],{},"WITH t AS (\n",[78,99086,99087],{"class":124,"line":132},[78,99088,99089],{},"    SELECT DISTINCT\n",[78,99091,99092],{"class":124,"line":138},[78,99093,99094],{},"    u1.uid,\n",[78,99096,99097],{"class":124,"line":144},[78,99098,99099],{},"    u1.login_time,\n",[78,99101,99102],{"class":124,"line":150},[78,99103,99104],{},"    max( u1.logout_time ) as logout_time\n",[78,99106,99107],{"class":124,"line":156},[78,99108,67099],{},[78,99110,99111],{"class":124,"line":162},[78,99112,99113],{},"    ( SELECT uid, date( login_ts ) AS login_time, date( logout_ts ) AS logout_time FROM user_log ) u1\n",[78,99115,99116],{"class":124,"line":168},[78,99117,99118],{},"    LEFT JOIN ( SELECT uid, date( login_ts ) AS login_time, date( logout_ts ) AS logout_time FROM user_log ) u2 ON u1.logout_time = u2.login_time \n",[78,99120,99121],{"class":124,"line":174},[78,99122,99123],{},"GROUP BY\n",[78,99125,99126],{"class":124,"line":180},[78,99127,99094],{},[78,99129,99130],{"class":124,"line":186},[78,99131,99132],{},"    u1.login_time\n",[78,99134,99135],{"class":124,"line":192},[78,99136,99137],{},"),\n",[78,99139,99140],{"class":124,"line":198},[78,99141,99142],{},"dr as (\n",[78,99144,99145],{"class":124,"line":204},[78,99146,99147],{},"    SELECT DATE(DATE_ADD((SELECT MIN(login_time) FROM t), INTERVAL seq.seq DAY)) AS date_time\n",[78,99149,99150],{"class":124,"line":210},[78,99151,99152],{},"    FROM (\n",[78,99154,99155],{"class":124,"line":216},[78,99156,99157],{},"        SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL \n",[78,99159,99160],{"class":124,"line":222},[78,99161,99162],{},"        SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL \n",[78,99164,99165],{"class":124,"line":421},[78,99166,99167],{},"        SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL \n",[78,99169,99170],{"class":124,"line":427},[78,99171,99172],{},"        SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL \n",[78,99174,99175],{"class":124,"line":433},[78,99176,99177],{},"        SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL \n",[78,99179,99180],{"class":124,"line":2443},[78,99181,99182],{},"        SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL \n",[78,99184,99185],{"class":124,"line":2448},[78,99186,99187],{},"        SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31\n",[78,99189,99190],{"class":124,"line":2454},[78,99191,99192],{},"    ) seq\n",[78,99194,99195],{"class":124,"line":2460},[78,99196,99197],{},"    WHERE DATE_ADD((SELECT MIN(login_time) FROM t), INTERVAL seq.seq DAY) \u003C= (SELECT MAX(logout_time) FROM t)\n",[78,99199,99200],{"class":124,"line":2465},[78,99201,8041],{},[78,99203,99204],{"class":124,"line":2470},[78,99205,67084],{},[78,99207,99208],{"class":124,"line":2903},[78,99209,99210],{},"    date_time,\n",[78,99212,99213],{"class":124,"line":2909},[78,99214,99215],{},"    COUNT( DISTINCT t.uid ) AS max_users \n",[78,99217,99218],{"class":124,"line":11477},[78,99219,67099],{},[78,99221,99222],{"class":124,"line":13374},[78,99223,99224],{},"    dr\n",[78,99226,99227],{"class":124,"line":13380},[78,99228,99229],{},"    LEFT JOIN t ON dr.date_time BETWEEN t.login_time \n",[78,99231,99232],{"class":124,"line":13386},[78,99233,99234],{},"    AND t.logout_time \n",[78,99236,99237],{"class":124,"line":13722},[78,99238,67109],{},[78,99240,99241],{"class":124,"line":13727},[78,99242,99243],{},"    t.login_time \u003C= dr.date_time AND t.logout_time >= dr.date_time \n",[78,99245,99246],{"class":124,"line":13953},[78,99247,99123],{},[78,99249,99250],{"class":124,"line":13958},[78,99251,99252],{},"    dr.date_time \n",[78,99254,99255],{"class":124,"line":13964},[78,99256,99257],{},"ORDER BY\n",[78,99259,99260],{"class":124,"line":13969},[78,99261,99262],{},"    dr.date_time;\n",[78,99264,99265],{"class":124,"line":24170},[78,99266,6942],{},[78,99268,99269],{"class":124,"line":24175},[78,99270,99271],{},"-- 样例数据如下：\n",[78,99273,99274],{"class":124,"line":24180},[78,99275,99276],{},"-- uid       login_ts           logout_ts\n",[78,99278,99279],{"class":124,"line":24186},[78,99280,99281],{},"-- 1    2023-09-10 00:03:10 2023-09-10 00:13:15\n",[78,99283,99284],{"class":124,"line":24192},[78,99285,99286],{},"-- 2    2023-09-10 11:12:56 2023-09-10 12:19:22\n",[78,99288,99289],{"class":124,"line":24198},[78,99290,99291],{},"-- 1    2023-09-10 23:03:10 2023-09-11 23:45:07\n",[78,99293,99294],{"class":124,"line":24204},[78,99295,99296],{},"-- 1    2023-09-13 23:03:10 2023-09-14 23:45:07\n",[78,99298,99299],{"class":124,"line":24210},[78,99300,129],{"emptyLinePlaceholder":128},[78,99302,99303],{"class":124,"line":24215},[78,99304,99305],{},"-- 输出结果如下：\n",[78,99307,99308],{"class":124,"line":24220},[78,99309,99310],{},"--  date_time max_users\n",[78,99312,99313],{"class":124,"line":24226},[78,99314,99315],{},"-- 2023-09-10   2\n",[78,99317,99318],{"class":124,"line":24232},[78,99319,99320],{},"-- 2023-09-11   1\n",[78,99322,99323],{"class":124,"line":24238},[78,99324,99325],{},"-- 2023-09-13   1\n",[78,99327,99328],{"class":124,"line":24244},[78,99329,99330],{},"-- 2023-09-14   1\n",[78,99332,99333],{"class":124,"line":24250},[78,99334,129],{"emptyLinePlaceholder":128},[78,99336,99337],{"class":124,"line":24256},[78,99338,99339],{},"-- t表的作用是规约时间\n",[78,99341,99342],{"class":124,"line":24262},[78,99343,99344],{},"-- dr表的作用是确定整个时间轴范围\n",[78,99346,99347],{"class":124,"line":24267},[78,99348,99349],{},"-- 第二问都可以复用\n",[7759,99351,99028],{"id":99352},"思路-2",[13,99354,99355],{},"1、找到每天登陆的用户表，和截取的7天后登陆的用户表进行left join，如果uid相同且时间刚好大于7就设置exist_number为1，否则为0",[13,99357,99358],{},"2、聚合计算每天的用户算出比率。",[114,99360,99362],{"className":99075,"code":99361,"language":99077,"meta":119,"style":119},"1、转换为单天的用户记录\nSELECT\n    uid,\n    date_time \nFROM\n    dr\n    LEFT JOIN t ON dr.date_time BETWEEN t.login_time \n    AND t.logout_time \nWHERE\n    t.login_time \u003C= dr.date_time AND t.logout_time >= dr.date_time;\n-- 输出结果如下：\n-- uid  date_time\n-- 2    2023-09-10\n-- 1    2023-09-10\n-- 1    2023-09-11\n-- 1    2023-09-13\n-- 1    2023-09-14\n-- 1    2023-09-20\n……后面的步骤又是嵌套了emmm\n",[17,99363,99364,99369,99373,99378,99383,99387,99391,99395,99399,99403,99408,99412,99417,99422,99427,99432,99437,99442,99447],{"__ignoreMap":119},[78,99365,99366],{"class":124,"line":125},[78,99367,99368],{},"1、转换为单天的用户记录\n",[78,99370,99371],{"class":124,"line":132},[78,99372,67084],{},[78,99374,99375],{"class":124,"line":138},[78,99376,99377],{},"    uid,\n",[78,99379,99380],{"class":124,"line":144},[78,99381,99382],{},"    date_time \n",[78,99384,99385],{"class":124,"line":150},[78,99386,67099],{},[78,99388,99389],{"class":124,"line":156},[78,99390,99224],{},[78,99392,99393],{"class":124,"line":162},[78,99394,99229],{},[78,99396,99397],{"class":124,"line":168},[78,99398,99234],{},[78,99400,99401],{"class":124,"line":174},[78,99402,67109],{},[78,99404,99405],{"class":124,"line":180},[78,99406,99407],{},"    t.login_time \u003C= dr.date_time AND t.logout_time >= dr.date_time;\n",[78,99409,99410],{"class":124,"line":186},[78,99411,99305],{},[78,99413,99414],{"class":124,"line":192},[78,99415,99416],{},"-- uid  date_time\n",[78,99418,99419],{"class":124,"line":198},[78,99420,99421],{},"-- 2    2023-09-10\n",[78,99423,99424],{"class":124,"line":204},[78,99425,99426],{},"-- 1    2023-09-10\n",[78,99428,99429],{"class":124,"line":210},[78,99430,99431],{},"-- 1    2023-09-11\n",[78,99433,99434],{"class":124,"line":216},[78,99435,99436],{},"-- 1    2023-09-13\n",[78,99438,99439],{"class":124,"line":222},[78,99440,99441],{},"-- 1    2023-09-14\n",[78,99443,99444],{"class":124,"line":421},[78,99445,99446],{},"-- 1    2023-09-20\n",[78,99448,99449],{"class":124,"line":427},[78,99450,99451],{},"……后面的步骤又是嵌套了emmm\n",[13,99453,99454],{},"ps：我不知道我想复杂了，还是水平不够（水平不够概率大点），看上去很简单但是限定条件屌多，有一些处理过程放到Java中会好处理很多，用点工具可以慢慢磨把这三个题磨出来，不过磨出来了贵司大概率也不会招我，所以懒得花时间了。",[13,99456,99457],{},"望下次贵司提供样例的时候稍微给多一点吧QWQ",[226,99459,228],{},{"title":119,"searchDepth":144,"depth":144,"links":99461},[99462,99466],{"id":99015,"depth":132,"text":99016,"children":99463},[99464,99465],{"id":99019,"depth":144,"text":99019},{"id":99028,"depth":144,"text":99028},{"id":99053,"depth":132,"text":99054,"children":99467},[99468,99469,99470],{"id":99057,"depth":144,"text":99019},{"id":99066,"depth":144,"text":99028},{"id":99352,"depth":144,"text":99028},{},"我的大学\u002Fbranch\u002Finterview\u002F百川笔试.md","\u002Fundergraduate\u002Fnote-cf7cd8ccaed6",{"title":99010,"description":119},"undergraduate\u002Fnote-cf7cd8ccaed6",[246,10715,35725],"_EsRvlFjpY_RWEzYWm2mPWNPAl-wk01G2FX8UZb8dHs",{"id":99479,"title":99480,"assetBase":239,"author":8,"body":99481,"category":25506,"collection":23324,"date":23325,"description":99491,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":101230,"navigation":128,"originalPath":101231,"path":101232,"seo":101233,"source":23330,"stem":101234,"tags":101235,"weight":250,"__hash__":101236},"content\u002Fundergraduate\u002Fnote-d7c9a368071b.md","SingSong Generating musical accompaniments from singing",{"type":10,"value":99482,"toc":101220},[99483,99487,99492,99498,99500,99503,99506,99509,99512,99517,99520,99523,99526,99537,99541,99544,99547,99550,99554,99560,99675,99678,99682,99685,100158,100164,100173,100177,100180,100186,100569,100572,100578,100817,100820,100823,101210,101213,101216],[4517,99484,99486],{"id":99485},"singsong从-singsong-中产生音乐伴奏","SingSong：从 SingSong 中产生音乐伴奏",[13,99488,99489],{},[22,99490,99491],{},"Chris Donahue，Antoine Caillon，Adam Roberts，Ethan Manilow，Philippe Esling，Andrea Agostinelli，Mauro Verzetti，Ian Simon，Olivier Pietquin，Neil Zeghidour，Jesse Engel",[72,99493,99494],{},[13,99495,99496],{},[22,99497,25537],{},[7759,99499,68112],{"id":68112},[13,99501,99502],{},"我们介绍了 SingSong，这是一个通过人声进行音乐生成的系统，有可能为音乐家和非音乐家提供一种直观的新方式来创作具有自己声音特色的音乐。为了实现这一点，我们在音乐源分离和音频生成方面的最新发展的基础上进行了研究。具体来说，我们将最先进的源分离算法应用于大型音乐音频语料库，以产生对齐的人声和乐器源。然后，我们将 AudioLM（Borsos等人，2022）——一种最先进的无条件音频生成方法——调整为适用于有条件的“音频到音频”生成任务，并在源分离（声乐、器乐）对上对其进行训练。在与相同声音输入的成对比较中，与来自强检索基线的相比，听众表示 SingSong 生成的音乐伴奏有显著的提高。",[7759,99504,99505],{"id":68121},"1. 简介",[13,99507,99508],{},"唱歌是参与音乐的最直观的途径之一，无论是音乐家还是非音乐家都可以使用。尽管跟着现有音乐唱歌是一种常见的活动，但唱歌也可能构成音乐生成系统的直观控制机制，可能会让任何会唱歌的人以一种有趣和参与的方式创作音乐。",[13,99510,99511],{},"在这项工作中，我们提出了 SingSong（图 1），这是一个能够生成器乐音频来同步伴随输入人声音频的系统，即输出的乐器可以与输入人声天然混合，以创建具有输入特征的连贯音乐。SingSong 利用音乐技术的两个关键领域的改进：源分离和音频的生成建模。我们使用 Kim 等人的现成源分离算法。（2021）将大量不同的音乐语料库（1M 首曲目）分离为对齐的人声和乐器源对，构成我们任务的并行数据。然后，我们改编了 AudioLM（Bor-sos 等人，2022）——一个涉及中间表示层次的音频无条件生成模型——适用于给定人声的乐器的条件“音频到音频”生成建模，并以监督的方式在源分离数据上对其进行训练。",[13,99513,99514],{},[617,99515],{"alt":99516,"src":25603},"图 1 SingSong 生成器乐来伴随输入人声，从而允许用户创建以自己的声音为特色的音乐。（左）我们通过将现成的源分离算法应用于大型音乐音频语料库来为这项任务制造大量的合成数据，我们使用该算法来训练给定人声的乐器的生成模型。（右）在推断的时候，SingSong 从用户那里获取人声，并输出一个乐器来伴奏这些人声，这些乐器可以天然的与输入混合，创造出连贯的音乐\n*请注意，在训练过程中，我们计算离散音频特征的损失，而不是波形（第 3.3 节）",[13,99518,99519],{},"这项工作中的一个关键挑战是建立一个系统，该系统能够从训练期间观察到的源分离的人声输入推广到现实世界中的孤立人声，人们可以从参与该系统的用户那里预期。初步实验得出的模型强烈倾向于从源分离人声中几乎听不见的伪影（conceal artifacts）中重建乐器——当输入孤立人声时，这些模型产生了荒谬的输出。为了提高泛化能力，我们为输入人声提出了两种特征化策略：（1）向人声输入添加噪声以隐藏伪影，以及（2）仅使用 AudioLM 中最粗糙的中间表示作为条件输入。在感知相关的指标上，与默认的 AudioLM 特征化相比，这些特征化共同将孤立视频的性能提高了 55%。",[13,99521,99522],{},"在一项配对研究中，听众被呈现出两种人声相同的声乐器乐混音，与强检索基线相比，听众对 SingSong 的器乐表现出显著的偏好。该基线使用 vocals 的音乐特征（节拍和键）作为查询，以检索具有相似特征的人类创作的器乐。与这个检索基线的乐曲相比，66%的时间听众更喜欢 SingSong 的乐曲。此外，即使与现实乐器相比，听众也有 34% 的时间更喜欢 SingSong 的乐曲。",[13,99524,99525],{},"总之，我们的主要贡献是：",[49,99527,99528,99531,99534],{},[52,99529,99530],{},"我们是第一个使用生成建模为人声输入创建连贯乐器伴奏的公司。",[52,99532,99533],{},"我们是第一个提出使用源分离来创建音频到音频伴奏的训练数据的公司。",[52,99535,99536],{},"我们采用最先进的无条件音频生成模型进行有条件的音频到音频建模。",[7759,99538,99540],{"id":99539},"_2-相关工作","2. 相关工作",[13,99542,99543],{},"**伴奏生成。**与我们自己的工作最相似的是一个名为 Microsoft Songsmith 的商业产品，基作者是 Simon等人（2008）。Songsmith 从输入人声中提取音高信息，并预测适合该旋律的符号和弦标签序列。然后，预测的和弦被用作查询，以检索与输入人声混合的合适的人类创作的象征性乐器伴奏。我们直接与我们构建的类似检索基线进行比较。Lattner 和 Grachten（2019）生成象征性的低音鼓伴奏，Grachten 等人（2020）生成低音伴奏。Wu 等人（2022）在没有鼓的情况下，在给定音乐音频的情况下生成鼓曲目的音频。在这里，我们考虑的是仅基于声乐表演生成整个伴奏曲目（可能包含鼓、低音和其他和声元素）的更广泛任务。还有一系列关于符号协调的工作，即预测适合符号旋律输入的和弦标签（Paiement 等人，2006；Yeh 等人，2020）。为了适合声乐伴奏，这种方法需要额外的声乐转录和和弦编排步骤。",[13,99545,99546],{},"**音乐音频生成。**音乐音频生成是一项具有挑战性的任务，因为它涉及许多不同音频尺度的建模，从局部信息（例如，音色、瞬态（transients））到全局信息（例如音乐结构、流派）。一些关于无条件音乐生成的工作直接对时域音乐波形进行操作（van den Oord 等人，2016；Mehri 等人，2017；Donahue 等人，2019；Goel 等人，2022）。这些方法仅限于对音乐音频（通常是钢琴音乐）的狭窄分布进行建模。van den Oord 等人（2017）介绍了一种对音乐音频的可逆离散表示进行生成建模的方法。Dieleman 等人（2018）对钢琴音乐音频的分层离散特征进行了建模——Dhariwal 等人也使用了类似的方法并在 2020 年创建了 Jukebox，这是第一个广义音乐音频的通用模型。霍桑等人（2022）；\nBorsos 等人（2022）还对钢琴音乐的离散音乐特征进行了建模。大量的工作围绕着以符号表示为条件的可控音乐音频生成展开（Hawthorne 等人，2018；Engel 等人，2019；Hawthonne 等人，2022）或表演特征（Caillon 和 Esling，2021；Engel 等人，2020）。在我们的工作中，我们试图对以声乐音频为条件的器乐音频的广泛分布进行建模。",[13,99548,99549],{},"与这项工作同期，Agostinelli 等人（2023）提出了 MusicLM，该模型适用于 AudioLM，以生成基于输入文本描述的广泛音乐音频。MusicLM 还能够生成具有与用户的旋律提示相对应的旋律的音乐，通过唱歌或哼唱来表达。在这里，我们的目标是与输入人声同步生成教学音乐，这样它们就可以连贯地混合在一起——人声不仅像 MusicLM 中那样用于指导音乐生成，而且还直接出现在输出音乐中。",[7759,99551,99553],{"id":99552},"_3-任务定义和方法","3. 任务定义和方法",[13,99555,99556,99557,99559],{},"我们将声乐伴奏的任务视为一个条件生成建模问题，其中目标是对声乐波形 x 在适当的乐器波形 y 上的分布 P(y|x) 进行建模，其中两个波形都是单声道的，长度为 T 秒，并以一定的速率 f",[25921,99558,262],{}," 采样。形式上，x 和 y 都是",[78,99561,99563],{"className":99562},[4566],[78,99564,99566,99592],{"className":99565},[4570],[78,99567,99569],{"className":99568},[4574],[4576,99570,99571],{"xmlns":4578,"display":4579},[4581,99572,99573,99589],{},[4584,99574,99575],{},[4614,99576,99577,99579],{},[4596,99578,27152],{},[4584,99580,99581,99587],{},[4600,99582,99583,99585],{},[4596,99584,5053],{},[4596,99586,262],{},[4596,99588,5074],{},[4647,99590,99591],{"encoding":4649},"R^{f_sT}",[78,99593,99595],{"className":99594,"ariaHidden":1419},[4654],[78,99596,99598,99601],{"className":99597},[4658],[78,99599],{"className":99600,"style":91855},[4662],[78,99602,99604,99607],{"className":99603},[4667],[78,99605,27152],{"className":99606,"style":38285},[4667,4678],[78,99608,99610],{"className":99609},[4689],[78,99611,99613],{"className":99612},[4693],[78,99614,99616],{"className":99615},[4698],[78,99617,99619],{"className":99618,"style":91855},[4702],[78,99620,99621,99624],{"style":5209},[78,99622],{"className":99623,"style":4711},[4710],[78,99625,99627],{"className":99626},[4715,4716,4717,4718],[78,99628,99630,99672],{"className":99629},[4667,4718],[78,99631,99633,99636],{"className":99632},[4667,4718],[78,99634,5053],{"className":99635,"style":5170},[4667,4678,4718],[78,99637,99639],{"className":99638},[4689],[78,99640,99642,99664],{"className":99641},[4693,4694],[78,99643,99645,99661],{"className":99644},[4698],[78,99646,99649],{"className":99647,"style":99648},[4702],"height:0.1645em;",[78,99650,99652,99655],{"style":99651},"top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em;",[78,99653],{"className":99654,"style":4896},[4710],[78,99656,99658],{"className":99657},[4715,4900,4901,4718],[78,99659,262],{"className":99660},[4667,4678,4718],[78,99662,4726],{"className":99663},[4725],[78,99665,99667],{"className":99666},[4698],[78,99668,99670],{"className":99669,"style":84716},[4702],[78,99671],{},[78,99673,5074],{"className":99674,"style":5219},[4667,4678,4718],[13,99676,99677],{},"中的向量。鉴于人声 x‘，我们可以通过采样 y’～P(y|x=x‘)并线性混合输出（例如 x’+y‘）来生成包含这些人声的音乐。",[39316,99679,99681],{"id":99680},"_31-对音频代码的代理分布进行建模","3.1 对音频代码的代理分布进行建模",[13,99683,99684],{},"由于表示音频所需的高采样率，直接对波形上的分布建模在实际中具有挑战性。采用 van den Oord 等人首次提出的做法。（2017）对音频进行无条件通用建模，在这项工作中，我们转而对离散音频代码进行建模。这种方法需要一个离散的编解码器，一对函数",[78,99686,99688],{"className":99687},[4566],[78,99689,99691,99781],{"className":99690},[4570],[78,99692,99694],{"className":99693},[4574],[4576,99695,99696],{"xmlns":4578,"display":4579},[4581,99697,99698,99778],{},[4584,99699,99700,99702,99704,99706,99708,99722,99724,99738,99740,99742,99744,99746,99748,99762,99764],{},[4596,99701,7065],{},[4596,99703,19],{},[4596,99705,7360],{},[4591,99707,8661],{},[4614,99709,99710,99712],{},[4596,99711,27152],{},[4584,99713,99714,99720],{},[4600,99715,99716,99718],{},[4596,99717,5053],{},[4596,99719,262],{},[4596,99721,5074],{},[4591,99723,52231],{},[4614,99725,99726,99728],{},[4596,99727,5042],{},[4584,99729,99730,99736],{},[4600,99731,99732,99734],{},[4596,99733,5053],{},[4596,99735,5535],{},[4596,99737,5074],{},[4587,99739,52204],{},[4596,99741,27107],{},[4596,99743,4618],{},[4596,99745,7360],{},[4591,99747,8661],{},[4614,99749,99750,99752],{},[4596,99751,5042],{},[4584,99753,99754,99760],{},[4600,99755,99756,99758],{},[4596,99757,5053],{},[4596,99759,5535],{},[4596,99761,5074],{},[4591,99763,52231],{},[4614,99765,99766,99768],{},[4596,99767,27152],{},[4584,99769,99770,99776],{},[4600,99771,99772,99774],{},[4596,99773,5053],{},[4596,99775,262],{},[4596,99777,5074],{},[4647,99779,99780],{"encoding":4649},"Enc:R^{f_sT} → V^{f_kT} 和 Dec:V^{f_kT} →  R^{f_sT}",[78,99782,99784,99808,99895,99993,100080],{"className":99783,"ariaHidden":1419},[4654],[78,99785,99787,99790,99793,99796,99799,99802,99805],{"className":99786},[4658],[78,99788],{"className":99789,"style":18224},[4662],[78,99791,7065],{"className":99792,"style":7153},[4667,4678],[78,99794,19],{"className":99795},[4667,4678],[78,99797,7360],{"className":99798},[4667,4678],[78,99800],{"className":99801,"style":4740},[4739],[78,99803,8661],{"className":99804},[4744],[78,99806],{"className":99807,"style":4740},[4739],[78,99809,99811,99814,99886,99889,99892],{"className":99810},[4658],[78,99812],{"className":99813,"style":91855},[4662],[78,99815,99817,99820],{"className":99816},[4667],[78,99818,27152],{"className":99819,"style":38285},[4667,4678],[78,99821,99823],{"className":99822},[4689],[78,99824,99826],{"className":99825},[4693],[78,99827,99829],{"className":99828},[4698],[78,99830,99832],{"className":99831,"style":91855},[4702],[78,99833,99834,99837],{"style":5209},[78,99835],{"className":99836,"style":4711},[4710],[78,99838,99840],{"className":99839},[4715,4716,4717,4718],[78,99841,99843,99883],{"className":99842},[4667,4718],[78,99844,99846,99849],{"className":99845},[4667,4718],[78,99847,5053],{"className":99848,"style":5170},[4667,4678,4718],[78,99850,99852],{"className":99851},[4689],[78,99853,99855,99875],{"className":99854},[4693,4694],[78,99856,99858,99872],{"className":99857},[4698],[78,99859,99861],{"className":99860,"style":99648},[4702],[78,99862,99863,99866],{"style":99651},[78,99864],{"className":99865,"style":4896},[4710],[78,99867,99869],{"className":99868},[4715,4900,4901,4718],[78,99870,262],{"className":99871},[4667,4678,4718],[78,99873,4726],{"className":99874},[4725],[78,99876,99878],{"className":99877},[4698],[78,99879,99881],{"className":99880,"style":84716},[4702],[78,99882],{},[78,99884,5074],{"className":99885,"style":5219},[4667,4678,4718],[78,99887],{"className":99888,"style":4740},[4739],[78,99890,52231],{"className":99891},[4744],[78,99893],{"className":99894,"style":4740},[4739],[78,99896,99898,99901,99974,99977,99980,99984,99987,99990],{"className":99897},[4658],[78,99899],{"className":99900,"style":91855},[4662],[78,99902,99904,99907],{"className":99903},[4667],[78,99905,5042],{"className":99906,"style":5143},[4667,4678],[78,99908,99910],{"className":99909},[4689],[78,99911,99913],{"className":99912},[4693],[78,99914,99916],{"className":99915},[4698],[78,99917,99919],{"className":99918,"style":91855},[4702],[78,99920,99921,99924],{"style":5209},[78,99922],{"className":99923,"style":4711},[4710],[78,99925,99927],{"className":99926},[4715,4716,4717,4718],[78,99928,99930,99971],{"className":99929},[4667,4718],[78,99931,99933,99936],{"className":99932},[4667,4718],[78,99934,5053],{"className":99935,"style":5170},[4667,4678,4718],[78,99937,99939],{"className":99938},[4689],[78,99940,99942,99963],{"className":99941},[4693,4694],[78,99943,99945,99960],{"className":99944},[4698],[78,99946,99948],{"className":99947,"style":7272},[4702],[78,99949,99951,99954],{"style":99950},"top:-2.3488em;margin-left:-0.1076em;margin-right:0.0714em;",[78,99952],{"className":99953,"style":4896},[4710],[78,99955,99957],{"className":99956},[4715,4900,4901,4718],[78,99958,5535],{"className":99959,"style":5578},[4667,4678,4718],[78,99961,4726],{"className":99962},[4725],[78,99964,99966],{"className":99965},[4698],[78,99967,99969],{"className":99968,"style":7310},[4702],[78,99970],{},[78,99972,5074],{"className":99973,"style":5219},[4667,4678,4718],[78,99975,52204],{"className":99976},[4667,6184],[78,99978,27107],{"className":99979,"style":17251},[4667,4678],[78,99981,99983],{"className":99982},[4667,4678],"ec",[78,99985],{"className":99986,"style":4740},[4739],[78,99988,8661],{"className":99989},[4744],[78,99991],{"className":99992,"style":4740},[4739],[78,99994,99996,99999,100071,100074,100077],{"className":99995},[4658],[78,99997],{"className":99998,"style":91855},[4662],[78,100000,100002,100005],{"className":100001},[4667],[78,100003,5042],{"className":100004,"style":5143},[4667,4678],[78,100006,100008],{"className":100007},[4689],[78,100009,100011],{"className":100010},[4693],[78,100012,100014],{"className":100013},[4698],[78,100015,100017],{"className":100016,"style":91855},[4702],[78,100018,100019,100022],{"style":5209},[78,100020],{"className":100021,"style":4711},[4710],[78,100023,100025],{"className":100024},[4715,4716,4717,4718],[78,100026,100028,100068],{"className":100027},[4667,4718],[78,100029,100031,100034],{"className":100030},[4667,4718],[78,100032,5053],{"className":100033,"style":5170},[4667,4678,4718],[78,100035,100037],{"className":100036},[4689],[78,100038,100040,100060],{"className":100039},[4693,4694],[78,100041,100043,100057],{"className":100042},[4698],[78,100044,100046],{"className":100045,"style":7272},[4702],[78,100047,100048,100051],{"style":99950},[78,100049],{"className":100050,"style":4896},[4710],[78,100052,100054],{"className":100053},[4715,4900,4901,4718],[78,100055,5535],{"className":100056,"style":5578},[4667,4678,4718],[78,100058,4726],{"className":100059},[4725],[78,100061,100063],{"className":100062},[4698],[78,100064,100066],{"className":100065,"style":7310},[4702],[78,100067],{},[78,100069,5074],{"className":100070,"style":5219},[4667,4678,4718],[78,100072],{"className":100073,"style":4740},[4739],[78,100075,52231],{"className":100076},[4744],[78,100078],{"className":100079,"style":4740},[4739],[78,100081,100083,100086],{"className":100082},[4658],[78,100084],{"className":100085,"style":91855},[4662],[78,100087,100089,100092],{"className":100088},[4667],[78,100090,27152],{"className":100091,"style":38285},[4667,4678],[78,100093,100095],{"className":100094},[4689],[78,100096,100098],{"className":100097},[4693],[78,100099,100101],{"className":100100},[4698],[78,100102,100104],{"className":100103,"style":91855},[4702],[78,100105,100106,100109],{"style":5209},[78,100107],{"className":100108,"style":4711},[4710],[78,100110,100112],{"className":100111},[4715,4716,4717,4718],[78,100113,100115,100155],{"className":100114},[4667,4718],[78,100116,100118,100121],{"className":100117},[4667,4718],[78,100119,5053],{"className":100120,"style":5170},[4667,4678,4718],[78,100122,100124],{"className":100123},[4689],[78,100125,100127,100147],{"className":100126},[4693,4694],[78,100128,100130,100144],{"className":100129},[4698],[78,100131,100133],{"className":100132,"style":99648},[4702],[78,100134,100135,100138],{"style":99651},[78,100136],{"className":100137,"style":4896},[4710],[78,100139,100141],{"className":100140},[4715,4900,4901,4718],[78,100142,262],{"className":100143},[4667,4678,4718],[78,100145,4726],{"className":100146},[4725],[78,100148,100150],{"className":100149},[4698],[78,100151,100153],{"className":100152,"style":84716},[4702],[78,100154],{},[78,100156,5074],{"className":100157,"style":5219},[4667,4678,4718],[13,100159,100160,100161,100163],{},"，其中 V 是一些有限词汇，f",[25921,100162,5535],{}," 是音频码率，Dec 近似于 Enc^−1^。",[13,100165,100166,100167,100169,100170,100172],{},"使用这两个函数，我们可以为“代理（proxy）”建模 Enc 产生的代码上的分布，并通过利用 Dec 来近似波形上的分布。具体地说，对于目标是对波形 w 上的分布进行建模的无条件设置，我们可以将 P(ŵ) 建模为代理，其中 ŵ = Enc(w)。为了从该分布中对音频进行采样，我们首先对 ŵ’～P(ŵ) 进行采样，并输出 Dec(ŵ‘)。由于在实践中 f",[25921,100168,5535],{}," \u003C\u003C f",[25921,100171,262],{},"，对该代理进行建模在理论上是容易处理的。",[39316,100174,100176],{"id":100175},"_32-初步audiolm","3.2 初步AudioLM",[13,100178,100179],{},"在这项工作中，我们的方法基于 AudioLM（Borsos 等人，2022），这是一种最先进的无条件音频生成模型，它使用因子分解方法对多种类型的音频代码上的代理分布进行建模。",[13,100181,100182,100185],{},[22,100183,100184],{},"声学代码 AudioLM"," 中的离散编解码器是一个预训练的 SoundStream（Zeghidour 等人，2021）模型，",[78,100187,100189],{"className":100188},[4566],[78,100190,100192,100291],{"className":100191},[4570],[78,100193,100195],{"className":100194},[4574],[4576,100196,100197],{"xmlns":4578,"display":4579},[4581,100198,100199,100288],{},[4584,100200,100201,100204,100206,100208,100210,100212,100226,100228,100243,100246,100248,100250,100252,100255,100261,100263,100265,100267,100270,100272,100275,100277,100279,100281,100283,100286],{},[4587,100202,100203],{},"带有编码器",[4596,100205,7065],{},[4596,100207,19],{},[4596,100209,7360],{},[4591,100211,8661],{},[4614,100213,100214,100216],{},[4596,100215,27152],{},[4584,100217,100218,100224],{},[4600,100219,100220,100222],{},[4596,100221,5053],{},[4596,100223,262],{},[4596,100225,5074],{},[4591,100227,52231],{},[4614,100229,100230,100232],{},[4596,100231,5042],{},[4584,100233,100234,100237,100239,100241],{},[7077,100235,100236],{},"50",[4596,100238,5074],{},[4591,100240,43664],{},[7077,100242,1044],{},[4587,100244,100245],{},"和相应的解码器",[4596,100247,27107],{},[4596,100249,4618],{},[4596,100251,7360],{},[4587,100253,100254],{},"，其中",[4600,100256,100257,100259],{},[4596,100258,5053],{},[4596,100260,262],{},[4591,100262,4609],{},[7077,100264,1021],{},[4596,100266,5535],{},[4596,100268,100269],{},"H",[4596,100271,25949],{},[4587,100273,100274],{},"以及",[4596,100276,63346],{"mathvariant":7101},[4596,100278,5042],{},[4596,100280,63346],{"mathvariant":7101},[4591,100282,4609],{},[7077,100284,100285],{},"1024",[4587,100287,67],{},[4647,100289,100290],{"encoding":4649},"带有编码器 Enc:R^{f_sT} → V^{50T × 12}和相应的解码器 Dec，其中f_s=16kHz以及|V| = 1024。",[78,100292,100294,100321,100408,100517,100557],{"className":100293,"ariaHidden":1419},[4654],[78,100295,100297,100300,100303,100306,100309,100312,100315,100318],{"className":100296},[4658],[78,100298],{"className":100299,"style":18224},[4662],[78,100301,100203],{"className":100302},[4667,6184],[78,100304,7065],{"className":100305,"style":7153},[4667,4678],[78,100307,19],{"className":100308},[4667,4678],[78,100310,7360],{"className":100311},[4667,4678],[78,100313],{"className":100314,"style":4740},[4739],[78,100316,8661],{"className":100317},[4744],[78,100319],{"className":100320,"style":4740},[4739],[78,100322,100324,100327,100399,100402,100405],{"className":100323},[4658],[78,100325],{"className":100326,"style":91855},[4662],[78,100328,100330,100333],{"className":100329},[4667],[78,100331,27152],{"className":100332,"style":38285},[4667,4678],[78,100334,100336],{"className":100335},[4689],[78,100337,100339],{"className":100338},[4693],[78,100340,100342],{"className":100341},[4698],[78,100343,100345],{"className":100344,"style":91855},[4702],[78,100346,100347,100350],{"style":5209},[78,100348],{"className":100349,"style":4711},[4710],[78,100351,100353],{"className":100352},[4715,4716,4717,4718],[78,100354,100356,100396],{"className":100355},[4667,4718],[78,100357,100359,100362],{"className":100358},[4667,4718],[78,100360,5053],{"className":100361,"style":5170},[4667,4678,4718],[78,100363,100365],{"className":100364},[4689],[78,100366,100368,100388],{"className":100367},[4693,4694],[78,100369,100371,100385],{"className":100370},[4698],[78,100372,100374],{"className":100373,"style":99648},[4702],[78,100375,100376,100379],{"style":99651},[78,100377],{"className":100378,"style":4896},[4710],[78,100380,100382],{"className":100381},[4715,4900,4901,4718],[78,100383,262],{"className":100384},[4667,4678,4718],[78,100386,4726],{"className":100387},[4725],[78,100389,100391],{"className":100390},[4698],[78,100392,100394],{"className":100393,"style":84716},[4702],[78,100395],{},[78,100397,5074],{"className":100398,"style":5219},[4667,4678,4718],[78,100400],{"className":100401,"style":4740},[4739],[78,100403,52231],{"className":100404},[4744],[78,100406],{"className":100407,"style":4740},[4739],[78,100409,100411,100414,100455,100458,100461,100464,100467,100508,100511,100514],{"className":100410},[4658],[78,100412],{"className":100413,"style":85831},[4662],[78,100415,100417,100420],{"className":100416},[4667],[78,100418,5042],{"className":100419,"style":5143},[4667,4678],[78,100421,100423],{"className":100422},[4689],[78,100424,100426],{"className":100425},[4693],[78,100427,100429],{"className":100428},[4698],[78,100430,100432],{"className":100431,"style":5206},[4702],[78,100433,100434,100437],{"style":5209},[78,100435],{"className":100436,"style":4711},[4710],[78,100438,100440],{"className":100439},[4715,4716,4717,4718],[78,100441,100443,100446,100449,100452],{"className":100442},[4667,4718],[78,100444,100236],{"className":100445},[4667,4718],[78,100447,5074],{"className":100448,"style":5219},[4667,4678,4718],[78,100450,43664],{"className":100451},[7450,4718],[78,100453,1044],{"className":100454},[4667,4718],[78,100456,100245],{"className":100457},[4667,6184],[78,100459,27107],{"className":100460,"style":17251},[4667,4678],[78,100462,99983],{"className":100463},[4667,4678],[78,100465,100254],{"className":100466},[4667,6184],[78,100468,100470,100473],{"className":100469},[4667],[78,100471,5053],{"className":100472,"style":5170},[4667,4678],[78,100474,100476],{"className":100475},[4689],[78,100477,100479,100500],{"className":100478},[4693,4694],[78,100480,100482,100497],{"className":100481},[4698],[78,100483,100485],{"className":100484,"style":5279},[4702],[78,100486,100488,100491],{"style":100487},"top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;",[78,100489],{"className":100490,"style":4711},[4710],[78,100492,100494],{"className":100493},[4715,4716,4717,4718],[78,100495,262],{"className":100496},[4667,4678,4718],[78,100498,4726],{"className":100499},[4725],[78,100501,100503],{"className":100502},[4698],[78,100504,100506],{"className":100505,"style":4733},[4702],[78,100507],{},[78,100509],{"className":100510,"style":4740},[4739],[78,100512,4609],{"className":100513},[4744],[78,100515],{"className":100516,"style":4740},[4739],[78,100518,100520,100523,100526,100529,100533,100536,100539,100542,100545,100548,100551,100554],{"className":100519},[4658],[78,100521],{"className":100522,"style":4663},[4662],[78,100524,1021],{"className":100525},[4667],[78,100527,5535],{"className":100528,"style":5578},[4667,4678],[78,100530,100269],{"className":100531,"style":100532},[4667,4678],"margin-right:0.0813em;",[78,100534,25949],{"className":100535,"style":43903},[4667,4678],[78,100537,100274],{"className":100538},[4667,6184],[78,100540,63346],{"className":100541},[4667],[78,100543,5042],{"className":100544,"style":5143},[4667,4678],[78,100546,63346],{"className":100547},[4667],[78,100549],{"className":100550,"style":4740},[4739],[78,100552,4609],{"className":100553},[4744],[78,100555],{"className":100556,"style":4740},[4739],[78,100558,100560,100563,100566],{"className":100559},[4658],[78,100561],{"className":100562,"style":18224},[4662],[78,100564,100285],{"className":100565},[4667],[78,100567,67],{"className":100568},[4667,6184],[13,100570,100571],{},"Enc 的输出称为声学代码。Sound Stream 使用残差矢量量化方案，以 50Hz 的速率产生 12 维声学代码矢量——前 4 维和其余 8 维分别是粗略和精细声学代码。AudioLM “压缩”这些粗码和细码，每秒音频的诱导率分别为 200 和 400。我们注意到波形 w 的平坦粗声码为 coarse(w)，平坦细声码为 fine(w)。请注意，由于其残差量化方案，SoundStream 可以单独从粗码解码音频，尽管从粗码和细码解码会产生更高的音频保真度。",[13,100573,100574,100577],{},[22,100575,100576],{},"语义代码"," 过去的音乐音频生成模型，如 Jukebox（Wu 等人，2022），已经用更大的模型直接建模了类似于声学代码的再现。相反，AudioLM 建议使用较小的模型来对",[78,100579,100581],{"className":100580},[4566],[78,100582,100584,100644],{"className":100583},[4570],[78,100585,100587],{"className":100586},[4574],[4576,100588,100589],{"xmlns":4578,"display":4579},[4581,100590,100591,100641],{},[4584,100592,100593,100596,100598,100600,100602,100604,100618,100620,100630,100632,100634,100636,100638],{},[4587,100594,100595],{},"源自语义编码器",[4596,100597,43693],{},[4596,100599,4618],{},[4596,100601,5058],{},[4591,100603,8661],{},[4614,100605,100606,100608],{},[4596,100607,27152],{},[4584,100609,100610,100616],{},[4600,100611,100612,100614],{},[4596,100613,5053],{},[4596,100615,262],{},[4596,100617,5074],{},[4591,100619,52231],{},[4614,100621,100622,100624],{},[4596,100623,43693],{},[4584,100625,100626,100628],{},[7077,100627,22827],{},[4596,100629,5074],{},[4587,100631,94528],{},[7077,100633,22827],{},[4596,100635,100269],{},[4596,100637,25949],{},[4587,100639,100640],{},"下工作，并用自监督损失而不是声学重建损失进行训练。",[4647,100642,100643],{"encoding":4649},"源自语义编码器 Sem:R^{f_sT} → S^{25T}在 25 Hz 下工作，并用自监督损失而不是声学重建损失进行训练。",[78,100645,100647,100674,100761],{"className":100646,"ariaHidden":1419},[4654],[78,100648,100650,100653,100656,100659,100662,100665,100668,100671],{"className":100649},[4658],[78,100651],{"className":100652,"style":18224},[4662],[78,100654,100595],{"className":100655},[4667,6184],[78,100657,43693],{"className":100658,"style":7153},[4667,4678],[78,100660,4618],{"className":100661},[4667,4678],[78,100663,5058],{"className":100664},[4667,4678],[78,100666],{"className":100667,"style":4740},[4739],[78,100669,8661],{"className":100670},[4744],[78,100672],{"className":100673,"style":4740},[4739],[78,100675,100677,100680,100752,100755,100758],{"className":100676},[4658],[78,100678],{"className":100679,"style":91855},[4662],[78,100681,100683,100686],{"className":100682},[4667],[78,100684,27152],{"className":100685,"style":38285},[4667,4678],[78,100687,100689],{"className":100688},[4689],[78,100690,100692],{"className":100691},[4693],[78,100693,100695],{"className":100694},[4698],[78,100696,100698],{"className":100697,"style":91855},[4702],[78,100699,100700,100703],{"style":5209},[78,100701],{"className":100702,"style":4711},[4710],[78,100704,100706],{"className":100705},[4715,4716,4717,4718],[78,100707,100709,100749],{"className":100708},[4667,4718],[78,100710,100712,100715],{"className":100711},[4667,4718],[78,100713,5053],{"className":100714,"style":5170},[4667,4678,4718],[78,100716,100718],{"className":100717},[4689],[78,100719,100721,100741],{"className":100720},[4693,4694],[78,100722,100724,100738],{"className":100723},[4698],[78,100725,100727],{"className":100726,"style":99648},[4702],[78,100728,100729,100732],{"style":99651},[78,100730],{"className":100731,"style":4896},[4710],[78,100733,100735],{"className":100734},[4715,4900,4901,4718],[78,100736,262],{"className":100737},[4667,4678,4718],[78,100739,4726],{"className":100740},[4725],[78,100742,100744],{"className":100743},[4698],[78,100745,100747],{"className":100746,"style":84716},[4702],[78,100748],{},[78,100750,5074],{"className":100751,"style":5219},[4667,4678,4718],[78,100753],{"className":100754,"style":4740},[4739],[78,100756,52231],{"className":100757},[4744],[78,100759],{"className":100760,"style":4740},[4739],[78,100762,100764,100767,100802,100805,100808,100811,100814],{"className":100763},[4658],[78,100765],{"className":100766,"style":5206},[4662],[78,100768,100770,100773],{"className":100769},[4667],[78,100771,43693],{"className":100772,"style":7153},[4667,4678],[78,100774,100776],{"className":100775},[4689],[78,100777,100779],{"className":100778},[4693],[78,100780,100782],{"className":100781},[4698],[78,100783,100785],{"className":100784,"style":5206},[4702],[78,100786,100787,100790],{"style":5209},[78,100788],{"className":100789,"style":4711},[4710],[78,100791,100793],{"className":100792},[4715,4716,4717,4718],[78,100794,100796,100799],{"className":100795},[4667,4718],[78,100797,22827],{"className":100798},[4667,4718],[78,100800,5074],{"className":100801,"style":5219},[4667,4678,4718],[78,100803,94528],{"className":100804},[4667,6184],[78,100806,22827],{"className":100807},[4667],[78,100809,100269],{"className":100810,"style":100532},[4667,4678],[78,100812,25949],{"className":100813,"style":43903},[4667,4678],[78,100815,100640],{"className":100816},[4667,6184],[13,100818,100819],{},"语义编码器由来自预先训练的 w2v-BERT 模型（Chung 等人，2021）的中间表示组成，这些中间表示已经用 k- 均值量化，其中 k = |S| = 1024。",[13,100821,100822],{},"AudioLM 是三个模型的级联，它们生成越来越高的速率代码。具体而言，AudioLM 将语义和声学代码的联合分布分解为：",[78,100824,100826],{"className":100825},[4566],[78,100827,100829,100981],{"className":100828},[4570],[78,100830,100832],{"className":100831},[4574],[4576,100833,100834],{"xmlns":4578,"display":4579},[4581,100835,100836,100978],{},[4584,100837,100838,100840,100842,100844,100846,100848,100850,100852,100854,100856,100858,100860,100862,100864,100866,100868,100870,100872,100874,100876,100878,100880,100882,100884,100886,100888,100890,100892,100894,100896,100898,100900,100902,100904,100906,100908,100910,100912,100914,100916,100918,100920,100922,100924,100926,100928,100930,100932,100934,100936,100938,100940,100942,100944,100946,100948,100950,100952,100954,100956,100958,100960,100962,100964,100966,100968,100970,100972,100974,100976],{},[4596,100839,7062],{},[4591,100841,4594],{"stretchy":4593},[4596,100843,43693],{},[4596,100845,4618],{},[4596,100847,5058],{},[4591,100849,4594],{"stretchy":4593},[4596,100851,85783],{},[4591,100853,4604],{"stretchy":4593},[4591,100855,2066],{"separator":1419},[4596,100857,7065],{},[4596,100859,19],{},[4596,100861,7360],{},[4591,100863,4594],{"stretchy":4593},[4596,100865,85783],{},[4591,100867,4604],{"stretchy":4593},[4591,100869,4604],{"stretchy":4593},[4591,100871,4609],{},[4739,100873],{"linebreak":52940},[4596,100875,7062],{},[4591,100877,4594],{"stretchy":4593},[4596,100879,63331],{},[4596,100881,39],{},[4596,100883,19],{},[4596,100885,4618],{},[4591,100887,4594],{"stretchy":4593},[4596,100889,85783],{},[4591,100891,4604],{"stretchy":4593},[4596,100893,63346],{"mathvariant":7101},[4596,100895,43678],{},[4596,100897,5025],{},[4596,100899,5009],{},[4596,100901,17132],{},[4596,100903,262],{},[4596,100905,4618],{},[4591,100907,4594],{"stretchy":4593},[4596,100909,85783],{},[4591,100911,4604],{"stretchy":4593},[4591,100913,4604],{"stretchy":4593},[4739,100915],{"linebreak":52940},[4591,100917,17162],{"separator":1419},[4596,100919,7062],{},[4591,100921,4594],{"stretchy":4593},[4596,100923,43678],{},[4596,100925,5025],{},[4596,100927,5009],{},[4596,100929,17132],{},[4596,100931,262],{},[4596,100933,4618],{},[4591,100935,4594],{"stretchy":4593},[4596,100937,85783],{},[4591,100939,4604],{"stretchy":4593},[4596,100941,63346],{"mathvariant":7101},[4596,100943,43693],{},[4596,100945,4618],{},[4596,100947,5058],{},[4591,100949,4594],{"stretchy":4593},[4596,100951,85783],{},[4591,100953,4604],{"stretchy":4593},[4591,100955,4604],{"stretchy":4593},[4739,100957],{"linebreak":52940},[4591,100959,17162],{"separator":1419},[4596,100961,7062],{},[4591,100963,4594],{"stretchy":4593},[4596,100965,43693],{},[4596,100967,4618],{},[4596,100969,5058],{},[4591,100971,4594],{"stretchy":4593},[4596,100973,85783],{},[4591,100975,4604],{"stretchy":4593},[4591,100977,4604],{"stretchy":4593},[4647,100979,100980],{"encoding":4649},"P(Sem(w), Enc(w)) = \\\\\nP(Fine(w) | Coarse(w)) \\\\\n· P(Coarse(w) | Sem(w)) \\\\\n· P(Sem(w))",[78,100982,100984,101044,101047,101105,101108,101171,101174],{"className":100983,"ariaHidden":1419},[4654],[78,100985,100987,100990,100993,100996,100999,101002,101005,101008,101011,101014,101017,101020,101023,101026,101029,101032,101035,101038,101041],{"className":100986},[4658],[78,100988],{"className":100989,"style":4663},[4662],[78,100991,7062],{"className":100992,"style":5219},[4667,4678],[78,100994,4594],{"className":100995},[4674],[78,100997,43693],{"className":100998,"style":7153},[4667,4678],[78,101000,4618],{"className":101001},[4667,4678],[78,101003,5058],{"className":101004},[4667,4678],[78,101006,4594],{"className":101007},[4674],[78,101009,85783],{"className":101010,"style":85838},[4667,4678],[78,101012,4604],{"className":101013},[4682],[78,101015,2066],{"className":101016},[5126],[78,101018],{"className":101019,"style":4839},[4739],[78,101021,7065],{"className":101022,"style":7153},[4667,4678],[78,101024,19],{"className":101025},[4667,4678],[78,101027,7360],{"className":101028},[4667,4678],[78,101030,4594],{"className":101031},[4674],[78,101033,85783],{"className":101034,"style":85838},[4667,4678],[78,101036,38757],{"className":101037},[4682],[78,101039],{"className":101040,"style":4740},[4739],[78,101042,4609],{"className":101043},[4744],[78,101045],{"className":101046},[4739,52940],[78,101048,101050,101053,101056,101059,101062,101065,101068,101071,101074,101077,101080,101083,101086,101089,101092,101096,101099,101102],{"className":101049},[4658],[78,101051],{"className":101052,"style":4663},[4662],[78,101054,7062],{"className":101055,"style":5219},[4667,4678],[78,101057,4594],{"className":101058},[4674],[78,101060,63331],{"className":101061,"style":5219},[4667,4678],[78,101063,7201],{"className":101064},[4667,4678],[78,101066,4618],{"className":101067},[4667,4678],[78,101069,4594],{"className":101070},[4674],[78,101072,85783],{"className":101073,"style":85838},[4667,4678],[78,101075,4604],{"className":101076},[4682],[78,101078,63346],{"className":101079},[4667],[78,101081,43678],{"className":101082,"style":5133},[4667,4678],[78,101084,5025],{"className":101085},[4667,4678],[78,101087,5009],{"className":101088},[4667,4678],[78,101090,17132],{"className":101091,"style":17251},[4667,4678],[78,101093,101095],{"className":101094},[4667,4678],"se",[78,101097,4594],{"className":101098},[4674],[78,101100,85783],{"className":101101,"style":85838},[4667,4678],[78,101103,38757],{"className":101104},[4682],[78,101106],{"className":101107},[4739,52940],[78,101109,101111,101114,101117,101120,101123,101126,101129,101132,101135,101138,101141,101144,101147,101150,101153,101156,101159,101162,101165,101168],{"className":101110},[4658],[78,101112],{"className":101113,"style":4663},[4662],[78,101115,17162],{"className":101116},[5126],[78,101118],{"className":101119,"style":4839},[4739],[78,101121,7062],{"className":101122,"style":5219},[4667,4678],[78,101124,4594],{"className":101125},[4674],[78,101127,43678],{"className":101128,"style":5133},[4667,4678],[78,101130,5025],{"className":101131},[4667,4678],[78,101133,5009],{"className":101134},[4667,4678],[78,101136,17132],{"className":101137,"style":17251},[4667,4678],[78,101139,101095],{"className":101140},[4667,4678],[78,101142,4594],{"className":101143},[4674],[78,101145,85783],{"className":101146,"style":85838},[4667,4678],[78,101148,4604],{"className":101149},[4682],[78,101151,63346],{"className":101152},[4667],[78,101154,43693],{"className":101155,"style":7153},[4667,4678],[78,101157,4618],{"className":101158},[4667,4678],[78,101160,5058],{"className":101161},[4667,4678],[78,101163,4594],{"className":101164},[4674],[78,101166,85783],{"className":101167,"style":85838},[4667,4678],[78,101169,38757],{"className":101170},[4682],[78,101172],{"className":101173},[4739,52940],[78,101175,101177,101180,101183,101186,101189,101192,101195,101198,101201,101204,101207],{"className":101176},[4658],[78,101178],{"className":101179,"style":4663},[4662],[78,101181,17162],{"className":101182},[5126],[78,101184],{"className":101185,"style":4839},[4739],[78,101187,7062],{"className":101188,"style":5219},[4667,4678],[78,101190,4594],{"className":101191},[4674],[78,101193,43693],{"className":101194,"style":7153},[4667,4678],[78,101196,4618],{"className":101197},[4667,4678],[78,101199,5058],{"className":101200},[4667,4678],[78,101202,4594],{"className":101203},[4674],[78,101205,85783],{"className":101206,"style":85838},[4667,4678],[78,101208,38757],{"className":101209},[4682],[13,101211,101212],{},"假设 Fine(w) ⫫ Sem(w)|Coarse(w)，即语义代码对于生成给定粗糙代码的精细声学代码是无益的。每个模型都是一个自动的、仅限解码器的转换器（Vaswani 等人，2017）“语言模型”是单独训练的，条件反射是通过简单地连接两个序列来实现的。",[13,101214,101215],{},"为了用 AudioLM 生成音频，首先对三个生成模块进行串行采样。然后，生成的语义代码作为副产品被丢弃，并且生成的声学代码被馈送到 Dec，从而产生波形。",[39316,101217,101219],{"id":101218},"_33-将-audiolm-改编为伴奏","3.3 将 AudioLM 改编为伴奏",{"title":119,"searchDepth":144,"depth":144,"links":101221},[101222,101223,101224,101225],{"id":68112,"depth":144,"text":68112},{"id":68121,"depth":144,"text":99505},{"id":99539,"depth":144,"text":99540},{"id":99552,"depth":144,"text":99553,"children":101226},[101227,101228,101229],{"id":99680,"depth":150,"text":99681},{"id":100175,"depth":150,"text":100176},{"id":101218,"depth":150,"text":101219},{},"Paper Reading\u002F3. SingSong Generating musical accompaniments from singing\u002FSingSong Generating musical accompaniments from singing.md","\u002Fundergraduate\u002Fnote-d7c9a368071b",{"title":99480,"description":99491},"undergraduate\u002Fnote-d7c9a368071b",[794,246,14542],"6ZTBoV_OFNwo6ySXtXu_W5pievwHRTecPOEmIFJ4qk4",{"id":101238,"title":101239,"assetBase":239,"author":8,"body":101240,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":101244,"navigation":128,"originalPath":101245,"path":101246,"seo":101247,"source":23330,"stem":101248,"tags":101249,"weight":250,"__hash__":101250},"content\u002Fundergraduate\u002Fnote-dd99b5d2ede6.md","Scala从0到1",{"type":10,"value":101241,"toc":101242},[],{"title":119,"searchDepth":144,"depth":144,"links":101243},[],{},"我的大学\u002F大三下学期\u002FSpark大数据分析技术\u002FScala从0到1.md","\u002Fundergraduate\u002Fnote-dd99b5d2ede6",{"title":101239,"description":119},"undergraduate\u002Fnote-dd99b5d2ede6",[2708],"dEkC1esr3oi8UCHQTVJTvMlMeJbp5mI4NNDc0x0lJSM",{"id":101252,"title":101253,"assetBase":239,"author":8,"body":101254,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":103848,"navigation":128,"originalPath":103849,"path":103850,"seo":103851,"source":23330,"stem":103852,"tags":103853,"weight":250,"__hash__":103854},"content\u002Fundergraduate\u002Fnote-e34afd16303c.md","离线数仓总结（下）",{"type":10,"value":101255,"toc":103821},[101256,101260,101262,101264,101266,101268,101270,101274,101280,101286,101291,101294,101297,101301,101306,101310,101315,101317,101321,101362,101365,101369,101372,101375,101418,101422,101425,101444,101448,101451,101459,101461,101465,101468,101471,101475,101480,101484,101488,101491,101496,101499,101504,101507,101510,101567,101572,101574,101577,101580,101585,101588,101592,101597,101601,101603,101606,101610,101667,101669,101674,101679,101682,101686,101689,101778,101782,101819,101823,101825,101828,101833,101837,101907,101909,101913,101917,101922,101926,101930,101966,101970,101973,101976,101979,101983,102010,102013,102017,102020,102023,102034,102039,102042,102155,102158,102173,102177,102184,102187,102198,102200,102352,102354,102849,102853,102859,102862,102873,102875,102970,102972,103160,103164,103167,103170,103181,103184,103186,103317,103319,103573,103577,103658,103660,103738,103740,103819],[107,101257,101259],{"id":101258},"第三章-电商业务介绍","第三章 电商业务介绍",[7759,101261,48732],{"id":48731},[13,101263,48282],{},[13,101265,48285],{},[13,101267,48288],{},[13,101269,48291],{},[7759,101271,101273],{"id":101272},"_2常识概念","2、常识概念",[13,101275,101276,101279],{},[22,101277,101278],{},"SKU","（Stock Keeping Unit，库存量基本单位）：现在已经被引申为产品统一编号的简称，每种产品均对应有唯一的SKU号。",[13,101281,101282,101285],{},[22,101283,101284],{},"SPU","（Standard Product Unit）：是商品信息聚合的最小单位，是一组可复用、易检索的标准化信息集合。",[72,101287,101288],{},[13,101289,101290],{},"简单说明就是商品是SKU，商品含属性是SPU，例如一台iPhone是一个SKU，但是64G版本和128G版本的iPhone是两个不同的SPU。",[13,101292,101293],{},"**平台属性：**相当于过滤条件，方便用户定位想要的产品参数。",[13,101295,101296],{},"**销售属性：**相当于商品属性，代表一个商品SPU的参数。",[7759,101298,101300],{"id":101299},"_3业务数据关系图","3、业务数据关系图",[13,101302,101303],{},[617,101304],{"alt":119,"src":101305},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F2.png",[7759,101307,101309],{"id":101308},"_4后台数据关系图","4、后台数据关系图",[13,101311,101312],{},[617,101313],{"alt":119,"src":101314},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F3.png",[23289,101316],{},[107,101318,101320],{"id":101319},"第四章-数据同步策略","第四章 数据同步策略",[8366,101322,101323,101334],{},[8369,101324,101325],{},[8372,101326,101327,101330,101332],{},[8375,101328,101329],{},"同步策略",[8375,101331,20689],{},[8375,101333,20692],{},[8386,101335,101336,101349],{},[8372,101337,101338,101343,101346],{},[8391,101339,101340],{},[22,101341,101342],{},"全量同步",[8391,101344,101345],{},"逻辑简单",[8391,101347,101348],{},"在某些情况下效率较低。例如某张表数据量较大，但是每天数据的变化比例很低，若对其采用每日全量同步，则会重复同步和存储大量相同的数据。",[8372,101350,101351,101356,101359],{},[8391,101352,101353],{},[22,101354,101355],{},"增量同步",[8391,101357,101358],{},"效率高，无需同步和存储重复数据",[8391,101360,101361],{},"逻辑复杂，需要将每日的新增及变化数据同原来的数据进行整合，才能使用",[13,101363,101364],{},"通常情况，业务表数据量比较大，优先考虑增量，数据量比较小，优先考虑全量；具体选择由数仓模型决定。",[7759,101366,101368],{"id":101367},"_0同步工具","0、同步工具",[13,101370,101371],{},"数据同步工具种类繁多，大致可分为两类，一类是以DataX、Sqoop为代表的基于Select查询的离线、批量同步工具，另一类是以Maxwell、Canal为代表的基于数据库数据变更日志（例如MySQL的binlog，其会实时记录所有的insert、update以及delete操作）的实时流式同步工具。",[13,101373,101374],{},"全量同步通常使用DataX、Sqoop等基于查询的离线同步工具。而增量同步既可以使用DataX、Sqoop等工具，也可使用Maxwell、Canal等工具，下面对增量同步不同方案进行简要对比。",[8366,101376,101377,101390],{},[8369,101378,101379],{},[8372,101380,101381,101384,101387],{},[8375,101382,101383],{},"增量同步方案",[8375,101385,101386],{},"DataX\u002FSqoop",[8375,101388,101389],{},"Maxwell\u002FCanal",[8386,101391,101392,101405],{},[8372,101393,101394,101399,101402],{},[8391,101395,101396],{},[22,101397,101398],{},"对数据库的要求",[8391,101400,101401],{},"原理是基于查询，故若想通过select查询获取新增及变化数据，就要求数据表中存在create_time、update_time等字段，然后根据这些字段获取变更数据。",[8391,101403,101404],{},"要求数据库记录变更操作，例如MySQL需开启binlog。",[8372,101406,101407,101412,101415],{},[8391,101408,101409],{},[22,101410,101411],{},"数据的中间状态",[8391,101413,101414],{},"由于是离线批量同步，故若一条数据在一天中变化多次，该方案只能获取最后一个状态，中间状态无法获取。",[8391,101416,101417],{},"由于是实时获取所有的数据变更操作，所以可以获取变更数据的所有中间状态。",[7759,101419,101421],{"id":101420},"_1全量同步","1、全量同步",[13,101423,101424],{},"全量同步是指将源端数据全部同步到目标端，而不管数据是否发生变化。全量同步的优点是可以保证目标端数据的完整性，缺点是同步时间长，占用带宽大。全量同步一般用于首次同步或者源端数据发生重大变化时。",[72,101426,101427,101430,101438,101441],{},[13,101428,101429],{},"全量同步是对数据进行完整备份，一般消耗的资源大，速度慢。在没有建设数仓时，全量同步兼具了",[49,101431,101432,101435],{},[52,101433,101434],{},"对变动较大的数据全量拷贝",[52,101436,101437],{},"对建库前数据进行统计",[13,101439,101440],{},"的功能，简单来说就是：我在2023\u002F3\u002F30创建数据仓库，但是我本地存储了2023\u002F3\u002F1到2023\u002F3\u002F30的数据，这时候就需要全量同步到HDFS。",[13,101442,101443],{},"使用方式是使用DataX对需要进行全量同步的MySQL表进行拷贝到HDFS，DataX可以使用Reader\u002FWriter机制将不同数据源的数据读出\u002F写入，保证了格式的一致性。",[7759,101445,101447],{"id":101446},"_2增量同步","2、增量同步",[13,101449,101450],{},"增量同步是指在数据同步的过程中，只将新增或修改的数据进行同步。增量同步的优点是同步时间短，占用带宽小，缺点是需要保证全量同步已经完成，否则增量同步会出现数据不完整的情况。增量同步一般用于全量同步之后的增量更新。",[72,101452,101453,101456],{},[13,101454,101455],{},"增量同步一般对新增数据进行同步，针对两种同步举个简单的例子：一个快产快销的商店拥有每天不同的商品种类和相对稳定的用户群体，那么针对商品我们采取全量同步来维持正在售卖的最新状态（变动大）；而对于用户我们采取增量同步的方式记录用户信息，因为不会出现一天时间大量的用户改名之类的操作。",[13,101457,101458],{},"使用方式是Maxwell+Kafka+Flume的方式将数据从MySQL抽取到HDFS，简单讲述下就是：Maxwell伪装成MySQL的server从机使用主从复制的方式读取MySQL的binlog日志进行数据拷贝，同时在Kafka中注册topic监听Maxwell，Maxwell作为生产者发送数据给Kafka，在Flume中建立消费者程序消费这些数据到HDFS的inc增量表中。",[23289,101460],{},[107,101462,101464],{"id":101463},"第五章-数据仓库概述与建模","第五章 数据仓库概述与建模",[7759,101466,101467],{"id":62488},"1、概念",[13,101469,101470],{},"数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据，借助数据仓库的分析能力，企业可从数据中获得宝贵的信息进而改进决策。同时，随着时间的推移，数据仓库中积累的大量历史数据对于数据科学家和业务分析师也是十分宝贵的。",[7759,101472,101474],{"id":101473},"_2核心架构","2、核心架构",[13,101476,101477],{},[617,101478],{"alt":119,"src":101479},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F4.png",[7759,101481,101483],{"id":101482},"_3数据仓库建模方法论","3、数据仓库建模方法论",[10548,101485,101487],{"id":101486},"_1e-r模型","（1）E-R模型",[13,101489,101490],{},"数据仓库之父Bill Inmon提出的建模方法是从全企业的高度，用实体关系（Entity Relationship，ER）模型来描述企业业务，并用规范化的方式表示出来，在范式理论上符合3NF。",[49,101492,101493],{},[52,101494,101495],{},"实体关系模型",[13,101497,101498],{},"实体关系模型将复杂的数据抽象为两个概念——实体和关系。实体表示一个对象，例如学生、班级，关系是指两个实体之间的关系，例如学生和班级之间的从属关系。",[49,101500,101501],{},[52,101502,101503],{},"数据库规范化",[13,101505,101506],{},"数据库规范化是使用一系列范式设计数据库（通常是关系型数据库）的过程，其目的是减少数据冗余，增强数据的一致性。",[13,101508,101509],{},"这一系列范式就是指在设计关系型数据库时，需要遵从的不同的规范。关系型数据库的范式一共有六种，分别是第一范式（1NF）、第二范式（2NF）、第三范式（3NF）、巴斯-科德范式（BCNF）、第四范式(4NF）和第五范式（5NF）。遵循的范式级别越高，数据冗余性就越低。",[49,101511,101512],{},[52,101513,101514,101515],{},"三范式\n",[49,101516,101517,101531,101542,101553],{},[52,101518,101519,101520],{},"函数依赖\n",[49,101521,101522,101525,101528],{},[52,101523,101524],{},"完全函数依赖：通过AB能得出C，但是AB单独得不出C，那么C完全依赖于AB",[52,101526,101527],{},"部分函数依赖：通过AB能得出C，通过A或B也能得出C，那么C部分依赖于AB",[52,101529,101530],{},"传递函数依赖：通过A得到B，通过B得到C，但是通过C得不到A，那么C传递依赖于A",[52,101532,101533,101534],{},"第一范式\n",[49,101535,101536,101539],{},[52,101537,101538],{},"属性不可切割",[52,101540,101541],{},"例：5台电脑 --> 5、电脑 -x->不可再分",[52,101543,101544,101545],{},"第二范式\n",[49,101546,101547,101550],{},[52,101548,101549],{},"不能存在不分函数依赖",[52,101551,101552],{},"（简单来说就是分拆主键）",[52,101554,101555,101556],{},"第三范式\n",[49,101557,101558,101561,101564],{},[52,101559,101560],{},"不能存在传递函数依赖",[52,101562,101563],{},"（简单来说就是将具有两层关系【总三层+】的表分拆到不同表）",[52,101565,101566],{},"例：学号==学院==院长，学号可以推出学院，学院可以推出院长，但是院长无法推出学生关系，所以应该分拆到两张表中。",[13,101568,101569],{},[22,101570,101571],{},"这种建模方法的出发点是整合数据，其目的是将整个企业的数据进行组合和合并，并进行规范处理，减少数据冗余性，保证数据的一致性。这种模型并不适合直接用于分析统计。",[10548,101573,31684],{"id":31683},[13,101575,101576],{},"维度模型将复杂的业务通过事实和维度两个概念进行呈现。事实通常对应业务过程，而维度通常对应业务过程发生时所处的环境。",[13,101578,101579],{},"**注：**业务过程可以概括为一个个不可拆分的行为事件，例如电商交易中的下单，取消订单，付款，退单等，都是业务过程。",[13,101581,101582],{},[22,101583,101584],{},"维度建模以数据分析作为出发点，为数据分析服务，因此它关注的重点的用户如何更快的完成需求分析以及如何实现较好的大规模复杂查询的响应性能。",[13,101586,101587],{},"因此，我们通常的数仓建模采用的是维度建模。",[107,101589,101591],{"id":101590},"第六章-维度建模","第六章 维度建模",[72,101593,101594],{},[13,101595,101596],{},"虽然尚硅谷的文档中将事实表放在了前面，但是不得不说，应该先介绍下维度表再讲解事实表，一方面是根据阿里系的《大数据之路》的介绍流程，另一方面是选用的五层建模中DIM层确实是在DWD层之前，因此更换下顺序方便阅读。",[7759,101598,101600],{"id":101599},"_1维度表","1、维度表",[10548,101602,27707],{"id":27706},[13,101604,101605],{},"维度表是维度建模的基础和灵魂。前文提到，事实表紧紧围绕业务过程进行设计，而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段，维度字段称为维度属性。",[10548,101607,101609],{"id":101608},"_2设计流程","（2）设计流程",[49,101611,101612,101636,101648],{},[52,101613,101614,101615],{},"确定维度（表）",[72,101616,101617],{},[49,101618,101619],{},[52,101620,101621,101622],{},"原文这里是从事实表中得到的维度，但是如果优先创建维度表的话那么我们应该怎么创建呢？个人认为是根据以下几种方式创建维度：\n",[49,101623,101624,101627,101630],{},[52,101625,101626],{},"根据数据库表中的公有字段创建。例如：如果每张表中都有记录时间信息，那么一定会有时间维度。",[52,101628,101629],{},"根据物理实体创建维度。例如：用户、商品是真实的实体，那么用户就有了用户维度、商品就有了商品维度。",[52,101631,101632,101633],{},"相似结果进行聚合。例如：一张表中同时具有几种语言、地区的编码格式，那么就可以将这几种编码进行聚合，形成地区维度\u002F编码维度。",[22,101634,101635],{},"但是如果只有少量数据（比如一种编码），那么不必要单独创建一个维度，而是直接放进共用表\u002F融入部分维度字段传递给事实表部分。",[52,101637,101638,101639],{},"确定主维表和相关维表",[49,101640,101641],{},[52,101642,101643,101644,101647],{},"此处的主维表和相关维表均指",[22,101645,101646],{},"业务系统","中与某维度相关的表。维度表的粒度通常与主维表相同。",[52,101649,101650,101651],{},"确定维度属性",[49,101652,101653],{},[52,101654,101655,101656],{},"确定维度属性即确定维度表字段。维度属性主要来自于业务系统中与该维度对应的主维表和相关维表。维度属性可直接从主维表或相关维表中选择，也可通过进一步加工得到。\n",[49,101657,101658,101661,101664],{},[52,101659,101660],{},"尽可能生成丰富的维度属性",[52,101662,101663],{},"尽量不使用编码，而使用明确的文字说明，一般可以编码和文字共存",[52,101665,101666],{},"尽量沉淀出通用的维度属性",[10548,101668,31907],{"id":31906},[13,101670,101671,101673],{},[22,101672,29763],{},"是指使用一系列范式设计数据库的过程，其目的是减少数据冗余，增强数据的一致性。通常情况下，规范化之后，一张表的字段会拆分到多张表。",[13,101675,101676,101678],{},[22,101677,31924],{},"是指将多张表的数据冗余到一张表，其目的是减少join操作，提高查询性能。",[13,101680,101681],{},"在设计维度表时，如果对其进行规范化，得到的维度模型称为雪花模型，如果对其进行反规范化，得到的模型称为星型模型。",[10548,101683,101685],{"id":101684},"_4维度变化","（4）维度变化",[13,101687,101688],{},"维度属性通常不是静态的，而是会随时间变化的，数据仓库的一个重要特点就是反映历史的变化，所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态，通常有以下两种做法，分别是全量快照表和拉链表。",[49,101690,101691,101706],{},[52,101692,101693,101694],{},"全量快照表",[49,101695,101696,101701],{},[52,101697,101698,101700],{},[22,101699,20689],{},"是简单而有效，开发和维护成本低，且方便理解和使用。",[52,101702,101703,101705],{},[22,101704,20692],{},"是浪费存储空间，尤其是当数据的变化比例比较低时。",[52,101707,101708,101709],{},"拉链表",[49,101710,101711,101775],{},[52,101712,101713,101714,101716,101717,101762],{},"**什么是拉链表？**拉链表记录每一条数据的生命周期，一旦一条数据的生命周期结束，就重新开始一条新的记录，并把当前日期放入生效开始日期。",[2996,101715],{},"例：以小艾改名小艾同学为例，在用户维度表中会有以下变化：",[8366,101718,101719,101735],{},[8369,101720,101721],{},[8372,101722,101723,101726,101729,101732],{},[8375,101724,101725],{},"用户ID",[8375,101727,101728],{},"姓名",[8375,101730,101731],{},"开始日期",[8375,101733,101734],{},"结束日期",[8386,101736,101737,101750],{},[8372,101738,101739,101741,101744,101747],{},[8391,101740,469],{},[8391,101742,101743],{},"小艾",[8391,101745,101746],{},"2020-06-18",[8391,101748,101749],{},"2023-03-30",[8372,101751,101752,101754,101757,101759],{},[8391,101753,469],{},[8391,101755,101756],{},"小艾同学",[8391,101758,101749],{},[8391,101760,101761],{},"9999-12-31",[72,101763,101764,101767],{},[13,101765,101766],{},"可以看出，拉链表中ID不会作为主键，所有相同ID共同记录了一个用户的数据变更，不同于全量快照表，拉链表比较麻烦的是：",[49,101768,101769,101772],{},[52,101770,101771],{},"需要对修改数据维护一个结束时间，并插入新状态和时间",[52,101773,101774],{},"需要对新插入数据维护一个结束日期（一般采用单独缓存表\u002F固定字段维护）",[52,101776,101777],{},"拉链表适合于：数据会发生变化，但是变化频率并不高的维度（缓慢变化维）",[10548,101779,101781],{"id":101780},"_5多值维度-多值属性的解决","（5）多值维度 && 多值属性的解决",[49,101783,101784,101803],{},[52,101785,101786,101787],{},"多值维度",[49,101788,101789],{},[52,101790,101791,101792],{},"如果事实表中一条记录在某个维度表中有多条记录与之对应，称为多值维度。解决方案：\n",[49,101793,101794,101800],{},[52,101795,101796,101797],{},"降低事实表的粒度，例如将订单事实表的粒度由一个订单降低为一个订单中的一个商品项。",[22,101798,101799],{},"（建议）",[52,101801,101802],{},"在事实表中采用多字段保存多个维度值，每个字段保存一个维度id。这种方案只适用于多值维度个数固定的情况。",[52,101804,101805,101806],{},"多值属性",[49,101807,101808],{},[52,101809,101810,101811],{},"维表中的某个属性同时有多个值，称之为“多值属性”。解决方案：\n",[49,101812,101813,101816],{},[52,101814,101815],{},"将多值属性放到一个字段，该字段内容为key1:value1，key2:value2的形式，例如一个手机商品的平台属性值为“品牌:华为，系统:鸿蒙，CPU:麒麟990”。",[52,101817,101818],{},"将多值属性放到多个字段，每个字段对应一个属性。这种方案只适用于多值属性个数固定的情况。",[7759,101820,101822],{"id":101821},"_2事实表","2、事实表",[10548,101824,27707],{"id":27766},[13,101826,101827],{},"事实表作为数据仓库维度建模的核心，紧紧围绕着业务过程来设计。其包含与该业务过程有关的维度引用（维度表外键）以及该业务过程的度量（通常是可累加的数字类型字段）。事实表具有如下特点：",[49,101829,101830],{},[52,101831,101832],{},"事实表通常比较“细长”，即列较少，但行较多，且行的增速快。",[10548,101834,101836],{"id":101835},"_2分类","（2）分类",[49,101838,101839,101864,101897],{},[52,101840,101841,101842],{},"事务型事实表",[49,101843,101844,101850,101853],{},[52,101845,101846,101847,101849],{},"事务型事实表用来记录各业务过程，它保存的是各业务过程的原子操作事件，即最细粒度的操作事件。粒度是指事实表中一行数据所表达的业务细节程度。",[2996,101848],{},"事务型事实表可用于分析与各业务过程相关的各项统计指标，由于其保存了最细粒度的记录，可以提供最大限度的灵活性，可以支持无法预期的各种细节层次的统计需求。",[52,101851,101852],{},"**设计流程：**选择业务过程→声明粒度→确认维度→确认事实",[52,101854,101855,101856],{},"**不足：**事务型事实表可以保存所有业务过程的最细粒度的操作事件，故理论上其可以支撑与各业务过程相关的各种统计粒度的需求。但对于某些特定类型的需求，其逻辑可能会比较复杂，或者效率会比较低下。",[49,101857,101858,101861],{},[52,101859,101860],{},"存量型指标",[52,101862,101863],{},"多事务关联统计",[52,101865,101866,101867],{},"周期型快照事实表",[49,101868,101869,101872,101883],{},[52,101870,101871],{},"周期快照事实表以具有规律性的、可预见的时间间隔来记录事实，主要用于分析一些存量型（例如商品库存，账户余额）或者状态型（空气温度，行驶速度）指标。",[52,101873,101874,101877],{},[22,101875,101876],{},"设计流程",[49,101878,101879,101881],{},[52,101880,32344],{},[52,101882,32350],{},[52,101884,101885,101886],{},"**事实类型：**事实类型是指度量值的类型\n",[49,101887,101888,101891,101894],{},[52,101889,101890],{},"可加事实：可以按照与事实表相关的所有维度进行累加，例如事务型事实表中的事实",[52,101892,101893],{},"半可加事实：只能按照与事实表相关的一部分维度进行累加，例如周期型快照事实表中的事实。",[52,101895,101896],{},"不可加事实：完全不具备可加性，例如比率型事实。",[52,101898,101899,101900],{},"累积型快照事实表",[49,101901,101902,101905],{},[52,101903,101904],{},"累计快照事实表是基于一个业务流程中的多个关键业务过程联合处理而构建的事实表，如交易流程中的下单、支付、发货、确认收货业务过程。累积型快照事实表主要用于分析业务过程（里程碑）之间的时间间隔等需求。",[52,101906,101852],{},[23289,101908],{},[107,101910,101912],{"id":101911},"第七章-数据仓库设计与开发","第七章 数据仓库设计与开发",[7759,101914,101916],{"id":101915},"_1构建流程","1、构建流程",[13,101918,101919],{},[617,101920],{"alt":119,"src":101921},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F5.png",[7759,101923,101925],{"id":101924},"_2统计指标概述","2、统计指标概述",[10548,101927,101929],{"id":101928},"_1指标体系相关概念","（1）指标体系相关概念",[49,101931,101932,101946,101956],{},[52,101933,101934,101935,101937,101938,101941,101942,101945],{},"原子指标：基于某一",[22,101936,32221],{},"的",[22,101939,101940],{},"度量值","，是业务定义中不可再拆解的指标，原子指标的核心功能就是对指标的",[22,101943,101944],{},"聚合逻辑","进行了定义。我们可以得出结论，原子指标包含三要素，分别是业务过程、度量值和聚合逻辑。",[52,101947,101948,101949],{},"派生指标",[49,101950,101951],{},[52,101952,101953],{},[617,101954],{"alt":119,"src":101955},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F6.png",[52,101957,101958,101959],{},"衍生指标：在一个或多个派生指标的基础上，通过各种逻辑运算复合而成的。例如比率、比例等类型的指标。衍生指标也会对应实际的统计需求。",[49,101960,101961],{},[52,101962,101963],{},[617,101964],{"alt":119,"src":101965},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F7.png",[10548,101967,101969],{"id":101968},"_2指标体系对于数仓建模的意义","（2）指标体系对于数仓建模的意义",[13,101971,101972],{},"绝大多数的统计需求，都可以使用原子指标、派生指标以及衍生指标这套标准去定义。同时能够发现这些统计需求都直接的或间接的对应一个或者是多个派生指标。",[13,101974,101975],{},"当统计需求足够多时，必然会出现部分统计需求对应的派生指标相同的情况。这种情况下，我们就可以考虑将这些公共的派生指标保存下来，这样做的主要目的就是减少重复计算，提高数据的复用性。",[13,101977,101978],{},"这些公共的派生指标统一保存在数据仓库的DWS层。因此DWS层设计，就可以参考我们根据现有的统计需求整理出的派生指标。",[7759,101980,101982],{"id":101981},"_3数仓分层","3、数仓分层",[72,101984,101985,101988,101993],{},[13,101986,101987],{},"下面给出数据流转的脚本图并进行简单讲解",[13,101989,101990],{},[617,101991],{"alt":119,"src":101992},"img\u002F%E7%A6%BB%E7%BA%BF%E6%95%B0%E4%BB%93%E6%80%BB%E7%BB%93\u002F9.png",[49,101994,101995,101998,102001,102004,102007],{},[52,101996,101997],{},"ODS层是源数据的汇总，因此可以看到有HDFS中的业务数据（log）和后台数据（db）的集合，HDFS收集不同的数据来源\u002F全量与增量数据，在ODS中汇合。",[52,101999,102000],{},"一般后台数据是持久化到数据库的，变动的数据量并不大且通常为物理实体，所以一般作为全量备份，满足我之前说的维度表设计方式，所以使用db中的数据作为DIM层。",[52,102002,102003],{},"DWD作为明细数据，就是将业务数据进行“解包”操作，本来业务数据（log）是一块一块的，粒度比较高，这是时候就在DWD中拆分成粒度更小的数据库表，同样后台数据（db）也有部分数据是可以更好地描述数据状态（根据DWD需求，明细表最好是中文，能直接看懂的），所以同样将需要的DIM纳入DWD层。",[52,102005,102006],{},"DWS汇总数据层则是将DIM和DWD的数据以主题的形式进行汇总，这个时候DWS层的数据就是ADS的大表形式，可以说是对于粒度相同、相似的ADS需求将DIM、DWD数据表进行聚合。",[52,102008,102009],{},"ADS就是最终BI业务需求的展示表，表结构和形式不需要再修改（空值等之类的格式问题不在此列），能够实现导出之后一张表就是一个数据监控。",[13,102011,102012],{},"之后会详细介绍每个表的建表格式和数据装载，每一层举一个例子。",[10548,102014,102016],{"id":102015},"_1ods层operation-data-store原始数据层","（1）ODS层（Operation Data Store，原始数据层）",[13,102018,102019],{},"存储未处理过的原始数据，结构上与源数据保持一致，是数据仓库的数据准备区。",[13,102021,102022],{},"ODS层的设计要点如下：",[49,102024,102025,102028,102031],{},[52,102026,102027],{},"ODS层的表结构设计依托于从业务系统同步过来的数据结构。",[52,102029,102030],{},"ODS层要保存全部历史数据，故其压缩格式应选择压缩比较高的，此处选择gzip。",[52,102032,102033],{},"ODS层表名的命名规范为：ods_表名_单分区增量全量标识（inc\u002Ffull）。",[72,102035,102036],{},[13,102037,102038],{},"ODS层的数据就是增量\u002F全量同步过来的原生数据，并对格式进行统一。将全量表和增量表从HDFS转到Hive。",[13,102040,102041],{},"【1】建表",[114,102043,102045],{"className":33693,"code":102044,"language":33695,"meta":119,"style":119},"-- 活动信息表（全量表）\nDROP TABLE IF EXISTS ods_activity_info_full;\nCREATE EXTERNAL TABLE ods_activity_info_full\n(\n    `id`            STRING COMMENT '活动id',\n    `activity_name` STRING COMMENT '活动名称',\n    `activity_type` STRING COMMENT '活动类型',\n    `activity_desc` STRING COMMENT '活动描述',\n    `start_time`    STRING COMMENT '开始时间',\n    `end_time`      STRING COMMENT '结束时间',\n    `create_time`   STRING COMMENT '创建时间'\n) COMMENT '活动信息表'\n    PARTITIONED BY (`dt` STRING)\n    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'\n    NULL DEFINED AS ''\n    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fods\u002Fods_activity_info_full\u002F';\n    \n-- 第一部分是删除表的语句，如果表不存在则不执行删除操作。\n-- 第二部分是创建一个外部表，名为ods_activity_info_full，包含id、activity_name、activity_type、activity_desc、start_time、end_time和create_time等字段。这个表的注释是“活动信息表”，按照dt字段进行分区。\n-- 外部表是指在Hive中定义的表，但是数据并不存储在Hive中，而是存储在其他地方（如HDFS或HBase）中。外部表的数据可以被多个Hive表共享。\n-- 分区是指将数据按照某个字段进行划分，以便更快地查询数据。在这个例子中，按照dt字段进行分区。\n-- ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'是指使用制表符（\\t）作为字段分隔符。在这个例子中，数据文件中的每一行都是一个记录，每个字段之间用制表符分隔。这个语句告诉Hive如何解析数据文件中的每一行。\n",[17,102046,102047,102052,102057,102062,102066,102071,102076,102081,102086,102091,102096,102101,102106,102111,102116,102121,102126,102130,102135,102140,102145,102150],{"__ignoreMap":119},[78,102048,102049],{"class":124,"line":125},[78,102050,102051],{},"-- 活动信息表（全量表）\n",[78,102053,102054],{"class":124,"line":132},[78,102055,102056],{},"DROP TABLE IF EXISTS ods_activity_info_full;\n",[78,102058,102059],{"class":124,"line":138},[78,102060,102061],{},"CREATE EXTERNAL TABLE ods_activity_info_full\n",[78,102063,102064],{"class":124,"line":144},[78,102065,35394],{},[78,102067,102068],{"class":124,"line":150},[78,102069,102070],{},"    `id`            STRING COMMENT '活动id',\n",[78,102072,102073],{"class":124,"line":156},[78,102074,102075],{},"    `activity_name` STRING COMMENT '活动名称',\n",[78,102077,102078],{"class":124,"line":162},[78,102079,102080],{},"    `activity_type` STRING COMMENT '活动类型',\n",[78,102082,102083],{"class":124,"line":168},[78,102084,102085],{},"    `activity_desc` STRING COMMENT '活动描述',\n",[78,102087,102088],{"class":124,"line":174},[78,102089,102090],{},"    `start_time`    STRING COMMENT '开始时间',\n",[78,102092,102093],{"class":124,"line":180},[78,102094,102095],{},"    `end_time`      STRING COMMENT '结束时间',\n",[78,102097,102098],{"class":124,"line":186},[78,102099,102100],{},"    `create_time`   STRING COMMENT '创建时间'\n",[78,102102,102103],{"class":124,"line":192},[78,102104,102105],{},") COMMENT '活动信息表'\n",[78,102107,102108],{"class":124,"line":198},[78,102109,102110],{},"    PARTITIONED BY (`dt` STRING)\n",[78,102112,102113],{"class":124,"line":204},[78,102114,102115],{},"    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'\n",[78,102117,102118],{"class":124,"line":210},[78,102119,102120],{},"    NULL DEFINED AS ''\n",[78,102122,102123],{"class":124,"line":216},[78,102124,102125],{},"    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fods\u002Fods_activity_info_full\u002F';\n",[78,102127,102128],{"class":124,"line":222},[78,102129,6942],{},[78,102131,102132],{"class":124,"line":421},[78,102133,102134],{},"-- 第一部分是删除表的语句，如果表不存在则不执行删除操作。\n",[78,102136,102137],{"class":124,"line":427},[78,102138,102139],{},"-- 第二部分是创建一个外部表，名为ods_activity_info_full，包含id、activity_name、activity_type、activity_desc、start_time、end_time和create_time等字段。这个表的注释是“活动信息表”，按照dt字段进行分区。\n",[78,102141,102142],{"class":124,"line":433},[78,102143,102144],{},"-- 外部表是指在Hive中定义的表，但是数据并不存储在Hive中，而是存储在其他地方（如HDFS或HBase）中。外部表的数据可以被多个Hive表共享。\n",[78,102146,102147],{"class":124,"line":2443},[78,102148,102149],{},"-- 分区是指将数据按照某个字段进行划分，以便更快地查询数据。在这个例子中，按照dt字段进行分区。\n",[78,102151,102152],{"class":124,"line":2448},[78,102153,102154],{},"-- ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'是指使用制表符（\\t）作为字段分隔符。在这个例子中，数据文件中的每一行都是一个记录，每个字段之间用制表符分隔。这个语句告诉Hive如何解析数据文件中的每一行。\n",[13,102156,102157],{},"【2】数据装载",[114,102159,102161],{"className":33693,"code":102160,"language":33695,"meta":119,"style":119},"load data inpath '\u002Forigin_data\u002Fgmall\u002Fdb\u002Factivity_info_full\u002F2023-03-30' OVERWRITE into table gmall.ods_activity_info_full partition(dt='2023-03-30');\n-- 将`\u002Forigin_data\u002Fgmall\u002Fdb\u002Factivity_info_full\u002F2023-03-30`目录下的数据加载到名为`gmall.ods_activity_info_full`的Hive表中，分区字段为`dt`，值为`2023-03-30`。如果表中已经存在相同分区的数据，则会覆盖原有数据。\n",[17,102162,102163,102168],{"__ignoreMap":119},[78,102164,102165],{"class":124,"line":125},[78,102166,102167],{},"load data inpath '\u002Forigin_data\u002Fgmall\u002Fdb\u002Factivity_info_full\u002F2023-03-30' OVERWRITE into table gmall.ods_activity_info_full partition(dt='2023-03-30');\n",[78,102169,102170],{"class":124,"line":132},[78,102171,102172],{},"-- 将`\u002Forigin_data\u002Fgmall\u002Fdb\u002Factivity_info_full\u002F2023-03-30`目录下的数据加载到名为`gmall.ods_activity_info_full`的Hive表中，分区字段为`dt`，值为`2023-03-30`。如果表中已经存在相同分区的数据，则会覆盖原有数据。\n",[10548,102174,102176],{"id":102175},"_2dim层dimension公共维度层","（2）DIM层（Dimension，公共维度层）",[13,102178,102179,102180,102183],{},"基于维度建模理论进行构建，",[22,102181,102182],{},"存放维度模型中的维度表","，保持一致性维度信息。",[13,102185,102186],{},"DIM层设计要点：",[49,102188,102189,102192,102195],{},[52,102190,102191],{},"DIM层的设计依据是维度建模理论，该层存储维度模型的维度表。",[52,102193,102194],{},"DIM层的数据存储格式为orc列式存储+snappy压缩。",[52,102196,102197],{},"DIM层表名的命名规范为dim_表名_全量表或者拉链表标识（full\u002Fzip）",[13,102199,102041],{},[114,102201,102203],{"className":33693,"code":102202,"language":33695,"meta":119,"style":119},"-- 商品维度表\nDROP TABLE IF EXISTS dim_sku_full;\nCREATE EXTERNAL TABLE dim_sku_full\n(\n    `id`                   STRING COMMENT 'sku_id',\n    `price`                DECIMAL(16, 2) COMMENT '商品价格',\n    `sku_name`             STRING COMMENT '商品名称',\n    `sku_desc`             STRING COMMENT '商品描述',\n    `weight`               DECIMAL(16, 2) COMMENT '重量',\n    `is_sale`              BOOLEAN COMMENT '是否在售',\n    `spu_id`               STRING COMMENT 'spu编号',\n    `spu_name`             STRING COMMENT 'spu名称',\n    `category3_id`         STRING COMMENT '三级分类id',\n    `category3_name`       STRING COMMENT '三级分类名称',\n    `category2_id`         STRING COMMENT '二级分类id',\n    `category2_name`       STRING COMMENT '二级分类名称',\n    `category1_id`         STRING COMMENT '一级分类id',\n    `category1_name`       STRING COMMENT '一级分类名称',\n    `tm_id`                STRING COMMENT '品牌id',\n    `tm_name`              STRING COMMENT '品牌名称',\n    `sku_attr_values`      ARRAY\u003CSTRUCT\u003Cattr_id :STRING,value_id :STRING,attr_name :STRING,value_name:STRING>> COMMENT '平台属性',\n    `sku_sale_attr_values` ARRAY\u003CSTRUCT\u003Csale_attr_id :STRING,sale_attr_value_id :STRING,sale_attr_name :STRING,sale_attr_value_name:STRING>> COMMENT '销售属性',\n    `create_time`          STRING COMMENT '创建时间'\n) COMMENT '商品维度表'\n    PARTITIONED BY (`dt` STRING)\n    STORED AS ORC\n    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdim\u002Fdim_sku_full\u002F'\n    TBLPROPERTIES ('orc.compress' = 'snappy');\n    \n-- 数据存储格式为orc列式存储+snappy压缩\n",[17,102204,102205,102210,102215,102220,102224,102229,102234,102239,102244,102249,102254,102259,102264,102269,102274,102279,102284,102289,102294,102299,102304,102309,102314,102319,102324,102328,102333,102338,102343,102347],{"__ignoreMap":119},[78,102206,102207],{"class":124,"line":125},[78,102208,102209],{},"-- 商品维度表\n",[78,102211,102212],{"class":124,"line":132},[78,102213,102214],{},"DROP TABLE IF EXISTS dim_sku_full;\n",[78,102216,102217],{"class":124,"line":138},[78,102218,102219],{},"CREATE EXTERNAL TABLE dim_sku_full\n",[78,102221,102222],{"class":124,"line":144},[78,102223,35394],{},[78,102225,102226],{"class":124,"line":150},[78,102227,102228],{},"    `id`                   STRING COMMENT 'sku_id',\n",[78,102230,102231],{"class":124,"line":156},[78,102232,102233],{},"    `price`                DECIMAL(16, 2) COMMENT '商品价格',\n",[78,102235,102236],{"class":124,"line":162},[78,102237,102238],{},"    `sku_name`             STRING COMMENT '商品名称',\n",[78,102240,102241],{"class":124,"line":168},[78,102242,102243],{},"    `sku_desc`             STRING COMMENT '商品描述',\n",[78,102245,102246],{"class":124,"line":174},[78,102247,102248],{},"    `weight`               DECIMAL(16, 2) COMMENT '重量',\n",[78,102250,102251],{"class":124,"line":180},[78,102252,102253],{},"    `is_sale`              BOOLEAN COMMENT '是否在售',\n",[78,102255,102256],{"class":124,"line":186},[78,102257,102258],{},"    `spu_id`               STRING COMMENT 'spu编号',\n",[78,102260,102261],{"class":124,"line":192},[78,102262,102263],{},"    `spu_name`             STRING COMMENT 'spu名称',\n",[78,102265,102266],{"class":124,"line":198},[78,102267,102268],{},"    `category3_id`         STRING COMMENT '三级分类id',\n",[78,102270,102271],{"class":124,"line":204},[78,102272,102273],{},"    `category3_name`       STRING COMMENT '三级分类名称',\n",[78,102275,102276],{"class":124,"line":210},[78,102277,102278],{},"    `category2_id`         STRING COMMENT '二级分类id',\n",[78,102280,102281],{"class":124,"line":216},[78,102282,102283],{},"    `category2_name`       STRING COMMENT '二级分类名称',\n",[78,102285,102286],{"class":124,"line":222},[78,102287,102288],{},"    `category1_id`         STRING COMMENT '一级分类id',\n",[78,102290,102291],{"class":124,"line":421},[78,102292,102293],{},"    `category1_name`       STRING COMMENT '一级分类名称',\n",[78,102295,102296],{"class":124,"line":427},[78,102297,102298],{},"    `tm_id`                STRING COMMENT '品牌id',\n",[78,102300,102301],{"class":124,"line":433},[78,102302,102303],{},"    `tm_name`              STRING COMMENT '品牌名称',\n",[78,102305,102306],{"class":124,"line":2443},[78,102307,102308],{},"    `sku_attr_values`      ARRAY\u003CSTRUCT\u003Cattr_id :STRING,value_id :STRING,attr_name :STRING,value_name:STRING>> COMMENT '平台属性',\n",[78,102310,102311],{"class":124,"line":2448},[78,102312,102313],{},"    `sku_sale_attr_values` ARRAY\u003CSTRUCT\u003Csale_attr_id :STRING,sale_attr_value_id :STRING,sale_attr_name :STRING,sale_attr_value_name:STRING>> COMMENT '销售属性',\n",[78,102315,102316],{"class":124,"line":2454},[78,102317,102318],{},"    `create_time`          STRING COMMENT '创建时间'\n",[78,102320,102321],{"class":124,"line":2460},[78,102322,102323],{},") COMMENT '商品维度表'\n",[78,102325,102326],{"class":124,"line":2465},[78,102327,102110],{},[78,102329,102330],{"class":124,"line":2470},[78,102331,102332],{},"    STORED AS ORC\n",[78,102334,102335],{"class":124,"line":2903},[78,102336,102337],{},"    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdim\u002Fdim_sku_full\u002F'\n",[78,102339,102340],{"class":124,"line":2909},[78,102341,102342],{},"    TBLPROPERTIES ('orc.compress' = 'snappy');\n",[78,102344,102345],{"class":124,"line":11477},[78,102346,6942],{},[78,102348,102349],{"class":124,"line":13374},[78,102350,102351],{},"-- 数据存储格式为orc列式存储+snappy压缩\n",[13,102353,102157],{},[114,102355,102357],{"className":33693,"code":102356,"language":33695,"meta":119,"style":119},"with\nsku as\n(\n    select\n        id,\n        price,\n        sku_name,\n        sku_desc,\n        weight,\n        is_sale,\n        spu_id,\n        category3_id,\n        tm_id,\n        create_time\n    from ods_sku_info_full\n    where dt='2023-03-30'\n),\nspu as\n(\n    select\n        id,\n        spu_name\n    from ods_spu_info_full\n    where dt='2023-03-30'\n),\nc3 as\n(\n    select\n        id,\n        name,\n        category2_id\n    from ods_base_category3_full\n    where dt='2023-03-30'\n),\nc2 as\n(\n    select\n        id,\n        name,\n        category1_id\n    from ods_base_category2_full\n    where dt='2023-03-30'\n),\nc1 as\n(\n    select\n        id,\n        name\n    from ods_base_category1_full\n    where dt='2023-03-30'\n),\ntm as\n(\n    select\n        id,\n        tm_name\n    from ods_base_trademark_full\n    where dt='2023-03-30'\n),\nattr as\n(\n    select\n        sku_id,\n        collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs\n    from ods_sku_attr_value_full\n    where dt='2023-03-30'\n    group by sku_id\n),\nsale_attr as\n(\n    select\n        sku_id,\n        collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrs\n    from ods_sku_sale_attr_value_full\n    where dt='2023-03-30'\n    group by sku_id\n)\ninsert overwrite table dim_sku_full partition(dt='2023-03-30')\nselect\n    sku.id,\n    sku.price,\n    sku.sku_name,\n    sku.sku_desc,\n    sku.weight,\n    sku.is_sale,\n    sku.spu_id,\n    spu.spu_name,\n    sku.category3_id,\n    c3.name,\n    c3.category2_id,\n    c2.name,\n    c2.category1_id,\n    c1.name,\n    sku.tm_id,\n    tm.tm_name,\n    attr.attrs,\n    sale_attr.sale_attrs,\n    sku.create_time\nfrom sku\nleft join spu on sku.spu_id=spu.id\nleft join c3 on sku.category3_id=c3.id\nleft join c2 on c3.category2_id=c2.id\nleft join c1 on c2.category1_id=c1.id\nleft join tm on sku.tm_id=tm.id\nleft join attr on sku.id=attr.sku_id\nleft join sale_attr on sku.id=sale_attr.sku_id;\n",[17,102358,102359,102364,102369,102373,102377,102382,102387,102392,102397,102402,102407,102412,102417,102422,102427,102432,102437,102441,102446,102450,102454,102458,102463,102468,102472,102476,102481,102485,102489,102493,102498,102503,102508,102512,102516,102521,102525,102529,102533,102537,102542,102547,102551,102555,102560,102564,102568,102572,102577,102582,102586,102590,102595,102599,102603,102607,102612,102617,102621,102625,102630,102634,102638,102643,102648,102653,102657,102662,102666,102671,102675,102679,102683,102688,102693,102697,102701,102705,102710,102714,102719,102724,102729,102734,102739,102744,102749,102754,102759,102764,102769,102774,102779,102784,102789,102794,102799,102804,102809,102814,102819,102824,102829,102834,102839,102844],{"__ignoreMap":119},[78,102360,102361],{"class":124,"line":125},[78,102362,102363],{},"with\n",[78,102365,102366],{"class":124,"line":132},[78,102367,102368],{},"sku as\n",[78,102370,102371],{"class":124,"line":138},[78,102372,35394],{},[78,102374,102375],{"class":124,"line":144},[78,102376,66734],{},[78,102378,102379],{"class":124,"line":150},[78,102380,102381],{},"        id,\n",[78,102383,102384],{"class":124,"line":156},[78,102385,102386],{},"        price,\n",[78,102388,102389],{"class":124,"line":162},[78,102390,102391],{},"        sku_name,\n",[78,102393,102394],{"class":124,"line":168},[78,102395,102396],{},"        sku_desc,\n",[78,102398,102399],{"class":124,"line":174},[78,102400,102401],{},"        weight,\n",[78,102403,102404],{"class":124,"line":180},[78,102405,102406],{},"        is_sale,\n",[78,102408,102409],{"class":124,"line":186},[78,102410,102411],{},"        spu_id,\n",[78,102413,102414],{"class":124,"line":192},[78,102415,102416],{},"        category3_id,\n",[78,102418,102419],{"class":124,"line":198},[78,102420,102421],{},"        tm_id,\n",[78,102423,102424],{"class":124,"line":204},[78,102425,102426],{},"        create_time\n",[78,102428,102429],{"class":124,"line":210},[78,102430,102431],{},"    from ods_sku_info_full\n",[78,102433,102434],{"class":124,"line":216},[78,102435,102436],{},"    where dt='2023-03-30'\n",[78,102438,102439],{"class":124,"line":222},[78,102440,99137],{},[78,102442,102443],{"class":124,"line":421},[78,102444,102445],{},"spu as\n",[78,102447,102448],{"class":124,"line":427},[78,102449,35394],{},[78,102451,102452],{"class":124,"line":433},[78,102453,66734],{},[78,102455,102456],{"class":124,"line":2443},[78,102457,102381],{},[78,102459,102460],{"class":124,"line":2448},[78,102461,102462],{},"        spu_name\n",[78,102464,102465],{"class":124,"line":2454},[78,102466,102467],{},"    from ods_spu_info_full\n",[78,102469,102470],{"class":124,"line":2460},[78,102471,102436],{},[78,102473,102474],{"class":124,"line":2465},[78,102475,99137],{},[78,102477,102478],{"class":124,"line":2470},[78,102479,102480],{},"c3 as\n",[78,102482,102483],{"class":124,"line":2903},[78,102484,35394],{},[78,102486,102487],{"class":124,"line":2909},[78,102488,66734],{},[78,102490,102491],{"class":124,"line":11477},[78,102492,102381],{},[78,102494,102495],{"class":124,"line":13374},[78,102496,102497],{},"        name,\n",[78,102499,102500],{"class":124,"line":13380},[78,102501,102502],{},"        category2_id\n",[78,102504,102505],{"class":124,"line":13386},[78,102506,102507],{},"    from ods_base_category3_full\n",[78,102509,102510],{"class":124,"line":13722},[78,102511,102436],{},[78,102513,102514],{"class":124,"line":13727},[78,102515,99137],{},[78,102517,102518],{"class":124,"line":13953},[78,102519,102520],{},"c2 as\n",[78,102522,102523],{"class":124,"line":13958},[78,102524,35394],{},[78,102526,102527],{"class":124,"line":13964},[78,102528,66734],{},[78,102530,102531],{"class":124,"line":13969},[78,102532,102381],{},[78,102534,102535],{"class":124,"line":24170},[78,102536,102497],{},[78,102538,102539],{"class":124,"line":24175},[78,102540,102541],{},"        category1_id\n",[78,102543,102544],{"class":124,"line":24180},[78,102545,102546],{},"    from ods_base_category2_full\n",[78,102548,102549],{"class":124,"line":24186},[78,102550,102436],{},[78,102552,102553],{"class":124,"line":24192},[78,102554,99137],{},[78,102556,102557],{"class":124,"line":24198},[78,102558,102559],{},"c1 as\n",[78,102561,102562],{"class":124,"line":24204},[78,102563,35394],{},[78,102565,102566],{"class":124,"line":24210},[78,102567,66734],{},[78,102569,102570],{"class":124,"line":24215},[78,102571,102381],{},[78,102573,102574],{"class":124,"line":24220},[78,102575,102576],{},"        name\n",[78,102578,102579],{"class":124,"line":24226},[78,102580,102581],{},"    from ods_base_category1_full\n",[78,102583,102584],{"class":124,"line":24232},[78,102585,102436],{},[78,102587,102588],{"class":124,"line":24238},[78,102589,99137],{},[78,102591,102592],{"class":124,"line":24244},[78,102593,102594],{},"tm as\n",[78,102596,102597],{"class":124,"line":24250},[78,102598,35394],{},[78,102600,102601],{"class":124,"line":24256},[78,102602,66734],{},[78,102604,102605],{"class":124,"line":24262},[78,102606,102381],{},[78,102608,102609],{"class":124,"line":24267},[78,102610,102611],{},"        tm_name\n",[78,102613,102614],{"class":124,"line":24273},[78,102615,102616],{},"    from ods_base_trademark_full\n",[78,102618,102619],{"class":124,"line":24279},[78,102620,102436],{},[78,102622,102623],{"class":124,"line":24284},[78,102624,99137],{},[78,102626,102627],{"class":124,"line":24290},[78,102628,102629],{},"attr as\n",[78,102631,102632],{"class":124,"line":24296},[78,102633,35394],{},[78,102635,102636],{"class":124,"line":24302},[78,102637,66734],{},[78,102639,102640],{"class":124,"line":24308},[78,102641,102642],{},"        sku_id,\n",[78,102644,102645],{"class":124,"line":24314},[78,102646,102647],{},"        collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs\n",[78,102649,102650],{"class":124,"line":24320},[78,102651,102652],{},"    from ods_sku_attr_value_full\n",[78,102654,102655],{"class":124,"line":24325},[78,102656,102436],{},[78,102658,102659],{"class":124,"line":24331},[78,102660,102661],{},"    group by sku_id\n",[78,102663,102664],{"class":124,"line":25115},[78,102665,99137],{},[78,102667,102668],{"class":124,"line":25121},[78,102669,102670],{},"sale_attr as\n",[78,102672,102673],{"class":124,"line":25127},[78,102674,35394],{},[78,102676,102677],{"class":124,"line":25132},[78,102678,66734],{},[78,102680,102681],{"class":124,"line":25137},[78,102682,102642],{},[78,102684,102685],{"class":124,"line":25143},[78,102686,102687],{},"        collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrs\n",[78,102689,102690],{"class":124,"line":25149},[78,102691,102692],{},"    from ods_sku_sale_attr_value_full\n",[78,102694,102695],{"class":124,"line":25155},[78,102696,102436],{},[78,102698,102699],{"class":124,"line":25161},[78,102700,102661],{},[78,102702,102703],{"class":124,"line":25166},[78,102704,8041],{},[78,102706,102707],{"class":124,"line":25172},[78,102708,102709],{},"insert overwrite table dim_sku_full partition(dt='2023-03-30')\n",[78,102711,102712],{"class":124,"line":25178},[78,102713,66704],{},[78,102715,102716],{"class":124,"line":25184},[78,102717,102718],{},"    sku.id,\n",[78,102720,102721],{"class":124,"line":25190},[78,102722,102723],{},"    sku.price,\n",[78,102725,102726],{"class":124,"line":25196},[78,102727,102728],{},"    sku.sku_name,\n",[78,102730,102731],{"class":124,"line":25202},[78,102732,102733],{},"    sku.sku_desc,\n",[78,102735,102736],{"class":124,"line":25207},[78,102737,102738],{},"    sku.weight,\n",[78,102740,102741],{"class":124,"line":25212},[78,102742,102743],{},"    sku.is_sale,\n",[78,102745,102746],{"class":124,"line":25218},[78,102747,102748],{},"    sku.spu_id,\n",[78,102750,102751],{"class":124,"line":25224},[78,102752,102753],{},"    spu.spu_name,\n",[78,102755,102756],{"class":124,"line":25230},[78,102757,102758],{},"    sku.category3_id,\n",[78,102760,102761],{"class":124,"line":25236},[78,102762,102763],{},"    c3.name,\n",[78,102765,102766],{"class":124,"line":25241},[78,102767,102768],{},"    c3.category2_id,\n",[78,102770,102771],{"class":124,"line":25246},[78,102772,102773],{},"    c2.name,\n",[78,102775,102776],{"class":124,"line":25252},[78,102777,102778],{},"    c2.category1_id,\n",[78,102780,102781],{"class":124,"line":25258},[78,102782,102783],{},"    c1.name,\n",[78,102785,102786],{"class":124,"line":25264},[78,102787,102788],{},"    sku.tm_id,\n",[78,102790,102791],{"class":124,"line":25269},[78,102792,102793],{},"    tm.tm_name,\n",[78,102795,102796],{"class":124,"line":25274},[78,102797,102798],{},"    attr.attrs,\n",[78,102800,102801],{"class":124,"line":25280},[78,102802,102803],{},"    sale_attr.sale_attrs,\n",[78,102805,102806],{"class":124,"line":25286},[78,102807,102808],{},"    sku.create_time\n",[78,102810,102811],{"class":124,"line":25292},[78,102812,102813],{},"from sku\n",[78,102815,102816],{"class":124,"line":25298},[78,102817,102818],{},"left join spu on sku.spu_id=spu.id\n",[78,102820,102821],{"class":124,"line":51654},[78,102822,102823],{},"left join c3 on sku.category3_id=c3.id\n",[78,102825,102826],{"class":124,"line":51659},[78,102827,102828],{},"left join c2 on c3.category2_id=c2.id\n",[78,102830,102831],{"class":124,"line":51664},[78,102832,102833],{},"left join c1 on c2.category1_id=c1.id\n",[78,102835,102836],{"class":124,"line":51669},[78,102837,102838],{},"left join tm on sku.tm_id=tm.id\n",[78,102840,102841],{"class":124,"line":51675},[78,102842,102843],{},"left join attr on sku.id=attr.sku_id\n",[78,102845,102846],{"class":124,"line":51681},[78,102847,102848],{},"left join sale_attr on sku.id=sale_attr.sku_id;\n",[10548,102850,102852],{"id":102851},"_3dwd层data-warehouse-detail明细数据层","（3）DWD层（Data Warehouse Detail，明细数据层）",[13,102854,102179,102855,102858],{},[22,102856,102857],{},"存放维度模型中的事实表","，保存各业务过程中最小粒度的操作记录。",[13,102860,102861],{},"DWD层设计要点：",[49,102863,102864,102867,102870],{},[52,102865,102866],{},"DWD层的设计依据是维度建模理论，该层存储维度模型的事实表。",[52,102868,102869],{},"DWD层的数据存储格式为orc列式存储+snappy压缩。",[52,102871,102872],{},"DWD层表名的命名规范为dwd_数据域_表名_单分区增量全量标识（inc\u002Ffull）",[13,102874,102041],{},[114,102876,102878],{"className":33693,"code":102877,"language":33695,"meta":119,"style":119},"-- 交易域加购事务事实表\nDROP TABLE IF EXISTS dwd_trade_cart_add_inc;\nCREATE EXTERNAL TABLE dwd_trade_cart_add_inc\n(\n    `id`               STRING COMMENT '编号',\n    `user_id`          STRING COMMENT '用户id',\n    `sku_id`           STRING COMMENT '商品id',\n    `date_id`          STRING COMMENT '时间id',\n    `create_time`      STRING COMMENT '加购时间',\n    `source_id`        STRING COMMENT '来源类型ID',\n    `source_type_code` STRING COMMENT '来源类型编码',\n    `source_type_name` STRING COMMENT '来源类型名称',\n    `sku_num`          BIGINT COMMENT '加购物车件数'\n) COMMENT '交易域加购物车事务事实表'\n    PARTITIONED BY (`dt` STRING)\n    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'\n    STORED AS ORC\n    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdwd\u002Fdwd_trade_cart_add_inc\u002F'\n    TBLPROPERTIES ('orc.compress' = 'snappy');\n",[17,102879,102880,102885,102890,102895,102899,102904,102909,102914,102919,102924,102929,102934,102939,102944,102949,102953,102957,102961,102966],{"__ignoreMap":119},[78,102881,102882],{"class":124,"line":125},[78,102883,102884],{},"-- 交易域加购事务事实表\n",[78,102886,102887],{"class":124,"line":132},[78,102888,102889],{},"DROP TABLE IF EXISTS dwd_trade_cart_add_inc;\n",[78,102891,102892],{"class":124,"line":138},[78,102893,102894],{},"CREATE EXTERNAL TABLE dwd_trade_cart_add_inc\n",[78,102896,102897],{"class":124,"line":144},[78,102898,35394],{},[78,102900,102901],{"class":124,"line":150},[78,102902,102903],{},"    `id`               STRING COMMENT '编号',\n",[78,102905,102906],{"class":124,"line":156},[78,102907,102908],{},"    `user_id`          STRING COMMENT '用户id',\n",[78,102910,102911],{"class":124,"line":162},[78,102912,102913],{},"    `sku_id`           STRING COMMENT '商品id',\n",[78,102915,102916],{"class":124,"line":168},[78,102917,102918],{},"    `date_id`          STRING COMMENT '时间id',\n",[78,102920,102921],{"class":124,"line":174},[78,102922,102923],{},"    `create_time`      STRING COMMENT '加购时间',\n",[78,102925,102926],{"class":124,"line":180},[78,102927,102928],{},"    `source_id`        STRING COMMENT '来源类型ID',\n",[78,102930,102931],{"class":124,"line":186},[78,102932,102933],{},"    `source_type_code` STRING COMMENT '来源类型编码',\n",[78,102935,102936],{"class":124,"line":192},[78,102937,102938],{},"    `source_type_name` STRING COMMENT '来源类型名称',\n",[78,102940,102941],{"class":124,"line":198},[78,102942,102943],{},"    `sku_num`          BIGINT COMMENT '加购物车件数'\n",[78,102945,102946],{"class":124,"line":204},[78,102947,102948],{},") COMMENT '交易域加购物车事务事实表'\n",[78,102950,102951],{"class":124,"line":210},[78,102952,102110],{},[78,102954,102955],{"class":124,"line":216},[78,102956,102115],{},[78,102958,102959],{"class":124,"line":222},[78,102960,102332],{},[78,102962,102963],{"class":124,"line":421},[78,102964,102965],{},"    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdwd\u002Fdwd_trade_cart_add_inc\u002F'\n",[78,102967,102968],{"class":124,"line":427},[78,102969,102342],{},[13,102971,102157],{},[114,102973,102975],{"className":33693,"code":102974,"language":33695,"meta":119,"style":119},"-- 设置Hive分区模式为不严格\nset hive.exec.dynamic.partition.mode=nonstrict;\ninsert overwrite table dwd_trade_cart_add_inc partition (dt)\nselect\n    id,\n    user_id,\n    sku_id,\n    date_format(create_time,'yyyy-MM-dd') date_id,\n    create_time,\n    source_id,\n    source_type,\n    dic.dic_name,\n    sku_num,\n    date_format(create_time, 'yyyy-MM-dd')\nfrom\n(\n    select\n        data.id,\n        data.user_id,\n        data.sku_id,\n        data.create_time,\n        data.source_id,\n        data.source_type,\n        data.sku_num\n    from ods_cart_info_inc\n    where dt = '2023-03-30'\n    and type = 'bootstrap-insert'  -- 设置类型为“全量插入” \n)ci\nleft join\n(\n    select\n        dic_code,\n        dic_name\n    from ods_base_dic_full\n    where dt='2023-03-30'\n    and parent_code='24'\n)dic\non ci.source_type=dic.dic_code;\n",[17,102976,102977,102982,102987,102992,102996,103001,103006,103011,103016,103021,103026,103031,103036,103041,103046,103050,103054,103058,103063,103068,103073,103078,103083,103088,103093,103098,103103,103108,103113,103118,103122,103126,103131,103136,103141,103145,103150,103155],{"__ignoreMap":119},[78,102978,102979],{"class":124,"line":125},[78,102980,102981],{},"-- 设置Hive分区模式为不严格\n",[78,102983,102984],{"class":124,"line":132},[78,102985,102986],{},"set hive.exec.dynamic.partition.mode=nonstrict;\n",[78,102988,102989],{"class":124,"line":138},[78,102990,102991],{},"insert overwrite table dwd_trade_cart_add_inc partition (dt)\n",[78,102993,102994],{"class":124,"line":144},[78,102995,66704],{},[78,102997,102998],{"class":124,"line":150},[78,102999,103000],{},"    id,\n",[78,103002,103003],{"class":124,"line":156},[78,103004,103005],{},"    user_id,\n",[78,103007,103008],{"class":124,"line":162},[78,103009,103010],{},"    sku_id,\n",[78,103012,103013],{"class":124,"line":168},[78,103014,103015],{},"    date_format(create_time,'yyyy-MM-dd') date_id,\n",[78,103017,103018],{"class":124,"line":174},[78,103019,103020],{},"    create_time,\n",[78,103022,103023],{"class":124,"line":180},[78,103024,103025],{},"    source_id,\n",[78,103027,103028],{"class":124,"line":186},[78,103029,103030],{},"    source_type,\n",[78,103032,103033],{"class":124,"line":192},[78,103034,103035],{},"    dic.dic_name,\n",[78,103037,103038],{"class":124,"line":198},[78,103039,103040],{},"    sku_num,\n",[78,103042,103043],{"class":124,"line":204},[78,103044,103045],{},"    date_format(create_time, 'yyyy-MM-dd')\n",[78,103047,103048],{"class":124,"line":210},[78,103049,35389],{},[78,103051,103052],{"class":124,"line":216},[78,103053,35394],{},[78,103055,103056],{"class":124,"line":222},[78,103057,66734],{},[78,103059,103060],{"class":124,"line":421},[78,103061,103062],{},"        data.id,\n",[78,103064,103065],{"class":124,"line":427},[78,103066,103067],{},"        data.user_id,\n",[78,103069,103070],{"class":124,"line":433},[78,103071,103072],{},"        data.sku_id,\n",[78,103074,103075],{"class":124,"line":2443},[78,103076,103077],{},"        data.create_time,\n",[78,103079,103080],{"class":124,"line":2448},[78,103081,103082],{},"        data.source_id,\n",[78,103084,103085],{"class":124,"line":2454},[78,103086,103087],{},"        data.source_type,\n",[78,103089,103090],{"class":124,"line":2460},[78,103091,103092],{},"        data.sku_num\n",[78,103094,103095],{"class":124,"line":2465},[78,103096,103097],{},"    from ods_cart_info_inc\n",[78,103099,103100],{"class":124,"line":2470},[78,103101,103102],{},"    where dt = '2023-03-30'\n",[78,103104,103105],{"class":124,"line":2903},[78,103106,103107],{},"    and type = 'bootstrap-insert'  -- 设置类型为“全量插入” \n",[78,103109,103110],{"class":124,"line":2909},[78,103111,103112],{},")ci\n",[78,103114,103115],{"class":124,"line":11477},[78,103116,103117],{},"left join\n",[78,103119,103120],{"class":124,"line":13374},[78,103121,35394],{},[78,103123,103124],{"class":124,"line":13380},[78,103125,66734],{},[78,103127,103128],{"class":124,"line":13386},[78,103129,103130],{},"        dic_code,\n",[78,103132,103133],{"class":124,"line":13722},[78,103134,103135],{},"        dic_name\n",[78,103137,103138],{"class":124,"line":13727},[78,103139,103140],{},"    from ods_base_dic_full\n",[78,103142,103143],{"class":124,"line":13953},[78,103144,102436],{},[78,103146,103147],{"class":124,"line":13958},[78,103148,103149],{},"    and parent_code='24'\n",[78,103151,103152],{"class":124,"line":13964},[78,103153,103154],{},")dic\n",[78,103156,103157],{"class":124,"line":13969},[78,103158,103159],{},"on ci.source_type=dic.dic_code;\n",[10548,103161,103163],{"id":103162},"_4dws层data-warehouse-summary汇总数据层","（4）DWS层（Data Warehouse Summary，汇总数据层）",[13,103165,103166],{},"基于上层的指标需求，以分析的主题对象作为建模驱动，构建公共统计粒度的汇总表。",[13,103168,103169],{},"设计要点：",[49,103171,103172,103175,103178],{},[52,103173,103174],{},"DWS层的设计参考指标体系。",[52,103176,103177],{},"DWS层的数据存储格式为ORC列式存储 + snappy压缩。",[52,103179,103180],{},"DWS层表名的命名规范为dws_数据域_统计粒_业务过程_统计周期（1d\u002Fnd\u002Ftd）",[13,103182,103183],{},"注：1d表示最近1日，nd表示最近n日，td表示历史至今。",[13,103185,102041],{},[114,103187,103189],{"className":33693,"code":103188,"language":33695,"meta":119,"style":119},"-- 交易域用户商品粒度订单最近1日汇总表\nDROP TABLE IF EXISTS dws_trade_user_sku_order_1d;\nCREATE EXTERNAL TABLE dws_trade_user_sku_order_1d\n(\n    `user_id`                   STRING COMMENT '用户id',\n    `sku_id`                    STRING COMMENT 'sku_id',\n    `sku_name`                  STRING COMMENT 'sku名称',\n    `category1_id`              STRING COMMENT '一级分类id',\n    `category1_name`            STRING COMMENT '一级分类名称',\n    `category2_id`              STRING COMMENT '一级分类id',\n    `category2_name`            STRING COMMENT '一级分类名称',\n    `category3_id`              STRING COMMENT '一级分类id',\n    `category3_name`            STRING COMMENT '一级分类名称',\n    `tm_id`                     STRING COMMENT '品牌id',\n    `tm_name`                   STRING COMMENT '品牌名称',\n    `order_count_1d`            BIGINT COMMENT '最近1日下单次数',\n    `order_num_1d`              BIGINT COMMENT '最近1日下单件数',\n    `order_original_amount_1d`  DECIMAL(16, 2) COMMENT '最近1日下单原始金额',\n    `activity_reduce_amount_1d` DECIMAL(16, 2) COMMENT '最近1日活动优惠金额',\n    `coupon_reduce_amount_1d`   DECIMAL(16, 2) COMMENT '最近1日优惠券优惠金额',\n    `order_total_amount_1d`     DECIMAL(16, 2) COMMENT '最近1日下单最终金额'\n) COMMENT '交易域用户商品粒度订单最近1日汇总事实表'\n    PARTITIONED BY (`dt` STRING)\n    STORED AS ORC\n    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdws\u002Fdws_trade_user_sku_order_1d'\n    TBLPROPERTIES ('orc.compress' = 'snappy');\n",[17,103190,103191,103196,103201,103206,103210,103215,103220,103225,103230,103235,103240,103245,103250,103255,103260,103265,103270,103275,103280,103285,103290,103295,103300,103304,103308,103313],{"__ignoreMap":119},[78,103192,103193],{"class":124,"line":125},[78,103194,103195],{},"-- 交易域用户商品粒度订单最近1日汇总表\n",[78,103197,103198],{"class":124,"line":132},[78,103199,103200],{},"DROP TABLE IF EXISTS dws_trade_user_sku_order_1d;\n",[78,103202,103203],{"class":124,"line":138},[78,103204,103205],{},"CREATE EXTERNAL TABLE dws_trade_user_sku_order_1d\n",[78,103207,103208],{"class":124,"line":144},[78,103209,35394],{},[78,103211,103212],{"class":124,"line":150},[78,103213,103214],{},"    `user_id`                   STRING COMMENT '用户id',\n",[78,103216,103217],{"class":124,"line":156},[78,103218,103219],{},"    `sku_id`                    STRING COMMENT 'sku_id',\n",[78,103221,103222],{"class":124,"line":162},[78,103223,103224],{},"    `sku_name`                  STRING COMMENT 'sku名称',\n",[78,103226,103227],{"class":124,"line":168},[78,103228,103229],{},"    `category1_id`              STRING COMMENT '一级分类id',\n",[78,103231,103232],{"class":124,"line":174},[78,103233,103234],{},"    `category1_name`            STRING COMMENT '一级分类名称',\n",[78,103236,103237],{"class":124,"line":180},[78,103238,103239],{},"    `category2_id`              STRING COMMENT '一级分类id',\n",[78,103241,103242],{"class":124,"line":186},[78,103243,103244],{},"    `category2_name`            STRING COMMENT '一级分类名称',\n",[78,103246,103247],{"class":124,"line":192},[78,103248,103249],{},"    `category3_id`              STRING COMMENT '一级分类id',\n",[78,103251,103252],{"class":124,"line":198},[78,103253,103254],{},"    `category3_name`            STRING COMMENT '一级分类名称',\n",[78,103256,103257],{"class":124,"line":204},[78,103258,103259],{},"    `tm_id`                     STRING COMMENT '品牌id',\n",[78,103261,103262],{"class":124,"line":210},[78,103263,103264],{},"    `tm_name`                   STRING COMMENT '品牌名称',\n",[78,103266,103267],{"class":124,"line":216},[78,103268,103269],{},"    `order_count_1d`            BIGINT COMMENT '最近1日下单次数',\n",[78,103271,103272],{"class":124,"line":222},[78,103273,103274],{},"    `order_num_1d`              BIGINT COMMENT '最近1日下单件数',\n",[78,103276,103277],{"class":124,"line":421},[78,103278,103279],{},"    `order_original_amount_1d`  DECIMAL(16, 2) COMMENT '最近1日下单原始金额',\n",[78,103281,103282],{"class":124,"line":427},[78,103283,103284],{},"    `activity_reduce_amount_1d` DECIMAL(16, 2) COMMENT '最近1日活动优惠金额',\n",[78,103286,103287],{"class":124,"line":433},[78,103288,103289],{},"    `coupon_reduce_amount_1d`   DECIMAL(16, 2) COMMENT '最近1日优惠券优惠金额',\n",[78,103291,103292],{"class":124,"line":2443},[78,103293,103294],{},"    `order_total_amount_1d`     DECIMAL(16, 2) COMMENT '最近1日下单最终金额'\n",[78,103296,103297],{"class":124,"line":2448},[78,103298,103299],{},") COMMENT '交易域用户商品粒度订单最近1日汇总事实表'\n",[78,103301,103302],{"class":124,"line":2454},[78,103303,102110],{},[78,103305,103306],{"class":124,"line":2460},[78,103307,102332],{},[78,103309,103310],{"class":124,"line":2465},[78,103311,103312],{},"    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fdws\u002Fdws_trade_user_sku_order_1d'\n",[78,103314,103315],{"class":124,"line":2470},[78,103316,102342],{},[13,103318,102157],{},[114,103320,103322],{"className":33693,"code":103321,"language":33695,"meta":119,"style":119},"set hive.exec.dynamic.partition.mode=nonstrict;\ninsert overwrite table dws_trade_user_sku_order_1d partition(dt)\nselect\n    user_id,\n    id,\n    sku_name,\n    category1_id,\n    category1_name,\n    category2_id,\n    category2_name,\n    category3_id,\n    category3_name,\n    tm_id,\n    tm_name,\n    order_count_1d,\n    order_num_1d,\n    order_original_amount_1d,\n    activity_reduce_amount_1d,\n    coupon_reduce_amount_1d,\n    order_total_amount_1d,\n    dt\nfrom\n(\n    select\n        dt,\n        user_id,\n        sku_id,\n        count(*) order_count_1d,\n        sum(sku_num) order_num_1d,\n        sum(split_original_amount) order_original_amount_1d,\n        sum(nvl(split_activity_amount,0.0)) activity_reduce_amount_1d,\n        sum(nvl(split_coupon_amount,0.0)) coupon_reduce_amount_1d,\n        sum(split_total_amount) order_total_amount_1d\n    from dwd_trade_order_detail_inc\n    group by dt,user_id,sku_id\n)od\nleft join\n(\n    select\n        id,\n        sku_name,\n        category1_id,\n        category1_name,\n        category2_id,\n        category2_name,\n        category3_id,\n        category3_name,\n        tm_id,\n        tm_name\n    from dim_sku_full\n    where dt='2020-06-14'\n)sku\non od.sku_id=sku.id;\n",[17,103323,103324,103328,103333,103337,103341,103345,103350,103355,103360,103365,103370,103375,103380,103385,103390,103395,103400,103405,103410,103415,103420,103425,103429,103433,103437,103442,103447,103451,103456,103461,103466,103471,103476,103481,103486,103491,103496,103500,103504,103508,103512,103516,103521,103526,103531,103536,103540,103545,103549,103553,103558,103563,103568],{"__ignoreMap":119},[78,103325,103326],{"class":124,"line":125},[78,103327,102986],{},[78,103329,103330],{"class":124,"line":132},[78,103331,103332],{},"insert overwrite table dws_trade_user_sku_order_1d partition(dt)\n",[78,103334,103335],{"class":124,"line":138},[78,103336,66704],{},[78,103338,103339],{"class":124,"line":144},[78,103340,103005],{},[78,103342,103343],{"class":124,"line":150},[78,103344,103000],{},[78,103346,103347],{"class":124,"line":156},[78,103348,103349],{},"    sku_name,\n",[78,103351,103352],{"class":124,"line":162},[78,103353,103354],{},"    category1_id,\n",[78,103356,103357],{"class":124,"line":168},[78,103358,103359],{},"    category1_name,\n",[78,103361,103362],{"class":124,"line":174},[78,103363,103364],{},"    category2_id,\n",[78,103366,103367],{"class":124,"line":180},[78,103368,103369],{},"    category2_name,\n",[78,103371,103372],{"class":124,"line":186},[78,103373,103374],{},"    category3_id,\n",[78,103376,103377],{"class":124,"line":192},[78,103378,103379],{},"    category3_name,\n",[78,103381,103382],{"class":124,"line":198},[78,103383,103384],{},"    tm_id,\n",[78,103386,103387],{"class":124,"line":204},[78,103388,103389],{},"    tm_name,\n",[78,103391,103392],{"class":124,"line":210},[78,103393,103394],{},"    order_count_1d,\n",[78,103396,103397],{"class":124,"line":216},[78,103398,103399],{},"    order_num_1d,\n",[78,103401,103402],{"class":124,"line":222},[78,103403,103404],{},"    order_original_amount_1d,\n",[78,103406,103407],{"class":124,"line":421},[78,103408,103409],{},"    activity_reduce_amount_1d,\n",[78,103411,103412],{"class":124,"line":427},[78,103413,103414],{},"    coupon_reduce_amount_1d,\n",[78,103416,103417],{"class":124,"line":433},[78,103418,103419],{},"    order_total_amount_1d,\n",[78,103421,103422],{"class":124,"line":2443},[78,103423,103424],{},"    dt\n",[78,103426,103427],{"class":124,"line":2448},[78,103428,35389],{},[78,103430,103431],{"class":124,"line":2454},[78,103432,35394],{},[78,103434,103435],{"class":124,"line":2460},[78,103436,66734],{},[78,103438,103439],{"class":124,"line":2465},[78,103440,103441],{},"        dt,\n",[78,103443,103444],{"class":124,"line":2470},[78,103445,103446],{},"        user_id,\n",[78,103448,103449],{"class":124,"line":2903},[78,103450,102642],{},[78,103452,103453],{"class":124,"line":2909},[78,103454,103455],{},"        count(*) order_count_1d,\n",[78,103457,103458],{"class":124,"line":11477},[78,103459,103460],{},"        sum(sku_num) order_num_1d,\n",[78,103462,103463],{"class":124,"line":13374},[78,103464,103465],{},"        sum(split_original_amount) order_original_amount_1d,\n",[78,103467,103468],{"class":124,"line":13380},[78,103469,103470],{},"        sum(nvl(split_activity_amount,0.0)) activity_reduce_amount_1d,\n",[78,103472,103473],{"class":124,"line":13386},[78,103474,103475],{},"        sum(nvl(split_coupon_amount,0.0)) coupon_reduce_amount_1d,\n",[78,103477,103478],{"class":124,"line":13722},[78,103479,103480],{},"        sum(split_total_amount) order_total_amount_1d\n",[78,103482,103483],{"class":124,"line":13727},[78,103484,103485],{},"    from dwd_trade_order_detail_inc\n",[78,103487,103488],{"class":124,"line":13953},[78,103489,103490],{},"    group by dt,user_id,sku_id\n",[78,103492,103493],{"class":124,"line":13958},[78,103494,103495],{},")od\n",[78,103497,103498],{"class":124,"line":13964},[78,103499,103117],{},[78,103501,103502],{"class":124,"line":13969},[78,103503,35394],{},[78,103505,103506],{"class":124,"line":24170},[78,103507,66734],{},[78,103509,103510],{"class":124,"line":24175},[78,103511,102381],{},[78,103513,103514],{"class":124,"line":24180},[78,103515,102391],{},[78,103517,103518],{"class":124,"line":24186},[78,103519,103520],{},"        category1_id,\n",[78,103522,103523],{"class":124,"line":24192},[78,103524,103525],{},"        category1_name,\n",[78,103527,103528],{"class":124,"line":24198},[78,103529,103530],{},"        category2_id,\n",[78,103532,103533],{"class":124,"line":24204},[78,103534,103535],{},"        category2_name,\n",[78,103537,103538],{"class":124,"line":24210},[78,103539,102416],{},[78,103541,103542],{"class":124,"line":24215},[78,103543,103544],{},"        category3_name,\n",[78,103546,103547],{"class":124,"line":24220},[78,103548,102421],{},[78,103550,103551],{"class":124,"line":24226},[78,103552,102611],{},[78,103554,103555],{"class":124,"line":24232},[78,103556,103557],{},"    from dim_sku_full\n",[78,103559,103560],{"class":124,"line":24238},[78,103561,103562],{},"    where dt='2020-06-14'\n",[78,103564,103565],{"class":124,"line":24244},[78,103566,103567],{},")sku\n",[78,103569,103570],{"class":124,"line":24250},[78,103571,103572],{},"on od.sku_id=sku.id;\n",[10548,103574,103576],{"id":103575},"_5ads层application-data-service数据应用层","（5）ADS层（Application Data Service，数据应用层）",[8366,103578,103579,103594],{},[8369,103580,103581],{},[8372,103582,103583,103586,103589,103592],{},[8375,103584,103585],{},"统计周期",[8375,103587,103588],{},"统计粒度",[8375,103590,103591],{},"指标",[8375,103593,42815],{},[8386,103595,103596,103610,103622,103634,103646],{},[8372,103597,103598,103601,103604,103607],{},[8391,103599,103600],{},"最近1\u002F7\u002F30日",[8391,103602,103603],{},"渠道",[8391,103605,103606],{},"访客数",[8391,103608,103609],{},"统计访问人数",[8372,103611,103612,103614,103616,103619],{},[8391,103613,103600],{},[8391,103615,103603],{},[8391,103617,103618],{},"会话平均停留时长",[8391,103620,103621],{},"统计每个会话平均停留时长",[8372,103623,103624,103626,103628,103631],{},[8391,103625,103600],{},[8391,103627,103603],{},[8391,103629,103630],{},"会话平均浏览页面数",[8391,103632,103633],{},"统计每个会话平均浏览页面数",[8372,103635,103636,103638,103640,103643],{},[8391,103637,103600],{},[8391,103639,103603],{},[8391,103641,103642],{},"会话总数",[8391,103644,103645],{},"统计会话总数",[8372,103647,103648,103650,103652,103655],{},[8391,103649,103600],{},[8391,103651,103603],{},[8391,103653,103654],{},"跳出率",[8391,103656,103657],{},"只有一个页面的会话的比例",[13,103659,102041],{},[114,103661,103663],{"className":33693,"code":103662,"language":33695,"meta":119,"style":119},"-- 各渠道流量统计\nDROP TABLE IF EXISTS ads_traffic_stats_by_channel;\nCREATE EXTERNAL TABLE ads_traffic_stats_by_channel\n(\n    `dt`               STRING COMMENT '统计日期',\n    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',\n    `channel`          STRING COMMENT '渠道',\n    `uv_count`         BIGINT COMMENT '访客人数',\n    `avg_duration_sec` BIGINT COMMENT '会话平均停留时长，单位为秒',\n    `avg_page_count`   BIGINT COMMENT '会话平均浏览页面数',\n    `sv_count`         BIGINT COMMENT '会话数',\n    `bounce_rate`      DECIMAL(16, 2) COMMENT '跳出率'\n) COMMENT '各渠道流量统计'\n    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'\n    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fads\u002Fads_traffic_stats_by_channel\u002F';\n",[17,103664,103665,103670,103675,103680,103684,103689,103694,103699,103704,103709,103714,103719,103724,103729,103733],{"__ignoreMap":119},[78,103666,103667],{"class":124,"line":125},[78,103668,103669],{},"-- 各渠道流量统计\n",[78,103671,103672],{"class":124,"line":132},[78,103673,103674],{},"DROP TABLE IF EXISTS ads_traffic_stats_by_channel;\n",[78,103676,103677],{"class":124,"line":138},[78,103678,103679],{},"CREATE EXTERNAL TABLE ads_traffic_stats_by_channel\n",[78,103681,103682],{"class":124,"line":144},[78,103683,35394],{},[78,103685,103686],{"class":124,"line":150},[78,103687,103688],{},"    `dt`               STRING COMMENT '统计日期',\n",[78,103690,103691],{"class":124,"line":156},[78,103692,103693],{},"    `recent_days`      BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',\n",[78,103695,103696],{"class":124,"line":162},[78,103697,103698],{},"    `channel`          STRING COMMENT '渠道',\n",[78,103700,103701],{"class":124,"line":168},[78,103702,103703],{},"    `uv_count`         BIGINT COMMENT '访客人数',\n",[78,103705,103706],{"class":124,"line":174},[78,103707,103708],{},"    `avg_duration_sec` BIGINT COMMENT '会话平均停留时长，单位为秒',\n",[78,103710,103711],{"class":124,"line":180},[78,103712,103713],{},"    `avg_page_count`   BIGINT COMMENT '会话平均浏览页面数',\n",[78,103715,103716],{"class":124,"line":186},[78,103717,103718],{},"    `sv_count`         BIGINT COMMENT '会话数',\n",[78,103720,103721],{"class":124,"line":192},[78,103722,103723],{},"    `bounce_rate`      DECIMAL(16, 2) COMMENT '跳出率'\n",[78,103725,103726],{"class":124,"line":198},[78,103727,103728],{},") COMMENT '各渠道流量统计'\n",[78,103730,103731],{"class":124,"line":204},[78,103732,102115],{},[78,103734,103735],{"class":124,"line":210},[78,103736,103737],{},"    LOCATION '\u002Fwarehouse\u002Fgmall\u002Fads\u002Fads_traffic_stats_by_channel\u002F';\n",[13,103739,102157],{},[114,103741,103743],{"className":33693,"code":103742,"language":33695,"meta":119,"style":119},"insert overwrite table ads_traffic_stats_by_channel\nselect * from ads_traffic_stats_by_channel\nunion\nselect\n    '2020-06-14' dt,\n    recent_days,\n    channel,\n    cast(count(distinct(mid_id)) as bigint) uv_count,\n    cast(avg(during_time_1d)\u002F1000 as bigint) avg_duration_sec,\n    cast(avg(page_count_1d) as bigint) avg_page_count,\n    cast(count(*) as bigint) sv_count,\n    cast(sum(if(page_count_1d=1,1,0))\u002Fcount(*) as decimal(16,2)) bounce_rate\nfrom dws_traffic_session_page_view_1d lateral view explode(array(1,7,30)) tmp as recent_days\nwhere dt>=date_add('2023-03-30',-recent_days+1)\ngroup by recent_days,channel;\n",[17,103744,103745,103750,103755,103760,103764,103769,103774,103779,103784,103789,103794,103799,103804,103809,103814],{"__ignoreMap":119},[78,103746,103747],{"class":124,"line":125},[78,103748,103749],{},"insert overwrite table ads_traffic_stats_by_channel\n",[78,103751,103752],{"class":124,"line":132},[78,103753,103754],{},"select * from ads_traffic_stats_by_channel\n",[78,103756,103757],{"class":124,"line":138},[78,103758,103759],{},"union\n",[78,103761,103762],{"class":124,"line":144},[78,103763,66704],{},[78,103765,103766],{"class":124,"line":150},[78,103767,103768],{},"    '2020-06-14' dt,\n",[78,103770,103771],{"class":124,"line":156},[78,103772,103773],{},"    recent_days,\n",[78,103775,103776],{"class":124,"line":162},[78,103777,103778],{},"    channel,\n",[78,103780,103781],{"class":124,"line":168},[78,103782,103783],{},"    cast(count(distinct(mid_id)) as bigint) uv_count,\n",[78,103785,103786],{"class":124,"line":174},[78,103787,103788],{},"    cast(avg(during_time_1d)\u002F1000 as bigint) avg_duration_sec,\n",[78,103790,103791],{"class":124,"line":180},[78,103792,103793],{},"    cast(avg(page_count_1d) as bigint) avg_page_count,\n",[78,103795,103796],{"class":124,"line":186},[78,103797,103798],{},"    cast(count(*) as bigint) sv_count,\n",[78,103800,103801],{"class":124,"line":192},[78,103802,103803],{},"    cast(sum(if(page_count_1d=1,1,0))\u002Fcount(*) as decimal(16,2)) bounce_rate\n",[78,103805,103806],{"class":124,"line":198},[78,103807,103808],{},"from dws_traffic_session_page_view_1d lateral view explode(array(1,7,30)) tmp as recent_days\n",[78,103810,103811],{"class":124,"line":204},[78,103812,103813],{},"where dt>=date_add('2023-03-30',-recent_days+1)\n",[78,103815,103816],{"class":124,"line":210},[78,103817,103818],{},"group by recent_days,channel;\n",[226,103820,228],{},{"title":119,"searchDepth":144,"depth":144,"links":103822},[103823,103829,103834,103839,103843],{"id":101258,"depth":132,"text":101259,"children":103824},[103825,103826,103827,103828],{"id":48731,"depth":144,"text":48732},{"id":101272,"depth":144,"text":101273},{"id":101299,"depth":144,"text":101300},{"id":101308,"depth":144,"text":101309},{"id":101319,"depth":132,"text":101320,"children":103830},[103831,103832,103833],{"id":101367,"depth":144,"text":101368},{"id":101420,"depth":144,"text":101421},{"id":101446,"depth":144,"text":101447},{"id":101463,"depth":132,"text":101464,"children":103835},[103836,103837,103838],{"id":62488,"depth":144,"text":101467},{"id":101473,"depth":144,"text":101474},{"id":101482,"depth":144,"text":101483},{"id":101590,"depth":132,"text":101591,"children":103840},[103841,103842],{"id":101599,"depth":144,"text":101600},{"id":101821,"depth":144,"text":101822},{"id":101911,"depth":132,"text":101912,"children":103844},[103845,103846,103847],{"id":101915,"depth":144,"text":101916},{"id":101924,"depth":144,"text":101925},{"id":101981,"depth":144,"text":101982},{},"Little Tips\u002F离线数仓总结（下）.md","\u002Fundergraduate\u002Fnote-e34afd16303c",{"title":101253,"description":119},"undergraduate\u002Fnote-e34afd16303c",[14968,7744,246,23378,10715,6380],"8Cio2xkq3TY7r4Rt_dp9H0lwlqU4at4vOYsr-POZQgE",{"id":103856,"title":7744,"assetBase":239,"author":8,"body":103857,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":104558,"navigation":128,"originalPath":104559,"path":104560,"seo":104561,"source":23330,"stem":104562,"tags":104563,"weight":250,"__hash__":104564},"content\u002Fundergraduate\u002Fnote-e3d4753d3712.md",{"type":10,"value":103858,"toc":104520},[103859,103871,103873,103877,103925,103929,103932,103936,103939,103942,103944,103948,103952,103976,103980,104024,104028,104031,104036,104041,104057,104059,104063,104068,104073,104076,104081,104086,104091,104095,104111,104115,104145,104148,104206,104208,104212,104216,104230,104235,104239,104242,104258,104262,104323,104327,104331,104336,104341,104346,104348,104352,104356,104360,104365,104369,104374,104379,104383,104388,104393,104395,104399,104403,104406,104411,104416,104421,104426,104430,104435,104440,104444,104450,104456,104458,104462,104466,104477,104482,104486,104518],[72,103860,103861,103865,103868],{},[13,103862,103863],{},[22,103864,23957],{},[13,103866,103867],{},"这不是一篇正儿八经的机器学习文档，完全是应付考试用的。当时6.17考完英语六级之后、6.18过生日；6.19上午8点就是机器学习考试了，所以没有时间做什么很详细的文档。我就是用着这一点PPT提取物做了个不到三千的小文档，不过顺利帮助我在5个小时左右拿下了机器学习（虽然最后只有80分），所以传上来供大家参考。",[13,103869,103870],{},"温馨提示：虽然确实内容不多，但是希望大家对数仓与数挖的文档掌握后再来看机器学习，因为聚类、分类之类的算法掌握一两个之后会比较容易理解机器学习底层的思想。",[107,103872,63031],{"id":63030},[7759,103874,103876],{"id":103875},"_1基本术语","1、基本术语",[49,103878,103879,103882,103892,103898,103904,103907,103910,103913,103916,103919,103922],{},[52,103880,103881],{},"**样本(sample)\u002F实例(instance)：**我们获得的数据集中的一条数据，被称为一个样本\u002F实例，在不存在数据缺失的情况下，所有样本应该具有相同的结构。样本是一个统计学概念，很多时候，一个样本对应一个个体，或者对某个对象的一次观测(observation)；",[52,103883,103884,103891],{},[22,103885,103886,103887,103890],{},"特征(feature)\u002F属性(attribute)：",[22,103888,103889],{},"记录样本的某种性质或者在某方面的表现的指标或变量，有时候我们直接用原始数据的变量作为特征，而有的时候我们对原始变量施加一个映射，转变为一组新的变量作为特征，这个过程也被称为","特征提取(feature extraction)","，可以用来提取信息或者对数据进行降维；例如，原始变量是身高和体重，我们利用公式计算出BMI作为我们关心的特征，就把两个变量减少为了一个，降低了变量的维数；",[52,103893,103894,103895,27386],{},"**特征向量(feature vector)：**一个样本的全部特征构成的向量，称为特征向量。即使经过了特征提取，我们往往也会用提取得到的特征构成新的目标数据集，得到新的样本变量（毕竟特征才是我们关注的变量）。还是以身高体重为例，我们获得了小明的身高、体重，构成了一个样本；但我们关注的是BMI指数，于是我们计算出小明的BMI，这时小明的BMI就成了新的样本。我们关注的永远是特征构成的样本，因此，我们可以说，",[22,103896,103897],{},"一个特征向量就是一个样本",[52,103899,103900,103903],{},[22,103901,103902],{},"特征空间(feature space)\u002F属性空间(attribute space)\u002F样本空间(sample space)："," 由所有特征\u002F属性张成的空间，也即特征向量所在的空间，每一维对应一个特征（其实就是概率论中样本空间的一种具体形式，只不过后者强调随机事件）；",[52,103905,103906],{},"**学习(learning)\u002F训练(training)：**模型凭借数据提供的信息改进自身性能的过程；",[52,103908,103909],{},"**测试(testing)：**训练结束之后检验模型训练效果的过程；",[52,103911,103912],{},"**训练数据(training data)\u002F训练集(training set)：**训练模型使用的数据集，其中的每一个样本称为一个训练样本(training sample)；",[52,103914,103915],{},"**测试数据(testing data)\u002F测试集(testing set)：**测试模型使用的数据集，其中的每一个样本称为一个测试样本(testing sample)；",[52,103917,103918],{},"**泛化能力(generalization ability)：**在测试集上训练得到的模型，适用于训练集之外的样本的能力，或者说训练好的模型在整个样本空间上的表现。测试的目的之一也是检验模型的泛化能力；",[52,103920,103921],{},"**过拟合(overfitting)：**模型过度学习，导致学习了过多只属于训练数据的特点，反而使得泛化能力下降；",[52,103923,103924],{},"**欠拟合(underfitting)：**模型学习不足，导致没有学习到训练数据中足够的一般化规律，泛化能力不足；",[7759,103926,103928],{"id":103927},"_2机器学习的目标","2、机器学习的目标",[13,103930,103931],{},"机器学习致力于研究如何通过计算的手段，利用经验来改善系统自身的性能，从而在计算机上从数据中产生“模型”，用于对新的情况给出判断。",[7759,103933,103935],{"id":103934},"_3归纳偏好","3、归纳偏好",[13,103937,103938],{},"学习过程中对某种类型假设的偏好称作归纳偏好。归纳偏好可看作学习算法自身在一个可能很庞大的假设空间中对假设进行选择的启发式或“价值观”.",[13,103940,103941],{},"“奥卡姆剃刀”是一种常用的、自然科学研究中最基本的原则，即“若有多个假设与观察一致，选最简单的那个”.",[23289,103943],{},[107,103945,103947],{"id":103946},"第二章-模型评估与选择","第二章 模型评估与选择",[7759,103949,103951],{"id":103950},"_1过拟合与欠拟合","1、过拟合与欠拟合",[49,103953,103954,103965],{},[52,103955,103956,103957],{},"过拟合:学习器把训练样本学习的“太好”，将训练样本本身的特点当做所有样本的一般性质，导致泛化性能下降\n",[49,103958,103959,103962],{},[52,103960,103961],{},"优化目标加正则项",[52,103963,103964],{},"early stop",[52,103966,103967,103968],{},"欠拟合：对训练样本的一般性质尚未学好\n",[49,103969,103970,103973],{},[52,103971,103972],{},"决策树:拓展分支",[52,103974,103975],{},"神经网络:增加训练轮数",[7759,103977,103979],{"id":103978},"_2评估方法","2、评估方法",[49,103981,103982,103999,104007],{},[52,103983,103984,103985],{},"留出法：",[49,103986,103987,103990,103993,103996],{},[52,103988,103989],{},"直接将数据集划分为两个互斥集合",[52,103991,103992],{},"训练\u002F测试集划分要尽可能保持数据分布的一致性",[52,103994,103995],{},"一般若干次随机划分、重复实验取平均值",[52,103997,103998],{},"训练\u002F测试样本比例通常为2:1~4:1",[52,104000,104001,104002],{},"交叉验证法：",[49,104003,104004],{},[52,104005,104006],{},"将数据集分层采样划分为k个大小相似的互斥子集，每次用k-1个子集的并集作为训练集，余下的子集作为测试集，最终返回k个测试结果的均值，k最常用的取值是10.",[52,104008,104009,104010],{},"自助法：以自助采样法为基础，对数据集D有放回采样m次得到训练集D' ,  用D\\D'做测试集。",[49,104011,104012,104015,104018,104021],{},[52,104013,104014],{},"实际模型与预期模型都使用m个训练样本",[52,104016,104017],{},"约有1\u002F3的样本没在训练集中出现",[52,104019,104020],{},"从初始数据集中产生多个不同的训练集，对集成学习有很大的好处",[52,104022,104023],{},"自助法在数据集较小、难以有效划分训练\u002F测试集时很有用；由于改变了数据集分布可能引入估计偏差，在数据量足够时，留出法和交叉验证法更常用。",[7759,104025,104027],{"id":104026},"_3性能度量","3、性能度量",[13,104029,104030],{},"性能度量是衡量模型泛化能力的评价标准，反映了任务需求；使用不同的性能度量往往会导致不同的评判结果.",[49,104032,104033],{},[52,104034,104035],{},"回归任务最常用的性能度量是“均方误差”：",[13,104037,104038],{},[617,104039],{"alt":104040,"src":30426},"image-20230617212241399",[49,104042,104043,104054],{},[52,104044,104045,104046],{},"对于分类任务,错误率和精度是最常用的两种性能度量：",[49,104047,104048,104051],{},[52,104049,104050],{},"错误率：分错样本占样本总数的比例",[52,104052,104053],{},"精度：分对样本占样本总数的比率",[52,104055,104056],{},"根据学习器的预测结果按正例可能性大小对样例进行排序，并逐个把样本作为正例进行预测，则可以得到查准率-查全率曲线，简称“P-R曲线”",[23289,104058],{},[107,104060,104062],{"id":104061},"第三章-线性模型","第三章 线性模型",[49,104064,104065],{},[52,104066,104067],{},"线性模型一般形式",[13,104069,104070],{},[617,104071],{"alt":104072,"src":29839},"image-20230617212541740",[13,104074,104075],{},"x = (x_1; x_2; ……; x_d) 是由属性描述的示例，其中 x_i 是 x 在第 i 个属性上的取值。",[49,104077,104078],{},[52,104079,104080],{},"向量形式",[13,104082,104083],{},[617,104084],{"alt":104085,"src":62233},"image-20230617212739864",[13,104087,25995,104088],{},[617,104089],{"alt":104090,"src":71409},"image-20230617212749796",[7759,104092,104094],{"id":104093},"_1线性模型优点","1、线性模型优点",[49,104096,104097,104100,104103],{},[52,104098,104099],{},"形式简单、易于建模",[52,104101,104102],{},"可解释性",[52,104104,104105,104106],{},"非线性模型的基础\n",[49,104107,104108],{},[52,104109,104110],{},"引入层级结构或高维映射",[7759,104112,104114],{"id":104113},"_2优化","2、优化",[49,104116,104117,104131],{},[52,104118,104119,104120],{},"各任务下（回归、分类）各个模型优化的目标\n",[49,104121,104122,104125,104128],{},[52,104123,104124],{},"最小二乘法：最小化均方误差",[52,104126,104127],{},"对数几率回归：最大化样本分布似然",[52,104129,104130],{},"线性判别分析：投影空间内最小（大）化类内（间）散度",[52,104132,104133,104134],{},"参数的优化方法\n",[49,104135,104136,104139,104142],{},[52,104137,104138],{},"最小二乘法：线性代数",[52,104140,104141],{},"对数几率回归：凸优化梯度下降、牛顿法",[52,104143,104144],{},"线性判别分析：矩阵论、广义瑞利商",[7759,104146,104147],{"id":73725},"3、总结",[49,104149,104150,104158,104179,104198],{},[52,104151,104152,104153],{},"线性回归\n",[49,104154,104155],{},[52,104156,104157],{},"最小二乘法（最小化均方误差）",[52,104159,104160,104161],{},"二分类任务\n",[49,104162,104163,104171],{},[52,104164,104165,104166],{},"对数几率回归\n",[49,104167,104168],{},[52,104169,104170],{},"单位阶跃函数、对数几率函数、极大似然法",[52,104172,104173,104174],{},"线性判别分析\n",[49,104175,104176],{},[52,104177,104178],{},"最大化广义瑞利商",[52,104180,104181,104182],{},"多分类学习\n",[49,104183,104184,104187,104190],{},[52,104185,104186],{},"一对一",[52,104188,104189],{},"一对其余",[52,104191,104192,104193],{},"多对多\n",[49,104194,104195],{},[52,104196,104197],{},"纠错输出码",[52,104199,104200,104201],{},"类别不平衡问题\n",[49,104202,104203],{},[52,104204,104205],{},"基本策略：再缩放",[23289,104207],{},[107,104209,104211],{"id":104210},"第四章-决策树","第四章 决策树",[7759,104213,104215],{"id":104214},"_1基本流程","1、基本流程",[49,104217,104218,104221,104224,104227],{},[52,104219,104220],{},"决策过程中提出的每个判定问题都是对某个属性的“测试”",[52,104222,104223],{},"决策过程的最终结论对应了我们所希望的判定结果",[52,104225,104226],{},"每个测试的结果或是导出最终结论，或者导出进一步的判定问题，其考虑范围是在上次决策结果的限定范围之内",[52,104228,104229],{},"从根结点到每个叶结点的路径对应了一个判定测试序列",[72,104231,104232],{},[13,104233,104234],{},"决策树学习的目的是为了产生一棵泛化能力强，即处理未见示例能力强的决策树",[7759,104236,104238],{"id":104237},"_2划分选择","2、划分选择",[13,104240,104241],{},"决策树学习的关键在于如何选择最优划分属性。一般而言，随着划分过程不断进行，我们希望决策树的分支结点所包含的样本尽可能属于同一类别，即结点的“纯度”(purity)越来越高",[49,104243,104244],{},[52,104245,104246,104247],{},"经典的属性划分方法：\n",[49,104248,104249,104252,104255],{},[52,104250,104251],{},"信息增益",[52,104253,104254],{},"增益率",[52,104256,104257],{},"基尼指数",[7759,104259,104261],{"id":104260},"_3剪枝处理","3、剪枝处理",[49,104263,104264,104275,104278,104298,104315],{},[52,104265,104266,104267],{},"为什么剪枝",[49,104268,104269,104272],{},[52,104270,104271],{},"“剪枝”是决策树学习算法对付“过拟合”的主要手段",[52,104273,104274],{},"可通过“剪枝”来一定程度避免因决策分支过多，以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合",[52,104276,104277],{},"剪枝的基本策略",[52,104279,104280,104281,20689,104283,104291,20692,104293],{},"预剪枝",[2996,104282],{},[49,104284,104285,104288],{},[52,104286,104287],{},"降低过拟合风险",[52,104289,104290],{},"显著减少训练时间和测试时间开销",[2996,104292],{},[49,104294,104295],{},[52,104296,104297],{},"欠拟合风险：有些分支的当前划分虽然不能提升泛化性能，但在其基础上进行的后续划分却有可能导致性能显著提高。预剪枝基于“贪心”本质禁止这些分支展开，带来了欠拟合风险",[52,104299,104300,104301,20689,104303,104308,20692,104310],{},"后剪枝",[2996,104302],{},[49,104304,104305],{},[52,104306,104307],{},"后剪枝比预剪枝保留了更多的分支，欠拟合风险小，泛化性能往往优于预剪枝决策树",[2996,104309],{},[49,104311,104312],{},[52,104313,104314],{},"训练时间开销大：后剪枝过程是在生成完全决策树之后进行的，需要自底向上对所有非叶结点逐一考察",[52,104316,104317,104318],{},"判断决策树泛化性能是否提升的方法",[49,104319,104320],{},[52,104321,104322],{},"留出法：预留一部分数据用作“验证集”以进行性能评估",[7759,104324,104326],{"id":104325},"_4连续值处理","4、连续值处理",[10548,104328,104330],{"id":104329},"连续属性离散化二分法","连续属性离散化(二分法)",[13,104332,104333],{},[617,104334],{"alt":104335,"src":30157},"image-20230617214027160",[13,104337,104338],{},[617,104339],{"alt":104340,"src":30871},"image-20230617214043390",[72,104342,104343],{},[13,104344,104345],{},"与离散属性不同，若当前结点划分属性为连续属性，该属性还可作为其后代结点的划分属性",[23289,104347],{},[107,104349,104351],{"id":104350},"第五章-神经网络","第五章 神经网络",[107,104353,104355],{"id":104354},"第六章-支持向量机","第六章 支持向量机",[7759,104357,104359],{"id":104358},"_1基本型最大间隔公式转换","1、基本型最大间隔公式转换",[13,104361,104362],{},[617,104363],{"alt":104364,"src":31273},"image-20230617214255990",[7759,104366,104368],{"id":104367},"_2对偶问题","2、对偶问题",[13,104370,104371],{},[617,104372],{"alt":104373,"src":31282},"image-20230617214400290",[13,104375,104376],{},[617,104377],{"alt":104378,"src":31302},"image-20230617214431255",[7759,104380,104382],{"id":104381},"_301损失函数","3、0\u002F1损失函数",[13,104384,104385],{},[617,104386],{"alt":104387,"src":31317},"image-20230617214528105",[13,104389,104390],{},[617,104391],{"alt":104392,"src":31335},"image-20230617214555840",[23289,104394],{},[107,104396,104398],{"id":104397},"第七章-贝叶斯分类器","第七章 贝叶斯分类器",[7759,104400,104402],{"id":104401},"_1贝叶斯决策论","1、贝叶斯决策论",[13,104404,104405],{},"贝叶斯决策论（Bayesian decision theory）是在概率框架下实施决策的基本方法。",[49,104407,104408],{},[52,104409,104410],{},"在分类问题情况下，在所有相关概率都已知的理想情形下，贝叶斯决策考虑如何基于这些概率和误判损失来选择最优的类别标记。",[13,104412,104413],{},[617,104414],{"alt":104415,"src":31471},"image-20230617214734480",[13,104417,104418],{},[617,104419],{"alt":104420,"src":31499},"image-20230617214753275",[13,104422,104423],{},[617,104424],{"alt":104425,"src":73607},"image-20230617214817023",[7759,104427,104429],{"id":104428},"_2极大似然估计","2、极大似然估计",[13,104431,104432],{},[617,104433],{"alt":104434,"src":73612},"image-20230617214901348",[13,104436,104437],{},[617,104438],{"alt":104439,"src":73636},"image-20230617214917354",[7759,104441,104443],{"id":104442},"_3朴素贝叶斯分类器","3、朴素贝叶斯分类器",[13,104445,104446],{},[617,104447],{"alt":104448,"src":104449},"image-20230617214948750","img\u002F7.6.png",[13,104451,104452],{},[617,104453],{"alt":104454,"src":104455},"image-20230617215014515","img\u002F7.7.png",[23289,104457],{},[107,104459,104461],{"id":104460},"第八章-集成学习","第八章 集成学习",[7759,104463,104465],{"id":104464},"_1boosting","1、Boosting",[49,104467,104468,104471,104474],{},[52,104469,104470],{},"个体学习器存在强依赖关系，",[52,104472,104473],{},"串行生成",[52,104475,104476],{},"每次调整训练数据的样本分布",[13,104478,104479],{},[617,104480],{"alt":104481,"src":62619},"image-20230617215130686",[7759,104483,104485],{"id":104484},"_2bagging","2、Bagging",[49,104487,104488,104491,104494,104497],{},[52,104489,104490],{},"个体学习器不存在强依赖关系",[52,104492,104493],{},"并行化生成",[52,104495,104496],{},"自助采样法",[52,104498,20689,104499],{},[49,104500,104501,104515],{},[52,104502,104503,104504],{},"时间复杂度低\n",[49,104505,104506,104509,104512],{},[52,104507,104508],{},"假定基学习器的计算复杂度为O(m)，采样与投票\u002F平均过程的复杂度为O(s)，则bagging的复杂度大致为T(O(m)+O(s))",[52,104510,104511],{},"由于O(s)很小且T是一个不大的常数",[52,104513,104514],{},"因此训练一个bagging集成与直接使用基学习器的复杂度同阶",[52,104516,104517],{},"可使用包外估计",[23289,104519],{},{"title":119,"searchDepth":144,"depth":144,"links":104521},[104522,104527,104532,104537,104543,104544,104549,104554],{"id":63030,"depth":132,"text":63031,"children":104523},[104524,104525,104526],{"id":103875,"depth":144,"text":103876},{"id":103927,"depth":144,"text":103928},{"id":103934,"depth":144,"text":103935},{"id":103946,"depth":132,"text":103947,"children":104528},[104529,104530,104531],{"id":103950,"depth":144,"text":103951},{"id":103978,"depth":144,"text":103979},{"id":104026,"depth":144,"text":104027},{"id":104061,"depth":132,"text":104062,"children":104533},[104534,104535,104536],{"id":104093,"depth":144,"text":104094},{"id":104113,"depth":144,"text":104114},{"id":73725,"depth":144,"text":104147},{"id":104210,"depth":132,"text":104211,"children":104538},[104539,104540,104541,104542],{"id":104214,"depth":144,"text":104215},{"id":104237,"depth":144,"text":104238},{"id":104260,"depth":144,"text":104261},{"id":104325,"depth":144,"text":104326},{"id":104350,"depth":132,"text":104351},{"id":104354,"depth":132,"text":104355,"children":104545},[104546,104547,104548],{"id":104358,"depth":144,"text":104359},{"id":104367,"depth":144,"text":104368},{"id":104381,"depth":144,"text":104382},{"id":104397,"depth":132,"text":104398,"children":104550},[104551,104552,104553],{"id":104401,"depth":144,"text":104402},{"id":104428,"depth":144,"text":104429},{"id":104442,"depth":144,"text":104443},{"id":104460,"depth":132,"text":104461,"children":104555},[104556,104557],{"id":104464,"depth":144,"text":104465},{"id":104484,"depth":144,"text":104485},{},"我的大学\u002F大三下学期\u002F机器学习\u002F机器学习.md","\u002Fundergraduate\u002Fnote-e3d4753d3712",{"title":7744,"description":119},"undergraduate\u002Fnote-e3d4753d3712",[14968,7744,246,14542],"Y8PAZMPrCro4Jzcom9R8jof8kJhWzpRODPvIvOrYobI",{"id":104566,"title":104567,"assetBase":239,"author":8,"body":104568,"category":29019,"collection":23324,"date":23325,"description":104572,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":105321,"navigation":128,"originalPath":105322,"path":105323,"seo":105324,"source":23330,"stem":105325,"tags":105326,"weight":250,"__hash__":105327},"content\u002Fundergraduate\u002Fnote-e53202f2a154.md","C语言与数据结构",{"type":10,"value":104569,"toc":105317},[104570,104573,104576,104579,104582,104585,104588,104591,104594,104597,104600,104603,104606,104609,104612,104615,104618,104621,104625,104636,104639,104642,104645,104648,104679,104682,104691,104694,104697,104700,104703,104706,104726,104729,104732,104741,104771,104774,104804,104810,104845,104850,104865,104868,104871,104882,104885,104888,104891,104894,104909,104916,104941,104944,104959,104962,104965,105049,105052,105055,105161,105164,105167,105273,105276,105280,105283,105301,105315],[13,104571,104572],{},"数据结构：",[13,104574,104575],{},"第二章：线性表",[13,104577,104578],{},"线性表的结构（顺序存储、链式存储）",[13,104580,104581],{},"散列表",[13,104583,104584],{},"第五章：",[13,104586,104587],{},"赫夫曼树与赫夫曼编码",[13,104589,104590],{},"前中后序遍历",[13,104592,104593],{},"排序算法时间复杂度、稳定性、实现流程（重点堆排序、冒泡、折半）",[13,104595,104596],{},"图遍历序列&序列转图",[13,104598,104599],{},"构造哈希函数的方法",[13,104601,104602],{},"C语言：",[13,104604,104605],{},"C语言特点、命名规则、函数调用过程",[13,104607,104608],{},"值传递与地址传递",[13,104610,104611],{},"指针、指针运算、不同指针的内存占用",[13,104613,104614],{},"Union特征",[13,104616,104617],{},"文件操作",[13,104619,104620],{},"引用区别",[107,104622,104624],{"id":104623},"c语言一些常见的问题","C语言一些常见的问题：",[13,104626,104627,104628,104630,104631,104633,104634],{},"1、32个关键字全是小写，常见的数据类型：short int long char double float unsigned ",[78,104629,27433],{},"，以及结构类型、系统标识：auto enum typedef volatile static struct void const register default extern signed sizeof union return ",[78,104632,22817],{},"，以及循环体结构：while if else break case switch continue do for goto ",[78,104635,11237],{},[13,104637,104638],{},"尤其注意的是 bool 类型不是关键字，bool定义在头文件stdbool.h中",[13,104640,104641],{},"2、标识符：标识符由字母、数字和下划线组成，且第一个字符不能是数字，标识符区分大小写",[13,104643,104644],{},"3、常量：以0开头默认为8进制；以0x（0X）开头默认16进制；以0b（0B）开头默认2进制；常量后面加l\u002FL为long格式；常量后面加u\u002FU为unsigned 格式；",[13,104646,104647],{},"关于浮点数常量，下面举例一些错误描述就能懂了：",[114,104649,104652],{"className":104650,"code":104651,"language":7360,"meta":119,"style":119},"language-c shiki shiki-themes github-dark","    52.0e1314  -- e前面有小数点只能有1位\n    5.2e 1314  -- e后面有空格\n    e1314      -- e前面必须有数字\n    2e         -- e后面必须有数字\n    5.2e13.14  -- e后面必须为正负整型\n",[17,104653,104654,104659,104664,104669,104674],{"__ignoreMap":119},[78,104655,104656],{"class":124,"line":125},[78,104657,104658],{},"    52.0e1314  -- e前面有小数点只能有1位\n",[78,104660,104661],{"class":124,"line":132},[78,104662,104663],{},"    5.2e 1314  -- e后面有空格\n",[78,104665,104666],{"class":124,"line":138},[78,104667,104668],{},"    e1314      -- e前面必须有数字\n",[78,104670,104671],{"class":124,"line":144},[78,104672,104673],{},"    2e         -- e后面必须有数字\n",[78,104675,104676],{"class":124,"line":150},[78,104677,104678],{},"    5.2e13.14  -- e后面必须为正负整型\n",[13,104680,104681],{},"4、一些奇怪的转义字符：常见的为 \\n、\\r、\\\"、\\'、?",[114,104683,104685],{"className":104650,"code":104684,"language":7360,"meta":119,"style":119},"\\a 声音警铃     \\b 退格   \\f 表单   \\t 水平制表     \\v 垂直制表\n",[17,104686,104687],{"__ignoreMap":119},[78,104688,104689],{"class":124,"line":125},[78,104690,104684],{},[13,104692,104693],{},"5、优先级：括号、引用 > 单目运算 > 算数运算 > 移位运算 > 关系运算 > 逻辑运算 > 三目运算 > 赋值运算",[13,104695,104696],{},"常见问题判断：a+=a-=a+a，+=、-=都属于赋值运算，不属于算术运算",[13,104698,104699],{},"%只能进行整数运算",[13,104701,104702],{},"& 位与\t| 位或\t^ 异或\t~ 取补\t\u003C\u003C 左移\t>> 右移",[13,104704,104705],{},"6、初始化数组",[114,104707,104709],{"className":104650,"code":104708,"language":7360,"meta":119,"style":119},"int a[N] = {0};    -- 全部初始化为0；\nint a[N];          -- 随机初始化，没有填充的时候忌用\nchar c[] = \"qwq !\";\n",[17,104710,104711,104716,104721],{"__ignoreMap":119},[78,104712,104713],{"class":124,"line":125},[78,104714,104715],{},"int a[N] = {0};    -- 全部初始化为0；\n",[78,104717,104718],{"class":124,"line":132},[78,104719,104720],{},"int a[N];          -- 随机初始化，没有填充的时候忌用\n",[78,104722,104723],{"class":124,"line":138},[78,104724,104725],{},"char c[] = \"qwq !\";\n",[13,104727,104728],{},"7、结构体与结构体指针",[13,104730,104731],{},"结构体是由一组数据元素构成的数据类型，可以将不同类型的数据组合在一起形成一个新的类型。而结构体指针是指向结构体变量的指针，它保存着该结构体变量的地址。",[13,104733,104734,104735,64610,104737,104740],{},"在C语言中，结构体和结构体指针的区别在于它们的数据类型。结构体是一种数据类型，而结构体指针则是指向该数据类型的指针类型。使用结构体指针可以访问结构体中的各个成员，并对其进行修改，而使用结构体变量则需要使用",[17,104736,21291],{},[17,104738,104739],{},"->","符号来访问其成员。以下面结构为例：",[114,104742,104744],{"className":104650,"code":104743,"language":7360,"meta":119,"style":119},"typedef struct BTNode {\n    int data;\n    int path;\n    struct BTNode *lchild, *rchild;\n}BTNode, *BiTree;\n",[17,104745,104746,104751,104756,104761,104766],{"__ignoreMap":119},[78,104747,104748],{"class":124,"line":125},[78,104749,104750],{},"typedef struct BTNode {\n",[78,104752,104753],{"class":124,"line":132},[78,104754,104755],{},"    int data;\n",[78,104757,104758],{"class":124,"line":138},[78,104759,104760],{},"    int path;\n",[78,104762,104763],{"class":124,"line":144},[78,104764,104765],{},"    struct BTNode *lchild, *rchild;\n",[78,104767,104768],{"class":124,"line":150},[78,104769,104770],{},"}BTNode, *BiTree;\n",[13,104772,104773],{},"使用上述代码声明的结构体和结构体指针类型时，需要注意以下几点：",[2285,104775,104776,104786,104801],{},[52,104777,104778,104781,104782,104785],{},[17,104779,104780],{},"BTNode","用于表示二叉树的节点类型，",[17,104783,104784],{},"BiTree","用于表示指向二叉树节点的指针类型。",[52,104787,104788,104789,104791,104792,104794,104795,104797,104798,104800],{},"在访问",[17,104790,104780],{},"类型的成员时，使用",[17,104793,21291],{},"符号；在访问",[17,104796,104784],{},"类型的结构体成员时，使用",[17,104799,104739],{},"符号。",[52,104802,104803],{},"在声明和初始化变量时，需要根据变量的类型使用相应的方式进行。",[13,104805,104806,104807,104809],{},"例如，在声明指向",[17,104808,104780],{},"类型的指针变量时，可以使用以下方式：",[114,104811,104813],{"className":104650,"code":104812,"language":7360,"meta":119,"style":119},"BTNode* node1; \u002F\u002F 声明指向BTNode类型的指针变量\nnode1 = (BTNode*)malloc(sizeof(BTNode)); \u002F\u002F 动态分配内存空间\nnode1->data = 1; \u002F\u002F 使用->符号访问结构体成员\nnode1->path = 0;\nnode1->lchild = NULL;\nnode1->rchild = NULL;\n",[17,104814,104815,104820,104825,104830,104835,104840],{"__ignoreMap":119},[78,104816,104817],{"class":124,"line":125},[78,104818,104819],{},"BTNode* node1; \u002F\u002F 声明指向BTNode类型的指针变量\n",[78,104821,104822],{"class":124,"line":132},[78,104823,104824],{},"node1 = (BTNode*)malloc(sizeof(BTNode)); \u002F\u002F 动态分配内存空间\n",[78,104826,104827],{"class":124,"line":138},[78,104828,104829],{},"node1->data = 1; \u002F\u002F 使用->符号访问结构体成员\n",[78,104831,104832],{"class":124,"line":144},[78,104833,104834],{},"node1->path = 0;\n",[78,104836,104837],{"class":124,"line":150},[78,104838,104839],{},"node1->lchild = NULL;\n",[78,104841,104842],{"class":124,"line":156},[78,104843,104844],{},"node1->rchild = NULL;\n",[13,104846,104847,104848,104809],{},"而在声明指向",[17,104849,104784],{},[114,104851,104853],{"className":104650,"code":104852,"language":7360,"meta":119,"style":119},"BiTree tree; \u002F\u002F 声明指向BTNode类型的指针变量\ntree = node1; \u002F\u002F node1为指向BTNode类型的指针变量\n",[17,104854,104855,104860],{"__ignoreMap":119},[78,104856,104857],{"class":124,"line":125},[78,104858,104859],{},"BiTree tree; \u002F\u002F 声明指向BTNode类型的指针变量\n",[78,104861,104862],{"class":124,"line":132},[78,104863,104864],{},"tree = node1; \u002F\u002F node1为指向BTNode类型的指针变量\n",[13,104866,104867],{},"**在实际编程中，通常使用指向结构体的指针来表示数据结构，这样可以节省内存空间，且能够动态地分配内存，有效地支持动态数据结构的操作。但在某些情况下，如果没有特殊需要，也可以直接使用结构体变量来表示数据。**使用指针变量更适合处理嵌套结构。当然，如果在具体的应用场景中，不需要动态内存分配或者没有特殊需求，使用结构体变量也是可以的。",[13,104869,104870],{},"8、结构化程序设计方法",[49,104872,104873,104876,104879],{},[52,104874,104875],{},"自顶向下：先考虑总体步骤，再考虑步骤的细节；先考虑全局目标，后考虑局部目标。",[52,104877,104878],{},"逐步求精：对于复杂的问题，大的操作步骤应该将其分解为一些子步骤的序列，逐步实现。",[52,104880,104881],{},"函数实现：全局目标分解为局部目标，再进一步分解为具体的小目标，把最终的小目标用函数实现。",[13,104883,104884],{},"9、递归",[13,104886,104887],{},"递归的实质是把问题简化成形式相同、但较简单的一些情况，程序书写时只给出统一的形式，到运行时再展开。程序每一次递归，问题就进一步简化，比如把n！的问题简化成（n - 1）！的计算。",[13,104889,104890],{},"10、宏",[13,104892,104893],{},"宏定义#define是C语言中常用的功能，用宏来定义一些符号常量。宏定义在编译预处理中起作用，不是真正的C语句，因此行尾无需分号。",[114,104895,104897],{"className":104650,"code":104896,"language":7360,"meta":119,"style":119},"#define PI 3.1 4   159 26\n#define 宏名 宏定义字符串\n",[17,104898,104899,104904],{"__ignoreMap":119},[78,104900,104901],{"class":124,"line":125},[78,104902,104903],{},"#define PI 3.1 4   159 26\n",[78,104905,104906],{"class":124,"line":132},[78,104907,104908],{},"#define 宏名 宏定义字符串\n",[13,104910,104911,104912,104915],{},"如上所见，宏名中间不能有空格，但是宏定义字符串可以任意书写，但是必须在一行内。",[22,104913,104914],{},"宏定义只是对字符串相同的内容进行替换，不会进行运算","。如下：",[114,104917,104919],{"className":104650,"code":104918,"language":7360,"meta":119,"style":119},"#define P 3\n#define S(a) P*a*a\nS(3 + 5)\n\u002F\u002F 等效为 3 * 3 + 5 * 3 + 5 = 9 + 15 + 5 = 29\n",[17,104920,104921,104926,104931,104936],{"__ignoreMap":119},[78,104922,104923],{"class":124,"line":125},[78,104924,104925],{},"#define P 3\n",[78,104927,104928],{"class":124,"line":132},[78,104929,104930],{},"#define S(a) P*a*a\n",[78,104932,104933],{"class":124,"line":138},[78,104934,104935],{},"S(3 + 5)\n",[78,104937,104938],{"class":124,"line":144},[78,104939,104940],{},"\u002F\u002F 等效为 3 * 3 + 5 * 3 + 5 = 9 + 15 + 5 = 29\n",[13,104942,104943],{},"11、文件包含",[114,104945,104947],{"className":104650,"code":104946,"language":7360,"meta":119,"style":119},"#include \"需包含的文件名\"\n#include \u003C需包含的文件名>\n",[17,104948,104949,104954],{"__ignoreMap":119},[78,104950,104951],{"class":124,"line":125},[78,104952,104953],{},"#include \"需包含的文件名\"\n",[78,104955,104956],{"class":124,"line":132},[78,104957,104958],{},"#include \u003C需包含的文件名>\n",[13,104960,104961],{},"\u003C >使用的是C语言标准的头文件，查找的是默认include文件夹下的文件；\" \"先查找当前文件夹下的文件，找不到再查找默认include文件夹下的文件。简而言之：\u003C > > \" \"",[13,104963,104964],{},"12、少见常考文件操作函数",[8366,104966,104967,104983],{},[8369,104968,104969],{},[8372,104970,104971,104974,104977,104980],{},[8375,104972,104973],{},"函数名",[8375,104975,104976],{},"函数定义格式",[8375,104978,104979],{},"函数功能",[8375,104981,104982],{},"返回值",[8386,104984,104985,105002,105015,105032],{},[8372,104986,104987,104990,104993,104996],{},[8391,104988,104989],{},"feop",[8391,104991,104992],{},"int feop(FILE *fp)",[8391,104994,104995],{},"检查fp文件是否结束",[8391,104997,104998,104999,105001],{},"是：非0",[2996,105000],{},"失败：0",[8372,105003,105004,105007,105010,105013],{},[8391,105005,105006],{},"rewind",[8391,105008,105009],{},"void rewind(FILE *fp)",[8391,105011,105012],{},"移动fp所指文件读写位置到文件头",[8391,105014],{},[8372,105016,105017,105020,105023,105026],{},[8391,105018,105019],{},"fseek",[8391,105021,105022],{},"int fseek(FILE *fp, long n, unsigned int posi)",[8391,105024,105025],{},"移动fp所指文件读写位置，n为位移量，posi决定起始位置",[8391,105027,105028,105029,105031],{},"成功：0",[2996,105030],{},"失败：非0",[8372,105033,105034,105037,105040,105043],{},[8391,105035,105036],{},"ftell",[8391,105038,105039],{},"long ftell(FILE *fp)",[8391,105041,105042],{},"求当前位置到文件头的字节数",[8391,105044,105045,105046,105048],{},"成功：所求字节数",[2996,105047],{},"失败：EOF",[13,105050,105051],{},"fseek（*1， *2， *3）中，*3位置有常见定义SEEK_SET、SEEK_CUR、SEEK_END，分别表示常量0、1、2，表示起始位置为：文件首部、当前位置、文件尾部",[13,105053,105054],{},"13、文件打开方式",[8366,105056,105057,105073],{},[8369,105058,105059],{},[8372,105060,105061,105064,105067,105070],{},[8375,105062,105063],{},"文本文件",[8375,105065,105066],{},"ASCII",[8375,105068,105069],{},"二进制文件",[8375,105071,105072],{},"Binary",[8386,105074,105075,105087,105099,105111,105122,105135,105148],{},[8372,105076,105077,105080,105083,105085],{},[8391,105078,105079],{},"使用方式",[8391,105081,105082],{},"含义",[8391,105084,105079],{},[8391,105086,105082],{},[8372,105088,105089,105091,105094,105097],{},[8391,105090,17132],{},[8391,105092,105093],{},"打开文件只读",[8391,105095,105096],{},"rb",[8391,105098,105093],{},[8372,105100,105101,105103,105106,105109],{},[8391,105102,85783],{},[8391,105104,105105],{},"新建文件只写",[8391,105107,105108],{},"wb",[8391,105110,105105],{},[8372,105112,105113,105115,105118,105120],{},[8391,105114,5009],{},[8391,105116,105117],{},"打开文件追加",[8391,105119,82870],{},[8391,105121,105117],{},[8372,105123,105124,105127,105130,105133],{},[8391,105125,105126],{},"r+",[8391,105128,105129],{},"打开文件读\u002F写",[8391,105131,105132],{},"rb+",[8391,105134,105129],{},[8372,105136,105137,105140,105143,105146],{},[8391,105138,105139],{},"w+",[8391,105141,105142],{},"新建文件读\u002F写",[8391,105144,105145],{},"wb+",[8391,105147,105142],{},[8372,105149,105150,105153,105156,105159],{},[8391,105151,105152],{},"a+",[8391,105154,105155],{},"打开文件读\u002F写\u002F追加",[8391,105157,105158],{},"ab+",[8391,105160,105155],{},[13,105162,105163],{},"*可见其实二进制文件和文本文件的差别只是操作指令加了个b，这个b就是binary二进制的意思。",[13,105165,105166],{},"14、常见字符串操作函数：",[8366,105168,105169,105181],{},[8369,105170,105171],{},[8372,105172,105173,105175,105177,105179],{},[8375,105174,104973],{},[8375,105176,104976],{},[8375,105178,104979],{},[8375,105180,104982],{},[8386,105182,105183,105197,105214,105227,105241,105258],{},[8372,105184,105185,105188,105191,105194],{},[8391,105186,105187],{},"strcat",[8391,105189,105190],{},"char * strcat(char *s, char * t)",[8391,105192,105193],{},"把字符串t连接到s，使s成为包含t的结果串",[8391,105195,105196],{},"字符串s",[8372,105198,105199,105202,105205,105208],{},[8391,105200,105201],{},"strcmp",[8391,105203,105204],{},"int strcmp(char *s, char * t)",[8391,105206,105207],{},"逐个比较字符串s和t中的对应字符，直到对应字符不等或比较到串尾",[8391,105209,105210,105211,105213],{},"相等：0",[2996,105212],{},"不等：不等字符串的差值",[8372,105215,105216,105219,105222,105225],{},[8391,105217,105218],{},"strcpy",[8391,105220,105221],{},"char * strcpy(char *s, char * t)",[8391,105223,105224],{},"把字符串t复制到s中",[8391,105226,105196],{},[8372,105228,105229,105232,105235,105238],{},[8391,105230,105231],{},"strlen",[8391,105233,105234],{},"unsigned int strlen(char *s)",[8391,105236,105237],{},"计算字符串s的长度（不包括'\\0'）",[8391,105239,105240],{},"字符串长度",[8372,105242,105243,105246,105249,105252],{},[8391,105244,105245],{},"strchr",[8391,105247,105248],{},"char * strchr(char *s, char c)",[8391,105250,105251],{},"在字符串s中查找字符c首次出现的地址",[8391,105253,105254,105255,105257],{},"找到：相应地址",[2996,105256],{},"找不到：NULL",[8372,105259,105260,105263,105266,105269],{},[8391,105261,105262],{},"strstr",[8391,105264,105265],{},"char * strstr(char *s, char *t)",[8391,105267,105268],{},"在字符串s中查找字符串t首次出现的地址",[8391,105270,105254,105271,105257],{},[2996,105272],{},[13,105274,105275],{},"*strcmp = str compare\t||\tstrcpy = str copy\t||\tstrlen = str length",[107,105277,105279],{"id":105278},"数据结构一些常见的问题","数据结构一些常见的问题：",[13,105281,105282],{},"1、算法 + 数据结构 = 程序",[13,105284,105285,105286,3784,105289,105292,105293,3784,105296,105298,105299],{},"2、一个算法必须满足以下五个重要特性： ",[22,105287,105288],{},"有穷性",[22,105290,105291],{},"确定性"," 、 ",[22,105294,105295],{},"可行性",[22,105297,826],{},"  、",[22,105300,832],{},[13,105302,105303,105304,105292,105306,105292,105309,105292,105312],{},"3、评价算法优劣的基本标准 ：",[22,105305,64533],{},[22,105307,105308],{},"可读性",[22,105310,105311],{},"健壮性",[22,105313,105314],{},"高效性",[226,105316,228],{},{"title":119,"searchDepth":144,"depth":144,"links":105318},[105319,105320],{"id":104623,"depth":132,"text":104624},{"id":105278,"depth":132,"text":105279},{},"我的大学\u002Fbranch\u002Fresearch\u002F专业\u002FC语言与数据结构.md","\u002Fundergraduate\u002Fnote-e53202f2a154",{"title":104567,"description":104572},"undergraduate\u002Fnote-e53202f2a154",[246],"Zh4dRQFDiY-X0m9wHcxCcISkWY4gp6Ud1LdHXZBNnuI",{"id":105329,"title":105330,"assetBase":239,"author":8,"body":105331,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":108076,"navigation":128,"originalPath":108077,"path":108078,"seo":108079,"source":23330,"stem":108080,"tags":108081,"weight":250,"__hash__":108082},"content\u002Fundergraduate\u002Fnote-efa1fce97998.md","软件工程备考",{"type":10,"value":105332,"toc":107998},[105333,105335,105350,105353,105357,105360,105363,105366,105377,105380,105383,105406,105409,105412,105415,105418,105441,105444,105447,105461,105464,105487,105489,105493,105496,105499,105502,105508,105511,105517,105520,105526,105529,105535,105539,105707,105709,105713,105716,105719,105722,105725,105923,105925,105929,105932,105935,105938,105941,105944,105947,105950,105953,105956,105959,106044,106047,106050,106053,106056,106059,106062,106065,106068,106071,106074,106077,106080,106088,106091,106095,106098,106101,106104,106107,106110,106114,106117,106121,106124,106128,106131,106135,106138,106142,106145,106149,106152,106156,106159,106162,106166,106169,106173,106176,106180,106183,106187,106190,106194,106197,106201,106204,106207,106210,106214,106217,106221,106224,106228,106231,106235,106238,106241,106245,106248,106252,106254,106258,106261,106264,106267,106290,106293,106296,106298,106302,106305,106308,106311,106314,106317,106321,106324,106328,106331,106335,106338,106342,106345,106349,106352,106356,106359,106363,106366,106369,106372,106375,106378,106395,106398,106401,106436,106438,106442,106446,106449,106466,106469,106472,106483,106486,106489,106493,106496,106500,106503,106507,106510,106514,106518,106521,106524,106547,106550,106553,106556,106559,106573,106577,106580,106584,106587,106590,106598,106601,106604,106608,106612,106615,106619,106622,106625,106628,106645,106649,106652,106656,106660,106663,106666,106670,106672,106676,106679,106682,106685,106699,106702,106705,106708,106712,106726,106729,106732,106735,106746,106749,106752,106763,106766,106769,106772,106775,106778,106781,106784,106788,106791,106795,106798,106801,106805,106808,106811,106814,106817,106821,106824,106827,106838,106842,106845,106849,106852,106855,106859,106862,106865,106869,106872,106875,106878,106882,106885,106888,106892,106895,106899,106902,106905,106908,106922,106926,106929,106934,106937,106941,106944,106976,106980,106983,107012,107015,107019,107022,107028,107031,107035,107038,107043,107045,107049,107051,107054,107065,107068,107071,107082,107085,107088,107092,107095,107098,107112,107115,107118,107129,107132,107135,107204,107207,107224,107227,107230,107261,107264,107266,107270,107273,107277,107280,107283,107286,107289,107292,107295,107306,107310,107314,107317,107320,107324,107327,107330,107334,107337,107340,107344,107347,107350,107353,107357,107360,107363,107367,107370,107373,107377,107380,107383,107386,107397,107401,107404,107415,107419,107422,107433,107436,107439,107442,107446,107450,107454,107457,107460,107463,107466,107470,107474,107478,107482,107485,107538,107540,107544,107547,107550,107554,107571,107574,107578,107598,107602,107619,107623,107634,107637,107640,107644,107669,107672,107675,107678,107692,107695,107700,107717,107719,107723,107731,107746,107757,107762,107765,107770,107773,107776,107779,107783,107787,107791,107794,107799,107803,107806,107809,107812,107815,107818,107824,107827,107830,107836,107839,107842,107847,107850,107853,107856,107862,107865,107868,107871,107876,107879,107882,107887,107891,107894,107899,107903,107906,107909,107914,107918,107921,107924,107929,107933,107936,107939,107944,107948,107951,107956,107960,107963,107966,107969,107974,107978,107981,107984,107987,107990,107993],[4517,105334,6380],{"id":6380},[72,105336,105337,105341,105344,105347],{},[13,105338,105339],{},[22,105340,23957],{},[13,105342,105343],{},"开始打算按照这第九版教材的课后习题做一个个人解答文档，然后发现——课后题内容太宽泛了，鄙人水平不足，误导大家就不好了；然后决定把书的章节精简整理，看书看到第三章越看越不对劲——老师上课完全没讲书，万一写多了最后不考岂不是害了大家？所以最后取了个折中的办法——对书本的前11章节内容进行精简学习，然后着重研究下软件工程中常见的九种图。",[13,105345,105346],{},"希望对正在看该文档的你有所帮助。",[13,105348,105349],{},"更新：后期老师专门画了下重点，所以会在文档种我认为比较重要的地方打上**【重点】**标记，可以从目录进行索引。Github不支持目录就算了。",[107,105351,105352],{"id":105352},"第一章",[7759,105354,105356],{"id":105355},"重点定义","【重点】定义",[13,105358,105359],{},"软件工程包括过程、一系列方法（实践）和大量的工具，专业人员借由这些来构建高质量的计算机软件。",[13,105361,105362],{},"软件具有产品和产品交付载体的双重作用。",[13,105364,105365],{},"软件是：",[49,105367,105368,105371,105374],{},[52,105369,105370],{},"指令的集合（计算机程序），通过执行这些指令可以满足预期的特性、功能和性能需求；",[52,105372,105373],{},"数据结构，使得程序可以合理利用信息；",[52,105375,105376],{},"软件描述信息，它以硬拷贝和虚拟形式存在，用来描述程序的操作和使用。",[7759,105378,105379],{"id":105379},"软件应用领域",[13,105381,105382],{},"计算机软件分为七大类：",[49,105384,105385,105388,105391,105394,105397,105400,105403],{},[52,105386,105387],{},"系统软件。一整套服务于其他程序的程序。",[52,105389,105390],{},"应用程序。解决特定业务需要的独立应用程序。处理商务或技术数据，以协助业务操作或协助做出管理\u002F技术决策。",[52,105392,105393],{},"工程\u002F科学软件。“数值计算”类程序。",[52,105395,105396],{},"嵌入式软件。存在于某个产品或者系统中，可实现和控制面向最终用户和系统本身的特性和功能。",[52,105398,105399],{},"产品线软件。包括可复用的构件，并为多个不同用户的使用提供特定功能。",[52,105401,105402],{},"Web\u002F移动App。以网络为中心，其概念涵盖了宽泛的应用软件产品，包括基于浏览器的App、云计算、基于服务的计算和安装在移动设备上的软件。",[52,105404,105405],{},"人工智能软件。利用启发式方法解决常规计算和分析无法解决的复杂问题。",[7759,105407,105408],{"id":105408},"软件过程",[10548,105410,105411],{"id":105411},"过程框架",[13,105413,105414],{},"沟通——策划——建模——构建——部署",[10548,105416,105417],{"id":105417},"普适性活动",[49,105419,105420,105423,105426,105429,105432,105435,105438],{},[52,105421,105422],{},"软件项目跟踪和控制",[52,105424,105425],{},"软件质量保障",[52,105427,105428],{},"技术评审",[52,105430,105431],{},"测量",[52,105433,105434],{},"软件配置管理",[52,105436,105437],{},"可复用性管理",[52,105439,105440],{},"工作产品的准备和生产",[7759,105442,105443],{"id":105443},"软件工程实践",[10548,105445,105446],{"id":105446},"实践的精髓",[49,105448,105449,105452,105455,105458],{},[52,105450,105451],{},"理解问题（沟通和分析）",[52,105453,105454],{},"策划解决问题（建模和软件设计）",[52,105456,105457],{},"实施计划（代码生成）",[52,105459,105460],{},"检查结果（测试和质量保证）",[10548,105462,105463],{"id":105463},"通用原则",[49,105465,105466,105469,105472,105475,105478,105481,105484],{},[52,105467,105468],{},"存在价值。一个软件系统因为为用户提供价值而具有存在价值，所有决策应该都基于这个思想。",[52,105470,105471],{},"保持简洁。所有的设计都应该尽可能简洁，但不是过于简化。",[52,105473,105474],{},"保持愿景。清晰的愿景是软件项目成功的基础。",[52,105476,105477],{},"关注使用者。在需求说明、设计、编写文档和实现过程中，牢记要让别人理解你所做的事情。",[52,105479,105480],{},"面向未来。永远不要把自己的设计局限于一隅，构建可以解决通用问题的系统，为各种可能的方案做好准备，而不是仅仅针对某一个具体问题。",[52,105482,105483],{},"提前计划复用。提前做好复用计划将降低开发费用，并增加可复用构件以及构件化系统的价值。",[52,105485,105486],{},"认真思考。在行动之前清晰定位、完整思考通常能产生更好的结果。",[23289,105488],{},[107,105490,105492],{"id":105491},"第二章-过程模型","第二章 过程模型",[13,105494,105495],{},"在开发产品或构建系统时，遵循一系列可预测的步骤（即路线图）是非常重要的，它有助于及时交付高质量的产品。软件开发中所遵循的路线图就成为“软件过程”。软件过程提高了软件工程活动的稳定性、可控性和有组织性，如果不进行控制，软件活动将变得混乱。",[13,105497,105498],{},"软件过程定义为一个为创建高质量软件所需要完成的活动、动作和任务的框架。",[13,105500,105501],{},"线性过程流（linear process flow）从沟通到部署顺序执行五个框架活动；",[49,105503,105504],{},[52,105505,105506],{},[617,105507],{"alt":119,"src":30426},[13,105509,105510],{},"迭代过程流（iterative process flow）在执行下一个活动前重复执行之前的一个或多个活动；",[49,105512,105513],{},[52,105514,105515],{},[617,105516],{"alt":119,"src":30562},[13,105518,105519],{},"演化过程流（evolutionary process flow）采用循环的方式执行各个活动，每次循环都能产生更为完善的软件版本；",[49,105521,105522],{},[52,105523,105524],{},[617,105525],{"alt":119,"src":65400},[13,105527,105528],{},"并行过程流（parallel process flow）将一个或多个活动与其他活动并行执行。",[49,105530,105531],{},[52,105532,105533],{},[617,105534],{"alt":119,"src":68935},[7759,105536,105538],{"id":105537},"重点过程模型的对比","【重点】过程模型的对比",[8366,105540,105541,105556],{},[8369,105542,105543],{},[8372,105544,105545,105547,105549,105552,105554],{},[8375,105546,9947],{"align":9247},[8375,105548,9145],{},[8375,105550,105551],{"align":9247},"图像",[8375,105553,20689],{"align":9247},[8375,105555,20692],{"align":9247},[8386,105557,105558,105591,105633,105669],{},[8372,105559,105560,105563,105569,105573,105582],{},[8391,105561,105562],{"align":9247},"瀑布模型",[8391,105564,105565,105566,105568],{},"瀑布模型（waterfall model）又称为线性顺序模型（linear sequential model），提出了一个系统的、顺序的软件开发方法。",[2996,105567],{},"从用户需求规格说明开始，通过策划、建模、构建和部署过程，最终提供完整的技术支持。",[8391,105570,105571],{"align":9247},[617,105572],{"alt":119,"src":71334},[8391,105574,105575,105576,105578,105579,105581],{"align":9247},"容易理解和计划；",[2996,105577],{},"适用于充分理解的小型项目；",[2996,105580],{},"分析和测试是顺序线性的",[8391,105583,105584,105585,105587,105588,105590],{"align":9247},"不能很好的适应变化；",[2996,105586],{},"测试在过程的后期进行；",[2996,105589],{},"客户确认在最后阶段",[8372,105592,105593,105596,105605,105609,105621],{},[8391,105594,105595],{"align":9247},"原型模型",[8391,105597,105598,105599,105601,105602,105604],{},"原型开发范型开始于沟通。",[2996,105600],{},"软件开发人员和其他利益相关者进行会晤，定义软件的整体目标，明确已知需求，并大致勾画出以后再进一步定义的东西。",[2996,105603],{},"然后迅速策划一个原型开发迭代并进行建模（以“快速设计”的方式）。",[8391,105606,105607],{"align":9247},[617,105608],{"alt":119,"src":71318},[8391,105610,105611,105612,105614,105615,105617,105618,105620],{"align":9247},"变更需求对后续设计影响较小；",[2996,105613],{},"客户很早并频繁的参与其中；",[2996,105616],{},"对小型项目来说效果好；",[2996,105619],{},"产品失败的可能性降低",[8391,105622,105623,105624,105626,105627,105629,105630,105632],{"align":9247},"客户的参与可能会造成进度延误；",[2996,105625],{},"“提交”一个原型，可能会造成初步完成的假象；",[2996,105628],{},"原型被抛弃导致工作白干了；",[2996,105631],{},"很难计划和管理",[8372,105634,105635,105638,105644,105648,105660],{},[8391,105636,105637],{"align":9247},"螺旋模型",[8391,105639,105640,105641,105643],{},"螺旋模型是一种演进式软件过程模型。它结合了原型的迭代性质和瀑布模型的可控性和系统性的特点。它具有快速开发越来越完善的软件版本的潜力。",[2996,105642],{},"螺旋模型将软件开发为一系列演进版本。在早期的迭代中，软件可能是一个理论模型或者原型。在后来的迭代中，会产生逐渐一系列逐渐完整的系统版本。",[8391,105645,105646],{"align":9247},[617,105647],{"alt":119,"src":71326},[8391,105649,105650,105651,105653,105654,105656,105657,105659],{"align":9247},"有持续不断的客户参与；",[2996,105652],{},"开发风险得到控制；",[2996,105655],{},"适用于大型复杂项目；",[2996,105658],{},"适用于可扩展产品",[8391,105661,105662,105663,105665,105666,105668],{"align":9247},"风险分析失效可能导致项目失败；",[2996,105664],{},"项目可能难于管理；",[2996,105667],{},"需要一个专家开发团队",[8372,105670,105671,105674,105680,105685,105696],{},[8391,105672,105673],{"align":9247},"统一过程模型",[8391,105675,105676,105677,105679],{},"统一过程（Unified Process，UP）尝试着从传统软件过程中挖掘最好的特征和性质，但是以敏捷开发中许多最好的原则来实现。",[2996,105678],{},"它建立了迭代的、增量的过程流，提供了演进的特征，对现代软件开发非常重要。",[8391,105681,105682],{"align":9247},[617,105683],{"alt":119,"src":105684},"img\u002F2.8.png",[8391,105686,105687,105688,105650,105690,105692,105693,105695],{"align":9247},"重视文档质量；",[2996,105689],{},[2996,105691],{},"适合需求变更的情况；",[2996,105694],{},"对维护项目非常有效",[8391,105697,105698,105699,105701,105702,105704,105705,105668],{"align":9247},"用例并不总是精确的；",[2996,105700],{},"具有复杂的软件增量集成；",[2996,105703],{},"阶段的重叠可能会带来问题；",[2996,105706],{},[23289,105708],{},[107,105710,105712],{"id":105711},"第三章-敏捷和敏捷过程重点","第三章 敏捷和敏捷过程【重点】",[13,105714,105715],{},"敏捷方法是为了克服传统软件工程中认识和实践的弱点而形成的。",[13,105717,105718],{},"不确定意味着变更，而变更意味着付出昂贵的成本，特别是对变更失去控制或疏于管理的情况下。而敏捷开发最令人信服的特点之一就是它能够通过软件过程来降低由变更所带来的成本。",[13,105720,105721],{},"敏捷是有效的响应变更，它鼓励采用能够使沟通更便利的团队结构和协作态度。它强调可运行软件的快速交付而不那么看重中间产品；它将客户作为开发团队的一部分开展工作，以消除持续、普遍存在于多数软件项目中的“区分我们和他们”的态度；它承认在不确定的世界里，计划是有局限性的，项目计划必须是可以灵活调整的。",[13,105723,105724],{},"强调这样一个增量交付策略：根据具体的产品类型和运行环境，尽快将可工作的软件交付给客户。",[8366,105726,105727,105742],{},[8369,105728,105729],{},[8372,105730,105731,105734,105736,105738,105740],{},[8375,105732,105733],{"align":9247},"敏捷技术",[8375,105735,9145],{"align":8377},[8375,105737,105551],{},[8375,105739,20689],{"align":9247},[8375,105741,20692],{"align":9247},[8386,105743,105744,105783,105831,105876],{},[8372,105745,105746,105749,105758,105762,105774],{},[8391,105747,105748],{"align":9247},"Scrum",[8391,105750,105751,105752,105754,105755,105757],{"align":8377},"应用Scrum原则指导过程中的开发活动，过程由“需求、分析、设计、演化和交付”等框架性活动组成。",[2996,105753],{},"        每一个框架活动中，工作任务在相对较短的时间盒的期限内完成称为一个冲刺（sprint）。冲刺包括：冲刺规划会议、每日Scrum会议、冲刺评审会议、冲刺回顾。",[2996,105756],{},"        冲刺中举行的工作适应于当前的问题，由Scrum团队规定并进行实施修改。",[8391,105759,105760],{},[617,105761],{"alt":119,"src":29839},[8391,105763,105764,105765,105767,105768,105770,105771,105773],{"align":9247},"产品负责人设置优先级；",[2996,105766],{},"团队拥有决策权；",[2996,105769],{},"文档是轻量级的；",[2996,105772],{},"支持频繁更新",[8391,105775,105776,105777,105779,105780,105782],{"align":9247},"很难控制变更成本；",[2996,105778],{},"可能不适合大型团队；",[2996,105781],{},"需要专家团队成员",[8372,105784,105785,105788,105803,105807,105819],{},[8391,105786,105787],{"align":9247},"XP",[8391,105789,105790,105791,105793,105794,105796,105797,105799,105800,105802],{"align":8377},"极限编程（XP）包括策划、设计、编码和测试四个框架活动的规则和时间。",[2996,105792],{},"策划：策划活动从倾听开始，这是一个需求收集活动。",[2996,105795],{},"设计：XP设计严格遵守KIS（Keep It Simple，保持简洁）原则。不鼓励额外的功能性设计。",[2996,105798],{},"编码：XP建议，在故事开发和初步设计完成后，团队不要直接开始编码，而是开发系列单元测试用于校验本次（软件增量）发布的所有故事。",[2996,105801],{},"测试：所建立的单元测试应当使用一个可以自动实施的框架。",[8391,105804,105805],{},[617,105806],{"alt":119,"src":62233},[8391,105808,105809,105810,105812,105813,105815,105816,105818],{"align":9247},"强调客户参与；",[2996,105811],{},"建立合理的计划和时间表；",[2996,105814],{},"开发人员对项目高度投入；",[2996,105817],{},"产品失败的可能性低",[8391,105820,105821,105822,105824,105825,105827,105828,105830],{"align":9247},"会受到“交付”原型的诱惑；",[2996,105823],{},"需要经常开会，导致成本增加；",[2996,105826],{},"可能允许过多的变更；",[2996,105829],{},"对高度熟练的团队成员有依赖性",[8372,105832,105833,105836,105848,105852,105864],{},[8391,105834,105835],{"align":9247},"看板法",[8391,105837,105838,105839,105841,105842,105844,105845,105847],{"align":8377},"看板法是一种精益方法学，提供了改进过程或工作流的方法。看板专注于变更管理和服务交付。",[2996,105840],{},"变更管理定义了将请求的变更集成到基于软件的系统的过程。",[2996,105843],{},"服务交付则专注于了解客户需求和期望。",[2996,105846],{},"团队成员管理其工作，并对于自组织完成工作给予充分的自由度。可根据需要逐步演化策略以改进结果。",[8391,105849,105850],{},[617,105851],{"alt":119,"src":71409},[8391,105853,105854,105855,105857,105858,105860,105861,105863],{"align":9247},"预算和时间要求较低；",[2996,105856],{},"允许更早交付产品；",[2996,105859],{},"过程策略记录在案；",[2996,105862],{},"有持续的过程改进",[8391,105865,105866,105867,105869,105870,105872,105873,105875],{"align":9247},"成功与否取决于团队合作技巧；",[2996,105868],{},"糟糕的业务分析可能会毁了项目；",[2996,105871],{},"灵活性可能导致开发人员失去焦点；",[2996,105874],{},"开发人员不愿意使用测量",[8372,105877,105878,105881,105896,105900,105912],{},[8391,105879,105880],{"align":9247},"DevOps",[8391,105882,105883,105884,105886,105887,105889,105890,105892,105893,105895],{"align":8377},"DevOps旨在将开发和运维相结合，尝试在整个软件供应链中应用敏捷开发和精益开发原则。设计一下几个阶段：",[2996,105885],{},"- 持续开发。将软件可交付成果分解到多次冲刺中开发，增量由开发团队的质量保证成员进行测试。",[2996,105888],{},"- 持续测试。自动化测试工具用于帮助团队成员同时测试多个代码增量，以确保在集成之前它们没有缺陷。",[2996,105891],{},"- 持续集成。在此阶段，将集成代码部署（安装）到生产环境，其中包括准备接收新功能的分布在全球的多个站点。",[2996,105894],{},"- 持续监控。开发团队成员的运维人员通过监控软件在生产环境中的性能，并在用户发现问题之前主动查找问题，以提高软件的质量。",[8391,105897,105898],{},[617,105899],{"alt":119,"src":71417},[8391,105901,105902,105903,105905,105906,105908,105909,105911],{"align":9247},"代码部署的时间缩短了；",[2996,105904],{},"团队包括开发人员和运维人员；",[2996,105907],{},"团队拥有端到端的项目所有权；",[2996,105910],{},"主动监控已部署的产品",[8391,105913,105914,105915,105917,105918,105920,105921,105668],{"align":9247},"存在处理新旧代码的压力；",[2996,105916],{},"成效严重依赖自动化工具；",[2996,105919],{},"部署可能会影响生产环境；",[2996,105922],{},[23289,105924],{},[107,105926,105928],{"id":105927},"第四章-推荐的过程模型","第四章 推荐的过程模型",[13,105930,105931],{},"项目各不相同，团队也各不相同。没有哪种软件工程框架适合所有的软件产品。",[7759,105933,105934],{"id":105934},"软件开发项目时应考虑的一些建议",[13,105936,105937],{},"1、在没有足够反馈的情况下，使用线性过程模型是有风险的。",[13,105939,105940],{},"2、计划前期获取大量的需求既无可能也无必要。",[13,105942,105943],{},"3、前期需求获取可能不会降低成本或者防止超时。",[13,105945,105946],{},"4、软件开发中需要适当的项目管理。",[13,105948,105949],{},"5、文档与软件应该同步推进，而不应当拖延到构建开始时。",[13,105951,105952],{},"6、应尽早并且频繁地让利益相关者参与到软件开发过程中。",[13,105954,105955],{},"7、测试人员应在软件构建前就参与其中。",[7759,105957,105958],{"id":105958},"敏捷过程模型和螺旋模型对比",[8366,105960,105961,105970],{},[8369,105962,105963],{},[8372,105964,105965,105968],{},[8375,105966,105967],{"align":9247},"敏捷过程模型",[8375,105969,105637],{"align":9247},[8386,105971,105972,105980,105988,105996,106004,106012,106020,106028,106036],{},[8372,105973,105974,105977],{},[8391,105975,105976],{"align":9247},"不适合大型高风险或任务关键型任务",[8391,105978,105979],{"align":9247},"不适用于小型、低风险的项目",[8372,105981,105982,105985],{},[8391,105983,105984],{"align":9247},"最少化规则、最少化文档",[8391,105986,105987],{"align":9247},"需要多个步骤，以及前期完成的文档",[8372,105989,105990,105993],{},[8391,105991,105992],{"align":9247},"测试人员需要持续参与",[8391,105994,105995],{"align":9247},"测试人员的早期参与（可由外部团队完成）",[8372,105997,105998,106001],{},[8391,105999,106000],{"align":9247},"易于适应产品变化",[8391,106002,106003],{"align":9247},"在原型完成前难以进行产品更改",[8372,106005,106006,106009],{},[8391,106007,106008],{"align":9247},"非常依赖利益相关者的交互",[8391,106010,106011],{"align":9247},"需要利益相关者持续参与计划和风险评估",[8372,106013,106014,106017],{},[8391,106015,106016],{"align":9247},"易于管理",[8391,106018,106019],{"align":9247},"需要正式的项目管理和协调",[8372,106021,106022,106025],{},[8391,106023,106024],{"align":9247},"尽早交付部分解决方案",[8391,106026,106027],{"align":9247},"难以判断项目结束时间",[8372,106029,106030,106033],{},[8391,106031,106032],{"align":9247},"非正式的风险管理",[8391,106034,106035],{"align":9247},"良好的风险管理",[8372,106037,106038,106041],{},[8391,106039,106040],{"align":9247},"内建的持续过程改进",[8391,106042,106043],{"align":9247},"项目结束时进行过程改进",[7759,106045,106046],{"id":106046},"一些敏捷需求定义的最佳实践",[13,106048,106049],{},"1、通过匹配利益相关者的可用性以及评价他们的投入来鼓励其积极参与。",[13,106051,106052],{},"2、使用简单的模型（例如便利贴，快速草稿，用户故事）减少参与的障碍。",[13,106054,106055],{},"3、在使用需求表示技术之前，花一些时间来解释他们。",[13,106057,106058],{},"4、采用利益相关者的术语，并尽可能避免使用技术术语。",[13,106060,106061],{},"5、使用广度优先的方法来全面了解项目，然后再深入细节。",[13,106063,106064],{},"6、在计划实施用户故事时，允许开发团队及时完善（在利益相关者的参与下）需求详细信息。",[13,106066,106067],{},"7、将要实现的功能列出一个优先级列表，并首先实施最重要的用户故事。",[13,106069,106070],{},"8、与你的利益相关者密切合作，仅在创建下一个原型时记录对所有人有用的需求。",[13,106072,106073],{},"9、质疑是否需要维护未来可能用不到的模型和文档。",[13,106075,106076],{},"10、确保你具有管理的支持，以保证需求定义期间利益相关者和资源的可用性。",[13,106078,106079],{},"两个现实：",[49,106081,106082,106085],{},[52,106083,106084],{},"利益相关者不可能在看到可工作软件之前先描述出整个系统；",[52,106086,106087],{},"利益相关者很难在看到实际软件之前先描述出软件所应具有的质量需求。",[7759,106089,106090],{"id":106090},"敏捷体系结构设计的四个关键要素",[13,106092,106093],{},[617,106094],{"alt":119,"src":30157},[13,106096,106097],{},"1、关注关键的质量属性，并在构建它们时将其合并到原型中。",[13,106099,106100],{},"2、在规划原型时，成功的软件产品会将客户可见的功能和基础体系结构结合在一起。",[13,106102,106103],{},"3、如果对体系结构决策和相关质量问题给予足够的重视，那么敏捷体系结构就可以实现代码的可维护性和可扩展性。",[13,106105,106106],{},"4、持续管理并同步功能需求和体系结构需求间的依赖关系，以确保不断演化的体系结构基础能及时适应未来的增量。",[7759,106108,106109],{"id":106109},"第一个功能原型的过程",[10548,106111,106113],{"id":106112},"_1从纸质原型过渡到软件设计","1、从纸质原型过渡到软件设计",[13,106115,106116],{},"为系统创建纸质原型很划算，并且可以在开发过程的早期完成，可以避免浪费时间构建错误的原型。",[10548,106118,106120],{"id":106119},"_2设计用户界面原型","2、设计用户界面原型",[13,106122,106123],{},"创建用户界面原型作为第一个功能原型的一部分是一个明智的想法，客户发现软件产品易于学习和使用，他们更有可能使用它。",[10548,106125,106127],{"id":106126},"_3创建一个虚拟原型","3、创建一个虚拟原型",[13,106129,106130],{},"与在已完成的原型上添加新的用户界面相比，放弃早期用户界面设计的代价要小得多。",[10548,106132,106134],{"id":106133},"_4将输入和输出功能添加到原型","4、将输入和输出功能添加到原型",[13,106136,106137],{},"添加输入和输出功能到用户界面原型，能提供一种可以测试演化中原型的简便方法。",[10548,106139,106141],{"id":106140},"_5实现算法","5、实现算法",[13,106143,106144],{},"实现算法涉及将你的想法和草图转换为程序源代码的过程。",[10548,106146,106148],{"id":106147},"_6测试原型","6、测试原型",[13,106150,106151],{},"测试原型以演示客户要求的功能，这样可以在像客户展示之前发现一些尚未发现的缺陷。",[10548,106153,106155],{"id":106154},"_7考虑原型的部署","7、考虑原型的部署",[13,106157,106158],{},"可以帮助你避免采用一些捷径，这些捷径会导致创建出的软件将来很难维护。",[7759,106160,106161],{"id":106161},"获取原型反馈的最佳实践技巧",[10548,106163,106165],{"id":106164},"_1在要求原型反馈时提供框架素材","1、在要求原型反馈时提供框架素材",[13,106167,106168],{},"允许用户主动提供反馈的机制，而不是对抗性的。",[10548,106170,106172],{"id":106171},"_2选择适当的人测试你的模型","2、选择适当的人，测试你的模型",[13,106174,106175],{},"对原型进行评价是降低产品开发出错风险的关键。",[10548,106177,106179],{"id":106178},"_3提出合适的问题","3、提出合适的问题",[13,106181,106182],{},"所有利益相关者都同意原型的目标。",[10548,106184,106186],{"id":106185},"_4像用户提供备选方案时保持中立","4、像用户提供备选方案时保持中立",[13,106188,106189],{},"避免让用户感觉他们在以一种被“出卖”的方式做事。",[10548,106191,106193],{"id":106192},"_5测试时进行调整","5、测试时进行调整",[13,106195,106196],{},"用户使用原型时，你需要具有灵活的思维方式。",[10548,106198,106200],{"id":106199},"_6欢迎用户提出自己的想法","6、欢迎用户提出自己的想法",[13,106202,106203],{},"关注用户说了什么。",[7759,106205,106206],{"id":106206},"维护发布软件",[13,106208,106209],{},"维护指的是在最终用户环境中接受和交付（发布）软件之后，保持软件运行所需要的活动。",[10548,106211,106213],{"id":106212},"改正性维护corective-maintenance","改正性维护（corective maintenance）",[13,106215,106216],{},"软件交付给最终用户后，对软件进行反应性修改，以修复发现的问题。",[10548,106218,106220],{"id":106219},"适应性维护adaptive-maintenance","适应性维护（adaptive maintenance）",[13,106222,106223],{},"软件交付后的反应性修改，以保证软件在不断变化的最终用户环境中可用。",[10548,106225,106227],{"id":106226},"完善性维护perfective-maintenance","完善性维护（perfective maintenance）",[13,106229,106230],{},"软件交付后的主动修改，以提供新的用户特征、更好的程序代码结构或改进的文档。",[10548,106232,106234],{"id":106233},"预防性维护preventive-maintenance","预防性维护（preventive maintenance）",[13,106236,106237],{},"软件交付后对其进行主动修改，以便在用户发现产品故障之前进行检测和纠正。",[13,106239,106240],{},"主动的维护可以被安排和计划；反应性维护通常被描述为救火，因为它不能被计划，而且对于最终用户活动的成功至关重要的软件系统，必须立即处理。",[13,106242,106243],{},[617,106244],{"alt":119,"src":30871},[7759,106246,106247],{"id":106247},"小结",[13,106249,106250],{},[617,106251],{"alt":119,"src":30924},[23289,106253],{},[107,106255,106257],{"id":106256},"第五章-软件工程的人员方面","第五章 软件工程的人员方面",[7759,106259,106260],{"id":106260},"团队结构",[13,106262,106263],{},"“最佳”团队结构取决于组织的管理风格、团队组成人员的数量以及他们的技术水平，还有整体的问题难度。",[13,106265,106266],{},"策划软件工程团队结构时应该考虑的项目因素：",[49,106268,106269,106272,106275,106278,106281,106284,106287],{},[52,106270,106271],{},"需解决问题的难度",[52,106273,106274],{},"基于代码行或功能点的结果程序的“规模”",[52,106276,106277],{},"团队成员合作的时间（团队寿命）",[52,106279,106280],{},"问题可模块化的程度",[52,106282,106283],{},"所建系统的质量和可靠性",[52,106285,106286],{},"交付日期要求的严格程度",[52,106288,106289],{},"项目所需的社会化（交流）程度",[7759,106291,106292],{"id":106292},"软件工程心理学",[13,106294,106295],{},"包括个人认知和激励，软件团队的群体动力及公司的组织行为。一个成功的（“有凝聚力的”）软件团队比普通团队更多产、更有动力。为实现高效，软件团队必须有目标意识、参与意识、信任意识以及进步意识。此外，必须避免“毒性”——混乱和消极的工作环境、不适合的软件过程、软件团队中模糊的角色定义以及不断暴露的故障。",[23289,106297],{},[107,106299,106301],{"id":106300},"第六章-理解需求","第六章 理解需求",[13,106303,106304],{},"理解问题的需求是软件工程师面对的最困难的任务之一。",[7759,106306,106307],{"id":106307},"需求工程",[13,106309,106310],{},"需求工程（Requirement Engineering，RE）是指致力于不断理解需求的大量任务和技术。从软件过程的角度来看，需求工程是一个软件工程动作，开始于沟通并持续到建模活动。需求工程为设计和构建奠定了坚实的基础。",[13,106312,106313],{},"需求工程在设计和构件之间建立起联系的桥梁。允许软件团队检查将要进行的软件工作的内容；必须提交的设计和构建的特定要求；完成指导工作顺序的优先级定义，以及将深切地影响随后设计的信息、功能和行为。",[13,106315,106316],{},"需求工程包括七项任务：",[10548,106318,106320],{"id":106319},"_1起始","1、起始",[13,106322,106323],{},"在项目起始阶段，要建立基本的理解，包括存在的问题、谁需要解决方案、期望的解决方案的性质。在完成一项任务的区间，需要在所有利益相关者与软件团队之间建立沟通，以便开始有效的协作。",[10548,106325,106327],{"id":106326},"_2获取","2、获取",[13,106329,106330],{},"询问客户、用户和其他人以下问题：系统或产品的目标是什么，想要实现什么，系统和产品如何满足业务的要求，最终系统和产品如何用与日常工作。在软件产品开发迭代过程中，很可能不断出现新的需求。",[10548,106332,106334],{"id":106333},"_3细化","3、细化",[13,106336,106337],{},"细化任务的核心是开发一个精确的需求模型，用以说明软件的功能、特征和信息的各个方面。",[10548,106339,106341],{"id":106340},"_4协商","4、协商",[13,106343,106344],{},"应该让客户、用户和其他利益相关者对各自的需求排序，然后按优先级讨论冲突。有效的协商不存在赢家也不存在输家。结果应该是双赢的，因为双方都可以接受的“交易”得到了巩固。",[10548,106346,106348],{"id":106347},"_5规格说明","5、规格说明",[13,106350,106351],{},"术语规格说明对不同的人有不同的含义。规格说明可以是一份写好的文档、一套图形化的模型、一个形式化的数学模型、一组使用场景、一个原型或上述各项的任意组合。",[10548,106353,106355],{"id":106354},"_6确认","6、确认",[13,106357,106358],{},"再确认阶段将对需求工程的工作产品进行质量评估。这个阶段最关心的是各个产品的一致性。",[10548,106360,106362],{"id":106361},"_7需求管理","7、需求管理",[13,106364,106365],{},"需求管理是帮助项目组在项目进程中标识、控制和追踪需求以及需求变更的一组活动。",[7759,106367,106368],{"id":106368},"利益相关者",[13,106370,106371],{},"定义为“直接或简介从正在开发的系统中获益的人”。每个利益相关者对系统都有不同的考虑，当系统成功开发后能获得的收益也不相同，同样，在系统开发失败时面临的风险也是不同的。",[7759,106373,106374],{"id":106374},"需求监控",[13,106376,106377],{},"在实现增量开发时，需求监控显得尤为有益。包括5项任务：",[49,106379,106380,106383,106386,106389,106392],{},[52,106381,106382],{},"分布式调试，用于发现错误并找到出错的原因；",[52,106384,106385],{},"运行验证，确认软件与规格说明是否匹配；",[52,106387,106388],{},"运行确定，评估逐步扩展的软件是否满足用户目标；",[52,106390,106391],{},"商业活动监控，评估系统是否满足商业目标；",[52,106393,106394],{},"演化与协同设计，为系统演化过程中的利益相关者提供信息。",[7759,106396,106397],{"id":106397},"确认需求",[13,106399,106400],{},"需求模型的评审将解决如下问题：",[49,106402,106403,106406,106409,106412,106415,106418,106421,106424,106427,106430,106433],{},[52,106404,106405],{},"每项需求都与系统或产品的整体目标一致吗？",[52,106407,106408],{},"所有的需求都已经在相应的抽象层上说明了吗？换句话说，是否一些需求是在技术细节过多的层次上提出的，并不适合当前阶段？",[52,106410,106411],{},"需求是真正必需的，还是另外加上去的？有可能不是系统目标必需的特性吗？",[52,106413,106414],{},"每项需求都有界定且无歧义吗？",[52,106416,106417],{},"每项需求都有归属吗？换句话说，是否每项需求都标记了来源（通常是明确的个人）？",[52,106419,106420],{},"是否有一些需求和其他需求相冲突？",[52,106422,106423],{},"在系统或产品所处的技术环境下，每个需求都能够实现吗？",[52,106425,106426],{},"一旦实现后，每个需求是可测试的吗？",[52,106428,106429],{},"需求模型恰当的反映了将要构建系统的信息、功能和行为吗？",[52,106431,106432],{},"需求模型是否已经使用合适的方式“分割”，能够逐步揭示详细的系统信息？",[52,106434,106435],{},"已经使用需求模式简化需求模型了吗？已经恰当的确认了所有的模式吗？所有模式都与用户的需求一致吗？",[23289,106437],{},[107,106439,106441],{"id":106440},"第七章-需求建模一种推荐的方法","第七章 需求建模——一种推荐的方法",[7759,106443,106445],{"id":106444},"重点需求分析","【重点】需求分析",[13,106447,106448],{},"需求分析产生软件操作特征的规格说明，指明软件和其他系统元素的接口，规定软件必须满足的约束。需求建模动作为以下一种或多种模型类型：",[49,106450,106451,106454,106457,106460,106463],{},[52,106452,106453],{},"场景模型：出自各种系统“参与者”观点的需求。",[52,106455,106456],{},"面向类的模型：表示面向对象类（属性和操作）的模型和如何通过类的协作获得系统需求。",[52,106458,106459],{},"行为模型：表示软件如何对内部或外部“事件”作出反应。",[52,106461,106462],{},"数据模型：描述问题信息域的模型。",[52,106464,106465],{},"面向流的模型：表示系统的功能元素并且描述当功能元素在系统中运行时怎样进行数据变换。",[13,106467,106468],{},"这些模型为软件设计者提供信息，这些信息可以被转化为结构、接口和构件级的设计。最终，在软件开发完成后，需求模型（和需求规格说明）就为开发人员和客户提供了评估软件质量的手段。",[10548,106470,106471],{"id":106471},"需求模型实现的主要目标",[49,106473,106474,106477,106480],{},[52,106475,106476],{},"描述客户需要什么",[52,106478,106479],{},"为软件设计奠定基础",[52,106481,106482],{},"定义在软件完成后可以被确认的一组需求。",[13,106484,106485],{},"分析模型在系统级描述和软件设计之间建立了桥梁，需求模型的所有元素都可以直接追踪到设计模型。",[7759,106487,106488],{"id":106488},"需求建模原则",[10548,106490,106492],{"id":106491},"_1问题的信息域必须得到表达和理解","1、问题的信息域必须得到表达和理解。",[13,106494,106495],{},"信息域包含流入系统的数据、流出系统的数据以及数据存储区中手机和整理的永久保存的数据。",[10548,106497,106499],{"id":106498},"_2必须定义软件执行的功能","2、必须定义软件执行的功能",[13,106501,106502],{},"软件功能可以为终端用户带来直接好处，而那些为用户可见的功能提供内部支持的功能也可以直接受益。",[10548,106504,106506],{"id":106505},"_3必须表示软件的行为作为外部事件的结果","3、必须表示软件的行为（作为外部事件的结果）",[13,106508,106509],{},"计算机软件的行为受到其与外部环境的交互作用驱动。",[10548,106511,106513],{"id":106512},"_4描述信息功能和行为的模型必须以分层或分级的方式进行分割以揭示细节","4、描述信息、功能和行为的模型必须以分层（或分级）的方式进行分割以揭示细节",[10548,106515,106517],{"id":106516},"_5分析任务应从基本信息转向实现细节","5、分析任务应从基本信息转向实现细节",[7759,106519,106520],{"id":106520},"基于类建模",[10548,106522,106523],{"id":106523},"分析类",[49,106525,106526,106529,106532,106535,106538,106541,106544],{},[52,106527,106528],{},"外部实体（例如其它系统、设备、人员）：产生或使用信息以供基于计算机的系统使用。",[52,106530,106531],{},"事务（例如报告、显示、字母、信号）：问题信息域的一部分。",[52,106533,106534],{},"偶发事件或事件（例如所有权转移或完成机器人的一组移动动作）：在系统操作环境内发生。",[52,106536,106537],{},"角色（例如经理、工程师、销售人员）：由和系统交互的人员办理。",[52,106539,106540],{},"组织单元（例如部门、组、团队）：和某个应用系统相关。",[52,106542,106543],{},"场地（例如制造车间或码头）：建立问题的环境和系统的整体功能。",[52,106545,106546],{},"结构（例如传感器、四轮交通工具、见算计）：定义了对象的类或与对象相关的类。",[10548,106548,106549],{"id":106549},"定义属性和操作",[13,106551,106552],{},"属性描述已经选择包含在需求模型中的类。属性定义类，以澄清类在问题空间的环境下意味着什么。",[13,106554,106555],{},"软件工程师应该研究用例并选择那些合理的“属于”类的“事物”。每个类都应该回答如下问题：什么数据项（组合项或基本项）能够在当前问题环境内完整地定义这个类？",[13,106557,106558],{},"操作定义了某个对象的行为。通常可以粗略的划分为4种类型：",[49,106560,106561,106564,106567,106570],{},[52,106562,106563],{},"以某种方式操作数据（例如添加、删除、重新格式化、选择）",[52,106565,106566],{},"执行计算的操作",[52,106568,106569],{},"请求某个对象的状态的操作",[52,106571,106572],{},"监视某个对象发生某个控制事件的操作。",[10548,106574,106576],{"id":106575},"类-职责-协作者建模class-responsibility-collaboratorcrc","类-职责-协作者建模（Class-Responsibility-Collaborator，CRC）",[13,106578,106579],{},"可以识别和组织与系统或产品需求相关的类。CRC模型可以看作是索引卡的集合。每个索引卡的左侧都有一个职责列表，而右侧是可以履行这些职责的相应的协作者。职责是和类相关的属性和操作。协作者是提供完成某个指责所需要信息和动作类。",[13,106581,106582],{},[617,106583],{"alt":119,"src":31471},[7759,106585,106586],{"id":106586},"功能建模",[13,106588,106589],{},"功能模型处理两个应用程序处理元素，每个元素代表不同层次的过程抽象：",[49,106591,106592,106595],{},[52,106593,106594],{},"用户可观察到的功能是由应用程序提供给最终用户的；",[52,106596,106597],{},"分析类中的操作实现与类相关的行为。",[10548,106599,106600],{"id":106600},"过程视图",[13,106602,106603],{},"UML活动图通过提供特定场景内交互流的图形化标识来补充用例，类似于流程图。使用圆角矩阵表示特定的系统功能，箭头表示通过系统的流，菱形标识决策分支（标记菱形发出的每个箭头），实水平线表示并行发生的活动。",[13,106605,106606],{},[617,106607],{"alt":119,"src":31499},[10548,106609,106611],{"id":106610},"uml顺序图","UML顺序图",[13,106613,106614],{},"UML顺序图可用于行为建模。顺序图还可用于显示事件如何引发从一个对象到另一个对象的转移。一旦通过检查用例确认了事件，建模人员就创建了一个顺序图，即用时间函数表示事件是如何引发从一个对象流到另一个对象。顺序图是用例的简化版本，他表示导致行为从一个类流到另一个类的关键类和事件。",[13,106616,106617],{},[617,106618],{"alt":119,"src":73607},[7759,106620,106621],{"id":106621},"行为建模",[13,106623,106624],{},"行为模型显示了软件如何对内部\u002F外部事件或激励做出响应。对于将要构建的系统而言，这些信息对于创建系统的有效设计很有用。UML活动图可用于对系统元素如何响应内部时间进行建模。",[13,106626,106627],{},"分析师必须按如下步骤进行：",[49,106629,106630,106633,106636,106639,106642],{},[52,106631,106632],{},"评估所有的用例，以保证完全理解系统内的交互顺序",[52,106634,106635],{},"识别驱动交互顺序的事件，并理解这些事件如何与特定的对象相互关联",[52,106637,106638],{},"为每个用例生成序列",[52,106640,106641],{},"创建系统状态图",[52,106643,106644],{},"评审行为模型以验证准确性和一致性",[10548,106646,106648],{"id":106647},"uml状态图","UML状态图",[13,106650,106651],{},"分析类的状态图。UML状态图是行为模型的一个组成部分，为每个类呈现了主动状态和导致这些主动状态发生变化的事件（触发器）。",[13,106653,106654],{},[617,106655],{"alt":119,"src":73612},[10548,106657,106659],{"id":106658},"uml活动图","UML活动图",[13,106661,106662],{},"UML活动图在特定的场景内通过迭代流的图形化表示来补充用例。（详见上文内容）",[13,106664,106665],{},"UML泳道图是活动图的一种有用的变形，允许建模人员表示用例所描述的活动流，同时指出哪个参与者或分析类负责由活动矩阵所描述的活动。职责由纵向分割图中的并行条表示，就像游泳池中的泳道。",[13,106667,106668],{},[617,106669],{"alt":119,"src":73636},[23289,106671],{},[107,106673,106675],{"id":106674},"第八章-设计概念","第八章 设计概念",[13,106677,106678],{},"软件设计包括一系列原理、概念和实践，可以指导开发高质量的系统或产品。设计原理建立了指导设计工作的最重要原则。在运用设计实践的技术和方法之前，必须先理解设计概念，设计实践本身会产生软件的各种表示，以指导随后的构建活动。",[13,106680,106681],{},"设计是软件工程是否成功的关键。技术债务是软件开发中的一个概念，它涉及与返工相关的成本，这些成本是由于现在选择“快速而粗糙的”解决方案而导致的，而不是使用会花费更多时间的更好方法。增量的构建软件产品时，不可避免地会产生技术债务。优秀的开发团队必须设法通过定期重构软件来减少技术债务。",[13,106683,106684],{},"控制技术债务而不推迟编码的一种策略是利用多样化和聚合的设计实践。多样化是指识别需求模型元素所建议的可能的备选设计方案的实践。聚合是评估和拒绝不符合软件解决方案定义的非功能性需求所要求约束的备选设计方案的过程。多样化和聚合融合了：",[49,106686,106687,106690,106693,106696],{},[52,106688,106689],{},"来自建立类似实体经验的直觉和判断力",[52,106691,106692],{},"一系列指导模型演化方式的原则和启发式方法",[52,106694,106695],{},"一系列评价质量的标准",[52,106697,106698],{},"得出最终设计表示的迭代过程",[13,106700,106701],{},"一旦以这种方式确定了可行的备选方案，开发人员便可以很好的创建不太可能被抛弃式原型的软件增量。",[7759,106703,106704],{"id":106704},"软件工程中的设计",[13,106706,106707],{},"软件设计是建模活动的最后一个软件工程活动，接着便要进入构建阶段（编码和测试）。",[13,106709,106710],{},[617,106711],{"alt":119,"src":62619},[49,106713,106714,106717,106720,106723],{},[52,106715,106716],{},"数据设计或类设计将类模型转化为设计类的实现以及软件实现所要求的数据结构",[52,106718,106719],{},"体系结构设计定义了软件的主要结构化元素之间的关系、可满足系统需求的体系结构风格和模式以及影响体系结构实现方式的约束。",[52,106721,106722],{},"接口设计描述了软件和协作系统之间、软件和使用人员之间是如何通信的。",[52,106724,106725],{},"构件级设计将软件体系结构的结构化元素变换为对软件构件的过程性描述。",[13,106727,106728],{},"设计师质量形成的地方，设计提供了可以用于质量评估的软件表示，设计是将利益相关者的需求准确的转化为最终软件产品或系统的唯一方法。软件设计是所有软件工程活动和随后的软件支持活动的基础。",[7759,106730,106731],{"id":106731},"设计过程",[10548,106733,106734],{"id":106734},"指导良好设计演化的三个特征",[49,106736,106737,106740,106743],{},[52,106738,106739],{},"设计应当实现所有包含在需求模型中的显式需求，而且必须满足利益相关者期望的所有的隐式需求。",[52,106741,106742],{},"对于那些编码这和测试者以及随后的软件维护者而言，设计应当是可读的、可理解的指南。",[52,106744,106745],{},"设计应当提供软件的全貌，从实现的角度对数据域、功能域和行为域进行处理。",[10548,106747,106748],{"id":106748},"质量指导原则",[13,106750,106751],{},"1、设计应展现出这样一种体系结构：",[49,106753,106754,106757,106760],{},[52,106755,106756],{},"已经使用可识别的体系结构风格或模式创建；",[52,106758,106759],{},"由能够展现出良好的设计特征的构建构成；",[52,106761,106762],{},"能够以演化的方式实现，，从而便于实施和测试。",[13,106764,106765],{},"2、设计应该模块化，也就是说，应将软件逻辑的划分为元素或子系统。",[13,106767,106768],{},"3、设计应该包含数据、体系结构、接口和构件的清晰表示。",[13,106770,106771],{},"4、设计应导出数据结构，这些数据结构适用于要实现的类，并从可识别的数据模式提取。",[13,106773,106774],{},"5、设计应到处显示独立功能特征的构件。",[13,106776,106777],{},"6、设计应导出接口，这些接口降低了构件之间以及构件与外部环境之间连接的复杂性。",[13,106779,106780],{},"7、设计的导出应采用可重复的方法进行，这些方法由软件需求分析过程中获取的信息而产生。",[13,106782,106783],{},"8、应使用能够有效传达其意义的表示法来表达设计。",[13,106785,106786],{},[617,106787],{"alt":119,"src":62640},[7759,106789,106790],{"id":106790},"设计概念",[10548,106792,106794],{"id":106793},"_1抽象","1、抽象",[13,106796,106797],{},"在最高的抽象级上，使用问题所处环境的语言以概括性的术语描述解决方案。在较低的抽象级上，将提供更详细的解决方案说明。",[13,106799,106800],{},"在开发不同层次的抽象时，软件设计师力图创建过程抽象和数据抽象。过程抽象是指具有明确和有限功能的指令序列。数据抽象是描述数据对象的命名数据集合。",[10548,106802,106804],{"id":106803},"_2体系结构","2、体系结构",[13,106806,106807],{},"软件体系结构意指“软件的整体结构和这种结构为系统提供概念完整性的方式”。",[13,106809,106810],{},"软件设计的目标之一是导出系统体系结构示意图，该示意图作为一个框架，将指导更详细的设计活动。一系列的体系结构模式使软件工程师能够重用设计层概念。",[13,106812,106813],{},"结构特性定义了“系统的构件、构件被封装的方式以及构件之间相互作用的方式”。外部功能特性指出“设计体系结构如何满足需求，这些需求包括性能需求、能力需求、可靠性需求、安全性需求、可适应性需求以及其他的系统特征需求”。相关系统族“抽取出相似系统设计中常遇到的重复性模式”。",[13,106815,106816],{},"结构模型将体系结构表示为程序构建的有组织的集合。框架模型可以通过确定相似应用中遇到的可复用体系结构设计框架（模式）来提高设计抽象的级别。动态模型强调程序体系结构的行为方面指明结构或系统配置如何随着外部事件的变化而产生变化。过程模型强调系统必须提供的业务或技术流程的设计。功能模型可用于表示系统的功能层次结构。",[10548,106818,106820],{"id":106819},"_3模式","3、模式",[13,106822,106823],{},"设计模式描述了解决某个明确定义的设计问题的设计结构，该设计问题处在一个特定环境中，该环境会影响到模式的应用和使用方式。",[13,106825,106826],{},"每种设计模式的目的都是提供一种描述，以使设计人员可以决定：",[49,106828,106829,106832,106835],{},[52,106830,106831],{},"模式是否适用于当前工作",[52,106833,106834],{},"模式是否可以复用（因此节约设计时间）",[52,106836,106837],{},"模式是否能够用于知道开发一个相似的但功能或结构不同的模式",[10548,106839,106841],{"id":106840},"_4关注点分离","4、关注点分离",[13,106843,106844],{},"关注点分离是一个设计概念，它表明任何复杂问题如果被分解为可以独立解决或优化的若干块，该复杂问题便能够更容易的得到处理。关注点是一个特征或一个行为，被指定为软件需求模型的一部分。将关注点分割为更小的关注点，便可用更小的工作量和时间解决一个问题。",[10548,106846,106848],{"id":106847},"_5模块化","5、模块化",[13,106850,106851],{},"模块化使关注点分离最常见的表现。软件被划分为独立命名的、可处理的构件，有时被称为模块，把这些构件集成到一起可以满足问题的需求。",[13,106853,106854],{},"模块化设计使开发工作更易于规划，可以定义和交付软件增量，更容易实施变更，能够有效的开展测试和调试，可以进行长期维护而没有严重的副作用。",[10548,106856,106858],{"id":106857},"_6信息屏蔽","6、信息屏蔽",[13,106860,106861],{},"信息屏蔽原则提出模块应该“具有的特征是：每个模块对其他模块都隐蔽自己的设计决策”。换句话说，模块应该被特别说明并设计，使信息（算法和数据）都包含在模块内，其他模块无需对这些信息进行访问。",[13,106863,106864],{},"隐蔽的含义是，通过定义一系列的模块得到有效的模块化，独立模块之间只交流实现软件功能所必需的信息。抽象有助于定义构成软件的过程（或信息）实体。隐蔽定义并加强了对模块内过程细节的访问约束以及对模块所使用的任何局部数据结构的访问约束。",[10548,106866,106868],{"id":106867},"_7功能独立","7、功能独立",[13,106870,106871],{},"功能独立的概念是关注点分离、模块化、抽象和信息隐蔽概念的直接产物。",[13,106873,106874],{},"通过开发具有“专一”功能和“避免”与其他模块过多交互的模块，可以实现功能独立。换句话说，软件设计时应使每个模块仅涉及需求的某个特定子集，并且当从程序结构的其他部分观察时，每个模块只有一个简单的接口。",[13,106876,106877],{},"独立性可以通过两条定性的标准进行评估：内聚性和耦合性。内聚性显示了某个模块相关功能的强度；耦合性显示了模块间的相互依赖性。",[10548,106879,106881],{"id":106880},"_8逐步求精","8、逐步求精",[13,106883,106884],{},"逐步求精是一种自顶向下的设计策略，通过逐步分解功能的宏观陈述（过程抽象）进行层次开发，直到最终到达程序设计语言的语句这一级。",[13,106886,106887],{},"求精是一个细化的过程。抽象和细化是互补的概念。抽象能够明确说明内部过程和数据，但对“外部使用者”隐藏了底层细节；细化有助于设计过程中揭示底层细节。这两个概念有助于设计人员在设计演化中构建完整的设计模型。",[10548,106889,106891],{"id":106890},"_9重构","9、重构",[13,106893,106894],{},"重构是一种重新组织的技术，可以简化构件的设计（或代码）而无需改变其功能或行为。",[10548,106896,106898],{"id":106897},"_10设计类","10、设计类",[13,106900,106901],{},"当设计模型发生演化时，必须定义一组设计类，它们可以通过提供设计细节来对分析类进行求精，这些设计细节将这些类得以实现并创建支持业务解决方案的软件基础设施。",[13,106903,106904],{},"随着体系结构的形成，每个分析类转化为设计表示，抽象级就降低了。也就是说，分析类表示数据对象和应用于它们的关联服务。设计类更多的表现技术细节，用于指导实现。",[13,106906,106907],{},"设计类定义了四个特征：",[49,106909,106910,106913,106916,106919],{},[52,106911,106912],{},"完整性与充分性。设计类应该完整的封装所有可以合理预见的存在于类中的属性和方法。",[52,106914,106915],{},"原始性。和一个设计类相关的方法应该关注于实现类的某一个服务。",[52,106917,106918],{},"高内聚性。一个内聚的设计类具有小的、集中的职责集合，并且专注于使用属性和方法来实现那些职责。",[52,106920,106921],{},"低耦合性。在设计模型中，设计类之间相互协作时必然的。但是，协作应该保持在一个可以接受的最小范围内。",[13,106923,106924],{},[617,106925],{"alt":119,"src":62679},[7759,106927,106928],{"id":106928},"设计模型",[13,106930,106931],{},[617,106932],{"alt":119,"src":106933},"img\u002F8.4.png",[13,106935,106936],{},"在某些情况下，分析模型和设计模型之间可能存在明显的差异；而有些情况下，分析模型慢慢地融入设计模型而没有明显的差异。",[10548,106938,106940],{"id":106939},"_1设计建模原则","1、设计建模原则",[13,106942,106943],{},"一组可以应用的设计原则：",[49,106945,106946,106949,106952,106955,106958,106961,106964,106967,106970,106973],{},[52,106947,106948],{},"原则1：设计应可追溯到需求模型。",[52,106950,106951],{},"原则2：始终考虑要构建系统的体系结构。",[52,106953,106954],{},"原则3：数据设计与处理功能设计同等重要。",[52,106956,106957],{},"原则4：接口（内部和外部）的设计必须谨慎。",[52,106959,106960],{},"原则5：用户界面设计应适应最终用户的需求。",[52,106962,106963],{},"原则6：构件级设计应在功能上独立。",[52,106965,106966],{},"原则7：构件应彼此松耦合，并应与外部环境松耦合。",[52,106968,106969],{},"原则8：设计表示（模型）应易于理解。",[52,106971,106972],{},"原则9：设计应迭代式开发。",[52,106974,106975],{},"原则10：设计模型的创建并不排除采用敏捷方法的可能性。",[10548,106977,106979],{"id":106978},"_2接口设计元素","2、接口设计元素",[13,106981,106982],{},"接口设计有三个重要的元素：",[49,106984,106985,106996,107004],{},[52,106986,106987,106988],{},"用户界面（User Interface，UI）\n",[49,106989,106990,106993],{},[52,106991,106992],{},"UI设计（越来越多称为UX或者用户体验设计）是一项主要的软件工程活动。",[52,106994,106995],{},"通常，UI是整个应用程序体系结构中唯一的子系统，旨在为最终用户提供令人满意的用户体验。",[52,106997,106998,106999],{},"和其它系统、设备、网络、信息生成者或使用者的外部接口\n",[49,107000,107001],{},[52,107002,107003],{},"外部接口设计需要发送和接收信息实体的确定信息。",[52,107005,107006,107007],{},"各种设计构件之间的内部接口\n",[49,107008,107009],{},[52,107010,107011],{},"内部接口设计和构件级设计紧密相关。",[13,107013,107014],{},"这些接口设计元素能够使软件进行外部通信，还能使软件体系结构中的构件进行内部通信和协作。",[10548,107016,107018],{"id":107017},"_3构件级设计元素","3、构件级设计元素",[13,107020,107021],{},"软件的构件级设计完整的描述了每个软件构件的内部细节。为此，构件级设计为所有局部数据对象定义数据结构，为所有在构件内发生的处理定义算法细节，并定义允许访问所有构件操作（行为）的接口。",[13,107023,107024,107027],{},[617,107025],{"alt":119,"src":107026},"img\u002F8.5.png","此为UML构件图",[13,107029,107030],{},"构件的设计细节可以在许多不同的抽象级别上建模。UML活动图可以用来表示处理逻辑。构件的算法细节可以使用伪代码或某种其他图形来表示。数据结构细节通常使用伪代码或用于实现的编程语言来建模。",[10548,107032,107034],{"id":107033},"_4部署级设计元素","4、部署级设计元素",[13,107036,107037],{},"在设计过程中，开发UML部署图以及随后的细化使用了描述符形式，这意味着部署图表明了计算环境，但并没有明确的说明配置细节。",[13,107039,107040],{},[617,107041],{"alt":119,"src":107042},"img\u002F8.6.png",[23289,107044],{},[107,107046,107048],{"id":107047},"第九章-体系结构设计一种推荐的方法","第九章 体系结构设计——一种推荐的方法",[7759,107050,62674],{"id":62674},[13,107052,107053],{},"软件的体系结构可以帮助：",[49,107055,107056,107059,107062],{},[52,107057,107058],{},"分析设计在满足既定需求方面的有效性",[52,107060,107061],{},"在设计变更相对容易的阶段，考虑体系结构可能的选择方案",[52,107063,107064],{},"降低与软件构件相关风险的方式",[13,107066,107067],{},"体系结构的定义方式强调了体系结构表示中“软件构件”的作用。",[10548,107069,107070],{"id":107070},"重要性",[49,107072,107073,107076,107079],{},[52,107074,107075],{},"软件体系结构提供了一种有助于促进所有利益相关者之间交流的表示形式。",[52,107077,107078],{},"软件体系结构突出了可能会对后续所有软件工程产生重要影响的早期设计决策。",[52,107080,107081],{},"软件体系结构提供了一个相对较小的描述软件不同构件之间如何组织和交互的模型。",[13,107083,107084],{},"体系结构设计模型和其中包含的体系结构模式是可传递的。也就是说，体系结构的类型、风格和模式可以应用于其他系统的设计，并且表示了一组抽象，这使得软件工程师能以可预见的方式描述体系结构。",[13,107086,107087],{},"在定义软件体系结构时做出好的决策是一个软件产品是否成功的关键。软件体系结构确定了系统的结构并决定了系统的质量。",[13,107089,107090],{},[617,107091],{"alt":119,"src":31760},[7759,107093,107094],{"id":107094},"体系结构风格",[13,107096,107097],{},"每个体系结构风格都描述了一种系统类别，包括：",[49,107099,107100,107103,107106,107109],{},[52,107101,107102],{},"一组执行系统所需要的功能的构件",[52,107104,107105],{},"一组实现构件间“通信、合作和协调”的连接件",[52,107107,107108],{},"定义构件如何集成为系统的约束",[52,107110,107111],{},"能够使设计者通过分析系统组成元素的已知属性来理解系统整体性质的语义模型",[13,107113,107114],{},"体系结构风格就是施加在整个系统设计上的一种变换，目的是为系统中所有构件建立一个结构。",[13,107116,107117],{},"体系结构模式（architectural pattern）和体系结构风格一样，也对体系结构设计施加一种变换。两者存在不同：",[49,107119,107120,107123,107126],{},[52,107121,107122],{},"体系结构模式设计的范围更窄一些，它更多地关注体系结构的一个方面而不是体系结构的整体",[52,107124,107125],{},"体系结构模式为体系结构定义规则，描述了软件是如何在基础功能层次上处理某些功能性方面的问题",[52,107127,107128],{},"体系结构模式倾向于解决体系结构环境中特定的行为问题。",[13,107130,107131],{},"体系结构模式可以与体系结构风格相结合来更好地确定系统的整体结构。",[10548,107133,107134],{"id":107134},"体系结构风格的简单分类",[49,107136,107137,107146,107156,107174,107184,107194],{},[52,107138,107139,107140],{},"以数据为中心的体系结构。数据存储区位于该体系结构的中心，其他构建频繁访问该存储区并更新，添加或修改存储区中的数据。以数据为中心的体系结构促进了可集成性（integrability）。",[49,107141,107142],{},[52,107143,107144],{},[617,107145],{"alt":119,"src":31862},[52,107147,107148,107149],{},"数据流体系结构。该体系结构应用于输入数据需要经过一系列计算或操作构件以转换为输出数据的情况。",[49,107150,107151],{},[52,107152,107153],{},[617,107154],{"alt":119,"src":107155},"img\u002F9.3.png",[52,107157,107158,107159],{},"调用和返回体系结构。该体系结构可以实现一个相对易于修改和扩展的程序结构。",[49,107160,107161,107171],{},[52,107162,107163,107164],{},"主程序\u002F子程序体系结构。这种经典的程序结构将功能划分为控制层次结构，其中一个“主”程序调用其他程序构件，而这些构件又可以调用其他的构件。\n",[49,107165,107166],{},[52,107167,107168],{},[617,107169],{"alt":119,"src":107170},"img\u002F9.4.png",[52,107172,107173],{},"远程过程调用体系结构。主程序\u002F子程序体系结构中的构件分布在网络中的多台计算机上。",[52,107175,107176,107177],{},"面向对象的体系结构。系统的构件封装了数据和必须用于该数据的操作。构件之间的通信和合作是通过信息传递实现的。",[49,107178,107179],{},[52,107180,107181],{},[617,107182],{"alt":119,"src":107183},"img\u002F9.5.png",[52,107185,107186,107187],{},"层次体系结构。许多不同的层次被定义，每层完成的操作逐渐接近机器指令集。",[49,107188,107189],{},[52,107190,107191],{},[617,107192],{"alt":119,"src":107193},"img\u002F9.6.png",[52,107195,107196,107197],{},"模型-视图-控制器（Model-View-Controller，MVC）体系结构是Web应用开发中经常使用的众多推荐移动基础设施模型之一。模型包含所有应用特定内容和处理逻辑。试图包含所有接口特定功能并能够显示终端用户所需的内容和操作逻辑。控制器管理对模型和视图的访问并协调它们之间的数据流。",[49,107198,107199],{},[52,107200,107201],{},[617,107202],{"alt":119,"src":107203},"img\u002F9.7.png",[7759,107205,107206],{"id":107206},"体系结构考虑要素",[49,107208,107209,107212,107215,107218,107221],{},[52,107210,107211],{},"经济性——好的软件通常是整洁的，依靠抽象来减少不必要的细节。同时，避免由不必要的功能和特征带来的复杂性。",[52,107213,107214],{},"易见性——设计模型创建后，对于那些随后审查该模型的软件工程师而言，体系结构决策和其相应的原因应当是显而易见的。重要的设计和领域概念必须被有效的传达。",[52,107216,107217],{},"隔离性——在设计时分割不同的关注点有时被称为隔离性。适当的隔离性可以使得模块化设计易于实现，然而过分的隔离性将导致碎片化和可用性的损失。",[52,107219,107220],{},"对称性——体系结构对称性是指系统在其属性上是一致且平衡的。对称的设计更易于理解，领悟和沟通。",[52,107222,107223],{},"应急性——紧急的，自组织的行为和控制是创建可扩展，高效且经济的软件体系结构的关键。",[7759,107225,107226],{"id":107226},"评估候选的体系结构设计",[13,107228,107229],{},"设计分析活动是迭代执行的：",[49,107231,107232,107235,107238,107252,107255,107258],{},[52,107233,107234],{},"收集场景",[52,107236,107237],{},"给出需求，约束和环境描述",[52,107239,107240,107241],{},"描述用于解决相应场景和需求体系结构风格和模式。体系结构风格必须使用以下体系结构视图描述：\n",[49,107242,107243,107246,107249],{},[52,107244,107245],{},"模型视图用于分析构件的任务分配和信息隐藏的程度",[52,107247,107248],{},"过程视图用于分析系统性能",[52,107250,107251],{},"数据流视图用于分析体系结构满足功能需求的程度",[52,107253,107254],{},"通过独立考虑各属性来评估质量属性",[52,107256,107257],{},"对于特定的体系结构风格，确定质量属性对各种体系结构属性的敏感度",[52,107259,107260],{},"使用第五步中的敏感度分析对候选体系结构（第三步开始）进行评论",[13,107262,107263],{},"一旦确定体系结构的敏感点，就可以通过识别对多个属性敏感的体系结构元素来寻找权衡点。",[23289,107265],{},[107,107267,107269],{"id":107268},"第十章-构件级设计","第十章 构件级设计",[13,107271,107272],{},"体系结构第一次迭代完成以后，就应该开始构件级设计。在这个阶段，全部数据和软件的程序结构都已经建立起来。其目的是把设计模型转换为可运行软件。但是现有的设计模型的抽象层次相对较高，而可运行程序的抽象层次较低。构件级设计在体系结构设计和编码之间架起桥梁，可以减少在编码阶段引入的错误数量。",[7759,107274,107276],{"id":107275},"重点什么是构件","【重点】什么是构件？",[13,107278,107279],{},"通常来讲，构件是计算机软件中的一个模块化的构造块。系统中模块化的、可部署的和可替换的部件，该部件封装了实现并对外提供一组接口。",[10548,107281,107282],{"id":107282},"面向对象的观点",[13,107284,107285],{},"在面向对象软件工程环境中，一个构件包括一个协作类集合。构件中的每个类都得到详细阐述，以包括所有属性与其实现相关的操作。",[10548,107287,107288],{"id":107288},"传统的观点",[13,107290,107291],{},"在传统软件工程环境中，一个构件就是程序的一个功能要素，程序由处理逻辑、实现处理逻辑所需的内部数据结构以及能够保证构建被调用和实现数据传递的接口构成。",[13,107293,107294],{},"传统构件也称为模块，主要有三种：",[49,107296,107297,107300,107303],{},[52,107298,107299],{},"控制构件，协调问题域中所有其他构件的调用",[52,107301,107302],{},"问题域构件，完成客户需要的全部功能或部分功能",[52,107304,107305],{},"基础设施构件，负责完成问题域中所需的支持处理的功能",[7759,107307,107309],{"id":107308},"重点基本设计原则","【重点】基本设计原则",[10548,107311,107313],{"id":107312},"开闭原则open-closed-principleocp","开闭原则（Open-Closed Principle，OCP）",[13,107315,107316],{},"“模块（构件）应该对外延具有开放性，对修改具有封闭性”",[13,107318,107319],{},"简单地说，设计者应该采用一种无须对构件自身内部做修改就可以进行扩展的方式来说明构件。为了达到这个目的，设计者需要进行抽象，让那些可能需要扩展的功能与设计类本身之间起到缓冲区的作用。",[10548,107321,107323],{"id":107322},"liskov替换原则liskov-substitution-principlelsp","Liskov替换原则（Liskov Substitution Principle，LSP）",[13,107325,107326],{},"“子类可以替换它们的基类”",[13,107328,107329],{},"LSP原则要求源自基类的任何子类必须遵守基类与使用该基类的构件之间的隐含约定。在这里的讨论中，“约定”既是前置条件——构件使用基类前必须为真，又是后置条件——构件使用基类后必须为真。当设计者创建了导出类，这些子类必须遵守前置条件和后置条件。",[10548,107331,107333],{"id":107332},"依赖倒置原则dependency-inversion-principledip","依赖倒置原则（Dependency Inversion Principle，DIP）",[13,107335,107336],{},"“依赖抽象，而非具体实现”",[13,107338,107339],{},"构件依赖的是其他具体构件（不是依赖像接口这样的抽象类）越多，扩展起来就越困难。",[10548,107341,107343],{"id":107342},"接口分离原则interface-segregation-principleisp","接口分离原则（Interface Segregation Principle，ISP）",[13,107345,107346],{},"“多个客户专用接口比一个通用接口好”",[13,107348,107349],{},"ISP原则建议设计者应该为每个主要的客户类型都设计一个专用的接口。",[13,107351,107352],{},"其他的一些打包原则：",[10548,107354,107356],{"id":107355},"发布复用等价性原则reuserelease-equivalency-principerep","发布\u002F复用等价性原则（Reuse\u002FRelease Equivalency Principe，REP）",[13,107358,107359],{},"“复用的粒度就是发布的粒度”",[13,107361,107362],{},"当类或构件被设计为可复用时，在可复用实体的开发者和使用者之间就建立了一种隐含的约定关系。",[10548,107364,107366],{"id":107365},"共同封装原则common-closure-principleccp","共同封装原则（Common Closure Principle，CCP）",[13,107368,107369],{},"“一同变更的类应该合在一起”",[13,107371,107372],{},"类应该根据其内聚性进行打包。也就是说，当类被打包成设计的一部分时，他们应该处理相同的功能或者行为域。",[10548,107374,107376],{"id":107375},"共同复用原则common-reuse-principlecrp","共同复用原则（Common Reuse Principle，CRP）",[13,107378,107379],{},"“不能一起复用的类不能被分到一组”",[13,107381,107382],{},"只有那些一起被复用的类才应该包含在一个包中。",[7759,107384,107385],{"id":107385},"构件级设计指导方针",[49,107387,107388,107391,107394],{},[52,107389,107390],{},"构件。对那些已经被确定为体系结构模型一部分的构件应该建立命名约定，并对其做进一步的精细化处理，使其称为构件级模型的一部分。",[52,107392,107393],{},"接口。接口提供关于通信和协作的重要信息。",[52,107395,107396],{},"依赖和继承。为了提高可读性，依赖关系自左向右，继承关系自底（导出类）向上（基类）。",[7759,107398,107400],{"id":107399},"重点内聚性","【重点】内聚性",[13,107402,107403],{},"内聚性描述为构件的“专一性”。意味着构建或者类只封装那些相互关联密切，以及构件或类自身有密切关系的属性和操作。",[49,107405,107406,107409,107412],{},[52,107407,107408],{},"功能内聚。主要通过操作来体现。当一个模块完成一组且只有一组操作并返回结果时，就称此模块是功能内聚的。",[52,107410,107411],{},"分层内聚。由包、构件和类来体现。高层能够访问底层的服务，但底层不能访问高层的服务。",[52,107413,107414],{},"通信内聚。访问相同数据的所有操作被定义在一个类中。一般来说，这些类只着眼于数据的查询、访问和存储。",[7759,107416,107418],{"id":107417},"重点耦合","【重点】耦合",[13,107420,107421],{},"耦合是类之间彼此联系程度的一种定性度量。随着类（构件）之间的依赖越来越多，类之间的耦合程度亦会增加。在构件级设计中，一个重要的目标就是尽可能地保持低耦合。",[49,107423,107424,107427,107430],{},[52,107425,107426],{},"内容耦合发生在当一个控件“暗中修改其他控件的内部数据”时。这违反了基本设计概念中的信息隐蔽原则。",[52,107428,107429],{},"控制耦合发生在当操作A调用操作B，并且向B传递了一个控制标记时。接着，控制标记将会指引B中的逻辑流程。这种耦合形式的主要问题在于，B中的一个不相关变更往往能导致A所传递控制标记的意义也必须发生变更。如果忽略这个问题，就会引起错误。",[52,107431,107432],{},"外部耦合发生在当一个构件和基础设施构件进行通信或协作时。尽管这种类型的耦合是必要的，但是在一个系统中应该尽量将这种耦合限制在少量的构件或者类范围内。",[13,107434,107435],{},"耦合是必然存在的。然而，设计者应该尽可能降低耦合，并且在不可避免出现高耦合的情况下，要充分理解高耦合的后果。",[7759,107437,107438],{"id":107438},"实施构件级设计",[13,107440,107441],{},"典型的任务集：",[10548,107443,107445],{"id":107444},"步骤1标识出所有与问题域相对应的设计类","步骤1：标识出所有与问题域相对应的设计类",[10548,107447,107449],{"id":107448},"步骤2确定所有与基础设施域相对应的设计类","步骤2：确定所有与基础设施域相对应的设计类",[10548,107451,107453],{"id":107452},"步骤3细化所有未作为可复用构件获取的设计类","步骤3：细化所有未作为可复用构件获取的设计类",[13,107455,107456],{},"a：在类或构件协作时说明消息的细节",[13,107458,107459],{},"b：为每个构件确定适当的接口",[13,107461,107462],{},"c：细化属性，并且定义实现属性所需要的数据类型和数据结构",[13,107464,107465],{},"d：详细描述每个操作中的数据流",[10548,107467,107469],{"id":107468},"步骤4描述持久数据源数据库和文件并确定管理数据源所需要的类","步骤4：描述持久数据源（数据库和文件）并确定管理数据源所需要的类",[10548,107471,107473],{"id":107472},"步骤5开发并且细化类或构件的行为表示","步骤5：开发并且细化类或构件的行为表示",[10548,107475,107477],{"id":107476},"步骤6细化部署图以提供额外的实现细节","步骤6：细化部署图以提供额外的实现细节",[10548,107479,107481],{"id":107480},"步骤7重构每个构件级设计表示并且总是考虑其他可选方案","步骤7：重构每个构件级设计表示，并且总是考虑其他可选方案",[7759,107483,107484],{"id":107484},"基于构件的开发",[8366,107486,107487,107496],{},[8369,107488,107489],{},[8372,107490,107491,107493],{},[8375,107492,98366],{},[8375,107494,107495],{},"风险",[8386,107497,107498,107506,107514,107522,107530],{},[8372,107499,107500,107503],{},[8391,107501,107502],{},"缩短交付周期：用现成的构件库构建完整的应用要快得多",[8391,107504,107505],{},"构件选择的风险：对于黑盒构件，开发者很难预测构件的行为，或者开发者可能会将需求映射到错误的构件",[8372,107507,107508,107511],{},[8391,107509,107510],{},"更好的投资回报率（ROI）：购买现成的构件而不是重新开发相同功能的构件有时会节省资源",[8391,107512,107513],{},"构件集成的风险：构件之间缺乏互操作性标准，这就经常需要开发者为构件编写“包装代码”以提供适合的接口",[8372,107515,107516,107519],{},[8391,107517,107518],{},"分摊开发构件的成本：在不同的应用中复用构件可以让多个项目分摊开发成本",[8391,107520,107521],{},"质量风险：未知的设计假设使得部分构件更难测试，这会影响系统的安全性、性能以及可靠性",[8372,107523,107524,107527],{},[8391,107525,107526],{},"提高软件质量：构件在不同的应用中被测试且复用",[8391,107528,107529],{},"安全风险：以非预期的方式使用系统，以及以未经测试的组合方式集成构件而造成系统脆弱",[8372,107531,107532,107535],{},[8391,107533,107534],{},"基于构件的应用有较好的可维护性：经过精心的工程实践，使用新的或者增强过的构件替换废弃构件是相对容易的。",[8391,107536,107537],{},"系统演进风险：更新之后的构件可能和用户的需求不兼容或者包含其他未文档化的特性",[23289,107539],{},[107,107541,107543],{"id":107542},"第十一章-用户体验设计","第十一章 用户体验设计",[13,107545,107546],{},"用户体验设计是一组渐进的过程，可帮助开发团队和项目利益相关者专注于为软件产品的用户提供良好的体验。UX设计比用户界面设计和可用性或可访问性工程要广泛。若要使其有效，则它必须在项目生命周期的早期开始。等到项目结束时才添加用户界面功能的开发人员不太可能为用户提供良好的体验。",[7759,107548,107549],{"id":107549},"用户体验设计元素",[13,107551,107552],{},[617,107553],{"alt":119,"src":32278},[49,107555,107556,107559,107562,107565,107568],{},[52,107557,107558],{},"策略：确认所有构成用户体验设计基础工作的用户需求和客户业务目标",[52,107560,107561],{},"范围：包括实现与项目策略一致的一系列特性所需的功能和内容要求",[52,107563,107564],{},"结构：包括交互设计和信息体系结构",[52,107566,107567],{},"框架：由三部分组成。信息设计、界面设计、导航设计",[52,107569,107570],{},"界面：向用户呈现视觉设计或已完成项目的",[7759,107572,107573],{"id":107573},"黄金规则",[10548,107575,107577],{"id":107576},"_1把控制权交给用户","1、把控制权交给用户",[49,107579,107580,107583,107586,107589,107592,107595],{},[52,107581,107582],{},"以不强迫用户进入不必要的或不希望的动作方式来定义交互模式",[52,107584,107585],{},"提供灵活的交互",[52,107587,107588],{},"允许用户交互被中断和撤销",[52,107590,107591],{},"当技能水平高时可以使交互流线化并允许定制交互",[52,107593,107594],{},"使用户与内部技术细节隔离开来",[52,107596,107597],{},"设计应允许用户与出现在屏幕上的对象直接交互",[10548,107599,107601],{"id":107600},"_2减轻用户的记忆负担","2、减轻用户的记忆负担",[49,107603,107604,107607,107610,107613,107616],{},[52,107605,107606],{},"减少对短期记忆的要求",[52,107608,107609],{},"建立有意义的默认设置",[52,107611,107612],{},"定义直观的快捷方式",[52,107614,107615],{},"界面的视觉布局应该基于真实世界的象征",[52,107617,107618],{},"以一种渐进的方式揭示信息",[10548,107620,107622],{"id":107621},"_3保持界面一致","3、保持界面一致",[49,107624,107625,107628,107631],{},[52,107626,107627],{},"允许用户将当前任务放入有意义的环境中",[52,107629,107630],{},"在完整的产品线内保持一致",[52,107632,107633],{},"如果过去的交互模型已经建立起了用户期望，除非有不得已的理由，否则不要改变它",[10548,107635,107636],{"id":107636},"过程",[13,107638,107639],{},"用户界面的分析和设计过程是迭代的，开始于螺旋模型的内部，且包括四个不同的框架活动。",[13,107641,107642],{},[617,107643],{"alt":119,"src":32374},[49,107645,107646,107649,107652,107655],{},[52,107647,107648],{},"界面分析活动的重点在于那些与系统交互的用户的轮廓",[52,107650,107651],{},"界面设计的目标是定义一组界面对象和动作，使用户能够以满足系统所定义的每个使用目标的方式完成所有的定义的任务",[52,107653,107654],{},"界面构建通常开始于创建可评估使用场景的原型",[52,107656,107657,107658],{},"界面确认着重于：\n",[49,107659,107660,107663,107666],{},[52,107661,107662],{},"界面正确的实现每个用户定义的任务，以及达到所有一般用户需求的能力",[52,107664,107665],{},"界面容易使用和学习的程度",[52,107667,107668],{},"作为工作中的得力工具，用户对界面的接受程度",[7759,107670,107671],{"id":107671},"用户体验分析",[13,107673,107674],{},"软件工程过程模型的一个重要原则是：在试图设计一个解决方案之前，最好对问题有所理解。",[13,107676,107677],{},"在用户体验的设计中，理解问题就意味着了解：",[49,107679,107680,107683,107686,107689],{},[52,107681,107682],{},"通过界面和系统交互的人（最终用户）",[52,107684,107685],{},"最终用户为完成工作要执行的任务",[52,107687,107688],{},"作为界面的一部分而显示的内容",[52,107690,107691],{},"任务处理的环境",[7759,107693,107694],{"id":107694},"用户体验设计",[13,107696,107697],{},[617,107698],{"alt":119,"src":107699},"img\u002F11.3.png",[49,107701,107702,107705,107708,107711,107714],{},[52,107703,107704],{},"理解。围绕用户研究进行，在该活动中，团队收集有关软件产品要解决的问题的信息。",[52,107706,107707],{},"草图。为各个团队成员（包括利益相关者）提供了讨论并解决在理解阶段发现的问腿所需的空间和时间。",[52,107709,107710],{},"决策。每个利益相关者展示其解决方案草图，然后团队投票决定在随后的原型设计活动中有用的解决方案。",[52,107712,107713],{},"原型。在这一阶段创建的原型可能使基于草图阶段选择方案的最小可行产品，又或是基于希望在验证阶段与潜在用户一起评估的客户旅程图或情节故事的一部分。",[52,107715,107716],{},"验证。观察用户试用设计模型是发现其UX设计中主要问题的最佳方法，这可以让你立刻开始迭代设计。",[23289,107718],{},[107,107720,107722],{"id":107721},"常见的九种uml图","常见的九种UML图",[13,107724,107725,107726,28447],{},"（以下内容引用自",[5009,107727,107730],{"href":107728,"rel":107729},"https:\u002F\u002Fwww.lifengdi.com\u002Farchives\u002Farticle\u002F352",[23647],"九种常用的UML图总结 - 李锋镝的博客",[13,107732,107733,107734,107737,107738,107741,107742,107745],{},"UML（Unified Modeling Language）",[22,107735,107736],{},"统一建模语言","，又称",[22,107739,107740],{},"标准建模语言","。是用来对软件密集系统进行可视化",[22,107743,107744],{},"建模","的一种语言。UML的定义包括UML语义和UML表示法两个元素。",[13,107747,107748,107749,107752,107753,107756],{},"UML是在开发阶段，说明、可视化、构建和书写一个",[22,107750,107751],{},"面向对象","软件密集系统的制品的开放方法。最佳的应用是工程实践，对大规模，复杂系统进行建模方面，特别是在",[22,107754,107755],{},"软件架构","层次，已经被验证有效。统一建模语言（UML）是一种模型化语言。模型大多以图表的方式表现出来。一份典型的建模图表通常包含几个块或框，连接线和作为模型附加信息之用的文本。这些虽简单却非常重要，在UML规则中相互联系和扩展。",[13,107758,107759],{},[22,107760,107761],{},"UML图的作用：",[13,107763,107764],{},"UML的目标是以面向对象图的方式来描述任何类型的系统，具有很宽的应用领域。其中最常用的是建立软件系统的模型，但它同样可以用于描述非软件领域的系统，如机械系统、企业机构或业务过程，以及处理复杂数据的信息系统、具有实时要求的工业系统或工业过程等。总之，UML是一个通用的标准建模语言，可以对任何具有静态结构和动态行为的系统进行建模，而且适用于系统开发的不同阶段，从需求规格描述直至系统完成后的测试和维护。",[13,107766,107767],{},[22,107768,107769],{},"特点：",[13,107771,107772],{},"（1）UML统一了各种方法对不同类型的系统、不同开发阶段以及不同内部概念的不同观点，从而有效的消除了各种建模语言之间不必要的差异。它实际上是一种通用的建模语言，可以为许多面向对象建模方法的用户广泛使用。",[13,107774,107775],{},"（2）UML建模能力比其它面向对象建模方法更强。它不仅适合于一般系统的开发，而且对并行、分布式系统的建模尤为适宜。",[13,107777,107778],{},"（3）UML是一种建模语言，而不是一个开发过程。",[23090,107780,107782],{"id":107781},"下面是九种常用的uml图","下面是九种常用的UML图：",[13,107784,107785],{},[617,107786],{"alt":617,"src":32454},[23090,107788,107790],{"id":107789},"_1用例图usecase-diagrams","1.用例图（UseCase Diagrams）",[13,107792,107793],{},"用例图是从用户（角色）的角度出发，描述角色和用例之间的关系。即：谁要使用系统，一级他们使用系统可以做什么。简单来说就是：谁，可以用此系统做什么。",[13,107795,107796],{},[617,107797],{"alt":617,"src":107798},"img\u002F12.2.jpg",[23090,107800,107802],{"id":107801},"_2类图class-diagram","2.类图（Class Diagram）",[13,107804,107805],{},"类图是描述系统中的类，以及各个类之间的关系的静态视图。是面向对象系统建模中最常用和最重要的图，是定义其他图的基础。",[13,107807,107808],{},"在UML类图中，常见的有以下几种关系: 泛化（Generalization）, 实现（Realization），关联（Association），聚合（Aggregation），组合（Composition），依赖（Dependency）。",[13,107810,107811],{},"各种关系的强弱顺序： 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖",[13,107813,107814],{},"　　2.1.泛化（Generalization）",[13,107816,107817],{},"　　　　泛化是一种继承关系，表示一般与特殊的关系，它指定了子类如何继承父类的所有特征和行为。",[13,107819,107820,107821],{},"　　　　",[617,107822],{"alt":617,"src":107823},"img\u002F12.4.jpg",[13,107825,107826],{},"　　2.2.实现（Realization）",[13,107828,107829],{},"　　　　实现是一种类与接口的关系，表示类是接口所有特征和行为的实现。",[13,107831,107832,107833],{},"　　　　　　",[617,107834],{"alt":617,"src":107835},"img\u002F12.5.jpg",[13,107837,107838],{},"　　2.3.关联（Association）",[13,107840,107841],{},"　　　　关联是一种拥有的关系，它使一个类知道另一个类的属性和方法；关联可以是双向的，也可以是单向的。双向的关联可以有两个箭头或者没有箭头，单向的关联有一个箭头。",[13,107843,107832,107844],{},[617,107845],{"alt":617,"src":107846},"img\u002F12.3.jpg",[13,107848,107849],{},"　　2.4.聚合（Aggregation）",[13,107851,107852],{},"　　　　聚合是整体与部分的关系，且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系，轮胎离开车仍然可以存在。",[13,107854,107855],{},"​    　　聚合关系是关联关系的一种，是强的关联关系；关联和聚合在语法上无法区分，必须考察具体的逻辑关系。",[13,107857,107858,107859],{},"　　　　 ",[617,107860],{"alt":617,"src":107861},"img\u002F12.6.jpg",[13,107863,107864],{},"　　2.5.组合（Composition）",[13,107866,107867],{},"　　　　组合是整体与部分的关系，但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系，没有公司就不存在部门。",[13,107869,107870],{},"​    　组合关系是关联关系的一种，是比聚合关系还要强的关系，它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。",[13,107872,107832,107873],{},[617,107874],{"alt":617,"src":107875},"img\u002F12.7.jpg",[13,107877,107878],{},"　　2.6.依赖（Dependency）",[13,107880,107881],{},"　　依赖是一种使用的关系，即一个类的实现需要另一个类的协助，所以要尽量不使用双向的互相依赖.",[13,107883,107820,107884],{},[617,107885],{"alt":617,"src":107886},"img\u002F12.8.jpg",[23090,107888,107890],{"id":107889},"_3对象图object-diagrams","3.对象图（Object Diagrams）",[13,107892,107893],{},"对象图和类图一样反映系统的静态过程，但它是从实际的或原型化的情景来表达的。对象图显示某时刻对象和对象之间的关系。一个UML对象图可看成一个类图的特殊用例，实例和类可在其中显示。",[13,107895,107896],{},[617,107897],{"alt":617,"src":107898},"img\u002F12.9.jpg",[23090,107900,107902],{"id":107901},"_4状态图statechart-diagrams","4.状态图（Statechart Diagrams）",[13,107904,107905],{},"状态图描述类的对象所有可能的状态，以及事件发生时状态的转移条件。他们可以告知一个对象可以拥有的状态，并且事件会怎么随着时间的推移来影响这些状态。",[13,107907,107908],{},"状态图是对类图的补充。",[13,107910,107911],{},[617,107912],{"alt":617,"src":107913},"img\u002F12.10.jpg",[23090,107915,107917],{"id":107916},"_5活动图activity-diagrams","5.活动图（Activity Diagrams）",[13,107919,107920],{},"活动图描述用例要求所要进行的活动，以及活动间的约束关系，有利于识别并行活动。能够演示出系统中哪些地方存在功能，以及这些功能和系统中其他组件的功能如何共同满足前面使用用例图的业务需求。",[13,107922,107923],{},"活动图是状态图的一种特殊情况，这些状态大都处于活动状态。本质是一种流程图，它描述了活动到活动的控制流。",[13,107925,107926],{},[617,107927],{"alt":617,"src":107928},"img\u002F12.11.jpg",[23090,107930,107932],{"id":107931},"_6序列图-时序图sequence-diagrams","6.序列图-时序图（Sequence Diagrams）",[13,107934,107935],{},"序列图是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型。顺序图可以用来展示对象之间是如何进行交互的。序列图将显示的重点放在消息序列上，即强调消息是如何在对象之间被发送和接收的。",[13,107937,107938],{},"序列图展示的是多个系统或者对象之间的交互的顺序，强调时间顺序。",[13,107940,107941],{},[617,107942],{"alt":617,"src":107943},"img\u002F12.12.jpeg",[23090,107945,107947],{"id":107946},"_7协作图collaboration-diagrams","7.协作图（Collaboration Diagrams）",[13,107949,107950],{},"协作图和序列图相似，显示对象间的动态合作关系。可以看成是类图和顺序图的交集，协作图建模对象或者角色，以及它们彼此之间是如何通信的。",[13,107952,107953],{},[617,107954],{"alt":617,"src":107955},"img\u002F12.13.png",[23090,107957,107959],{"id":107958},"_8构件图component-diagrams","8.构件图（Component Diagrams）",[13,107961,107962],{},"构件图是用来表示系统中构件与构件之间，类或接口与构件之间的关系图。其中，构建图之间的关系表现为依赖关系，定义的类或接口与类之间的关系表现为依赖关系或实现关系。",[13,107964,107965],{},"构件图也叫组件图，由组件、接口和组件之间联系构成，描述的是在软件系统中遵从并实现一组接口的物理的、可替换的软件模块。",[13,107967,107968],{},"组件图 = 构件（Component）+接口（Interface）+关系（Relationship）+端口（Port）+连接器（Connector）",[13,107970,107971],{},[617,107972],{"alt":617,"src":107973},"img\u002F12.14.jpg",[23090,107975,107977],{"id":107976},"_9部署图deployment-diagrams","9.部署图（Deployment Diagrams）",[13,107979,107980],{},"部署图又叫配置图，是用来建模系统的物理部署。",[13,107982,107983],{},"部署图由节点以及节点之间的关系组成。",[13,107985,107986],{},"部署图描述的是系统运行时的结构，展示了硬件的配置及其软件如何部署到网络结构中。",[13,107988,107989],{},"部署图通常用来帮助理解分布式系统，一个系统模型只有一个部署图。",[13,107991,107992],{},"部署图用于可视化的软件组件部署的系统中的物理组件的拓扑结构。",[13,107994,107995],{},[617,107996],{"alt":617,"src":107997},"img\u002F12.15.jpg",{"title":119,"searchDepth":144,"depth":144,"links":107999},[108000,108006,108009,108010,108020,108024,108030,108037,108043,108049,108058,108064],{"id":105352,"depth":132,"text":105352,"children":108001},[108002,108003,108004,108005],{"id":105355,"depth":144,"text":105356},{"id":105379,"depth":144,"text":105379},{"id":105408,"depth":144,"text":105408},{"id":105443,"depth":144,"text":105443},{"id":105491,"depth":132,"text":105492,"children":108007},[108008],{"id":105537,"depth":144,"text":105538},{"id":105711,"depth":132,"text":105712},{"id":105927,"depth":132,"text":105928,"children":108011},[108012,108013,108014,108015,108016,108017,108018,108019],{"id":105934,"depth":144,"text":105934},{"id":105958,"depth":144,"text":105958},{"id":106046,"depth":144,"text":106046},{"id":106090,"depth":144,"text":106090},{"id":106109,"depth":144,"text":106109},{"id":106161,"depth":144,"text":106161},{"id":106206,"depth":144,"text":106206},{"id":106247,"depth":144,"text":106247},{"id":106256,"depth":132,"text":106257,"children":108021},[108022,108023],{"id":106260,"depth":144,"text":106260},{"id":106292,"depth":144,"text":106292},{"id":106300,"depth":132,"text":106301,"children":108025},[108026,108027,108028,108029],{"id":106307,"depth":144,"text":106307},{"id":106368,"depth":144,"text":106368},{"id":106374,"depth":144,"text":106374},{"id":106397,"depth":144,"text":106397},{"id":106440,"depth":132,"text":106441,"children":108031},[108032,108033,108034,108035,108036],{"id":106444,"depth":144,"text":106445},{"id":106488,"depth":144,"text":106488},{"id":106520,"depth":144,"text":106520},{"id":106586,"depth":144,"text":106586},{"id":106621,"depth":144,"text":106621},{"id":106674,"depth":132,"text":106675,"children":108038},[108039,108040,108041,108042],{"id":106704,"depth":144,"text":106704},{"id":106731,"depth":144,"text":106731},{"id":106790,"depth":144,"text":106790},{"id":106928,"depth":144,"text":106928},{"id":107047,"depth":132,"text":107048,"children":108044},[108045,108046,108047,108048],{"id":62674,"depth":144,"text":62674},{"id":107094,"depth":144,"text":107094},{"id":107206,"depth":144,"text":107206},{"id":107226,"depth":144,"text":107226},{"id":107268,"depth":132,"text":107269,"children":108050},[108051,108052,108053,108054,108055,108056,108057],{"id":107275,"depth":144,"text":107276},{"id":107308,"depth":144,"text":107309},{"id":107385,"depth":144,"text":107385},{"id":107399,"depth":144,"text":107400},{"id":107417,"depth":144,"text":107418},{"id":107438,"depth":144,"text":107438},{"id":107484,"depth":144,"text":107484},{"id":107542,"depth":132,"text":107543,"children":108059},[108060,108061,108062,108063],{"id":107549,"depth":144,"text":107549},{"id":107573,"depth":144,"text":107573},{"id":107671,"depth":144,"text":107671},{"id":107694,"depth":144,"text":107694},{"id":107721,"depth":132,"text":107722,"children":108065},[108066,108067,108068,108069,108070,108071,108072,108073,108074,108075],{"id":107781,"depth":138,"text":107782},{"id":107789,"depth":138,"text":107790},{"id":107801,"depth":138,"text":107802},{"id":107889,"depth":138,"text":107890},{"id":107901,"depth":138,"text":107902},{"id":107916,"depth":138,"text":107917},{"id":107931,"depth":138,"text":107932},{"id":107946,"depth":138,"text":107947},{"id":107958,"depth":138,"text":107959},{"id":107976,"depth":138,"text":107977},{},"我的大学\u002F大三上学期\u002F软件工程\u002F软件工程备考.md","\u002Fundergraduate\u002Fnote-efa1fce97998",{"title":105330,"description":119},"undergraduate\u002Fnote-efa1fce97998",[246,6380,14542,23333],"pMG51FDhv986Yx8NlMGyVPMW7LMsmY6BLsxsi0MSZSc",{"id":108084,"title":108085,"assetBase":239,"author":8,"body":108086,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":109254,"navigation":128,"originalPath":109255,"path":109256,"seo":109257,"source":23330,"stem":109258,"tags":109259,"weight":250,"__hash__":109260},"content\u002Fundergraduate\u002Fnote-f29c8eaf98be.md","数据仓库与数据挖掘（下）",{"type":10,"value":108087,"toc":109224},[108088,108091,108095,108102,108106,108108,108111,108117,108123,108137,108141,108145,108149,108152,108156,108160,108163,108168,108172,108176,108180,108184,108188,108192,108194,108197,108204,108208,108238,108241,108244,108248,108251,108275,108279,108282,108300,108304,108307,108310,108315,108318,108320,108324,108328,108331,108337,108341,108345,108348,108354,108358,108361,108367,108373,108377,108383,108386,108390,108394,108400,108405,108409,108414,108418,108425,108433,108437,108445,108450,108454,108480,108484,108491,108495,108498,108502,108530,108533,108537,108540,108543,108545,108549,108553,108555,108561,108571,108576,108583,108586,108590,108593,108601,108604,108608,108612,108615,108618,108630,108634,108638,108652,108656,108669,108673,108684,108696,108699,108703,108706,108709,108712,108715,108718,108721,108724,108727,108730,108734,108744,108747,108750,108753,108756,108759,108763,108770,108774,108780,108783,108786,108788,108791,108794,108797,108800,108803,108806,108809,108812,108815,108817,108821,108825,108827,108832,108836,108872,108876,108879,108893,108898,108905,108910,108917,108922,108929,108934,108941,108946,108953,108958,108965,108969,108973,108987,108991,108994,108998,109019,109023,109037,109041,109055,109061,109081,109084,109088,109090,109092,109100,109103,109106,109114,109118,109122,109129,109136,109140,109143,109147,109151,109155,109159,109162,109166,109169,109186,109190,109201,109205,109216,109218,109221],[4517,108089,108085],{"id":108090},"数据仓库与数据挖掘下",[107,108092,108094],{"id":108093},"第五章-数据挖掘基础","第五章 数据挖掘基础",[13,108096,108097,108098,108101],{},"数据挖掘又称为数据库中的知识发现(knowledge discovery in database，KDD)，它是一个",[22,108099,108100],{},"利用人工智能，机器学习和统计学等多学科理论分析大量的数据，进行归纳性推理，从事务数据库、文本数据库、空间数据库、多媒体数据库、数据仓库以及其他数据文件中提取正确的、新颖的、有效的以及人们感兴趣的知识的高级处理过程","。数据挖掘的任务是从大量的数据中发现对决策有用的知识，发现数据特性以及数据之间的关系,这些知识表现为概念、规则、模式和规律等多种形式。",[7759,108103,108105],{"id":108104},"_1数据挖掘基础","1、数据挖掘基础",[10548,108107,62489],{"id":62488},[13,108109,108110],{},"数据挖掘不是验证某个假设的正确性，而是在数据中寻找未知模式，本质上是一个归纳学习的过程。数据挖掘是一门涉及面很广的交叉学科，融合了模式识别、数据库、统计学、机器学习、粗糙集、模糊数学和神经网络等多个领域的理论。数据挖掘有一些替代词，如数据库中的知识发现、知识提炼、模式识别、数据考古、数据捕捞和信息获取等。由于“数据挖掘”能表现“挖掘”的本质，因此在学术界和企业界被广泛应用。",[13,108112,108113,108114],{},"概括而言，",[22,108115,108116],{},"数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取正确的、有用的、未知的、综合的以及用户感兴趣的知识并用于决策支持的过程。",[13,108118,108119,108120],{},"该课程中的定义：",[22,108121,108122],{},"数据挖掘就是从大量的、不完全的、有噪声的、模糊的随机的过程中，提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。这些信息的表现形式为：规则、概念、规律及模式。",[49,108124,108125,108128,108131,108134],{},[52,108126,108127],{},"数据源必须是真实的、海量的、含燥声的。",[52,108129,108130],{},"发现的是用户感兴趣、新颖的知识。",[52,108132,108133],{},"发现的知识应该可接受、可理解、可运用、有价值。",[52,108135,108136],{},"知识的形式可以是概念、规则、模式、规律等形式。",[10548,108138,108140],{"id":108139},"_2演变过程","（2）演变过程",[13,108142,108143],{},[617,108144],{"alt":119,"src":66141},[10548,108146,108148],{"id":108147},"_3数据挖掘的过程","（3）数据挖掘的过程",[13,108150,108151],{},"数据挖掘的过程由以下步骤组成：定义业务问题，提取与预处理数据，选择挖掘方法分析，解释挖掘结果，探查新模式以及运用发现的知识。",[13,108153,108154],{},[617,108155],{"alt":119,"src":71739},[10548,108157,108159],{"id":108158},"_4数据可视化","（4）数据可视化",[13,108161,108162],{},"数据可视化是指通过图表的形式,对处理后的数据进行分析，揭示其中蕴含的业务问题、规律，把数据转化为有用的信息，辅助决策。",[72,108164,108165],{},[13,108166,108167],{},"下面是几个我觉得比较常用的可视化图表",[13,108169,108170],{},[617,108171],{"alt":119,"src":71744},[13,108173,108174],{},[617,108175],{"alt":119,"src":71755},[13,108177,108178],{},[617,108179],{"alt":119,"src":71760},[13,108181,108182],{},[617,108183],{"alt":119,"src":71771},[13,108185,108186],{},[617,108187],{"alt":119,"src":71776},[13,108189,108190],{},[617,108191],{"alt":119,"src":71790},[7759,108193,29537],{"id":29536},[13,108195,108196],{},"数据提取包括理解业务问题、搜集并分析数据源、确定数据的相关性以及使用工具提取数据等。",[13,108198,108199,108200,108203],{},"数据预处理是数据挖掘过程的基础工作，一般占整个数据挖掘过程70%的工作量。数据预处理技术用于",[22,108201,108202],{},"数据清洗、数据集成、数据变换和数据归约等","。数据清洗是指删除噪声和不一致的数据。数据集成是把多个数据源的数据合并存储，如数据仓库。数据变换通过规范化的方法改善数据挖掘算法的精度和有效性。数据归约通过删除冗余属性，使用聚集或聚类方法压缩数据。",[10548,108205,108207],{"id":108206},"_1数据清洗","（1）数据清洗",[49,108209,108210],{},[52,108211,108212,108213],{},"常用的数据清洗方法\n",[49,108214,108215,108218],{},[52,108216,108217],{},"聚类",[52,108219,108220,108221],{},"空值处理\n",[49,108222,108223,108226,108229,108232,108235],{},[52,108224,108225],{},"忽略包含空值的记录或属性",[52,108227,108228],{},"使用一个常数填充遗漏值，把一楼的属性值用一个常数替换",[52,108230,108231],{},"使用数值型属性的平均值或给定记录属同一类（近邻）的所有样本的平均值填充空值【在特殊规则时不适用】",[52,108233,108234],{},"把空值属性看作决策属性，使用已知属性的值预测未知属性",[52,108236,108237],{},"使用最可能的值填充空值（采用机器学习等方法）",[10548,108239,108240],{"id":61953},"（2）数据集成",[13,108242,108243],{},"数据集成把来自多个数据库或者平面文件等不同数据源的数据整合成一致的数据存储。数据集成时，需要考虑实体识别问题。例如，在一个数据库中用学号(student_No)作为学生的标识，而在另一个数据库中学号可能被命名为(S_ID)。通常使用元数据来避免数据集成中出现的错误。",[10548,108245,108247],{"id":108246},"_3数据变换","（3）数据变换",[13,108249,108250],{},"数据变换把数据转化成适于挖掘的形式。通过对某些属性按比例进行缩放，使属性取值落在较小的区间。",[49,108252,108253,108261,108269,108272],{},[52,108254,108255,108256],{},"平滑：平滑可以有效的去掉噪声，常用的方法有分箱（binning）、聚类和回归分析。",[49,108257,108258],{},[52,108259,108260],{},"分箱是通过分析邻近的值平滑存储数据的值，可处理连续型和分类型变量，得到更少的变量取值种类，以便于分析。数据被分布到箱中，分箱的方法是进行局部的平滑，也可以作为一种离散化技术使用。",[52,108262,108263,108264],{},"聚集：对数据进行汇总。",[49,108265,108266],{},[52,108267,108268],{},"聚集产生较小的数据集,使得分析的数据更稳定,但也应注意可能会丢失有趣的细节。",[52,108270,108271],{},"数据泛化：把任务相关的数据集从较低的概念层抽象到较高的概念层。",[52,108273,108274],{},"标准化(standardization)或规范化( normalization)：如果描述样本或记录的变量单位不统一，数值差别比较大，那么就需要通过把数据归一化，指数化或标准化，把不同的属性进行比例缩放，使它们的值落在大致相同的范围内。这在聚类分析,神经网络等数据挖掘算法的数据预处理中经常用到。",[10548,108276,108278],{"id":108277},"_4数据归约","（4）数据归约",[13,108280,108281],{},"数据挖掘时一般需要对数据集进行归约处理。对归约的数据集进行数据挖掘与原数据应该有相同或差不多的效果,但效率更高。",[49,108283,108284,108292],{},[52,108285,108286,108287],{},"数据立方体聚集：数据立方体聚集的基础是概念的分层，用于处理数据立方体中的数据。\n",[49,108288,108289],{},[52,108290,108291],{},"数据立方体聚集为在线分析处理的上钻等操作提供了可以快速访问的汇总数据。",[52,108293,108294,108295],{},"维归约：维归约可以剔除相关性较弱或者冗余的属性。\n",[49,108296,108297],{},[52,108298,108299],{},"维归约就是从决策分析相关的属性集中选择重要的属性(特征)子集，这需要启发式的算法解决，常用的方法有决策树，粗糙集(rough set)和遗传算法(genetic algorithm)等。",[7759,108301,108303],{"id":108302},"_3数据仓库和数据挖掘的关系","3、数据仓库和数据挖掘的关系",[13,108305,108306],{},"从数据仓库中挖掘出对决策有用的信息和知识，是建立数据仓库最大的目的。而如何从数据仓库中挖掘出有用的数据，则是数据挖掘的研究重点，二者的本质和过程是有区别的。",[13,108308,108309],{},"数据仓库是数据挖掘的一种数据源，数据挖掘是数据仓库的一个应用。",[72,108311,108312],{},[13,108313,108314],{},"内容来自New Bing",[13,108316,108317],{},"数据仓库是为了数据挖掘做预准备，数据挖掘可建立在数据仓库之上，而且两者最终目的都为了提升企业的信息化竞争能力。数据仓库为数据挖掘提供了更好的、更广泛的数据源，为数据挖掘提供了新的支持平台，为更好地使用数据挖掘这个工具提供了方便。",[23289,108319],{},[107,108321,108323],{"id":108322},"第六章-关联挖掘","第六章 关联挖掘",[7759,108325,108327],{"id":108326},"_1关联规则的概念","1、关联规则的概念",[13,108329,108330],{},"人们通过发现关联规则，可以从一件事情的发生，来推测另外一件事情的发生，从而更好地了解和掌握事物的发展规律等等，这就是寻找关联规则的基本意义。",[13,108332,108333,108334,67],{},"关联规则就是有关联的规则，形式是这样定义的：",[22,108335,108336],{},"两个不相交的非空集合X、Y，如果有X-->Y，就说X-->Y是一条关联规则",[7759,108338,108340],{"id":108339},"_2关联规则的定义","2、关联规则的定义",[13,108342,108343],{},[617,108344],{"alt":119,"src":31273},[13,108346,108347],{},"项目的集合I被称为项目集合(Itemset)，简称项集。",[13,108349,108350,108351,67],{},"项集中元素的个数称为项集的长度。长度为k的项集被称为",[22,108352,108353],{},"k-项集(k-Itemset)",[13,108355,108356],{},[617,108357],{"alt":119,"src":31282},[13,108359,108360],{},"每一个交易有一个唯一的标识—交易号，记作TID。",[13,108362,108363,108364,67],{},"交易的全体被称为交易数据集或事务数据集，记作D，简称",[22,108365,108366],{},"交易集",[13,108368,108369,108372],{},[22,108370,108371],{},"规则的支持度","：支持度描述了A和B这两个物品集在所有的事务中同时出现的次数或者出现的概率有多大。",[13,108374,108375],{},[617,108376],{"alt":119,"src":31302},[13,108378,108379,108382],{},[22,108380,108381],{},"规则的可信度","：可信度就是指在出现了物品集A的事务T中，物品集B也同时出现的概率。",[10548,108384,108385],{"id":108385},"关联规则的最小支持度和最小可信度",[13,108387,108388],{},[617,108389],{"alt":119,"src":31317},[13,108391,108392],{},[617,108393],{"alt":119,"src":31335},[13,108395,108396,108399],{},[22,108397,108398],{},"频繁项集","：在数据集中出现频率相当高的那些项集。如果项集满足最小支持度，则它称之为频繁项集(Frequent Itemset)。",[13,108401,108402],{},[22,108403,108404],{},"强关联规则：",[13,108406,108407],{},[617,108408],{"alt":119,"src":31411},[13,108410,108411],{},[617,108412],{"alt":119,"src":108413},"img\u002F6.7.png",[7759,108415,108417],{"id":108416},"_3apriori算法","3、Apriori算法",[13,108419,108420,108421,108424],{},"Apriori算法是最常用的",[22,108422,108423],{},"关联规则挖掘算法","。 Apriori算法的扩展性较好，可用于并行计算等领域。Apriori算法的思想是：",[49,108426,108427,108430],{},[52,108428,108429],{},"使用频繁项集性质的先验知识。",[52,108431,108432],{},"使用逐层搜索的迭代方法产生频繁项集。",[10548,108434,108436],{"id":108435},"_1aprior定律","（1）Aprior定律",[2285,108438,108439,108442],{},[52,108440,108441],{},"如果一个集合是频繁项集，则它的所有子集都是频繁项集。\n举例：假设一个集合{A,B}是频繁项集，即A、B同时出现在一条记录的次数大于等于最小支持度min_support，则它的子集{A},{B}出现次数必定大于等于min_support，即它的子集都是频繁项集。",[52,108443,108444],{},"如果一个集合不是频繁项集，则它的所有超集都不是频繁项。\n举例：假设集合{A}不是频繁项集，即A出现的次数小于min_support，则它的任何超集如{A,B}出现的次数必定小于min_support，因此其超集必定也不是频繁项集。",[13,108446,108447],{},[22,108448,108449],{},"利用这两条定律，我们抛掉很多的候选项集，Apriori算法就是利用这两个定理来实现快速挖掘频繁项集的。",[10548,108451,108453],{"id":108452},"_2算法步骤","（2）算法步骤",[2285,108455,108456,108459,108473],{},[52,108457,108458],{},"扫描整个数据集，得到所有出现过的数据，作为候选频繁1项集。k=1，频繁0项集为空集。",[52,108460,108461,108462],{},"挖掘频繁k项集\n",[49,108463,108464,108467,108470],{},[52,108465,108466],{},"扫描数据计算候选频繁k项集的支持度;",[52,108468,108469],{},"**去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。**如果得到的频繁k项集为空，则直接返回频繁k-1项集的集合作为算法结果，算法结束。如果得到的频繁k项集只有一项，则直接返回频繁k项集的集合作为算法结果，算法结束;",[52,108471,108472],{},"基于频繁k项集，连接生成候选频繁k+1项集。",[52,108474,108475,108476,108479],{},"令",[22,108477,108478],{},"k=k+1","，转入步骤2。",[10548,108481,108483],{"id":108482},"_3局限性","（3）局限性",[13,108485,108486,108487,108490],{},"在每一次产生候选集时都要扫描一次数据库，生成",[22,108488,108489],{},"大量备选项集","，导致计数工作量太大，影响了算法的效率。",[7759,108492,108494],{"id":108493},"_4fp-growth算法","4、FP-Growth算法",[13,108496,108497],{},"FP-Growth算法是针对Apriori算法的缺点提出来的全新的一种算法模式。",[10548,108499,108501],{"id":108500},"_1算法步骤","（1）算法步骤",[2285,108503,108504,108507,108527],{},[52,108505,108506],{},"扫描整个数据集，得到所有出现过的数据，并得到它们的支持度计数作为候选频繁1项集，记为L。",[52,108508,108509,108510],{},"构造FP-Tree树\n",[49,108511,108512,108515,108521],{},[52,108513,108514],{},"创建树的根节点，用“null”标记。",[52,108516,108517,108518,67],{},"第二次扫描数据库。每个事务中的项都按L的次序处理（即按递减支持度计数排序），并",[22,108519,108520],{},"对每个事务创建一个分支",[52,108522,108523,108524,67],{},"当为一个事务考虑增加分枝时，",[22,108525,108526],{},"沿共同的前缀的每个结点的计数增加1，为前缀之后的项创建节点和连接",[52,108528,108529],{},"对FP-Tree树进行挖掘频繁项集。",[13,108531,108532],{},"Apriori算法在每一次产生候选集时都要扫描一次数据库，而FP-growth则利用树形结构，无需产生候选项集而是直接得到频繁项集，大大减少了扫描交易数据库的次数。",[10548,108534,108536],{"id":108535},"_2fp-tree结构优点","（2）FP-tree结构优点",[13,108538,108539],{},"**完备性：**不会打破交易中的任何模式，而且包含了挖掘序列模式所需的全部信息。",[13,108541,108542],{},"**紧密性：**它剔除不相关信息，不包含非频繁项，按支持度降序排列，支持度高的项在FP-tree中共享的机会也高。",[23289,108544],{},[107,108546,108548],{"id":108547},"第七章-聚类分析","第七章 聚类分析",[7759,108550,108552],{"id":108551},"_1聚类分析概述","1、聚类分析概述",[10548,108554,30037],{"id":30036},[13,108556,108557,108560],{},[22,108558,108559],{},"聚类分析","是指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。",[13,108562,108563,108564,108567,108568,67],{},"由聚类所生成的簇是一组数据对象的集合，被称为",[22,108565,108566],{},"聚类集合","。簇内的对象之间相似度较高，簇与簇之间对象差别较大。散落在聚类集合之外的点被称为",[22,108569,108570],{},"孤立点",[13,108572,108573,108575],{},[22,108574,108217],{},"是将物理或抽象对象分组成多个类或簇，簇内对象间有较高相似度，簇间对象差别较大。",[13,108577,108578,108579,108582],{},"聚类所组成的簇是",[22,108580,108581],{},"一组对象的集合，这些对象与同一簇中的对象彼此类似，与其他簇中的对象相异","。在许多应用中，可以将一些簇中的对象作为一个整体来对待。",[13,108584,108585],{},"聚类分析源于许多研究领域，比如数据挖掘，统计学，生物学，以及机器学习。聚类分析能作为一个独立的工具，来获得数据分布的情况，观察每个簇的特点，集中对特定的或感兴趣的某些簇做进一步分析。",[10548,108587,108589],{"id":108588},"_2目的","（2）目的",[13,108591,108592],{},"寻找数据中：",[49,108594,108595,108598],{},[52,108596,108597],{},"潜在的自然分组结构",[52,108599,108600],{},"感兴趣的关系",[13,108602,108603],{},"聚类可以自动发现分组，有时又称作自动分类，这是聚类分析的突出优点。",[7759,108605,108607],{"id":108606},"_2差异度计算","2、差异度计算",[13,108609,108610],{},[617,108611],{"alt":119,"src":31471},[10548,108613,108614],{"id":108614},"混合类型变量的差异度计算",[13,108616,108617],{},"一个数据库可能包含区间标度量、对称二元变量、不对称二元变量、标称变量、序数型变量或者比例标度变量。",[2285,108619,108620,108623],{},[52,108621,108622],{},"计算用混合类型变量描述的对象之间的差异度方法是将变量按类型分组，对每种类型的变量进行单独的聚类分析。如果在这些分析得到兼容的结果，这种做法是可行的。",[52,108624,108625,108626,108629],{},"将所有变量一起处理，只进行一次聚类分析。将不同意义的变量转换到共同的值域区间",[78,108627,108628],{},"0.0,1.0","上。",[7759,108631,108633],{"id":108632},"_3分割聚类","3、分割聚类",[10548,108635,108637],{"id":108636},"_1描述","（1）描述",[13,108639,108640,108641,108644,108645,108648,108649,67],{},"分割聚类方法作为一种基于原型的聚类方法，其本质是先从数据集中随机地选择几个对象来作为聚类的原型，然后再将其他的对象分别分配给与原型所代表的最相似，也就是",[22,108642,108643],{},"距离最近","的类中。\n分割聚类方法给定一个n个对象的集合，构建数据的K个分区。大部分分割方法是",[22,108646,108647],{},"基于距离","的，所以只能发现",[22,108650,108651],{},"球类簇",[10548,108653,108655],{"id":108654},"_2基本特点","（2）基本特点",[49,108657,108658,108661,108663,108666],{},[52,108659,108660],{},"发现球状互斥的簇",[52,108662,108647],{},[52,108664,108665],{},"可以用均值或者中心点代表簇的中心",[52,108667,108668],{},"对中小规模数据有效",[10548,108670,108672],{"id":108671},"_3方法步骤","（3）方法步骤",[13,108674,108675,108676,108679,108680,108683],{},"分割聚类方法首先给定要构建的分区数k，创建一个初始划分。然后，采用一种",[22,108677,108678],{},"迭代","的重定位技术，通过把对象从一个组移动到另一个组来改进分割效果。一个好的分割的一般准则是：",[22,108681,108682],{},"同一个簇中的对象尽可能相互接近或相关，而不同簇中的对象尽可能远离或不同。","\n分割聚类方法给定一个含有n个对象的集合，具体划分方法为构建数据的K个分区，每个分区表示一个聚簇，并且k≤n。它将数据划分为k个组，同时满足如下要求：",[49,108685,108686,108691],{},[52,108687,108688],{},[22,108689,108690],{},"每个组至少包含一个对象；",[52,108692,108693],{},[22,108694,108695],{},"每个对象必须属于一个组。",[13,108697,108698],{},"在某些模糊划分的技术中，第二个要求可以适当放宽。",[7759,108700,108702],{"id":108701},"_4k-means算法","4、K-means算法",[13,108704,108705],{},"k-means算法是将**平均值作为类的“中心”**的一种分割聚类的方法。该算法以k为参数，把n个对象分成k个簇，使簇内具有较高的相似度，而簇间的相似度较低。",[10548,108707,108708],{"id":108708},"算法流程",[13,108710,108711],{},"输入：包含n个对象的数据库和簇的数目k；",[13,108713,108714],{},"输出：k个簇。",[13,108716,108717],{},"(1) 任意选择k个对象作为初始的簇中心；",[13,108719,108720],{},"(2) 对剩余的数据对象，根据其与各个簇中心之间的距离，赋给最近的簇；",[13,108722,108723],{},"(3)更新簇的平均值，即计算每个簇中对象的平均值；",[13,108725,108726],{},"(4)根据簇中对象的平均值，将每个对象(重新)赋予最类似的簇；",[13,108728,108729],{},"(5) 直到不再发生变化。",[7759,108731,108733],{"id":108732},"_5pam算法","5、PAM算法",[13,108735,108736,108737,108740,108741],{},"PAM算法实际为",[22,108738,108739],{},"k中心点算法","。中心选用的是具体的某一个点，而不是k均值的几何中心。是对k均值算法的改进，",[22,108742,108743],{},"削弱了离群值的敏感度。但是其运算量较大，适合少量数据的分析。",[10548,108745,108708],{"id":108746},"算法流程-1",[13,108748,108749],{},"（1）选取若干点作为初始簇心，并将剩余的点分配到最近的簇",[13,108751,108752],{},"（2）依次循环将非簇心的点假设为簇心，替换现有的一个，计算更改前后的耗费差距",[13,108754,108755],{},"（3）选择耗费差距最小的为新的簇心",[13,108757,108758],{},"（4）簇心的位置没有改变，停止",[7759,108760,108762],{"id":108761},"_6基于密度的聚类方法","6、基于密度的聚类方法",[13,108764,108765,108766,108769],{},"分割式聚类算往往只能发现凸形的聚类簇，为了发现",[22,108767,108768],{},"任意形状","的聚类结果，提出了基于密度的聚类方法。这类方法将簇看作是数据空间中被低密度区域分割开的高密度对象区域。\n基于密度聚类方法的主要思想是：**只要“邻域”中的密度（对象或数据点的数目）超过某个阈值，就继续增长给定的簇。**也就是说，对给定簇中的每个数据点，在给定半径的邻域中必须至少包括最少数目的点。这样的方法可以用来过滤噪声或离群点，从而发现任意形状的簇。",[7759,108771,108773],{"id":108772},"_7dbscan算法","7、DBSCAN算法",[13,108775,108776,108777,67],{},"DBSCAN算法是一种基于高密度联通区域的聚类算法，它将类簇定义为高密度相连点的最大集合。它本身",[22,108778,108779],{},"对噪声不敏感，并且能发现任意形状的类簇",[10548,108781,108782],{"id":108782},"基本思想",[13,108784,108785],{},"**如果一个对象在它半径为ε的邻域中至少包含有MinPts个对象，那么该区域被认为是密集的。**为了明确这样的密集区域，该算法涉及到有关密度的一系列定义，进而根据这些定义来确定密集区域，即确定各个类并隔离出异常值。",[10548,108787,78305],{"id":78305},[13,108789,108790],{},"**ε邻域：**对于一个给定的具体对象，其半径为 ε的邻域称为该对象的 ε-邻域。",[13,108792,108793],{},"**核心对象：**对于一个对象，如果在其 ε-邻域内至少包含有MinPts个对象,那么该对象称为核心对象。",[13,108795,108796],{},"**直接密度可达：**在所给定的对象集D中，对于参数 ε和MinPts，如果其中q是一个核心对象，对象p在q的 ε-邻域内，那么称对象p为从对象q是直接密度可达的。",[13,108798,108799],{},"**密度可达：**在给定的对象集D中,对于参数 ε和MinPts,如果存在对象p1,p2,…,pn,p1=q,pn=p,对于每一个i∈{1,2,…,n-1},对象pi+1从对象pi是直接密度可达的,那么称对象p从对象q是密度可达的。",[13,108801,108802],{},"**密度相连：**在给定的对象集D中，对于参数 ε和MinPts，如果对象p和对象q都是从对象o密度可达的，那么称对象p和对象q是密度相连的。",[10548,108804,108708],{"id":108805},"算法流程-2",[13,108807,108808],{},"（1）扫描整个数据集，找到任意一个核心点，对该核心点进行扩充。扩充的方法是寻找从该核心点出发的所有密度相连的数据点（注意是密度相连）。遍历该核心点的 邻域内的所有核心点（因为边界点是无法扩充的），寻找与这些数据点密度相连的点，直到没有可以扩充的数据点为止。最后聚类成的簇的边界节点都是非核心数据点。",[13,108810,108811],{},"（2）重新扫描数据集（不包括之前寻找到的簇中的任何数据点），寻找没有被聚类的核心点，再重复上面的步骤，对该核心点进行扩充。",[13,108813,108814],{},"（3）直到数据集中没有新的核心点为止。数据集中没有包含在任何簇中的数据点就构成异常点。",[23289,108816],{},[107,108818,108820],{"id":108819},"第八章-分类","第八章 分类",[7759,108822,108824],{"id":108823},"_1基本知识","1、基本知识",[10548,108826,62489],{"id":62606},[13,108828,108829],{},[22,108830,108831],{},"分类是找出数据库中具有共同特点的一组数据对象，并按照分类模型将其划分成预先定义的不同类型。",[10548,108833,108835],{"id":108834},"_2过程","（2）过程",[2285,108837,108838,108855],{},[52,108839,108840,108841,108843,108844],{},"建立模型",[2996,108842],{},"第一步，也称为学习步，目标是建立描述预先定义的数据类或概念集的分类器。",[49,108845,108846,108849,108852],{},[52,108847,108848],{},"分类算法通过从训练集“学习”来构造分类器；",[52,108850,108851],{},"训练集由数据库元组（用n维属性向量表示）和他们相对应的类编号（标签）组成；假定每个元组属于一个预定义的类；",[52,108853,108854],{},"学习模型可以用分类规则、决策树或数学公式的形式提供。",[52,108856,108857,108858,108860,108861],{},"使用模型",[2996,108859],{},"第二步，使用模型，对将来的或未知的对象进行分类。",[49,108862,108863,108866,108869],{},[52,108864,108865],{},"对每个测试样本，将已知的类标号和该样本的学习模型类预测比较；",[52,108867,108868],{},"模型在给定测试集上的准确率是正确被模型分类的测试样本的百分比；",[52,108870,108871],{},"测试集要独立于训练样本集，否则会出现“过分拟合”的情况。",[10548,108873,108875],{"id":108874},"_3评价标准","（3）评价标准",[13,108877,108878],{},"先假设分类目标只有正例（P）和负例（N）两种，下面介绍几个常用的分类评价术语：",[2285,108880,108881,108884,108887,108890],{},[52,108882,108883],{},"TP：本身为正例，并且被分类器正确划分为正例的样本数；",[52,108885,108886],{},"FP：本身为负例，但被分类器错误地划分为正例的样本数；",[52,108888,108889],{},"FN：本身为正例，但被分类器错误地划分为负例的样本数；",[52,108891,108892],{},"TN：本身为负例，并且被分类器正确划分为负例的样本数。",[49,108894,108895],{},[52,108896,108897],{},"正确率（accuracy）",[13,108899,108900,108901,108904],{},"正确率是我们最常见的评价指标，accuracy = （TP+TN）\u002F(P+N)，这个很容易理解，就是被",[22,108902,108903],{},"分对的样本数除以所有的样本数","，通常来说，正确率越高，分类器越好；",[49,108906,108907],{},[52,108908,108909],{},"错误率（error rate)",[13,108911,108912,108913,108916],{},"错误率则与正确率相反，描述被",[22,108914,108915],{},"分类器错分的比例","，error rate = (FP+FN)\u002F(P+N)，对某一个实例来说，分对与分错是互斥事件，所以 accuracy =1 - error rate；",[49,108918,108919],{},[52,108920,108921],{},"灵敏度（sensitive）",[13,108923,108924,108925,108928],{},"sensitive = TP\u002FP，表示的是",[22,108926,108927],{},"所有正例中被分对的比例","，衡量了分类器对正例的识别能力；",[49,108930,108931],{},[52,108932,108933],{},"特效度（specificity)",[13,108935,108936,108937,108940],{},"specificity = TN\u002FN，表示的是",[22,108938,108939],{},"所有负例中被分对的比例","，衡量了分类器对负例的识别能力；",[49,108942,108943],{},[52,108944,108945],{},"精度（precision）：查准率",[13,108947,108948,108949,108952],{},"精度是精确性的度量，表示被分为",[22,108950,108951],{},"正例的实例中实际为正例的比例","，precision=TP\u002F（TP+FP）；",[49,108954,108955],{},[52,108956,108957],{},"召回率（recall）：查全率",[13,108959,108960,108961,108964],{},"召回率是覆盖面的度量，度量有",[22,108962,108963],{},"多少个正例被分为正例","，recall=TP\u002F(TP+FN)=TP\u002FP=sensitive，可以看到召回率与灵敏度是一样的。",[7759,108966,108968],{"id":108967},"_2决策树","2、决策树",[10548,108970,108972],{"id":108971},"_1什么是决策树","（1）什么是决策树？",[49,108974,108975,108978,108981,108984],{},[52,108976,108977],{},"类似于流程图的树结构",[52,108979,108980],{},"每个内部节点表示数据对象的一个特征属性",[52,108982,108983],{},"每个分枝代表属性的一个取值",[52,108985,108986],{},"每个树叶节点代表一个类编号（决策结果）",[13,108988,108989],{},[617,108990],{"alt":119,"src":62619},[13,108992,108993],{},"使用决策树进行分类的过程就是从根节点开始，测试待分类项中相应的特征属性，并按照其值选择输出分支，直到到达叶子节点，将叶子节点存放的类别作为分类结果。",[10548,108995,108997],{"id":108996},"_2决策树的生成","（2）决策树的生成",[49,108999,109000,109011],{},[52,109001,109002,109003],{},"决策树构建",[49,109004,109005,109008],{},[52,109006,109007],{},"使用属性选择度量来选择将元组最好的划分为不同的类的属性",[52,109009,109010],{},"递归的通过选定的属性，来划分样本 （必须是离散值）",[52,109012,109013,109014],{},"树剪枝",[49,109015,109016],{},[52,109017,109018],{},"决策树建立时，许多分枝反映的是训练数据中的噪声和离群点，树剪枝试图识别并剪去这种分枝，以提高对未知数据分类的准确性",[10548,109020,109022],{"id":109021},"_3构建流程","（3）构建流程",[2285,109024,109025,109028,109031,109034],{},[52,109026,109027],{},"得到原始数据集；",[52,109029,109030],{},"根据属性选择度量对数据集进行最优划分，由于特征值可能有多个，因此存在数据集的划分大于两个分支的情况；",[52,109032,109033],{},"采用递归的原则对数据集进行处理，首次划分后，数据将会向下传递，到达树的分支的下一个节点，在该节点上，可对数据进行再次划分，不断重复该操作，直到达到递归结束条件，才结束递归；",[52,109035,109036],{},"递归结束的条件是，算法遍历完所有划分好的数据集的属性，或每个分支下的所有实例都具有相同的分类。",[7759,109038,109040],{"id":109039},"_3id3算法","3、ID3算法",[13,109042,109043,109044,109047,109048,109051,109052],{},"ID3算法依据“",[22,109045,109046],{},"最大信息熵增益","”原则，这里的熵描述的是数据集的",[22,109049,109050],{},"混乱程度","，数据越混乱，相应的熵就越大，算法每次都选择熵减少程度最大的特征，并用该特征对数据集进行划分，根据该原则，自顶向下遍历决策树空间。ID3算法的基本思想是，",[22,109053,109054],{},"随着决策树深度的增加，节点的熵迅速地降低，熵降低的速度越快越好。",[13,109056,109057,109058,109060],{},"该方法使用",[22,109059,104251],{},"来选择测试属性。",[2285,109062,109063,109069,109072,109075,109078],{},[52,109064,109065,109068],{},[22,109066,109067],{},"信息熵是随机变量的期望","。度量信息的不确定程度。信息的熵越大，信息就越不容易搞清楚（杂乱）。",[52,109070,109071],{},"**一个系统越是有序，信息熵就越低；反之，一个系统越是混乱，信息熵就越高。**信息熵也可以说是系统有序化程度的一个度量。",[52,109073,109074],{},"**信息熵用以表示一个事物的非确定性，**如果该事物的非确定性越高，你的好奇心越重，该事物的信息熵就越高。",[52,109076,109077],{},"**熵是整个系统的平均消息量。 信息熵是信息论中用于度量信息量的一个概念。**一个系统越是有序，信息熵就越低；反之，一个系统越是混乱，信息熵就越高。",[52,109079,109080],{},"处理信息就是为了把信息搞清楚，实质上就是要想办法让信息熵变小。",[10548,109082,109083],{"id":109083},"信息量大小的度量",[13,109085,109086],{},[617,109087],{"alt":119,"src":62640},[10548,109089,104251],{"id":104251},[13,109091,104251],{},[49,109093,109094,109097],{},[52,109095,109096],{},"用来衡量给定的属性区分训练样例的能力；",[52,109098,109099],{},"ID3算法在生成树的每一步使用信息增益从候选属性中选择属性；",[13,109101,109102],{},"用熵度量样例的均一性",[10548,109104,109105],{"id":109105},"不足",[2285,109107,109108,109111],{},[52,109109,109110],{},"ID3没有考虑连续特征，比如长度，密度都是连续值，无法在ID3运用。这大大限制了ID3的用途。",[52,109112,109113],{},"在相同条件下，取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值，各为1\u002F2，另一个变量为3个值，各为1\u002F3，其实他们都是完全不确定的变量，但是取3个值的比取2个值的信息增益大。（信息增益反映的给定一个条件以后不确定性减少的程度，必然是分得越细的数据集确定性更高，也就是条件熵越小，信息增益越大）",[7759,109115,109117],{"id":109116},"_4svm预测","4、SVM预测",[10548,109119,109121],{"id":109120},"_1什么是svm","（1）什么是SVM？",[13,109123,109124,109125,109128],{},"支持向量机（简称SVM）是由Cotes和Vannik首先提出来的，是多年来关注度很高的分类技术，",[22,109126,109127],{},"它可以很好的解决小样本，非线性及高维度数据识别分类问题","， 这种技术具有坚实的统计理论基础，在许多实际应用（如文本分类）达到了很好的效果，并能推广应用到函数拟合等其他机器学习过程中。",[13,109130,109131,109132,109135],{},"支持向量机的基本思想是：在线性可分情况下，在原空间寻找两类样本的最优分类超平面。",[22,109133,109134],{},"在线性不可分的情况下，加入了松弛变量进行分析，通过使用非线性映射将低维输入空间的样本映射到高维属性空间使其变为线性情况，从而使得在高维属性空间采用线性算法对样本的非线性进行分析成为可能","，并在该特征空间中寻找最优分类超平面。",[10548,109137,109139],{"id":109138},"_2最大边缘的基本原理","（2）最大边缘的基本原理",[13,109141,109142],{},"具有较大边缘的决策比较小边缘的决策具有更好的泛化能力。从的直觉上来说，如果边缘较小，未知数据在决策边界附近分布会对分类效果产生明显影响。因此那些决策边缘较小的分类器对模型过拟合更加敏感，从而泛化能力变差。因此，需要最大化决策边界的边缘，以确保在最坏的情况下泛化误差最小。线性SVM就是解决这个问题的分类器。",[10548,109144,109146],{"id":109145},"_3核函数","（3）核函数",[13,109148,109149],{},[617,109150],{"alt":119,"src":62679},[7759,109152,109154],{"id":109153},"_5knn算法","5、KNN算法",[10548,109156,109158],{"id":109157},"_1knn分类","（1）KNN分类",[13,109160,109161],{},"K-最近邻算法是最近邻算法的一个延伸。基本思路是：选择未知样本一定范围内确定个数的K个样本，该K个样本大多数属于某一类型，则未知样本判定为该类型。",[13,109163,109164],{},[617,109165],{"alt":119,"src":106933},[10548,109167,108453],{"id":109168},"_2算法步骤-1",[2285,109170,109171,109174,109177,109180,109183],{},[52,109172,109173],{},"计算测试数据与各个训练数据之间的距离；",[52,109175,109176],{},"按照距离的递增关系进行排序；",[52,109178,109179],{},"选取距离最小的K个点；",[52,109181,109182],{},"确定前K个点所在类别的出现频率；",[52,109184,109185],{},"返回前K个点中出现频率最高的类别作为测试数据的预测分类。",[10548,109187,109189],{"id":109188},"_3优点","（3）优点",[2285,109191,109192,109195,109198],{},[52,109193,109194],{},"简单，易于理解，易于实现，无需估计参数，无需训练；",[52,109196,109197],{},"适合对稀有事件进行分类；",[52,109199,109200],{},"特别适合于多分类问题(对象具有多个类别标签)，KNN比SVM的表现要好。",[10548,109202,109204],{"id":109203},"_4缺点","（4）缺点",[2285,109206,109207,109210,109213],{},[52,109208,109209],{},"当样本不平衡时，如一个类的样本容量很大，而其他类样本容量很小时，可能导致当输入一个新样本时，该样本的K个邻居中大容量类的样本占多数。",[52,109211,109212],{},"计算量较大，因为对每一个待分类的文本都要计算它到全体已知样本的距离，才能求得它的K个最近邻点。",[52,109214,109215],{},"可理解性差，无法给出像决策树那样的规则。",[107,109217,25480],{"id":25480},[13,109219,109220],{},"数据仓库的部分其实比较详细了，在写文档的过程中又补充了一些以前没有细细了解过的，比如说元数据、OLAP等。其实有时候会发现其实大部分用过的软件中或多或少会带点理论的影子，比如说Hive、Maxwell都在MySQL中创建了MetaStore，其实这个时候就是创建了元数据数据库；再比如工作流的建立其实和OLAP联机分析处理有着异曲同工之处，都能在线提供分析处理功能。",[13,109222,109223],{},"数据挖掘部分就没有那么详细了，一个是没有这么多前置的文档记录，本身我自己也算是半路出家，对数据科学这方面也有不少问题；二个是多合一，商务智能、机器学习、数仓与数挖三门课相当于用这一个文档做了一个简单的小总结（其中机器学习还可能用不到，只不过是在理解的基础上学习机器学习比较轻松）；最后是时间问题，写这个文档的时候已经考完了，对这方面也没太伤心，难免有些敷衍。数挖其实还有不少我比较想介绍的内容，比如一些算法的技巧和通俗图解，但是因为时间和精力关系短时间不太能做了。以后有机会或者有时间会补上的。——Alexie·Z·Yevich 2023.6.23",{"title":119,"searchDepth":144,"depth":144,"links":109225},[109226,109231,109237,109246,109253],{"id":108093,"depth":132,"text":108094,"children":109227},[109228,109229,109230],{"id":108104,"depth":144,"text":108105},{"id":29536,"depth":144,"text":29537},{"id":108302,"depth":144,"text":108303},{"id":108322,"depth":132,"text":108323,"children":109232},[109233,109234,109235,109236],{"id":108326,"depth":144,"text":108327},{"id":108339,"depth":144,"text":108340},{"id":108416,"depth":144,"text":108417},{"id":108493,"depth":144,"text":108494},{"id":108547,"depth":132,"text":108548,"children":109238},[109239,109240,109241,109242,109243,109244,109245],{"id":108551,"depth":144,"text":108552},{"id":108606,"depth":144,"text":108607},{"id":108632,"depth":144,"text":108633},{"id":108701,"depth":144,"text":108702},{"id":108732,"depth":144,"text":108733},{"id":108761,"depth":144,"text":108762},{"id":108772,"depth":144,"text":108773},{"id":108819,"depth":132,"text":108820,"children":109247},[109248,109249,109250,109251,109252],{"id":108823,"depth":144,"text":108824},{"id":108967,"depth":144,"text":108968},{"id":109039,"depth":144,"text":109040},{"id":109116,"depth":144,"text":109117},{"id":109153,"depth":144,"text":109154},{"id":25480,"depth":132,"text":25480},{},"我的大学\u002F大三下学期\u002F数据仓库与数据挖掘\u002F数据仓库与数据挖掘（下）.md","\u002Fundergraduate\u002Fnote-f29c8eaf98be",{"title":108085,"description":119},"undergraduate\u002Fnote-f29c8eaf98be",[14968,7744,246,10715,14542],"NlE7GN4fKb6Q7DhgGv2Ef4RJX4aTteTmT5a-Mpgfsv0",{"id":109262,"title":109263,"assetBase":239,"author":8,"body":109264,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":110358,"navigation":128,"originalPath":110359,"path":110360,"seo":110361,"source":23330,"stem":110362,"tags":110363,"weight":250,"__hash__":110364},"content\u002Fundergraduate\u002Fnote-f7c8af1fee65.md","算法押题卷QWQ",{"type":10,"value":109265,"toc":110336},[109266,109269,109272,109279,109300,109303,109307,109311,109313,109488,109490,109817,109819,109938,109941,110105,110108,110236,110238,110245,110247,110251,110253,110257,110259,110263,110273,110275,110281,110283,110294,110296,110300,110302,110312,110314,110325,110327,110333],[4517,109267,109268],{"id":109268},"算法押题卷",[10548,109270,109271],{"id":42815},"【说明】",[13,109273,109274,109275,109278],{},"1、本试卷仅作为自用考前题目预测作用，不具有任何正式效力，且严肃声明：",[22,109276,109277],{},"此试卷不具有复习代表性","，仅供大家参考。",[13,109280,109281,109282],{},"2、变长数组类型 vector",[5012,109283,109284,109285],{},"、栈类型 stack",[5012,109286,109287,109288],{},"、队列类型 queue",[5012,109289,109290,109291],{},"、最小堆类型 minheap",[5012,109292,109293,109294],{},"、最大堆类型 maxheap",[5012,109295,109296,109297],{},"和矩阵类型 Matrix",[5012,109298,109299],{},"以及标准库中的常用算法函数等可直接使用，无需自行定义。",[13,109301,109302],{},"3、考试语言自定义，建议使用c++，不会的地方请勿直接使用中文表示，可以适当使用伪码。",[107,109304,109306],{"id":109305},"一基础知识题每题10分共4题共40分","一、基础知识题（每题10分，共4题，共40分）",[7759,109308,109310],{"id":109309},"_1写出下列函数的上界估计并说明结果的正确性10分","1、写出下列函数的上界估计，并说明结果的正确性。（10分）",[10548,109312,28636],{"id":28635},[78,109314,109316],{"className":109315},[4566],[78,109317,109319,109360],{"className":109318},[4570],[78,109320,109322],{"className":109321},[4574],[4576,109323,109324],{"xmlns":4578,"display":4579},[4581,109325,109326,109357],{},[4584,109327,109328,109330,109332,109334,109336,109338,109340,109343,109349,109351],{},[4596,109329,5074],{},[4591,109331,4594],{"stretchy":4593},[4596,109333,19],{},[4591,109335,4604],{"stretchy":4593},[4591,109337,4609],{},[7077,109339,1861],{},[4591,109341,109342],{},"∗",[4614,109344,109345,109347],{},[7077,109346,472],{},[4596,109348,19],{},[4591,109350,7351],{},[4614,109352,109353,109355],{},[4596,109354,19],{},[7077,109356,472],{},[4647,109358,109359],{"encoding":4649},"T(n) = 6 * 2 ^ n + n ^ 2",[78,109361,109363,109390,109408,109453],{"className":109362,"ariaHidden":1419},[4654],[78,109364,109366,109369,109372,109375,109378,109381,109384,109387],{"className":109365},[4658],[78,109367],{"className":109368,"style":4663},[4662],[78,109370,5074],{"className":109371,"style":5219},[4667,4678],[78,109373,4594],{"className":109374},[4674],[78,109376,19],{"className":109377},[4667,4678],[78,109379,4604],{"className":109380},[4682],[78,109382],{"className":109383,"style":4740},[4739],[78,109385,4609],{"className":109386},[4744],[78,109388],{"className":109389,"style":4740},[4739],[78,109391,109393,109396,109399,109402,109405],{"className":109392},[4658],[78,109394],{"className":109395,"style":17917},[4662],[78,109397,1861],{"className":109398},[4667],[78,109400],{"className":109401,"style":5143},[4739],[78,109403,109342],{"className":109404},[7450],[78,109406],{"className":109407,"style":5143},[4739],[78,109409,109411,109415,109444,109447,109450],{"className":109410},[4658],[78,109412],{"className":109413,"style":109414},[4662],"height:0.7977em;vertical-align:-0.0833em;",[78,109416,109418,109421],{"className":109417},[4667],[78,109419,472],{"className":109420},[4667],[78,109422,109424],{"className":109423},[4689],[78,109425,109427],{"className":109426},[4693],[78,109428,109430],{"className":109429},[4698],[78,109431,109433],{"className":109432,"style":53394},[4702],[78,109434,109435,109438],{"style":5209},[78,109436],{"className":109437,"style":4711},[4710],[78,109439,109441],{"className":109440},[4715,4716,4717,4718],[78,109442,19],{"className":109443},[4667,4678,4718],[78,109445],{"className":109446,"style":5143},[4739],[78,109448,7351],{"className":109449},[7450],[78,109451],{"className":109452,"style":5143},[4739],[78,109454,109456,109459],{"className":109455},[4658],[78,109457],{"className":109458,"style":53807},[4662],[78,109460,109462,109465],{"className":109461},[4667],[78,109463,19],{"className":109464},[4667,4678],[78,109466,109468],{"className":109467},[4689],[78,109469,109471],{"className":109470},[4693],[78,109472,109474],{"className":109473},[4698],[78,109475,109477],{"className":109476,"style":53807},[4702],[78,109478,109479,109482],{"style":5209},[78,109480],{"className":109481,"style":4711},[4710],[78,109483,109485],{"className":109484},[4715,4716,4717,4718],[78,109486,472],{"className":109487},[4667,4718],[10548,109489,28654],{"id":28653},[78,109491,109493],{"className":109492},[4566],[78,109494,109496,109570],{"className":109495},[4570],[78,109497,109499],{"className":109498},[4574],[4576,109500,109501],{"xmlns":4578,"display":4579},[4581,109502,109503,109567],{},[4584,109504,109505,109507,109509,109511,109513,109515,109521,109527,109529,109531,109537,109539,109541,109547,109553,109555,109557,109559,109565],{},[4596,109506,5074],{},[4591,109508,4594],{"stretchy":4593},[4596,109510,19],{},[4591,109512,4604],{"stretchy":4593},[4591,109514,4609],{},[4614,109516,109517,109519],{},[7077,109518,472],{},[4596,109520,19],{},[4614,109522,109523,109525],{},[4596,109524,19],{},[7077,109526,1014],{},[4596,109528,7132],{},[4596,109530,5025],{},[4614,109532,109533,109535],{},[4596,109534,43673],{},[7077,109536,1025],{},[4596,109538,19],{},[4591,109540,7351],{},[4614,109542,109543,109545],{},[7077,109544,472],{},[4596,109546,19],{},[4614,109548,109549,109551],{},[4596,109550,19],{},[7077,109552,11047],{},[4596,109554,7102],{"mathvariant":7101},[4596,109556,7132],{},[4596,109558,5025],{},[4614,109560,109561,109563],{},[4596,109562,43673],{},[7077,109564,1025],{},[4596,109566,19],{},[4647,109568,109569],{"encoding":4649},"T(n) = 2 ^ nn ^ 4log^3n + 2 ^ nn ^ 5 \u002F log ^ 3 n",[78,109571,109573,109600,109712],{"className":109572,"ariaHidden":1419},[4654],[78,109574,109576,109579,109582,109585,109588,109591,109594,109597],{"className":109575},[4658],[78,109577],{"className":109578,"style":4663},[4662],[78,109580,5074],{"className":109581,"style":5219},[4667,4678],[78,109583,4594],{"className":109584},[4674],[78,109586,19],{"className":109587},[4667,4678],[78,109589,4604],{"className":109590},[4682],[78,109592],{"className":109593,"style":4740},[4739],[78,109595,4609],{"className":109596},[4744],[78,109598],{"className":109599,"style":4740},[4739],[78,109601,109603,109607,109636,109665,109668,109671,109700,109703,109706,109709],{"className":109602},[4658],[78,109604],{"className":109605,"style":109606},[4662],"height:1.0585em;vertical-align:-0.1944em;",[78,109608,109610,109613],{"className":109609},[4667],[78,109611,472],{"className":109612},[4667],[78,109614,109616],{"className":109615},[4689],[78,109617,109619],{"className":109618},[4693],[78,109620,109622],{"className":109621},[4698],[78,109623,109625],{"className":109624,"style":53394},[4702],[78,109626,109627,109630],{"style":5209},[78,109628],{"className":109629,"style":4711},[4710],[78,109631,109633],{"className":109632},[4715,4716,4717,4718],[78,109634,19],{"className":109635},[4667,4678,4718],[78,109637,109639,109642],{"className":109638},[4667],[78,109640,19],{"className":109641},[4667,4678],[78,109643,109645],{"className":109644},[4689],[78,109646,109648],{"className":109647},[4693],[78,109649,109651],{"className":109650},[4698],[78,109652,109654],{"className":109653,"style":53807},[4702],[78,109655,109656,109659],{"style":5209},[78,109657],{"className":109658,"style":4711},[4710],[78,109660,109662],{"className":109661},[4715,4716,4717,4718],[78,109663,1014],{"className":109664},[4667,4718],[78,109666,7132],{"className":109667,"style":7300},[4667,4678],[78,109669,5025],{"className":109670},[4667,4678],[78,109672,109674,109677],{"className":109673},[4667],[78,109675,43673],{"className":109676,"style":5187},[4667,4678],[78,109678,109680],{"className":109679},[4689],[78,109681,109683],{"className":109682},[4693],[78,109684,109686],{"className":109685},[4698],[78,109687,109689],{"className":109688,"style":53807},[4702],[78,109690,109691,109694],{"style":5209},[78,109692],{"className":109693,"style":4711},[4710],[78,109695,109697],{"className":109696},[4715,4716,4717,4718],[78,109698,1025],{"className":109699},[4667,4718],[78,109701,19],{"className":109702},[4667,4678],[78,109704],{"className":109705,"style":5143},[4739],[78,109707,7351],{"className":109708},[7450],[78,109710],{"className":109711,"style":5143},[4739],[78,109713,109715,109718,109747,109776,109779,109782,109785,109814],{"className":109714},[4658],[78,109716],{"className":109717,"style":53782},[4662],[78,109719,109721,109724],{"className":109720},[4667],[78,109722,472],{"className":109723},[4667],[78,109725,109727],{"className":109726},[4689],[78,109728,109730],{"className":109729},[4693],[78,109731,109733],{"className":109732},[4698],[78,109734,109736],{"className":109735,"style":53394},[4702],[78,109737,109738,109741],{"style":5209},[78,109739],{"className":109740,"style":4711},[4710],[78,109742,109744],{"className":109743},[4715,4716,4717,4718],[78,109745,19],{"className":109746},[4667,4678,4718],[78,109748,109750,109753],{"className":109749},[4667],[78,109751,19],{"className":109752},[4667,4678],[78,109754,109756],{"className":109755},[4689],[78,109757,109759],{"className":109758},[4693],[78,109760,109762],{"className":109761},[4698],[78,109763,109765],{"className":109764,"style":53807},[4702],[78,109766,109767,109770],{"style":5209},[78,109768],{"className":109769,"style":4711},[4710],[78,109771,109773],{"className":109772},[4715,4716,4717,4718],[78,109774,11047],{"className":109775},[4667,4718],[78,109777,7102],{"className":109778},[4667],[78,109780,7132],{"className":109781,"style":7300},[4667,4678],[78,109783,5025],{"className":109784},[4667,4678],[78,109786,109788,109791],{"className":109787},[4667],[78,109789,43673],{"className":109790,"style":5187},[4667,4678],[78,109792,109794],{"className":109793},[4689],[78,109795,109797],{"className":109796},[4693],[78,109798,109800],{"className":109799},[4698],[78,109801,109803],{"className":109802,"style":53807},[4702],[78,109804,109805,109808],{"style":5209},[78,109806],{"className":109807,"style":4711},[4710],[78,109809,109811],{"className":109810},[4715,4716,4717,4718],[78,109812,1025],{"className":109813},[4667,4718],[78,109815,19],{"className":109816},[4667,4678],[10548,109818,28672],{"id":28671},[78,109820,109822],{"className":109821},[4566],[78,109823,109825,109865],{"className":109824},[4570],[78,109826,109828],{"className":109827},[4574],[4576,109829,109830],{"xmlns":4578,"display":4579},[4581,109831,109832,109862],{},[4584,109833,109834,109836,109838,109840,109842,109844,109846,109848,109850,109852,109854,109856,109858,109860],{},[4596,109835,5074],{},[4591,109837,4594],{"stretchy":4593},[4596,109839,19],{},[4591,109841,4604],{"stretchy":4593},[4591,109843,4609],{},[7077,109845,1017],{},[4596,109847,5074],{},[4591,109849,4594],{"stretchy":4593},[4596,109851,19],{},[4596,109853,7102],{"mathvariant":7101},[7077,109855,1025],{},[4591,109857,4604],{"stretchy":4593},[4591,109859,7351],{},[4596,109861,19],{},[4647,109863,109864],{"encoding":4649},"T(n) = 9T(n\u002F3) + n",[78,109866,109868,109895,109929],{"className":109867,"ariaHidden":1419},[4654],[78,109869,109871,109874,109877,109880,109883,109886,109889,109892],{"className":109870},[4658],[78,109872],{"className":109873,"style":4663},[4662],[78,109875,5074],{"className":109876,"style":5219},[4667,4678],[78,109878,4594],{"className":109879},[4674],[78,109881,19],{"className":109882},[4667,4678],[78,109884,4604],{"className":109885},[4682],[78,109887],{"className":109888,"style":4740},[4739],[78,109890,4609],{"className":109891},[4744],[78,109893],{"className":109894,"style":4740},[4739],[78,109896,109898,109901,109904,109907,109910,109913,109917,109920,109923,109926],{"className":109897},[4658],[78,109899],{"className":109900,"style":4663},[4662],[78,109902,1017],{"className":109903},[4667],[78,109905,5074],{"className":109906,"style":5219},[4667,4678],[78,109908,4594],{"className":109909},[4674],[78,109911,19],{"className":109912},[4667,4678],[78,109914,109916],{"className":109915},[4667],"\u002F3",[78,109918,4604],{"className":109919},[4682],[78,109921],{"className":109922,"style":5143},[4739],[78,109924,7351],{"className":109925},[7450],[78,109927],{"className":109928,"style":5143},[4739],[78,109930,109932,109935],{"className":109931},[4658],[78,109933],{"className":109934,"style":16838},[4662],[78,109936,19],{"className":109937},[4667,4678],[10548,109939,63809],{"id":109940},"_4",[78,109942,109944],{"className":109943},[4566],[78,109945,109947,109997],{"className":109946},[4570],[78,109948,109950],{"className":109949},[4574],[4576,109951,109952],{"xmlns":4578,"display":4579},[4581,109953,109954,109994],{},[4584,109955,109956,109958,109960,109962,109964,109966,109968,109970,109972,109974,109976,109978,109980,109982,109984,109986,109992],{},[4596,109957,5074],{},[4591,109959,4594],{"stretchy":4593},[4596,109961,19],{},[4591,109963,4604],{"stretchy":4593},[4591,109965,4609],{},[7077,109967,27433],{},[4596,109969,5074],{},[4591,109971,4594],{"stretchy":4593},[4596,109973,19],{},[4596,109975,7102],{"mathvariant":7101},[7077,109977,472],{},[4591,109979,4604],{"stretchy":4593},[4591,109981,7351],{},[4596,109983,52274],{},[4591,109985,4594],{"stretchy":4593},[4614,109987,109988,109990],{},[4596,109989,19],{},[7077,109991,472],{},[4591,109993,4604],{"stretchy":4593},[4647,109995,109996],{"encoding":4649},"T(n) = 7T(n \u002F 2) + O(n ^ 2)",[78,109998,110000,110027,110061],{"className":109999,"ariaHidden":1419},[4654],[78,110001,110003,110006,110009,110012,110015,110018,110021,110024],{"className":110002},[4658],[78,110004],{"className":110005,"style":4663},[4662],[78,110007,5074],{"className":110008,"style":5219},[4667,4678],[78,110010,4594],{"className":110011},[4674],[78,110013,19],{"className":110014},[4667,4678],[78,110016,4604],{"className":110017},[4682],[78,110019],{"className":110020,"style":4740},[4739],[78,110022,4609],{"className":110023},[4744],[78,110025],{"className":110026,"style":4740},[4739],[78,110028,110030,110033,110036,110039,110042,110045,110049,110052,110055,110058],{"className":110029},[4658],[78,110031],{"className":110032,"style":4663},[4662],[78,110034,27433],{"className":110035},[4667],[78,110037,5074],{"className":110038,"style":5219},[4667,4678],[78,110040,4594],{"className":110041},[4674],[78,110043,19],{"className":110044},[4667,4678],[78,110046,110048],{"className":110047},[4667],"\u002F2",[78,110050,4604],{"className":110051},[4682],[78,110053],{"className":110054,"style":5143},[4739],[78,110056,7351],{"className":110057},[7450],[78,110059],{"className":110060,"style":5143},[4739],[78,110062,110064,110067,110070,110073,110102],{"className":110063},[4658],[78,110065],{"className":110066,"style":53782},[4662],[78,110068,52274],{"className":110069,"style":17251},[4667,4678],[78,110071,4594],{"className":110072},[4674],[78,110074,110076,110079],{"className":110075},[4667],[78,110077,19],{"className":110078},[4667,4678],[78,110080,110082],{"className":110081},[4689],[78,110083,110085],{"className":110084},[4693],[78,110086,110088],{"className":110087},[4698],[78,110089,110091],{"className":110090,"style":53807},[4702],[78,110092,110093,110096],{"style":5209},[78,110094],{"className":110095,"style":4711},[4710],[78,110097,110099],{"className":110098},[4715,4716,4717,4718],[78,110100,472],{"className":110101},[4667,4718],[78,110103,4604],{"className":110104},[4682],[10548,110106,74072],{"id":110107},"_5",[78,110109,110111],{"className":110110},[4566],[78,110112,110114,110158],{"className":110113},[4570],[78,110115,110117],{"className":110116},[4574],[4576,110118,110119],{"xmlns":4578,"display":4579},[4581,110120,110121,110155],{},[4584,110122,110123,110125,110127,110129,110131,110133,110135,110137,110139,110141,110143,110145,110147,110149,110151,110153],{},[4596,110124,5074],{},[4591,110126,4594],{"stretchy":4593},[4596,110128,19],{},[4591,110130,4604],{"stretchy":4593},[4591,110132,4609],{},[4596,110134,5074],{},[4591,110136,4594],{"stretchy":4593},[4596,110138,19],{},[4596,110140,7102],{"mathvariant":7101},[7077,110142,472],{},[4591,110144,4604],{"stretchy":4593},[4591,110146,7351],{},[4596,110148,54581],{"mathvariant":7101},[4591,110150,4594],{"stretchy":4593},[7077,110152,469],{},[4591,110154,4604],{"stretchy":4593},[4647,110156,110157],{"encoding":4649},"T(n) = T(n\u002F2) + Θ(1)",[78,110159,110161,110188,110218],{"className":110160,"ariaHidden":1419},[4654],[78,110162,110164,110167,110170,110173,110176,110179,110182,110185],{"className":110163},[4658],[78,110165],{"className":110166,"style":4663},[4662],[78,110168,5074],{"className":110169,"style":5219},[4667,4678],[78,110171,4594],{"className":110172},[4674],[78,110174,19],{"className":110175},[4667,4678],[78,110177,4604],{"className":110178},[4682],[78,110180],{"className":110181,"style":4740},[4739],[78,110183,4609],{"className":110184},[4744],[78,110186],{"className":110187,"style":4740},[4739],[78,110189,110191,110194,110197,110200,110203,110206,110209,110212,110215],{"className":110190},[4658],[78,110192],{"className":110193,"style":4663},[4662],[78,110195,5074],{"className":110196,"style":5219},[4667,4678],[78,110198,4594],{"className":110199},[4674],[78,110201,19],{"className":110202},[4667,4678],[78,110204,110048],{"className":110205},[4667],[78,110207,4604],{"className":110208},[4682],[78,110210],{"className":110211,"style":5143},[4739],[78,110213,7351],{"className":110214},[7450],[78,110216],{"className":110217,"style":5143},[4739],[78,110219,110221,110224,110227,110230,110233],{"className":110220},[4658],[78,110222],{"className":110223,"style":4663},[4662],[78,110225,54581],{"className":110226},[4667],[78,110228,4594],{"className":110229},[4674],[78,110231,469],{"className":110232},[4667],[78,110234,4604],{"className":110235},[4682],[23289,110237],{},[7759,110239,110241,110242],{"id":110240},"_2请使用一种程序设计语言描述二叉树的按层次遍历算法该算法的c函数原型规定为templateclass-t-class-func-void-levelorderbtnode-x-func-visit10分","2、请使用一种程序设计语言描述二叉树的按层次遍历算法。该算法的C++函数原型规定为“template\u003Cclass T, class Func> void LevelOrder(BtNode",[5012,110243,110244],{}," *x, Func Visit);”。（10分）",[23289,110246],{},[7759,110248,110250],{"id":110249},"_3请使用一种程序设计语言改写连通图的深度优先遍历算法要求能够计算出每个顶点在深度优先生成树中的层次图使用邻接矩阵表示10分","3、请使用一种程序设计语言改写连通图的深度优先遍历算法，要求能够计算出每个顶点在深度优先生成树中的层次（图使用邻接矩阵表示）。（10分）",[23289,110252],{},[7759,110254,110256],{"id":110255},"_4编写一个使用分枝限界方法生成含-n-个分量的所有排列的子程序该子程序的c函数原型规定为void-permint-n10分","4、编写一个使用分枝限界方法生成含 n 个分量的所有排列的子程序。该子程序的C++函数原型规定为“void Perm(int n);”。（10分）",[23289,110258],{},[107,110260,110262],{"id":110261},"二算法设计题每题10分共6题共60分","二、算法设计题（每题10分，共6题，共60分）",[7759,110264,110266,110267],{"id":110265},"_5使用一种程序设计语言写出选择排序算法的程序升序排列并给出时间复杂性该算法的c函数原型规定为template-void-selectionsortt-x-intn10分","5、使用一种程序设计语言写出选择排序算法的程序（升序排列），并给出时间复杂性。该算法的C++函数原型规定为“template",[34478,110268,110269,110270,110272],{"t":119}," void SelectionSort(T X",[78,110271],{},", intn);”。（10分）",[23289,110274],{},[7759,110276,110278,110279],{"id":110277},"_6请使用一种程序设计语言描述二叉树的按层次遍历算法该算法的c函数原型规定为templateclass-t-class-func-void-levelorderbtnode-x-func-visit10分","6、请使用一种程序设计语言描述二叉树的按层次遍历算法。该算法的C++函数原型规定为“template\u003Cclass T, class Func> void LevelOrder(BtNode",[5012,110280,110244],{},[23289,110282],{},[7759,110284,110286,110287],{"id":110285},"_7使用一种程序设计语言描述最小生成树的prim算法已知g-是具有-n-个顶点的无向加权图matrix是矩阵类型该算法的c函数原型规定为bool-primconst-matrix-g-int-v-vector-prev10分","7、使用一种程序设计语言描述最小生成树的Prim算法。已知：G 是具有 n 个顶点的无向加权图，Matrix是矩阵类型，该算法的C++函数原型规定为“bool Prim(const Matrix",[110288,110289,110290,110291],"double",{}," &G, int v, vector",[51085,110292,110293],{}," &prev);”。（10分）",[23289,110295],{},[7759,110297,110299],{"id":110298},"_8使用一种程序设计语言描述求解01背包问题的动态规划算法并给出时间复杂性假设所使用的程序设计语言已经定义vector和map等数据结构10分","8、使用一种程序设计语言描述求解0\u002F1背包问题的动态规划算法，并给出时间复杂性（假设所使用的程序设计语言已经定义vector和map等数据结构）。（10分）",[23289,110301],{},[7759,110303,110305,110306],{"id":110304},"_9使用一种程序设计语言描述求解旅行商问题输出最优解的回溯算法该算法的c函数原型规定为vector-tspconst-matrix-g10分","9、使用一种程序设计语言描述求解旅行商问题（输出最优解）的回溯算法。该算法的C++函数原型规定为“vector",[51085,110307,110308,110309],{}," TSP(const Matrix",[110288,110310,110311],{}," &G);”。（10分）",[23289,110313],{},[7759,110315,110317,110318],{"id":110316},"_10请为子集和问题是否存在和为t的子集设计一个拉斯维加斯算法该算法的c函数原型规定为bool-setsumconst-vector-w-int-t-vector-x10分","10、请为子集和问题（是否存在和为t的子集）设计一个拉斯维加斯算法。该算法的C++函数原型规定为“bool SetSum(const vector",[51085,110319,110320,110321],{}," &W, int t, vector",[110322,110323,110324],"bool",{}," &X);”。（10分）",[23289,110326],{},[13,110328,110329,110330],{},"写在最后：该押题卷的难度、题型完全依照于样卷的模式，题目则完全依赖于《习题选讲》，也就是说选择其实非常少，不建议各位以试卷作为复习的重点，这份试卷与其说是用来押题，不如说是用来检验各位临考的能力。为了依照样卷模式，牺牲了一定的题目难度，所以这套押题卷其实总体来说可能偏容易？",[25921,110331,110332],{},"（误）",[13,110334,110335],{},"希望大家都能考出自己理想的成绩QWQ！                                                                                                         ——By Alexie-Z-Yevich 2022.5.8",{"title":119,"searchDepth":144,"depth":144,"links":110337},[110338,110345],{"id":109305,"depth":132,"text":109306,"children":110339},[110340,110341,110343,110344],{"id":109309,"depth":144,"text":109310},{"id":110240,"depth":144,"text":110342},"2、请使用一种程序设计语言描述二叉树的按层次遍历算法。该算法的C++函数原型规定为“template\u003Cclass T, class Func> void LevelOrder(BtNode *x, Func Visit);”。（10分）",{"id":110249,"depth":144,"text":110250},{"id":110255,"depth":144,"text":110256},{"id":110261,"depth":132,"text":110262,"children":110346},[110347,110349,110351,110353,110354,110356],{"id":110265,"depth":144,"text":110348},"5、使用一种程序设计语言写出选择排序算法的程序（升序排列），并给出时间复杂性。该算法的C++函数原型规定为“template void SelectionSort(T X, intn);”。（10分）",{"id":110277,"depth":144,"text":110350},"6、请使用一种程序设计语言描述二叉树的按层次遍历算法。该算法的C++函数原型规定为“template\u003Cclass T, class Func> void LevelOrder(BtNode *x, Func Visit);”。（10分）",{"id":110285,"depth":144,"text":110352},"7、使用一种程序设计语言描述最小生成树的Prim算法。已知：G 是具有 n 个顶点的无向加权图，Matrix是矩阵类型，该算法的C++函数原型规定为“bool Prim(const Matrix &G, int v, vector &prev);”。（10分）",{"id":110298,"depth":144,"text":110299},{"id":110304,"depth":144,"text":110355},"9、使用一种程序设计语言描述求解旅行商问题（输出最优解）的回溯算法。该算法的C++函数原型规定为“vector TSP(const Matrix &G);”。（10分）",{"id":110316,"depth":144,"text":110357},"10、请为子集和问题（是否存在和为t的子集）设计一个拉斯维加斯算法。该算法的C++函数原型规定为“bool SetSum(const vector &W, int t, vector &X);”。（10分）",{},"我的大学\u002F大二下学期\u002F算法设计与分析（课程通用）\u002F算法押题卷QWQ.md","\u002Fundergraduate\u002Fnote-f7c8af1fee65",{"title":109263,"description":119},"undergraduate\u002Fnote-f7c8af1fee65",[246],"Na2CCqDwD2AaRNTSzpqExariigjMiQYm4IRZX0gDXO4",{"id":110366,"title":110367,"assetBase":239,"author":8,"body":110368,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":112005,"navigation":128,"originalPath":112006,"path":112007,"seo":112008,"source":23330,"stem":112009,"tags":112010,"weight":250,"__hash__":112011},"content\u002Fundergraduate\u002Fnote-fbe75968a3f8.md","Flume从0到1",{"type":10,"value":110369,"toc":111982},[110370,110375,110379,110381,110384,110388,110393,110397,110400,110404,110419,110441,110445,110448,110459,110463,110466,110474,110478,110481,110483,110487,110491,110510,110514,110617,110637,110641,110671,110674,110677,110680,110683,110686,110690,110710,110713,110930,110933,110937,110951,110954,110993,110998,111001,111003,111007,111011,111016,111019,111022,111033,111036,111050,111082,111115,111118,111122,111127,111132,111156,111175,111179,111185,111347,111351,111354,111503,111507,111510,111515,111519,111817,111821,111907,111912,111914,111918,111922,111926,111929,111932,111936,111939,111945,111948,111951,111954,111958,111965,111968,111972,111975,111980],[72,110371,110372],{},[13,110373,110374],{},"简单介绍下Flume日志采集系统，内容不多大概一天就学完了，但是正所谓学得快忘得也快，所以把其中一些常用的、配置类的内容进行一个记录，方便每次温习。",[107,110376,110378],{"id":110377},"第一章-flume概述","第一章 Flume概述",[7759,110380,62379],{"id":30036},[13,110382,110383],{},"Flume 是 Cloudera 提供的一个高可用的，高可靠的，分布式的海量日志采集、聚合和传输的系统。Flume 基于流式架构，灵活简单。",[7759,110385,110387],{"id":110386},"_2基础架构","2、基础架构",[13,110389,110390],{},[617,110391],{"alt":119,"src":110392},"img\u002FFlume\u002F1.1.png",[10548,110394,110396],{"id":110395},"_1agent","（1）Agent",[13,110398,110399],{},"Agent 是一个 JVM 进程，它以事件的形式将数据从源头送至目的。 Agent 主要有 3 个部分组成，Source、Channel、Sink。",[10548,110401,110403],{"id":110402},"_2source","（2）Source",[13,110405,110406,110407,110410,110411,110414,110415,110418],{},"Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种 格式的日志数据，包括 ",[22,110408,110409],{},"avro","、thrift、",[22,110412,110413],{},"exec","、jms、",[22,110416,110417],{},"spooling directory、netcat、taildir","、 sequence generator、syslog、http、legacy。",[72,110420,110421,110424,110427],{},[13,110422,110423],{},"Arvo是一种数据序列化系统，它是流式处理领域中常用的数据序列化系统之一。它支持多种编程语言，包括Java、Python、C、C++和C#等。Avro格式的数据是二进制的，它可以在不同的平台和语言之间进行交换。Avro格式的数据可以存储在Apache Kafka中，也可以存储在Hadoop中。",[13,110425,110426],{},"Avro格式的数据有以下优点：",[49,110428,110429,110432,110435,110438],{},[52,110430,110431],{},"支持二进制序列化方式，可以便捷、快速地处理大量数据。",[52,110433,110434],{},"动态语言友好，Avro提供的机制使动态语言可以方便地处理Avro数据。",[52,110436,110437],{},"可排序的，这使得Avro格式的数据可以更容易地进行排序操作。",[52,110439,110440],{},"可扩展性强，Avro格式的数据可以很容易地进行扩展，而不需要修改现有的数据结构。",[10548,110442,110444],{"id":110443},"_3sink","（3）Sink",[13,110446,110447],{},"Sink 不断地轮询 Channel 中的事件且批量地移除它们，并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。",[13,110449,110450,110451,110454,110455,110458],{},"Sink 组件目的地包括 ",[22,110452,110453],{},"hdfs、logger、avro","、thrift、ipc、",[22,110456,110457],{},"file、HBase","、solr、自定义。",[10548,110460,110462],{"id":110461},"_4channnel","（4）Channnel",[13,110464,110465],{},"Channel 是位于 Source 和 Sink 之间的缓冲区。因此，Channel 允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的，可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。 Flume 自带两种 Channel：Memory Channel 和 File Channel。",[49,110467,110468,110471],{},[52,110469,110470],{},"Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适 用。如果需要关心数据丢失，那么 Memory Channel 就不应该使用，因为程序死亡、机器宕 机或者重启都会导致数据丢失。",[52,110472,110473],{},"File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。",[10548,110475,110477],{"id":110476},"_5event","（5）Event",[13,110479,110480],{},"传输单元，Flume 数据传输的基本单元，以 Event 的形式将数据从源头送至目的地。 Event 由 Header 和 Body 两部分组成，Header 用来存放该 event 的一些属性，为 K-V 结构， Body 用来存放该条数据，形式为字节数组。",[23289,110482],{},[107,110484,110486],{"id":110485},"第二章-flume入门","第二章 Flume入门",[7759,110488,110490],{"id":110489},"_1案例一","1、案例一",[72,110492,110493,110496,110499],{},[13,110494,110495],{},"从官方案例入手，详解Flume配置文件的构成。",[13,110497,110498],{},"需求分析：",[49,110500,110501,110504,110507],{},[52,110502,110503],{},"通过netcat工具向本机的44444端口发送数据",[52,110505,110506],{},"Flume监控本机的44444端口，通过Flume的source端读取数据",[52,110508,110509],{},"Flume将获取的数据通过Sink端打印到控制台",[10548,110511,110513],{"id":110512},"_1配置文件","（1）配置文件",[114,110515,110517],{"className":33493,"code":110516,"language":33495,"meta":119,"style":119},"# Name the components on this agent\na1.sources = r1\na1.sinks = k1\na1.channels = c1\n\n# Describe\u002Fconfigure the source\na1.sources.r1.type = netcat\na1.sources.r1.bind = localhost\na1.sources.r1.port = 44444\n\n# Describe the sink\na1.sinks.k1.type = logger\n\n# Use a channel which buffers events in memory\na1.channels.c1.type = memory\na1.channels.c1.capacity = 1000\na1.channels.c1.transactionCapacity = 100\n\n# Bind the source and sink to the channel\na1.sources.r1.channels = c1\na1.sinks.k1.channel = c1\n",[17,110518,110519,110524,110528,110533,110537,110541,110546,110551,110556,110561,110565,110570,110575,110579,110584,110589,110594,110599,110603,110608,110612],{"__ignoreMap":119},[78,110520,110521],{"class":124,"line":125},[78,110522,110523],{},"# Name the components on this agent\n",[78,110525,110526],{"class":124,"line":132},[78,110527,44357],{},[78,110529,110530],{"class":124,"line":138},[78,110531,110532],{},"a1.sinks = k1\n",[78,110534,110535],{"class":124,"line":144},[78,110536,44362],{},[78,110538,110539],{"class":124,"line":150},[78,110540,129],{"emptyLinePlaceholder":128},[78,110542,110543],{"class":124,"line":156},[78,110544,110545],{},"# Describe\u002Fconfigure the source\n",[78,110547,110548],{"class":124,"line":162},[78,110549,110550],{},"a1.sources.r1.type = netcat\n",[78,110552,110553],{"class":124,"line":168},[78,110554,110555],{},"a1.sources.r1.bind = localhost\n",[78,110557,110558],{"class":124,"line":174},[78,110559,110560],{},"a1.sources.r1.port = 44444\n",[78,110562,110563],{"class":124,"line":180},[78,110564,129],{"emptyLinePlaceholder":128},[78,110566,110567],{"class":124,"line":186},[78,110568,110569],{},"# Describe the sink\n",[78,110571,110572],{"class":124,"line":192},[78,110573,110574],{},"a1.sinks.k1.type = logger\n",[78,110576,110577],{"class":124,"line":198},[78,110578,129],{"emptyLinePlaceholder":128},[78,110580,110581],{"class":124,"line":204},[78,110582,110583],{},"# Use a channel which buffers events in memory\n",[78,110585,110586],{"class":124,"line":210},[78,110587,110588],{},"a1.channels.c1.type = memory\n",[78,110590,110591],{"class":124,"line":216},[78,110592,110593],{},"a1.channels.c1.capacity = 1000\n",[78,110595,110596],{"class":124,"line":222},[78,110597,110598],{},"a1.channels.c1.transactionCapacity = 100\n",[78,110600,110601],{"class":124,"line":421},[78,110602,129],{"emptyLinePlaceholder":128},[78,110604,110605],{"class":124,"line":427},[78,110606,110607],{},"# Bind the source and sink to the channel\n",[78,110609,110610],{"class":124,"line":433},[78,110611,44444],{},[78,110613,110614],{"class":124,"line":2443},[78,110615,110616],{},"a1.sinks.k1.channel = c1\n",[72,110618,110619,110622,110625,110628,110631,110634],{},[13,110620,110621],{},"我们将配置文件分为5个部分：",[13,110623,110624],{},"（1）配置命名：a1表示agent的名字；r1表示a1的source的名字，因为可以命名多个，所以这里是sources；k1是sink的名字，同理可以一次命名多个；c1是channel的名字。",[13,110626,110627],{},"（2）配置source：source用做接收输入数据，所以首先配置的是输入数据来源type，其他配置则根据官方文档中的黑体进行配置，比如这里来源是netcat，需要配置监听主机和端口号。",[13,110629,110630],{},"（3）配置sink：sink用作输出数据，同样首先需要配置输出源type，其他配置同上，这里是输出到控制台所以没有其他配置。",[13,110632,110633],{},"（4）配置channel：配置channel的类型，主要为第一章说的memory内存型和file文件型；capacity和transactionCapacity代表event的总容量和单个事务的容量，transactionCapacity不能大于capacity否则事务回滚是无效的。",[13,110635,110636],{},"（5）绑定：将配置好的source和sink与channel进行绑定。其中：一个source可以输出到多个channel，但是一个sink只能接收一个channel的数据（但是一个channel可以将数据分发给不同的sink，需要建组实现）",[10548,110638,110640],{"id":110639},"_2启动代码","（2）启动代码",[114,110642,110644],{"className":33493,"code":110643,"language":33495,"meta":119,"style":119},"# flume主目录下\n# 写法一：\nbin\u002Fflume-ng agent --conf conf\u002F --name a1 --conf-file job\u002Fflume-netcat-logger.conf -Dflume.root.logger=INFO,console\n# 写法二：\nbin\u002Fflume-ng agent -c conf\u002F -n a1 -f job\u002Fflume-netcat-logger.conf -Dflume.root.logger=INFO,console\n",[17,110645,110646,110651,110656,110661,110666],{"__ignoreMap":119},[78,110647,110648],{"class":124,"line":125},[78,110649,110650],{},"# flume主目录下\n",[78,110652,110653],{"class":124,"line":132},[78,110654,110655],{},"# 写法一：\n",[78,110657,110658],{"class":124,"line":138},[78,110659,110660],{},"bin\u002Fflume-ng agent --conf conf\u002F --name a1 --conf-file job\u002Fflume-netcat-logger.conf -Dflume.root.logger=INFO,console\n",[78,110662,110663],{"class":124,"line":144},[78,110664,110665],{},"# 写法二：\n",[78,110667,110668],{"class":124,"line":150},[78,110669,110670],{},"bin\u002Fflume-ng agent -c conf\u002F -n a1 -f job\u002Fflume-netcat-logger.conf -Dflume.root.logger=INFO,console\n",[13,110672,110673],{},"参数说明：",[13,110675,110676],{},"--conf\u002F-c：表示配置文件存储在 conf\u002F目录",[13,110678,110679],{},"--name\u002F-n：表示给 agent 起名为 a1",[13,110681,110682],{},"--conf-file\u002F-f：flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf 文件。",[13,110684,110685],{},"-Dflume.root.logger=INFO,console ：-D 表示 flume 运行时动态修改 flume.root.logger 参数属性值，并将控制台日志打印级别设置为 INFO 级别。日志级别包括:log、info、warn、 error。",[7759,110687,110689],{"id":110688},"_2案例二","2、案例二",[72,110691,110692,110697,110699],{},[13,110693,110694],{},[22,110695,110696],{},"使用 Flume 监听整个目录的文件，并上传至 HDFS",[13,110698,110498],{},[49,110700,110701,110704,110707],{},[52,110702,110703],{},"向指定目录中添加文件",[52,110705,110706],{},"查看HDFS 上数据",[52,110708,110709],{},"查看\u002Fopt\u002Fmodule\u002Fflume\u002Fupload 目录中上传的文件是否已经标记 为.COMPLETED结尾；.tmp后缀 结尾文件没有上传。",[10548,110711,110513],{"id":110712},"_1配置文件-1",[114,110714,110716],{"className":33493,"code":110715,"language":33495,"meta":119,"style":119},"a3.sources = r3\na3.sinks = k3\na3.channels = c3\n\n# Describe\u002Fconfigure the source\na3.sources.r3.type = spooldir\na3.sources.r3.spoolDir = \u002Fopt\u002Fmodule\u002Fflume\u002Fupload\na3.sources.r3.fileSuffix = .COMPLETED\na3.sources.r3.fileHeader = true\n\n#忽略所有以.tmp 结尾的文件，不上传\na3.sources.r3.ignorePattern = ([^ ]*\\.tmp)\n# Describe the sink\na3.sinks.k3.type = hdfs\na3.sinks.k3.hdfs.path = hdfs:\u002F\u002Fhadoop102:9820\u002Fflume\u002Fupload\u002F%Y%m%d\u002F%H\n#上传文件的前缀\na3.sinks.k3.hdfs.filePrefix = upload-\n#是否按照时间滚动文件夹\na3.sinks.k3.hdfs.round = true\n#多少时间单位创建一个新的文件夹\na3.sinks.k3.hdfs.roundValue = 1\n#重新定义时间单位\na3.sinks.k3.hdfs.roundUnit = hour\n#是否使用本地时间戳\na3.sinks.k3.hdfs.useLocalTimeStamp = true\n#积攒多少个 Event 才 flush 到 HDFS 一次\na3.sinks.k3.hdfs.batchSize = 100\n#设置文件类型，可支持压缩\na3.sinks.k3.hdfs.fileType = DataStream\n#多久生成一个新的文件\na3.sinks.k3.hdfs.rollInterval = 60\n#设置每个文件的滚动大小大概是 128M\na3.sinks.k3.hdfs.rollSize = 134217700\n#文件的滚动与 Event 数量无关\na3.sinks.k3.hdfs.rollCount = 0\n\n# Use a channel which buffers events in memory\na3.channels.c3.type = memory\na3.channels.c3.capacity = 1000\na3.channels.c3.transactionCapacity = 100\n\n# Bind the source and sink to the channel\na3.sources.r3.channels = c3\na3.sinks.k3.channel = c3\n",[17,110717,110718,110723,110728,110733,110737,110741,110746,110751,110756,110761,110765,110770,110775,110779,110784,110789,110794,110799,110804,110809,110814,110819,110824,110829,110834,110839,110844,110849,110854,110859,110864,110869,110874,110879,110884,110889,110893,110897,110902,110907,110912,110916,110920,110925],{"__ignoreMap":119},[78,110719,110720],{"class":124,"line":125},[78,110721,110722],{},"a3.sources = r3\n",[78,110724,110725],{"class":124,"line":132},[78,110726,110727],{},"a3.sinks = k3\n",[78,110729,110730],{"class":124,"line":138},[78,110731,110732],{},"a3.channels = c3\n",[78,110734,110735],{"class":124,"line":144},[78,110736,129],{"emptyLinePlaceholder":128},[78,110738,110739],{"class":124,"line":150},[78,110740,110545],{},[78,110742,110743],{"class":124,"line":156},[78,110744,110745],{},"a3.sources.r3.type = spooldir\n",[78,110747,110748],{"class":124,"line":162},[78,110749,110750],{},"a3.sources.r3.spoolDir = \u002Fopt\u002Fmodule\u002Fflume\u002Fupload\n",[78,110752,110753],{"class":124,"line":168},[78,110754,110755],{},"a3.sources.r3.fileSuffix = .COMPLETED\n",[78,110757,110758],{"class":124,"line":174},[78,110759,110760],{},"a3.sources.r3.fileHeader = true\n",[78,110762,110763],{"class":124,"line":180},[78,110764,129],{"emptyLinePlaceholder":128},[78,110766,110767],{"class":124,"line":186},[78,110768,110769],{},"#忽略所有以.tmp 结尾的文件，不上传\n",[78,110771,110772],{"class":124,"line":192},[78,110773,110774],{},"a3.sources.r3.ignorePattern = ([^ ]*\\.tmp)\n",[78,110776,110777],{"class":124,"line":198},[78,110778,110569],{},[78,110780,110781],{"class":124,"line":204},[78,110782,110783],{},"a3.sinks.k3.type = hdfs\n",[78,110785,110786],{"class":124,"line":210},[78,110787,110788],{},"a3.sinks.k3.hdfs.path = hdfs:\u002F\u002Fhadoop102:9820\u002Fflume\u002Fupload\u002F%Y%m%d\u002F%H\n",[78,110790,110791],{"class":124,"line":216},[78,110792,110793],{},"#上传文件的前缀\n",[78,110795,110796],{"class":124,"line":222},[78,110797,110798],{},"a3.sinks.k3.hdfs.filePrefix = upload-\n",[78,110800,110801],{"class":124,"line":421},[78,110802,110803],{},"#是否按照时间滚动文件夹\n",[78,110805,110806],{"class":124,"line":427},[78,110807,110808],{},"a3.sinks.k3.hdfs.round = true\n",[78,110810,110811],{"class":124,"line":433},[78,110812,110813],{},"#多少时间单位创建一个新的文件夹\n",[78,110815,110816],{"class":124,"line":2443},[78,110817,110818],{},"a3.sinks.k3.hdfs.roundValue = 1\n",[78,110820,110821],{"class":124,"line":2448},[78,110822,110823],{},"#重新定义时间单位\n",[78,110825,110826],{"class":124,"line":2454},[78,110827,110828],{},"a3.sinks.k3.hdfs.roundUnit = hour\n",[78,110830,110831],{"class":124,"line":2460},[78,110832,110833],{},"#是否使用本地时间戳\n",[78,110835,110836],{"class":124,"line":2465},[78,110837,110838],{},"a3.sinks.k3.hdfs.useLocalTimeStamp = true\n",[78,110840,110841],{"class":124,"line":2470},[78,110842,110843],{},"#积攒多少个 Event 才 flush 到 HDFS 一次\n",[78,110845,110846],{"class":124,"line":2903},[78,110847,110848],{},"a3.sinks.k3.hdfs.batchSize = 100\n",[78,110850,110851],{"class":124,"line":2909},[78,110852,110853],{},"#设置文件类型，可支持压缩\n",[78,110855,110856],{"class":124,"line":11477},[78,110857,110858],{},"a3.sinks.k3.hdfs.fileType = DataStream\n",[78,110860,110861],{"class":124,"line":13374},[78,110862,110863],{},"#多久生成一个新的文件\n",[78,110865,110866],{"class":124,"line":13380},[78,110867,110868],{},"a3.sinks.k3.hdfs.rollInterval = 60\n",[78,110870,110871],{"class":124,"line":13386},[78,110872,110873],{},"#设置每个文件的滚动大小大概是 128M\n",[78,110875,110876],{"class":124,"line":13722},[78,110877,110878],{},"a3.sinks.k3.hdfs.rollSize = 134217700\n",[78,110880,110881],{"class":124,"line":13727},[78,110882,110883],{},"#文件的滚动与 Event 数量无关\n",[78,110885,110886],{"class":124,"line":13953},[78,110887,110888],{},"a3.sinks.k3.hdfs.rollCount = 0\n",[78,110890,110891],{"class":124,"line":13958},[78,110892,129],{"emptyLinePlaceholder":128},[78,110894,110895],{"class":124,"line":13964},[78,110896,110583],{},[78,110898,110899],{"class":124,"line":13969},[78,110900,110901],{},"a3.channels.c3.type = memory\n",[78,110903,110904],{"class":124,"line":24170},[78,110905,110906],{},"a3.channels.c3.capacity = 1000\n",[78,110908,110909],{"class":124,"line":24175},[78,110910,110911],{},"a3.channels.c3.transactionCapacity = 100\n",[78,110913,110914],{"class":124,"line":24180},[78,110915,129],{"emptyLinePlaceholder":128},[78,110917,110918],{"class":124,"line":24186},[78,110919,110607],{},[78,110921,110922],{"class":124,"line":24192},[78,110923,110924],{},"a3.sources.r3.channels = c3\n",[78,110926,110927],{"class":124,"line":24198},[78,110928,110929],{},"a3.sinks.k3.channel = c3\n",[13,110931,110932],{},"**说明：**在使用 Spooling Directory Source 时，不要在监控目录中创建并持续修改文 件；上传完成的文件会以.COMPLETED 结尾；被监控文件夹每 500 毫秒扫描一次文件变动。",[7759,110934,110936],{"id":110935},"_3案例三","3、案例三",[72,110938,110939,110942,110944],{},[13,110940,110941],{},"使用 Flume 监听整个目录的实时追加文件，并上传至 HDFS",[13,110943,110498],{},[49,110945,110946,110949],{},[52,110947,110948],{},"向监控文件追加内容 echo hello >> files\u002Ffile1.txt 、 echo hello >> files\u002Ffile2.txt",[52,110950,110706],{},[13,110952,110953],{},"Exec source 适用于监控一个实时追加的文件，不能实现断点续传；Spooldir Source 适合用于同步新文件，但不适合对实时追加日志的文件进行监听并同步；而 Taildir Source 适合用于监听多个实时追加的文件，并且能够实现断点续传。",[114,110955,110957],{"className":33493,"code":110956,"language":33495,"meta":119,"style":119},"# 主要修改为source部分，故只记录source部分配置\n# Describe\u002Fconfigure the source\na3.sources.r3.type = TAILDIR\na3.sources.r3.positionFile = \u002Fopt\u002Fmodule\u002Fflume\u002Ftail_dir.json\na3.sources.r3.filegroups = f1 f2\na3.sources.r3.filegroups.f1 = \u002Fopt\u002Fmodule\u002Fflume\u002Ffiles\u002F.*file.*\na3.sources.r3.filegroups.f2 = \u002Fopt\u002Fmodule\u002Fflume\u002Ffiles2\u002F.*log.*\n",[17,110958,110959,110964,110968,110973,110978,110983,110988],{"__ignoreMap":119},[78,110960,110961],{"class":124,"line":125},[78,110962,110963],{},"# 主要修改为source部分，故只记录source部分配置\n",[78,110965,110966],{"class":124,"line":132},[78,110967,110545],{},[78,110969,110970],{"class":124,"line":138},[78,110971,110972],{},"a3.sources.r3.type = TAILDIR\n",[78,110974,110975],{"class":124,"line":144},[78,110976,110977],{},"a3.sources.r3.positionFile = \u002Fopt\u002Fmodule\u002Fflume\u002Ftail_dir.json\n",[78,110979,110980],{"class":124,"line":150},[78,110981,110982],{},"a3.sources.r3.filegroups = f1 f2\n",[78,110984,110985],{"class":124,"line":156},[78,110986,110987],{},"a3.sources.r3.filegroups.f1 = \u002Fopt\u002Fmodule\u002Fflume\u002Ffiles\u002F.*file.*\n",[78,110989,110990],{"class":124,"line":162},[78,110991,110992],{},"a3.sources.r3.filegroups.f2 = \u002Fopt\u002Fmodule\u002Fflume\u002Ffiles2\u002F.*log.*\n",[13,110994,110995,110997],{},[22,110996,2047],{},".*类似于通配符（占位符），代表可以有0~任意个字符在占位。",[13,110999,111000],{},"Taildir Source 维护了一个 json 格式的 position File，其会定期的往 position File 中更新每个文件读取到的最新的位置，因此能够实现断点续传。",[23289,111002],{},[107,111004,111006],{"id":111005},"第三章-flume进阶","第三章 Flume进阶",[7759,111008,111010],{"id":111009},"_1事务","1、事务",[13,111012,111013],{},[617,111014],{"alt":119,"src":111015},"img\u002FFlume\u002F3.1.png",[13,111017,111018],{},"Flume的事务有put和take机制，两者保证数据传输的准确性。Put事务是指从Source到Channel，Take事务是指从Channel到Sink。¹²³",[13,111020,111021],{},"Put事务流程如下：",[49,111023,111024,111027,111030],{},[52,111025,111026],{},"将数据从source写入临时缓冲区putList。",[52,111028,111029],{},"检查Channel内存队列是否足够合并。",[52,111031,111032],{},"如果内存队列空间不足，则回滚数据。",[13,111034,111035],{},"Take事务流程如下：",[49,111037,111038,111041,111044,111047],{},[52,111039,111040],{},"sink不断从channel中拉取event，没拉取一个event，这个event会先放入takeList中。",[52,111042,111043],{},"当一个batchSize的event全部拉取到takeList中之后，此时由sink执行写出处理。",[52,111045,111046],{},"假如在写出过程中，发送了异常，此时执行回滚。",[52,111048,111049],{},"将takeList中所有的event全部回滚到channel。",[72,111051,111052,111058,111061],{},[13,111053,111054,111057],{},[22,111055,111056],{},"Put事务","开始的时候会调用一个doPut方法，doPut方法的会将这批数据batch data，也就是一批event放到putList中。（doPut传递的数据的大小可以通过参数bathchSize配置。putList的大小则通过channel的参数transactionCapacity进行配置。）",[13,111059,111060],{},"当数据成功存放到putList之后，调用doCommit()方法,putList中所有的event进入channel()中，",[49,111062,111063,111066],{},[52,111064,111065],{},"成功则清空putList.",[52,111067,111068,111069],{},"不成功的情况",[49,111070,111071,111079],{},[52,111072,111073,111074,111076],{},"从putList传输到channel过程出问题，在doCommit提交之后，事务在向channel放的过程中，遇到问题。例如：sink那边取数据速度要比Source这边放数据速度慢，导致channel中的数据积压，这个时候就会造成putList中的数据放不进去。这时会进行事务的回滚操作，调用doRollback方法，doRollback方法会做两个事情：\n1、清空putList中的数据；\n2、抛出channelException异常。",[2996,111075],{},[22,111077,111078],{},"当source捕捉到doRollback抛出的异常，就会把刚才的一批数据重新采集一下，采集完之后重新走事务的流程。",[52,111080,111081],{},"在数据采集的过程中也有可能出现问题，同样是调用doRollback方法来对事务进行回滚。",[72,111083,111084,111090,111093],{},[13,111085,111086,111089],{},[22,111087,111088],{},"Take事务","开始时，调用doTake方法,将channel中的event提取到(剪切)takeList中，如果后面的sink是HDFS Sink，同时在写入HDFS的IO缓冲流中放一份event。",[13,111091,111092],{},"当takeList中存放的Event达到约定数量(batchSize) ，就会调用doCommit方法：",[49,111094,111095,111098],{},[52,111096,111097],{},"成功执行情况下：如果是HDFS Sink，那么手动调用IO流的flush方法，将IO流缓冲区的数据写入到HDFS磁盘中，同时清空takeList中的数据",[52,111099,111100,111101],{},"失败情况下:",[49,111102,111103,111109],{},[52,111104,111105,111106,67],{},"1.网络延迟等原因导致传输数据失败：调用doRollback方法来进行回滚，takeList中还有备份数据，所以",[22,111107,111108],{},"将takeList中的数据原封不动地还给channel，这时候就完成了事务的回滚",[52,111110,111111,111112],{},"2.如果takeList数据有一部分传输成功了，剩下的因为网络延迟传输失败了：同样会调用doRollback方法来进行回滚，它会把整个takeList中的数据返回给channel，然后继续进行数据的读写。如此一来，",[22,111113,111114],{},"再次进行事务时候，就会存在数据重复的可能。",[13,111116,111117],{},"总结来说就是：Put事务会在回滚的时候丢弃原本采集到的数据并进行重新采集；Take事务会将sink中已经拿到的event组成逆序队列还给channel，如果出现写了一半的情况，会将一整个全部还给channel，这样会导致数据可能重复。",[7759,111119,111121],{"id":111120},"_2agent内部原理","2、Agent内部原理",[13,111123,111124],{},[617,111125],{"alt":119,"src":111126},"img\u002FFlume\u002F3.2.png",[13,111128,111129],{},[22,111130,111131],{},"重要组件：",[49,111133,111134,111145],{},[52,111135,111136,111137],{},"ChannelSelector\n",[49,111138,111139,111142],{},[52,111140,111141],{},"ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型， 分别是 Replicating（复制）和 Multiplexing（多路复用）。",[52,111143,111144],{},"ReplicatingSelector 会将同一个 Event 发往所有的 Channel，Multiplexing 会根据相 应的原则，将不同的 Event 发往不同的 Channel。",[52,111146,111147,111148],{},"SinkProcessor\n",[49,111149,111150,111153],{},[52,111151,111152],{},"SinkProcessor 共 有 三 种 类 型 ， 分 别 是 DefaultSinkProcessor （默认）、 LoadBalancingSinkProcessor（负载均衡） 和 FailoverSinkProcessor （故障转移）",[52,111154,111155],{},"DefaultSinkProcessor 对 应 的 是 单 个 的 Sink ， LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是 Sink Group，LoadBalancingSinkProcessor 可以实现负 载均衡的功能，FailoverSinkProcessor 可以错误恢复的功能。",[72,111157,111158,111161],{},[13,111159,111160],{},"完整的Flume Agent流程并不止有Source、Channel、Sink三个部分，正确的流程包括：",[49,111162,111163,111166,111169,111172],{},[52,111164,111165],{},"Source读取数据并发送给Channel Processor",[52,111167,111168],{},"Channel Processor将数据发给Channel Interceptor进行（条件）过滤，过滤完回到Channel Processor",[52,111170,111171],{},"Channel Processor将数据交给Channel Selector，按条件分发到各个Channel上",[52,111173,111174],{},"各个Channel上的数据由SinkProcessor进行汇总，并确定分发到不同的Sink",[7759,111176,111178],{"id":111177},"_3详解channelselector复制","3、详解ChannelSelector复制",[13,111180,111181,111182],{},"使用 Flume-1 监控文件变动，Flume-1 将变动内容传递给 Flume-2，Flume-2 负责存储 到 HDFS。同时 Flume-1 将变动内容传递给 Flume-3，Flume-3 负责输出到 Local  FileSystem。",[22,111183,111184],{},"实现单数据源多出口。",[114,111186,111188],{"className":33493,"code":111187,"language":33495,"meta":119,"style":119},"# 主要代码（Flume-1）\n# Name the components on this agent\na1.sources = r1\na1.sinks = k1 k2\na1.channels = c1 c2\n# 将数据流复制给所有 channel\na1.sources.r1.selector.type = replicating  # 区别只在于对selector的类型进行了设置\n\n# Describe\u002Fconfigure the source\na1.sources.r1.type = exec\na1.sources.r1.command = tail -F \u002Fopt\u002Fmodule\u002Fhive\u002Flogs\u002Fhive.log\na1.sources.r1.shell = \u002Fbin\u002Fbash -c\n\n# Describe the sink\n# sink 端的 avro 是一个数据发送者\na1.sinks.k1.type = avro\na1.sinks.k1.hostname = hadoop102\na1.sinks.k1.port = 4141\na1.sinks.k2.type = avro\na1.sinks.k2.hostname = hadoop102\na1.sinks.k2.port = 4142\n\n# Describe the channel\na1.channels.c1.type = memory\na1.channels.c1.capacity = 1000\na1.channels.c1.transactionCapacity = 100\na1.channels.c2.type = memory\na1.channels.c2.capacity = 1000\na1.channels.c2.transactionCapacity = 100\n\n# Bind the source and sink to the channel\na1.sources.r1.channels = c1 c2\na1.sinks.k1.channel = c1\na1.sinks.k2.channel = c2\n",[17,111189,111190,111195,111199,111203,111208,111213,111218,111223,111227,111231,111236,111241,111246,111250,111254,111259,111264,111269,111274,111279,111284,111289,111293,111298,111302,111306,111310,111315,111320,111325,111329,111333,111338,111342],{"__ignoreMap":119},[78,111191,111192],{"class":124,"line":125},[78,111193,111194],{},"# 主要代码（Flume-1）\n",[78,111196,111197],{"class":124,"line":132},[78,111198,110523],{},[78,111200,111201],{"class":124,"line":138},[78,111202,44357],{},[78,111204,111205],{"class":124,"line":144},[78,111206,111207],{},"a1.sinks = k1 k2\n",[78,111209,111210],{"class":124,"line":150},[78,111211,111212],{},"a1.channels = c1 c2\n",[78,111214,111215],{"class":124,"line":156},[78,111216,111217],{},"# 将数据流复制给所有 channel\n",[78,111219,111220],{"class":124,"line":162},[78,111221,111222],{},"a1.sources.r1.selector.type = replicating  # 区别只在于对selector的类型进行了设置\n",[78,111224,111225],{"class":124,"line":168},[78,111226,129],{"emptyLinePlaceholder":128},[78,111228,111229],{"class":124,"line":174},[78,111230,110545],{},[78,111232,111233],{"class":124,"line":180},[78,111234,111235],{},"a1.sources.r1.type = exec\n",[78,111237,111238],{"class":124,"line":186},[78,111239,111240],{},"a1.sources.r1.command = tail -F \u002Fopt\u002Fmodule\u002Fhive\u002Flogs\u002Fhive.log\n",[78,111242,111243],{"class":124,"line":192},[78,111244,111245],{},"a1.sources.r1.shell = \u002Fbin\u002Fbash -c\n",[78,111247,111248],{"class":124,"line":198},[78,111249,129],{"emptyLinePlaceholder":128},[78,111251,111252],{"class":124,"line":204},[78,111253,110569],{},[78,111255,111256],{"class":124,"line":210},[78,111257,111258],{},"# sink 端的 avro 是一个数据发送者\n",[78,111260,111261],{"class":124,"line":216},[78,111262,111263],{},"a1.sinks.k1.type = avro\n",[78,111265,111266],{"class":124,"line":222},[78,111267,111268],{},"a1.sinks.k1.hostname = hadoop102\n",[78,111270,111271],{"class":124,"line":421},[78,111272,111273],{},"a1.sinks.k1.port = 4141\n",[78,111275,111276],{"class":124,"line":427},[78,111277,111278],{},"a1.sinks.k2.type = avro\n",[78,111280,111281],{"class":124,"line":433},[78,111282,111283],{},"a1.sinks.k2.hostname = hadoop102\n",[78,111285,111286],{"class":124,"line":2443},[78,111287,111288],{},"a1.sinks.k2.port = 4142\n",[78,111290,111291],{"class":124,"line":2448},[78,111292,129],{"emptyLinePlaceholder":128},[78,111294,111295],{"class":124,"line":2454},[78,111296,111297],{},"# Describe the channel\n",[78,111299,111300],{"class":124,"line":2460},[78,111301,110588],{},[78,111303,111304],{"class":124,"line":2465},[78,111305,110593],{},[78,111307,111308],{"class":124,"line":2470},[78,111309,110598],{},[78,111311,111312],{"class":124,"line":2903},[78,111313,111314],{},"a1.channels.c2.type = memory\n",[78,111316,111317],{"class":124,"line":2909},[78,111318,111319],{},"a1.channels.c2.capacity = 1000\n",[78,111321,111322],{"class":124,"line":11477},[78,111323,111324],{},"a1.channels.c2.transactionCapacity = 100\n",[78,111326,111327],{"class":124,"line":13374},[78,111328,129],{"emptyLinePlaceholder":128},[78,111330,111331],{"class":124,"line":13380},[78,111332,110607],{},[78,111334,111335],{"class":124,"line":13386},[78,111336,111337],{},"a1.sources.r1.channels = c1 c2\n",[78,111339,111340],{"class":124,"line":13722},[78,111341,110616],{},[78,111343,111344],{"class":124,"line":13727},[78,111345,111346],{},"a1.sinks.k2.channel = c2\n",[7759,111348,111350],{"id":111349},"_4详解sinkprocessor故障转移","4、详解SinkProcessor故障转移",[13,111352,111353],{},"使用 Flume1 监控一个端口，其 sink 组中的 sink 分别对接 Flume2 和 Flume3，采用 FailoverSinkProcessor，实现故障转移的功能。",[114,111355,111357],{"className":33493,"code":111356,"language":33495,"meta":119,"style":119},"# 主要代码（Flume1）\n# Name the components on this agent\na1.sources = r1\na1.channels = c1\na1.sinkgroups = g1\na1.sinks = k1 k2\n\n# Describe\u002Fconfigure the source\na1.sources.r1.type = netcat\na1.sources.r1.bind = localhost\na1.sources.r1.port = 44444\na1.sinkgroups.g1.processor.type = failover  # 主要区别在于采用processor类型\na1.sinkgroups.g1.processor.priority.k1 = 5  # 设置优先级实现动态调整（负载均衡也可）\na1.sinkgroups.g1.processor.priority.k2 = 10\na1.sinkgroups.g1.processor.maxpenalty = 10000\n\n# Describe the sink\na1.sinks.k1.type = avro\na1.sinks.k1.hostname = hadoop102\na1.sinks.k1.port = 4141\na1.sinks.k2.type = avro\na1.sinks.k2.hostname = hadoop102\na1.sinks.k2.port = 4142\n\n# Describe the channel\na1.channels.c1.type = memory\na1.channels.c1.capacity = 1000\na1.channels.c1.transactionCapacity = 100\n\n# Bind the source and sink to the channel\na1.sources.r1.channels = c1\na1.sinkgroups.g1.sinks = k1 k2\na1.sinks.k1.channel = c1\na1.sinks.k2.channel = c1\n",[17,111358,111359,111364,111368,111372,111376,111381,111385,111389,111393,111397,111401,111405,111410,111415,111420,111425,111429,111433,111437,111441,111445,111449,111453,111457,111461,111465,111469,111473,111477,111481,111485,111489,111494,111498],{"__ignoreMap":119},[78,111360,111361],{"class":124,"line":125},[78,111362,111363],{},"# 主要代码（Flume1）\n",[78,111365,111366],{"class":124,"line":132},[78,111367,110523],{},[78,111369,111370],{"class":124,"line":138},[78,111371,44357],{},[78,111373,111374],{"class":124,"line":144},[78,111375,44362],{},[78,111377,111378],{"class":124,"line":150},[78,111379,111380],{},"a1.sinkgroups = g1\n",[78,111382,111383],{"class":124,"line":156},[78,111384,111207],{},[78,111386,111387],{"class":124,"line":162},[78,111388,129],{"emptyLinePlaceholder":128},[78,111390,111391],{"class":124,"line":168},[78,111392,110545],{},[78,111394,111395],{"class":124,"line":174},[78,111396,110550],{},[78,111398,111399],{"class":124,"line":180},[78,111400,110555],{},[78,111402,111403],{"class":124,"line":186},[78,111404,110560],{},[78,111406,111407],{"class":124,"line":192},[78,111408,111409],{},"a1.sinkgroups.g1.processor.type = failover  # 主要区别在于采用processor类型\n",[78,111411,111412],{"class":124,"line":198},[78,111413,111414],{},"a1.sinkgroups.g1.processor.priority.k1 = 5  # 设置优先级实现动态调整（负载均衡也可）\n",[78,111416,111417],{"class":124,"line":204},[78,111418,111419],{},"a1.sinkgroups.g1.processor.priority.k2 = 10\n",[78,111421,111422],{"class":124,"line":210},[78,111423,111424],{},"a1.sinkgroups.g1.processor.maxpenalty = 10000\n",[78,111426,111427],{"class":124,"line":216},[78,111428,129],{"emptyLinePlaceholder":128},[78,111430,111431],{"class":124,"line":222},[78,111432,110569],{},[78,111434,111435],{"class":124,"line":421},[78,111436,111263],{},[78,111438,111439],{"class":124,"line":427},[78,111440,111268],{},[78,111442,111443],{"class":124,"line":433},[78,111444,111273],{},[78,111446,111447],{"class":124,"line":2443},[78,111448,111278],{},[78,111450,111451],{"class":124,"line":2448},[78,111452,111283],{},[78,111454,111455],{"class":124,"line":2454},[78,111456,111288],{},[78,111458,111459],{"class":124,"line":2460},[78,111460,129],{"emptyLinePlaceholder":128},[78,111462,111463],{"class":124,"line":2465},[78,111464,111297],{},[78,111466,111467],{"class":124,"line":2470},[78,111468,110588],{},[78,111470,111471],{"class":124,"line":2903},[78,111472,110593],{},[78,111474,111475],{"class":124,"line":2909},[78,111476,110598],{},[78,111478,111479],{"class":124,"line":11477},[78,111480,129],{"emptyLinePlaceholder":128},[78,111482,111483],{"class":124,"line":13374},[78,111484,110607],{},[78,111486,111487],{"class":124,"line":13380},[78,111488,44444],{},[78,111490,111491],{"class":124,"line":13386},[78,111492,111493],{},"a1.sinkgroups.g1.sinks = k1 k2\n",[78,111495,111496],{"class":124,"line":13722},[78,111497,110616],{},[78,111499,111500],{"class":124,"line":13727},[78,111501,111502],{},"a1.sinks.k2.channel = c1\n",[7759,111504,111506],{"id":111505},"_5自定义interceptor","5、自定义Interceptor",[13,111508,111509],{},"在实际的开发中，一台服务器产生的日志类型可能有很多种，不同类型的日志可能需要发送到不同的分析系统。此时会用到 Flume 拓扑结构中的 Multiplexing 结构，Multiplexing 的原理是，根据 event 中 Header 的某个 key 的值，将不同的 event 发送到不同的 Channel中，所以我们需要自定义一个 Interceptor，为不同类型的 event 的 Header 中的 key 赋予不同的值。 在该案例中，我们以端口数据模拟日志，以是否包含”atguigu”模拟不同类型的日志， 我们需要自定义 interceptor 区分数据中是否包含”atguigu”，将其分别发往不同的分析系统（Channel）。",[13,111511,111512],{},[617,111513],{"alt":119,"src":111514},"img\u002FFlume\u002F3.3.png",[10548,111516,111518],{"id":111517},"_1自定义jar包拦截文件","（1）自定义Jar包拦截文件",[114,111520,111522],{"className":23652,"code":111521,"language":23654,"meta":119,"style":119},"import org.apache.flume.Context;\nimport org.apache.flume.Event;\nimport org.apache.flume.interceptor.Interceptor;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\npublic class TypeInterceptor implements Interceptor {\n     \u002F\u002F声明一个存放事件的集合\n     private List\u003CEvent> addHeaderEvents;\n     @Override\n     public void initialize() {\n        \u002F\u002F初始化存放事件的集合\n        addHeaderEvents = new ArrayList\u003C>();\n     }\n    \n     \u002F\u002F单个事件拦截\n     @Override\n     public Event intercept(Event event) {\n        \u002F\u002F1.获取事件中的头信息\n        Map\u003CString, String> headers = event.getHeaders();\n        \u002F\u002F2.获取事件中的 body 信息\n        String body = new String(event.getBody());\n        \u002F\u002F3.根据 body 中是否有\"atguigu\"来决定添加怎样的头信息\n        if (body.contains(\"atguigu\")) {\n            \u002F\u002F4.添加头信息\n            headers.put(\"type\", \"first\");\n        } else {\n            \u002F\u002F4.添加头信息\n            headers.put(\"type\", \"second\");\n        }\n        return event;\n     }\n     \n    \u002F\u002F批量事件拦截\n     @Override\n     public List\u003CEvent> intercept(List\u003CEvent> events) {\n        \u002F\u002F1.清空集合\n        addHeaderEvents.clear();\n        \u002F\u002F2.遍历 events\n        for (Event event : events) {\n            \u002F\u002F3.给每一个事件添加头信息\n            addHeaderEvents.add(intercept(event));\n        }\n        \u002F\u002F4.返回结果\n        return addHeaderEvents;\n     }\n    \n     @Override\n     public void close() {}\n    \n     \u002F\u002F 创建构造方法\n     public static class Builder implements Interceptor.Builder {\n         @Override\n        public Interceptor build() {\n            return new TypeInterceptor();\n        }\n        @Override\n            public void configure(Context context) {\n        }\n     }\n}\n",[17,111523,111524,111529,111534,111539,111544,111549,111554,111558,111563,111568,111573,111578,111583,111588,111593,111597,111601,111606,111610,111615,111620,111625,111630,111635,111640,111645,111650,111655,111660,111664,111669,111673,111678,111682,111687,111692,111696,111701,111706,111711,111716,111721,111726,111731,111735,111740,111745,111749,111753,111757,111762,111766,111771,111776,111781,111786,111791,111795,111800,111805,111809,111813],{"__ignoreMap":119},[78,111525,111526],{"class":124,"line":125},[78,111527,111528],{},"import org.apache.flume.Context;\n",[78,111530,111531],{"class":124,"line":132},[78,111532,111533],{},"import org.apache.flume.Event;\n",[78,111535,111536],{"class":124,"line":138},[78,111537,111538],{},"import org.apache.flume.interceptor.Interceptor;\n",[78,111540,111541],{"class":124,"line":144},[78,111542,111543],{},"import java.util.ArrayList;\n",[78,111545,111546],{"class":124,"line":150},[78,111547,111548],{},"import java.util.List;\n",[78,111550,111551],{"class":124,"line":156},[78,111552,111553],{},"import java.util.Map;\n",[78,111555,111556],{"class":124,"line":162},[78,111557,129],{"emptyLinePlaceholder":128},[78,111559,111560],{"class":124,"line":168},[78,111561,111562],{},"public class TypeInterceptor implements Interceptor {\n",[78,111564,111565],{"class":124,"line":174},[78,111566,111567],{},"     \u002F\u002F声明一个存放事件的集合\n",[78,111569,111570],{"class":124,"line":180},[78,111571,111572],{},"     private List\u003CEvent> addHeaderEvents;\n",[78,111574,111575],{"class":124,"line":186},[78,111576,111577],{},"     @Override\n",[78,111579,111580],{"class":124,"line":192},[78,111581,111582],{},"     public void initialize() {\n",[78,111584,111585],{"class":124,"line":198},[78,111586,111587],{},"        \u002F\u002F初始化存放事件的集合\n",[78,111589,111590],{"class":124,"line":204},[78,111591,111592],{},"        addHeaderEvents = new ArrayList\u003C>();\n",[78,111594,111595],{"class":124,"line":210},[78,111596,69967],{},[78,111598,111599],{"class":124,"line":216},[78,111600,6942],{},[78,111602,111603],{"class":124,"line":222},[78,111604,111605],{},"     \u002F\u002F单个事件拦截\n",[78,111607,111608],{"class":124,"line":421},[78,111609,111577],{},[78,111611,111612],{"class":124,"line":427},[78,111613,111614],{},"     public Event intercept(Event event) {\n",[78,111616,111617],{"class":124,"line":433},[78,111618,111619],{},"        \u002F\u002F1.获取事件中的头信息\n",[78,111621,111622],{"class":124,"line":2443},[78,111623,111624],{},"        Map\u003CString, String> headers = event.getHeaders();\n",[78,111626,111627],{"class":124,"line":2448},[78,111628,111629],{},"        \u002F\u002F2.获取事件中的 body 信息\n",[78,111631,111632],{"class":124,"line":2454},[78,111633,111634],{},"        String body = new String(event.getBody());\n",[78,111636,111637],{"class":124,"line":2460},[78,111638,111639],{},"        \u002F\u002F3.根据 body 中是否有\"atguigu\"来决定添加怎样的头信息\n",[78,111641,111642],{"class":124,"line":2465},[78,111643,111644],{},"        if (body.contains(\"atguigu\")) {\n",[78,111646,111647],{"class":124,"line":2470},[78,111648,111649],{},"            \u002F\u002F4.添加头信息\n",[78,111651,111652],{"class":124,"line":2903},[78,111653,111654],{},"            headers.put(\"type\", \"first\");\n",[78,111656,111657],{"class":124,"line":2909},[78,111658,111659],{},"        } else {\n",[78,111661,111662],{"class":124,"line":11477},[78,111663,111649],{},[78,111665,111666],{"class":124,"line":13374},[78,111667,111668],{},"            headers.put(\"type\", \"second\");\n",[78,111670,111671],{"class":124,"line":13380},[78,111672,10054],{},[78,111674,111675],{"class":124,"line":13386},[78,111676,111677],{},"        return event;\n",[78,111679,111680],{"class":124,"line":13722},[78,111681,69967],{},[78,111683,111684],{"class":124,"line":13727},[78,111685,111686],{},"     \n",[78,111688,111689],{"class":124,"line":13953},[78,111690,111691],{},"    \u002F\u002F批量事件拦截\n",[78,111693,111694],{"class":124,"line":13958},[78,111695,111577],{},[78,111697,111698],{"class":124,"line":13964},[78,111699,111700],{},"     public List\u003CEvent> intercept(List\u003CEvent> events) {\n",[78,111702,111703],{"class":124,"line":13969},[78,111704,111705],{},"        \u002F\u002F1.清空集合\n",[78,111707,111708],{"class":124,"line":24170},[78,111709,111710],{},"        addHeaderEvents.clear();\n",[78,111712,111713],{"class":124,"line":24175},[78,111714,111715],{},"        \u002F\u002F2.遍历 events\n",[78,111717,111718],{"class":124,"line":24180},[78,111719,111720],{},"        for (Event event : events) {\n",[78,111722,111723],{"class":124,"line":24186},[78,111724,111725],{},"            \u002F\u002F3.给每一个事件添加头信息\n",[78,111727,111728],{"class":124,"line":24192},[78,111729,111730],{},"            addHeaderEvents.add(intercept(event));\n",[78,111732,111733],{"class":124,"line":24198},[78,111734,10054],{},[78,111736,111737],{"class":124,"line":24204},[78,111738,111739],{},"        \u002F\u002F4.返回结果\n",[78,111741,111742],{"class":124,"line":24210},[78,111743,111744],{},"        return addHeaderEvents;\n",[78,111746,111747],{"class":124,"line":24215},[78,111748,69967],{},[78,111750,111751],{"class":124,"line":24220},[78,111752,6942],{},[78,111754,111755],{"class":124,"line":24226},[78,111756,111577],{},[78,111758,111759],{"class":124,"line":24232},[78,111760,111761],{},"     public void close() {}\n",[78,111763,111764],{"class":124,"line":24238},[78,111765,6942],{},[78,111767,111768],{"class":124,"line":24244},[78,111769,111770],{},"     \u002F\u002F 创建构造方法\n",[78,111772,111773],{"class":124,"line":24250},[78,111774,111775],{},"     public static class Builder implements Interceptor.Builder {\n",[78,111777,111778],{"class":124,"line":24256},[78,111779,111780],{},"         @Override\n",[78,111782,111783],{"class":124,"line":24262},[78,111784,111785],{},"        public Interceptor build() {\n",[78,111787,111788],{"class":124,"line":24267},[78,111789,111790],{},"            return new TypeInterceptor();\n",[78,111792,111793],{"class":124,"line":24273},[78,111794,10054],{},[78,111796,111797],{"class":124,"line":24279},[78,111798,111799],{},"        @Override\n",[78,111801,111802],{"class":124,"line":24284},[78,111803,111804],{},"            public void configure(Context context) {\n",[78,111806,111807],{"class":124,"line":24290},[78,111808,10054],{},[78,111810,111811],{"class":124,"line":24296},[78,111812,69967],{},[78,111814,111815],{"class":124,"line":24302},[78,111816,23518],{},[10548,111818,111820],{"id":111819},"_2配置文件","（2）配置文件",[114,111822,111824],{"className":33493,"code":111823,"language":33495,"meta":119,"style":119},"# 主要变动在source中（从source到channel进行拦截处理数据），所以主要展示source代码\n# Describe\u002Fconfigure the source\na1.sources.r1.type = netcat\na1.sources.r1.bind = localhost\na1.sources.r1.port = 44444\n# 给拦截器命名\na1.sources.r1.interceptors = i1\n# 调用lib中的拦截器，找到构造方法\na1.sources.r1.interceptors.i1.type = com.atguigu.flume.interceptor.CustomInterceptor$Builder\n# 使用多路复用方法进行过滤\na1.sources.r1.selector.type = multiplexing\n# 找到名为type的过滤头\na1.sources.r1.selector.header = type\n# type为first走channel c1\na1.sources.r1.selector.mapping.first = c1\n# type为second走channel c2\na1.sources.r1.selector.mapping.second = c2\n",[17,111825,111826,111831,111835,111839,111843,111847,111852,111857,111862,111867,111872,111877,111882,111887,111892,111897,111902],{"__ignoreMap":119},[78,111827,111828],{"class":124,"line":125},[78,111829,111830],{},"# 主要变动在source中（从source到channel进行拦截处理数据），所以主要展示source代码\n",[78,111832,111833],{"class":124,"line":132},[78,111834,110545],{},[78,111836,111837],{"class":124,"line":138},[78,111838,110550],{},[78,111840,111841],{"class":124,"line":144},[78,111842,110555],{},[78,111844,111845],{"class":124,"line":150},[78,111846,110560],{},[78,111848,111849],{"class":124,"line":156},[78,111850,111851],{},"# 给拦截器命名\n",[78,111853,111854],{"class":124,"line":162},[78,111855,111856],{},"a1.sources.r1.interceptors = i1\n",[78,111858,111859],{"class":124,"line":168},[78,111860,111861],{},"# 调用lib中的拦截器，找到构造方法\n",[78,111863,111864],{"class":124,"line":174},[78,111865,111866],{},"a1.sources.r1.interceptors.i1.type = com.atguigu.flume.interceptor.CustomInterceptor$Builder\n",[78,111868,111869],{"class":124,"line":180},[78,111870,111871],{},"# 使用多路复用方法进行过滤\n",[78,111873,111874],{"class":124,"line":186},[78,111875,111876],{},"a1.sources.r1.selector.type = multiplexing\n",[78,111878,111879],{"class":124,"line":192},[78,111880,111881],{},"# 找到名为type的过滤头\n",[78,111883,111884],{"class":124,"line":198},[78,111885,111886],{},"a1.sources.r1.selector.header = type\n",[78,111888,111889],{"class":124,"line":204},[78,111890,111891],{},"# type为first走channel c1\n",[78,111893,111894],{"class":124,"line":210},[78,111895,111896],{},"a1.sources.r1.selector.mapping.first = c1\n",[78,111898,111899],{"class":124,"line":216},[78,111900,111901],{},"# type为second走channel c2\n",[78,111903,111904],{"class":124,"line":222},[78,111905,111906],{},"a1.sources.r1.selector.mapping.second = c2\n",[13,111908,111909],{},[22,111910,111911],{},"自定义Source和自定义Sink在学生阶段用得并不多（因为大部分数据源是固定的比如HDFS等），并不需要自定义数据源，所以这里暂不记录。同时，目前阶段对于数据流监控并没有实际的应用，因此对于使用Ganglia等软件进行Flume数据监控的方式不做详解。",[23289,111913],{},[107,111915,111917],{"id":111916},"第四章-常见面试题","第四章 常见面试题",[7759,111919,111921],{"id":111920},"_1flume-参数调优","1、Flume 参数调优",[10548,111923,111925],{"id":111924},"_1source","（1）Source",[13,111927,111928],{},"增加 Source 个数（使用 Tair Dir Source 时可增加 FileGroups 个数）可以增大 Source 的读取数据的能力。例如：当某一个目录产生的文件过多时需要将这个文件目录拆分成多个 文件目录，同时配置好多个 Source 以保证 Source 有足够的能力获取到新产生的数据。",[13,111930,111931],{},"batchSize 参数决定 Source 一次批量运输到 Channel 的 event 条数，适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。",[10548,111933,111935],{"id":111934},"_2channel","（2）Channel",[13,111937,111938],{},"type 选择 memory 时 Channel 的性能最好，但是如果 Flume 进程意外挂掉可能会丢失数据。type 选择 file 时 Channel 的容错性更好，但是性能上会比 memory channel 差。 使用 file Channel 时 dataDirs 配置多个不同盘下的目录可以提高性能。",[13,111940,111941,111942],{},"Capacity 参数决定 Channel 可容纳最大的 event 条数。transactionCapacity 参数决定每次 Source 往 channel 里面写的最大 event 条数和每次 Sink 从 channel 里面读的最大 event 条数。",[22,111943,111944],{},"transactionCapacity 需要大于 Source 和 Sink 的 batchSize 参数。",[10548,111946,110444],{"id":111947},"_3sink-1",[13,111949,111950],{},"增加 Sink 的个数可以增加 Sink 消费 event 的能力。Sink 也不是越多越好够用就行，过多的 Sink 会占用系统资源，造成系统资源不必要的浪费。",[13,111952,111953],{},"batchSize 参数决定 Sink 一次批量从 Channel 读取的 event 条数，适当调大这个参数 可以提高 Sink 从 Channel 搬出 event 的性能。",[7759,111955,111957],{"id":111956},"_2flume-的事务机制","2、Flume 的事务机制",[13,111959,111960,111961,111964],{},"Flume 的事务机制（类似数据库的事务机制）：",[22,111962,111963],{},"Flume 使用两个独立的事务分别负责从 Soucrce 到 Channel，以及从 Channel 到 Sink 的事件传递。"," 比如 spooling directory source 为文件的每一行创建一个事件，一旦事务中所有的 事件全部传递到 Channel 且提交成功，那么 Soucrce 就将该文件标记为完成。",[13,111966,111967],{},"同理，事务以类似的方式处理从 Channel 到 Sink 的传递过程，如果因为某种原因使得 事件无法记录，那么事务将会回滚。且所有的事件都会保持到 Channel 中，等待重新传递。",[7759,111969,111971],{"id":111970},"_3flume-采集数据会丢失吗","3、Flume 采集数据会丢失吗?",[13,111973,111974],{},"根据 Flume 的架构原理，Flume 是不可能丢失数据的，其内部有完善的事务机制， Source 到 Channel 是事务性的，Channel 到 Sink 是事务性的，因此这两个环节不会出现数据的丢失，唯一可能丢失数据的情况是 Channel 采用 memoryChannel，agent 宕机导致数据丢失，或者 Channel 存储数据已满，导致 Source 不再写入，未写入的数据丢失。",[13,111976,111977],{},[22,111978,111979],{},"Flume 不会丢失数据，但是有可能造成数据的重复，例如数据已经成功由 Sink 发出， 但是没有接收到响应，Sink 会再次发送数据，此时可能会导致数据的重复。",[226,111981,228],{},{"title":119,"searchDepth":144,"depth":144,"links":111983},[111984,111988,111993,112000],{"id":110377,"depth":132,"text":110378,"children":111985},[111986,111987],{"id":30036,"depth":144,"text":62379},{"id":110386,"depth":144,"text":110387},{"id":110485,"depth":132,"text":110486,"children":111989},[111990,111991,111992],{"id":110489,"depth":144,"text":110490},{"id":110688,"depth":144,"text":110689},{"id":110935,"depth":144,"text":110936},{"id":111005,"depth":132,"text":111006,"children":111994},[111995,111996,111997,111998,111999],{"id":111009,"depth":144,"text":111010},{"id":111120,"depth":144,"text":111121},{"id":111177,"depth":144,"text":111178},{"id":111349,"depth":144,"text":111350},{"id":111505,"depth":144,"text":111506},{"id":111916,"depth":132,"text":111917,"children":112001},[112002,112003,112004],{"id":111920,"depth":144,"text":111921},{"id":111956,"depth":144,"text":111957},{"id":111970,"depth":144,"text":111971},{},"Little Tips\u002FFlume从0到1.md","\u002Fundergraduate\u002Fnote-fbe75968a3f8",{"title":110367,"description":119},"undergraduate\u002Fnote-fbe75968a3f8",[9133,246,23378,10715,6380],"x3xtZ_miXvbOAX8TNPh_MuqwkfMNFit6pWYLiiZfUf0",{"id":30320,"title":30321,"assetBase":239,"author":8,"body":112013,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":113839,"navigation":128,"originalPath":32966,"path":32967,"seo":113840,"source":23330,"stem":32969,"tags":113841,"weight":250,"__hash__":32971},{"type":10,"value":112014,"toc":113763},[112015,112017,112027,112029,112031,112033,112037,112039,112041,112043,112045,112047,112049,112051,112053,112055,112057,112059,112061,112063,112065,112067,112069,112071,112095,112097,112099,112113,112115,112141,112143,112145,112147,112149,112151,112153,112155,112157,112159,112161,112163,112165,112167,112169,112171,112175,112177,112179,112181,112183,112185,112193,112195,112197,112205,112207,112209,112215,112217,112225,112227,112235,112237,112239,112241,112243,112247,112249,112251,112253,112255,112257,112259,112261,112263,112265,112273,112275,112277,112281,112283,112285,112287,112305,112307,112309,112311,112317,112319,112321,112323,112325,112337,112339,112341,112343,112347,112349,112373,112375,112377,112381,112447,112449,112451,112453,112455,112457,112459,112461,112463,112465,112467,112469,112471,112481,112483,112485,112487,112493,112495,112501,112503,112505,112507,112509,112557,112559,112561,112563,112565,112573,112575,112577,112579,112581,112615,112617,112619,112621,112623,112625,112633,112635,112637,112639,112641,112643,112645,112647,112649,112651,112653,112657,112659,112663,112665,112671,112673,112677,112679,112681,112683,112687,112689,112691,112693,112695,112699,112701,112703,112705,112707,112737,112739,112783,112785,112787,112789,112791,112795,112797,112799,112801,112803,112805,112807,112809,112813,112823,112825,112827,112829,112831,112833,112835,112837,112849,112851,112877,112879,112885,112887,112895,112897,112899,112901,112903,112913,112915,112917,112919,112927,112929,112937,112939,112941,112951,112953,112955,112963,112965,112967,112969,112979,112981,112983,112985,112987,112991,112993,113017,113019,113021,113057,113059,113063,113065,113067,113069,113071,113073,113075,113077,113079,113089,113091,113093,113095,113131,113133,113141,113143,113145,113151,113153,113161,113163,113169,113171,113173,113175,113177,113179,113181,113189,113191,113193,113199,113201,113203,113217,113219,113227,113229,113231,113233,113235,113237,113239,113241,113243,113245,113247,113249,113251,113253,113255,113257,113259,113261,113263,113265,113267,113269,113271,113273,113275,113277,113279,113285,113287,113341,113343,113347,113349,113357,113359,113361,113371,113373,113381,113383,113385,113397,113399,113405,113407,113411,113413,113419,113421,113423,113431,113433,113435,113437,113439,113441,113447,113449,113451,113453,113455,113457,113459,113463,113465,113467,113469,113471,113473,113475,113477,113481,113505,113509,113519,113521,113523,113527,113555,113559,113565,113567,113569,113571,113575,113581,113585,113587,113589,113591,113593,113597,113605,113609,113635,113637,113639,113643,113653,113657,113659,113661,113663,113665,113667,113669,113671,113673,113675,113685,113687,113691,113693,113705,113707,113709,113711,113713,113715,113717,113719,113721,113723,113725,113729,113731,113735,113737,113739,113741,113745,113747,113749,113751,113753,113755,113757,113759,113761],[4517,112016,30326],{"id":30326},[72,112018,112019,112023,112025],{},[13,112020,112021],{},[22,112022,23957],{},[13,112024,30335],{},[13,112026,30338],{},[107,112028,30342],{"id":30341},[13,112030,30345],{},[7759,112032,30349],{"id":30348},[13,112034,112035],{},[617,112036],{"alt":119,"src":29434},[7759,112038,30357],{"id":30356},[10548,112040,30361],{"id":30360},[13,112042,30364],{},[10548,112044,30368],{"id":30367},[13,112046,30371],{},[13,112048,30374],{},[13,112050,30377],{},[10548,112052,30381],{"id":30380},[13,112054,30384],{},[13,112056,30387],{},[10548,112058,30391],{"id":30390},[13,112060,30394],{},[23289,112062],{},[107,112064,30400],{"id":30399},[7759,112066,30404],{"id":30403},[10548,112068,30408],{"id":30407},[13,112070,30411],{},[49,112072,112073,112083],{},[52,112074,30416,112075],{},[49,112076,112077,112079],{},[52,112078,30421],{},[52,112080,112081],{},[617,112082],{"alt":119,"src":30426},[52,112084,30429,112085],{},[49,112086,112087,112089,112091,112093],{},[52,112088,30434],{},[52,112090,30437],{},[52,112092,30440],{},[52,112094,30443],{},[10548,112096,30447],{"id":30446},[13,112098,30450],{},[49,112100,112101],{},[52,112102,30455,112103],{},[49,112104,112105,112107,112109,112111],{},[52,112106,30460],{},[52,112108,30463],{},[52,112110,30466],{},[52,112112,30469],{},[10548,112114,30473],{"id":30472},[49,112116,112117,112123,112129,112135],{},[52,112118,30478,112119],{},[49,112120,112121],{},[52,112122,30483],{},[52,112124,30486,112125],{},[49,112126,112127],{},[52,112128,30491],{},[52,112130,30494,112131],{},[49,112132,112133],{},[52,112134,30499],{},[52,112136,30502,112137],{},[49,112138,112139],{},[52,112140,30507],{},[7759,112142,30511],{"id":30510},[13,112144,30514],{},[13,112146,30517],{},[13,112148,30520],{},[10548,112150,30523],{"id":30523},[13,112152,30526],{},[10548,112154,30529],{"id":30529},[13,112156,30532],{},[13,112158,30535],{},[7759,112160,30539],{"id":30538},[10548,112162,30543],{"id":30542},[13,112164,30546],{},[10548,112166,30550],{"id":30549},[13,112168,30553],{},[10548,112170,30557],{"id":30556},[13,112172,112173],{},[617,112174],{"alt":119,"src":30562},[23289,112176],{},[107,112178,30568],{"id":30567},[13,112180,30571],{},[7759,112182,30575],{"id":30574},[13,112184,30578],{},[49,112186,112187,112189,112191],{},[52,112188,30583],{},[52,112190,30586],{},[52,112192,30589],{},[7759,112194,30593],{"id":30592},[13,112196,30596],{},[49,112198,112199,112201,112203],{},[52,112200,30601],{},[52,112202,30604],{},[52,112204,30607],{},[7759,112206,30611],{"id":30610},[13,112208,30614],{},[49,112210,112211,112213],{},[52,112212,30619],{},[52,112214,30622],{},[10548,112216,30625],{"id":30625},[49,112218,112219,112221,112223],{},[52,112220,30630],{},[52,112222,30633],{},[52,112224,30636],{},[10548,112226,30639],{"id":30639},[49,112228,112229,112231,112233],{},[52,112230,30644],{},[52,112232,30647],{},[52,112234,30650],{},[7759,112236,30654],{"id":30653},[10548,112238,30658],{"id":30657},[13,112240,30661],{},[13,112242,30664],{},[13,112244,112245],{},[617,112246],{"alt":119,"src":29839},[13,112248,30671],{},[10548,112250,30675],{"id":30674},[13,112252,30678],{},[13,112254,30681],{},[7759,112256,30685],{"id":30684},[10548,112258,30689],{"id":30688},[13,112260,30692],{},[10548,112262,30696],{"id":30695},[13,112264,30699],{},[49,112266,112267,112269,112271],{},[52,112268,30704],{},[52,112270,30707],{},[52,112272,30710],{},[13,112274,30713],{},[10548,112276,30717],{"id":30716},[13,112278,30720,112279,30724],{},[22,112280,30723],{},[13,112282,30727],{},[10548,112284,30731],{"id":30730},[13,112286,30734],{},[49,112288,112289,112291,112293,112295,112297,112299,112301,112303],{},[52,112290,30739],{},[52,112292,30742],{},[52,112294,30745],{},[52,112296,30748],{},[52,112298,30751],{},[52,112300,30754],{},[52,112302,30757],{},[52,112304,30760],{},[10548,112306,30764],{"id":30763},[13,112308,30767],{},[13,112310,30770],{},[49,112312,112313,112315],{},[52,112314,30775],{},[52,112316,30778],{},[23289,112318],{},[107,112320,30784],{"id":30783},[7759,112322,30788],{"id":30787},[13,112324,30791],{},[49,112326,112327,112329,112331,112333,112335],{},[52,112328,30796],{},[52,112330,30799],{},[52,112332,30802],{},[52,112334,30805],{},[52,112336,30808],{},[10548,112338,30812],{"id":30811},[13,112340,30815],{},[13,112342,30818],{},[13,112344,112345],{},[617,112346],{"alt":119,"src":30157},[13,112348,30825],{},[49,112350,112351,112353,112355,112371],{},[52,112352,30830],{},[52,112354,30833],{},[52,112356,30836,112357],{},[49,112358,112359,112361,112363,112365,112367,112369],{},[52,112360,30841],{},[52,112362,30844],{},[52,112364,30847],{},[52,112366,30850],{},[52,112368,30853],{},[52,112370,30856],{},[52,112372,30859],{},[10548,112374,30863],{"id":30862},[13,112376,30866],{},[13,112378,112379],{},[617,112380],{"alt":119,"src":30871},[49,112382,112383,112389,112405,112421],{},[52,112384,30876,112385],{},[49,112386,112387],{},[52,112388,30881],{},[52,112390,30884,112391],{},[49,112392,112393,112395],{},[52,112394,30889],{},[52,112396,30892,112397],{},[49,112398,112399,112401,112403],{},[52,112400,30897],{},[52,112402,30900],{},[52,112404,30903],{},[52,112406,30906,112407],{},[49,112408,112409,112411],{},[52,112410,30911],{},[52,112412,30914,112413],{},[49,112414,112415,112417],{},[52,112416,30919],{},[52,112418,112419],{},[617,112420],{"alt":119,"src":30924},[52,112422,30927,112423],{},[49,112424,112425,112433],{},[52,112426,30932,112427],{},[49,112428,112429,112431],{},[52,112430,30937],{},[52,112432,30940],{},[52,112434,30943,112435],{},[49,112436,112437,112439,112441,112443],{},[52,112438,30948],{},[52,112440,30951],{},[52,112442,30954],{},[52,112444,112445],{},[617,112446],{"alt":119,"src":30959},[7759,112448,30963],{"id":30962},[13,112450,30966],{},[10548,112452,30969],{"id":30969},[13,112454,30972],{},[10548,112456,30975],{"id":30975},[13,112458,30978],{},[10548,112460,30981],{"id":30981},[13,112462,30984],{},[23289,112464],{},[107,112466,30990],{"id":30989},[13,112468,30993],{},[13,112470,30996],{},[49,112472,112473,112475,112477,112479],{},[52,112474,31001],{},[52,112476,31004],{},[52,112478,31007],{},[52,112480,31010],{},[7759,112482,31014],{"id":31013},[10548,112484,31018],{"id":31017},[13,112486,31021],{},[49,112488,112489,112491],{},[52,112490,31026],{},[52,112492,31029],{},[13,112494,31032],{},[49,112496,112497,112499],{},[52,112498,31037],{},[52,112500,31040],{},[10548,112502,31044],{"id":31043},[13,112504,31047],{},[13,112506,31050],{},[13,112508,31053],{},[49,112510,112511,112535,112541],{},[52,112512,31058,112513],{},[49,112514,112515,112517,112519,112527],{},[52,112516,31063],{},[52,112518,31066],{},[52,112520,31069,112521],{},[49,112522,112523,112525],{},[52,112524,31074],{},[52,112526,31077],{},[52,112528,31080,112529],{},[49,112530,112531,112533],{},[52,112532,31085],{},[52,112534,31088],{},[52,112536,31091,112537],{},[49,112538,112539],{},[52,112540,31096],{},[52,112542,31099,112543],{},[49,112544,112545,112555],{},[52,112546,31104,112547],{},[49,112548,112549,112551,112553],{},[52,112550,31109],{},[52,112552,31112],{},[52,112554,31115],{},[52,112556,31118],{},[10548,112558,31122],{"id":31121},[13,112560,31125],{},[10548,112562,31129],{"id":31128},[13,112564,31132],{},[49,112566,112567,112569,112571],{},[52,112568,31137],{},[52,112570,31140],{},[52,112572,31143],{},[7759,112574,31147],{"id":31146},[13,112576,31150],{},[13,112578,31153],{},[10548,112580,31157],{"id":31156},[49,112582,112583,112591,112597,112603,112609],{},[52,112584,31162,112585],{},[49,112586,112587,112589],{},[52,112588,31167],{},[52,112590,31170],{},[52,112592,31173,112593],{},[49,112594,112595],{},[52,112596,31178],{},[52,112598,31181,112599],{},[49,112600,112601],{},[52,112602,31186],{},[52,112604,31189,112605],{},[49,112606,112607],{},[52,112608,31194],{},[52,112610,31197,112611],{},[49,112612,112613],{},[52,112614,31202],{},[10548,112616,31206],{"id":31205},[13,112618,31209],{},[13,112620,31212],{},[10548,112622,31216],{"id":31215},[13,112624,31219],{},[49,112626,112627,112629,112631],{},[52,112628,31224],{},[52,112630,31227],{},[52,112632,31230],{},[7759,112634,31234],{"id":31233},[10548,112636,31238],{"id":31237},[10548,112638,31242],{"id":31241},[10548,112640,31246],{"id":31245},[10548,112642,31250],{"id":31249},[10548,112644,31254],{"id":31253},[23289,112646],{},[107,112648,31260],{"id":31259},[7759,112650,31264],{"id":31263},[10548,112652,31268],{"id":31267},[13,112654,112655],{},[617,112656],{"alt":119,"src":31273},[10548,112658,31277],{"id":31276},[13,112660,112661],{},[617,112662],{"alt":119,"src":31282},[13,112664,31285],{},[49,112666,112667,112669],{},[52,112668,31290],{},[52,112670,31293],{},[10548,112672,31297],{"id":31296},[13,112674,112675],{},[617,112676],{"alt":119,"src":31302},[13,112678,31305],{},[13,112680,31308],{},[10548,112682,31312],{"id":31311},[13,112684,112685],{},[617,112686],{"alt":119,"src":31317},[13,112688,31320],{},[13,112690,31323],{},[13,112692,31326],{},[10548,112694,31330],{"id":31329},[13,112696,112697],{},[617,112698],{"alt":119,"src":31335},[13,112700,31338],{},[13,112702,31341],{},[7759,112704,31345],{"id":31344},[10548,112706,31349],{"id":31348},[49,112708,112709,112719,112729],{},[52,112710,31354,112711],{},[49,112712,112713,112715,112717],{},[52,112714,31359],{},[52,112716,31362],{},[52,112718,31365],{},[52,112720,31368,112721],{},[49,112722,112723,112725,112727],{},[52,112724,31373],{},[52,112726,31376],{},[52,112728,31379],{},[52,112730,31382,112731],{},[49,112732,112733,112735],{},[52,112734,31387],{},[52,112736,31390],{},[10548,112738,31394],{"id":31393},[49,112740,112741,112763,112771,112773,112781],{},[52,112742,31399,112743],{},[49,112744,112745,112753],{},[52,112746,31404,112747],{},[49,112748,112749],{},[52,112750,112751],{},[617,112752],{"alt":119,"src":31411},[52,112754,31414,112755],{},[49,112756,112757,112759,112761],{},[52,112758,31419],{},[52,112760,31422],{},[52,112762,31425],{},[52,112764,31428,112765],{},[49,112766,112767,112769],{},[52,112768,31433],{},[52,112770,31436],{},[52,112772,31439],{},[52,112774,31442,112775],{},[49,112776,112777,112779],{},[52,112778,31447],{},[52,112780,31450],{},[52,112782,31453],{},[23289,112784],{},[107,112786,31459],{"id":31458},[13,112788,31462],{},[7759,112790,31466],{"id":31465},[13,112792,112793],{},[617,112794],{"alt":119,"src":31471},[7759,112796,31475],{"id":31474},[13,112798,31478],{},[13,112800,31481],{},[13,112802,31484],{},[13,112804,31487],{},[10548,112806,31491],{"id":31490},[13,112808,31494],{},[13,112810,112811],{},[617,112812],{"alt":119,"src":31499},[49,112814,112815,112817,112819,112821],{},[52,112816,31504],{},[52,112818,31507],{},[52,112820,31510],{},[52,112822,31513],{},[10548,112824,31517],{"id":31516},[13,112826,31520],{},[7759,112828,31524],{"id":31523},[10548,112830,31528],{"id":31527},[13,112832,31531],{},[10548,112834,31535],{"id":31534},[13,112836,31538],{},[49,112838,112839,112841,112843,112845,112847],{},[52,112840,31543],{},[52,112842,31546],{},[52,112844,31549],{},[52,112846,31552],{},[52,112848,31555],{},[13,112850,31558],{},[49,112852,112853,112861,112869],{},[52,112854,31563,112855],{},[49,112856,112857,112859],{},[52,112858,31568],{},[52,112860,31571],{},[52,112862,31574,112863],{},[49,112864,112865,112867],{},[52,112866,31579],{},[52,112868,31582],{},[52,112870,31585,112871],{},[49,112872,112873,112875],{},[52,112874,31590],{},[52,112876,31593],{},[13,112878,31596],{},[49,112880,112881,112883],{},[52,112882,31601],{},[52,112884,31604],{},[13,112886,31607],{},[49,112888,112889,112891,112893],{},[52,112890,31612],{},[52,112892,31615],{},[52,112894,31618],{},[23289,112896],{},[107,112898,31624],{"id":31623},[13,112900,31627],{},[13,112902,31630],{},[49,112904,112905,112907,112909,112911],{},[52,112906,31635],{},[52,112908,31638],{},[52,112910,31641],{},[52,112912,31644],{},[7759,112914,31648],{"id":31647},[10548,112916,31652],{"id":31651},[13,112918,31655],{},[49,112920,112921,112923,112925],{},[52,112922,31660],{},[52,112924,31663],{},[52,112926,31666],{},[13,112928,31669],{},[49,112930,112931,112933,112935],{},[52,112932,31674],{},[52,112934,31677],{},[52,112936,31680],{},[10548,112938,31684],{"id":31683},[13,112940,31687],{},[49,112942,112943,112945,112947,112949],{},[52,112944,31692],{},[52,112946,31695],{},[52,112948,31698],{},[52,112950,31701],{},[10548,112952,31705],{"id":31704},[13,112954,31708],{},[49,112956,112957,112959,112961],{},[52,112958,31713],{},[52,112960,31716],{},[52,112962,31719],{},[13,112964,31722],{},[10548,112966,31726],{"id":31725},[13,112968,31729],{},[49,112970,112971,112973,112975,112977],{},[52,112972,31734],{},[52,112974,31737],{},[52,112976,31740],{},[52,112978,31743],{},[23289,112980],{},[107,112982,31749],{"id":31748},[13,112984,31752],{},[7759,112986,31755],{"id":31755},[13,112988,112989],{},[617,112990],{"alt":119,"src":31760},[7759,112992,31763],{"id":31763},[49,112994,112995,113001,113003,113009,113011,113013,113015],{},[52,112996,31768,112997],{},[49,112998,112999],{},[52,113000,31773],{},[52,113002,31776],{},[52,113004,31779,113005],{},[49,113006,113007],{},[52,113008,31784],{},[52,113010,31787],{},[52,113012,31790],{},[52,113014,31793],{},[52,113016,31796],{},[7759,113018,31799],{"id":31799},[10548,113020,31803],{"id":31802},[49,113022,113023,113035,113045],{},[52,113024,31808,113025],{},[49,113026,113027,113029,113031,113033],{},[52,113028,31813],{},[52,113030,31816],{},[52,113032,31819],{},[52,113034,31822],{},[52,113036,31825,113037],{},[49,113038,113039,113041,113043],{},[52,113040,31830],{},[52,113042,31833],{},[52,113044,31836],{},[52,113046,31839,113047],{},[49,113048,113049,113051,113053,113055],{},[52,113050,31844],{},[52,113052,31847],{},[52,113054,31850],{},[52,113056,31853],{},[10548,113058,31857],{"id":31856},[13,113060,113061],{},[617,113062],{"alt":119,"src":31862},[13,113064,31865],{},[23289,113066],{},[107,113068,31871],{"id":31870},[7759,113070,31875],{"id":31874},[10548,113072,31879],{"id":31878},[13,113074,31882],{},[13,113076,31885],{},[10548,113078,31889],{"id":31888},[49,113080,113081,113083,113085,113087],{},[52,113082,31894],{},[52,113084,31897],{},[52,113086,31900],{},[52,113088,31903],{},[10548,113090,31907],{"id":31906},[13,113092,31910],{},[13,113094,31913],{},[8366,113096,113097,113105],{},[8369,113098,113099],{},[8372,113100,113101,113103],{},[8375,113102,29763],{"align":9247},[8375,113104,31924],{"align":9247},[8386,113106,113107,113113,113119,113125],{},[8372,113108,113109,113111],{},[8391,113110,31931],{"align":9247},[8391,113112,31934],{"align":9247},[8372,113114,113115,113117],{},[8391,113116,31939],{"align":9247},[8391,113118,31942],{"align":9247},[8372,113120,113121,113123],{},[8391,113122,31947],{"align":9247},[8391,113124,31950],{"align":9247},[8372,113126,113127,113129],{},[8391,113128,31955],{"align":9247},[8391,113130,31958],{"align":9247},[10548,113132,31962],{"id":31961},[49,113134,113135,113137,113139],{},[52,113136,31967],{},[52,113138,31970],{},[52,113140,31973],{},[7759,113142,31977],{"id":31976},[10548,113144,31981],{"id":31980},[49,113146,113147,113149],{},[52,113148,31986],{},[52,113150,31989],{},[10548,113152,31993],{"id":31992},[49,113154,113155,113157,113159],{},[52,113156,31998],{},[52,113158,32001],{},[52,113160,32004],{},[10548,113162,32008],{"id":32007},[49,113164,113165,113167],{},[52,113166,32013],{},[52,113168,32016],{},[10548,113170,32020],{"id":32019},[13,113172,32023],{},[13,113174,32026],{},[13,113176,32029],{},[7759,113178,32033],{"id":32032},[10548,113180,32037],{"id":32036},[49,113182,113183,113185,113187],{},[52,113184,32042],{},[52,113186,32045],{},[52,113188,32048],{},[10548,113190,32052],{"id":32051},[13,113192,32055],{},[49,113194,113195,113197],{},[52,113196,32060],{},[52,113198,32063],{},[13,113200,32066],{},[10548,113202,32070],{"id":32069},[49,113204,113205,113211],{},[52,113206,32075,113207],{},[49,113208,113209],{},[52,113210,32080],{},[52,113212,32083,113213],{},[49,113214,113215],{},[52,113216,32088],{},[10548,113218,32092],{"id":32091},[49,113220,113221,113223,113225],{},[52,113222,32097],{},[52,113224,32100],{},[52,113226,32103],{},[23289,113228],{},[107,113230,32109],{"id":32108},[7759,113232,32113],{"id":32112},[13,113234,32116],{},[13,113236,32119],{},[10548,113238,32123],{"id":32122},[13,113240,32126],{},[13,113242,32129],{},[13,113244,32132],{},[13,113246,32135],{},[13,113248,32138],{},[13,113250,32141],{},[13,113252,32144],{},[13,113254,32147],{},[10548,113256,32151],{"id":32150},[13,113258,32154],{},[13,113260,32157],{},[13,113262,32160],{},[13,113264,32163],{},[13,113266,32166],{},[7759,113268,32170],{"id":32169},[10548,113270,32174],{"id":32173},[13,113272,32177],{},[10548,113274,32181],{"id":32180},[13,113276,32184],{},[10548,113278,32188],{"id":32187},[49,113280,113281,113283],{},[52,113282,32193],{},[52,113284,32196],{},[10548,113286,32200],{"id":32199},[8366,113288,113289,113299],{},[8369,113290,113291],{},[8372,113292,113293,113295,113297],{},[8375,113294],{"align":9247},[8375,113296,32211],{"align":9247},[8375,113298,32214],{"align":9247},[8386,113300,113301,113309,113317,113325,113333],{},[8372,113302,113303,113305,113307],{},[8391,113304,32221],{"align":9247},[8391,113306,32224],{"align":9247},[8391,113308,32227],{"align":9247},[8372,113310,113311,113313,113315],{},[8391,113312,32232],{"align":9247},[8391,113314,32235],{"align":9247},[8391,113316,32238],{"align":9247},[8372,113318,113319,113321,113323],{},[8391,113320,32243],{"align":9247},[8391,113322,32246],{"align":9247},[8391,113324,32249],{"align":9247},[8372,113326,113327,113329,113331],{},[8391,113328,32254],{"align":9247},[8391,113330,32257],{"align":9247},[8391,113332,32260],{"align":9247},[8372,113334,113335,113337,113339],{},[8391,113336,32265],{"align":9247},[8391,113338],{"align":9247},[8391,113340,32270],{"align":9247},[13,113342,32273],{},[13,113344,113345],{},[617,113346],{"alt":119,"src":32278},[10548,113348,32282],{"id":32281},[49,113350,113351,113353,113355],{},[52,113352,32287],{},[52,113354,32290],{},[52,113356,32293],{},[7759,113358,32297],{"id":32296},[13,113360,32300],{},[49,113362,113363,113365,113367,113369],{},[52,113364,32305],{},[52,113366,32308],{},[52,113368,32311],{},[52,113370,32314],{},[10548,113372,32317],{"id":32317},[49,113374,113375,113377,113379],{},[52,113376,32322],{},[52,113378,32325],{},[52,113380,32328],{},[7759,113382,32332],{"id":32331},[10548,113384,32336],{"id":32335},[49,113386,113387,113389,113391,113393,113395],{},[52,113388,32341],{},[52,113390,32344],{},[52,113392,32347],{},[52,113394,32350],{},[52,113396,32353],{},[10548,113398,32357],{"id":32356},[49,113400,113401,113403],{},[52,113402,32362],{},[52,113404,32365],{},[7759,113406,32369],{"id":32368},[13,113408,113409],{},[617,113410],{"alt":119,"src":32374},[7759,113412,32378],{"id":32377},[49,113414,113415,113417],{},[52,113416,32383],{},[52,113418,32386],{},[7759,113420,32390],{"id":32389},[10548,113422,32394],{"id":32393},[49,113424,113425,113427,113429],{},[52,113426,32399],{},[52,113428,32402],{},[52,113430,32405],{},[10548,113432,32409],{"id":32408},[13,113434,32412],{},[13,113436,32415],{},[13,113438,32418],{},[10548,113440,32422],{"id":32421},[49,113442,113443,113445],{},[52,113444,32427],{},[52,113446,32430],{},[23289,113448],{},[107,113450,32436],{"id":32435},[13,113452,32439],{},[13,113454,32442],{},[13,113456,32445],{},[7759,113458,32449],{"id":32448},[13,113460,113461],{},[617,113462],{"alt":119,"src":32454},[7759,113464,32458],{"id":32457},[13,113466,32461],{},[23289,113468],{},[107,113470,32467],{"id":32466},[7759,113472,32471],{"id":32470},[10548,113474,32475],{"id":32474},[13,113476,32478],{},[13,113478,113479],{},[22,113480,32483],{},[49,113482,113483,113491,113499],{},[52,113484,32488,113485],{},[49,113486,113487,113489],{},[52,113488,32493],{},[52,113490,32496],{},[52,113492,32499,113493],{},[49,113494,113495,113497],{},[52,113496,32504],{},[52,113498,32507],{},[52,113500,32510,113501],{},[49,113502,113503],{},[52,113504,32515],{},[13,113506,113507],{},[22,113508,32520],{},[49,113510,113511,113513,113515,113517],{},[52,113512,32525],{},[52,113514,32528],{},[52,113516,32531],{},[52,113518,32534],{},[10548,113520,32538],{"id":32537},[13,113522,32541],{},[13,113524,113525],{},[22,113526,32483],{},[49,113528,113529,113535,113543,113549],{},[52,113530,32550,113531],{},[49,113532,113533],{},[52,113534,32555],{},[52,113536,32558,113537],{},[49,113538,113539,113541],{},[52,113540,32563],{},[52,113542,32566],{},[52,113544,32569,113545],{},[49,113546,113547],{},[52,113548,32574],{},[52,113550,32577,113551],{},[49,113552,113553],{},[52,113554,32582],{},[13,113556,113557],{},[22,113558,32587],{},[49,113560,113561,113563],{},[52,113562,32592],{},[52,113564,32595],{},[7759,113566,32599],{"id":32598},[10548,113568,32603],{"id":32602},[13,113570,32606],{},[13,113572,113573],{},[22,113574,32611],{},[49,113576,113577,113579],{},[52,113578,32616],{},[52,113580,32619],{},[13,113582,113583],{},[22,113584,32624],{},[13,113586,32627],{},[13,113588,32630],{},[10548,113590,32634],{"id":32633},[13,113592,32637],{},[13,113594,113595],{},[22,113596,32611],{},[49,113598,113599,113601,113603],{},[52,113600,32646],{},[52,113602,32649],{},[52,113604,32652],{},[13,113606,113607],{},[22,113608,32624],{},[49,113610,113611,113617,113623],{},[52,113612,32661,113613],{},[49,113614,113615],{},[52,113616,32666],{},[52,113618,32669,113619],{},[49,113620,113621],{},[52,113622,32674],{},[52,113624,32677,113625],{},[49,113626,113627,113629,113631,113633],{},[52,113628,32682],{},[52,113630,32685],{},[52,113632,32688],{},[52,113634,32691],{},[10548,113636,32695],{"id":32694},[13,113638,32698],{},[13,113640,113641],{},[22,113642,32611],{},[49,113644,113645,113647,113649,113651],{},[52,113646,32707],{},[52,113648,32710],{},[52,113650,32713],{},[52,113652,32716],{},[13,113654,113655],{},[22,113656,32624],{},[13,113658,32723],{},[13,113660,32726],{},[13,113662,32729],{},[23289,113664],{},[107,113666,32735],{"id":32734},[13,113668,32738],{},[107,113670,32742],{"id":32741},[13,113672,32745],{},[7759,113674,32749],{"id":32748},[49,113676,113677,113679,113681,113683],{},[52,113678,32754],{},[52,113680,32757],{},[52,113682,32760],{},[52,113684,32763],{},[7759,113686,32767],{"id":32766},[13,113688,113689],{},[617,113690],{"alt":119,"src":32772},[7759,113692,32776],{"id":32775},[49,113694,113695,113697,113699,113701,113703],{},[52,113696,32781],{},[52,113698,32784],{},[52,113700,32787],{},[52,113702,32790],{},[52,113704,32793],{},[23289,113706],{},[107,113708,32799],{"id":32798},[7759,113710,32803],{"id":32802},[10548,113712,32807],{"id":32806},[13,113714,32810],{},[10548,113716,32814],{"id":32813},[13,113718,32817],{},[10548,113720,32821],{"id":32820},[13,113722,32824],{},[10548,113724,32828],{"id":32827},[13,113726,113727],{},[617,113728],{"alt":119,"src":32833},[10548,113730,32837],{"id":32836},[13,113732,113733],{},[617,113734],{"alt":119,"src":32842},[7759,113736,32846],{"id":32845},[13,113738,32849],{},[10548,113740,32853],{"id":32852},[13,113742,113743],{},[617,113744],{"alt":119,"src":32858},[10548,113746,32862],{"id":32861},[13,113748,32865],{},[10548,113750,32869],{"id":32868},[13,113752,32872],{},[10548,113754,32876],{"id":32875},[13,113756,32879],{},[10548,113758,32883],{"id":32882},[13,113760,32886],{},[23289,113762],{},{"title":119,"searchDepth":144,"depth":144,"links":113764},[113765,113769,113774,113781,113785,113790,113794,113799,113802,113807,113812,113821,113825,113829,113830,113835],{"id":30341,"depth":132,"text":30342,"children":113766},[113767,113768],{"id":30348,"depth":144,"text":30349},{"id":30356,"depth":144,"text":30357},{"id":30399,"depth":132,"text":30400,"children":113770},[113771,113772,113773],{"id":30403,"depth":144,"text":30404},{"id":30510,"depth":144,"text":30511},{"id":30538,"depth":144,"text":30539},{"id":30567,"depth":132,"text":30568,"children":113775},[113776,113777,113778,113779,113780],{"id":30574,"depth":144,"text":30575},{"id":30592,"depth":144,"text":30593},{"id":30610,"depth":144,"text":30611},{"id":30653,"depth":144,"text":30654},{"id":30684,"depth":144,"text":30685},{"id":30783,"depth":132,"text":30784,"children":113782},[113783,113784],{"id":30787,"depth":144,"text":30788},{"id":30962,"depth":144,"text":30963},{"id":30989,"depth":132,"text":30990,"children":113786},[113787,113788,113789],{"id":31013,"depth":144,"text":31014},{"id":31146,"depth":144,"text":31147},{"id":31233,"depth":144,"text":31234},{"id":31259,"depth":132,"text":31260,"children":113791},[113792,113793],{"id":31263,"depth":144,"text":31264},{"id":31344,"depth":144,"text":31345},{"id":31458,"depth":132,"text":31459,"children":113795},[113796,113797,113798],{"id":31465,"depth":144,"text":31466},{"id":31474,"depth":144,"text":31475},{"id":31523,"depth":144,"text":31524},{"id":31623,"depth":132,"text":31624,"children":113800},[113801],{"id":31647,"depth":144,"text":31648},{"id":31748,"depth":132,"text":31749,"children":113803},[113804,113805,113806],{"id":31755,"depth":144,"text":31755},{"id":31763,"depth":144,"text":31763},{"id":31799,"depth":144,"text":31799},{"id":31870,"depth":132,"text":31871,"children":113808},[113809,113810,113811],{"id":31874,"depth":144,"text":31875},{"id":31976,"depth":144,"text":31977},{"id":32032,"depth":144,"text":32033},{"id":32108,"depth":132,"text":32109,"children":113813},[113814,113815,113816,113817,113818,113819,113820],{"id":32112,"depth":144,"text":32113},{"id":32169,"depth":144,"text":32170},{"id":32296,"depth":144,"text":32297},{"id":32331,"depth":144,"text":32332},{"id":32368,"depth":144,"text":32369},{"id":32377,"depth":144,"text":32378},{"id":32389,"depth":144,"text":32390},{"id":32435,"depth":132,"text":32436,"children":113822},[113823,113824],{"id":32448,"depth":144,"text":32449},{"id":32457,"depth":144,"text":32458},{"id":32466,"depth":132,"text":32467,"children":113826},[113827,113828],{"id":32470,"depth":144,"text":32471},{"id":32598,"depth":144,"text":32599},{"id":32734,"depth":132,"text":32735},{"id":32741,"depth":132,"text":32742,"children":113831},[113832,113833,113834],{"id":32748,"depth":144,"text":32749},{"id":32766,"depth":144,"text":32767},{"id":32775,"depth":144,"text":32776},{"id":32798,"depth":132,"text":32799,"children":113836},[113837,113838],{"id":32802,"depth":144,"text":32803},{"id":32845,"depth":144,"text":32846},{},{"title":30321,"description":119},[246,23378,10715,6380,23333],[113843,113986,114135,114244,114377,114401,114550,114711,114876,115043,115212,115379,115544,115745,115918,115928,116105,116296,116493,116646,116795,116972,117195,117402,119045,120226,121312,122603,122788,122977,123220,123369,123558,123741,123924,124095,124304,124535,124758,125031,125664,125966,126757,126964,127159,127388,131327,131566,131809,132004,132221,132458,132785,133080,133212,133264,133292,133740,134982,134990,135932,137455,138338,140168,140455,140467,140659,142330,142639,142945,145602,147246,148165,150986,152310,152649,154422,163908,164816,166608,167603,168721,169008,170973,171513,171533,171827,171995,173001,173069,173420,173999,176429,190739,191327,193056,193876,194976,195355,197041,197049,199134,199650,200218,202147,202959,203988],{"id":5,"title":6,"assetBase":7,"author":8,"body":113844,"category":232,"collection":233,"date":234,"description":235,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":113983,"navigation":128,"originalPath":239,"path":241,"seo":113984,"source":243,"stem":244,"tags":113985,"weight":250,"__hash__":251},{"type":10,"value":113845,"toc":113980},[113846,113854,113864,113876,113878,113886,113888,113902,113904,113906,113978],[13,113847,15,113848,20,113850,25,113852,29],{},[17,113849,19],{},[22,113851,24],{},[17,113853,28],{},[13,113855,32,113856,36,113858,40,113860,43,113862,47],{},[17,113857,35],{},[17,113859,39],{},[17,113861,39],{},[17,113863,46],{},[49,113865,113866,113870],{},[52,113867,113868,57],{},[17,113869,56],{},[52,113871,60,113872,64,113874,67],{},[17,113873,63],{},[17,113875,63],{},[13,113877,70],{},[72,113879,113880],{},[13,113881,76,113882,81,113884,85],{},[78,113883,80],{},[78,113885,84],{},[13,113887,88],{},[49,113889,113890,113894,113898],{},[52,113891,113892],{},[17,113893,95],{},[52,113895,113896],{},[17,113897,100],{},[52,113899,103,113900],{},[17,113901,63],{},[107,113903,109],{"id":109},[13,113905,112],{},[114,113907,113908],{"className":116,"code":117,"language":118,"meta":119,"style":119},[17,113909,113910,113914,113918,113922,113926,113930,113934,113938,113942,113946,113950,113954,113958,113962,113966,113970,113974],{"__ignoreMap":119},[78,113911,113912],{"class":124,"line":125},[78,113913,129],{"emptyLinePlaceholder":128},[78,113915,113916],{"class":124,"line":132},[78,113917,135],{},[78,113919,113920],{"class":124,"line":138},[78,113921,141],{},[78,113923,113924],{"class":124,"line":144},[78,113925,147],{},[78,113927,113928],{"class":124,"line":150},[78,113929,153],{},[78,113931,113932],{"class":124,"line":156},[78,113933,159],{},[78,113935,113936],{"class":124,"line":162},[78,113937,165],{},[78,113939,113940],{"class":124,"line":168},[78,113941,171],{},[78,113943,113944],{"class":124,"line":174},[78,113945,177],{},[78,113947,113948],{"class":124,"line":180},[78,113949,183],{},[78,113951,113952],{"class":124,"line":186},[78,113953,189],{},[78,113955,113956],{"class":124,"line":192},[78,113957,195],{},[78,113959,113960],{"class":124,"line":198},[78,113961,201],{},[78,113963,113964],{"class":124,"line":204},[78,113965,207],{},[78,113967,113968],{"class":124,"line":210},[78,113969,213],{},[78,113971,113972],{"class":124,"line":216},[78,113973,219],{},[78,113975,113976],{"class":124,"line":222},[78,113977,207],{},[226,113979,228],{},{"title":119,"searchDepth":144,"depth":144,"links":113981},[113982],{"id":109,"depth":132,"text":109},{},{"title":6,"description":235},[246,247,248,249],{"id":253,"title":254,"assetBase":7,"author":8,"body":113987,"category":442,"collection":233,"date":234,"description":443,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114132,"navigation":128,"originalPath":239,"path":445,"seo":114133,"source":243,"stem":447,"tags":114134,"weight":250,"__hash__":452},{"type":10,"value":113988,"toc":114129},[113989,114001,114005,114007,114011,114016,114020,114025,114029,114039,114041,114043,114127],[13,113990,259,113991,263,113993,267,113995,271,113997,275,113999,279],{},[17,113992,262],{},[17,113994,266],{},[17,113996,270],{},[17,113998,274],{},[17,114000,278],{},[13,114002,282,114003,285],{},[17,114004,262],{},[13,114006,288],{},[13,114008,114009],{},[22,114010,293],{},[114,114012,114014],{"className":114013,"code":298,"language":299},[297],[17,114015,298],{"__ignoreMap":119},[13,114017,114018],{},[22,114019,306],{},[114,114021,114023],{"className":114022,"code":310,"language":299},[297],[17,114024,310],{"__ignoreMap":119},[13,114026,114027],{},[22,114028,317],{},[49,114030,114031,114035],{},[52,114032,114033],{},[17,114034,324],{},[52,114036,114037,329],{},[17,114038,262],{},[107,114040,109],{"id":109},[13,114042,112],{},[114,114044,114045],{"className":116,"code":336,"language":118,"meta":119,"style":119},[17,114046,114047,114051,114055,114059,114063,114067,114071,114075,114079,114083,114087,114091,114095,114099,114103,114107,114111,114115,114119,114123],{"__ignoreMap":119},[78,114048,114049],{"class":124,"line":125},[78,114050,129],{"emptyLinePlaceholder":128},[78,114052,114053],{"class":124,"line":132},[78,114054,135],{},[78,114056,114057],{"class":124,"line":138},[78,114058,351],{},[78,114060,114061],{"class":124,"line":144},[78,114062,207],{},[78,114064,114065],{"class":124,"line":150},[78,114066,360],{},[78,114068,114069],{"class":124,"line":156},[78,114070,365],{},[78,114072,114073],{"class":124,"line":162},[78,114074,207],{},[78,114076,114077],{"class":124,"line":168},[78,114078,374],{},[78,114080,114081],{"class":124,"line":174},[78,114082,379],{},[78,114084,114085],{"class":124,"line":180},[78,114086,384],{},[78,114088,114089],{"class":124,"line":186},[78,114090,389],{},[78,114092,114093],{"class":124,"line":192},[78,114094,394],{},[78,114096,114097],{"class":124,"line":198},[78,114098,399],{},[78,114100,114101],{"class":124,"line":204},[78,114102,404],{},[78,114104,114105],{"class":124,"line":210},[78,114106,384],{},[78,114108,114109],{"class":124,"line":216},[78,114110,413],{},[78,114112,114113],{"class":124,"line":222},[78,114114,418],{},[78,114116,114117],{"class":124,"line":421},[78,114118,424],{},[78,114120,114121],{"class":124,"line":427},[78,114122,430],{},[78,114124,114125],{"class":124,"line":433},[78,114126,436],{},[226,114128,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114130},[114131],{"id":109,"depth":132,"text":109},{},{"title":254,"description":443},[246,247,449,450,451],{"id":454,"title":455,"assetBase":7,"author":8,"body":114136,"category":249,"collection":233,"date":234,"description":579,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114241,"navigation":128,"originalPath":239,"path":582,"seo":114242,"source":243,"stem":584,"tags":114243,"weight":250,"__hash__":586},{"type":10,"value":114137,"toc":114238},[114138,114142,114148,114152,114157,114161,114166,114170,114176,114178,114180,114236],[13,114139,460,114140,463],{},[17,114141,19],{},[13,114143,466,114144,275,114146,473],{},[17,114145,469],{},[17,114147,472],{},[13,114149,114150],{},[22,114151,293],{},[114,114153,114155],{"className":114154,"code":481,"language":299},[297],[17,114156,481],{"__ignoreMap":119},[13,114158,114159],{},[22,114160,306],{},[114,114162,114164],{"className":114163,"code":491,"language":299},[297],[17,114165,491],{"__ignoreMap":119},[13,114167,114168],{},[22,114169,317],{},[49,114171,114172],{},[52,114173,114174],{},[17,114175,504],{},[107,114177,109],{"id":109},[13,114179,112],{},[114,114181,114182],{"className":116,"code":511,"language":118,"meta":119,"style":119},[17,114183,114184,114188,114192,114196,114200,114204,114208,114212,114216,114220,114224,114228,114232],{"__ignoreMap":119},[78,114185,114186],{"class":124,"line":125},[78,114187,129],{"emptyLinePlaceholder":128},[78,114189,114190],{"class":124,"line":132},[78,114191,135],{},[78,114193,114194],{"class":124,"line":138},[78,114195,526],{},[78,114197,114198],{"class":124,"line":144},[78,114199,207],{},[78,114201,114202],{"class":124,"line":150},[78,114203,535],{},[78,114205,114206],{"class":124,"line":156},[78,114207,219],{},[78,114209,114210],{"class":124,"line":162},[78,114211,207],{},[78,114213,114214],{"class":124,"line":168},[78,114215,548],{},[78,114217,114218],{"class":124,"line":174},[78,114219,553],{},[78,114221,114222],{"class":124,"line":180},[78,114223,558],{},[78,114225,114226],{"class":124,"line":186},[78,114227,563],{},[78,114229,114230],{"class":124,"line":192},[78,114231,568],{},[78,114233,114234],{"class":124,"line":198},[78,114235,573],{},[226,114237,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114239},[114240],{"id":109,"depth":132,"text":109},{},{"title":455,"description":579},[246,249],{"id":588,"title":589,"assetBase":7,"author":8,"body":114245,"category":748,"collection":233,"date":234,"description":749,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114374,"navigation":128,"originalPath":239,"path":751,"seo":114375,"source":243,"stem":753,"tags":114376,"weight":250,"__hash__":755},{"type":10,"value":114246,"toc":114371},[114247,114257,114261,114265,114269,114274,114278,114283,114287,114293,114295,114297,114369],[13,114248,594,114249,601,114253,606],{},[596,114250,114251],{},[17,114252,600],{},[596,114254,114255],{},[17,114256,600],{},[13,114258,609,114259,613],{},[22,114260,612],{},[13,114262,114263],{},[617,114264],{"alt":619,"src":620},[13,114266,114267],{},[22,114268,70],{},[114,114270,114272],{"className":114271,"code":628,"language":299},[297],[17,114273,628],{"__ignoreMap":119},[13,114275,114276],{},[22,114277,635],{},[114,114279,114281],{"className":114280,"code":639,"language":299},[297],[17,114282,639],{"__ignoreMap":119},[13,114284,114285],{},[22,114286,88],{},[49,114288,114289],{},[52,114290,114291],{},[17,114292,652],{},[107,114294,109],{"id":109},[13,114296,112],{},[114,114298,114299],{"className":116,"code":659,"language":118,"meta":119,"style":119},[17,114300,114301,114305,114309,114313,114317,114321,114325,114329,114333,114337,114341,114345,114349,114353,114357,114361,114365],{"__ignoreMap":119},[78,114302,114303],{"class":124,"line":125},[78,114304,129],{"emptyLinePlaceholder":128},[78,114306,114307],{"class":124,"line":132},[78,114308,135],{},[78,114310,114311],{"class":124,"line":138},[78,114312,674],{},[78,114314,114315],{"class":124,"line":144},[78,114316,679],{},[78,114318,114319],{"class":124,"line":150},[78,114320,684],{},[78,114322,114323],{"class":124,"line":156},[78,114324,689],{},[78,114326,114327],{"class":124,"line":162},[78,114328,694],{},[78,114330,114331],{"class":124,"line":168},[78,114332,699],{},[78,114334,114335],{"class":124,"line":174},[78,114336,704],{},[78,114338,114339],{"class":124,"line":180},[78,114340,709],{},[78,114342,114343],{"class":124,"line":186},[78,114344,714],{},[78,114346,114347],{"class":124,"line":192},[78,114348,719],{},[78,114350,114351],{"class":124,"line":198},[78,114352,724],{},[78,114354,114355],{"class":124,"line":204},[78,114356,207],{},[78,114358,114359],{"class":124,"line":210},[78,114360,733],{},[78,114362,114363],{"class":124,"line":216},[78,114364,738],{},[78,114366,114367],{"class":124,"line":222},[78,114368,207],{},[226,114370,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114372},[114373],{"id":109,"depth":132,"text":109},{},{"title":589,"description":749},[246,248,249],{"id":757,"title":758,"assetBase":239,"author":8,"body":114378,"category":787,"collection":233,"date":234,"description":763,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":114398,"navigation":128,"originalPath":239,"path":790,"seo":114399,"source":243,"stem":792,"tags":114400,"weight":250,"__hash__":795},{"type":10,"value":114379,"toc":114396},[114380,114382,114384,114386,114388,114390,114392,114394],[13,114381,763],{},[13,114383,766],{},[13,114385,769],{},[13,114387,772],{},[13,114389,775],{},[13,114391,778],{},[13,114393,781],{},[13,114395,784],{},{"title":119,"searchDepth":144,"depth":144,"links":114397},[],{},{"title":758,"description":763},[794],{"id":797,"title":798,"assetBase":7,"author":8,"body":114402,"category":748,"collection":233,"date":978,"description":979,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114547,"navigation":128,"originalPath":239,"path":981,"seo":114548,"source":243,"stem":983,"tags":114549,"weight":250,"__hash__":985},{"type":10,"value":114403,"toc":114544},[114404,114408,114412,114416,114428,114432,114444,114448,114458,114460,114462,114542],[13,114405,803,114406,67],{},[22,114407,806],{},[13,114409,809,114410,813],{},[22,114411,812],{},[13,114413,114414,819],{},[22,114415,818],{},[72,114417,114418],{},[13,114419,114420,819,114422,114424,833,114426,837],{},[22,114421,826],{},[78,114423,829],{},[22,114425,832],{},[22,114427,836],{},[13,114429,114430,819],{},[22,114431,842],{},[72,114433,114434],{},[13,114435,114436,819,114438,114440,854,114442,857],{},[22,114437,826],{},[78,114439,851],{},[22,114441,832],{},[22,114443,836],{},[13,114445,114446,819],{},[22,114447,862],{},[49,114449,114450,114454],{},[52,114451,114452],{},[17,114453,869],{},[52,114455,114456],{},[17,114457,874],{},[107,114459,109],{"id":109},[13,114461,112],{},[114,114463,114464],{"className":116,"code":881,"language":118,"meta":119,"style":119},[17,114465,114466,114470,114474,114478,114482,114486,114490,114494,114498,114502,114506,114510,114514,114518,114522,114526,114530,114534,114538],{"__ignoreMap":119},[78,114467,114468],{"class":124,"line":125},[78,114469,129],{"emptyLinePlaceholder":128},[78,114471,114472],{"class":124,"line":132},[78,114473,135],{},[78,114475,114476],{"class":124,"line":138},[78,114477,896],{},[78,114479,114480],{"class":124,"line":144},[78,114481,901],{},[78,114483,114484],{"class":124,"line":150},[78,114485,906],{},[78,114487,114488],{"class":124,"line":156},[78,114489,911],{},[78,114491,114492],{"class":124,"line":162},[78,114493,916],{},[78,114495,114496],{"class":124,"line":168},[78,114497,921],{},[78,114499,114500],{"class":124,"line":174},[78,114501,926],{},[78,114503,114504],{"class":124,"line":180},[78,114505,931],{},[78,114507,114508],{"class":124,"line":186},[78,114509,936],{},[78,114511,114512],{"class":124,"line":192},[78,114513,941],{},[78,114515,114516],{"class":124,"line":198},[78,114517,946],{},[78,114519,114520],{"class":124,"line":204},[78,114521,951],{},[78,114523,114524],{"class":124,"line":210},[78,114525,956],{},[78,114527,114528],{"class":124,"line":216},[78,114529,207],{},[78,114531,114532],{"class":124,"line":222},[78,114533,213],{},[78,114535,114536],{"class":124,"line":421},[78,114537,219],{},[78,114539,114540],{"class":124,"line":427},[78,114541,207],{},[226,114543,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114545},[114546],{"id":109,"depth":132,"text":109},{},{"title":798,"description":979},[246,248,249],{"id":987,"title":988,"assetBase":7,"author":8,"body":114551,"category":1185,"collection":233,"date":978,"description":1186,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114708,"navigation":128,"originalPath":239,"path":1188,"seo":114709,"source":243,"stem":1190,"tags":114710,"weight":250,"__hash__":1194},{"type":10,"value":114552,"toc":114705},[114553,114561,114577,114581,114595,114599,114613,114617,114623,114625,114627,114703],[13,114554,993,114555,996,114557,285],{},[17,114556,19],{},[596,114558,999,114559,1002],{},[17,114560,19],{},[13,114562,114563,1008,114565,1011,114567,1011,114569,1018,114571,1022,114573,1018,114575,1029],{},[22,114564,1007],{},[17,114566,469],{},[17,114568,1014],{},[17,114570,1017],{},[17,114572,1021],{},[17,114574,1025],{},[17,114576,1028],{},[13,114578,114579],{},[22,114580,293],{},[72,114582,114583],{},[13,114584,114585,1041,114587,114589,1048,114591,1052,114593],{},[22,114586,1040],{},[17,114588,1044],{},[22,114590,1047],{},[22,114592,1051],{},[17,114594,1055],{},[13,114596,114597],{},[22,114598,306],{},[72,114600,114601],{},[13,114602,114603,1041,114605,114607,1071,114609,114611],{},[22,114604,1040],{},[17,114606,1068],{},[22,114608,1047],{},[22,114610,1051],{},[17,114612,1076],{},[13,114614,114615],{},[22,114616,317],{},[49,114618,114619],{},[52,114620,114621],{},[17,114622,1087],{},[107,114624,109],{"id":109},[13,114626,112],{},[114,114628,114629],{"className":116,"code":1094,"language":118,"meta":119,"style":119},[17,114630,114631,114635,114639,114643,114647,114651,114655,114659,114663,114667,114671,114675,114679,114683,114687,114691,114695,114699],{"__ignoreMap":119},[78,114632,114633],{"class":124,"line":125},[78,114634,129],{"emptyLinePlaceholder":128},[78,114636,114637],{"class":124,"line":132},[78,114638,135],{},[78,114640,114641],{"class":124,"line":138},[78,114642,1109],{},[78,114644,114645],{"class":124,"line":144},[78,114646,1114],{},[78,114648,114649],{"class":124,"line":150},[78,114650,1119],{},[78,114652,114653],{"class":124,"line":156},[78,114654,129],{"emptyLinePlaceholder":128},[78,114656,114657],{"class":124,"line":162},[78,114658,1128],{},[78,114660,114661],{"class":124,"line":168},[78,114662,1133],{},[78,114664,114665],{"class":124,"line":174},[78,114666,1138],{},[78,114668,114669],{"class":124,"line":180},[78,114670,1143],{},[78,114672,114673],{"class":124,"line":186},[78,114674,1148],{},[78,114676,114677],{"class":124,"line":192},[78,114678,1153],{},[78,114680,114681],{"class":124,"line":198},[78,114682,1158],{},[78,114684,114685],{"class":124,"line":204},[78,114686,1163],{},[78,114688,114689],{"class":124,"line":210},[78,114690,207],{},[78,114692,114693],{"class":124,"line":216},[78,114694,535],{},[78,114696,114697],{"class":124,"line":222},[78,114698,219],{},[78,114700,114701],{"class":124,"line":421},[78,114702,207],{},[226,114704,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114706},[114707],{"id":109,"depth":132,"text":109},{},{"title":988,"description":1186},[246,1192,1193,249],{"id":1196,"title":1197,"assetBase":7,"author":8,"body":114712,"category":1392,"collection":233,"date":978,"description":1393,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":114873,"navigation":128,"originalPath":239,"path":1395,"seo":114874,"source":243,"stem":1397,"tags":114875,"weight":250,"__hash__":1399},{"type":10,"value":114713,"toc":114870},[114714,114724,114728,114744,114748,114760,114764,114774,114778,114792,114794,114796,114868],[13,114715,1202,114716,1206,114718,1210,114720,1214,114722,1218],{},[17,114717,1205],{},[17,114719,1209],{},[22,114721,1213],{},[17,114723,1217],{},[13,114725,114726],{},[22,114727,293],{},[72,114729,114730],{},[13,114731,114732,1229,114734,1233,114736,114738,1052,114740,114742,1242],{},[22,114733,1040],{},[17,114735,1232],{},[17,114737,1028],{},[22,114739,1047],{},[17,114741,1025],{},[22,114743,1051],{},[13,114745,114746],{},[22,114747,306],{},[72,114749,114750],{},[13,114751,114752,1229,114754,1233,114756,114758,1260],{},[22,114753,1040],{},[17,114755,1255],{},[17,114757,1025],{},[22,114759,1047],{},[13,114761,114762],{},[22,114763,1265],{},[72,114765,114766],{},[13,114767,114768,1229,114770,1274,114772,1277],{},[22,114769,1040],{},[78,114771,469],{},[22,114773,1047],{},[13,114775,114776],{},[22,114777,317],{},[49,114779,114780,114784,114788],{},[52,114781,114782],{},[17,114783,1288],{},[52,114785,114786],{},[17,114787,1293],{},[52,114789,114790],{},[17,114791,1298],{},[107,114793,109],{"id":109},[13,114795,112],{},[114,114797,114798],{"className":116,"code":1305,"language":118,"meta":119,"style":119},[17,114799,114800,114804,114808,114812,114816,114820,114824,114828,114832,114836,114840,114844,114848,114852,114856,114860,114864],{"__ignoreMap":119},[78,114801,114802],{"class":124,"line":125},[78,114803,129],{"emptyLinePlaceholder":128},[78,114805,114806],{"class":124,"line":132},[78,114807,135],{},[78,114809,114810],{"class":124,"line":138},[78,114811,1320],{},[78,114813,114814],{"class":124,"line":144},[78,114815,1325],{},[78,114817,114818],{"class":124,"line":150},[78,114819,1119],{},[78,114821,114822],{"class":124,"line":156},[78,114823,1334],{},[78,114825,114826],{"class":124,"line":162},[78,114827,1339],{},[78,114829,114830],{"class":124,"line":168},[78,114831,1344],{},[78,114833,114834],{"class":124,"line":174},[78,114835,1349],{},[78,114837,114838],{"class":124,"line":180},[78,114839,1354],{},[78,114841,114842],{"class":124,"line":186},[78,114843,1359],{},[78,114845,114846],{"class":124,"line":192},[78,114847,1364],{},[78,114849,114850],{"class":124,"line":198},[78,114851,207],{},[78,114853,114854],{"class":124,"line":204},[78,114855,1373],{},[78,114857,114858],{"class":124,"line":210},[78,114859,1378],{},[78,114861,114862],{"class":124,"line":216},[78,114863,219],{},[78,114865,114866],{"class":124,"line":222},[78,114867,207],{},[226,114869,228],{},{"title":119,"searchDepth":144,"depth":144,"links":114871},[114872],{"id":109,"depth":132,"text":109},{},{"title":1197,"description":1393},[246,1192,248,249],{"id":1401,"title":1402,"assetBase":7,"author":8,"body":114877,"category":1602,"collection":233,"date":1603,"description":1604,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115040,"navigation":128,"originalPath":239,"path":1606,"seo":115041,"source":243,"stem":1608,"tags":115042,"weight":250,"__hash__":1610},{"type":10,"value":114878,"toc":115037},[114879,114889,114891,114895,114907,114911,114923,114927,114937,114941,114967,114969,114971,115035],[13,114880,259,114881,1409,114883,1413,114885,1416,114887,67],{},[17,114882,262],{},[17,114884,1412],{},[17,114886,262],{},[17,114888,1419],{},[13,114890,1422],{},[13,114892,114893],{},[22,114894,293],{},[72,114896,114897],{},[13,114898,114899,1434,114901,114903,1441,114905,1445],{},[22,114900,1433],{},[78,114902,1437],{},[22,114904,1440],{},[22,114906,1444],{},[13,114908,114909],{},[22,114910,306],{},[72,114912,114913],{},[13,114914,114915,1456,114917,114919,1441,114921,1464],{},[22,114916,1433],{},[78,114918,1459],{},[22,114920,1440],{},[22,114922,1444],{},[13,114924,114925],{},[22,114926,1265],{},[72,114928,114929],{},[13,114930,114931,1475,114933,114935,1481],{},[22,114932,1433],{},[78,114934,1478],{},[22,114936,1440],{},[13,114938,114939],{},[22,114940,317],{},[49,114942,114943,114947,114951,114955,114961],{},[52,114944,114945],{},[17,114946,1492],{},[52,114948,114949],{},[17,114950,1497],{},[52,114952,114953],{},[17,114954,1502],{},[52,114956,114957,1018,114959,329],{},[17,114958,262],{},[17,114960,1509],{},[52,114962,114963,1514,114965],{},[17,114964,1412],{},[22,114966,1517],{},[107,114968,109],{"id":109},[13,114970,112],{},[114,114972,114973],{"className":116,"code":1524,"language":118,"meta":119,"style":119},[17,114974,114975,114979,114983,114987,114991,114995,114999,115003,115007,115011,115015,115019,115023,115027,115031],{"__ignoreMap":119},[78,114976,114977],{"class":124,"line":125},[78,114978,129],{"emptyLinePlaceholder":128},[78,114980,114981],{"class":124,"line":132},[78,114982,135],{},[78,114984,114985],{"class":124,"line":138},[78,114986,1539],{},[78,114988,114989],{"class":124,"line":144},[78,114990,1544],{},[78,114992,114993],{"class":124,"line":150},[78,114994,1549],{},[78,114996,114997],{"class":124,"line":156},[78,114998,1554],{},[78,115000,115001],{"class":124,"line":162},[78,115002,1559],{},[78,115004,115005],{"class":124,"line":168},[78,115006,1564],{},[78,115008,115009],{"class":124,"line":174},[78,115010,1569],{},[78,115012,115013],{"class":124,"line":180},[78,115014,1574],{},[78,115016,115017],{"class":124,"line":186},[78,115018,207],{},[78,115020,115021],{"class":124,"line":192},[78,115022,360],{},[78,115024,115025],{"class":124,"line":198},[78,115026,1587],{},[78,115028,115029],{"class":124,"line":204},[78,115030,1592],{},[78,115032,115033],{"class":124,"line":210},[78,115034,207],{},[226,115036,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115038},[115039],{"id":109,"depth":132,"text":109},{},{"title":1402,"description":1604},[246,248,449,450,249],{"id":1612,"title":1613,"assetBase":7,"author":8,"body":115044,"category":1812,"collection":233,"date":1603,"description":1813,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115209,"navigation":128,"originalPath":239,"path":1815,"seo":115210,"source":243,"stem":1817,"tags":115211,"weight":250,"__hash__":1820},{"type":10,"value":115045,"toc":115206},[115046,115050,115058,115062,115076,115080,115090,115094,115104,115108,115118,115122,115128,115130,115132,115204],[13,115047,1202,115048,1620],{},[17,115049,28],{},[13,115051,115052,1626,115054,1630,115056,1634],{},[22,115053,1625],{},[17,115055,1629],{},[17,115057,1633],{},[13,115059,115060],{},[22,115061,293],{},[72,115063,115064],{},[13,115065,115066,1645,115068,115070,1651,115072,1654,115074,1658],{},[22,115067,1040],{},[78,115069,1648],{},[22,115071,1047],{},[22,115073,1051],{},[78,115075,1657],{},[13,115077,115078],{},[22,115079,306],{},[72,115081,115082],{},[13,115083,115084,1645,115086,115088,1674],{},[22,115085,1040],{},[78,115087,1671],{},[22,115089,1047],{},[13,115091,115092],{},[22,115093,1265],{},[72,115095,115096],{},[13,115097,115098,1645,115100,115102,1690],{},[22,115099,1040],{},[78,115101,1687],{},[22,115103,1047],{},[13,115105,115106],{},[22,115107,317],{},[49,115109,115110,115114],{},[52,115111,115112],{},[17,115113,1701],{},[52,115115,115116],{},[17,115117,1706],{},[13,115119,115120],{},[22,115121,1711],{},[49,115123,115124],{},[52,115125,1716,115126,1720],{},[17,115127,1719],{},[107,115129,109],{"id":109},[13,115131,112],{},[114,115133,115134],{"className":116,"code":1727,"language":118,"meta":119,"style":119},[17,115135,115136,115140,115144,115148,115152,115156,115160,115164,115168,115172,115176,115180,115184,115188,115192,115196,115200],{"__ignoreMap":119},[78,115137,115138],{"class":124,"line":125},[78,115139,129],{"emptyLinePlaceholder":128},[78,115141,115142],{"class":124,"line":132},[78,115143,135],{},[78,115145,115146],{"class":124,"line":138},[78,115147,1742],{},[78,115149,115150],{"class":124,"line":144},[78,115151,906],{},[78,115153,115154],{"class":124,"line":150},[78,115155,911],{},[78,115157,115158],{"class":124,"line":156},[78,115159,1755],{},[78,115161,115162],{"class":124,"line":162},[78,115163,1760],{},[78,115165,115166],{"class":124,"line":168},[78,115167,1765],{},[78,115169,115170],{"class":124,"line":174},[78,115171,1770],{},[78,115173,115174],{"class":124,"line":180},[78,115175,1775],{},[78,115177,115178],{"class":124,"line":186},[78,115179,1780],{},[78,115181,115182],{"class":124,"line":192},[78,115183,1785],{},[78,115185,115186],{"class":124,"line":198},[78,115187,1790],{},[78,115189,115190],{"class":124,"line":204},[78,115191,207],{},[78,115193,115194],{"class":124,"line":210},[78,115195,213],{},[78,115197,115198],{"class":124,"line":216},[78,115199,219],{},[78,115201,115202],{"class":124,"line":222},[78,115203,207],{},[226,115205,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115207},[115208],{"id":109,"depth":132,"text":109},{},{"title":1613,"description":1813},[246,248,1819,249],{"id":1822,"title":1823,"assetBase":7,"author":8,"body":115213,"category":748,"collection":233,"date":1603,"description":2020,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115376,"navigation":128,"originalPath":239,"path":2022,"seo":115377,"source":243,"stem":2024,"tags":115378,"weight":250,"__hash__":2026},{"type":10,"value":115214,"toc":115373},[115215,115219,115223,115227,115231,115247,115251,115265,115269,115287,115289,115291,115371],[13,115216,1202,115217,1830],{},[17,115218,28],{},[13,115220,1833,115221,1837],{},[22,115222,1836],{},[13,115224,115225,1843],{},[22,115226,1842],{},[13,115228,115229],{},[22,115230,70],{},[72,115232,115233],{},[13,115234,115235,1645,115237,115239,1052,115241,115243,1864,115245,1868],{},[22,115236,1433],{},[78,115238,1856],{},[22,115240,1440],{},[17,115242,1861],{},[22,115244,1444],{},[78,115246,1867],{},[13,115248,115249],{},[22,115250,635],{},[72,115252,115253],{},[13,115254,115255,1645,115257,115259,1884,115261,1887,115263,1891],{},[22,115256,1433],{},[78,115258,1881],{},[22,115260,1440],{},[22,115262,1444],{},[78,115264,1890],{},[13,115266,115267],{},[22,115268,88],{},[49,115270,115271,115275,115279],{},[52,115272,115273],{},[17,115274,1902],{},[52,115276,115277],{},[17,115278,1907],{},[52,115280,115281,1912,115283,1916,115285,1919],{},[17,115282,28],{},[22,115284,1915],{},[22,115286,1836],{},[107,115288,109],{"id":109},[13,115290,112],{},[114,115292,115293],{"className":116,"code":1926,"language":118,"meta":119,"style":119},[17,115294,115295,115299,115303,115307,115311,115315,115319,115323,115327,115331,115335,115339,115343,115347,115351,115355,115359,115363,115367],{"__ignoreMap":119},[78,115296,115297],{"class":124,"line":125},[78,115298,129],{"emptyLinePlaceholder":128},[78,115300,115301],{"class":124,"line":132},[78,115302,135],{},[78,115304,115305],{"class":124,"line":138},[78,115306,1941],{},[78,115308,115309],{"class":124,"line":144},[78,115310,906],{},[78,115312,115313],{"class":124,"line":150},[78,115314,911],{},[78,115316,115317],{"class":124,"line":156},[78,115318,1954],{},[78,115320,115321],{"class":124,"line":162},[78,115322,1359],{},[78,115324,115325],{"class":124,"line":168},[78,115326,1963],{},[78,115328,115329],{"class":124,"line":174},[78,115330,1968],{},[78,115332,115333],{"class":124,"line":180},[78,115334,1973],{},[78,115336,115337],{"class":124,"line":186},[78,115338,1978],{},[78,115340,115341],{"class":124,"line":192},[78,115342,1983],{},[78,115344,115345],{"class":124,"line":198},[78,115346,1988],{},[78,115348,115349],{"class":124,"line":204},[78,115350,1993],{},[78,115352,115353],{"class":124,"line":210},[78,115354,1998],{},[78,115356,115357],{"class":124,"line":216},[78,115358,207],{},[78,115360,115361],{"class":124,"line":222},[78,115362,213],{},[78,115364,115365],{"class":124,"line":421},[78,115366,219],{},[78,115368,115369],{"class":124,"line":427},[78,115370,207],{},[226,115372,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115374},[115375],{"id":109,"depth":132,"text":109},{},{"title":1823,"description":2020},[246,248,249],{"id":2028,"title":2029,"assetBase":7,"author":8,"body":115380,"category":2228,"collection":233,"date":2229,"description":2230,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115541,"navigation":128,"originalPath":239,"path":2232,"seo":115542,"source":243,"stem":2234,"tags":115543,"weight":250,"__hash__":2237},{"type":10,"value":115381,"toc":115538},[115382,115388,115392,115398,115412,115416,115426,115430,115448,115450,115452,115536],[13,115383,2034,115384,2038,115386,2042],{},[17,115385,2037],{},[17,115387,2041],{},[13,115389,115390,2048],{},[22,115391,2047],{},[13,115393,115394,115396],{},[22,115395,293],{},[617,115397],{"alt":619,"src":2055},[72,115399,115400],{},[13,115401,115402,2062,115404,2066,115406,2070,115408,2073,115410,2076],{},[22,115403,1040],{},[78,115405,2065],{},[78,115407,2069],{},[22,115409,1047],{},[22,115411,1051],{},[13,115413,115414],{},[22,115415,306],{},[72,115417,115418],{},[13,115419,115420,2087,115422,2070,115424,2093],{},[22,115421,1040],{},[78,115423,2090],{},[22,115425,1047],{},[13,115427,115428],{},[22,115429,317],{},[49,115431,115432,115436,115440,115444],{},[52,115433,115434],{},[17,115435,2104],{},[52,115437,115438],{},[17,115439,2109],{},[52,115441,115442],{},[17,115443,2114],{},[52,115445,115446],{},[17,115447,2119],{},[107,115449,109],{"id":109},[13,115451,112],{},[114,115453,115454],{"className":116,"code":2126,"language":118,"meta":119,"style":119},[17,115455,115456,115460,115464,115468,115472,115476,115480,115484,115488,115492,115496,115500,115504,115508,115512,115516,115520,115524,115528,115532],{"__ignoreMap":119},[78,115457,115458],{"class":124,"line":125},[78,115459,129],{"emptyLinePlaceholder":128},[78,115461,115462],{"class":124,"line":132},[78,115463,135],{},[78,115465,115466],{"class":124,"line":138},[78,115467,2141],{},[78,115469,115470],{"class":124,"line":144},[78,115471,2146],{},[78,115473,115474],{"class":124,"line":150},[78,115475,2151],{},[78,115477,115478],{"class":124,"line":156},[78,115479,911],{},[78,115481,115482],{"class":124,"line":162},[78,115483,2160],{},[78,115485,115486],{"class":124,"line":168},[78,115487,2165],{},[78,115489,115490],{"class":124,"line":174},[78,115491,2170],{},[78,115493,115494],{"class":124,"line":180},[78,115495,2175],{},[78,115497,115498],{"class":124,"line":186},[78,115499,2180],{},[78,115501,115502],{"class":124,"line":192},[78,115503,2185],{},[78,115505,115506],{"class":124,"line":198},[78,115507,2190],{},[78,115509,115510],{"class":124,"line":204},[78,115511,2195],{},[78,115513,115514],{"class":124,"line":210},[78,115515,2200],{},[78,115517,115518],{"class":124,"line":216},[78,115519,2205],{},[78,115521,115522],{"class":124,"line":222},[78,115523,207],{},[78,115525,115526],{"class":124,"line":421},[78,115527,2214],{},[78,115529,115530],{"class":124,"line":427},[78,115531,219],{},[78,115533,115534],{"class":124,"line":433},[78,115535,207],{},[226,115537,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115539},[115540],{"id":109,"depth":132,"text":109},{},{"title":2029,"description":2230},[246,248,249,2236],{"id":2239,"title":2240,"assetBase":7,"author":8,"body":115545,"category":2478,"collection":233,"date":2229,"description":2479,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115742,"navigation":128,"originalPath":239,"path":2481,"seo":115743,"source":243,"stem":2483,"tags":115744,"weight":250,"__hash__":2485},{"type":10,"value":115546,"toc":115739},[115547,115551,115553,115555,115565,115569,115587,115591,115599,115603,115611,115615,115625,115627,115629,115737],[13,115548,2245,115549,2248],{},[17,115550,2037],{},[13,115552,2251],{},[13,115554,2254],{},[13,115556,115557,115559,115561,2264,115563,2267],{},[22,115558,293],{},[617,115560],{"alt":619,"src":2261},[22,115562,1040],{},[22,115564,1047],{},[13,115566,115567],{},[22,115568,306],{},[72,115570,115571,115579],{},[13,115572,115573,2278,115575,1048,115577,2283],{},[22,115574,1040],{},[22,115576,1047],{},[22,115578,1051],{},[2285,115580,115581,115583,115585],{},[52,115582,2289],{},[52,115584,2292],{},[52,115586,2295],{},[13,115588,115589],{},[22,115590,1265],{},[72,115592,115593],{},[13,115594,115595,2306,115597,2267],{},[22,115596,1040],{},[22,115598,1047],{},[13,115600,115601],{},[22,115602,2313],{},[72,115604,115605],{},[13,115606,115607,2320,115609,2323],{},[22,115608,1040],{},[22,115610,1047],{},[13,115612,115613],{},[22,115614,317],{},[49,115616,115617,115621],{},[52,115618,115619],{},[17,115620,2334],{},[52,115622,2337,115623],{},[17,115624,2340],{},[107,115626,109],{"id":109},[13,115628,112],{},[114,115630,115631],{"className":116,"code":2347,"language":118,"meta":119,"style":119},[17,115632,115633,115637,115641,115645,115649,115653,115657,115661,115665,115669,115673,115677,115681,115685,115689,115693,115697,115701,115705,115709,115713,115717,115721,115725,115729,115733],{"__ignoreMap":119},[78,115634,115635],{"class":124,"line":125},[78,115636,129],{"emptyLinePlaceholder":128},[78,115638,115639],{"class":124,"line":132},[78,115640,135],{},[78,115642,115643],{"class":124,"line":138},[78,115644,2362],{},[78,115646,115647],{"class":124,"line":144},[78,115648,2367],{},[78,115650,115651],{"class":124,"line":150},[78,115652,2372],{},[78,115654,115655],{"class":124,"line":156},[78,115656,2377],{},[78,115658,115659],{"class":124,"line":162},[78,115660,2190],{},[78,115662,115663],{"class":124,"line":168},[78,115664,2195],{},[78,115666,115667],{"class":124,"line":174},[78,115668,2390],{},[78,115670,115671],{"class":124,"line":180},[78,115672,2395],{},[78,115674,115675],{"class":124,"line":186},[78,115676,207],{},[78,115678,115679],{"class":124,"line":192},[78,115680,2404],{},[78,115682,115683],{"class":124,"line":198},[78,115684,535],{},[78,115686,115687],{"class":124,"line":204},[78,115688,219],{},[78,115690,115691],{"class":124,"line":210},[78,115692,2417],{},[78,115694,115695],{"class":124,"line":216},[78,115696,2422],{},[78,115698,115699],{"class":124,"line":222},[78,115700,1359],{},[78,115702,115703],{"class":124,"line":421},[78,115704,2431],{},[78,115706,115707],{"class":124,"line":427},[78,115708,2190],{},[78,115710,115711],{"class":124,"line":433},[78,115712,2440],{},[78,115714,115715],{"class":124,"line":2443},[78,115716,2195],{},[78,115718,115719],{"class":124,"line":2448},[78,115720,2451],{},[78,115722,115723],{"class":124,"line":2454},[78,115724,2457],{},[78,115726,115727],{"class":124,"line":2460},[78,115728,1359],{},[78,115730,115731],{"class":124,"line":2465},[78,115732,1163],{},[78,115734,115735],{"class":124,"line":2470},[78,115736,207],{},[226,115738,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115740},[115741],{"id":109,"depth":132,"text":109},{},{"title":2240,"description":2479},[246,1193,249],{"id":2487,"title":2488,"assetBase":7,"author":8,"body":115746,"category":748,"collection":233,"date":2229,"description":2686,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":115915,"navigation":128,"originalPath":239,"path":2688,"seo":115916,"source":243,"stem":2690,"tags":115917,"weight":250,"__hash__":2692},{"type":10,"value":115747,"toc":115912},[115748,115756,115760,115776,115780,115792,115796,115806,115808,115810,115910],[13,115749,2493,115750,20,115752,2500,115754,2503],{},[22,115751,2496],{},[22,115753,2499],{},[17,115755,28],{},[13,115757,115758],{},[22,115759,293],{},[72,115761,115762],{},[13,115763,115764,1645,115766,115768,1441,115770,2521,115772,1018,115774,285],{},[22,115765,1040],{},[78,115767,2516],{},[22,115769,1047],{},[22,115771,1051],{},[78,115773,2524],{},[78,115775,1028],{},[13,115777,115778],{},[22,115779,306],{},[72,115781,115782],{},[13,115783,115784,1645,115786,115788,2542,115790,2545],{},[22,115785,1040],{},[78,115787,2539],{},[22,115789,1047],{},[22,115791,1051],{},[13,115793,115794],{},[22,115795,317],{},[49,115797,115798,115802],{},[52,115799,115800],{},[17,115801,2556],{},[52,115803,115804],{},[17,115805,2561],{},[107,115807,109],{"id":109},[13,115809,112],{},[114,115811,115812],{"className":116,"code":2568,"language":118,"meta":119,"style":119},[17,115813,115814,115818,115822,115826,115830,115834,115838,115842,115846,115850,115854,115858,115862,115866,115870,115874,115878,115882,115886,115890,115894,115898,115902,115906],{"__ignoreMap":119},[78,115815,115816],{"class":124,"line":125},[78,115817,129],{"emptyLinePlaceholder":128},[78,115819,115820],{"class":124,"line":132},[78,115821,135],{},[78,115823,115824],{"class":124,"line":138},[78,115825,2583],{},[78,115827,115828],{"class":124,"line":144},[78,115829,2588],{},[78,115831,115832],{"class":124,"line":150},[78,115833,2593],{},[78,115835,115836],{"class":124,"line":156},[78,115837,2598],{},[78,115839,115840],{"class":124,"line":162},[78,115841,2603],{},[78,115843,115844],{"class":124,"line":168},[78,115845,2608],{},[78,115847,115848],{"class":124,"line":174},[78,115849,129],{"emptyLinePlaceholder":128},[78,115851,115852],{"class":124,"line":180},[78,115853,2617],{},[78,115855,115856],{"class":124,"line":186},[78,115857,2603],{},[78,115859,115860],{"class":124,"line":192},[78,115861,1359],{},[78,115863,115864],{"class":124,"line":198},[78,115865,2630],{},[78,115867,115868],{"class":124,"line":204},[78,115869,2635],{},[78,115871,115872],{"class":124,"line":210},[78,115873,2640],{},[78,115875,115876],{"class":124,"line":216},[78,115877,2645],{},[78,115879,115880],{"class":124,"line":222},[78,115881,2650],{},[78,115883,115884],{"class":124,"line":421},[78,115885,2655],{},[78,115887,115888],{"class":124,"line":427},[78,115889,129],{"emptyLinePlaceholder":128},[78,115891,115892],{"class":124,"line":433},[78,115893,2664],{},[78,115895,115896],{"class":124,"line":2443},[78,115897,207],{},[78,115899,115900],{"class":124,"line":2448},[78,115901,213],{},[78,115903,115904],{"class":124,"line":2454},[78,115905,1592],{},[78,115907,115908],{"class":124,"line":2460},[78,115909,207],{},[226,115911,228],{},{"title":119,"searchDepth":144,"depth":144,"links":115913},[115914],{"id":109,"depth":132,"text":109},{},{"title":2488,"description":2686},[246,248,249],{"id":2694,"title":2695,"assetBase":239,"author":8,"body":115919,"category":787,"collection":233,"date":2229,"description":2700,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":115925,"navigation":128,"originalPath":239,"path":2704,"seo":115926,"source":243,"stem":2706,"tags":115927,"weight":250,"__hash__":2709},{"type":10,"value":115920,"toc":115923},[115921],[13,115922,2700],{},{"title":119,"searchDepth":144,"depth":144,"links":115924},[],{},{"title":2695,"description":2700},[2708],{"id":2711,"title":2712,"assetBase":7,"author":8,"body":115929,"category":2917,"collection":233,"date":2918,"description":2919,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116102,"navigation":128,"originalPath":239,"path":2921,"seo":116103,"source":243,"stem":2923,"tags":116104,"weight":250,"__hash__":2925},{"type":10,"value":115930,"toc":116099},[115931,115937,115941,115951,115955,115963,115967,115977,115979,115981,116097],[13,115932,259,115933,2719,115935,2722],{},[17,115934,262],{},[17,115936,262],{},[13,115938,115939],{},[22,115940,293],{},[72,115942,115943],{},[13,115944,115945,2733,115947,2736,115949,2739],{},[22,115946,1040],{},[22,115948,1047],{},[22,115950,1051],{},[13,115952,115953],{},[22,115954,306],{},[72,115956,115957],{},[13,115958,115959,2750,115961,2753],{},[22,115960,1040],{},[22,115962,1047],{},[13,115964,115965],{},[22,115966,317],{},[49,115968,115969,115973],{},[52,115970,115971],{},[17,115972,2764],{},[52,115974,115975,2769],{},[17,115976,262],{},[107,115978,109],{"id":109},[13,115980,112],{},[114,115982,115983],{"className":116,"code":2776,"language":118,"meta":119,"style":119},[17,115984,115985,115989,115993,115997,116001,116005,116009,116013,116017,116021,116025,116029,116033,116037,116041,116045,116049,116053,116057,116061,116065,116069,116073,116077,116081,116085,116089,116093],{"__ignoreMap":119},[78,115986,115987],{"class":124,"line":125},[78,115988,129],{"emptyLinePlaceholder":128},[78,115990,115991],{"class":124,"line":132},[78,115992,135],{},[78,115994,115995],{"class":124,"line":138},[78,115996,2791],{},[78,115998,115999],{"class":124,"line":144},[78,116000,2796],{},[78,116002,116003],{"class":124,"line":150},[78,116004,2801],{},[78,116006,116007],{"class":124,"line":156},[78,116008,2806],{},[78,116010,116011],{"class":124,"line":162},[78,116012,2811],{},[78,116014,116015],{"class":124,"line":168},[78,116016,129],{"emptyLinePlaceholder":128},[78,116018,116019],{"class":124,"line":174},[78,116020,2820],{},[78,116022,116023],{"class":124,"line":180},[78,116024,2825],{},[78,116026,116027],{"class":124,"line":186},[78,116028,2830],{},[78,116030,116031],{"class":124,"line":192},[78,116032,2835],{},[78,116034,116035],{"class":124,"line":198},[78,116036,2840],{},[78,116038,116039],{"class":124,"line":204},[78,116040,129],{"emptyLinePlaceholder":128},[78,116042,116043],{"class":124,"line":210},[78,116044,384],{},[78,116046,116047],{"class":124,"line":216},[78,116048,2853],{},[78,116050,116051],{"class":124,"line":222},[78,116052,2858],{},[78,116054,116055],{"class":124,"line":421},[78,116056,2863],{},[78,116058,116059],{"class":124,"line":427},[78,116060,2868],{},[78,116062,116063],{"class":124,"line":433},[78,116064,2873],{},[78,116066,116067],{"class":124,"line":2443},[78,116068,2878],{},[78,116070,116071],{"class":124,"line":2448},[78,116072,2883],{},[78,116074,116075],{"class":124,"line":2454},[78,116076,129],{"emptyLinePlaceholder":128},[78,116078,116079],{"class":124,"line":2460},[78,116080,2892],{},[78,116082,116083],{"class":124,"line":2465},[78,116084,207],{},[78,116086,116087],{"class":124,"line":2470},[78,116088,360],{},[78,116090,116091],{"class":124,"line":2903},[78,116092,2906],{},[78,116094,116095],{"class":124,"line":2909},[78,116096,207],{},[226,116098,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116100},[116101],{"id":109,"depth":132,"text":109},{},{"title":2712,"description":2919},[246,451,450,249],{"id":2927,"title":2928,"assetBase":7,"author":8,"body":116106,"category":3157,"collection":233,"date":2918,"description":3158,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116293,"navigation":128,"originalPath":239,"path":3160,"seo":116294,"source":243,"stem":3162,"tags":116295,"weight":250,"__hash__":3164},{"type":10,"value":116107,"toc":116290},[116108,116120,116124,116136,116140,116144,116156,116160,116170,116174,116184,116188,116200,116202,116204,116288],[13,116109,2933,116110,1018,116112,2940,116114,2944,116116,996,116118,285],{},[17,116111,2936],{},[17,116113,2939],{},[22,116115,2943],{},[22,116117,2943],{},[17,116119,2949],{},[13,116121,2952,116122,2955],{},[22,116123,1625],{},[49,116125,116126],{},[52,116127,2960,116128,2964,116130,2968,116132,2972,116134,1634],{},[17,116129,2963],{},[17,116131,2967],{},[17,116133,2971],{},[17,116135,2967],{},[13,116137,2977,116138,2980],{},[22,116139,2943],{},[13,116141,116142],{},[22,116143,293],{},[72,116145,116146],{},[13,116147,116148,2991,116150,2994,116152,116154,3000],{},[22,116149,1040],{},[22,116151,1047],{},[2996,116153],{},[22,116155,1051],{},[13,116157,116158],{},[22,116159,306],{},[72,116161,116162],{},[13,116163,116164,3011,116166,1048,116168,3016],{},[22,116165,1040],{},[22,116167,1047],{},[22,116169,1051],{},[13,116171,116172],{},[22,116173,1265],{},[72,116175,116176],{},[13,116177,116178,3027,116180,1884,116182,3032],{},[22,116179,1040],{},[22,116181,1047],{},[22,116183,1051],{},[13,116185,116186],{},[22,116187,317],{},[49,116189,116190,116194],{},[52,116191,116192],{},[17,116193,3043],{},[52,116195,116196,1018,116198,3050],{},[17,116197,2936],{},[17,116199,2939],{},[107,116201,109],{"id":109},[13,116203,112],{},[114,116205,116206],{"className":116,"code":3057,"language":118,"meta":119,"style":119},[17,116207,116208,116212,116216,116220,116224,116228,116232,116236,116240,116244,116248,116252,116256,116260,116264,116268,116272,116276,116280,116284],{"__ignoreMap":119},[78,116209,116210],{"class":124,"line":125},[78,116211,129],{"emptyLinePlaceholder":128},[78,116213,116214],{"class":124,"line":132},[78,116215,135],{},[78,116217,116218],{"class":124,"line":138},[78,116219,3072],{},[78,116221,116222],{"class":124,"line":144},[78,116223,3077],{},[78,116225,116226],{"class":124,"line":150},[78,116227,3082],{},[78,116229,116230],{"class":124,"line":156},[78,116231,129],{"emptyLinePlaceholder":128},[78,116233,116234],{"class":124,"line":162},[78,116235,3091],{},[78,116237,116238],{"class":124,"line":168},[78,116239,3096],{},[78,116241,116242],{"class":124,"line":174},[78,116243,3101],{},[78,116245,116246],{"class":124,"line":180},[78,116247,3106],{},[78,116249,116250],{"class":124,"line":186},[78,116251,3111],{},[78,116253,116254],{"class":124,"line":192},[78,116255,3116],{},[78,116257,116258],{"class":124,"line":198},[78,116259,1359],{},[78,116261,116262],{"class":124,"line":204},[78,116263,3125],{},[78,116265,116266],{"class":124,"line":210},[78,116267,1359],{},[78,116269,116270],{"class":124,"line":216},[78,116271,207],{},[78,116273,116274],{"class":124,"line":222},[78,116275,3138],{},[78,116277,116278],{"class":124,"line":421},[78,116279,3143],{},[78,116281,116282],{"class":124,"line":427},[78,116283,219],{},[78,116285,116286],{"class":124,"line":433},[78,116287,207],{},[226,116289,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116291},[116292],{"id":109,"depth":132,"text":109},{},{"title":2928,"description":3158},[246,450,249],{"id":3166,"title":3167,"assetBase":7,"author":8,"body":116297,"category":3157,"collection":233,"date":2918,"description":3398,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116490,"navigation":128,"originalPath":239,"path":3400,"seo":116491,"source":243,"stem":3402,"tags":116492,"weight":250,"__hash__":3404},{"type":10,"value":116298,"toc":116487},[116299,116311,116313,116321,116325,116335,116339,116349,116353,116365,116367,116369,116485],[13,116300,3172,116301,1018,116303,3179,116305,3189],{},[17,116302,3175],{},[17,116304,3178],{},[596,116306,3182,116307,3185,116309,3188],{},[17,116308,3175],{},[17,116310,3178],{},[13,116312,3192],{},[49,116314,116315,116317,116319],{},[52,116316,3197],{},[52,116318,3200],{},[52,116320,3203],{},[13,116322,116323],{},[22,116324,293],{},[72,116326,116327],{},[13,116328,116329,3214,116331,1048,116333,3219],{},[22,116330,1040],{},[22,116332,1047],{},[22,116334,1051],{},[13,116336,116337],{},[22,116338,306],{},[72,116340,116341],{},[13,116342,116343,3230,116345,3233,116347,3236],{},[22,116344,1040],{},[22,116346,1047],{},[22,116348,1051],{},[13,116350,116351],{},[22,116352,317],{},[49,116354,116355,116359],{},[52,116356,116357],{},[17,116358,3247],{},[52,116360,116361,1018,116363,3254],{},[17,116362,3175],{},[17,116364,3178],{},[107,116366,109],{"id":109},[13,116368,112],{},[114,116370,116371],{"className":116,"code":3261,"language":118,"meta":119,"style":119},[17,116372,116373,116377,116381,116385,116389,116393,116397,116401,116405,116409,116413,116417,116421,116425,116429,116433,116437,116441,116445,116449,116453,116457,116461,116465,116469,116473,116477,116481],{"__ignoreMap":119},[78,116374,116375],{"class":124,"line":125},[78,116376,129],{"emptyLinePlaceholder":128},[78,116378,116379],{"class":124,"line":132},[78,116380,135],{},[78,116382,116383],{"class":124,"line":138},[78,116384,3276],{},[78,116386,116387],{"class":124,"line":144},[78,116388,3281],{},[78,116390,116391],{"class":124,"line":150},[78,116392,3286],{},[78,116394,116395],{"class":124,"line":156},[78,116396,3291],{},[78,116398,116399],{"class":124,"line":162},[78,116400,3296],{},[78,116402,116403],{"class":124,"line":168},[78,116404,3082],{},[78,116406,116407],{"class":124,"line":174},[78,116408,129],{"emptyLinePlaceholder":128},[78,116410,116411],{"class":124,"line":180},[78,116412,3309],{},[78,116414,116415],{"class":124,"line":186},[78,116416,3314],{},[78,116418,116419],{"class":124,"line":192},[78,116420,3319],{},[78,116422,116423],{"class":124,"line":198},[78,116424,3324],{},[78,116426,116427],{"class":124,"line":204},[78,116428,3091],{},[78,116430,116431],{"class":124,"line":210},[78,116432,3096],{},[78,116434,116435],{"class":124,"line":216},[78,116436,3337],{},[78,116438,116439],{"class":124,"line":222},[78,116440,3342],{},[78,116442,116443],{"class":124,"line":421},[78,116444,3347],{},[78,116446,116447],{"class":124,"line":427},[78,116448,3352],{},[78,116450,116451],{"class":124,"line":433},[78,116452,3357],{},[78,116454,116455],{"class":124,"line":2443},[78,116456,3362],{},[78,116458,116459],{"class":124,"line":2448},[78,116460,1359],{},[78,116462,116463],{"class":124,"line":2454},[78,116464,3125],{},[78,116466,116467],{"class":124,"line":2460},[78,116468,207],{},[78,116470,116471],{"class":124,"line":2465},[78,116472,3379],{},[78,116474,116475],{"class":124,"line":2470},[78,116476,3384],{},[78,116478,116479],{"class":124,"line":2903},[78,116480,219],{},[78,116482,116483],{"class":124,"line":2909},[78,116484,207],{},[226,116486,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116488},[116489],{"id":109,"depth":132,"text":109},{},{"title":3167,"description":3398},[246,450,249],{"id":3406,"title":3407,"assetBase":7,"author":8,"body":116494,"category":248,"collection":233,"date":2918,"description":3578,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116643,"navigation":128,"originalPath":239,"path":3580,"seo":116644,"source":243,"stem":3582,"tags":116645,"weight":250,"__hash__":3584},{"type":10,"value":116495,"toc":116640},[116496,116502,116504,116508,116518,116522,116532,116536,116546,116550,116562,116564,116566,116638],[13,116497,2493,116498,3414,116500,3417],{},[22,116499,2499],{},[17,116501,28],{},[13,116503,3420],{},[13,116505,116506],{},[22,116507,3425],{},[72,116509,116510],{},[13,116511,116512,1645,116514,116516,1690],{},[22,116513,1040],{},[78,116515,3434],{},[22,116517,1047],{},[13,116519,116520],{},[22,116521,3441],{},[72,116523,116524],{},[13,116525,116526,1645,116528,116530,1674],{},[22,116527,1040],{},[78,116529,3450],{},[22,116531,1047],{},[13,116533,116534],{},[22,116535,3457],{},[72,116537,116538],{},[13,116539,116540,1645,116542,116544,1690],{},[22,116541,1040],{},[78,116543,469],{},[22,116545,1047],{},[13,116547,116548],{},[22,116549,317],{},[49,116551,116552,116556,116560],{},[52,116553,116554],{},[17,116555,3478],{},[52,116557,116558],{},[17,116559,3483],{},[52,116561,3486],{},[107,116563,109],{"id":109},[13,116565,112],{},[114,116567,116568],{"className":116,"code":3493,"language":118,"meta":119,"style":119},[17,116569,116570,116574,116578,116582,116586,116590,116594,116598,116602,116606,116610,116614,116618,116622,116626,116630,116634],{"__ignoreMap":119},[78,116571,116572],{"class":124,"line":125},[78,116573,129],{"emptyLinePlaceholder":128},[78,116575,116576],{"class":124,"line":132},[78,116577,135],{},[78,116579,116580],{"class":124,"line":138},[78,116581,3508],{},[78,116583,116584],{"class":124,"line":144},[78,116585,3513],{},[78,116587,116588],{"class":124,"line":150},[78,116589,2640],{},[78,116591,116592],{"class":124,"line":156},[78,116593,3522],{},[78,116595,116596],{"class":124,"line":162},[78,116597,3527],{},[78,116599,116600],{"class":124,"line":168},[78,116601,699],{},[78,116603,116604],{"class":124,"line":174},[78,116605,3536],{},[78,116607,116608],{"class":124,"line":180},[78,116609,3541],{},[78,116611,116612],{"class":124,"line":186},[78,116613,3546],{},[78,116615,116616],{"class":124,"line":192},[78,116617,3551],{},[78,116619,116620],{"class":124,"line":198},[78,116621,3556],{},[78,116623,116624],{"class":124,"line":204},[78,116625,207],{},[78,116627,116628],{"class":124,"line":210},[78,116629,213],{},[78,116631,116632],{"class":124,"line":216},[78,116633,219],{},[78,116635,116636],{"class":124,"line":222},[78,116637,207],{},[226,116639,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116641},[116642],{"id":109,"depth":132,"text":109},{},{"title":3407,"description":3578},[246,248],{"id":3586,"title":3587,"assetBase":7,"author":8,"body":116647,"category":3752,"collection":233,"date":2918,"description":3753,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116792,"navigation":128,"originalPath":239,"path":3755,"seo":116793,"source":243,"stem":3757,"tags":116794,"weight":250,"__hash__":3760},{"type":10,"value":116648,"toc":116789},[116649,116659,116661,116665,116675,116679,116689,116693,116709,116711,116713,116715,116787],[13,116650,3592,116651,3595,116653,3598,116655,1052,116657,3605],{},[17,116652,19],{},[17,116654,28],{},[22,116656,3601],{},[17,116658,3604],{},[13,116660,3608],{},[13,116662,116663],{},[22,116664,293],{},[72,116666,116667],{},[13,116668,116669,1645,116671,116673,2994],{},[22,116670,1040],{},[78,116672,3621],{},[22,116674,1047],{},[13,116676,116677],{},[22,116678,306],{},[72,116680,116681],{},[13,116682,116683,1645,116685,116687,3639],{},[22,116684,1040],{},[78,116686,3636],{},[22,116688,1047],{},[13,116690,116691],{},[22,116692,317],{},[49,116694,116695,116699,116703,116707],{},[52,116696,116697],{},[17,116698,3650],{},[52,116700,116701],{},[17,116702,3655],{},[52,116704,116705],{},[17,116706,3660],{},[52,116708,3663],{},[13,116710,3666],{},[107,116712,109],{"id":109},[13,116714,112],{},[114,116716,116717],{"className":116,"code":3673,"language":118,"meta":119,"style":119},[17,116718,116719,116723,116727,116731,116735,116739,116743,116747,116751,116755,116759,116763,116767,116771,116775,116779,116783],{"__ignoreMap":119},[78,116720,116721],{"class":124,"line":125},[78,116722,129],{"emptyLinePlaceholder":128},[78,116724,116725],{"class":124,"line":132},[78,116726,135],{},[78,116728,116729],{"class":124,"line":138},[78,116730,3688],{},[78,116732,116733],{"class":124,"line":144},[78,116734,3513],{},[78,116736,116737],{"class":124,"line":150},[78,116738,2640],{},[78,116740,116741],{"class":124,"line":156},[78,116742,3522],{},[78,116744,116745],{"class":124,"line":162},[78,116746,3527],{},[78,116748,116749],{"class":124,"line":168},[78,116750,699],{},[78,116752,116753],{"class":124,"line":174},[78,116754,3536],{},[78,116756,116757],{"class":124,"line":180},[78,116758,3541],{},[78,116760,116761],{"class":124,"line":186},[78,116762,3721],{},[78,116764,116765],{"class":124,"line":192},[78,116766,3551],{},[78,116768,116769],{"class":124,"line":198},[78,116770,3730],{},[78,116772,116773],{"class":124,"line":204},[78,116774,207],{},[78,116776,116777],{"class":124,"line":210},[78,116778,213],{},[78,116780,116781],{"class":124,"line":216},[78,116782,219],{},[78,116784,116785],{"class":124,"line":222},[78,116786,207],{},[226,116788,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116790},[116791],{"id":109,"depth":132,"text":109},{},{"title":3587,"description":3753},[246,248,449,3759],{"id":3762,"title":3763,"assetBase":7,"author":8,"body":116796,"category":3963,"collection":233,"date":3964,"description":3965,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":116969,"navigation":128,"originalPath":239,"path":3967,"seo":116970,"source":243,"stem":3969,"tags":116971,"weight":250,"__hash__":3971},{"type":10,"value":116797,"toc":116966},[116798,116806,116814,116816,116820,116832,116836,116848,116852,116872,116876,116880,116882,116884,116964],[13,116799,3768,116800,3771,116802,3774,116804,3778],{},[17,116801,19],{},[17,116803,28],{},[22,116805,3777],{},[13,116807,3781,116808,3784,116810,1018,116812,3789],{},[17,116809,2949],{},[17,116811,469],{},[17,116813,472],{},[13,116815,3792],{},[13,116817,116818],{},[22,116819,293],{},[72,116821,116822],{},[13,116823,116824,1645,116826,116828,1052,116830],{},[22,116825,1040],{},[78,116827,3805],{},[22,116829,1047],{},[78,116831,3810],{},[13,116833,116834],{},[22,116835,306],{},[72,116837,116838],{},[13,116839,116840,1645,116842,116844,1052,116846],{},[22,116841,1040],{},[78,116843,3823],{},[22,116845,1047],{},[78,116847,3828],{},[13,116849,116850],{},[22,116851,317],{},[49,116853,116854,116858,116862],{},[52,116855,116856],{},[17,116857,3650],{},[52,116859,116860],{},[17,116861,3843],{},[52,116863,116864,3848,116866,1011,116868,275,116870],{},[17,116865,35],{},[17,116867,2949],{},[17,116869,469],{},[17,116871,472],{},[13,116873,116874],{},[22,116875,1711],{},[49,116877,116878],{},[52,116879,3863],{},[107,116881,109],{"id":109},[13,116883,112],{},[114,116885,116886],{"className":116,"code":3870,"language":118,"meta":119,"style":119},[17,116887,116888,116892,116896,116900,116904,116908,116912,116916,116920,116924,116928,116932,116936,116940,116944,116948,116952,116956,116960],{"__ignoreMap":119},[78,116889,116890],{"class":124,"line":125},[78,116891,129],{"emptyLinePlaceholder":128},[78,116893,116894],{"class":124,"line":132},[78,116895,135],{},[78,116897,116898],{"class":124,"line":138},[78,116899,3885],{},[78,116901,116902],{"class":124,"line":144},[78,116903,3890],{},[78,116905,116906],{"class":124,"line":150},[78,116907,3895],{},[78,116909,116910],{"class":124,"line":156},[78,116911,1760],{},[78,116913,116914],{"class":124,"line":162},[78,116915,3904],{},[78,116917,116918],{"class":124,"line":168},[78,116919,3909],{},[78,116921,116922],{"class":124,"line":174},[78,116923,3914],{},[78,116925,116926],{"class":124,"line":180},[78,116927,3919],{},[78,116929,116930],{"class":124,"line":186},[78,116931,3924],{},[78,116933,116934],{"class":124,"line":192},[78,116935,3909],{},[78,116937,116938],{"class":124,"line":198},[78,116939,3914],{},[78,116941,116942],{"class":124,"line":204},[78,116943,699],{},[78,116945,116946],{"class":124,"line":210},[78,116947,3909],{},[78,116949,116950],{"class":124,"line":216},[78,116951,207],{},[78,116953,116954],{"class":124,"line":222},[78,116955,213],{},[78,116957,116958],{"class":124,"line":421},[78,116959,3953],{},[78,116961,116962],{"class":124,"line":427},[78,116963,207],{},[226,116965,228],{},{"title":119,"searchDepth":144,"depth":144,"links":116967},[116968],{"id":109,"depth":132,"text":109},{},{"title":3763,"description":3965},[246,248,451,3759],{"id":3973,"title":3974,"assetBase":7,"author":8,"body":116973,"category":4241,"collection":233,"date":3964,"description":4242,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":117192,"navigation":128,"originalPath":239,"path":4244,"seo":117193,"source":243,"stem":4246,"tags":117194,"weight":250,"__hash__":4248},{"type":10,"value":116974,"toc":117189},[116975,116979,116995,117001,117023,117029,117033,117037,117049,117053,117065,117069,117081,117085,117095,117097,117099,117187],[13,116976,3979,116977,3983],{},[22,116978,3982],{},[49,116980,116981],{},[52,116982,2960,116983,3991,116985,3995,116987,1011,116989,1011,116991,1011,116993,285],{},[17,116984,3990],{},[17,116986,3994],{},[17,116988,3998],{},[17,116990,4001],{},[17,116992,4004],{},[17,116994,4007],{},[13,116996,4010,116997,4014,116999,4017],{},[22,116998,4013],{},[22,117000,4013],{},[49,117002,117003,117009,117015],{},[52,117004,2960,117005,4024,117007,285],{},[17,117006,3990],{},[17,117008,4001],{},[52,117010,4029,117011,4024,117013,285],{},[17,117012,4032],{},[17,117014,4004],{},[52,117016,4037,117017,4024,117019,4043,117021,4047],{},[17,117018,4040],{},[17,117020,3998],{},[17,117022,4046],{},[13,117024,1202,117025,4052,117027,4055],{},[17,117026,28],{},[17,117028,28],{},[13,117030,4058,117031,4061],{},[22,117032,3777],{},[13,117034,117035],{},[22,117036,293],{},[72,117038,117039],{},[13,117040,117041,1645,117043,117045,1052,117047],{},[22,117042,1040],{},[78,117044,4074],{},[22,117046,1047],{},[78,117048,4079],{},[13,117050,117051],{},[22,117052,306],{},[72,117054,117055],{},[13,117056,117057,1645,117059,117061,1052,117063],{},[22,117058,1040],{},[78,117060,4092],{},[22,117062,1047],{},[78,117064,4074],{},[13,117066,117067],{},[22,117068,1265],{},[72,117070,117071],{},[13,117072,117073,1645,117075,117077,1052,117079],{},[22,117074,1040],{},[78,117076,4109],{},[22,117078,1047],{},[78,117080,2065],{},[13,117082,117083],{},[22,117084,317],{},[49,117086,117087,117091],{},[52,117088,117089],{},[17,117090,869],{},[52,117092,117093],{},[17,117094,4128],{},[107,117096,109],{"id":109},[13,117098,112],{},[114,117100,117101],{"className":116,"code":4135,"language":118,"meta":119,"style":119},[17,117102,117103,117107,117111,117115,117119,117123,117127,117131,117135,117139,117143,117147,117151,117155,117159,117163,117167,117171,117175,117179,117183],{"__ignoreMap":119},[78,117104,117105],{"class":124,"line":125},[78,117106,129],{"emptyLinePlaceholder":128},[78,117108,117109],{"class":124,"line":132},[78,117110,135],{},[78,117112,117113],{"class":124,"line":138},[78,117114,4150],{},[78,117116,117117],{"class":124,"line":144},[78,117118,4155],{},[78,117120,117121],{"class":124,"line":150},[78,117122,4160],{},[78,117124,117125],{"class":124,"line":156},[78,117126,4165],{},[78,117128,117129],{"class":124,"line":162},[78,117130,4170],{},[78,117132,117133],{"class":124,"line":168},[78,117134,4175],{},[78,117136,117137],{"class":124,"line":174},[78,117138,4180],{},[78,117140,117141],{"class":124,"line":180},[78,117142,4185],{},[78,117144,117145],{"class":124,"line":186},[78,117146,4190],{},[78,117148,117149],{"class":124,"line":192},[78,117150,1359],{},[78,117152,117153],{"class":124,"line":198},[78,117154,4199],{},[78,117156,117157],{"class":124,"line":204},[78,117158,4204],{},[78,117160,117161],{"class":124,"line":210},[78,117162,4209],{},[78,117164,117165],{"class":124,"line":216},[78,117166,4214],{},[78,117168,117169],{"class":124,"line":222},[78,117170,4219],{},[78,117172,117173],{"class":124,"line":421},[78,117174,207],{},[78,117176,117177],{"class":124,"line":427},[78,117178,213],{},[78,117180,117181],{"class":124,"line":433},[78,117182,3953],{},[78,117184,117185],{"class":124,"line":2443},[78,117186,207],{},[226,117188,228],{},{"title":119,"searchDepth":144,"depth":144,"links":117190},[117191],{"id":109,"depth":132,"text":109},{},{"title":3974,"description":4242},[246,248,451],{"id":4250,"title":4251,"assetBase":7,"author":8,"body":117196,"category":4503,"collection":233,"date":3964,"description":4504,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":117399,"navigation":128,"originalPath":239,"path":4506,"seo":117400,"source":243,"stem":4508,"tags":117401,"weight":250,"__hash__":4510},{"type":10,"value":117197,"toc":117396},[117198,117210,117218,117226,117230,117240,117244,117254,117258,117268,117272,117296,117300,117310,117312,117314,117394],[13,117199,4256,117200,4260,117202,4263,117204,4267,117206,1018,117208,4272],{},[17,117201,4259],{},[17,117203,28],{},[17,117205,4266],{},[17,117207,469],{},[17,117209,19],{},[13,117211,4275,117212,4278,117214,996,117216,285],{},[17,117213,28],{},[22,117215,4281],{},[22,117217,4284],{},[13,117219,4287,117220,2500,117222,4293,117224,4297],{},[22,117221,4290],{},[17,117223,28],{},[17,117225,4296],{},[13,117227,117228],{},[22,117229,293],{},[72,117231,117232],{},[13,117233,117234,1645,117236,117238,3639],{},[22,117235,1040],{},[78,117237,4310],{},[22,117239,1047],{},[13,117241,117242],{},[22,117243,306],{},[72,117245,117246],{},[13,117247,117248,1645,117250,117252,2994],{},[22,117249,1040],{},[78,117251,4325],{},[22,117253,1047],{},[13,117255,117256],{},[22,117257,4332],{},[72,117259,117260],{},[13,117261,117262,1645,117264,117266,2994],{},[22,117263,1040],{},[78,117265,4341],{},[22,117267,1047],{},[13,117269,117270],{},[22,117271,317],{},[49,117273,117274,117278,117282,117286],{},[52,117275,117276],{},[17,117277,4354],{},[52,117279,117280],{},[17,117281,4359],{},[52,117283,117284],{},[17,117285,4364],{},[52,117287,117288,4369,117290,4373,117292,4377,117294],{},[17,117289,28],{},[22,117291,4372],{},[22,117293,4376],{},[22,117295,4380],{},[13,117297,117298],{},[22,117299,1711],{},[49,117301,117302,117306],{},[52,117303,4389,117304,4392],{},[17,117305,28],{},[52,117307,4395,117308,4399],{},[17,117309,4398],{},[107,117311,109],{"id":109},[13,117313,112],{},[114,117315,117316],{"className":116,"code":4406,"language":118,"meta":119,"style":119},[17,117317,117318,117322,117326,117330,117334,117338,117342,117346,117350,117354,117358,117362,117366,117370,117374,117378,117382,117386,117390],{"__ignoreMap":119},[78,117319,117320],{"class":124,"line":125},[78,117321,129],{"emptyLinePlaceholder":128},[78,117323,117324],{"class":124,"line":132},[78,117325,135],{},[78,117327,117328],{"class":124,"line":138},[78,117329,4421],{},[78,117331,117332],{"class":124,"line":144},[78,117333,4426],{},[78,117335,117336],{"class":124,"line":150},[78,117337,4431],{},[78,117339,117340],{"class":124,"line":156},[78,117341,4436],{},[78,117343,117344],{"class":124,"line":162},[78,117345,4441],{},[78,117347,117348],{"class":124,"line":168},[78,117349,4446],{},[78,117351,117352],{"class":124,"line":174},[78,117353,4451],{},[78,117355,117356],{"class":124,"line":180},[78,117357,4456],{},[78,117359,117360],{"class":124,"line":186},[78,117361,4461],{},[78,117363,117364],{"class":124,"line":192},[78,117365,4466],{},[78,117367,117368],{"class":124,"line":198},[78,117369,4471],{},[78,117371,117372],{"class":124,"line":204},[78,117373,4476],{},[78,117375,117376],{"class":124,"line":210},[78,117377,4481],{},[78,117379,117380],{"class":124,"line":216},[78,117381,207],{},[78,117383,117384],{"class":124,"line":222},[78,117385,213],{},[78,117387,117388],{"class":124,"line":421},[78,117389,219],{},[78,117391,117392],{"class":124,"line":427},[78,117393,207],{},[226,117395,228],{},{"title":119,"searchDepth":144,"depth":144,"links":117397},[117398],{"id":109,"depth":132,"text":109},{},{"title":4251,"description":4504},[246,248,451,1819],{"id":4512,"title":4513,"assetBase":239,"author":8,"body":117403,"category":787,"collection":233,"date":6374,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":119042,"navigation":128,"originalPath":239,"path":6376,"seo":119043,"source":243,"stem":6378,"tags":119044,"weight":250,"__hash__":6381},{"type":10,"value":117404,"toc":119035},[117405,117407,117409,117411,117417,117419,117427,117429,117431,117433,117776,117778,117988,118059,118269,118340,118702,118786,118788,118790,118963,118965,118977,118979,118981,118983,118985,119021,119027,119029,119031,119033],[4517,117406,4513],{"id":4519},[107,117408,4523],{"id":4522},[13,117410,4526],{},[2285,117412,117413,117415],{},[52,117414,4531],{},[52,117416,4534],{},[13,117418,4537],{},[13,117420,4540,117421,4544,117423,4548,117425,4552],{},[22,117422,4543],{},[22,117424,4547],{},[22,117426,4551],{},[107,117428,4556],{"id":4555},[13,117430,4559],{},[13,117432,4562],{},[78,117434,117436],{"className":117435},[4566],[78,117437,117439,117494],{"className":117438},[4570],[78,117440,117442],{"className":117441},[4574],[4576,117443,117444],{"xmlns":4578,"display":4579},[4581,117445,117446,117492],{},[4584,117447,117448,117450,117452,117454,117460,117462],{},[4587,117449,4589],{},[4591,117451,4594],{"stretchy":4593},[4596,117453,4598],{},[4600,117455,117456,117458],{},[4591,117457,4604],{"stretchy":4593},[4596,117459,39],{},[4591,117461,4609],{},[4611,117463,117464,117474],{},[4614,117465,117466,117468],{},[4596,117467,4618],{},[4584,117469,117470,117472],{},[4596,117471,4598],{},[4596,117473,39],{},[4584,117475,117476,117482],{},[4628,117477,117478,117480],{},[4591,117479,4632],{},[4596,117481,4635],{},[4614,117483,117484,117486],{},[4596,117485,4618],{},[4600,117487,117488,117490],{},[4596,117489,4598],{},[4596,117491,4635],{},[4647,117493,4650],{"encoding":4649},[78,117495,117497,117564],{"className":117496,"ariaHidden":1419},[4654],[78,117498,117500,117503,117509,117512,117515,117555,117558,117561],{"className":117499},[4658],[78,117501],{"className":117502,"style":4663},[4662],[78,117504,117506],{"className":117505},[4667,299],[78,117507,4589],{"className":117508},[4667],[78,117510,4594],{"className":117511},[4674],[78,117513,4598],{"className":117514},[4667,4678],[78,117516,117518,117521],{"className":117517},[4682],[78,117519,4604],{"className":117520},[4682],[78,117522,117524],{"className":117523},[4689],[78,117525,117527,117547],{"className":117526},[4693,4694],[78,117528,117530,117544],{"className":117529},[4698],[78,117531,117533],{"className":117532,"style":4703},[4702],[78,117534,117535,117538],{"style":4706},[78,117536],{"className":117537,"style":4711},[4710],[78,117539,117541],{"className":117540},[4715,4716,4717,4718],[78,117542,39],{"className":117543},[4667,4678,4718],[78,117545,4726],{"className":117546},[4725],[78,117548,117550],{"className":117549},[4698],[78,117551,117553],{"className":117552,"style":4733},[4702],[78,117554],{},[78,117556],{"className":117557,"style":4740},[4739],[78,117559,4609],{"className":117560},[4744],[78,117562],{"className":117563,"style":4740},[4739],[78,117565,117567,117570],{"className":117566},[4658],[78,117568],{"className":117569,"style":4754},[4662],[78,117571,117573,117576,117773],{"className":117572},[4667],[78,117574],{"className":117575},[4674,4761],[78,117577,117579],{"className":117578},[4611],[78,117580,117582,117765],{"className":117581},[4693,4694],[78,117583,117585,117762],{"className":117584},[4698],[78,117586,117588,117711,117719],{"className":117587,"style":4774},[4702],[78,117589,117590,117593],{"style":4777},[78,117591],{"className":117592,"style":4781},[4710],[78,117594,117596,117639,117642],{"className":117595},[4667],[78,117597,117599,117602],{"className":117598},[4788],[78,117600,4632],{"className":117601,"style":4794},[4788,4792,4793],[78,117603,117605],{"className":117604},[4689],[78,117606,117608,117631],{"className":117607},[4693,4694],[78,117609,117611,117628],{"className":117610},[4698],[78,117612,117614],{"className":117613,"style":4807},[4702],[78,117615,117616,117619],{"style":4810},[78,117617],{"className":117618,"style":4711},[4710],[78,117620,117622],{"className":117621},[4715,4716,4717,4718],[78,117623,117625],{"className":117624},[4667,4718],[78,117626,4635],{"className":117627,"style":4823},[4667,4678,4718],[78,117629,4726],{"className":117630},[4725],[78,117632,117634],{"className":117633},[4698],[78,117635,117637],{"className":117636,"style":4833},[4702],[78,117638],{},[78,117640],{"className":117641,"style":4839},[4739],[78,117643,117645,117648],{"className":117644},[4667],[78,117646,4618],{"className":117647},[4667,4678],[78,117649,117651],{"className":117650},[4689],[78,117652,117654],{"className":117653},[4693],[78,117655,117657],{"className":117656},[4698],[78,117658,117660],{"className":117659,"style":4858},[4702],[78,117661,117662,117665],{"style":4861},[78,117663],{"className":117664,"style":4711},[4710],[78,117666,117668],{"className":117667},[4715,4716,4717,4718],[78,117669,117671],{"className":117670},[4667,4718],[78,117672,117674,117677],{"className":117673},[4667,4718],[78,117675,4598],{"className":117676},[4667,4678,4718],[78,117678,117680],{"className":117679},[4689],[78,117681,117683,117703],{"className":117682},[4693,4694],[78,117684,117686,117700],{"className":117685},[4698],[78,117687,117689],{"className":117688,"style":4889},[4702],[78,117690,117691,117694],{"style":4892},[78,117692],{"className":117693,"style":4896},[4710],[78,117695,117697],{"className":117696},[4715,4900,4901,4718],[78,117698,4635],{"className":117699,"style":4823},[4667,4678,4718],[78,117701,4726],{"className":117702},[4725],[78,117704,117706],{"className":117705},[4698],[78,117707,117709],{"className":117708,"style":4914},[4702],[78,117710],{},[78,117712,117713,117716],{"style":4919},[78,117714],{"className":117715,"style":4781},[4710],[78,117717],{"className":117718,"style":4927},[4926],[78,117720,117721,117724],{"style":4930},[78,117722],{"className":117723,"style":4781},[4710],[78,117725,117727],{"className":117726},[4667],[78,117728,117730,117733],{"className":117729},[4667],[78,117731,4618],{"className":117732},[4667,4678],[78,117734,117736],{"className":117735},[4689],[78,117737,117739],{"className":117738},[4693],[78,117740,117742],{"className":117741},[4698],[78,117743,117745],{"className":117744,"style":4955},[4702],[78,117746,117747,117750],{"style":4958},[78,117748],{"className":117749,"style":4711},[4710],[78,117751,117753],{"className":117752},[4715,4716,4717,4718],[78,117754,117756,117759],{"className":117755},[4667,4718],[78,117757,4598],{"className":117758},[4667,4678,4718],[78,117760,39],{"className":117761},[4667,4678,4718],[78,117763,4726],{"className":117764},[4725],[78,117766,117768],{"className":117767},[4698],[78,117769,117771],{"className":117770,"style":4983},[4702],[78,117772],{},[78,117774],{"className":117775},[4682,4761],[13,117777,4991],{},[78,117779,117781],{"className":117780},[4566],[78,117782,117784,117857],{"className":117783},[4570],[78,117785,117787],{"className":117786},[4574],[4576,117788,117789],{"xmlns":4578,"display":4579},[4581,117790,117791,117855],{},[4584,117792,117793,117795,117797,117799,117801,117803,117805,117807,117809,117811,117813,117815,117817,117819,117821,117823,117825,117827,117829,117831,117833,117835,117837,117839,117841,117843,117845,117851,117853],{},[4596,117794,5009],{},[4596,117796,5012],{},[4596,117798,5012],{},[4596,117800,4618],{},[4596,117802,19],{},[4596,117804,5012],{},[4596,117806,39],{},[4596,117808,5025],{},[4596,117810,19],{},[4591,117812,4594],{"stretchy":4593},[4596,117814,5032],{},[4591,117816,2066],{"separator":1419},[4596,117818,5037],{},[4591,117820,2066],{"separator":1419},[4596,117822,5042],{},[4591,117824,4604],{"stretchy":4593},[4591,117826,4609],{},[4596,117828,262],{},[4596,117830,5025],{},[4596,117832,5053],{},[4596,117834,5012],{},[4596,117836,5058],{},[4596,117838,5009],{},[4596,117840,4598],{},[4591,117842,4594],{"stretchy":4593},[4596,117844,5067],{},[4614,117846,117847,117849],{},[4596,117848,5037],{},[4596,117850,5074],{},[4591,117852,4604],{"stretchy":4593},[4596,117854,5079],{},[4647,117856,5082],{"encoding":4649},[78,117858,117860,117926],{"className":117859,"ariaHidden":1419},[4654],[78,117861,117863,117866,117869,117872,117875,117878,117881,117884,117887,117890,117893,117896,117899,117902,117905,117908,117911,117914,117917,117920,117923],{"className":117862},[4658],[78,117864],{"className":117865,"style":4663},[4662],[78,117867,5009],{"className":117868},[4667,4678],[78,117870,5098],{"className":117871},[4667,4678],[78,117873,4618],{"className":117874},[4667,4678],[78,117876,19],{"className":117877},[4667,4678],[78,117879,5012],{"className":117880},[4667,4678],[78,117882,39],{"className":117883},[4667,4678],[78,117885,5025],{"className":117886},[4667,4678],[78,117888,19],{"className":117889},[4667,4678],[78,117891,4594],{"className":117892},[4674],[78,117894,5032],{"className":117895},[4667,4678],[78,117897,2066],{"className":117898},[5126],[78,117900],{"className":117901,"style":4839},[4739],[78,117903,5037],{"className":117904,"style":5133},[4667,4678],[78,117906,2066],{"className":117907},[5126],[78,117909],{"className":117910,"style":4839},[4739],[78,117912,5042],{"className":117913,"style":5143},[4667,4678],[78,117915,4604],{"className":117916},[4682],[78,117918],{"className":117919,"style":4740},[4739],[78,117921,4609],{"className":117922},[4744],[78,117924],{"className":117925,"style":4740},[4739],[78,117927,117929,117932,117935,117938,117941,117944,117947,117950,117953,117982,117985],{"className":117928},[4658],[78,117930],{"className":117931,"style":5162},[4662],[78,117933,5166],{"className":117934},[4667,4678],[78,117936,5053],{"className":117937,"style":5170},[4667,4678],[78,117939,5012],{"className":117940},[4667,4678],[78,117942,5177],{"className":117943},[4667,4678],[78,117945,4598],{"className":117946},[4667,4678],[78,117948,4594],{"className":117949},[4674],[78,117951,5067],{"className":117952,"style":5187},[4667,4678],[78,117954,117956,117959],{"className":117955},[4667],[78,117957,5037],{"className":117958,"style":5133},[4667,4678],[78,117960,117962],{"className":117961},[4689],[78,117963,117965],{"className":117964},[4693],[78,117966,117968],{"className":117967},[4698],[78,117969,117971],{"className":117970,"style":5206},[4702],[78,117972,117973,117976],{"style":5209},[78,117974],{"className":117975,"style":4711},[4710],[78,117977,117979],{"className":117978},[4715,4716,4717,4718],[78,117980,5074],{"className":117981,"style":5219},[4667,4678,4718],[78,117983,4604],{"className":117984},[4682],[78,117986,5079],{"className":117987,"style":5187},[4667,4678],[13,117989,5228,117990,5302],{},[78,117991,117993,118010],{"className":117992},[4570],[78,117994,117996],{"className":117995},[4574],[4576,117997,117998],{"xmlns":4578},[4581,117999,118000,118008],{},[4584,118001,118002],{},[4600,118003,118004,118006],{},[4596,118005,5245],{},[4596,118007,5079],{},[4647,118009,5250],{"encoding":4649},[78,118011,118013],{"className":118012,"ariaHidden":1419},[4654],[78,118014,118016,118019],{"className":118015},[4658],[78,118017],{"className":118018,"style":5260},[4662],[78,118020,118022,118025],{"className":118021},[4667],[78,118023,5245],{"className":118024},[4667,4678],[78,118026,118028],{"className":118027},[4689],[78,118029,118031,118051],{"className":118030},[4693,4694],[78,118032,118034,118048],{"className":118033},[4698],[78,118035,118037],{"className":118036,"style":5279},[4702],[78,118038,118039,118042],{"style":4706},[78,118040],{"className":118041,"style":4711},[4710],[78,118043,118045],{"className":118044},[4715,4716,4717,4718],[78,118046,5079],{"className":118047,"style":5187},[4667,4678,4718],[78,118049,4726],{"className":118050},[4725],[78,118052,118054],{"className":118053},[4698],[78,118055,118057],{"className":118056,"style":4733},[4702],[78,118058],{},[78,118060,118062],{"className":118061},[4566],[78,118063,118065,118138],{"className":118064},[4570],[78,118066,118068],{"className":118067},[4574],[4576,118069,118070],{"xmlns":4578,"display":4579},[4581,118071,118072,118136],{},[4584,118073,118074,118076,118078,118080,118082,118084,118086,118088,118090,118092,118094,118096,118098,118100,118102,118104,118106,118108,118110,118112,118114,118116,118118,118120,118122,118124,118126,118132,118134],{},[4596,118075,5009],{},[4596,118077,5012],{},[4596,118079,5012],{},[4596,118081,4618],{},[4596,118083,19],{},[4596,118085,5012],{},[4596,118087,39],{},[4596,118089,5025],{},[4596,118091,19],{},[4591,118093,4594],{"stretchy":4593},[4596,118095,5032],{},[4591,118097,2066],{"separator":1419},[4596,118099,5037],{},[4591,118101,2066],{"separator":1419},[4596,118103,5042],{},[4591,118105,4604],{"stretchy":4593},[4591,118107,4609],{},[4596,118109,262],{},[4596,118111,5025],{},[4596,118113,5053],{},[4596,118115,5012],{},[4596,118117,5058],{},[4596,118119,5009],{},[4596,118121,4598],{},[4591,118123,4594],{"stretchy":4593},[4596,118125,5032],{},[4614,118127,118128,118130],{},[4596,118129,5037],{},[4596,118131,5074],{},[4591,118133,4604],{"stretchy":4593},[4596,118135,5042],{},[4647,118137,5382],{"encoding":4649},[78,118139,118141,118207],{"className":118140,"ariaHidden":1419},[4654],[78,118142,118144,118147,118150,118153,118156,118159,118162,118165,118168,118171,118174,118177,118180,118183,118186,118189,118192,118195,118198,118201,118204],{"className":118143},[4658],[78,118145],{"className":118146,"style":4663},[4662],[78,118148,5009],{"className":118149},[4667,4678],[78,118151,5098],{"className":118152},[4667,4678],[78,118154,4618],{"className":118155},[4667,4678],[78,118157,19],{"className":118158},[4667,4678],[78,118160,5012],{"className":118161},[4667,4678],[78,118163,39],{"className":118164},[4667,4678],[78,118166,5025],{"className":118167},[4667,4678],[78,118169,19],{"className":118170},[4667,4678],[78,118172,4594],{"className":118173},[4674],[78,118175,5032],{"className":118176},[4667,4678],[78,118178,2066],{"className":118179},[5126],[78,118181],{"className":118182,"style":4839},[4739],[78,118184,5037],{"className":118185,"style":5133},[4667,4678],[78,118187,2066],{"className":118188},[5126],[78,118190],{"className":118191,"style":4839},[4739],[78,118193,5042],{"className":118194,"style":5143},[4667,4678],[78,118196,4604],{"className":118197},[4682],[78,118199],{"className":118200,"style":4740},[4739],[78,118202,4609],{"className":118203},[4744],[78,118205],{"className":118206,"style":4740},[4739],[78,118208,118210,118213,118216,118219,118222,118225,118228,118231,118234,118263,118266],{"className":118209},[4658],[78,118211],{"className":118212,"style":5162},[4662],[78,118214,5166],{"className":118215},[4667,4678],[78,118217,5053],{"className":118218,"style":5170},[4667,4678],[78,118220,5012],{"className":118221},[4667,4678],[78,118223,5177],{"className":118224},[4667,4678],[78,118226,4598],{"className":118227},[4667,4678],[78,118229,4594],{"className":118230},[4674],[78,118232,5032],{"className":118233},[4667,4678],[78,118235,118237,118240],{"className":118236},[4667],[78,118238,5037],{"className":118239,"style":5133},[4667,4678],[78,118241,118243],{"className":118242},[4689],[78,118244,118246],{"className":118245},[4693],[78,118247,118249],{"className":118248},[4698],[78,118250,118252],{"className":118251,"style":5206},[4702],[78,118253,118254,118257],{"style":5209},[78,118255],{"className":118256,"style":4711},[4710],[78,118258,118260],{"className":118259},[4715,4716,4717,4718],[78,118261,5074],{"className":118262,"style":5219},[4667,4678,4718],[78,118264,4604],{"className":118265},[4682],[78,118267,5042],{"className":118268,"style":5143},[4667,4678],[13,118270,5516,118271,5590],{},[78,118272,118274,118291],{"className":118273},[4570],[78,118275,118277],{"className":118276},[4574],[4576,118278,118279],{"xmlns":4578},[4581,118280,118281,118289],{},[4584,118282,118283],{},[4600,118284,118285,118287],{},[4596,118286,5245],{},[4596,118288,5535],{},[4647,118290,5538],{"encoding":4649},[78,118292,118294],{"className":118293,"ariaHidden":1419},[4654],[78,118295,118297,118300],{"className":118296},[4658],[78,118298],{"className":118299,"style":5260},[4662],[78,118301,118303,118306],{"className":118302},[4667],[78,118304,5245],{"className":118305},[4667,4678],[78,118307,118309],{"className":118308},[4689],[78,118310,118312,118332],{"className":118311},[4693,4694],[78,118313,118315,118329],{"className":118314},[4698],[78,118316,118318],{"className":118317,"style":5566},[4702],[78,118319,118320,118323],{"style":4706},[78,118321],{"className":118322,"style":4711},[4710],[78,118324,118326],{"className":118325},[4715,4716,4717,4718],[78,118327,5535],{"className":118328,"style":5578},[4667,4678,4718],[78,118330,4726],{"className":118331},[4725],[78,118333,118335],{"className":118334},[4698],[78,118336,118338],{"className":118337,"style":4733},[4702],[78,118339],{},[78,118341,118343],{"className":118342},[4566],[78,118344,118346,118431],{"className":118345},[4570],[78,118347,118349],{"className":118348},[4574],[4576,118350,118351],{"xmlns":4578,"display":4579},[4581,118352,118353,118429],{},[4584,118354,118355,118357,118359,118361,118363,118365,118367,118369,118371,118373,118375,118377,118379,118381,118383,118385,118387,118389,118391,118393,118395,118397,118399,118401,118403,118405,118425,118427],{},[4596,118356,5009],{},[4596,118358,5012],{},[4596,118360,5012],{},[4596,118362,4618],{},[4596,118364,19],{},[4596,118366,5012],{},[4596,118368,39],{},[4596,118370,5025],{},[4596,118372,19],{},[4591,118374,4594],{"stretchy":4593},[4596,118376,5032],{},[4591,118378,2066],{"separator":1419},[4596,118380,5037],{},[4591,118382,2066],{"separator":1419},[4596,118384,5042],{},[4591,118386,4604],{"stretchy":4593},[4591,118388,4609],{},[4596,118390,262],{},[4596,118392,5025],{},[4596,118394,5053],{},[4596,118396,5012],{},[4596,118398,5058],{},[4596,118400,5009],{},[4596,118402,4598],{},[4591,118404,4594],{"stretchy":4593},[4611,118406,118407,118417],{},[4584,118408,118409,118411],{},[4596,118410,5032],{},[4614,118412,118413,118415],{},[4596,118414,5037],{},[4596,118416,5074],{},[5669,118418,118419],{},[4600,118420,118421,118423],{},[4596,118422,5245],{},[4596,118424,5535],{},[4591,118426,4604],{"stretchy":4593},[4596,118428,5042],{},[4647,118430,5683],{"encoding":4649},[78,118432,118434,118500],{"className":118433,"ariaHidden":1419},[4654],[78,118435,118437,118440,118443,118446,118449,118452,118455,118458,118461,118464,118467,118470,118473,118476,118479,118482,118485,118488,118491,118494,118497],{"className":118436},[4658],[78,118438],{"className":118439,"style":4663},[4662],[78,118441,5009],{"className":118442},[4667,4678],[78,118444,5098],{"className":118445},[4667,4678],[78,118447,4618],{"className":118448},[4667,4678],[78,118450,19],{"className":118451},[4667,4678],[78,118453,5012],{"className":118454},[4667,4678],[78,118456,39],{"className":118457},[4667,4678],[78,118459,5025],{"className":118460},[4667,4678],[78,118462,19],{"className":118463},[4667,4678],[78,118465,4594],{"className":118466},[4674],[78,118468,5032],{"className":118469},[4667,4678],[78,118471,2066],{"className":118472},[5126],[78,118474],{"className":118475,"style":4839},[4739],[78,118477,5037],{"className":118478,"style":5133},[4667,4678],[78,118480,2066],{"className":118481},[5126],[78,118483],{"className":118484,"style":4839},[4739],[78,118486,5042],{"className":118487,"style":5143},[4667,4678],[78,118489,4604],{"className":118490},[4682],[78,118492],{"className":118493,"style":4740},[4739],[78,118495,4609],{"className":118496},[4744],[78,118498],{"className":118499,"style":4740},[4739],[78,118501,118503,118506,118509,118512,118515,118518,118521,118524,118696,118699],{"className":118502},[4658],[78,118504],{"className":118505,"style":5759},[4662],[78,118507,5166],{"className":118508},[4667,4678],[78,118510,5053],{"className":118511,"style":5170},[4667,4678],[78,118513,5012],{"className":118514},[4667,4678],[78,118516,5177],{"className":118517},[4667,4678],[78,118519,4598],{"className":118520},[4667,4678],[78,118522,4594],{"className":118523},[4674],[78,118525,118527,118530,118693],{"className":118526},[4667],[78,118528],{"className":118529},[4674,4761],[78,118531,118533],{"className":118532},[4611],[78,118534,118536,118685],{"className":118535},[4693,4694],[78,118537,118539,118682],{"className":118538},[4698],[78,118540,118542,118634,118642],{"className":118541,"style":5796},[4702],[78,118543,118544,118547],{"style":5799},[78,118545],{"className":118546,"style":4781},[4710],[78,118548,118550],{"className":118549},[4667],[78,118551,118553],{"className":118552},[4667,5809],[78,118554,118556,118626],{"className":118555},[4693,4694],[78,118557,118559,118623],{"className":118558},[4698],[78,118560,118562,118611],{"className":118561,"style":5819},[4702],[78,118563,118565,118568],{"className":118564,"style":5824},[5823],[78,118566],{"className":118567,"style":4781},[4710],[78,118569,118571],{"className":118570,"style":5831},[4667],[78,118572,118574,118577],{"className":118573},[4667],[78,118575,5245],{"className":118576},[4667,4678],[78,118578,118580],{"className":118579},[4689],[78,118581,118583,118603],{"className":118582},[4693,4694],[78,118584,118586,118600],{"className":118585},[4698],[78,118587,118589],{"className":118588,"style":5566},[4702],[78,118590,118591,118594],{"style":4706},[78,118592],{"className":118593,"style":4711},[4710],[78,118595,118597],{"className":118596},[4715,4716,4717,4718],[78,118598,5535],{"className":118599,"style":5578},[4667,4678,4718],[78,118601,4726],{"className":118602},[4725],[78,118604,118606],{"className":118605},[4698],[78,118607,118609],{"className":118608,"style":4733},[4702],[78,118610],{},[78,118612,118613,118616],{"style":5874},[78,118614],{"className":118615,"style":4781},[4710],[78,118617,118619],{"className":118618,"style":5882},[5881],[5884,118620,118621],{"xmlns":5886,"width":5887,"height":5888,"viewBox":5889,"preserveAspectRatio":5890},[5892,118622],{"d":5894},[78,118624,4726],{"className":118625},[4725],[78,118627,118629],{"className":118628},[4698],[78,118630,118632],{"className":118631,"style":5904},[4702],[78,118633],{},[78,118635,118636,118639],{"style":4919},[78,118637],{"className":118638,"style":4781},[4710],[78,118640],{"className":118641,"style":4927},[4926],[78,118643,118644,118647],{"style":4930},[78,118645],{"className":118646,"style":4781},[4710],[78,118648,118650,118653],{"className":118649},[4667],[78,118651,5032],{"className":118652},[4667,4678],[78,118654,118656,118659],{"className":118655},[4667],[78,118657,5037],{"className":118658,"style":5133},[4667,4678],[78,118660,118662],{"className":118661},[4689],[78,118663,118665],{"className":118664},[4693],[78,118666,118668],{"className":118667},[4698],[78,118669,118671],{"className":118670,"style":5944},[4702],[78,118672,118673,118676],{"style":4958},[78,118674],{"className":118675,"style":4711},[4710],[78,118677,118679],{"className":118678},[4715,4716,4717,4718],[78,118680,5074],{"className":118681,"style":5219},[4667,4678,4718],[78,118683,4726],{"className":118684},[4725],[78,118686,118688],{"className":118687},[4698],[78,118689,118691],{"className":118690,"style":5965},[4702],[78,118692],{},[78,118694],{"className":118695},[4682,4761],[78,118697,4604],{"className":118698},[4682],[78,118700,5042],{"className":118701,"style":5143},[4667,4678],[114,118703,118704],{"className":116,"code":5979,"language":118,"meta":119,"style":119},[17,118705,118706,118710,118714,118718,118722,118726,118730,118734,118738,118742,118746,118750,118754,118758,118762,118766,118770,118774,118778,118782],{"__ignoreMap":119},[78,118707,118708],{"class":124,"line":125},[78,118709,5986],{},[78,118711,118712],{"class":124,"line":132},[78,118713,5991],{},[78,118715,118716],{"class":124,"line":138},[78,118717,5996],{},[78,118719,118720],{"class":124,"line":144},[78,118721,6001],{},[78,118723,118724],{"class":124,"line":150},[78,118725,6006],{},[78,118727,118728],{"class":124,"line":156},[78,118729,6011],{},[78,118731,118732],{"class":124,"line":162},[78,118733,6016],{},[78,118735,118736],{"class":124,"line":168},[78,118737,5996],{},[78,118739,118740],{"class":124,"line":174},[78,118741,6025],{},[78,118743,118744],{"class":124,"line":180},[78,118745,6030],{},[78,118747,118748],{"class":124,"line":186},[78,118749,6035],{},[78,118751,118752],{"class":124,"line":192},[78,118753,6040],{},[78,118755,118756],{"class":124,"line":198},[78,118757,6045],{},[78,118759,118760],{"class":124,"line":204},[78,118761,6050],{},[78,118763,118764],{"class":124,"line":210},[78,118765,6055],{},[78,118767,118768],{"class":124,"line":216},[78,118769,6060],{},[78,118771,118772],{"class":124,"line":222},[78,118773,6065],{},[78,118775,118776],{"class":124,"line":421},[78,118777,6070],{},[78,118779,118780],{"class":124,"line":427},[78,118781,6075],{},[78,118783,118784],{"class":124,"line":433},[78,118785,6080],{},[107,118787,6084],{"id":6083},[13,118789,6087],{},[13,118791,6090,118792,6268],{},[78,118793,118795,118828],{"className":118794},[4570],[78,118796,118798],{"className":118797},[4574],[4576,118799,118800],{"xmlns":4578},[4581,118801,118802,118826],{},[4584,118803,118804,118810,118812,118818,118820],{},[4600,118805,118806,118808],{},[4596,118807,6107],{},[4596,118809,5067],{},[4587,118811,1011],{},[4600,118813,118814,118816],{},[4596,118815,6107],{},[4596,118817,5535],{},[4587,118819,1011],{},[4600,118821,118822,118824],{},[4596,118823,6107],{},[4596,118825,5079],{},[4647,118827,6128],{"encoding":4649},[78,118829,118831],{"className":118830,"ariaHidden":1419},[4654],[78,118832,118834,118837,118877,118880,118920,118923],{"className":118833},[4658],[78,118835],{"className":118836,"style":6138},[4662],[78,118838,118840,118843],{"className":118839},[4667],[78,118841,6107],{"className":118842,"style":5219},[4667,4678],[78,118844,118846],{"className":118845},[4689],[78,118847,118849,118869],{"className":118848},[4693,4694],[78,118850,118852,118866],{"className":118851},[4698],[78,118853,118855],{"className":118854,"style":5279},[4702],[78,118856,118857,118860],{"style":6159},[78,118858],{"className":118859,"style":4711},[4710],[78,118861,118863],{"className":118862},[4715,4716,4717,4718],[78,118864,5067],{"className":118865,"style":5187},[4667,4678,4718],[78,118867,4726],{"className":118868},[4725],[78,118870,118872],{"className":118871},[4698],[78,118873,118875],{"className":118874,"style":6178},[4702],[78,118876],{},[78,118878,1011],{"className":118879},[4667,6184],[78,118881,118883,118886],{"className":118882},[4667],[78,118884,6107],{"className":118885,"style":5219},[4667,4678],[78,118887,118889],{"className":118888},[4689],[78,118890,118892,118912],{"className":118891},[4693,4694],[78,118893,118895,118909],{"className":118894},[4698],[78,118896,118898],{"className":118897,"style":5566},[4702],[78,118899,118900,118903],{"style":6159},[78,118901],{"className":118902,"style":4711},[4710],[78,118904,118906],{"className":118905},[4715,4716,4717,4718],[78,118907,5535],{"className":118908,"style":5578},[4667,4678,4718],[78,118910,4726],{"className":118911},[4725],[78,118913,118915],{"className":118914},[4698],[78,118916,118918],{"className":118917,"style":4733},[4702],[78,118919],{},[78,118921,1011],{"className":118922},[4667,6184],[78,118924,118926,118929],{"className":118925},[4667],[78,118927,6107],{"className":118928,"style":5219},[4667,4678],[78,118930,118932],{"className":118931},[4689],[78,118933,118935,118955],{"className":118934},[4693,4694],[78,118936,118938,118952],{"className":118937},[4698],[78,118939,118941],{"className":118940,"style":5279},[4702],[78,118942,118943,118946],{"style":6159},[78,118944],{"className":118945,"style":4711},[4710],[78,118947,118949],{"className":118948},[4715,4716,4717,4718],[78,118950,5079],{"className":118951,"style":5187},[4667,4678,4718],[78,118953,4726],{"className":118954},[4725],[78,118956,118958],{"className":118957},[4698],[78,118959,118961],{"className":118960,"style":4733},[4702],[78,118962],{},[13,118964,6271],{},[114,118966,118967],{"className":116,"code":6274,"language":118,"meta":119,"style":119},[17,118968,118969,118973],{"__ignoreMap":119},[78,118970,118971],{"class":124,"line":125},[78,118972,6281],{},[78,118974,118975],{"class":124,"line":132},[78,118976,6286],{},[107,118978,6290],{"id":6289},[13,118980,6293],{},[13,118982,6296],{},[13,118984,6299],{},[114,118986,118987],{"className":116,"code":6302,"language":118,"meta":119,"style":119},[17,118988,118989,118993,118997,119001,119005,119009,119013,119017],{"__ignoreMap":119},[78,118990,118991],{"class":124,"line":125},[78,118992,6309],{},[78,118994,118995],{"class":124,"line":132},[78,118996,6314],{},[78,118998,118999],{"class":124,"line":138},[78,119000,6319],{},[78,119002,119003],{"class":124,"line":144},[78,119004,6324],{},[78,119006,119007],{"class":124,"line":150},[78,119008,6329],{},[78,119010,119011],{"class":124,"line":156},[78,119012,6334],{},[78,119014,119015],{"class":124,"line":162},[78,119016,6339],{},[78,119018,119019],{"class":124,"line":168},[78,119020,6344],{},[13,119022,6347,119023,6351,119025,6354],{},[17,119024,6350],{},[17,119026,6350],{},[107,119028,6358],{"id":6357},[13,119030,6361],{},[13,119032,6364],{},[226,119034,228],{},{"title":119,"searchDepth":144,"depth":144,"links":119036},[119037,119038,119039,119040,119041],{"id":4522,"depth":132,"text":4523},{"id":4555,"depth":132,"text":4556},{"id":6083,"depth":132,"text":6084},{"id":6289,"depth":132,"text":6290},{"id":6357,"depth":132,"text":6358},{},{"title":4513,"description":119},[794,6380],{"id":6383,"title":6384,"assetBase":239,"author":8,"body":119046,"category":787,"collection":233,"date":6374,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":120223,"navigation":128,"originalPath":239,"path":7740,"seo":120224,"source":243,"stem":7742,"tags":120225,"weight":250,"__hash__":7745},{"type":10,"value":119047,"toc":120215},[119048,119050,119054,119056,119058,119060,119062,119142,119198,119200,119308,119364,119366,119368,119436,119438,119440,119442,119444,119446,119456,119458,119460,119524,119526,119528,119530,119550,119552,119554,119556,119558,119560,119568,119570,119572,119574,119576,119829,120101,120103,120109,120213],[4517,119049,6390],{"id":6389},[13,119051,119052],{},[617,119053],{"alt":619,"src":6395},[107,119055,6399],{"id":6398},[13,119057,6402],{},[13,119059,6405],{},[13,119061,6408],{},[114,119063,119064],{"className":116,"code":6411,"language":118,"meta":119,"style":119},[17,119065,119066,119070,119074,119078,119082,119086,119090,119094,119098,119102,119106,119110,119114,119118,119122,119126,119130,119134,119138],{"__ignoreMap":119},[78,119067,119068],{"class":124,"line":125},[78,119069,6418],{},[78,119071,119072],{"class":124,"line":132},[78,119073,6423],{},[78,119075,119076],{"class":124,"line":138},[78,119077,6428],{},[78,119079,119080],{"class":124,"line":144},[78,119081,6433],{},[78,119083,119084],{"class":124,"line":150},[78,119085,6438],{},[78,119087,119088],{"class":124,"line":156},[78,119089,6443],{},[78,119091,119092],{"class":124,"line":162},[78,119093,6448],{},[78,119095,119096],{"class":124,"line":168},[78,119097,6453],{},[78,119099,119100],{"class":124,"line":174},[78,119101,6458],{},[78,119103,119104],{"class":124,"line":180},[78,119105,6463],{},[78,119107,119108],{"class":124,"line":186},[78,119109,129],{"emptyLinePlaceholder":128},[78,119111,119112],{"class":124,"line":192},[78,119113,6472],{},[78,119115,119116],{"class":124,"line":198},[78,119117,6477],{},[78,119119,119120],{"class":124,"line":204},[78,119121,6482],{},[78,119123,119124],{"class":124,"line":210},[78,119125,6487],{},[78,119127,119128],{"class":124,"line":216},[78,119129,6492],{},[78,119131,119132],{"class":124,"line":222},[78,119133,6497],{},[78,119135,119136],{"class":124,"line":421},[78,119137,6502],{},[78,119139,119140],{"class":124,"line":427},[78,119141,6507],{},[114,119143,119144],{"className":116,"code":6510,"language":118,"meta":119,"style":119},[17,119145,119146,119150,119154,119158,119162,119166,119170,119174,119178,119182,119186,119190,119194],{"__ignoreMap":119},[78,119147,119148],{"class":124,"line":125},[78,119149,6517],{},[78,119151,119152],{"class":124,"line":132},[78,119153,6522],{},[78,119155,119156],{"class":124,"line":138},[78,119157,6428],{},[78,119159,119160],{"class":124,"line":144},[78,119161,6531],{},[78,119163,119164],{"class":124,"line":150},[78,119165,6536],{},[78,119167,119168],{"class":124,"line":156},[78,119169,6541],{},[78,119171,119172],{"class":124,"line":162},[78,119173,6546],{},[78,119175,119176],{"class":124,"line":168},[78,119177,129],{"emptyLinePlaceholder":128},[78,119179,119180],{"class":124,"line":174},[78,119181,6472],{},[78,119183,119184],{"class":124,"line":180},[78,119185,6559],{},[78,119187,119188],{"class":124,"line":186},[78,119189,6564],{},[78,119191,119192],{"class":124,"line":192},[78,119193,6569],{},[78,119195,119196],{"class":124,"line":198},[78,119197,6574],{},[13,119199,6577],{},[114,119201,119202],{"className":116,"code":6580,"language":118,"meta":119,"style":119},[17,119203,119204,119208,119212,119216,119220,119224,119228,119232,119236,119240,119244,119248,119252,119256,119260,119264,119268,119272,119276,119280,119284,119288,119292,119296,119300,119304],{"__ignoreMap":119},[78,119205,119206],{"class":124,"line":125},[78,119207,6587],{},[78,119209,119210],{"class":124,"line":132},[78,119211,6592],{},[78,119213,119214],{"class":124,"line":138},[78,119215,6428],{},[78,119217,119218],{"class":124,"line":144},[78,119219,6433],{},[78,119221,119222],{"class":124,"line":150},[78,119223,6605],{},[78,119225,119226],{"class":124,"line":156},[78,119227,6610],{},[78,119229,119230],{"class":124,"line":162},[78,119231,6615],{},[78,119233,119234],{"class":124,"line":168},[78,119235,6620],{},[78,119237,119238],{"class":124,"line":174},[78,119239,6625],{},[78,119241,119242],{"class":124,"line":180},[78,119243,6630],{},[78,119245,119246],{"class":124,"line":186},[78,119247,6453],{},[78,119249,119250],{"class":124,"line":192},[78,119251,6639],{},[78,119253,119254],{"class":124,"line":198},[78,119255,6644],{},[78,119257,119258],{"class":124,"line":204},[78,119259,6463],{},[78,119261,119262],{"class":124,"line":210},[78,119263,129],{"emptyLinePlaceholder":128},[78,119265,119266],{"class":124,"line":216},[78,119267,6657],{},[78,119269,119270],{"class":124,"line":222},[78,119271,6477],{},[78,119273,119274],{"class":124,"line":421},[78,119275,6666],{},[78,119277,119278],{"class":124,"line":427},[78,119279,6671],{},[78,119281,119282],{"class":124,"line":433},[78,119283,6676],{},[78,119285,119286],{"class":124,"line":2443},[78,119287,6681],{},[78,119289,119290],{"class":124,"line":2448},[78,119291,6686],{},[78,119293,119294],{"class":124,"line":2454},[78,119295,6691],{},[78,119297,119298],{"class":124,"line":2460},[78,119299,6497],{},[78,119301,119302],{"class":124,"line":2465},[78,119303,6700],{},[78,119305,119306],{"class":124,"line":2470},[78,119307,6507],{},[114,119309,119310],{"className":116,"code":6707,"language":118,"meta":119,"style":119},[17,119311,119312,119316,119320,119324,119328,119332,119336,119340,119344,119348,119352,119356,119360],{"__ignoreMap":119},[78,119313,119314],{"class":124,"line":125},[78,119315,6714],{},[78,119317,119318],{"class":124,"line":132},[78,119319,6719],{},[78,119321,119322],{"class":124,"line":138},[78,119323,6428],{},[78,119325,119326],{"class":124,"line":144},[78,119327,6728],{},[78,119329,119330],{"class":124,"line":150},[78,119331,6733],{},[78,119333,119334],{"class":124,"line":156},[78,119335,6738],{},[78,119337,119338],{"class":124,"line":162},[78,119339,6546],{},[78,119341,119342],{"class":124,"line":168},[78,119343,129],{"emptyLinePlaceholder":128},[78,119345,119346],{"class":124,"line":174},[78,119347,6657],{},[78,119349,119350],{"class":124,"line":180},[78,119351,6755],{},[78,119353,119354],{"class":124,"line":186},[78,119355,6564],{},[78,119357,119358],{"class":124,"line":192},[78,119359,6764],{},[78,119361,119362],{"class":124,"line":198},[78,119363,6574],{},[107,119365,6772],{"id":6771},[13,119367,6775],{},[114,119369,119370],{"className":116,"code":6778,"language":118,"meta":119,"style":119},[17,119371,119372,119376,119380,119384,119388,119392,119396,119400,119404,119408,119412,119416,119420,119424,119428,119432],{"__ignoreMap":119},[78,119373,119374],{"class":124,"line":125},[78,119375,6785],{},[78,119377,119378],{"class":124,"line":132},[78,119379,6790],{},[78,119381,119382],{"class":124,"line":138},[78,119383,6795],{},[78,119385,119386],{"class":124,"line":144},[78,119387,6433],{},[78,119389,119390],{"class":124,"line":150},[78,119391,6804],{},[78,119393,119394],{"class":124,"line":156},[78,119395,6809],{},[78,119397,119398],{"class":124,"line":162},[78,119399,6814],{},[78,119401,119402],{"class":124,"line":168},[78,119403,6819],{},[78,119405,119406],{"class":124,"line":174},[78,119407,6824],{},[78,119409,119410],{"class":124,"line":180},[78,119411,6829],{},[78,119413,119414],{"class":124,"line":186},[78,119415,129],{"emptyLinePlaceholder":128},[78,119417,119418],{"class":124,"line":192},[78,119419,6472],{},[78,119421,119422],{"class":124,"line":198},[78,119423,6842],{},[78,119425,119426],{"class":124,"line":204},[78,119427,6847],{},[78,119429,119430],{"class":124,"line":210},[78,119431,6852],{},[78,119433,119434],{"class":124,"line":216},[78,119435,6857],{},[13,119437,6860],{},[107,119439,6864],{"id":6863},[13,119441,6867],{},[13,119443,6870],{},[13,119445,6873],{},[49,119447,119448,119450,119452,119454],{},[52,119449,6878],{},[52,119451,6881],{},[52,119453,6884],{},[52,119455,6887],{},[13,119457,6890],{},[13,119459,6893],{},[114,119461,119462],{"className":116,"code":6896,"language":118,"meta":119,"style":119},[17,119463,119464,119468,119472,119476,119480,119484,119488,119492,119496,119500,119504,119508,119512,119516,119520],{"__ignoreMap":119},[78,119465,119466],{"class":124,"line":125},[78,119467,6903],{},[78,119469,119470],{"class":124,"line":132},[78,119471,6908],{},[78,119473,119474],{"class":124,"line":138},[78,119475,6913],{},[78,119477,119478],{"class":124,"line":144},[78,119479,6433],{},[78,119481,119482],{"class":124,"line":150},[78,119483,6922],{},[78,119485,119486],{"class":124,"line":156},[78,119487,6927],{},[78,119489,119490],{"class":124,"line":162},[78,119491,6932],{},[78,119493,119494],{"class":124,"line":168},[78,119495,6937],{},[78,119497,119498],{"class":124,"line":174},[78,119499,6942],{},[78,119501,119502],{"class":124,"line":180},[78,119503,6472],{},[78,119505,119506],{"class":124,"line":186},[78,119507,6951],{},[78,119509,119510],{"class":124,"line":192},[78,119511,6956],{},[78,119513,119514],{"class":124,"line":198},[78,119515,6961],{},[78,119517,119518],{"class":124,"line":204},[78,119519,6966],{},[78,119521,119522],{"class":124,"line":210},[78,119523,6971],{},[107,119525,6975],{"id":6974},[13,119527,6978],{},[13,119529,6981],{},[114,119531,119532],{"className":116,"code":6984,"language":118,"meta":119,"style":119},[17,119533,119534,119538,119542,119546],{"__ignoreMap":119},[78,119535,119536],{"class":124,"line":125},[78,119537,6991],{},[78,119539,119540],{"class":124,"line":132},[78,119541,6996],{},[78,119543,119544],{"class":124,"line":138},[78,119545,7001],{},[78,119547,119548],{"class":124,"line":144},[78,119549,7006],{},[13,119551,7009],{},[107,119553,7013],{"id":7012},[13,119555,7016],{},[13,119557,7019],{},[13,119559,7022],{},[114,119561,119562],{"className":116,"code":7025,"language":118,"meta":119,"style":119},[17,119563,119564],{"__ignoreMap":119},[78,119565,119566],{"class":124,"line":125},[78,119567,7025],{},[107,119569,7035],{"id":7034},[13,119571,7038],{},[13,119573,7041],{},[13,119575,7044],{},[78,119577,119579],{"className":119578},[4566],[78,119580,119582,119661],{"className":119581},[4570],[78,119583,119585],{"className":119584},[4574],[4576,119586,119587],{"xmlns":4578,"display":4579},[4581,119588,119589,119659],{},[4584,119590,119591,119593,119595,119597,119599,119601,119603,119605,119607,119609,119611,119613,119615,119617,119619,119621,119623,119625,119627,119629,119657],{},[4596,119592,7062],{},[4596,119594,7065],{},[4591,119596,4594],{"stretchy":4593},[4596,119598,13],{},[4596,119600,5025],{},[4596,119602,262],{},[4591,119604,2066],{"separator":1419},[7077,119606,472],{},[4596,119608,39],{},[4591,119610,4604],{"stretchy":4593},[4591,119612,4609],{},[4596,119614,262],{},[4596,119616,39],{},[4596,119618,19],{},[4591,119620,4594],{"stretchy":4593},[4596,119622,13],{},[4596,119624,5025],{},[4596,119626,262],{},[4596,119628,7102],{"mathvariant":7101},[4614,119630,119631,119633],{},[7077,119632,7107],{},[4584,119634,119635,119637,119639,119641],{},[7077,119636,472],{},[4596,119638,39],{},[4596,119640,7102],{"mathvariant":7101},[4600,119642,119643,119645],{},[4596,119644,5245],{},[4584,119646,119647,119649,119651,119653,119655],{},[4596,119648,5058],{},[4596,119650,5025],{},[4596,119652,5245],{},[4596,119654,4618],{},[4596,119656,7132],{},[4591,119658,4604],{"stretchy":4593},[4647,119660,7137],{"encoding":4649},[78,119662,119664,119709],{"className":119663,"ariaHidden":1419},[4654],[78,119665,119667,119670,119673,119676,119679,119682,119685,119688,119691,119694,119697,119700,119703,119706],{"className":119666},[4658],[78,119668],{"className":119669,"style":4663},[4662],[78,119671,7062],{"className":119672,"style":5219},[4667,4678],[78,119674,7065],{"className":119675,"style":7153},[4667,4678],[78,119677,4594],{"className":119678},[4674],[78,119680,13],{"className":119681},[4667,4678],[78,119683,7163],{"className":119684},[4667,4678],[78,119686,2066],{"className":119687},[5126],[78,119689],{"className":119690,"style":4839},[4739],[78,119692,472],{"className":119693},[4667],[78,119695,39],{"className":119696},[4667,4678],[78,119698,4604],{"className":119699},[4682],[78,119701],{"className":119702,"style":4740},[4739],[78,119704,4609],{"className":119705},[4744],[78,119707],{"className":119708,"style":4740},[4739],[78,119710,119712,119715,119718,119721,119724,119727,119730,119733,119826],{"className":119711},[4658],[78,119713],{"className":119714,"style":7194},[4662],[78,119716,262],{"className":119717},[4667,4678],[78,119719,7201],{"className":119720},[4667,4678],[78,119722,4594],{"className":119723},[4674],[78,119725,13],{"className":119726},[4667,4678],[78,119728,7163],{"className":119729},[4667,4678],[78,119731,7214],{"className":119732},[4667],[78,119734,119736,119739],{"className":119735},[4667],[78,119737,2949],{"className":119738},[4667],[78,119740,119742],{"className":119741},[4689],[78,119743,119745],{"className":119744},[4693],[78,119746,119748],{"className":119747},[4698],[78,119749,119751],{"className":119750,"style":7233},[4702],[78,119752,119753,119756],{"style":5209},[78,119754],{"className":119755,"style":4711},[4710],[78,119757,119759],{"className":119758},[4715,4716,4717,4718],[78,119760,119762,119765,119768,119771],{"className":119761},[4667,4718],[78,119763,472],{"className":119764},[4667,4718],[78,119766,39],{"className":119767},[4667,4678,4718],[78,119769,7102],{"className":119770},[4667,4718],[78,119772,119774,119777],{"className":119773},[4667,4718],[78,119775,5245],{"className":119776},[4667,4678,4718],[78,119778,119780],{"className":119779},[4689],[78,119781,119783,119818],{"className":119782},[4693,4694],[78,119784,119786,119815],{"className":119785},[4698],[78,119787,119789],{"className":119788,"style":7272},[4702],[78,119790,119791,119794],{"style":7275},[78,119792],{"className":119793,"style":4896},[4710],[78,119795,119797],{"className":119796},[4715,4900,4901,4718],[78,119798,119800,119803,119806,119809,119812],{"className":119799},[4667,4718],[78,119801,5058],{"className":119802},[4667,4678,4718],[78,119804,5025],{"className":119805},[4667,4678,4718],[78,119807,5245],{"className":119808},[4667,4678,4718],[78,119810,4618],{"className":119811},[4667,4678,4718],[78,119813,7132],{"className":119814,"style":7300},[4667,4678,4718],[78,119816,4726],{"className":119817},[4725],[78,119819,119821],{"className":119820},[4698],[78,119822,119824],{"className":119823,"style":7310},[4702],[78,119825],{},[78,119827,4604],{"className":119828},[4682],[78,119830,119832],{"className":119831},[4566],[78,119833,119835,119918],{"className":119834},[4570],[78,119836,119838],{"className":119837},[4574],[4576,119839,119840],{"xmlns":4578,"display":4579},[4581,119841,119842,119916],{},[4584,119843,119844,119846,119848,119850,119852,119854,119856,119858,119860,119862,119864,119866,119868,119870,119872,119874,119876,119878,119880,119882,119884,119886,119914],{},[4596,119845,7062],{},[4596,119847,7065],{},[4591,119849,4594],{"stretchy":4593},[4596,119851,13],{},[4596,119853,5025],{},[4596,119855,262],{},[4591,119857,2066],{"separator":1419},[7077,119859,472],{},[4596,119861,39],{},[4591,119863,7351],{},[7077,119865,469],{},[4591,119867,4604],{"stretchy":4593},[4591,119869,4609],{},[4596,119871,7360],{},[4596,119873,5025],{},[4596,119875,262],{},[4591,119877,4594],{"stretchy":4593},[4596,119879,13],{},[4596,119881,5025],{},[4596,119883,262],{},[4596,119885,7102],{"mathvariant":7101},[4614,119887,119888,119890],{},[7077,119889,7107],{},[4584,119891,119892,119894,119896,119898],{},[7077,119893,472],{},[4596,119895,39],{},[4596,119897,7102],{"mathvariant":7101},[4600,119899,119900,119902],{},[4596,119901,5245],{},[4584,119903,119904,119906,119908,119910,119912],{},[4596,119905,5058],{},[4596,119907,5025],{},[4596,119909,5245],{},[4596,119911,4618],{},[4596,119913,7132],{},[4591,119915,4604],{"stretchy":4593},[4647,119917,7407],{"encoding":4649},[78,119919,119921,119963,119984],{"className":119920,"ariaHidden":1419},[4654],[78,119922,119924,119927,119930,119933,119936,119939,119942,119945,119948,119951,119954,119957,119960],{"className":119923},[4658],[78,119925],{"className":119926,"style":4663},[4662],[78,119928,7062],{"className":119929,"style":5219},[4667,4678],[78,119931,7065],{"className":119932,"style":7153},[4667,4678],[78,119934,4594],{"className":119935},[4674],[78,119937,13],{"className":119938},[4667,4678],[78,119940,7163],{"className":119941},[4667,4678],[78,119943,2066],{"className":119944},[5126],[78,119946],{"className":119947,"style":4839},[4739],[78,119949,472],{"className":119950},[4667],[78,119952,39],{"className":119953},[4667,4678],[78,119955],{"className":119956,"style":5143},[4739],[78,119958,7351],{"className":119959},[7450],[78,119961],{"className":119962,"style":5143},[4739],[78,119964,119966,119969,119972,119975,119978,119981],{"className":119965},[4658],[78,119967],{"className":119968,"style":4663},[4662],[78,119970,469],{"className":119971},[4667],[78,119973,4604],{"className":119974},[4682],[78,119976],{"className":119977,"style":4740},[4739],[78,119979,4609],{"className":119980},[4744],[78,119982],{"className":119983,"style":4740},[4739],[78,119985,119987,119990,119993,119996,119999,120002,120005,120098],{"className":119986},[4658],[78,119988],{"className":119989,"style":7194},[4662],[78,119991,7484],{"className":119992},[4667,4678],[78,119994,4594],{"className":119995},[4674],[78,119997,13],{"className":119998},[4667,4678],[78,120000,7163],{"className":120001},[4667,4678],[78,120003,7214],{"className":120004},[4667],[78,120006,120008,120011],{"className":120007},[4667],[78,120009,2949],{"className":120010},[4667],[78,120012,120014],{"className":120013},[4689],[78,120015,120017],{"className":120016},[4693],[78,120018,120020],{"className":120019},[4698],[78,120021,120023],{"className":120022,"style":7233},[4702],[78,120024,120025,120028],{"style":5209},[78,120026],{"className":120027,"style":4711},[4710],[78,120029,120031],{"className":120030},[4715,4716,4717,4718],[78,120032,120034,120037,120040,120043],{"className":120033},[4667,4718],[78,120035,472],{"className":120036},[4667,4718],[78,120038,39],{"className":120039},[4667,4678,4718],[78,120041,7102],{"className":120042},[4667,4718],[78,120044,120046,120049],{"className":120045},[4667,4718],[78,120047,5245],{"className":120048},[4667,4678,4718],[78,120050,120052],{"className":120051},[4689],[78,120053,120055,120090],{"className":120054},[4693,4694],[78,120056,120058,120087],{"className":120057},[4698],[78,120059,120061],{"className":120060,"style":7272},[4702],[78,120062,120063,120066],{"style":7275},[78,120064],{"className":120065,"style":4896},[4710],[78,120067,120069],{"className":120068},[4715,4900,4901,4718],[78,120070,120072,120075,120078,120081,120084],{"className":120071},[4667,4718],[78,120073,5058],{"className":120074},[4667,4678,4718],[78,120076,5025],{"className":120077},[4667,4678,4718],[78,120079,5245],{"className":120080},[4667,4678,4718],[78,120082,4618],{"className":120083},[4667,4678,4718],[78,120085,7132],{"className":120086,"style":7300},[4667,4678,4718],[78,120088,4726],{"className":120089},[4725],[78,120091,120093],{"className":120092},[4698],[78,120094,120096],{"className":120095,"style":7310},[4702],[78,120097],{},[78,120099,4604],{"className":120100},[4682],[13,120102,7595],{},[2285,120104,120105,120107],{},[52,120106,7600],{},[52,120108,7603],{},[114,120110,120111],{"className":116,"code":7606,"language":118,"meta":119,"style":119},[17,120112,120113,120117,120121,120125,120129,120133,120137,120141,120145,120149,120153,120157,120161,120165,120169,120173,120177,120181,120185,120189,120193,120197,120201,120205,120209],{"__ignoreMap":119},[78,120114,120115],{"class":124,"line":125},[78,120116,7613],{},[78,120118,120119],{"class":124,"line":132},[78,120120,7618],{},[78,120122,120123],{"class":124,"line":138},[78,120124,129],{"emptyLinePlaceholder":128},[78,120126,120127],{"class":124,"line":144},[78,120128,6428],{},[78,120130,120131],{"class":124,"line":150},[78,120132,7631],{},[78,120134,120135],{"class":124,"line":156},[78,120136,7636],{},[78,120138,120139],{"class":124,"line":162},[78,120140,7641],{},[78,120142,120143],{"class":124,"line":168},[78,120144,129],{"emptyLinePlaceholder":128},[78,120146,120147],{"class":124,"line":174},[78,120148,7650],{},[78,120150,120151],{"class":124,"line":180},[78,120152,7655],{},[78,120154,120155],{"class":124,"line":186},[78,120156,7660],{},[78,120158,120159],{"class":124,"line":192},[78,120160,7665],{},[78,120162,120163],{"class":124,"line":198},[78,120164,7670],{},[78,120166,120167],{"class":124,"line":204},[78,120168,7675],{},[78,120170,120171],{"class":124,"line":210},[78,120172,7680],{},[78,120174,120175],{"class":124,"line":216},[78,120176,7685],{},[78,120178,120179],{"class":124,"line":222},[78,120180,7690],{},[78,120182,120183],{"class":124,"line":421},[78,120184,7695],{},[78,120186,120187],{"class":124,"line":427},[78,120188,7700],{},[78,120190,120191],{"class":124,"line":433},[78,120192,7705],{},[78,120194,120195],{"class":124,"line":2443},[78,120196,129],{"emptyLinePlaceholder":128},[78,120198,120199],{"class":124,"line":2448},[78,120200,6472],{},[78,120202,120203],{"class":124,"line":2454},[78,120204,7718],{},[78,120206,120207],{"class":124,"line":2460},[78,120208,7723],{},[78,120210,120211],{"class":124,"line":2465},[78,120212,7728],{},[226,120214,228],{},{"title":119,"searchDepth":144,"depth":144,"links":120216},[120217,120218,120219,120220,120221,120222],{"id":6398,"depth":132,"text":6399},{"id":6771,"depth":132,"text":6772},{"id":6863,"depth":132,"text":6864},{"id":6974,"depth":132,"text":6975},{"id":7012,"depth":132,"text":7013},{"id":7034,"depth":132,"text":7035},{},{"title":6384,"description":119},[7744],{"id":7747,"title":7748,"assetBase":239,"author":8,"body":120227,"category":787,"collection":233,"date":9127,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":121309,"navigation":128,"originalPath":239,"path":9129,"seo":121310,"source":243,"stem":9131,"tags":121311,"weight":250,"__hash__":9134},{"type":10,"value":120228,"toc":121279},[120229,120231,120233,120235,120267,120269,120341,120343,120363,120365,120433,120435,120475,120477,120479,120531,120533,120537,120541,120545,120549,120573,120575,120659,120661,120663,120711,120713,120717,120793,120841,120843,120847,120891,120893,120895,120899,120935,120937,120941,120945,121021,121023,121029,121033,121035,121047,121075,121079,121083,121097,121141,121143,121149,121185,121187,121191,121215,121217,121227,121229,121233,121277],[4517,120230,7748],{"id":7753},[107,120232,7757],{"id":7756},[7759,120234,7761],{"id":7761},[114,120236,120237],{"className":116,"code":7764,"language":118,"meta":119,"style":119},[17,120238,120239,120243,120247,120251,120255,120259,120263],{"__ignoreMap":119},[78,120240,120241],{"class":124,"line":125},[78,120242,7771],{},[78,120244,120245],{"class":124,"line":132},[78,120246,7776],{},[78,120248,120249],{"class":124,"line":138},[78,120250,129],{"emptyLinePlaceholder":128},[78,120252,120253],{"class":124,"line":144},[78,120254,7785],{},[78,120256,120257],{"class":124,"line":150},[78,120258,7790],{},[78,120260,120261],{"class":124,"line":156},[78,120262,7795],{},[78,120264,120265],{"class":124,"line":162},[78,120266,7800],{},[7759,120268,7803],{"id":7803},[114,120270,120271],{"className":116,"code":7806,"language":118,"meta":119,"style":119},[17,120272,120273,120277,120281,120285,120289,120293,120297,120301,120305,120309,120313,120317,120321,120325,120329,120333,120337],{"__ignoreMap":119},[78,120274,120275],{"class":124,"line":125},[78,120276,7813],{},[78,120278,120279],{"class":124,"line":132},[78,120280,7818],{},[78,120282,120283],{"class":124,"line":138},[78,120284,129],{"emptyLinePlaceholder":128},[78,120286,120287],{"class":124,"line":144},[78,120288,7827],{},[78,120290,120291],{"class":124,"line":150},[78,120292,7832],{},[78,120294,120295],{"class":124,"line":156},[78,120296,7837],{},[78,120298,120299],{"class":124,"line":162},[78,120300,7842],{},[78,120302,120303],{"class":124,"line":168},[78,120304,7847],{},[78,120306,120307],{"class":124,"line":174},[78,120308,129],{"emptyLinePlaceholder":128},[78,120310,120311],{"class":124,"line":180},[78,120312,7856],{},[78,120314,120315],{"class":124,"line":186},[78,120316,7861],{},[78,120318,120319],{"class":124,"line":192},[78,120320,7866],{},[78,120322,120323],{"class":124,"line":198},[78,120324,6942],{},[78,120326,120327],{"class":124,"line":204},[78,120328,7875],{},[78,120330,120331],{"class":124,"line":210},[78,120332,7880],{},[78,120334,120335],{"class":124,"line":216},[78,120336,7885],{},[78,120338,120339],{"class":124,"line":222},[78,120340,7890],{},[7759,120342,7893],{"id":7893},[114,120344,120345],{"className":116,"code":7896,"language":118,"meta":119,"style":119},[17,120346,120347,120351,120355,120359],{"__ignoreMap":119},[78,120348,120349],{"class":124,"line":125},[78,120350,7903],{},[78,120352,120353],{"class":124,"line":132},[78,120354,7908],{},[78,120356,120357],{"class":124,"line":138},[78,120358,7913],{},[78,120360,120361],{"class":124,"line":144},[78,120362,7918],{},[7759,120364,7921],{"id":7921},[114,120366,120367],{"className":116,"code":7924,"language":118,"meta":119,"style":119},[17,120368,120369,120373,120377,120381,120385,120389,120393,120397,120401,120405,120409,120413,120417,120421,120425,120429],{"__ignoreMap":119},[78,120370,120371],{"class":124,"line":125},[78,120372,7931],{},[78,120374,120375],{"class":124,"line":132},[78,120376,7936],{},[78,120378,120379],{"class":124,"line":138},[78,120380,7941],{},[78,120382,120383],{"class":124,"line":144},[78,120384,7946],{},[78,120386,120387],{"class":124,"line":150},[78,120388,129],{"emptyLinePlaceholder":128},[78,120390,120391],{"class":124,"line":156},[78,120392,7955],{},[78,120394,120395],{"class":124,"line":162},[78,120396,7960],{},[78,120398,120399],{"class":124,"line":168},[78,120400,7941],{},[78,120402,120403],{"class":124,"line":174},[78,120404,7969],{},[78,120406,120407],{"class":124,"line":180},[78,120408,129],{"emptyLinePlaceholder":128},[78,120410,120411],{"class":124,"line":186},[78,120412,7978],{},[78,120414,120415],{"class":124,"line":192},[78,120416,7983],{},[78,120418,120419],{"class":124,"line":198},[78,120420,7988],{},[78,120422,120423],{"class":124,"line":204},[78,120424,7993],{},[78,120426,120427],{"class":124,"line":210},[78,120428,7998],{},[78,120430,120431],{"class":124,"line":216},[78,120432,8003],{},[7759,120434,8006],{"id":8006},[114,120436,120437],{"className":116,"code":8009,"language":118,"meta":119,"style":119},[17,120438,120439,120443,120447,120451,120455,120459,120463,120467,120471],{"__ignoreMap":119},[78,120440,120441],{"class":124,"line":125},[78,120442,8016],{},[78,120444,120445],{"class":124,"line":132},[78,120446,8021],{},[78,120448,120449],{"class":124,"line":138},[78,120450,8026],{},[78,120452,120453],{"class":124,"line":144},[78,120454,8031],{},[78,120456,120457],{"class":124,"line":150},[78,120458,8036],{},[78,120460,120461],{"class":124,"line":156},[78,120462,8041],{},[78,120464,120465],{"class":124,"line":162},[78,120466,8046],{},[78,120468,120469],{"class":124,"line":168},[78,120470,8051],{},[78,120472,120473],{"class":124,"line":174},[78,120474,7795],{},[107,120476,8059],{"id":8058},[7759,120478,8062],{"id":8062},[114,120480,120481],{"className":116,"code":8065,"language":118,"meta":119,"style":119},[17,120482,120483,120487,120491,120495,120499,120503,120507,120511,120515,120519,120523,120527],{"__ignoreMap":119},[78,120484,120485],{"class":124,"line":125},[78,120486,8072],{},[78,120488,120489],{"class":124,"line":132},[78,120490,8077],{},[78,120492,120493],{"class":124,"line":138},[78,120494,8082],{},[78,120496,120497],{"class":124,"line":144},[78,120498,8087],{},[78,120500,120501],{"class":124,"line":150},[78,120502,8092],{},[78,120504,120505],{"class":124,"line":156},[78,120506,2070],{},[78,120508,120509],{"class":124,"line":162},[78,120510,8101],{},[78,120512,120513],{"class":124,"line":168},[78,120514,8106],{},[78,120516,120517],{"class":124,"line":174},[78,120518,8111],{},[78,120520,120521],{"class":124,"line":180},[78,120522,8116],{},[78,120524,120525],{"class":124,"line":186},[78,120526,2070],{},[78,120528,120529],{"class":124,"line":192},[78,120530,8125],{},[7759,120532,8128],{"id":8128},[13,120534,120535,8134],{},[17,120536,8133],{},[13,120538,120539,8140],{},[17,120540,8139],{},[13,120542,120543,8146],{},[17,120544,8145],{},[13,120546,120547,8152],{},[17,120548,8151],{},[114,120550,120551],{"className":116,"code":8155,"language":118,"meta":119,"style":119},[17,120552,120553,120557,120561,120565,120569],{"__ignoreMap":119},[78,120554,120555],{"class":124,"line":125},[78,120556,8162],{},[78,120558,120559],{"class":124,"line":132},[78,120560,8167],{},[78,120562,120563],{"class":124,"line":138},[78,120564,8172],{},[78,120566,120567],{"class":124,"line":144},[78,120568,8177],{},[78,120570,120571],{"class":124,"line":150},[78,120572,8041],{},[7759,120574,8184],{"id":8184},[114,120576,120577],{"className":116,"code":8187,"language":118,"meta":119,"style":119},[17,120578,120579,120583,120587,120591,120595,120599,120603,120607,120611,120615,120619,120623,120627,120631,120635,120639,120643,120647,120651,120655],{"__ignoreMap":119},[78,120580,120581],{"class":124,"line":125},[78,120582,8194],{},[78,120584,120585],{"class":124,"line":132},[78,120586,8199],{},[78,120588,120589],{"class":124,"line":138},[78,120590,8204],{},[78,120592,120593],{"class":124,"line":144},[78,120594,8209],{},[78,120596,120597],{"class":124,"line":150},[78,120598,8214],{},[78,120600,120601],{"class":124,"line":156},[78,120602,8219],{},[78,120604,120605],{"class":124,"line":162},[78,120606,8224],{},[78,120608,120609],{"class":124,"line":168},[78,120610,8229],{},[78,120612,120613],{"class":124,"line":174},[78,120614,8234],{},[78,120616,120617],{"class":124,"line":180},[78,120618,8239],{},[78,120620,120621],{"class":124,"line":186},[78,120622,8244],{},[78,120624,120625],{"class":124,"line":192},[78,120626,8249],{},[78,120628,120629],{"class":124,"line":198},[78,120630,8254],{},[78,120632,120633],{"class":124,"line":204},[78,120634,8259],{},[78,120636,120637],{"class":124,"line":210},[78,120638,8041],{},[78,120640,120641],{"class":124,"line":216},[78,120642,8268],{},[78,120644,120645],{"class":124,"line":222},[78,120646,8273],{},[78,120648,120649],{"class":124,"line":421},[78,120650,8278],{},[78,120652,120653],{"class":124,"line":427},[78,120654,8283],{},[78,120656,120657],{"class":124,"line":433},[78,120658,8288],{},[107,120660,8292],{"id":8291},[7759,120662,8296],{"id":8295},[114,120664,120665],{"className":116,"code":8299,"language":118,"meta":119,"style":119},[17,120666,120667,120671,120675,120679,120683,120687,120691,120695,120699,120703,120707],{"__ignoreMap":119},[78,120668,120669],{"class":124,"line":125},[78,120670,8306],{},[78,120672,120673],{"class":124,"line":132},[78,120674,8311],{},[78,120676,120677],{"class":124,"line":138},[78,120678,129],{"emptyLinePlaceholder":128},[78,120680,120681],{"class":124,"line":144},[78,120682,8320],{},[78,120684,120685],{"class":124,"line":150},[78,120686,8325],{},[78,120688,120689],{"class":124,"line":156},[78,120690,129],{"emptyLinePlaceholder":128},[78,120692,120693],{"class":124,"line":162},[78,120694,8334],{},[78,120696,120697],{"class":124,"line":168},[78,120698,8339],{},[78,120700,120701],{"class":124,"line":174},[78,120702,8344],{},[78,120704,120705],{"class":124,"line":180},[78,120706,8349],{},[78,120708,120709],{"class":124,"line":186},[78,120710,8354],{},[7759,120712,8358],{"id":8357},[13,120714,8361,120715,8364],{},[17,120716,8358],{},[8366,120718,120719,120729],{},[8369,120720,120721],{},[8372,120722,120723,120725,120727],{},[8375,120724,8378],{"align":8377},[8375,120726,8381],{"align":8377},[8375,120728,8384],{"align":8377},[8386,120730,120731,120741,120751,120761,120771,120783],{},[8372,120732,120733,120737,120739],{},[8391,120734,120735],{"align":8377},[22,120736,8395],{},[8391,120738,8398],{"align":8377},[8391,120740,8401],{"align":8377},[8372,120742,120743,120747,120749],{},[8391,120744,120745],{"align":8377},[22,120746,8408],{},[8391,120748,8411],{"align":8377},[8391,120750,8414],{"align":8377},[8372,120752,120753,120757,120759],{},[8391,120754,120755],{"align":8377},[22,120756,8421],{},[8391,120758,8424],{"align":8377},[8391,120760,8427],{"align":8377},[8372,120762,120763,120767,120769],{},[8391,120764,120765],{"align":8377},[22,120766,8434],{},[8391,120768,8437],{"align":8377},[8391,120770,8440],{"align":8377},[8372,120772,120773,120777,120781],{},[8391,120774,120775],{"align":8377},[22,120776,8447],{},[8391,120778,120779,8453],{"align":8377},[17,120780,8452],{},[8391,120782,8456],{"align":8377},[8372,120784,120785,120789,120791],{},[8391,120786,120787],{"align":8377},[22,120788,8463],{},[8391,120790,8466],{"align":8377},[8391,120792,8469],{"align":8377},[114,120794,120795],{"className":116,"code":8472,"language":118,"meta":119,"style":119},[17,120796,120797,120801,120805,120809,120813,120817,120821,120825,120829,120833,120837],{"__ignoreMap":119},[78,120798,120799],{"class":124,"line":125},[78,120800,8479],{},[78,120802,120803],{"class":124,"line":132},[78,120804,129],{"emptyLinePlaceholder":128},[78,120806,120807],{"class":124,"line":138},[78,120808,8488],{},[78,120810,120811],{"class":124,"line":144},[78,120812,8493],{},[78,120814,120815],{"class":124,"line":150},[78,120816,8498],{},[78,120818,120819],{"class":124,"line":156},[78,120820,8503],{},[78,120822,120823],{"class":124,"line":162},[78,120824,8508],{},[78,120826,120827],{"class":124,"line":168},[78,120828,8513],{},[78,120830,120831],{"class":124,"line":174},[78,120832,8518],{},[78,120834,120835],{"class":124,"line":180},[78,120836,8523],{},[78,120838,120839],{"class":124,"line":186},[78,120840,8528],{},[7759,120842,8532],{"id":8531},[13,120844,120845,8537],{},[17,120846,8532],{},[114,120848,120849],{"className":116,"code":8540,"language":118,"meta":119,"style":119},[17,120850,120851,120855,120859,120863,120867,120871,120875,120879,120883,120887],{"__ignoreMap":119},[78,120852,120853],{"class":124,"line":125},[78,120854,8547],{},[78,120856,120857],{"class":124,"line":132},[78,120858,8552],{},[78,120860,120861],{"class":124,"line":138},[78,120862,129],{"emptyLinePlaceholder":128},[78,120864,120865],{"class":124,"line":144},[78,120866,8561],{},[78,120868,120869],{"class":124,"line":150},[78,120870,8566],{},[78,120872,120873],{"class":124,"line":156},[78,120874,129],{"emptyLinePlaceholder":128},[78,120876,120877],{"class":124,"line":162},[78,120878,8575],{},[78,120880,120881],{"class":124,"line":168},[78,120882,8580],{},[78,120884,120885],{"class":124,"line":174},[78,120886,8585],{},[78,120888,120889],{"class":124,"line":180},[78,120890,8590],{},[107,120892,8594],{"id":8593},[13,120894,8597],{},[13,120896,8600,120897],{},[17,120898,8603],{},[114,120900,120901],{"className":116,"code":8606,"language":118,"meta":119,"style":119},[17,120902,120903,120907,120911,120915,120919,120923,120927,120931],{"__ignoreMap":119},[78,120904,120905],{"class":124,"line":125},[78,120906,8613],{},[78,120908,120909],{"class":124,"line":132},[78,120910,8618],{},[78,120912,120913],{"class":124,"line":138},[78,120914,129],{"emptyLinePlaceholder":128},[78,120916,120917],{"class":124,"line":144},[78,120918,8627],{},[78,120920,120921],{"class":124,"line":150},[78,120922,8632],{},[78,120924,120925],{"class":124,"line":156},[78,120926,8637],{},[78,120928,120929],{"class":124,"line":162},[78,120930,8642],{},[78,120932,120933],{"class":124,"line":168},[78,120934,8041],{},[7759,120936,8649],{"id":8649},[13,120938,120939],{},[617,120940],{"alt":619,"src":8654},[13,120942,8657,120943,8661],{},[17,120944,8660],{},[114,120946,120947],{"className":116,"code":8664,"language":118,"meta":119,"style":119},[17,120948,120949,120953,120957,120961,120965,120969,120973,120977,120981,120985,120989,120993,120997,121001,121005,121009,121013,121017],{"__ignoreMap":119},[78,120950,120951],{"class":124,"line":125},[78,120952,8613],{},[78,120954,120955],{"class":124,"line":132},[78,120956,8675],{},[78,120958,120959],{"class":124,"line":138},[78,120960,8680],{},[78,120962,120963],{"class":124,"line":144},[78,120964,8685],{},[78,120966,120967],{"class":124,"line":150},[78,120968,129],{"emptyLinePlaceholder":128},[78,120970,120971],{"class":124,"line":156},[78,120972,8694],{},[78,120974,120975],{"class":124,"line":162},[78,120976,8627],{},[78,120978,120979],{"class":124,"line":168},[78,120980,8703],{},[78,120982,120983],{"class":124,"line":174},[78,120984,8708],{},[78,120986,120987],{"class":124,"line":180},[78,120988,8713],{},[78,120990,120991],{"class":124,"line":186},[78,120992,8718],{},[78,120994,120995],{"class":124,"line":192},[78,120996,8723],{},[78,120998,120999],{"class":124,"line":198},[78,121000,8728],{},[78,121002,121003],{"class":124,"line":204},[78,121004,8733],{},[78,121006,121007],{"class":124,"line":210},[78,121008,7680],{},[78,121010,121011],{"class":124,"line":216},[78,121012,8254],{},[78,121014,121015],{"class":124,"line":222},[78,121016,8746],{},[78,121018,121019],{"class":124,"line":421},[78,121020,8041],{},[107,121022,8754],{"id":8753},[13,121024,8757,121025,1018,121027,8764],{},[17,121026,8760],{},[17,121028,8763],{},[7759,121030,8768,121031,8771],{"id":8767},[17,121032,8760],{},[13,121034,8774],{},[49,121036,121037,121041],{},[52,121038,121039,8782],{},[22,121040,8781],{},[52,121042,121043,8788,121045,8792],{},[22,121044,8787],{},[17,121046,8791],{},[114,121048,121049],{"className":8795,"code":8796,"language":8797,"meta":119,"style":119},[17,121050,121051,121055,121059,121063,121067,121071],{"__ignoreMap":119},[78,121052,121053],{"class":124,"line":125},[78,121054,8804],{},[78,121056,121057],{"class":124,"line":132},[78,121058,8809],{},[78,121060,121061],{"class":124,"line":138},[78,121062,129],{"emptyLinePlaceholder":128},[78,121064,121065],{"class":124,"line":144},[78,121066,8818],{},[78,121068,121069],{"class":124,"line":150},[78,121070,8823],{},[78,121072,121073],{"class":124,"line":156},[78,121074,8828],{},[7759,121076,8832,121077,8835],{"id":8831},[17,121078,8763],{},[13,121080,8838,121081,8841],{},[17,121082,5009],{},[49,121084,121085,121089],{},[52,121086,121087,8848],{},[22,121088,8781],{},[52,121090,121091,8853,121093,8857,121095,8792],{},[22,121092,8787],{},[17,121094,8856],{},[17,121096,8860],{},[114,121098,121099],{"className":8795,"code":8863,"language":8797,"meta":119,"style":119},[17,121100,121101,121105,121109,121113,121117,121121,121125,121129,121133,121137],{"__ignoreMap":119},[78,121102,121103],{"class":124,"line":125},[78,121104,8870],{},[78,121106,121107],{"class":124,"line":132},[78,121108,129],{"emptyLinePlaceholder":128},[78,121110,121111],{"class":124,"line":138},[78,121112,8879],{},[78,121114,121115],{"class":124,"line":144},[78,121116,8809],{},[78,121118,121119],{"class":124,"line":150},[78,121120,129],{"emptyLinePlaceholder":128},[78,121122,121123],{"class":124,"line":156},[78,121124,8892],{},[78,121126,121127],{"class":124,"line":162},[78,121128,8897],{},[78,121130,121131],{"class":124,"line":168},[78,121132,8902],{},[78,121134,121135],{"class":124,"line":174},[78,121136,8907],{},[78,121138,121139],{"class":124,"line":180},[78,121140,8912],{},[107,121142,8916],{"id":8915},[13,121144,8919,121145,8923,121147],{},[17,121146,8922],{},[17,121148,8926],{},[114,121150,121151],{"className":116,"code":8929,"language":118,"meta":119,"style":119},[17,121152,121153,121157,121161,121165,121169,121173,121177,121181],{"__ignoreMap":119},[78,121154,121155],{"class":124,"line":125},[78,121156,8936],{},[78,121158,121159],{"class":124,"line":132},[78,121160,8941],{},[78,121162,121163],{"class":124,"line":138},[78,121164,8946],{},[78,121166,121167],{"class":124,"line":144},[78,121168,8951],{},[78,121170,121171],{"class":124,"line":150},[78,121172,8956],{},[78,121174,121175],{"class":124,"line":156},[78,121176,8961],{},[78,121178,121179],{"class":124,"line":162},[78,121180,8966],{},[78,121182,121183],{"class":124,"line":168},[78,121184,8971],{},[7759,121186,8974],{"id":8974},[13,121188,8977,121189],{},[17,121190,8980],{},[49,121192,121193,121199,121205,121211],{},[52,121194,121195,8990],{},[22,121196,121197],{},[17,121198,8989],{},[52,121200,121201,8998],{},[22,121202,121203],{},[17,121204,8997],{},[52,121206,121207,9006],{},[22,121208,121209],{},[17,121210,9005],{},[52,121212,9009,121213,9013],{},[17,121214,9012],{},[13,121216,9016],{},[49,121218,121219,121223],{},[52,121220,121221,9024],{},[17,121222,9023],{},[52,121224,121225,9030],{},[17,121226,9029],{},[7759,121228,9033],{"id":9033},[13,121230,9036,121231],{},[17,121232,9029],{},[114,121234,121235],{"className":116,"code":9041,"language":118,"meta":119,"style":119},[17,121236,121237,121241,121245,121249,121253,121257,121261,121265,121269,121273],{"__ignoreMap":119},[78,121238,121239],{"class":124,"line":125},[78,121240,9048],{},[78,121242,121243],{"class":124,"line":132},[78,121244,9053],{},[78,121246,121247],{"class":124,"line":138},[78,121248,9058],{},[78,121250,121251],{"class":124,"line":144},[78,121252,9063],{},[78,121254,121255],{"class":124,"line":150},[78,121256,9068],{},[78,121258,121259],{"class":124,"line":156},[78,121260,9073],{},[78,121262,121263],{"class":124,"line":162},[78,121264,9078],{},[78,121266,121267],{"class":124,"line":168},[78,121268,9083],{},[78,121270,121271],{"class":124,"line":174},[78,121272,9088],{},[78,121274,121275],{"class":124,"line":180},[78,121276,8971],{},[226,121278,228],{},{"title":119,"searchDepth":144,"depth":144,"links":121280},[121281,121288,121293,121298,121301,121305],{"id":7756,"depth":132,"text":7757,"children":121282},[121283,121284,121285,121286,121287],{"id":7761,"depth":144,"text":7761},{"id":7803,"depth":144,"text":7803},{"id":7893,"depth":144,"text":7893},{"id":7921,"depth":144,"text":7921},{"id":8006,"depth":144,"text":8006},{"id":8058,"depth":132,"text":8059,"children":121289},[121290,121291,121292],{"id":8062,"depth":144,"text":8062},{"id":8128,"depth":144,"text":8128},{"id":8184,"depth":144,"text":8184},{"id":8291,"depth":132,"text":8292,"children":121294},[121295,121296,121297],{"id":8295,"depth":144,"text":8296},{"id":8357,"depth":144,"text":8358},{"id":8531,"depth":144,"text":8532},{"id":8593,"depth":132,"text":8594,"children":121299},[121300],{"id":8649,"depth":144,"text":8649},{"id":8753,"depth":132,"text":8754,"children":121302},[121303,121304],{"id":8767,"depth":144,"text":9120},{"id":8831,"depth":144,"text":9122},{"id":8915,"depth":132,"text":8916,"children":121306},[121307,121308],{"id":8974,"depth":144,"text":8974},{"id":9033,"depth":144,"text":9033},{},{"title":7748,"description":119},[794,9133],{"id":9136,"title":9137,"assetBase":239,"author":8,"body":121313,"category":787,"collection":233,"date":9127,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":122600,"navigation":128,"originalPath":239,"path":10711,"seo":122601,"source":243,"stem":10713,"tags":122602,"weight":250,"__hash__":10716},{"type":10,"value":121314,"toc":122581},[121315,121317,121319,121321,121331,121335,121383,121385,121389,121391,121393,121395,121503,121505,121507,121515,121587,121589,121591,121599,121711,121713,121715,121725,121809,121811,121813,121823,121883,121885,121887,121889,121965,121979,121981,121983,121985,121987,122005,122081,122083,122085,122095,122147,122149,122151,122155,122173,122177,122187,122191,122197,122201,122209,122211,122213,122301,122305,122315,122317,122319,122341,122453,122455,122457,122517,122519,122579],[4517,121316,9137],{"id":9142},[107,121318,9145],{"id":9145},[13,121320,9148],{},[49,121322,121323,121325,121327,121329],{},[52,121324,9153],{},[52,121326,9156],{},[52,121328,9159],{},[52,121330,9162],{},[13,121332,9165,121333,8661],{},[17,121334,8922],{},[114,121336,121337],{"className":116,"code":9170,"language":118,"meta":119,"style":119},[17,121338,121339,121343,121347,121351,121355,121359,121363,121367,121371,121375,121379],{"__ignoreMap":119},[78,121340,121341],{"class":124,"line":125},[78,121342,8613],{},[78,121344,121345],{"class":124,"line":132},[78,121346,9181],{},[78,121348,121349],{"class":124,"line":138},[78,121350,129],{"emptyLinePlaceholder":128},[78,121352,121353],{"class":124,"line":144},[78,121354,8627],{},[78,121356,121357],{"class":124,"line":150},[78,121358,8703],{},[78,121360,121361],{"class":124,"line":156},[78,121362,9198],{},[78,121364,121365],{"class":124,"line":162},[78,121366,8713],{},[78,121368,121369],{"class":124,"line":168},[78,121370,9207],{},[78,121372,121373],{"class":124,"line":174},[78,121374,9212],{},[78,121376,121377],{"class":124,"line":180},[78,121378,8254],{},[78,121380,121381],{"class":124,"line":186},[78,121382,8041],{},[13,121384,9223],{},[13,121386,121387],{},[617,121388],{"alt":619,"src":9228},[107,121390,9232],{"id":9231},[7759,121392,9235],{"id":9235},[13,121394,9238],{},[8366,121396,121397,121405],{},[8369,121398,121399],{},[8372,121400,121401,121403],{},[8375,121402,9248],{"align":9247},[8375,121404,9251],{"align":9247},[8386,121406,121407,121413,121419,121425,121431,121437,121443,121449,121455,121461,121467,121473,121479,121485,121491,121497],{},[8372,121408,121409,121411],{},[8391,121410,9258],{"align":9247},[8391,121412,9261],{"align":9247},[8372,121414,121415,121417],{},[8391,121416,9266],{"align":9247},[8391,121418,9269],{"align":9247},[8372,121420,121421,121423],{},[8391,121422,9274],{"align":9247},[8391,121424,9277],{"align":9247},[8372,121426,121427,121429],{},[8391,121428,9282],{"align":9247},[8391,121430,9285],{"align":9247},[8372,121432,121433,121435],{},[8391,121434,9290],{"align":9247},[8391,121436,9293],{"align":9247},[8372,121438,121439,121441],{},[8391,121440,9298],{"align":9247},[8391,121442,9301],{"align":9247},[8372,121444,121445,121447],{},[8391,121446,9306],{"align":9247},[8391,121448,9309],{"align":9247},[8372,121450,121451,121453],{},[8391,121452,9314],{"align":9247},[8391,121454,9317],{"align":9247},[8372,121456,121457,121459],{},[8391,121458,9322],{"align":9247},[8391,121460,9325],{"align":9247},[8372,121462,121463,121465],{},[8391,121464,9330],{"align":9247},[8391,121466,9333],{"align":9247},[8372,121468,121469,121471],{},[8391,121470,9338],{"align":9247},[8391,121472,9341],{"align":9247},[8372,121474,121475,121477],{},[8391,121476,9346],{"align":9247},[8391,121478,9349],{"align":9247},[8372,121480,121481,121483],{},[8391,121482,9354],{"align":9247},[8391,121484,9357],{"align":9247},[8372,121486,121487,121489],{},[8391,121488,9362],{"align":9247},[8391,121490,9365],{"align":9247},[8372,121492,121493,121495],{},[8391,121494,9370],{"align":9247},[8391,121496,9373],{"align":9247},[8372,121498,121499,121501],{},[8391,121500,9378],{"align":9247},[8391,121502,9381],{"align":9247},[7759,121504,9385],{"id":9384},[13,121506,9388],{},[49,121508,121509,121511,121513],{},[52,121510,9393],{},[52,121512,9396],{},[52,121514,9399],{},[114,121516,121517],{"className":116,"code":9402,"language":118,"meta":119,"style":119},[17,121518,121519,121523,121527,121531,121535,121539,121543,121547,121551,121555,121559,121563,121567,121571,121575,121579,121583],{"__ignoreMap":119},[78,121520,121521],{"class":124,"line":125},[78,121522,8613],{},[78,121524,121525],{"class":124,"line":132},[78,121526,8675],{},[78,121528,121529],{"class":124,"line":138},[78,121530,129],{"emptyLinePlaceholder":128},[78,121532,121533],{"class":124,"line":144},[78,121534,8627],{},[78,121536,121537],{"class":124,"line":150},[78,121538,8703],{},[78,121540,121541],{"class":124,"line":156},[78,121542,9429],{},[78,121544,121545],{"class":124,"line":162},[78,121546,8713],{},[78,121548,121549],{"class":124,"line":168},[78,121550,8718],{},[78,121552,121553],{"class":124,"line":174},[78,121554,9442],{},[78,121556,121557],{"class":124,"line":180},[78,121558,9447],{},[78,121560,121561],{"class":124,"line":186},[78,121562,9452],{},[78,121564,121565],{"class":124,"line":192},[78,121566,9457],{},[78,121568,121569],{"class":124,"line":198},[78,121570,9462],{},[78,121572,121573],{"class":124,"line":204},[78,121574,9467],{},[78,121576,121577],{"class":124,"line":210},[78,121578,9472],{},[78,121580,121581],{"class":124,"line":216},[78,121582,8254],{},[78,121584,121585],{"class":124,"line":222},[78,121586,8041],{},[7759,121588,9484],{"id":9483},[13,121590,9487],{},[49,121592,121593,121595,121597],{},[52,121594,9492],{},[52,121596,9495],{},[52,121598,9498],{},[114,121600,121601],{"className":116,"code":9501,"language":118,"meta":119,"style":119},[17,121602,121603,121607,121611,121615,121619,121623,121627,121631,121635,121639,121643,121647,121651,121655,121659,121663,121667,121671,121675,121679,121683,121687,121691,121695,121699,121703,121707],{"__ignoreMap":119},[78,121604,121605],{"class":124,"line":125},[78,121606,8613],{},[78,121608,121609],{"class":124,"line":132},[78,121610,9512],{},[78,121612,121613],{"class":124,"line":138},[78,121614,8680],{},[78,121616,121617],{"class":124,"line":144},[78,121618,129],{"emptyLinePlaceholder":128},[78,121620,121621],{"class":124,"line":150},[78,121622,9525],{},[78,121624,121625],{"class":124,"line":156},[78,121626,9530],{},[78,121628,121629],{"class":124,"line":162},[78,121630,9535],{},[78,121632,121633],{"class":124,"line":168},[78,121634,129],{"emptyLinePlaceholder":128},[78,121636,121637],{"class":124,"line":174},[78,121638,9544],{},[78,121640,121641],{"class":124,"line":180},[78,121642,9549],{},[78,121644,121645],{"class":124,"line":186},[78,121646,9554],{},[78,121648,121649],{"class":124,"line":192},[78,121650,129],{"emptyLinePlaceholder":128},[78,121652,121653],{"class":124,"line":198},[78,121654,8627],{},[78,121656,121657],{"class":124,"line":204},[78,121658,8703],{},[78,121660,121661],{"class":124,"line":210},[78,121662,9571],{},[78,121664,121665],{"class":124,"line":216},[78,121666,9576],{},[78,121668,121669],{"class":124,"line":222},[78,121670,8713],{},[78,121672,121673],{"class":124,"line":421},[78,121674,9585],{},[78,121676,121677],{"class":124,"line":427},[78,121678,9590],{},[78,121680,121681],{"class":124,"line":433},[78,121682,9595],{},[78,121684,121685],{"class":124,"line":2443},[78,121686,9600],{},[78,121688,121689],{"class":124,"line":2448},[78,121690,9605],{},[78,121692,121693],{"class":124,"line":2454},[78,121694,9610],{},[78,121696,121697],{"class":124,"line":2460},[78,121698,9615],{},[78,121700,121701],{"class":124,"line":2465},[78,121702,9472],{},[78,121704,121705],{"class":124,"line":2470},[78,121706,8254],{},[78,121708,121709],{"class":124,"line":2903},[78,121710,8041],{},[7759,121712,9631],{"id":9630},[13,121714,9634],{},[49,121716,121717,121719,121721,121723],{},[52,121718,9639],{},[52,121720,9642],{},[52,121722,9645],{},[52,121724,9648],{},[114,121726,121727],{"className":116,"code":9651,"language":118,"meta":119,"style":119},[17,121728,121729,121733,121737,121741,121745,121749,121753,121757,121761,121765,121769,121773,121777,121781,121785,121789,121793,121797,121801,121805],{"__ignoreMap":119},[78,121730,121731],{"class":124,"line":125},[78,121732,8613],{},[78,121734,121735],{"class":124,"line":132},[78,121736,9662],{},[78,121738,121739],{"class":124,"line":138},[78,121740,9667],{},[78,121742,121743],{"class":124,"line":144},[78,121744,9672],{},[78,121746,121747],{"class":124,"line":150},[78,121748,8041],{},[78,121750,121751],{"class":124,"line":156},[78,121752,129],{"emptyLinePlaceholder":128},[78,121754,121755],{"class":124,"line":162},[78,121756,8627],{},[78,121758,121759],{"class":124,"line":168},[78,121760,8703],{},[78,121762,121763],{"class":124,"line":174},[78,121764,9693],{},[78,121766,121767],{"class":124,"line":180},[78,121768,8713],{},[78,121770,121771],{"class":124,"line":186},[78,121772,9702],{},[78,121774,121775],{"class":124,"line":192},[78,121776,9707],{},[78,121778,121779],{"class":124,"line":198},[78,121780,9712],{},[78,121782,121783],{"class":124,"line":204},[78,121784,9717],{},[78,121786,121787],{"class":124,"line":210},[78,121788,9722],{},[78,121790,121791],{"class":124,"line":216},[78,121792,9727],{},[78,121794,121795],{"class":124,"line":222},[78,121796,9732],{},[78,121798,121799],{"class":124,"line":421},[78,121800,9472],{},[78,121802,121803],{"class":124,"line":427},[78,121804,8254],{},[78,121806,121807],{"class":124,"line":433},[78,121808,8041],{},[7759,121810,9362],{"id":9747},[13,121812,9750],{},[49,121814,121815,121817,121819,121821],{},[52,121816,9755],{},[52,121818,9758],{},[52,121820,9761],{},[52,121822,9764],{},[114,121824,121825],{"className":116,"code":9767,"language":118,"meta":119,"style":119},[17,121826,121827,121831,121835,121839,121843,121847,121851,121855,121859,121863,121867,121871,121875,121879],{"__ignoreMap":119},[78,121828,121829],{"class":124,"line":125},[78,121830,8613],{},[78,121832,121833],{"class":124,"line":132},[78,121834,9778],{},[78,121836,121837],{"class":124,"line":138},[78,121838,129],{"emptyLinePlaceholder":128},[78,121840,121841],{"class":124,"line":144},[78,121842,8627],{},[78,121844,121845],{"class":124,"line":150},[78,121846,8703],{},[78,121848,121849],{"class":124,"line":156},[78,121850,8708],{},[78,121852,121853],{"class":124,"line":162},[78,121854,8713],{},[78,121856,121857],{"class":124,"line":168},[78,121858,9803],{},[78,121860,121861],{"class":124,"line":174},[78,121862,9808],{},[78,121864,121865],{"class":124,"line":180},[78,121866,9813],{},[78,121868,121869],{"class":124,"line":186},[78,121870,9818],{},[78,121872,121873],{"class":124,"line":192},[78,121874,9472],{},[78,121876,121877],{"class":124,"line":198},[78,121878,8254],{},[78,121880,121881],{"class":124,"line":204},[78,121882,8041],{},[7759,121884,9834],{"id":9833},[13,121886,9837],{},[13,121888,9840],{},[114,121890,121891],{"className":116,"code":9843,"language":118,"meta":119,"style":119},[17,121892,121893,121897,121901,121905,121909,121913,121917,121921,121925,121929,121933,121937,121941,121945,121949,121953,121957,121961],{"__ignoreMap":119},[78,121894,121895],{"class":124,"line":125},[78,121896,9850],{},[78,121898,121899],{"class":124,"line":132},[78,121900,129],{"emptyLinePlaceholder":128},[78,121902,121903],{"class":124,"line":138},[78,121904,8627],{},[78,121906,121907],{"class":124,"line":144},[78,121908,9863],{},[78,121910,121911],{"class":124,"line":150},[78,121912,8713],{},[78,121914,121915],{"class":124,"line":156},[78,121916,9872],{},[78,121918,121919],{"class":124,"line":162},[78,121920,9877],{},[78,121922,121923],{"class":124,"line":168},[78,121924,9882],{},[78,121926,121927],{"class":124,"line":174},[78,121928,9887],{},[78,121930,121931],{"class":124,"line":180},[78,121932,9892],{},[78,121934,121935],{"class":124,"line":186},[78,121936,9897],{},[78,121938,121939],{"class":124,"line":192},[78,121940,9902],{},[78,121942,121943],{"class":124,"line":198},[78,121944,9907],{},[78,121946,121947],{"class":124,"line":204},[78,121948,9912],{},[78,121950,121951],{"class":124,"line":210},[78,121952,8239],{},[78,121954,121955],{"class":124,"line":216},[78,121956,7680],{},[78,121958,121959],{"class":124,"line":222},[78,121960,8254],{},[78,121962,121963],{"class":124,"line":421},[78,121964,8041],{},[13,121966,9931,121967,1011,121969,1011,121971,9940,121973,9944,121975,9948,121977,9951],{},[22,121968,9934],{},[22,121970,9251],{},[22,121972,9939],{},[22,121974,9943],{},[22,121976,9947],{},[22,121978,9248],{},[107,121980,9955],{"id":9954},[13,121982,9958],{},[7759,121984,9962],{"id":9961},[13,121986,9965],{},[49,121988,121989,121993,121997,122001],{},[52,121990,121991,9973],{},[17,121992,9972],{},[52,121994,121995,9979],{},[17,121996,9978],{},[52,121998,121999,9985],{},[17,122000,9984],{},[52,122002,122003,9991],{},[17,122004,9990],{},[114,122006,122007],{"className":116,"code":9994,"language":118,"meta":119,"style":119},[17,122008,122009,122013,122017,122021,122025,122029,122033,122037,122041,122045,122049,122053,122057,122061,122065,122069,122073,122077],{"__ignoreMap":119},[78,122010,122011],{"class":124,"line":125},[78,122012,10001],{},[78,122014,122015],{"class":124,"line":132},[78,122016,8194],{},[78,122018,122019],{"class":124,"line":138},[78,122020,10010],{},[78,122022,122023],{"class":124,"line":144},[78,122024,10015],{},[78,122026,122027],{"class":124,"line":150},[78,122028,129],{"emptyLinePlaceholder":128},[78,122030,122031],{"class":124,"line":156},[78,122032,10024],{},[78,122034,122035],{"class":124,"line":162},[78,122036,10029],{},[78,122038,122039],{"class":124,"line":168},[78,122040,10034],{},[78,122042,122043],{"class":124,"line":174},[78,122044,10039],{},[78,122046,122047],{"class":124,"line":180},[78,122048,10044],{},[78,122050,122051],{"class":124,"line":186},[78,122052,10049],{},[78,122054,122055],{"class":124,"line":192},[78,122056,10054],{},[78,122058,122059],{"class":124,"line":198},[78,122060,10059],{},[78,122062,122063],{"class":124,"line":204},[78,122064,129],{"emptyLinePlaceholder":128},[78,122066,122067],{"class":124,"line":210},[78,122068,10068],{},[78,122070,122071],{"class":124,"line":216},[78,122072,10073],{},[78,122074,122075],{"class":124,"line":222},[78,122076,10078],{},[78,122078,122079],{"class":124,"line":421},[78,122080,10059],{},[7759,122082,10086],{"id":10085},[13,122084,10089],{},[49,122086,122087,122091],{},[52,122088,122089,10097],{},[17,122090,10096],{},[52,122092,122093,10103],{},[17,122094,10102],{},[114,122096,122097],{"className":116,"code":10106,"language":118,"meta":119,"style":119},[17,122098,122099,122103,122107,122111,122115,122119,122123,122127,122131,122135,122139,122143],{"__ignoreMap":119},[78,122100,122101],{"class":124,"line":125},[78,122102,10113],{},[78,122104,122105],{"class":124,"line":132},[78,122106,10118],{},[78,122108,122109],{"class":124,"line":138},[78,122110,129],{"emptyLinePlaceholder":128},[78,122112,122113],{"class":124,"line":144},[78,122114,129],{"emptyLinePlaceholder":128},[78,122116,122117],{"class":124,"line":150},[78,122118,10131],{},[78,122120,122121],{"class":124,"line":156},[78,122122,10136],{},[78,122124,122125],{"class":124,"line":162},[78,122126,10141],{},[78,122128,122129],{"class":124,"line":168},[78,122130,10146],{},[78,122132,122133],{"class":124,"line":174},[78,122134,10151],{},[78,122136,122137],{"class":124,"line":180},[78,122138,10156],{},[78,122140,122141],{"class":124,"line":186},[78,122142,10161],{},[78,122144,122145],{"class":124,"line":192},[78,122146,10166],{},[7759,122148,10170],{"id":10169},[13,122150,10173],{},[13,122152,122153],{},[22,122154,10178],{},[49,122156,122157,122161,122165,122169],{},[52,122158,122159,10186],{},[17,122160,10185],{},[52,122162,122163,10192],{},[17,122164,10191],{},[52,122166,122167,10198],{},[17,122168,10197],{},[52,122170,122171,10204],{},[17,122172,10203],{},[13,122174,122175],{},[22,122176,10209],{},[49,122178,122179,122183],{},[52,122180,122181,10217],{},[17,122182,10216],{},[52,122184,122185,10223],{},[17,122186,10222],{},[13,122188,122189],{},[22,122190,10228],{},[49,122192,122193],{},[52,122194,122195,10236],{},[17,122196,10235],{},[13,122198,122199],{},[22,122200,10241],{},[49,122202,122203,122205,122207],{},[52,122204,10246],{},[52,122206,10249],{},[52,122208,10252],{},[7759,122210,10256],{"id":10255},[13,122212,10259],{},[114,122214,122215],{"className":116,"code":10262,"language":118,"meta":119,"style":119},[17,122216,122217,122221,122225,122229,122233,122237,122241,122245,122249,122253,122257,122261,122265,122269,122273,122277,122281,122285,122289,122293,122297],{"__ignoreMap":119},[78,122218,122219],{"class":124,"line":125},[78,122220,9662],{},[78,122222,122223],{"class":124,"line":132},[78,122224,10273],{},[78,122226,122227],{"class":124,"line":138},[78,122228,10278],{},[78,122230,122231],{"class":124,"line":144},[78,122232,8041],{},[78,122234,122235],{"class":124,"line":150},[78,122236,10010],{},[78,122238,122239],{"class":124,"line":156},[78,122240,10291],{},[78,122242,122243],{"class":124,"line":162},[78,122244,129],{"emptyLinePlaceholder":128},[78,122246,122247],{"class":124,"line":168},[78,122248,10300],{},[78,122250,122251],{"class":124,"line":174},[78,122252,10305],{},[78,122254,122255],{"class":124,"line":180},[78,122256,10310],{},[78,122258,122259],{"class":124,"line":186},[78,122260,10315],{},[78,122262,122263],{"class":124,"line":192},[78,122264,129],{"emptyLinePlaceholder":128},[78,122266,122267],{"class":124,"line":198},[78,122268,10324],{},[78,122270,122271],{"class":124,"line":204},[78,122272,10329],{},[78,122274,122275],{"class":124,"line":210},[78,122276,10315],{},[78,122278,122279],{"class":124,"line":216},[78,122280,129],{"emptyLinePlaceholder":128},[78,122282,122283],{"class":124,"line":222},[78,122284,8627],{},[78,122286,122287],{"class":124,"line":421},[78,122288,8703],{},[78,122290,122291],{"class":124,"line":427},[78,122292,10350],{},[78,122294,122295],{"class":124,"line":433},[78,122296,9198],{},[78,122298,122299],{"class":124,"line":2443},[78,122300,8041],{},[13,122302,122303],{},[22,122304,10363],{},[49,122306,122307,122309,122311,122313],{},[52,122308,10368],{},[52,122310,10371],{},[52,122312,10374],{},[52,122314,10377],{},[7759,122316,10380],{"id":10380},[13,122318,10383],{},[49,122320,122321,122325,122333,122337],{},[52,122322,122323,10391],{},[22,122324,10390],{},[52,122326,122327,10397,122329,10400,122331,10403],{},[22,122328,10396],{},[17,122330,9978],{},[17,122332,9984],{},[52,122334,122335,10409],{},[22,122336,10408],{},[52,122338,122339,10415],{},[22,122340,10414],{},[114,122342,122343],{"className":116,"code":10418,"language":118,"meta":119,"style":119},[17,122344,122345,122349,122353,122357,122361,122365,122369,122373,122377,122381,122385,122389,122393,122397,122401,122405,122409,122413,122417,122421,122425,122429,122433,122437,122441,122445,122449],{"__ignoreMap":119},[78,122346,122347],{"class":124,"line":125},[78,122348,8613],{},[78,122350,122351],{"class":124,"line":132},[78,122352,10429],{},[78,122354,122355],{"class":124,"line":138},[78,122356,10434],{},[78,122358,122359],{"class":124,"line":144},[78,122360,10439],{},[78,122362,122363],{"class":124,"line":150},[78,122364,10015],{},[78,122366,122367],{"class":124,"line":156},[78,122368,10010],{},[78,122370,122371],{"class":124,"line":162},[78,122372,129],{"emptyLinePlaceholder":128},[78,122374,122375],{"class":124,"line":168},[78,122376,10456],{},[78,122378,122379],{"class":124,"line":174},[78,122380,10461],{},[78,122382,122383],{"class":124,"line":180},[78,122384,10466],{},[78,122386,122387],{"class":124,"line":186},[78,122388,129],{"emptyLinePlaceholder":128},[78,122390,122391],{"class":124,"line":192},[78,122392,10475],{},[78,122394,122395],{"class":124,"line":198},[78,122396,10480],{},[78,122398,122399],{"class":124,"line":204},[78,122400,10485],{},[78,122402,122403],{"class":124,"line":210},[78,122404,10490],{},[78,122406,122407],{"class":124,"line":216},[78,122408,10495],{},[78,122410,122411],{"class":124,"line":222},[78,122412,10059],{},[78,122414,122415],{"class":124,"line":421},[78,122416,129],{"emptyLinePlaceholder":128},[78,122418,122419],{"class":124,"line":427},[78,122420,10508],{},[78,122422,122423],{"class":124,"line":433},[78,122424,10513],{},[78,122426,122427],{"class":124,"line":2443},[78,122428,10518],{},[78,122430,122431],{"class":124,"line":2448},[78,122432,129],{"emptyLinePlaceholder":128},[78,122434,122435],{"class":124,"line":2454},[78,122436,8627],{},[78,122438,122439],{"class":124,"line":2460},[78,122440,8703],{},[78,122442,122443],{"class":124,"line":2465},[78,122444,10535],{},[78,122446,122447],{"class":124,"line":2470},[78,122448,8708],{},[78,122450,122451],{"class":124,"line":2903},[78,122452,8041],{},[7759,122454,10546],{"id":10546},[10548,122456,10550],{"id":10550},[114,122458,122459],{"className":116,"code":10553,"language":118,"meta":119,"style":119},[17,122460,122461,122465,122469,122473,122477,122481,122485,122489,122493,122497,122501,122505,122509,122513],{"__ignoreMap":119},[78,122462,122463],{"class":124,"line":125},[78,122464,10560],{},[78,122466,122467],{"class":124,"line":132},[78,122468,10565],{},[78,122470,122471],{"class":124,"line":138},[78,122472,10570],{},[78,122474,122475],{"class":124,"line":144},[78,122476,10575],{},[78,122478,122479],{"class":124,"line":150},[78,122480,10580],{},[78,122482,122483],{"class":124,"line":156},[78,122484,10585],{},[78,122486,122487],{"class":124,"line":162},[78,122488,10590],{},[78,122490,122491],{"class":124,"line":168},[78,122492,10595],{},[78,122494,122495],{"class":124,"line":174},[78,122496,10600],{},[78,122498,122499],{"class":124,"line":180},[78,122500,10605],{},[78,122502,122503],{"class":124,"line":186},[78,122504,10610],{},[78,122506,122507],{"class":124,"line":192},[78,122508,10615],{},[78,122510,122511],{"class":124,"line":198},[78,122512,10620],{},[78,122514,122515],{"class":124,"line":204},[78,122516,10625],{},[10548,122518,10628],{"id":10628},[114,122520,122521],{"className":116,"code":10553,"language":118,"meta":119,"style":119},[17,122522,122523,122527,122531,122535,122539,122543,122547,122551,122555,122559,122563,122567,122571,122575],{"__ignoreMap":119},[78,122524,122525],{"class":124,"line":125},[78,122526,10560],{},[78,122528,122529],{"class":124,"line":132},[78,122530,10565],{},[78,122532,122533],{"class":124,"line":138},[78,122534,10570],{},[78,122536,122537],{"class":124,"line":144},[78,122538,10575],{},[78,122540,122541],{"class":124,"line":150},[78,122542,10580],{},[78,122544,122545],{"class":124,"line":156},[78,122546,10585],{},[78,122548,122549],{"class":124,"line":162},[78,122550,10590],{},[78,122552,122553],{"class":124,"line":168},[78,122554,10595],{},[78,122556,122557],{"class":124,"line":174},[78,122558,10600],{},[78,122560,122561],{"class":124,"line":180},[78,122562,10605],{},[78,122564,122565],{"class":124,"line":186},[78,122566,10610],{},[78,122568,122569],{"class":124,"line":192},[78,122570,10615],{},[78,122572,122573],{"class":124,"line":198},[78,122574,10620],{},[78,122576,122577],{"class":124,"line":204},[78,122578,10625],{},[226,122580,228],{},{"title":119,"searchDepth":144,"depth":144,"links":122582},[122583,122584,122592],{"id":9145,"depth":132,"text":9145},{"id":9231,"depth":132,"text":9232,"children":122585},[122586,122587,122588,122589,122590,122591],{"id":9235,"depth":144,"text":9235},{"id":9384,"depth":144,"text":9385},{"id":9483,"depth":144,"text":9484},{"id":9630,"depth":144,"text":9631},{"id":9747,"depth":144,"text":9362},{"id":9833,"depth":144,"text":9834},{"id":9954,"depth":132,"text":9955,"children":122593},[122594,122595,122596,122597,122598,122599],{"id":9961,"depth":144,"text":9962},{"id":10085,"depth":144,"text":10086},{"id":10169,"depth":144,"text":10170},{"id":10255,"depth":144,"text":10256},{"id":10380,"depth":144,"text":10380},{"id":10546,"depth":144,"text":10546},{},{"title":9137,"description":119},[794,9133,10715],{"id":10718,"title":10719,"assetBase":7,"author":8,"body":122604,"category":10943,"collection":233,"date":10944,"description":10945,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":122785,"navigation":128,"originalPath":239,"path":10947,"seo":122786,"source":243,"stem":10949,"tags":122787,"weight":250,"__hash__":10952},{"type":10,"value":122605,"toc":122782},[122606,122618,122630,122634,122646,122650,122662,122666,122684,122692,122694,122696,122780],[13,122607,1202,122608,10726,122610,10730,122612,10734,122614,10737,122616,10740],{},[17,122609,28],{},[17,122611,10729],{},[17,122613,10733],{},[17,122615,28],{},[17,122617,35],{},[13,122619,10743,122620,2500,122622,10748,122624,10752,122626,10756,122628,10759],{},[22,122621,1915],{},[17,122623,28],{},[22,122625,10751],{},[22,122627,10755],{},[17,122629,4398],{},[13,122631,122632],{},[22,122633,70],{},[72,122635,122636],{},[13,122637,122638,1645,122640,122642,1052,122644],{},[22,122639,1433],{},[17,122641,10772],{},[22,122643,1440],{},[17,122645,10777],{},[13,122647,122648],{},[22,122649,635],{},[72,122651,122652],{},[13,122653,122654,1645,122656,122658,1052,122660],{},[22,122655,1433],{},[78,122657,10790],{},[22,122659,1440],{},[78,122661,10795],{},[13,122663,122664],{},[22,122665,317],{},[49,122667,122668,122672,122676],{},[52,122669,122670],{},[17,122671,10806],{},[52,122673,122674],{},[17,122675,10811],{},[52,122677,826,122678,10816,122680,10819,122682,10822],{},[22,122679,1915],{},[17,122681,10733],{},[22,122683,10751],{},[13,122685,122686,10827,122688,10830,122690,10834],{},[22,122687,1711],{},[17,122689,4296],{},[22,122691,10833],{},[107,122693,109],{"id":109},[13,122695,112],{},[114,122697,122698],{"className":116,"code":10841,"language":118,"meta":119,"style":119},[17,122699,122700,122704,122708,122712,122716,122720,122724,122728,122732,122736,122740,122744,122748,122752,122756,122760,122764,122768,122772,122776],{"__ignoreMap":119},[78,122701,122702],{"class":124,"line":125},[78,122703,129],{"emptyLinePlaceholder":128},[78,122705,122706],{"class":124,"line":132},[78,122707,135],{},[78,122709,122710],{"class":124,"line":138},[78,122711,10856],{},[78,122713,122714],{"class":124,"line":144},[78,122715,10861],{},[78,122717,122718],{"class":124,"line":150},[78,122719,10866],{},[78,122721,122722],{"class":124,"line":156},[78,122723,10871],{},[78,122725,122726],{"class":124,"line":162},[78,122727,10876],{},[78,122729,122730],{"class":124,"line":168},[78,122731,10881],{},[78,122733,122734],{"class":124,"line":174},[78,122735,10886],{},[78,122737,122738],{"class":124,"line":180},[78,122739,10891],{},[78,122741,122742],{"class":124,"line":186},[78,122743,10896],{},[78,122745,122746],{"class":124,"line":192},[78,122747,10901],{},[78,122749,122750],{"class":124,"line":198},[78,122751,10906],{},[78,122753,122754],{"class":124,"line":204},[78,122755,10911],{},[78,122757,122758],{"class":124,"line":210},[78,122759,10916],{},[78,122761,122762],{"class":124,"line":216},[78,122763,10921],{},[78,122765,122766],{"class":124,"line":222},[78,122767,207],{},[78,122769,122770],{"class":124,"line":421},[78,122771,213],{},[78,122773,122774],{"class":124,"line":427},[78,122775,365],{},[78,122777,122778],{"class":124,"line":433},[78,122779,207],{},[226,122781,228],{},{"title":119,"searchDepth":144,"depth":144,"links":122783},[122784],{"id":109,"depth":132,"text":109},{},{"title":10719,"description":10945},[246,248,10951],{"id":10954,"title":10955,"assetBase":7,"author":8,"body":122789,"category":11176,"collection":233,"date":10944,"description":11177,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":122974,"navigation":128,"originalPath":239,"path":11179,"seo":122975,"source":243,"stem":11181,"tags":122976,"weight":250,"__hash__":11183},{"type":10,"value":122790,"toc":122971},[122791,122797,122809,122813,122825,122829,122841,122845,122863,122867,122877,122885,122887,122889,122969],[13,122792,1202,122793,10962,122795,10965],{},[17,122794,28],{},[17,122796,1025],{},[13,122798,10968,122799,10972,122801,10976,122803,996,122805,10982,122807,285],{},[17,122800,10971],{},[17,122802,10975],{},[17,122804,10979],{},[17,122806,1419],{},[17,122808,4593],{},[13,122810,122811],{},[22,122812,293],{},[72,122814,122815],{},[13,122816,122817,1645,122819,122821,1441,122823,11002],{},[22,122818,1040],{},[78,122820,10997],{},[22,122822,1047],{},[22,122824,1051],{},[13,122826,122827],{},[22,122828,306],{},[72,122830,122831],{},[13,122832,122833,1645,122835,122837,2542,122839,11020],{},[22,122834,1040],{},[78,122836,11015],{},[22,122838,1047],{},[22,122840,1051],{},[13,122842,122843],{},[22,122844,1265],{},[72,122846,122847],{},[13,122848,122849,1645,122851,122853,1441,122855,11038,122857,11041,122859,11044,122861,11048],{},[22,122850,1040],{},[78,122852,11033],{},[22,122854,1047],{},[22,122856,1051],{},[78,122858,469],{},[78,122860,1014],{},[78,122862,11047],{},[13,122864,122865],{},[22,122866,317],{},[49,122868,122869,122873],{},[52,122870,122871],{},[17,122872,11059],{},[52,122874,122875],{},[17,122876,11064],{},[13,122878,122879,11069,122881,11072,122883,4399],{},[22,122880,1711],{},[17,122882,4398],{},[17,122884,4296],{},[107,122886,109],{"id":109},[13,122888,112],{},[114,122890,122891],{"className":116,"code":11081,"language":118,"meta":119,"style":119},[17,122892,122893,122897,122901,122905,122909,122913,122917,122921,122925,122929,122933,122937,122941,122945,122949,122953,122957,122961,122965],{"__ignoreMap":119},[78,122894,122895],{"class":124,"line":125},[78,122896,129],{"emptyLinePlaceholder":128},[78,122898,122899],{"class":124,"line":132},[78,122900,135],{},[78,122902,122903],{"class":124,"line":138},[78,122904,11096],{},[78,122906,122907],{"class":124,"line":144},[78,122908,11101],{},[78,122910,122911],{"class":124,"line":150},[78,122912,11106],{},[78,122914,122915],{"class":124,"line":156},[78,122916,11111],{},[78,122918,122919],{"class":124,"line":162},[78,122920,11116],{},[78,122922,122923],{"class":124,"line":168},[78,122924,2640],{},[78,122926,122927],{"class":124,"line":174},[78,122928,11125],{},[78,122930,122931],{"class":124,"line":180},[78,122932,11130],{},[78,122934,122935],{"class":124,"line":186},[78,122936,11135],{},[78,122938,122939],{"class":124,"line":192},[78,122940,11140],{},[78,122942,122943],{"class":124,"line":198},[78,122944,699],{},[78,122946,122947],{"class":124,"line":204},[78,122948,11149],{},[78,122950,122951],{"class":124,"line":210},[78,122952,11154],{},[78,122954,122955],{"class":124,"line":216},[78,122956,207],{},[78,122958,122959],{"class":124,"line":222},[78,122960,213],{},[78,122962,122963],{"class":124,"line":421},[78,122964,1592],{},[78,122966,122967],{"class":124,"line":427},[78,122968,207],{},[226,122970,228],{},{"title":119,"searchDepth":144,"depth":144,"links":122972},[122973],{"id":109,"depth":132,"text":109},{},{"title":10955,"description":11177},[246,247,248],{"id":11185,"title":11186,"assetBase":7,"author":8,"body":122978,"category":11485,"collection":233,"date":11486,"description":11487,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":123217,"navigation":128,"originalPath":239,"path":11489,"seo":123218,"source":243,"stem":11491,"tags":123219,"weight":250,"__hash__":11493},{"type":10,"value":122979,"toc":123214},[122980,122990,123002,123020,123024,123038,123042,123056,123060,123074,123078,123088,123090,123092,123212],[13,122981,11191,122982,11195,122984,11198,122986,11201,122988,11205],{},[17,122983,11194],{},[17,122985,262],{},[17,122987,11194],{},[22,122989,11204],{},[49,122991,122992,122998],{},[52,122993,11210,122994,11213,122996,11216],{},[17,122995,469],{},[17,122997,262],{},[52,122999,11219,123000,11222],{},[17,123001,262],{},[13,123003,11225,123004,1052,123006,11231,123008,11234,123010,275,123012,11240,123014,11243,123016,11247,123018,11251],{},[17,123005,262],{},[22,123007,11230],{},[17,123009,11194],{},[17,123011,11237],{},[17,123013,11237],{},[17,123015,11194],{},[22,123017,11246],{},[22,123019,11250],{},[13,123021,123022],{},[22,123023,293],{},[72,123025,123026],{},[13,123027,123028,11262,123030,123032,11268,123034,123036,11274],{},[22,123029,1040],{},[78,123031,11265],{},[22,123033,1047],{},[78,123035,11271],{},[22,123037,1051],{},[13,123039,123040],{},[22,123041,306],{},[72,123043,123044],{},[13,123045,123046,11262,123048,123050,11290,123052,123054,11295],{},[22,123047,1040],{},[78,123049,11287],{},[22,123051,1047],{},[78,123053,11287],{},[22,123055,1051],{},[13,123057,123058],{},[22,123059,1265],{},[72,123061,123062],{},[13,123063,123064,11262,123066,123068,11311,123070,11315,123072,11318],{},[22,123065,1040],{},[78,123067,11308],{},[22,123069,1047],{},[78,123071,11314],{},[22,123073,1051],{},[13,123075,123076],{},[22,123077,317],{},[49,123079,123080,123084],{},[52,123081,123082],{},[17,123083,11329],{},[52,123085,123086,11335],{},[17,123087,11334],{},[107,123089,109],{"id":109},[13,123091,112],{},[114,123093,123094],{"className":116,"code":11342,"language":118,"meta":119,"style":119},[17,123095,123096,123100,123104,123108,123112,123116,123120,123124,123128,123132,123136,123140,123144,123148,123152,123156,123160,123164,123168,123172,123176,123180,123184,123188,123192,123196,123200,123204,123208],{"__ignoreMap":119},[78,123097,123098],{"class":124,"line":125},[78,123099,129],{"emptyLinePlaceholder":128},[78,123101,123102],{"class":124,"line":132},[78,123103,135],{},[78,123105,123106],{"class":124,"line":138},[78,123107,11357],{},[78,123109,123110],{"class":124,"line":144},[78,123111,11362],{},[78,123113,123114],{"class":124,"line":150},[78,123115,911],{},[78,123117,123118],{"class":124,"line":156},[78,123119,129],{"emptyLinePlaceholder":128},[78,123121,123122],{"class":124,"line":162},[78,123123,11375],{},[78,123125,123126],{"class":124,"line":168},[78,123127,11380],{},[78,123129,123130],{"class":124,"line":174},[78,123131,129],{"emptyLinePlaceholder":128},[78,123133,123134],{"class":124,"line":180},[78,123135,11389],{},[78,123137,123138],{"class":124,"line":186},[78,123139,11394],{},[78,123141,123142],{"class":124,"line":192},[78,123143,11399],{},[78,123145,123146],{"class":124,"line":198},[78,123147,11404],{},[78,123149,123150],{"class":124,"line":204},[78,123151,195],{},[78,123153,123154],{"class":124,"line":210},[78,123155,11413],{},[78,123157,123158],{"class":124,"line":216},[78,123159,11418],{},[78,123161,123162],{"class":124,"line":222},[78,123163,11423],{},[78,123165,123166],{"class":124,"line":421},[78,123167,1359],{},[78,123169,123170],{"class":124,"line":427},[78,123171,11432],{},[78,123173,123174],{"class":124,"line":433},[78,123175,11437],{},[78,123177,123178],{"class":124,"line":2443},[78,123179,11442],{},[78,123181,123182],{"class":124,"line":2448},[78,123183,11447],{},[78,123185,123186],{"class":124,"line":2454},[78,123187,11452],{},[78,123189,123190],{"class":124,"line":2460},[78,123191,1359],{},[78,123193,123194],{"class":124,"line":2465},[78,123195,11461],{},[78,123197,123198],{"class":124,"line":2470},[78,123199,207],{},[78,123201,123202],{"class":124,"line":2903},[78,123203,11470],{},[78,123205,123206],{"class":124,"line":2909},[78,123207,219],{},[78,123209,123210],{"class":124,"line":11477},[78,123211,207],{},[226,123213,228],{},{"title":119,"searchDepth":144,"depth":144,"links":123215},[123216],{"id":109,"depth":132,"text":109},{},{"title":11186,"description":11487},[246,451,450],{"id":11495,"title":11496,"assetBase":7,"author":8,"body":123221,"category":11668,"collection":233,"date":11669,"description":11670,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":123366,"navigation":128,"originalPath":239,"path":11672,"seo":123367,"source":243,"stem":11674,"tags":123368,"weight":250,"__hash__":11677},{"type":10,"value":123222,"toc":123363},[123223,123231,123237,123241,123245,123257,123261,123271,123275,123289,123291,123293,123361],[13,123224,11501,123225,11504,123227,11507,123229,285],{},[17,123226,19],{},[17,123228,28],{},[17,123230,5535],{},[13,123232,11512,123233,11518],{},[22,123234,11515,123235],{},[17,123236,5535],{},[13,123238,11521,123239,11525],{},[17,123240,11524],{},[13,123242,123243],{},[22,123244,293],{},[72,123246,123247],{},[13,123248,123249,1645,123251,11539,123253,11542,123255,11545],{},[22,123250,1040],{},[78,123252,11538],{},[22,123254,1047],{},[22,123256,1051],{},[13,123258,123259],{},[22,123260,306],{},[72,123262,123263],{},[13,123264,123265,1645,123267,11558,123269,11561],{},[22,123266,1040],{},[78,123268,11047],{},[22,123270,1047],{},[13,123272,123273],{},[22,123274,317],{},[49,123276,123277,123281,123285],{},[52,123278,123279],{},[17,123280,3650],{},[52,123282,123283],{},[17,123284,11576],{},[52,123286,123287],{},[17,123288,1706],{},[107,123290,109],{"id":109},[13,123292,112],{},[114,123294,123295],{"className":116,"code":11587,"language":118,"meta":119,"style":119},[17,123296,123297,123301,123305,123309,123313,123317,123321,123325,123329,123333,123337,123341,123345,123349,123353,123357],{"__ignoreMap":119},[78,123298,123299],{"class":124,"line":125},[78,123300,129],{"emptyLinePlaceholder":128},[78,123302,123303],{"class":124,"line":132},[78,123304,135],{},[78,123306,123307],{"class":124,"line":138},[78,123308,11602],{},[78,123310,123311],{"class":124,"line":144},[78,123312,11607],{},[78,123314,123315],{"class":124,"line":150},[78,123316,11612],{},[78,123318,123319],{"class":124,"line":156},[78,123320,129],{"emptyLinePlaceholder":128},[78,123322,123323],{"class":124,"line":162},[78,123324,11621],{},[78,123326,123327],{"class":124,"line":168},[78,123328,11626],{},[78,123330,123331],{"class":124,"line":174},[78,123332,11631],{},[78,123334,123335],{"class":124,"line":180},[78,123336,1359],{},[78,123338,123339],{"class":124,"line":186},[78,123340,11640],{},[78,123342,123343],{"class":124,"line":192},[78,123344,207],{},[78,123346,123347],{"class":124,"line":198},[78,123348,213],{},[78,123350,123351],{"class":124,"line":204},[78,123352,11653],{},[78,123354,123355],{"class":124,"line":210},[78,123356,11658],{},[78,123358,123359],{"class":124,"line":216},[78,123360,207],{},[226,123362,228],{},{"title":119,"searchDepth":144,"depth":144,"links":123364},[123365],{"id":109,"depth":132,"text":109},{},{"title":11496,"description":11670},[246,248,11676],{"id":11679,"title":11680,"assetBase":7,"author":8,"body":123370,"category":11903,"collection":233,"date":11904,"description":11905,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":123555,"navigation":128,"originalPath":239,"path":11907,"seo":123556,"source":243,"stem":11909,"tags":123557,"weight":250,"__hash__":11911},{"type":10,"value":123371,"toc":123552},[123372,123386,123390,123408,123412,123432,123436,123454,123456,123458,123550],[13,123373,11685,123374,11507,123376,11690,123378,11693,123380,11696,123382,285],{},[17,123375,28],{},[17,123377,5535],{},[17,123379,5535],{},[17,123381,2949],{},[596,123383,11699,123384,11702],{},[17,123385,469],{},[13,123387,123388],{},[22,123389,293],{},[72,123391,123392],{},[13,123393,123394,1645,123396,11716,123398,11719,123400,1052,123402,11730],{},[22,123395,1040],{},[78,123397,11715],{},[22,123399,1047],{},[22,123401,1051],{},[78,123403,11724,123404,11727,123406],{},[22,123405,469],{},[22,123407,469],{},[13,123409,123410],{},[22,123411,306],{},[72,123413,123414],{},[13,123415,123416,1645,123418,11744,123420,11747,123422,1052,123424,11761],{},[22,123417,1040],{},[78,123419,11743],{},[22,123421,1047],{},[22,123423,1051],{},[78,123425,11752,123426,2066,123428,11757,123430,11760],{},[22,123427,469],{},[22,123429,469],{},[22,123431,469],{},[13,123433,123434],{},[22,123435,317],{},[49,123437,123438,123442,123450],{},[52,123439,123440],{},[17,123441,11772],{},[52,123443,123444,2972,123446,11779,123448],{},[17,123445,35],{},[17,123447,2949],{},[17,123449,469],{},[52,123451,123452],{},[17,123453,11786],{},[107,123455,109],{"id":109},[13,123457,112],{},[114,123459,123460],{"className":116,"code":11793,"language":118,"meta":119,"style":119},[17,123461,123462,123466,123470,123474,123478,123482,123486,123490,123494,123498,123502,123506,123510,123514,123518,123522,123526,123530,123534,123538,123542,123546],{"__ignoreMap":119},[78,123463,123464],{"class":124,"line":125},[78,123465,129],{"emptyLinePlaceholder":128},[78,123467,123468],{"class":124,"line":132},[78,123469,135],{},[78,123471,123472],{"class":124,"line":138},[78,123473,11808],{},[78,123475,123476],{"class":124,"line":144},[78,123477,11813],{},[78,123479,123480],{"class":124,"line":150},[78,123481,11818],{},[78,123483,123484],{"class":124,"line":156},[78,123485,11823],{},[78,123487,123488],{"class":124,"line":162},[78,123489,11828],{},[78,123491,123492],{"class":124,"line":168},[78,123493,11833],{},[78,123495,123496],{"class":124,"line":174},[78,123497,11838],{},[78,123499,123500],{"class":124,"line":180},[78,123501,10916],{},[78,123503,123504],{"class":124,"line":186},[78,123505,11847],{},[78,123507,123508],{"class":124,"line":192},[78,123509,11852],{},[78,123511,123512],{"class":124,"line":198},[78,123513,11857],{},[78,123515,123516],{"class":124,"line":204},[78,123517,11862],{},[78,123519,123520],{"class":124,"line":210},[78,123521,11867],{},[78,123523,123524],{"class":124,"line":216},[78,123525,11872],{},[78,123527,123528],{"class":124,"line":222},[78,123529,11877],{},[78,123531,123532],{"class":124,"line":421},[78,123533,207],{},[78,123535,123536],{"class":124,"line":427},[78,123537,213],{},[78,123539,123540],{"class":124,"line":433},[78,123541,11653],{},[78,123543,123544],{"class":124,"line":2443},[78,123545,219],{},[78,123547,123548],{"class":124,"line":2448},[78,123549,207],{},[226,123551,228],{},{"title":119,"searchDepth":144,"depth":144,"links":123553},[123554],{"id":109,"depth":132,"text":109},{},{"title":11680,"description":11905},[246,11676,10951,248],{"id":11913,"title":11914,"assetBase":7,"author":8,"body":123559,"category":12121,"collection":233,"date":11904,"description":12122,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":123738,"navigation":128,"originalPath":239,"path":12124,"seo":123739,"source":243,"stem":12126,"tags":123740,"weight":250,"__hash__":12128},{"type":10,"value":123560,"toc":123735},[123561,123565,123567,123569,123573,123587,123591,123607,123611,123623,123627,123641,123643,123645,123733],[13,123562,11919,123563,11922],{},[17,123564,28],{},[13,123566,11925],{},[13,123568,11928],{},[13,123570,123571],{},[22,123572,11933],{},[72,123574,123575],{},[13,123576,123577,1645,123579,123581,1048,123583,11947,123585,11951],{},[22,123578,1040],{},[78,123580,11942],{},[22,123582,1047],{},[22,123584,1051],{},[78,123586,11950],{},[13,123588,123589],{},[22,123590,306],{},[72,123592,123593],{},[13,123594,123595,1645,123597,123599,3233,123601,11969,123603,11973,123605,285],{},[22,123596,1040],{},[78,123598,11964],{},[22,123600,1047],{},[22,123602,1051],{},[78,123604,11972],{},[78,123606,11976],{},[13,123608,123609],{},[22,123610,1265],{},[72,123612,123613],{},[13,123614,123615,1645,123617,123619,1071,123621,11993],{},[22,123616,1040],{},[78,123618,11950],{},[22,123620,1047],{},[22,123622,1051],{},[13,123624,123625],{},[22,123626,317],{},[49,123628,123629,123633],{},[52,123630,123631],{},[17,123632,11772],{},[52,123634,123635,12008,123637,12008,123639,285],{},[17,123636,35],{},[17,123638,2949],{},[17,123640,469],{},[107,123642,109],{"id":109},[13,123644,112],{},[114,123646,123647],{"className":116,"code":12019,"language":118,"meta":119,"style":119},[17,123648,123649,123653,123657,123661,123665,123669,123673,123677,123681,123685,123689,123693,123697,123701,123705,123709,123713,123717,123721,123725,123729],{"__ignoreMap":119},[78,123650,123651],{"class":124,"line":125},[78,123652,129],{"emptyLinePlaceholder":128},[78,123654,123655],{"class":124,"line":132},[78,123656,135],{},[78,123658,123659],{"class":124,"line":138},[78,123660,12034],{},[78,123662,123663],{"class":124,"line":144},[78,123664,11818],{},[78,123666,123667],{"class":124,"line":150},[78,123668,12043],{},[78,123670,123671],{"class":124,"line":156},[78,123672,11828],{},[78,123674,123675],{"class":124,"line":162},[78,123676,12052],{},[78,123678,123679],{"class":124,"line":168},[78,123680,12057],{},[78,123682,123683],{"class":124,"line":174},[78,123684,12062],{},[78,123686,123687],{"class":124,"line":180},[78,123688,11852],{},[78,123690,123691],{"class":124,"line":186},[78,123692,12071],{},[78,123694,123695],{"class":124,"line":192},[78,123696,11862],{},[78,123698,123699],{"class":124,"line":198},[78,123700,12080],{},[78,123702,123703],{"class":124,"line":204},[78,123704,11872],{},[78,123706,123707],{"class":124,"line":210},[78,123708,12089],{},[78,123710,123711],{"class":124,"line":216},[78,123712,12094],{},[78,123714,123715],{"class":124,"line":222},[78,123716,12099],{},[78,123718,123719],{"class":124,"line":421},[78,123720,207],{},[78,123722,123723],{"class":124,"line":427},[78,123724,213],{},[78,123726,123727],{"class":124,"line":433},[78,123728,219],{},[78,123730,123731],{"class":124,"line":2443},[78,123732,207],{},[226,123734,228],{},{"title":119,"searchDepth":144,"depth":144,"links":123736},[123737],{"id":109,"depth":132,"text":109},{},{"title":11914,"description":12122},[246,248,249,11676],{"id":12130,"title":12131,"assetBase":7,"author":8,"body":123742,"category":12349,"collection":233,"date":12350,"description":12351,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":123921,"navigation":128,"originalPath":239,"path":12353,"seo":123922,"source":243,"stem":12355,"tags":123923,"weight":250,"__hash__":12357},{"type":10,"value":123743,"toc":123918},[123744,123748,123752,123774,123776,123792,123796,123806,123810,123820,123824,123836,123840,123852,123854,123856,123916],[13,123745,12136,123746,11205],{},[22,123747,12139],{},[13,123749,12142,123750,12146],{},[22,123751,12145],{},[49,123753,123754,123762],{},[52,123755,2960,123756,12154,123758,12157,123760,12160],{},[17,123757,12153],{},[22,123759,12145],{},[22,123761,12145],{},[52,123763,2960,123764,12166,123766,12169,123768,12173,123770,12176,123772,12179],{},[17,123765,12165],{},[17,123767,5009],{},[17,123769,12172],{},[17,123771,12172],{},[17,123773,5009],{},[13,123775,12182],{},[13,123777,12185,123778,1018,123780,12190,123782,1018,123784,1052,123786,12197,123788,10982,123790,285],{},[17,123779,3175],{},[17,123781,3178],{},[17,123783,3175],{},[17,123785,3178],{},[22,123787,12139],{},[17,123789,1419],{},[17,123791,4593],{},[13,123793,123794],{},[22,123795,293],{},[72,123797,123798],{},[13,123799,123800,12212,123802,1441,123804,12217],{},[22,123801,1040],{},[22,123803,1047],{},[22,123805,1051],{},[13,123807,123808],{},[22,123809,306],{},[72,123811,123812],{},[13,123813,123814,12228,123816,2542,123818,12233],{},[22,123815,1040],{},[22,123817,1047],{},[22,123819,1051],{},[13,123821,123822],{},[22,123823,1265],{},[72,123825,123826],{},[13,123827,123828,12244,123830,1441,123832,12249,123834,12253],{},[22,123829,1040],{},[22,123831,1047],{},[22,123833,1051],{},[17,123835,12252],{},[13,123837,123838],{},[22,123839,317],{},[49,123841,123842,123846],{},[52,123843,123844],{},[17,123845,12264],{},[52,123847,123848,1018,123850,12271],{},[17,123849,3175],{},[17,123851,3178],{},[107,123853,109],{"id":109},[13,123855,112],{},[114,123857,123858],{"className":116,"code":12278,"language":118,"meta":119,"style":119},[17,123859,123860,123864,123868,123872,123876,123880,123884,123888,123892,123896,123900,123904,123908,123912],{"__ignoreMap":119},[78,123861,123862],{"class":124,"line":125},[78,123863,129],{"emptyLinePlaceholder":128},[78,123865,123866],{"class":124,"line":132},[78,123867,135],{},[78,123869,123870],{"class":124,"line":138},[78,123871,12293],{},[78,123873,123874],{"class":124,"line":144},[78,123875,12298],{},[78,123877,123878],{"class":124,"line":150},[78,123879,12303],{},[78,123881,123882],{"class":124,"line":156},[78,123883,12308],{},[78,123885,123886],{"class":124,"line":162},[78,123887,12313],{},[78,123889,123890],{"class":124,"line":168},[78,123891,12318],{},[78,123893,123894],{"class":124,"line":174},[78,123895,12323],{},[78,123897,123898],{"class":124,"line":180},[78,123899,207],{},[78,123901,123902],{"class":124,"line":186},[78,123903,3379],{},[78,123905,123906],{"class":124,"line":192},[78,123907,3384],{},[78,123909,123910],{"class":124,"line":198},[78,123911,1592],{},[78,123913,123914],{"class":124,"line":204},[78,123915,207],{},[226,123917,228],{},{"title":119,"searchDepth":144,"depth":144,"links":123919},[123920],{"id":109,"depth":132,"text":109},{},{"title":12131,"description":12351},[246,450,3759],{"id":12359,"title":12360,"assetBase":7,"author":8,"body":123925,"category":12567,"collection":233,"date":12350,"description":12568,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":124092,"navigation":128,"originalPath":239,"path":12570,"seo":124093,"source":243,"stem":12572,"tags":124094,"weight":250,"__hash__":12574},{"type":10,"value":123926,"toc":124089},[123927,123941,123943,123949,123969,123975,124005,124009,124023,124025,124027,124087],[13,123928,12365,123929,12368,123931,12372,123933,12375,123935,12379,123937,12383,123939,12387],{},[22,123930,2949],{},[17,123932,12371],{},[17,123934,2041],{},[17,123936,12378],{},[17,123938,12382],{},[17,123940,12386],{},[13,123942,12390],{},[13,123944,123945,123947],{},[22,123946,293],{},[617,123948],{"alt":619,"src":12397},[72,123950,123951,123963],{},[13,123952,123953,12404,123955,2066,123957,2070,123959,12413,123961,12416],{},[22,123954,1040],{},[78,123956,12407],{},[78,123958,12410],{},[22,123960,1047],{},[22,123962,1051],{},[49,123964,123965],{},[52,123966,12421,123967],{},[78,123968,12410],{},[13,123970,123971,123973],{},[22,123972,306],{},[617,123974],{"alt":619,"src":12430},[72,123976,123977,123991],{},[13,123978,123979,12437,123981,2066,123983,2066,123985,2070,123987,1048,123989,12450],{},[22,123980,1040],{},[78,123982,12440],{},[78,123984,12443],{},[78,123986,12443],{},[22,123988,1047],{},[22,123990,1051],{},[49,123992,123993,123997,124001],{},[52,123994,12455,123995],{},[78,123996,12458],{},[52,123998,12461,123999],{},[78,124000,12443],{},[52,124002,12466,124003],{},[78,124004,12443],{},[13,124006,124007],{},[22,124008,317],{},[49,124010,124011,124015,124019],{},[52,124012,124013],{},[17,124014,12479],{},[52,124016,124017],{},[17,124018,12484],{},[52,124020,124021],{},[17,124022,12489],{},[107,124024,109],{"id":109},[13,124026,112],{},[114,124028,124029],{"className":116,"code":12496,"language":118,"meta":119,"style":119},[17,124030,124031,124035,124039,124043,124047,124051,124055,124059,124063,124067,124071,124075,124079,124083],{"__ignoreMap":119},[78,124032,124033],{"class":124,"line":125},[78,124034,129],{"emptyLinePlaceholder":128},[78,124036,124037],{"class":124,"line":132},[78,124038,135],{},[78,124040,124041],{"class":124,"line":138},[78,124042,12511],{},[78,124044,124045],{"class":124,"line":144},[78,124046,12516],{},[78,124048,124049],{"class":124,"line":150},[78,124050,12521],{},[78,124052,124053],{"class":124,"line":156},[78,124054,12526],{},[78,124056,124057],{"class":124,"line":162},[78,124058,12531],{},[78,124060,124061],{"class":124,"line":168},[78,124062,12536],{},[78,124064,124065],{"class":124,"line":174},[78,124066,12541],{},[78,124068,124069],{"class":124,"line":180},[78,124070,436],{},[78,124072,124073],{"class":124,"line":186},[78,124074,207],{},[78,124076,124077],{"class":124,"line":192},[78,124078,2214],{},[78,124080,124081],{"class":124,"line":198},[78,124082,219],{},[78,124084,124085],{"class":124,"line":204},[78,124086,207],{},[226,124088,228],{},{"title":119,"searchDepth":144,"depth":144,"links":124090},[124091],{"id":109,"depth":132,"text":109},{},{"title":12360,"description":12568},[246,248,449,2236],{"id":12576,"title":12577,"assetBase":7,"author":8,"body":124096,"category":12817,"collection":233,"date":12350,"description":12818,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":124301,"navigation":128,"originalPath":239,"path":12820,"seo":124302,"source":243,"stem":12822,"tags":124303,"weight":250,"__hash__":12825},{"type":10,"value":124097,"toc":124298},[124098,124102,124104,124106,124110,124124,124128,124142,124146,124160,124164,124178,124182,124196,124198,124200,124296],[13,124099,12582,124100,12586],{},[17,124101,12585],{},[13,124103,12589],{},[13,124105,12592],{},[13,124107,124108],{},[22,124109,293],{},[72,124111,124112],{},[13,124113,124114,12603,124116,124118,124120,124122,12614],{},[22,124115,1040],{},[78,124117,12606],{},[22,124119,1047],{},[78,124121,12611],{},[22,124123,1051],{},[13,124125,124126],{},[22,124127,306],{},[72,124129,124130],{},[13,124131,124132,12603,124134,124136,124138,124140,12634],{},[22,124133,1040],{},[78,124135,12627],{},[22,124137,1047],{},[78,124139],{},[22,124141,1051],{},[13,124143,124144],{},[22,124145,1265],{},[72,124147,124148],{},[13,124149,124150,12603,124152,124154,124156,124158,12654],{},[22,124151,1040],{},[78,124153,12647],{},[22,124155,1047],{},[78,124157,11237],{},[22,124159,1051],{},[13,124161,124162],{},[22,124163,2313],{},[72,124165,124166],{},[13,124167,124168,12603,124170,124172,124174,124176,12675],{},[22,124169,1040],{},[78,124171,12667],{},[22,124173,1047],{},[78,124175,12672],{},[22,124177,1051],{},[13,124179,124180],{},[22,124181,317],{},[49,124183,124184,124188,124192],{},[52,124185,124186],{},[17,124187,12686],{},[52,124189,124190],{},[17,124191,12691],{},[52,124193,124194],{},[17,124195,12696],{},[107,124197,109],{"id":109},[13,124199,112],{},[114,124201,124202],{"className":116,"code":12703,"language":118,"meta":119,"style":119},[17,124203,124204,124208,124212,124216,124220,124224,124228,124232,124236,124240,124244,124248,124252,124256,124260,124264,124268,124272,124276,124280,124284,124288,124292],{"__ignoreMap":119},[78,124205,124206],{"class":124,"line":125},[78,124207,129],{"emptyLinePlaceholder":128},[78,124209,124210],{"class":124,"line":132},[78,124211,135],{},[78,124213,124214],{"class":124,"line":138},[78,124215,12718],{},[78,124217,124218],{"class":124,"line":144},[78,124219,12723],{},[78,124221,124222],{"class":124,"line":150},[78,124223,12728],{},[78,124225,124226],{"class":124,"line":156},[78,124227,12733],{},[78,124229,124230],{"class":124,"line":162},[78,124231,12738],{},[78,124233,124234],{"class":124,"line":168},[78,124235,12743],{},[78,124237,124238],{"class":124,"line":174},[78,124239,12748],{},[78,124241,124242],{"class":124,"line":180},[78,124243,12753],{},[78,124245,124246],{"class":124,"line":186},[78,124247,12758],{},[78,124249,124250],{"class":124,"line":192},[78,124251,12763],{},[78,124253,124254],{"class":124,"line":198},[78,124255,3111],{},[78,124257,124258],{"class":124,"line":204},[78,124259,12753],{},[78,124261,124262],{"class":124,"line":210},[78,124263,12763],{},[78,124265,124266],{"class":124,"line":216},[78,124267,10916],{},[78,124269,124270],{"class":124,"line":222},[78,124271,12784],{},[78,124273,124274],{"class":124,"line":421},[78,124275,12789],{},[78,124277,124278],{"class":124,"line":427},[78,124279,12794],{},[78,124281,124282],{"class":124,"line":433},[78,124283,207],{},[78,124285,124286],{"class":124,"line":2443},[78,124287,12803],{},[78,124289,124290],{"class":124,"line":2448},[78,124291,365],{},[78,124293,124294],{"class":124,"line":2454},[78,124295,207],{},[226,124297,228],{},{"title":119,"searchDepth":144,"depth":144,"links":124299},[124300],{"id":109,"depth":132,"text":109},{},{"title":12577,"description":12818},[246,12824,248],{"id":12827,"title":12828,"assetBase":7,"author":8,"body":124305,"category":13108,"collection":233,"date":13109,"description":13110,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":124532,"navigation":128,"originalPath":239,"path":13112,"seo":124533,"source":243,"stem":13114,"tags":124534,"weight":250,"__hash__":13117},{"type":10,"value":124306,"toc":124529},[124307,124325,124329,124341,124345,124357,124361,124373,124377,124387,124391,124415,124417,124419,124527],[13,124308,12833,124309,12837,124311,12841,124313,12844,124315,12847,124317,12850,124319,275,124321,12857,124323,67],{},[17,124310,12836],{},[17,124312,12840],{},[17,124314,5535],{},[17,124316,5535],{},[17,124318,5535],{},[17,124320,12853],{},[17,124322,12856],{},[17,124324,12860],{},[13,124326,124327],{},[22,124328,293],{},[72,124330,124331],{},[13,124332,124333,12871,124335,472,124337,12877,124339,12880],{},[22,124334,1040],{},[78,124336,5009],{},[78,124338,12876],{},[22,124340,1047],{},[13,124342,124343],{},[22,124344,306],{},[72,124346,124347],{},[13,124348,124349,12871,124351,12877,124355,12898],{},[22,124350,1040],{},[78,124352,12893,124353],{},[78,124354,7360],{},[22,124356,1047],{},[13,124358,124359],{},[22,124360,1265],{},[72,124362,124363],{},[13,124364,124365,12909,124367,1025,124369,12916,124371,12919],{},[22,124366,1040],{},[78,124368,12912],{},[78,124370,12915],{},[22,124372,1047],{},[13,124374,124375],{},[22,124376,2313],{},[72,124378,124379],{},[13,124380,124381,12930,124383,12933,124385,12936],{},[22,124382,1040],{},[78,124384,12915],{},[22,124386,1047],{},[13,124388,124389],{},[22,124390,317],{},[49,124392,124393,124397,124403,124409],{},[52,124394,124395],{},[17,124396,12947],{},[52,124398,124399,12952,124401,12956],{},[17,124400,262],{},[17,124402,12955],{},[52,124404,124405,12961,124407,12965],{},[17,124406,262],{},[22,124408,12964],{},[52,124410,124411,12970,124413],{},[17,124412,262],{},[17,124414,12973],{},[107,124416,109],{"id":109},[13,124418,112],{},[114,124420,124421],{"className":116,"code":12980,"language":118,"meta":119,"style":119},[17,124422,124423,124427,124431,124435,124439,124443,124447,124451,124455,124459,124463,124467,124471,124475,124479,124483,124487,124491,124495,124499,124503,124507,124511,124515,124519,124523],{"__ignoreMap":119},[78,124424,124425],{"class":124,"line":125},[78,124426,129],{"emptyLinePlaceholder":128},[78,124428,124429],{"class":124,"line":132},[78,124430,135],{},[78,124432,124433],{"class":124,"line":138},[78,124434,12995],{},[78,124436,124437],{"class":124,"line":144},[78,124438,12723],{},[78,124440,124441],{"class":124,"line":150},[78,124442,13004],{},[78,124444,124445],{"class":124,"line":156},[78,124446,13009],{},[78,124448,124449],{"class":124,"line":162},[78,124450,1359],{},[78,124452,124453],{"class":124,"line":168},[78,124454,13018],{},[78,124456,124457],{"class":124,"line":174},[78,124458,13023],{},[78,124460,124461],{"class":124,"line":180},[78,124462,13028],{},[78,124464,124465],{"class":124,"line":186},[78,124466,13033],{},[78,124468,124469],{"class":124,"line":192},[78,124470,13038],{},[78,124472,124473],{"class":124,"line":198},[78,124474,13043],{},[78,124476,124477],{"class":124,"line":204},[78,124478,13048],{},[78,124480,124481],{"class":124,"line":210},[78,124482,13053],{},[78,124484,124485],{"class":124,"line":216},[78,124486,13058],{},[78,124488,124489],{"class":124,"line":222},[78,124490,13063],{},[78,124492,124493],{"class":124,"line":421},[78,124494,13068],{},[78,124496,124497],{"class":124,"line":427},[78,124498,13073],{},[78,124500,124501],{"class":124,"line":433},[78,124502,699],{},[78,124504,124505],{"class":124,"line":2443},[78,124506,13082],{},[78,124508,124509],{"class":124,"line":2448},[78,124510,10610],{},[78,124512,124513],{"class":124,"line":2454},[78,124514,207],{},[78,124516,124517],{"class":124,"line":2460},[78,124518,360],{},[78,124520,124521],{"class":124,"line":2465},[78,124522,2906],{},[78,124524,124525],{"class":124,"line":2470},[78,124526,207],{},[226,124528,228],{},{"title":119,"searchDepth":144,"depth":144,"links":124530},[124531],{"id":109,"depth":132,"text":109},{},{"title":12828,"description":13110},[246,12824,13116,450],{"id":13119,"title":13120,"assetBase":7,"author":8,"body":124536,"category":13394,"collection":233,"date":13395,"description":13396,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":124755,"navigation":128,"originalPath":239,"path":13398,"seo":124756,"source":243,"stem":13400,"tags":124757,"weight":250,"__hash__":13402},{"type":10,"value":124537,"toc":124752},[124538,124542,124552,124554,124560,124566,124578,124584,124596,124600,124614,124616,124618,124750],[13,124539,13125,124540,13129],{},[17,124541,13128],{},[13,124543,124544,13135,124546,3774,124548,13142,124550,13146],{},[22,124545,13134],{},[22,124547,13138],{},[22,124549,13141],{},[22,124551,13145],{},[13,124553,13149],{},[13,124555,13152,124556,13155,124558,13158],{},[17,124557,4296],{},[17,124559,4398],{},[13,124561,124562,124564],{},[22,124563,70],{},[617,124565],{"alt":619,"src":13165},[72,124567,124568],{},[13,124569,124570,13172,124572,124574,1052,124576],{},[22,124571,1433],{},[78,124573,10997],{},[22,124575,1440],{},[78,124577,13179],{},[13,124579,124580,124582],{},[22,124581,635],{},[617,124583],{"alt":619,"src":13186},[72,124585,124586],{},[13,124587,124588,13172,124590,124592,1052,124594],{},[22,124589,1433],{},[78,124591,13195],{},[22,124593,1440],{},[78,124595,13200],{},[13,124597,124598],{},[22,124599,88],{},[49,124601,124602,124606,124610],{},[52,124603,124604,13212],{},[17,124605,13211],{},[52,124607,124608],{},[17,124609,13217],{},[52,124611,124612],{},[17,124613,13222],{},[107,124615,109],{"id":109},[13,124617,112],{},[114,124619,124620],{"className":116,"code":13229,"language":118,"meta":119,"style":119},[17,124621,124622,124626,124630,124634,124638,124642,124646,124650,124654,124658,124662,124666,124670,124674,124678,124682,124686,124690,124694,124698,124702,124706,124710,124714,124718,124722,124726,124730,124734,124738,124742,124746],{"__ignoreMap":119},[78,124623,124624],{"class":124,"line":125},[78,124625,129],{"emptyLinePlaceholder":128},[78,124627,124628],{"class":124,"line":132},[78,124629,13240],{},[78,124631,124632],{"class":124,"line":138},[78,124633,13245],{},[78,124635,124636],{"class":124,"line":144},[78,124637,13250],{},[78,124639,124640],{"class":124,"line":150},[78,124641,13255],{},[78,124643,124644],{"class":124,"line":156},[78,124645,13260],{},[78,124647,124648],{"class":124,"line":162},[78,124649,135],{},[78,124651,124652],{"class":124,"line":168},[78,124653,13269],{},[78,124655,124656],{"class":124,"line":174},[78,124657,13274],{},[78,124659,124660],{"class":124,"line":180},[78,124661,13279],{},[78,124663,124664],{"class":124,"line":186},[78,124665,1359],{},[78,124667,124668],{"class":124,"line":192},[78,124669,13288],{},[78,124671,124672],{"class":124,"line":198},[78,124673,13293],{},[78,124675,124676],{"class":124,"line":204},[78,124677,13298],{},[78,124679,124680],{"class":124,"line":210},[78,124681,13303],{},[78,124683,124684],{"class":124,"line":216},[78,124685,13308],{},[78,124687,124688],{"class":124,"line":222},[78,124689,13313],{},[78,124691,124692],{"class":124,"line":421},[78,124693,13318],{},[78,124695,124696],{"class":124,"line":427},[78,124697,13323],{},[78,124699,124700],{"class":124,"line":433},[78,124701,13328],{},[78,124703,124704],{"class":124,"line":2443},[78,124705,699],{},[78,124707,124708],{"class":124,"line":2448},[78,124709,13337],{},[78,124711,124712],{"class":124,"line":2454},[78,124713,13342],{},[78,124715,124716],{"class":124,"line":2460},[78,124717,13347],{},[78,124719,124720],{"class":124,"line":2465},[78,124721,13352],{},[78,124723,124724],{"class":124,"line":2470},[78,124725,13357],{},[78,124727,124728],{"class":124,"line":2903},[78,124729,13362],{},[78,124731,124732],{"class":124,"line":2909},[78,124733,13367],{},[78,124735,124736],{"class":124,"line":11477},[78,124737,207],{},[78,124739,124740],{"class":124,"line":13374},[78,124741,13377],{},[78,124743,124744],{"class":124,"line":13380},[78,124745,13383],{},[78,124747,124748],{"class":124,"line":13386},[78,124749,207],{},[226,124751,228],{},{"title":119,"searchDepth":144,"depth":144,"links":124753},[124754],{"id":109,"depth":132,"text":109},{},{"title":13120,"description":13396},[246,13394],{"id":13404,"title":13405,"assetBase":7,"author":8,"body":124759,"category":13735,"collection":233,"date":13395,"description":13736,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":125028,"navigation":128,"originalPath":239,"path":13738,"seo":125029,"source":243,"stem":13740,"tags":125030,"weight":250,"__hash__":13742},{"type":10,"value":124760,"toc":125025},[124761,124779,124795,124799,124805,124811,124823,124829,124847,124853,124865,124873,124879,124881,124883,125023],[13,124762,13410,124763,13413,124765,3848,124767,13418,124769,20,124771,13424,124773,13427,124775,13430,124777,13434],{},[17,124764,19],{},[17,124766,19],{},[22,124768,13145],{},[17,124770,13421],{},[17,124772,39],{},[17,124774,39],{},[22,124776,2949],{},[17,124778,13433],{},[49,124780,124781],{},[52,124782,13439,124783,13443,124785,13446,124787,13449,124789,13446,124791,13454,124793,13457],{},[17,124784,13442],{},[17,124786,2949],{},[17,124788,1025],{},[17,124790,469],{},[17,124792,472],{},[17,124794,13442],{},[13,124796,124797,13463],{},[22,124798,13462],{},[13,124800,13466,124801,13469,124803,285],{},[17,124802,13128],{},[22,124804,13472],{},[13,124806,124807,124809],{},[22,124808,293],{},[617,124810],{"alt":619,"src":13479},[72,124812,124813],{},[13,124814,124815,13172,124817,124819,11719,124821,13493],{},[22,124816,1040],{},[78,124818,13488],{},[22,124820,1047],{},[22,124822,1051],{},[13,124824,124825,124827],{},[22,124826,306],{},[617,124828],{"alt":619,"src":13500},[72,124830,124831,124841],{},[13,124832,124833,13172,124835,124837,2073,124839,13514],{},[22,124834,1040],{},[78,124836,13509],{},[22,124838,1047],{},[22,124840,1051],{},[49,124842,124843,124845],{},[52,124844,13519],{},[52,124846,13522],{},[13,124848,124849,124851],{},[22,124850,1265],{},[617,124852],{"alt":619,"src":13529},[72,124854,124855],{},[13,124856,124857,13172,124859,124861,13541,124863,13544],{},[22,124858,1040],{},[78,124860,13538],{},[22,124862,1047],{},[22,124864,1051],{},[13,124866,124867,13549,124869,13553,124871,285],{},[22,124868,317],{},[17,124870,13552],{},[22,124872,13145],{},[49,124874,124875],{},[52,124876,124877],{},[17,124878,13562],{},[107,124880,109],{"id":109},[13,124882,112],{},[114,124884,124885],{"className":116,"code":13569,"language":118,"meta":119,"style":119},[17,124886,124887,124891,124895,124899,124903,124907,124911,124915,124919,124923,124927,124931,124935,124939,124943,124947,124951,124955,124959,124963,124967,124971,124975,124979,124983,124987,124991,124995,124999,125003,125007,125011,125015,125019],{"__ignoreMap":119},[78,124888,124889],{"class":124,"line":125},[78,124890,129],{"emptyLinePlaceholder":128},[78,124892,124893],{"class":124,"line":132},[78,124894,13240],{},[78,124896,124897],{"class":124,"line":138},[78,124898,13245],{},[78,124900,124901],{"class":124,"line":144},[78,124902,13250],{},[78,124904,124905],{"class":124,"line":150},[78,124906,13255],{},[78,124908,124909],{"class":124,"line":156},[78,124910,13260],{},[78,124912,124913],{"class":124,"line":162},[78,124914,135],{},[78,124916,124917],{"class":124,"line":168},[78,124918,13604],{},[78,124920,124921],{"class":124,"line":174},[78,124922,13609],{},[78,124924,124925],{"class":124,"line":180},[78,124926,13614],{},[78,124928,124929],{"class":124,"line":186},[78,124930,13619],{},[78,124932,124933],{"class":124,"line":192},[78,124934,13624],{},[78,124936,124937],{"class":124,"line":198},[78,124938,13629],{},[78,124940,124941],{"class":124,"line":204},[78,124942,129],{"emptyLinePlaceholder":128},[78,124944,124945],{"class":124,"line":210},[78,124946,13638],{},[78,124948,124949],{"class":124,"line":216},[78,124950,13643],{},[78,124952,124953],{"class":124,"line":222},[78,124954,13648],{},[78,124956,124957],{"class":124,"line":421},[78,124958,13653],{},[78,124960,124961],{"class":124,"line":427},[78,124962,13658],{},[78,124964,124965],{"class":124,"line":433},[78,124966,13663],{},[78,124968,124969],{"class":124,"line":2443},[78,124970,13668],{},[78,124972,124973],{"class":124,"line":2448},[78,124974,13673],{},[78,124976,124977],{"class":124,"line":2454},[78,124978,129],{"emptyLinePlaceholder":128},[78,124980,124981],{"class":124,"line":2460},[78,124982,13682],{},[78,124984,124985],{"class":124,"line":2465},[78,124986,13687],{},[78,124988,124989],{"class":124,"line":2470},[78,124990,13692],{},[78,124992,124993],{"class":124,"line":2903},[78,124994,13697],{},[78,124996,124997],{"class":124,"line":2909},[78,124998,13352],{},[78,125000,125001],{"class":124,"line":11477},[78,125002,13706],{},[78,125004,125005],{"class":124,"line":13374},[78,125006,13711],{},[78,125008,125009],{"class":124,"line":13380},[78,125010,207],{},[78,125012,125013],{"class":124,"line":13386},[78,125014,13377],{},[78,125016,125017],{"class":124,"line":13722},[78,125018,219],{},[78,125020,125021],{"class":124,"line":13727},[78,125022,207],{},[226,125024,228],{},{"title":119,"searchDepth":144,"depth":144,"links":125026},[125027],{"id":109,"depth":132,"text":109},{},{"title":13405,"description":13736},[246,13394,451],{"id":13744,"title":13745,"assetBase":239,"author":8,"body":125032,"category":787,"collection":233,"date":13395,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":125661,"navigation":128,"originalPath":239,"path":14537,"seo":125662,"source":243,"stem":14539,"tags":125663,"weight":250,"__hash__":14543},{"type":10,"value":125033,"toc":125646},[125034,125036,125038,125040,125052,125054,125056,125058,125060,125216,125218,125220,125222,125226,125228,125234,125250,125252,125254,125322,125324,125396,125398,125400,125402,125406,125408,125410,125412,125520,125522,125524,125534,125536,125538,125542,125550,125552,125558,125560,125572,125574,125576,125644],[4517,125035,13745],{"id":13750},[107,125037,13754],{"id":13753},[13,125039,13757],{},[49,125041,125042,125044,125046,125048,125050],{},[52,125043,13762],{},[52,125045,13765],{},[52,125047,13768],{},[52,125049,13771],{},[52,125051,13774],{},[13,125053,13777],{},[7759,125055,13780],{"id":13780},[10548,125057,13784],{"id":13783},[13,125059,13787],{},[114,125061,125062],{"className":116,"code":13790,"language":118,"meta":119,"style":119},[17,125063,125064,125068,125072,125076,125080,125084,125088,125092,125096,125100,125104,125108,125112,125116,125120,125124,125128,125132,125136,125140,125144,125148,125152,125156,125160,125164,125168,125172,125176,125180,125184,125188,125192,125196,125200,125204,125208,125212],{"__ignoreMap":119},[78,125065,125066],{"class":124,"line":125},[78,125067,10015],{},[78,125069,125070],{"class":124,"line":132},[78,125071,13801],{},[78,125073,125074],{"class":124,"line":138},[78,125075,8613],{},[78,125077,125078],{"class":124,"line":144},[78,125079,129],{"emptyLinePlaceholder":128},[78,125081,125082],{"class":124,"line":150},[78,125083,13814],{},[78,125085,125086],{"class":124,"line":156},[78,125087,13819],{},[78,125089,125090],{"class":124,"line":162},[78,125091,13824],{},[78,125093,125094],{"class":124,"line":168},[78,125095,6433],{},[78,125097,125098],{"class":124,"line":174},[78,125099,13833],{},[78,125101,125102],{"class":124,"line":180},[78,125103,129],{"emptyLinePlaceholder":128},[78,125105,125106],{"class":124,"line":186},[78,125107,13842],{},[78,125109,125110],{"class":124,"line":192},[78,125111,13847],{},[78,125113,125114],{"class":124,"line":198},[78,125115,13852],{},[78,125117,125118],{"class":124,"line":204},[78,125119,129],{"emptyLinePlaceholder":128},[78,125121,125122],{"class":124,"line":210},[78,125123,13861],{},[78,125125,125126],{"class":124,"line":216},[78,125127,13866],{},[78,125129,125130],{"class":124,"line":222},[78,125131,13871],{},[78,125133,125134],{"class":124,"line":421},[78,125135,13876],{},[78,125137,125138],{"class":124,"line":427},[78,125139,129],{"emptyLinePlaceholder":128},[78,125141,125142],{"class":124,"line":433},[78,125143,13885],{},[78,125145,125146],{"class":124,"line":2443},[78,125147,13890],{},[78,125149,125150],{"class":124,"line":2448},[78,125151,13895],{},[78,125153,125154],{"class":124,"line":2454},[78,125155,13900],{},[78,125157,125158],{"class":124,"line":2460},[78,125159,13905],{},[78,125161,125162],{"class":124,"line":2465},[78,125163,13910],{},[78,125165,125166],{"class":124,"line":2470},[78,125167,13915],{},[78,125169,125170],{"class":124,"line":2903},[78,125171,13920],{},[78,125173,125174],{"class":124,"line":2909},[78,125175,13925],{},[78,125177,125178],{"class":124,"line":11477},[78,125179,9912],{},[78,125181,125182],{"class":124,"line":13374},[78,125183,10315],{},[78,125185,125186],{"class":124,"line":13380},[78,125187,129],{"emptyLinePlaceholder":128},[78,125189,125190],{"class":124,"line":13386},[78,125191,13942],{},[78,125193,125194],{"class":124,"line":13722},[78,125195,8627],{},[78,125197,125198],{"class":124,"line":13727},[78,125199,8703],{},[78,125201,125202],{"class":124,"line":13953},[78,125203,8713],{},[78,125205,125206],{"class":124,"line":13958},[78,125207,13961],{},[78,125209,125210],{"class":124,"line":13964},[78,125211,8971],{},[78,125213,125214],{"class":124,"line":13969},[78,125215,8041],{},[10548,125217,13975],{"id":13974},[13,125219,13978],{},[13,125221,13981],{},[13,125223,125224,13987],{},[22,125225,13986],{},[107,125227,13991],{"id":13990},[13,125229,13994,125230,13997,125232,14001],{},[17,125231,8922],{},[17,125233,14000],{},[2285,125235,125236,125240,125244],{},[52,125237,125238,14009],{},[22,125239,14008],{},[52,125241,125242,14014],{},[22,125243,8421],{},[52,125245,125246,14020,125248],{},[22,125247,14019],{},[17,125249,14023],{},[7759,125251,14026],{"id":14026},[13,125253,14029],{},[114,125255,125256],{"className":116,"code":14032,"language":118,"meta":119,"style":119},[17,125257,125258,125262,125266,125270,125274,125278,125282,125286,125290,125294,125298,125302,125306,125310,125314,125318],{"__ignoreMap":119},[78,125259,125260],{"class":124,"line":125},[78,125261,14039],{},[78,125263,125264],{"class":124,"line":132},[78,125265,8613],{},[78,125267,125268],{"class":124,"line":138},[78,125269,129],{"emptyLinePlaceholder":128},[78,125271,125272],{"class":124,"line":144},[78,125273,14052],{},[78,125275,125276],{"class":124,"line":150},[78,125277,14057],{},[78,125279,125280],{"class":124,"line":156},[78,125281,14062],{},[78,125283,125284],{"class":124,"line":162},[78,125285,1359],{},[78,125287,125288],{"class":124,"line":168},[78,125289,8627],{},[78,125291,125292],{"class":124,"line":174},[78,125293,14075],{},[78,125295,125296],{"class":124,"line":180},[78,125297,9198],{},[78,125299,125300],{"class":124,"line":186},[78,125301,14084],{},[78,125303,125304],{"class":124,"line":192},[78,125305,8041],{},[78,125307,125308],{"class":124,"line":198},[78,125309,14093],{},[78,125311,125312],{"class":124,"line":204},[78,125313,14098],{},[78,125315,125316],{"class":124,"line":210},[78,125317,14103],{},[78,125319,125320],{"class":124,"line":216},[78,125321,8041],{},[13,125323,14110],{},[114,125325,125326],{"className":116,"code":14113,"language":118,"meta":119,"style":119},[17,125327,125328,125332,125336,125340,125344,125348,125352,125356,125360,125364,125368,125372,125376,125380,125384,125388,125392],{"__ignoreMap":119},[78,125329,125330],{"class":124,"line":125},[78,125331,14039],{},[78,125333,125334],{"class":124,"line":132},[78,125335,14124],{},[78,125337,125338],{"class":124,"line":138},[78,125339,129],{"emptyLinePlaceholder":128},[78,125341,125342],{"class":124,"line":144},[78,125343,14052],{},[78,125345,125346],{"class":124,"line":150},[78,125347,14057],{},[78,125349,125350],{"class":124,"line":156},[78,125351,14141],{},[78,125353,125354],{"class":124,"line":162},[78,125355,129],{"emptyLinePlaceholder":128},[78,125357,125358],{"class":124,"line":168},[78,125359,8488],{},[78,125361,125362],{"class":124,"line":174},[78,125363,14154],{},[78,125365,125366],{"class":124,"line":180},[78,125367,14159],{},[78,125369,125370],{"class":124,"line":186},[78,125371,14164],{},[78,125373,125374],{"class":124,"line":192},[78,125375,129],{"emptyLinePlaceholder":128},[78,125377,125378],{"class":124,"line":198},[78,125379,14173],{},[78,125381,125382],{"class":124,"line":204},[78,125383,14178],{},[78,125385,125386],{"class":124,"line":210},[78,125387,14183],{},[78,125389,125390],{"class":124,"line":216},[78,125391,14188],{},[78,125393,125394],{"class":124,"line":222},[78,125395,14193],{},[13,125397,14196],{},[13,125399,14199],{},[107,125401,14203],{"id":14202},[13,125403,14206,125404,14210],{},[22,125405,14209],{},[7759,125407,14213],{"id":14213},[13,125409,14216],{},[13,125411,14219],{},[114,125413,125414],{"className":116,"code":14222,"language":118,"meta":119,"style":119},[17,125415,125416,125420,125424,125428,125432,125436,125440,125444,125448,125452,125456,125460,125464,125468,125472,125476,125480,125484,125488,125492,125496,125500,125504,125508,125512,125516],{"__ignoreMap":119},[78,125417,125418],{"class":124,"line":125},[78,125419,14229],{},[78,125421,125422],{"class":124,"line":132},[78,125423,129],{"emptyLinePlaceholder":128},[78,125425,125426],{"class":124,"line":138},[78,125427,14238],{},[78,125429,125430],{"class":124,"line":144},[78,125431,14243],{},[78,125433,125434],{"class":124,"line":150},[78,125435,14248],{},[78,125437,125438],{"class":124,"line":156},[78,125439,129],{"emptyLinePlaceholder":128},[78,125441,125442],{"class":124,"line":162},[78,125443,14257],{},[78,125445,125446],{"class":124,"line":168},[78,125447,14262],{},[78,125449,125450],{"class":124,"line":174},[78,125451,129],{"emptyLinePlaceholder":128},[78,125453,125454],{"class":124,"line":180},[78,125455,14271],{},[78,125457,125458],{"class":124,"line":186},[78,125459,14276],{},[78,125461,125462],{"class":124,"line":192},[78,125463,14281],{},[78,125465,125466],{"class":124,"line":198},[78,125467,14286],{},[78,125469,125470],{"class":124,"line":204},[78,125471,14291],{},[78,125473,125474],{"class":124,"line":210},[78,125475,14296],{},[78,125477,125478],{"class":124,"line":216},[78,125479,14301],{},[78,125481,125482],{"class":124,"line":222},[78,125483,8041],{},[78,125485,125486],{"class":124,"line":421},[78,125487,129],{"emptyLinePlaceholder":128},[78,125489,125490],{"class":124,"line":427},[78,125491,14314],{},[78,125493,125494],{"class":124,"line":433},[78,125495,14319],{},[78,125497,125498],{"class":124,"line":2443},[78,125499,14324],{},[78,125501,125502],{"class":124,"line":2448},[78,125503,14329],{},[78,125505,125506],{"class":124,"line":2454},[78,125507,14334],{},[78,125509,125510],{"class":124,"line":2460},[78,125511,14339],{},[78,125513,125514],{"class":124,"line":2465},[78,125515,14344],{},[78,125517,125518],{"class":124,"line":2470},[78,125519,8041],{},[107,125521,14352],{"id":14351},[13,125523,14355],{},[49,125525,125526,125530],{},[52,125527,125528,14363],{},[22,125529,14362],{},[52,125531,125532,14369],{},[22,125533,14368],{},[13,125535,14372],{},[7759,125537,14375],{"id":14375},[13,125539,125540,14381],{},[22,125541,14380],{},[49,125543,125544,125548],{},[52,125545,14386,125546,14389],{},[22,125547,9943],{},[52,125549,14392],{},[13,125551,14395],{},[13,125553,125554,14401,125556,14405],{},[22,125555,14400],{},[22,125557,14404],{},[13,125559,14408],{},[114,125561,125562],{"className":14411,"code":14412,"language":14413,"meta":119,"style":119},[17,125563,125564,125568],{"__ignoreMap":119},[78,125565,125566],{"class":124,"line":125},[78,125567,14420],{},[78,125569,125570],{"class":124,"line":132},[78,125571,14425],{},[13,125573,14428],{},[7759,125575,14432],{"id":14431},[8366,125577,125578,125594],{},[8369,125579,125580],{},[8372,125581,125582,125584,125586,125588,125590,125592],{},[8375,125583,14441],{"align":9247},[8375,125585,9251],{"align":9247},[8375,125587,14446],{"align":9247},[8375,125589,14449],{"align":9247},[8375,125591,14452],{"align":9247},[8375,125593,14455],{"align":9247},[8386,125595,125596,125612,125628],{},[8372,125597,125598,125602,125604,125606,125608,125610],{},[8391,125599,125600],{"align":9247},[22,125601,14464],{},[8391,125603,14467],{"align":9247},[8391,125605,14470],{"align":9247},[8391,125607,14473],{"align":9247},[8391,125609,14476],{"align":9247},[8391,125611,14479],{"align":9247},[8372,125613,125614,125618,125620,125622,125624,125626],{},[8391,125615,125616],{"align":9247},[22,125617,14486],{},[8391,125619,14489],{"align":9247},[8391,125621,14473],{"align":9247},[8391,125623,14470],{"align":9247},[8391,125625,14496],{"align":9247},[8391,125627,14499],{"align":9247},[8372,125629,125630,125634,125636,125638,125640,125642],{},[8391,125631,125632],{"align":9247},[22,125633,14506],{},[8391,125635,14509],{"align":9247},[8391,125637,236],{"align":9247},[8391,125639,236],{"align":9247},[8391,125641,14496],{"align":9247},[8391,125643,14518],{"align":9247},[226,125645,228],{},{"title":119,"searchDepth":144,"depth":144,"links":125647},[125648,125651,125654,125657],{"id":13753,"depth":132,"text":13754,"children":125649},[125650],{"id":13780,"depth":144,"text":13780},{"id":13990,"depth":132,"text":13991,"children":125652},[125653],{"id":14026,"depth":144,"text":14026},{"id":14202,"depth":132,"text":14203,"children":125655},[125656],{"id":14213,"depth":144,"text":14213},{"id":14351,"depth":132,"text":14352,"children":125658},[125659,125660],{"id":14375,"depth":144,"text":14375},{"id":14431,"depth":144,"text":14432},{},{"title":13745,"description":119},[794,14541,9133,7744,10715,6380,14542],{"id":14545,"title":14546,"assetBase":239,"author":8,"body":125665,"category":787,"collection":233,"date":14962,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":125963,"navigation":128,"originalPath":239,"path":14964,"seo":125964,"source":243,"stem":14966,"tags":125965,"weight":250,"__hash__":14969},{"type":10,"value":125666,"toc":125949},[125667,125669,125671,125675,125677,125679,125763,125765,125767,125769,125773,125775,125777,125781,125783,125843,125845,125847,125849,125851,125853,125859,125865,125871,125873,125877,125881,125883,125889,125899,125901,125903,125905,125907,125913,125915,125917,125919,125933,125937,125939,125941,125945,125947],[4517,125668,14552],{"id":14551},[107,125670,14555],{"id":14555},[13,125672,14558,125673],{},[22,125674,14561],{},[13,125676,14564],{},[13,125678,14567],{},[8366,125680,125681,125701],{},[8369,125682,125683],{},[8372,125684,125685,125689,125693,125697],{},[8375,125686,125687],{"align":9247},[22,125688,14578],{},[8375,125690,125691],{"align":9247},[22,125692,14583],{},[8375,125694,125695],{"align":9247},[22,125696,14588],{},[8375,125698,125699],{"align":9247},[22,125700,14593],{},[8386,125702,125703,125715,125727,125739,125751],{},[8372,125704,125705,125709,125711,125713],{},[8391,125706,125707],{"align":9247},[22,125708,14602],{},[8391,125710,14605],{"align":9247},[8391,125712,14608],{"align":9247},[8391,125714,14611],{"align":9247},[8372,125716,125717,125721,125723,125725],{},[8391,125718,125719],{"align":9247},[22,125720,14618],{},[8391,125722,14621],{"align":9247},[8391,125724,14624],{"align":9247},[8391,125726,14627],{"align":9247},[8372,125728,125729,125733,125735,125737],{},[8391,125730,125731],{"align":9247},[22,125732,14634],{},[8391,125734,14637],{"align":9247},[8391,125736,14640],{"align":9247},[8391,125738,14643],{"align":9247},[8372,125740,125741,125745,125747,125749],{},[8391,125742,125743],{"align":9247},[22,125744,14650],{},[8391,125746,14653],{"align":9247},[8391,125748,14656],{"align":9247},[8391,125750,14659],{"align":9247},[8372,125752,125753,125757,125759,125761],{},[8391,125754,125755],{"align":9247},[22,125756,14666],{},[8391,125758,14669],{"align":9247},[8391,125760,14672],{"align":9247},[8391,125762,14675],{"align":9247},[13,125764,14678],{},[107,125766,14682],{"id":14681},[13,125768,14685],{},[13,125770,14688,125771,67],{},[22,125772,14691],{},[13,125774,14694],{},[13,125776,14697],{},[13,125778,125779,14703],{},[22,125780,14702],{},[13,125782,14706],{},[8366,125784,125785,125805],{},[8369,125786,125787],{},[8372,125788,125789,125793,125797,125801],{},[8375,125790,125791],{"align":9247},[22,125792,14717],{},[8375,125794,125795],{"align":9247},[22,125796,14722],{},[8375,125798,125799],{"align":9247},[22,125800,14727],{},[8375,125802,125803],{"align":9247},[22,125804,14732],{},[8386,125806,125807,125819,125831],{},[8372,125808,125809,125813,125815,125817],{},[8391,125810,125811],{"align":9247},[22,125812,14741],{},[8391,125814,14744],{"align":9247},[8391,125816,14747],{"align":9247},[8391,125818,14750],{"align":9247},[8372,125820,125821,125825,125827,125829],{},[8391,125822,125823],{"align":9247},[22,125824,14757],{},[8391,125826,14760],{"align":9247},[8391,125828,14763],{"align":9247},[8391,125830,14766],{"align":9247},[8372,125832,125833,125837,125839,125841],{},[8391,125834,125835],{"align":9247},[22,125836,14773],{},[8391,125838,14776],{"align":9247},[8391,125840,14779],{"align":9247},[8391,125842,14782],{"align":9247},[13,125844,14785],{},[107,125846,14789],{"id":14788},[13,125848,14792],{},[13,125850,14795],{},[7759,125852,14799],{"id":14798},[13,125854,14802,125855,1018,125857,14807],{},[17,125856,9978],{},[17,125858,9984],{},[13,125860,125861,14812,125863,14815],{},[17,125862,9978],{},[17,125864,9978],{},[13,125866,125867,14820,125869,14823],{},[17,125868,9984],{},[17,125870,9984],{},[7759,125872,14827],{"id":14826},[13,125874,14830,125875,14834],{},[17,125876,14833],{},[13,125878,14837,125879,14840],{},[17,125880,14833],{},[7759,125882,14844],{"id":14843},[13,125884,125885,1018,125887,14851],{},[17,125886,10096],{},[17,125888,10102],{},[13,125890,14854,125891,1018,125893,14859,125895,14863,125897,14867],{},[17,125892,10096],{},[17,125894,10102],{},[17,125896,14862],{},[17,125898,14866],{},[107,125900,14871],{"id":14870},[13,125902,14874],{},[7759,125904,14878],{"id":14877},[13,125906,14881],{},[13,125908,14884,125909,275,125911,14891],{},[17,125910,14887],{},[17,125912,14890],{},[7759,125914,14894],{"id":14894},[13,125916,14897],{},[13,125918,14900],{},[2285,125920,125921,125925,125929],{},[52,125922,125923,14908],{},[22,125924,14907],{},[52,125926,125927,14914],{},[22,125928,14913],{},[52,125930,125931,14920],{},[22,125932,14919],{},[13,125934,14923,125935,14927],{},[22,125936,14926],{},[107,125938,14931],{"id":14930},[13,125940,14934],{},[13,125942,14937,125943,14941],{},[22,125944,14940],{},[13,125946,14944],{},[13,125948,14947],{},{"title":119,"searchDepth":144,"depth":144,"links":125950},[125951,125952,125953,125958,125962],{"id":14555,"depth":132,"text":14555},{"id":14681,"depth":132,"text":14682},{"id":14788,"depth":132,"text":14789,"children":125954},[125955,125956,125957],{"id":14798,"depth":144,"text":14799},{"id":14826,"depth":144,"text":14827},{"id":14843,"depth":144,"text":14844},{"id":14870,"depth":132,"text":14871,"children":125959},[125960,125961],{"id":14877,"depth":144,"text":14878},{"id":14894,"depth":144,"text":14894},{"id":14930,"depth":132,"text":14931},{},{"title":14546,"description":119},[794,14541,9133,14968,7744,10715,6380],{"id":14971,"title":14972,"assetBase":239,"author":8,"body":125967,"category":787,"collection":233,"date":15959,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":126754,"navigation":128,"originalPath":239,"path":15961,"seo":126755,"source":243,"stem":15963,"tags":126756,"weight":250,"__hash__":15965},{"type":10,"value":125968,"toc":126729},[125969,125971,125973,125985,125987,125989,125999,126031,126033,126077,126079,126081,126097,126149,126153,126159,126161,126173,126175,126183,126185,126191,126195,126207,126209,126253,126255,126299,126301,126315,126317,126389,126391,126393,126453,126455,126459,126465,126541,126543,126545,126547,126591,126593,126665,126667,126727],[107,125970,14977],{"id":14977},[7759,125972,14980],{"id":14980},[114,125974,125975],{"className":116,"code":14983,"language":118,"meta":119,"style":119},[17,125976,125977,125981],{"__ignoreMap":119},[78,125978,125979],{"class":124,"line":125},[78,125980,14990],{},[78,125982,125983],{"class":124,"line":132},[78,125984,14995],{},[7759,125986,14999],{"id":14998},[13,125988,15002],{},[72,125990,125991,125993,125995,125997],{},[13,125992,15007],{},[13,125994,15010],{},[13,125996,15013],{},[13,125998,15016],{},[114,126000,126001],{"className":116,"code":15019,"language":118,"meta":119,"style":119},[17,126002,126003,126007,126011,126015,126019,126023,126027],{"__ignoreMap":119},[78,126004,126005],{"class":124,"line":125},[78,126006,15026],{},[78,126008,126009],{"class":124,"line":132},[78,126010,15031],{},[78,126012,126013],{"class":124,"line":138},[78,126014,15036],{},[78,126016,126017],{"class":124,"line":144},[78,126018,129],{"emptyLinePlaceholder":128},[78,126020,126021],{"class":124,"line":150},[78,126022,15045],{},[78,126024,126025],{"class":124,"line":156},[78,126026,15050],{},[78,126028,126029],{"class":124,"line":162},[78,126030,15055],{},[7759,126032,15058],{"id":15058},[114,126034,126035],{"className":116,"code":15061,"language":118,"meta":119,"style":119},[17,126036,126037,126041,126045,126049,126053,126057,126061,126065,126069,126073],{"__ignoreMap":119},[78,126038,126039],{"class":124,"line":125},[78,126040,15068],{},[78,126042,126043],{"class":124,"line":132},[78,126044,15073],{},[78,126046,126047],{"class":124,"line":138},[78,126048,129],{"emptyLinePlaceholder":128},[78,126050,126051],{"class":124,"line":144},[78,126052,15082],{},[78,126054,126055],{"class":124,"line":150},[78,126056,15087],{},[78,126058,126059],{"class":124,"line":156},[78,126060,15092],{},[78,126062,126063],{"class":124,"line":162},[78,126064,129],{"emptyLinePlaceholder":128},[78,126066,126067],{"class":124,"line":168},[78,126068,15101],{},[78,126070,126071],{"class":124,"line":174},[78,126072,15106],{},[78,126074,126075],{"class":124,"line":180},[78,126076,15111],{},[107,126078,15114],{"id":15114},[7759,126080,15117],{"id":15117},[72,126082,126083,126087],{},[13,126084,126085],{},[78,126086,15124],{},[49,126088,126089,126091,126093,126095],{},[52,126090,15129],{},[52,126092,15132],{},[52,126094,15135],{},[52,126096,15138],{},[114,126098,126099],{"className":116,"code":15141,"language":118,"meta":119,"style":119},[17,126100,126101,126105,126109,126113,126117,126121,126125,126129,126133,126137,126141,126145],{"__ignoreMap":119},[78,126102,126103],{"class":124,"line":125},[78,126104,15148],{},[78,126106,126107],{"class":124,"line":132},[78,126108,15153],{},[78,126110,126111],{"class":124,"line":138},[78,126112,15158],{},[78,126114,126115],{"class":124,"line":144},[78,126116,129],{"emptyLinePlaceholder":128},[78,126118,126119],{"class":124,"line":150},[78,126120,15167],{},[78,126122,126123],{"class":124,"line":156},[78,126124,15172],{},[78,126126,126127],{"class":124,"line":162},[78,126128,15177],{},[78,126130,126131],{"class":124,"line":168},[78,126132,15182],{},[78,126134,126135],{"class":124,"line":174},[78,126136,15187],{},[78,126138,126139],{"class":124,"line":180},[78,126140,129],{"emptyLinePlaceholder":128},[78,126142,126143],{"class":124,"line":186},[78,126144,15196],{},[78,126146,126147],{"class":124,"line":192},[78,126148,15201],{},[13,126150,126151],{},[22,126152,15206],{},[13,126154,15209,126155,15213,126157,15217],{},[78,126156,15212],{},[78,126158,15216],{},[7759,126160,15221],{"id":15220},[72,126162,126163,126165],{},[13,126164,15226],{},[49,126166,126167,126169,126171],{},[52,126168,15231],{},[52,126170,15234],{},[52,126172,15237],{},[13,126174,15240],{},[114,126176,126177],{"className":116,"code":15243,"language":118,"meta":119,"style":119},[17,126178,126179],{"__ignoreMap":119},[78,126180,126181],{"class":124,"line":125},[78,126182,15243],{},[7759,126184,450],{"id":450},[13,126186,126187,15257,126189,15261],{},[17,126188,15256],{},[78,126190,15260],{},[13,126192,15264,126193,15268],{},[17,126194,15267],{},[114,126196,126197],{"className":116,"code":15271,"language":118,"meta":119,"style":119},[17,126198,126199,126203],{"__ignoreMap":119},[78,126200,126201],{"class":124,"line":125},[78,126202,15278],{},[78,126204,126205],{"class":124,"line":132},[78,126206,15283],{},[7759,126208,15287],{"id":15286},[114,126210,126211],{"className":116,"code":15290,"language":118,"meta":119,"style":119},[17,126212,126213,126217,126221,126225,126229,126233,126237,126241,126245,126249],{"__ignoreMap":119},[78,126214,126215],{"class":124,"line":125},[78,126216,15297],{},[78,126218,126219],{"class":124,"line":132},[78,126220,129],{"emptyLinePlaceholder":128},[78,126222,126223],{"class":124,"line":138},[78,126224,15306],{},[78,126226,126227],{"class":124,"line":144},[78,126228,15311],{},[78,126230,126231],{"class":124,"line":150},[78,126232,15316],{},[78,126234,126235],{"class":124,"line":156},[78,126236,15321],{},[78,126238,126239],{"class":124,"line":162},[78,126240,15326],{},[78,126242,126243],{"class":124,"line":168},[78,126244,15331],{},[78,126246,126247],{"class":124,"line":174},[78,126248,15336],{},[78,126250,126251],{"class":124,"line":180},[78,126252,15341],{},[7759,126254,15345],{"id":15344},[114,126256,126257],{"className":116,"code":15348,"language":118,"meta":119,"style":119},[17,126258,126259,126263,126267,126271,126275,126279,126283,126287,126291,126295],{"__ignoreMap":119},[78,126260,126261],{"class":124,"line":125},[78,126262,15355],{},[78,126264,126265],{"class":124,"line":132},[78,126266,15360],{},[78,126268,126269],{"class":124,"line":138},[78,126270,15365],{},[78,126272,126273],{"class":124,"line":144},[78,126274,15370],{},[78,126276,126277],{"class":124,"line":150},[78,126278,15375],{},[78,126280,126281],{"class":124,"line":156},[78,126282,15380],{},[78,126284,126285],{"class":124,"line":162},[78,126286,15385],{},[78,126288,126289],{"class":124,"line":168},[78,126290,15390],{},[78,126292,126293],{"class":124,"line":174},[78,126294,15395],{},[78,126296,126297],{"class":124,"line":180},[78,126298,15400],{},[7759,126300,15403],{"id":15403},[49,126302,126303,126305,126309,126311],{},[52,126304,15408],{},[52,126306,15411,126307,15415],{},[78,126308,15414],{},[52,126310,15418],{},[52,126312,15421,126313,15424],{},[78,126314,15212],{},[7759,126316,15428],{"id":15427},[114,126318,126319],{"className":116,"code":15431,"language":118,"meta":119,"style":119},[17,126320,126321,126325,126329,126333,126337,126341,126345,126349,126353,126357,126361,126365,126369,126373,126377,126381,126385],{"__ignoreMap":119},[78,126322,126323],{"class":124,"line":125},[78,126324,15438],{},[78,126326,126327],{"class":124,"line":132},[78,126328,129],{"emptyLinePlaceholder":128},[78,126330,126331],{"class":124,"line":138},[78,126332,15447],{},[78,126334,126335],{"class":124,"line":144},[78,126336,15452],{},[78,126338,126339],{"class":124,"line":150},[78,126340,15457],{},[78,126342,126343],{"class":124,"line":156},[78,126344,129],{"emptyLinePlaceholder":128},[78,126346,126347],{"class":124,"line":162},[78,126348,15466],{},[78,126350,126351],{"class":124,"line":168},[78,126352,15471],{},[78,126354,126355],{"class":124,"line":174},[78,126356,15476],{},[78,126358,126359],{"class":124,"line":180},[78,126360,129],{"emptyLinePlaceholder":128},[78,126362,126363],{"class":124,"line":186},[78,126364,15485],{},[78,126366,126367],{"class":124,"line":192},[78,126368,15490],{},[78,126370,126371],{"class":124,"line":198},[78,126372,15476],{},[78,126374,126375],{"class":124,"line":204},[78,126376,129],{"emptyLinePlaceholder":128},[78,126378,126379],{"class":124,"line":210},[78,126380,15503],{},[78,126382,126383],{"class":124,"line":216},[78,126384,15508],{},[78,126386,126387],{"class":124,"line":222},[78,126388,15513],{},[107,126390,15516],{"id":15516},[7759,126392,15520],{"id":15519},[114,126394,126395],{"className":116,"code":15523,"language":118,"meta":119,"style":119},[17,126396,126397,126401,126405,126409,126413,126417,126421,126425,126429,126433,126437,126441,126445,126449],{"__ignoreMap":119},[78,126398,126399],{"class":124,"line":125},[78,126400,15530],{},[78,126402,126403],{"class":124,"line":132},[78,126404,129],{"emptyLinePlaceholder":128},[78,126406,126407],{"class":124,"line":138},[78,126408,15539],{},[78,126410,126411],{"class":124,"line":144},[78,126412,15544],{},[78,126414,126415],{"class":124,"line":150},[78,126416,15549],{},[78,126418,126419],{"class":124,"line":156},[78,126420,129],{"emptyLinePlaceholder":128},[78,126422,126423],{"class":124,"line":162},[78,126424,15558],{},[78,126426,126427],{"class":124,"line":168},[78,126428,15563],{},[78,126430,126431],{"class":124,"line":174},[78,126432,15568],{},[78,126434,126435],{"class":124,"line":180},[78,126436,129],{"emptyLinePlaceholder":128},[78,126438,126439],{"class":124,"line":186},[78,126440,15558],{},[78,126442,126443],{"class":124,"line":192},[78,126444,15581],{},[78,126446,126447],{"class":124,"line":198},[78,126448,15586],{},[78,126450,126451],{"class":124,"line":204},[78,126452,15591],{},[7759,126454,15594],{"id":15594},[13,126456,126457],{},[17,126458,15599],{},[49,126460,126461,126463],{},[52,126462,15604],{},[52,126464,15607],{},[114,126466,126467],{"className":116,"code":15610,"language":118,"meta":119,"style":119},[17,126468,126469,126473,126477,126481,126485,126489,126493,126497,126501,126505,126509,126513,126517,126521,126525,126529,126533,126537],{"__ignoreMap":119},[78,126470,126471],{"class":124,"line":125},[78,126472,15617],{},[78,126474,126475],{"class":124,"line":132},[78,126476,15622],{},[78,126478,126479],{"class":124,"line":138},[78,126480,15627],{},[78,126482,126483],{"class":124,"line":144},[78,126484,129],{"emptyLinePlaceholder":128},[78,126486,126487],{"class":124,"line":150},[78,126488,15636],{},[78,126490,126491],{"class":124,"line":156},[78,126492,15641],{},[78,126494,126495],{"class":124,"line":162},[78,126496,15646],{},[78,126498,126499],{"class":124,"line":168},[78,126500,15651],{},[78,126502,126503],{"class":124,"line":174},[78,126504,129],{"emptyLinePlaceholder":128},[78,126506,126507],{"class":124,"line":180},[78,126508,15660],{},[78,126510,126511],{"class":124,"line":186},[78,126512,15665],{},[78,126514,126515],{"class":124,"line":192},[78,126516,129],{"emptyLinePlaceholder":128},[78,126518,126519],{"class":124,"line":198},[78,126520,15674],{},[78,126522,126523],{"class":124,"line":204},[78,126524,15679],{},[78,126526,126527],{"class":124,"line":210},[78,126528,15684],{},[78,126530,126531],{"class":124,"line":216},[78,126532,129],{"emptyLinePlaceholder":128},[78,126534,126535],{"class":124,"line":222},[78,126536,15693],{},[78,126538,126539],{"class":124,"line":421},[78,126540,15698],{},[107,126542,15701],{"id":15701},[7759,126544,15705],{"id":15704},[13,126546,15708],{},[114,126548,126549],{"className":116,"code":15711,"language":118,"meta":119,"style":119},[17,126550,126551,126555,126559,126563,126567,126571,126575,126579,126583,126587],{"__ignoreMap":119},[78,126552,126553],{"class":124,"line":125},[78,126554,15718],{},[78,126556,126557],{"class":124,"line":132},[78,126558,15723],{},[78,126560,126561],{"class":124,"line":138},[78,126562,15728],{},[78,126564,126565],{"class":124,"line":144},[78,126566,129],{"emptyLinePlaceholder":128},[78,126568,126569],{"class":124,"line":150},[78,126570,15737],{},[78,126572,126573],{"class":124,"line":156},[78,126574,15742],{},[78,126576,126577],{"class":124,"line":162},[78,126578,15747],{},[78,126580,126581],{"class":124,"line":168},[78,126582,15752],{},[78,126584,126585],{"class":124,"line":174},[78,126586,15757],{},[78,126588,126589],{"class":124,"line":180},[78,126590,15762],{},[7759,126592,15765],{"id":15765},[114,126594,126595],{"className":116,"code":15768,"language":118,"meta":119,"style":119},[17,126596,126597,126601,126605,126609,126613,126617,126621,126625,126629,126633,126637,126641,126645,126649,126653,126657,126661],{"__ignoreMap":119},[78,126598,126599],{"class":124,"line":125},[78,126600,15775],{},[78,126602,126603],{"class":124,"line":132},[78,126604,15780],{},[78,126606,126607],{"class":124,"line":138},[78,126608,15785],{},[78,126610,126611],{"class":124,"line":144},[78,126612,15790],{},[78,126614,126615],{"class":124,"line":150},[78,126616,15795],{},[78,126618,126619],{"class":124,"line":156},[78,126620,15800],{},[78,126622,126623],{"class":124,"line":162},[78,126624,15805],{},[78,126626,126627],{"class":124,"line":168},[78,126628,15810],{},[78,126630,126631],{"class":124,"line":174},[78,126632,6942],{},[78,126634,126635],{"class":124,"line":180},[78,126636,15819],{},[78,126638,126639],{"class":124,"line":186},[78,126640,15824],{},[78,126642,126643],{"class":124,"line":192},[78,126644,15829],{},[78,126646,126647],{"class":124,"line":198},[78,126648,15834],{},[78,126650,126651],{"class":124,"line":204},[78,126652,15839],{},[78,126654,126655],{"class":124,"line":210},[78,126656,15844],{},[78,126658,126659],{"class":124,"line":216},[78,126660,15849],{},[78,126662,126663],{"class":124,"line":222},[78,126664,15854],{},[7759,126666,15857],{"id":15857},[114,126668,126669],{"className":116,"code":15860,"language":118,"meta":119,"style":119},[17,126670,126671,126675,126679,126683,126687,126691,126695,126699,126703,126707,126711,126715,126719,126723],{"__ignoreMap":119},[78,126672,126673],{"class":124,"line":125},[78,126674,15867],{},[78,126676,126677],{"class":124,"line":132},[78,126678,15872],{},[78,126680,126681],{"class":124,"line":138},[78,126682,15877],{},[78,126684,126685],{"class":124,"line":144},[78,126686,15882],{},[78,126688,126689],{"class":124,"line":150},[78,126690,6942],{},[78,126692,126693],{"class":124,"line":156},[78,126694,15891],{},[78,126696,126697],{"class":124,"line":162},[78,126698,15896],{},[78,126700,126701],{"class":124,"line":168},[78,126702,15901],{},[78,126704,126705],{"class":124,"line":174},[78,126706,15906],{},[78,126708,126709],{"class":124,"line":180},[78,126710,15911],{},[78,126712,126713],{"class":124,"line":186},[78,126714,15916],{},[78,126716,126717],{"class":124,"line":192},[78,126718,15921],{},[78,126720,126721],{"class":124,"line":198},[78,126722,15926],{},[78,126724,126725],{"class":124,"line":204},[78,126726,15931],{},[226,126728,228],{},{"title":119,"searchDepth":144,"depth":144,"links":126730},[126731,126736,126745,126749],{"id":14977,"depth":132,"text":14977,"children":126732},[126733,126734,126735],{"id":14980,"depth":144,"text":14980},{"id":14998,"depth":144,"text":14999},{"id":15058,"depth":144,"text":15058},{"id":15114,"depth":132,"text":15114,"children":126737},[126738,126739,126740,126741,126742,126743,126744],{"id":15117,"depth":144,"text":15117},{"id":15220,"depth":144,"text":15221},{"id":450,"depth":144,"text":450},{"id":15286,"depth":144,"text":15287},{"id":15344,"depth":144,"text":15345},{"id":15403,"depth":144,"text":15403},{"id":15427,"depth":144,"text":15428},{"id":15516,"depth":132,"text":15516,"children":126746},[126747,126748],{"id":15519,"depth":144,"text":15520},{"id":15594,"depth":144,"text":15594},{"id":15701,"depth":132,"text":15701,"children":126750},[126751,126752,126753],{"id":15704,"depth":144,"text":15705},{"id":15765,"depth":144,"text":15765},{"id":15857,"depth":144,"text":15857},{},{"title":14972,"description":119},[246],{"id":15967,"title":15968,"assetBase":7,"author":8,"body":126758,"category":16218,"collection":233,"date":16219,"description":16220,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":126961,"navigation":128,"originalPath":239,"path":16222,"seo":126962,"source":243,"stem":16224,"tags":126963,"weight":250,"__hash__":16228},{"type":10,"value":126759,"toc":126958},[126760,126764,126768,126782,126786,126790,126800,126804,126808,126818,126822,126832,126834,126836,126956],[13,126761,15973,126762,285],{},[22,126763,15976],{},[13,126765,126766],{},[617,126767],{"alt":619,"src":15981},[13,126769,15984,126770,15988,126772,15992,126774,1018,126776,15999,126778,16002,126780,285],{},[17,126771,15987],{},[596,126773,15991],{},[17,126775,15995],{},[17,126777,15998],{},[17,126779,1419],{},[17,126781,4593],{},[13,126783,126784],{},[22,126785,293],{},[13,126787,126788],{},[617,126789],{"alt":619,"src":16013},[13,126791,126792,16018,126794,16022,126796,126798,16028],{},[22,126793,1040],{},[78,126795,16021],{},[78,126797,16025],{},[22,126799,1047],{},[13,126801,126802],{},[22,126803,306],{},[13,126805,126806],{},[617,126807],{"alt":619,"src":16037},[13,126809,126810,16018,126812,16022,126814,126816,1481],{},[22,126811,1040],{},[78,126813,4074],{},[78,126815,4079],{},[22,126817,1047],{},[13,126819,126820],{},[22,126821,317],{},[49,126823,126824,126828],{},[52,126825,16056,126826,16060],{},[17,126827,16059],{},[52,126829,16063,126830,16060],{},[17,126831,16066],{},[107,126833,109],{"id":109},[13,126835,112],{},[114,126837,126838],{"className":116,"code":16073,"language":118,"meta":119,"style":119},[17,126839,126840,126844,126848,126852,126856,126860,126864,126868,126872,126876,126880,126884,126888,126892,126896,126900,126904,126908,126912,126916,126920,126924,126928,126932,126936,126940,126944,126948,126952],{"__ignoreMap":119},[78,126841,126842],{"class":124,"line":125},[78,126843,129],{"emptyLinePlaceholder":128},[78,126845,126846],{"class":124,"line":132},[78,126847,16084],{},[78,126849,126850],{"class":124,"line":138},[78,126851,16089],{},[78,126853,126854],{"class":124,"line":144},[78,126855,16094],{},[78,126857,126858],{"class":124,"line":150},[78,126859,13255],{},[78,126861,126862],{"class":124,"line":156},[78,126863,16103],{},[78,126865,126866],{"class":124,"line":162},[78,126867,16108],{},[78,126869,126870],{"class":124,"line":168},[78,126871,135],{},[78,126873,126874],{"class":124,"line":174},[78,126875,16117],{},[78,126877,126878],{"class":124,"line":180},[78,126879,16122],{},[78,126881,126882],{"class":124,"line":186},[78,126883,16127],{},[78,126885,126886],{"class":124,"line":192},[78,126887,16132],{},[78,126889,126890],{"class":124,"line":198},[78,126891,16137],{},[78,126893,126894],{"class":124,"line":204},[78,126895,16142],{},[78,126897,126898],{"class":124,"line":210},[78,126899,16147],{},[78,126901,126902],{"class":124,"line":216},[78,126903,16152],{},[78,126905,126906],{"class":124,"line":222},[78,126907,16157],{},[78,126909,126910],{"class":124,"line":421},[78,126911,1359],{},[78,126913,126914],{"class":124,"line":427},[78,126915,16166],{},[78,126917,126918],{"class":124,"line":433},[78,126919,16171],{},[78,126921,126922],{"class":124,"line":2443},[78,126923,16176],{},[78,126925,126926],{"class":124,"line":2448},[78,126927,16181],{},[78,126929,126930],{"class":124,"line":2454},[78,126931,129],{"emptyLinePlaceholder":128},[78,126933,126934],{"class":124,"line":2460},[78,126935,16190],{},[78,126937,126938],{"class":124,"line":2465},[78,126939,207],{},[78,126941,126942],{"class":124,"line":2470},[78,126943,16199],{},[78,126945,126946],{"class":124,"line":2903},[78,126947,16204],{},[78,126949,126950],{"class":124,"line":2909},[78,126951,1592],{},[78,126953,126954],{"class":124,"line":11477},[78,126955,207],{},[226,126957,228],{},{"title":119,"searchDepth":144,"depth":144,"links":126959},[126960],{"id":109,"depth":132,"text":109},{},{"title":15968,"description":16220},[246,16226,16227],{"id":16230,"title":16231,"assetBase":7,"author":8,"body":126965,"category":16218,"collection":233,"date":16219,"description":16459,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":127156,"navigation":128,"originalPath":239,"path":16461,"seo":127157,"source":243,"stem":16463,"tags":127158,"weight":250,"__hash__":16465},{"type":10,"value":126966,"toc":127153},[126967,126979,126983,126987,126999,127003,127013,127017,127031,127033,127035,127151],[13,126968,16236,126969,16240,126971,16244,126973,20,126975,16250,126977,16253],{},[17,126970,16239],{},[17,126972,16243],{},[17,126974,16243],{},[22,126976,16249],{},[22,126978,16249],{},[13,126980,126981],{},[22,126982,293],{},[13,126984,126985],{},[617,126986],{"alt":619,"src":16262},[72,126988,126989],{},[13,126990,126991,16269,126993,16273,126995,1048,126997,16278],{},[22,126992,1040],{},[78,126994,16272],{},[22,126996,1047],{},[22,126998,1051],{},[13,127000,127001],{},[22,127002,306],{},[72,127004,127005],{},[13,127006,127007,16269,127009,16292,127011,2994],{},[22,127008,1040],{},[78,127010,16291],{},[22,127012,1047],{},[13,127014,127015],{},[22,127016,88],{},[49,127018,127019,127023,127027],{},[52,127020,16303,127021],{},[17,127022,16306],{},[52,127024,127025],{},[17,127026,16311],{},[52,127028,127029],{},[17,127030,16316],{},[107,127032,109],{"id":109},[13,127034,112],{},[114,127036,127037],{"className":116,"code":16323,"language":118,"meta":119,"style":119},[17,127038,127039,127043,127047,127051,127055,127059,127063,127067,127071,127075,127079,127083,127087,127091,127095,127099,127103,127107,127111,127115,127119,127123,127127,127131,127135,127139,127143,127147],{"__ignoreMap":119},[78,127040,127041],{"class":124,"line":125},[78,127042,129],{"emptyLinePlaceholder":128},[78,127044,127045],{"class":124,"line":132},[78,127046,16084],{},[78,127048,127049],{"class":124,"line":138},[78,127050,16089],{},[78,127052,127053],{"class":124,"line":144},[78,127054,16094],{},[78,127056,127057],{"class":124,"line":150},[78,127058,13255],{},[78,127060,127061],{"class":124,"line":156},[78,127062,16103],{},[78,127064,127065],{"class":124,"line":162},[78,127066,16108],{},[78,127068,127069],{"class":124,"line":168},[78,127070,135],{},[78,127072,127073],{"class":124,"line":174},[78,127074,16362],{},[78,127076,127077],{"class":124,"line":180},[78,127078,16367],{},[78,127080,127081],{"class":124,"line":186},[78,127082,911],{},[78,127084,127085],{"class":124,"line":192},[78,127086,16376],{},[78,127088,127089],{"class":124,"line":198},[78,127090,16381],{},[78,127092,127093],{"class":124,"line":204},[78,127094,16386],{},[78,127096,127097],{"class":124,"line":210},[78,127098,16391],{},[78,127100,127101],{"class":124,"line":216},[78,127102,16396],{},[78,127104,127105],{"class":124,"line":222},[78,127106,16401],{},[78,127108,127109],{"class":124,"line":421},[78,127110,16406],{},[78,127112,127113],{"class":124,"line":427},[78,127114,16411],{},[78,127116,127117],{"class":124,"line":433},[78,127118,16416],{},[78,127120,127121],{"class":124,"line":2443},[78,127122,16421],{},[78,127124,127125],{"class":124,"line":2448},[78,127126,16426],{},[78,127128,127129],{"class":124,"line":2454},[78,127130,16431],{},[78,127132,127133],{"class":124,"line":2460},[78,127134,207],{},[78,127136,127137],{"class":124,"line":2465},[78,127138,16440],{},[78,127140,127141],{"class":124,"line":2470},[78,127142,16445],{},[78,127144,127145],{"class":124,"line":2903},[78,127146,219],{},[78,127148,127149],{"class":124,"line":2909},[78,127150,207],{},[226,127152,228],{},{"title":119,"searchDepth":144,"depth":144,"links":127154},[127155],{"id":109,"depth":132,"text":109},{},{"title":16231,"description":16459},[246,16226,16227],{"id":16467,"title":16468,"assetBase":7,"author":8,"body":127160,"category":16735,"collection":233,"date":16219,"description":16736,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":127385,"navigation":128,"originalPath":239,"path":16738,"seo":127386,"source":243,"stem":16740,"tags":127387,"weight":250,"__hash__":16742},{"type":10,"value":127161,"toc":127382},[127162,127166,127178,127184,127188,127192,127204,127208,127212,127224,127228,127238,127242,127252,127254,127256,127380],[13,127163,16473,127164,16476],{},[17,127165,16239],{},[49,127167,127168,127172,127174,127176],{},[52,127169,16481,127170,16485],{},[22,127171,16484],{},[52,127173,16488],{},[52,127175,16491],{},[52,127177,16494],{},[13,127179,16497,127180,16501,127182,16505],{},[22,127181,16500],{},[22,127183,16504],{},[13,127185,127186],{},[22,127187,293],{},[13,127189,127190],{},[617,127191],{"alt":619,"src":16514},[72,127193,127194],{},[13,127195,127196,16269,127198,127200,1048,127202,16528],{},[22,127197,1040],{},[78,127199,16523],{},[22,127201,1047],{},[22,127203,1051],{},[13,127205,127206],{},[22,127207,306],{},[13,127209,127210],{},[617,127211],{"alt":619,"src":16537},[72,127213,127214],{},[13,127215,127216,16269,127218,127220,1651,127222,16551],{},[22,127217,1040],{},[78,127219,16546],{},[22,127221,1047],{},[22,127223,1051],{},[13,127225,127226],{},[22,127227,1265],{},[72,127229,127230],{},[13,127231,127232,16269,127234,127236,1277],{},[22,127233,1040],{},[78,127235,469],{},[22,127237,1047],{},[13,127239,127240],{},[22,127241,317],{},[49,127243,127244,127248],{},[52,127245,16574,127246,16578],{},[17,127247,16577],{},[52,127249,16581,127250,16585],{},[17,127251,16584],{},[107,127253,109],{"id":109},[13,127255,112],{},[114,127257,127258],{"className":116,"code":16592,"language":118,"meta":119,"style":119},[17,127259,127260,127264,127268,127272,127276,127280,127284,127288,127292,127296,127300,127304,127308,127312,127316,127320,127324,127328,127332,127336,127340,127344,127348,127352,127356,127360,127364,127368,127372,127376],{"__ignoreMap":119},[78,127261,127262],{"class":124,"line":125},[78,127263,129],{"emptyLinePlaceholder":128},[78,127265,127266],{"class":124,"line":132},[78,127267,16084],{},[78,127269,127270],{"class":124,"line":138},[78,127271,16089],{},[78,127273,127274],{"class":124,"line":144},[78,127275,16094],{},[78,127277,127278],{"class":124,"line":150},[78,127279,13255],{},[78,127281,127282],{"class":124,"line":156},[78,127283,16103],{},[78,127285,127286],{"class":124,"line":162},[78,127287,16108],{},[78,127289,127290],{"class":124,"line":168},[78,127291,135],{},[78,127293,127294],{"class":124,"line":174},[78,127295,16631],{},[78,127297,127298],{"class":124,"line":180},[78,127299,16636],{},[78,127301,127302],{"class":124,"line":186},[78,127303,16641],{},[78,127305,127306],{"class":124,"line":192},[78,127307,16381],{},[78,127309,127310],{"class":124,"line":198},[78,127311,16650],{},[78,127313,127314],{"class":124,"line":204},[78,127315,16655],{},[78,127317,127318],{"class":124,"line":210},[78,127319,16660],{},[78,127321,127322],{"class":124,"line":216},[78,127323,16665],{},[78,127325,127326],{"class":124,"line":222},[78,127327,16670],{},[78,127329,127330],{"class":124,"line":421},[78,127331,16675],{},[78,127333,127334],{"class":124,"line":427},[78,127335,16680],{},[78,127337,127338],{"class":124,"line":433},[78,127339,16685],{},[78,127341,127342],{"class":124,"line":2443},[78,127343,10916],{},[78,127345,127346],{"class":124,"line":2448},[78,127347,16694],{},[78,127349,127350],{"class":124,"line":2454},[78,127351,16699],{},[78,127353,127354],{"class":124,"line":2460},[78,127355,1359],{},[78,127357,127358],{"class":124,"line":2465},[78,127359,16708],{},[78,127361,127362],{"class":124,"line":2470},[78,127363,16713],{},[78,127365,127366],{"class":124,"line":2903},[78,127367,207],{},[78,127369,127370],{"class":124,"line":2909},[78,127371,16440],{},[78,127373,127374],{"class":124,"line":11477},[78,127375,219],{},[78,127377,127378],{"class":124,"line":13374},[78,127379,207],{},[226,127381,228],{},{"title":119,"searchDepth":144,"depth":144,"links":127383},[127384],{"id":109,"depth":132,"text":109},{},{"title":16468,"description":16736},[246,16226,16227,249],{"id":16744,"title":16745,"assetBase":239,"author":8,"body":127389,"category":787,"collection":233,"date":20885,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":131324,"navigation":128,"originalPath":239,"path":20887,"seo":131325,"source":243,"stem":20889,"tags":131326,"weight":250,"__hash__":20891},{"type":10,"value":127390,"toc":131313},[127391,127393,127395,127397,127688,127690,127692,127700,127702,127704,127706,127988,128413,128562,128564,128568,128722,129184,129643,129645,129767,129769,129773,130440,131124,131126,131128,131130,131140,131142,131150,131152,131154,131156,131158,131160,131165,131167,131173,131279,131285,131287,131295,131297,131299,131301,131303,131305,131307,131309,131311],[4517,127392,16745],{"id":16745},[107,127394,16753],{"id":16752},[7759,127396,16756],{"id":16756},[13,127398,16759,127399,16811,127447,16842,127475,10730,127548,1018,127576,16975,127604,17004,127632,17033,127660,17062],{},[78,127400,127402,127423],{"className":127401},[4570],[78,127403,127405],{"className":127404},[4574],[4576,127406,127407],{"xmlns":4578},[4581,127408,127409,127421],{},[4584,127410,127411,127413,127415,127417,127419],{},[4596,127412,5009],{},[4587,127414,1011],{},[4596,127416,12172],{},[4587,127418,1011],{},[4596,127420,7360],{},[4647,127422,16784],{"encoding":4649},[78,127424,127426],{"className":127425,"ariaHidden":1419},[4654],[78,127427,127429,127432,127435,127438,127441,127444],{"className":127428},[4658],[78,127430],{"className":127431,"style":16794},[4662],[78,127433,5009],{"className":127434},[4667,16798],[78,127436,1011],{"className":127437},[4667,6184],[78,127439,12172],{"className":127440},[4667,16798],[78,127442,1011],{"className":127443},[4667,6184],[78,127445,7360],{"className":127446},[4667,16798],[78,127448,127450,127463],{"className":127449},[4570],[78,127451,127453],{"className":127452},[4574],[4576,127454,127455],{"xmlns":4578},[4581,127456,127457,127461],{},[4584,127458,127459],{},[4596,127460,5009],{},[4647,127462,16828],{"encoding":4649},[78,127464,127466],{"className":127465,"ariaHidden":1419},[4654],[78,127467,127469,127472],{"className":127468},[4658],[78,127470],{"className":127471,"style":16838},[4662],[78,127473,5009],{"className":127474},[4667,16798],[78,127476,127478,127503],{"className":127477},[4570],[78,127479,127481],{"className":127480},[4574],[4576,127482,127483],{"xmlns":4578},[4581,127484,127485,127501],{},[4584,127486,127487,127489,127491,127493,127495,127497,127499],{},[4596,127488,5009],{},[4591,127490,4609],{},[4591,127492,4594],{"stretchy":4593},[4596,127494,4598],{},[4591,127496,2066],{"separator":1419},[4596,127498,16867],{},[4591,127500,4604],{"stretchy":4593},[4647,127502,16872],{"encoding":4649},[78,127504,127506,127524],{"className":127505,"ariaHidden":1419},[4654],[78,127507,127509,127512,127515,127518,127521],{"className":127508},[4658],[78,127510],{"className":127511,"style":16838},[4662],[78,127513,5009],{"className":127514},[4667,4678],[78,127516],{"className":127517,"style":4740},[4739],[78,127519,4609],{"className":127520},[4744],[78,127522],{"className":127523,"style":4740},[4739],[78,127525,127527,127530,127533,127536,127539,127542,127545],{"className":127526},[4658],[78,127528],{"className":127529,"style":4663},[4662],[78,127531,4594],{"className":127532},[4674],[78,127534,4598],{"className":127535},[4667,4678],[78,127537,2066],{"className":127538},[5126],[78,127540],{"className":127541,"style":4839},[4739],[78,127543,16867],{"className":127544,"style":5187},[4667,4678],[78,127546,4604],{"className":127547},[4682],[78,127549,127551,127564],{"className":127550},[4570],[78,127552,127554],{"className":127553},[4574],[4576,127555,127556],{"xmlns":4578},[4581,127557,127558,127562],{},[4584,127559,127560],{},[4596,127561,4598],{},[4647,127563,4598],{"encoding":4649},[78,127565,127567],{"className":127566,"ariaHidden":1419},[4654],[78,127568,127570,127573],{"className":127569},[4658],[78,127571],{"className":127572,"style":16838},[4662],[78,127574,4598],{"className":127575},[4667,4678],[78,127577,127579,127592],{"className":127578},[4570],[78,127580,127582],{"className":127581},[4574],[4576,127583,127584],{"xmlns":4578},[4581,127585,127586,127590],{},[4584,127587,127588],{},[4596,127589,16867],{},[4647,127591,16867],{"encoding":4649},[78,127593,127595],{"className":127594,"ariaHidden":1419},[4654],[78,127596,127598,127601],{"className":127597},[4658],[78,127599],{"className":127600,"style":16971},[4662],[78,127602,16867],{"className":127603,"style":5187},[4667,4678],[78,127605,127607,127620],{"className":127606},[4570],[78,127608,127610],{"className":127609},[4574],[4576,127611,127612],{"xmlns":4578},[4581,127613,127614,127618],{},[4584,127615,127616],{},[4596,127617,5009],{},[4647,127619,16828],{"encoding":4649},[78,127621,127623],{"className":127622,"ariaHidden":1419},[4654],[78,127624,127626,127629],{"className":127625},[4658],[78,127627],{"className":127628,"style":16838},[4662],[78,127630,5009],{"className":127631},[4667,16798],[78,127633,127635,127648],{"className":127634},[4570],[78,127636,127638],{"className":127637},[4574],[4576,127639,127640],{"xmlns":4578},[4581,127641,127642,127646],{},[4584,127643,127644],{},[4596,127645,4598],{},[4647,127647,4598],{"encoding":4649},[78,127649,127651],{"className":127650,"ariaHidden":1419},[4654],[78,127652,127654,127657],{"className":127653},[4658],[78,127655],{"className":127656,"style":16838},[4662],[78,127658,4598],{"className":127659},[4667,4678],[78,127661,127663,127676],{"className":127662},[4570],[78,127664,127666],{"className":127665},[4574],[4576,127667,127668],{"xmlns":4578},[4581,127669,127670,127674],{},[4584,127671,127672],{},[4596,127673,16867],{},[4647,127675,16867],{"encoding":4649},[78,127677,127679],{"className":127678,"ariaHidden":1419},[4654],[78,127680,127682,127685],{"className":127681},[4658],[78,127683],{"className":127684,"style":16971},[4662],[78,127686,16867],{"className":127687,"style":5187},[4667,4678],[13,127689,17065],{},[10548,127691,17068],{"id":17068},[49,127693,127694,127696,127698],{},[52,127695,17073],{},[52,127697,17076],{},[52,127699,17079],{},[7759,127701,17082],{"id":17082},[10548,127703,17085],{"id":17085},[13,127705,17088],{},[78,127707,127709],{"className":127708},[4566],[78,127710,127712,127793],{"className":127711},[4570],[78,127713,127715],{"className":127714},[4574],[4576,127716,127717],{"xmlns":4578,"display":4579},[4581,127718,127719,127791],{},[4584,127720,127721,127723,127725,127727,127729,127731,127737,127739,127741,127743,127745,127747,127749,127751,127753,127755,127757,127759,127761,127763,127765,127767],{},[4596,127722,7360],{},[4596,127724,5025],{},[4596,127726,262],{},[4596,127728,39],{},[4596,127730,19],{},[4600,127732,127733,127735],{},[4596,127734,4618],{},[4596,127736,262],{},[4596,127738,39],{},[4596,127740,5058],{},[4596,127742,39],{},[4596,127744,7132],{},[4596,127746,5009],{},[4596,127748,17132],{},[4596,127750,39],{},[4596,127752,5012],{},[4596,127754,16867],{},[4591,127756,4594],{"stretchy":4593},[4596,127758,17143],{},[4591,127760,2066],{"separator":1419},[4596,127762,17148],{},[4591,127764,4604],{"stretchy":4593},[4591,127766,4609],{},[4611,127768,127769,127777],{},[4584,127770,127771,127773,127775],{},[4596,127772,17143],{"mathvariant":17159},[4591,127774,17162],{},[4596,127776,17148],{"mathvariant":17159},[4584,127778,127779,127781,127783,127785,127787,127789],{},[4596,127780,17169],{"mathvariant":7101},[4596,127782,17143],{"mathvariant":17159},[4596,127784,17169],{"mathvariant":7101},[4596,127786,17169],{"mathvariant":7101},[4596,127788,17148],{"mathvariant":17159},[4596,127790,17169],{"mathvariant":7101},[4647,127792,17182],{"encoding":4649},[78,127794,127796,127896],{"className":127795,"ariaHidden":1419},[4654],[78,127797,127799,127802,127805,127808,127848,127851,127854,127857,127860,127863,127866,127869,127872,127875,127878,127881,127884,127887,127890,127893],{"className":127798},[4658],[78,127800],{"className":127801,"style":4663},[4662],[78,127803,7484],{"className":127804},[4667,4678],[78,127806,7201],{"className":127807},[4667,4678],[78,127809,127811,127814],{"className":127810},[4667],[78,127812,4618],{"className":127813},[4667,4678],[78,127815,127817],{"className":127816},[4689],[78,127818,127820,127840],{"className":127819},[4693,4694],[78,127821,127823,127837],{"className":127822},[4698],[78,127824,127826],{"className":127825,"style":5279},[4702],[78,127827,127828,127831],{"style":4706},[78,127829],{"className":127830,"style":4711},[4710],[78,127832,127834],{"className":127833},[4715,4716,4717,4718],[78,127835,262],{"className":127836},[4667,4678,4718],[78,127838,4726],{"className":127839},[4725],[78,127841,127843],{"className":127842},[4698],[78,127844,127846],{"className":127845,"style":4733},[4702],[78,127847],{},[78,127849,17241],{"className":127850},[4667,4678],[78,127852,7132],{"className":127853,"style":7300},[4667,4678],[78,127855,5009],{"className":127856},[4667,4678],[78,127858,17132],{"className":127859,"style":17251},[4667,4678],[78,127861,39],{"className":127862},[4667,4678],[78,127864,5012],{"className":127865},[4667,4678],[78,127867,16867],{"className":127868,"style":5187},[4667,4678],[78,127870,4594],{"className":127871},[4674],[78,127873,17143],{"className":127874},[4667,4678],[78,127876,2066],{"className":127877},[5126],[78,127879],{"className":127880,"style":4839},[4739],[78,127882,17148],{"className":127883,"style":17276},[4667,4678],[78,127885,4604],{"className":127886},[4682],[78,127888],{"className":127889,"style":4740},[4739],[78,127891,4609],{"className":127892},[4744],[78,127894],{"className":127895,"style":4740},[4739],[78,127897,127899,127902],{"className":127898},[4658],[78,127900],{"className":127901,"style":17295},[4662],[78,127903,127905,127908,127985],{"className":127904},[4667],[78,127906],{"className":127907},[4674,4761],[78,127909,127911],{"className":127910},[4611],[78,127912,127914,127977],{"className":127913},[4693,4694],[78,127915,127917,127974],{"className":127916},[4698],[78,127918,127920,127943,127951],{"className":127919,"style":17314},[4702],[78,127921,127922,127925],{"style":4777},[78,127923],{"className":127924,"style":4781},[4710],[78,127926,127928,127931,127934,127937,127940],{"className":127927},[4667],[78,127929,17169],{"className":127930},[4667],[78,127932,17143],{"className":127933},[4667,17329],[78,127935,17333],{"className":127936},[4667],[78,127938,17148],{"className":127939},[4667,17329],[78,127941,17169],{"className":127942},[4667],[78,127944,127945,127948],{"style":4919},[78,127946],{"className":127947,"style":4781},[4710],[78,127949],{"className":127950,"style":4927},[4926],[78,127952,127953,127956],{"style":4930},[78,127954],{"className":127955,"style":4781},[4710],[78,127957,127959,127962,127965,127968,127971],{"className":127958},[4667],[78,127960,17143],{"className":127961},[4667,17329],[78,127963],{"className":127964,"style":5143},[4739],[78,127966,17162],{"className":127967},[7450],[78,127969],{"className":127970,"style":5143},[4739],[78,127972,17148],{"className":127973},[4667,17329],[78,127975,4726],{"className":127976},[4725],[78,127978,127980],{"className":127979},[4698],[78,127981,127983],{"className":127982,"style":17380},[4702],[78,127984],{},[78,127986],{"className":127987},[4682,4761],[13,127989,17388,127990,1018,128018,17448,128046,17479,128074,1018,128102,17536,128130,67,128175,17479,128225,1018,128253,17691,128281,1018,128319,17770,128357,1018,128385,17827],{},[78,127991,127993,128006],{"className":127992},[4570],[78,127994,127996],{"className":127995},[4574],[4576,127997,127998],{"xmlns":4578},[4581,127999,128000,128004],{},[4584,128001,128002],{},[4596,128003,17143],{"mathvariant":17159},[4647,128005,17405],{"encoding":4649},[78,128007,128009],{"className":128008,"ariaHidden":1419},[4654],[78,128010,128012,128015],{"className":128011},[4658],[78,128013],{"className":128014,"style":17415},[4662],[78,128016,17143],{"className":128017},[4667,17329],[78,128019,128021,128034],{"className":128020},[4570],[78,128022,128024],{"className":128023},[4574],[4576,128025,128026],{"xmlns":4578},[4581,128027,128028,128032],{},[4584,128029,128030],{},[4596,128031,17148],{"mathvariant":17159},[4647,128033,17435],{"encoding":4649},[78,128035,128037],{"className":128036,"ariaHidden":1419},[4654],[78,128038,128040,128043],{"className":128039},[4658],[78,128041],{"className":128042,"style":17415},[4662],[78,128044,17148],{"className":128045},[4667,17329],[78,128047,128049,128062],{"className":128048},[4570],[78,128050,128052],{"className":128051},[4574],[4576,128053,128054],{"xmlns":4578},[4581,128055,128056,128060],{},[4584,128057,128058],{},[4596,128059,17463],{},[4647,128061,17466],{"encoding":4649},[78,128063,128065],{"className":128064,"ariaHidden":1419},[4654],[78,128066,128068,128071],{"className":128067},[4658],[78,128069],{"className":128070,"style":16794},[4662],[78,128072,17463],{"className":128073,"style":17251},[4667,4678],[78,128075,128077,128090],{"className":128076},[4570],[78,128078,128080],{"className":128079},[4574],[4576,128081,128082],{"xmlns":4578},[4581,128083,128084,128088],{},[4584,128085,128086],{},[4596,128087,17143],{"mathvariant":17159},[4647,128089,17405],{"encoding":4649},[78,128091,128093],{"className":128092,"ariaHidden":1419},[4654],[78,128094,128096,128099],{"className":128095},[4658],[78,128097],{"className":128098,"style":17415},[4662],[78,128100,17143],{"className":128101},[4667,17329],[78,128103,128105,128118],{"className":128104},[4570],[78,128106,128108],{"className":128107},[4574],[4576,128109,128110],{"xmlns":4578},[4581,128111,128112,128116],{},[4584,128113,128114],{},[4596,128115,17148],{"mathvariant":17159},[4647,128117,17435],{"encoding":4649},[78,128119,128121],{"className":128120,"ariaHidden":1419},[4654],[78,128122,128124,128127],{"className":128123},[4658],[78,128125],{"className":128126,"style":17415},[4662],[78,128128,17148],{"className":128129},[4667,17329],[78,128131,128133,128154],{"className":128132},[4570],[78,128134,128136],{"className":128135},[4574],[4576,128137,128138],{"xmlns":4578},[4581,128139,128140,128152],{},[4584,128141,128142,128144,128146,128148,128150],{},[4596,128143,7484],{},[4591,128145,17553],{},[4591,128147,4594],{"stretchy":4593},[4596,128149,17463],{},[4591,128151,4604],{"stretchy":4593},[4647,128153,17562],{"encoding":4649},[78,128155,128157],{"className":128156,"ariaHidden":1419},[4654],[78,128158,128160,128163,128166,128169,128172],{"className":128159},[4658],[78,128161],{"className":128162,"style":4663},[4662],[78,128164,7484],{"className":128165},[4788],[78,128167,4594],{"className":128168},[4674],[78,128170,17463],{"className":128171,"style":17251},[4667,4678],[78,128173,4604],{"className":128174},[4682],[78,128176,128178,128195],{"className":128177},[4570],[78,128179,128181],{"className":128180},[4574],[4576,128182,128183],{"xmlns":4578},[4581,128184,128185,128193],{},[4584,128186,128187,128189,128191],{},[4596,128188,17143],{"mathvariant":17159},[4591,128190,17162],{},[4596,128192,17148],{"mathvariant":17159},[4647,128194,17604],{"encoding":4649},[78,128196,128198,128216],{"className":128197,"ariaHidden":1419},[4654],[78,128199,128201,128204,128207,128210,128213],{"className":128200},[4658],[78,128202],{"className":128203,"style":17415},[4662],[78,128205,17143],{"className":128206},[4667,17329],[78,128208],{"className":128209,"style":5143},[4739],[78,128211,17162],{"className":128212},[7450],[78,128214],{"className":128215,"style":5143},[4739],[78,128217,128219,128222],{"className":128218},[4658],[78,128220],{"className":128221,"style":17415},[4662],[78,128223,17148],{"className":128224},[4667,17329],[78,128226,128228,128241],{"className":128227},[4570],[78,128229,128231],{"className":128230},[4574],[4576,128232,128233],{"xmlns":4578},[4581,128234,128235,128239],{},[4584,128236,128237],{},[4596,128238,17143],{"mathvariant":17159},[4647,128240,17405],{"encoding":4649},[78,128242,128244],{"className":128243,"ariaHidden":1419},[4654],[78,128245,128247,128250],{"className":128246},[4658],[78,128248],{"className":128249,"style":17415},[4662],[78,128251,17143],{"className":128252},[4667,17329],[78,128254,128256,128269],{"className":128255},[4570],[78,128257,128259],{"className":128258},[4574],[4576,128260,128261],{"xmlns":4578},[4581,128262,128263,128267],{},[4584,128264,128265],{},[4596,128266,17148],{"mathvariant":17159},[4647,128268,17435],{"encoding":4649},[78,128270,128272],{"className":128271,"ariaHidden":1419},[4654],[78,128273,128275,128278],{"className":128274},[4658],[78,128276],{"className":128277,"style":17415},[4662],[78,128279,17148],{"className":128280},[4667,17329],[78,128282,128284,128301],{"className":128283},[4570],[78,128285,128287],{"className":128286},[4574],[4576,128288,128289],{"xmlns":4578},[4581,128290,128291,128299],{},[4584,128292,128293,128295,128297],{},[4596,128294,17169],{"mathvariant":7101},[4596,128296,17143],{"mathvariant":17159},[4596,128298,17169],{"mathvariant":7101},[4647,128300,17712],{"encoding":4649},[78,128302,128304],{"className":128303,"ariaHidden":1419},[4654],[78,128305,128307,128310,128313,128316],{"className":128306},[4658],[78,128308],{"className":128309,"style":4663},[4662],[78,128311,17169],{"className":128312},[4667],[78,128314,17143],{"className":128315},[4667,17329],[78,128317,17169],{"className":128318},[4667],[78,128320,128322,128339],{"className":128321},[4570],[78,128323,128325],{"className":128324},[4574],[4576,128326,128327],{"xmlns":4578},[4581,128328,128329,128337],{},[4584,128330,128331,128333,128335],{},[4596,128332,17169],{"mathvariant":7101},[4596,128334,17148],{"mathvariant":17159},[4596,128336,17169],{"mathvariant":7101},[4647,128338,17751],{"encoding":4649},[78,128340,128342],{"className":128341,"ariaHidden":1419},[4654],[78,128343,128345,128348,128351,128354],{"className":128344},[4658],[78,128346],{"className":128347,"style":4663},[4662],[78,128349,17169],{"className":128350},[4667],[78,128352,17148],{"className":128353},[4667,17329],[78,128355,17169],{"className":128356},[4667],[78,128358,128360,128373],{"className":128359},[4570],[78,128361,128363],{"className":128362},[4574],[4576,128364,128365],{"xmlns":4578},[4581,128366,128367,128371],{},[4584,128368,128369],{},[4596,128370,17143],{"mathvariant":17159},[4647,128372,17405],{"encoding":4649},[78,128374,128376],{"className":128375,"ariaHidden":1419},[4654],[78,128377,128379,128382],{"className":128378},[4658],[78,128380],{"className":128381,"style":17415},[4662],[78,128383,17143],{"className":128384},[4667,17329],[78,128386,128388,128401],{"className":128387},[4570],[78,128389,128391],{"className":128390},[4574],[4576,128392,128393],{"xmlns":4578},[4581,128394,128395,128399],{},[4584,128396,128397],{},[4596,128398,17148],{"mathvariant":17159},[4647,128400,17435],{"encoding":4649},[78,128402,128404],{"className":128403,"ariaHidden":1419},[4654],[78,128405,128407,128410],{"className":128406},[4658],[78,128408],{"className":128409,"style":17415},[4662],[78,128411,17148],{"className":128412},[4667,17329],[13,128414,17830,128415,17891,128471,17921,128499,17956,128532,17985,128560,17989],{},[78,128416,128418,128441],{"className":128417},[4570],[78,128419,128421],{"className":128420},[4574],[4576,128422,128423],{"xmlns":4578},[4581,128424,128425,128439],{},[4584,128426,128427,128429,128431,128433,128435,128437],{},[4591,128428,17845],{"stretchy":4593},[4591,128430,17848],{},[7077,128432,469],{},[4591,128434,2066],{"separator":1419},[7077,128436,469],{},[4591,128438,17857],{"stretchy":4593},[4647,128440,17860],{"encoding":4649},[78,128442,128444],{"className":128443,"ariaHidden":1419},[4654],[78,128445,128447,128450,128453,128456,128459,128462,128465,128468],{"className":128446},[4658],[78,128448],{"className":128449,"style":4663},[4662],[78,128451,17845],{"className":128452},[4674],[78,128454,17848],{"className":128455},[4667],[78,128457,469],{"className":128458},[4667],[78,128460,2066],{"className":128461},[5126],[78,128463],{"className":128464,"style":4839},[4739],[78,128466,469],{"className":128467},[4667],[78,128469,17857],{"className":128470},[4682],[78,128472,128474,128487],{"className":128473},[4570],[78,128475,128477],{"className":128476},[4574],[4576,128478,128479],{"xmlns":4578},[4581,128480,128481,128485],{},[4584,128482,128483],{},[7077,128484,469],{},[4647,128486,469],{"encoding":4649},[78,128488,128490],{"className":128489,"ariaHidden":1419},[4654],[78,128491,128493,128496],{"className":128492},[4658],[78,128494],{"className":128495,"style":17917},[4662],[78,128497,469],{"className":128498},[4667],[78,128500,128502,128517],{"className":128501},[4570],[78,128503,128505],{"className":128504},[4574],[4576,128506,128507],{"xmlns":4578},[4581,128508,128509,128515],{},[4584,128510,128511,128513],{},[4591,128512,17848],{},[7077,128514,469],{},[4647,128516,1217],{"encoding":4649},[78,128518,128520],{"className":128519,"ariaHidden":1419},[4654],[78,128521,128523,128526,128529],{"className":128522},[4658],[78,128524],{"className":128525,"style":17949},[4662],[78,128527,17848],{"className":128528},[4667],[78,128530,469],{"className":128531},[4667],[78,128533,128535,128548],{"className":128534},[4570],[78,128536,128538],{"className":128537},[4574],[4576,128539,128540],{"xmlns":4578},[4581,128541,128542,128546],{},[4584,128543,128544],{},[7077,128545,2949],{},[4647,128547,2949],{"encoding":4649},[78,128549,128551],{"className":128550,"ariaHidden":1419},[4654],[78,128552,128554,128557],{"className":128553},[4658],[78,128555],{"className":128556,"style":17917},[4662],[78,128558,2949],{"className":128559},[4667],[22,128561,17988],{},[10548,128563,17992],{"id":17992},[13,128565,17995,128566,17999],{},[22,128567,17998],{},[78,128569,128571],{"className":128570},[4566],[78,128572,128574,128629],{"className":128573},[4570],[78,128575,128577],{"className":128576},[4574],[4576,128578,128579],{"xmlns":4578,"display":4579},[4581,128580,128581,128627],{},[4584,128582,128583,128585,128587,128589,128591,128593,128595,128597,128599,128601,128603,128605,128607,128609,128611,128613,128615,128617,128619,128621,128623,128625],{},[4596,128584,39],{},[4596,128586,19],{},[4596,128588,19],{},[4596,128590,4618],{},[4596,128592,17132],{},[4596,128594,18027],{"mathvariant":7101},[4596,128596,13],{},[4596,128598,17132],{},[4596,128600,5025],{},[4596,128602,5245],{},[4596,128604,18038],{},[4596,128606,7360],{},[4596,128608,5012],{},[4591,128610,4594],{"stretchy":4593},[4596,128612,17143],{},[4591,128614,2066],{"separator":1419},[4596,128616,17148],{},[4591,128618,4604],{"stretchy":4593},[4591,128620,4609],{},[4596,128622,17143],{"mathvariant":17159},[4591,128624,17162],{},[4596,128626,17148],{"mathvariant":17159},[4647,128628,18063],{"encoding":4649},[78,128630,128632,128695,128713],{"className":128631,"ariaHidden":1419},[4654],[78,128633,128635,128638,128641,128644,128647,128650,128653,128656,128659,128662,128665,128668,128671,128674,128677,128680,128683,128686,128689,128692],{"className":128634},[4658],[78,128636],{"className":128637,"style":18073},[4662],[78,128639,18077],{"className":128640},[4667,4678],[78,128642,18081],{"className":128643,"style":17251},[4667,4678],[78,128645,18027],{"className":128646,"style":17251},[4667],[78,128648,13],{"className":128649},[4667,4678],[78,128651,17132],{"className":128652,"style":17251},[4667,4678],[78,128654,5025],{"className":128655},[4667,4678],[78,128657,5245],{"className":128658},[4667,4678],[78,128660,18038],{"className":128661},[4667,4678],[78,128663,7360],{"className":128664},[4667,4678],[78,128666,5012],{"className":128667},[4667,4678],[78,128669,4594],{"className":128670},[4674],[78,128672,17143],{"className":128673},[4667,4678],[78,128675,2066],{"className":128676},[5126],[78,128678],{"className":128679,"style":4839},[4739],[78,128681,17148],{"className":128682,"style":17276},[4667,4678],[78,128684,4604],{"className":128685},[4682],[78,128687],{"className":128688,"style":4740},[4739],[78,128690,4609],{"className":128691},[4744],[78,128693],{"className":128694,"style":4740},[4739],[78,128696,128698,128701,128704,128707,128710],{"className":128697},[4658],[78,128699],{"className":128700,"style":17415},[4662],[78,128702,17143],{"className":128703},[4667,17329],[78,128705],{"className":128706,"style":5143},[4739],[78,128708,17162],{"className":128709},[7450],[78,128711],{"className":128712,"style":5143},[4739],[78,128714,128716,128719],{"className":128715},[4658],[78,128717],{"className":128718,"style":17415},[4662],[78,128720,17148],{"className":128721},[4667,17329],[13,128723,4275,128724,1018,128954,18629],{},[78,128725,128727,128774],{"className":128726},[4570],[78,128728,128730],{"className":128729},[4574],[4576,128731,128732],{"xmlns":4578},[4581,128733,128734,128772],{},[4584,128735,128736,128738,128740,128742,128748,128750,128756,128758,128760,128762,128764,128770],{},[4596,128737,17143],{},[4591,128739,4609],{},[4591,128741,4594],{"stretchy":4593},[4600,128743,128744,128746],{},[4596,128745,5009],{},[7077,128747,469],{},[4591,128749,2066],{"separator":1419},[4600,128751,128752,128754],{},[4596,128753,5009],{},[7077,128755,472],{},[4591,128757,2066],{"separator":1419},[4591,128759,18198],{},[4587,128761,18201],{},[4591,128763,2066],{"separator":1419},[4600,128765,128766,128768],{},[4596,128767,5009],{},[4596,128769,19],{},[4591,128771,4604],{"stretchy":4593},[4647,128773,18214],{"encoding":4649},[78,128775,128777,128795],{"className":128776,"ariaHidden":1419},[4654],[78,128778,128780,128783,128786,128789,128792],{"className":128779},[4658],[78,128781],{"className":128782,"style":18224},[4662],[78,128784,17143],{"className":128785},[4667,4678],[78,128787],{"className":128788,"style":4740},[4739],[78,128790,4609],{"className":128791},[4744],[78,128793],{"className":128794,"style":4740},[4739],[78,128796,128798,128801,128804,128844,128847,128850,128890,128893,128896,128899,128902,128905,128908,128911,128951],{"className":128797},[4658],[78,128799],{"className":128800,"style":4663},[4662],[78,128802,4594],{"className":128803},[4674],[78,128805,128807,128810],{"className":128806},[4667],[78,128808,5009],{"className":128809},[4667,4678],[78,128811,128813],{"className":128812},[4689],[78,128814,128816,128836],{"className":128815},[4693,4694],[78,128817,128819,128833],{"className":128818},[4698],[78,128820,128822],{"className":128821,"style":18264},[4702],[78,128823,128824,128827],{"style":4706},[78,128825],{"className":128826,"style":4711},[4710],[78,128828,128830],{"className":128829},[4715,4716,4717,4718],[78,128831,469],{"className":128832},[4667,4718],[78,128834,4726],{"className":128835},[4725],[78,128837,128839],{"className":128838},[4698],[78,128840,128842],{"className":128841,"style":4733},[4702],[78,128843],{},[78,128845,2066],{"className":128846},[5126],[78,128848],{"className":128849,"style":4839},[4739],[78,128851,128853,128856],{"className":128852},[4667],[78,128854,5009],{"className":128855},[4667,4678],[78,128857,128859],{"className":128858},[4689],[78,128860,128862,128882],{"className":128861},[4693,4694],[78,128863,128865,128879],{"className":128864},[4698],[78,128866,128868],{"className":128867,"style":18264},[4702],[78,128869,128870,128873],{"style":4706},[78,128871],{"className":128872,"style":4711},[4710],[78,128874,128876],{"className":128875},[4715,4716,4717,4718],[78,128877,472],{"className":128878},[4667,4718],[78,128880,4726],{"className":128881},[4725],[78,128883,128885],{"className":128884},[4698],[78,128886,128888],{"className":128887,"style":4733},[4702],[78,128889],{},[78,128891,2066],{"className":128892},[5126],[78,128894],{"className":128895,"style":4839},[4739],[78,128897,18198],{"className":128898},[18342],[78,128900],{"className":128901,"style":4839},[4739],[78,128903],{"className":128904,"style":4839},[4739],[78,128906,2066],{"className":128907},[5126],[78,128909],{"className":128910,"style":4839},[4739],[78,128912,128914,128917],{"className":128913},[4667],[78,128915,5009],{"className":128916},[4667,4678],[78,128918,128920],{"className":128919},[4689],[78,128921,128923,128943],{"className":128922},[4693,4694],[78,128924,128926,128940],{"className":128925},[4698],[78,128927,128929],{"className":128928,"style":5279},[4702],[78,128930,128931,128934],{"style":4706},[78,128932],{"className":128933,"style":4711},[4710],[78,128935,128937],{"className":128936},[4715,4716,4717,4718],[78,128938,19],{"className":128939},[4667,4678,4718],[78,128941,4726],{"className":128942},[4725],[78,128944,128946],{"className":128945},[4698],[78,128947,128949],{"className":128948,"style":4733},[4702],[78,128950],{},[78,128952,4604],{"className":128953},[4682],[78,128955,128957,129004],{"className":128956},[4570],[78,128958,128960],{"className":128959},[4574],[4576,128961,128962],{"xmlns":4578},[4581,128963,128964,129002],{},[4584,128965,128966,128968,128970,128972,128978,128980,128986,128988,128990,128992,128994,129000],{},[4596,128967,17148],{},[4591,128969,4609],{},[4591,128971,4594],{"stretchy":4593},[4600,128973,128974,128976],{},[4596,128975,12172],{},[7077,128977,469],{},[4591,128979,2066],{"separator":1419},[4600,128981,128982,128984],{},[4596,128983,12172],{},[7077,128985,472],{},[4591,128987,2066],{"separator":1419},[4591,128989,18198],{},[4587,128991,18201],{},[4591,128993,2066],{"separator":1419},[4600,128995,128996,128998],{},[4596,128997,12172],{},[4596,128999,19],{},[4591,129001,4604],{"stretchy":4593},[4647,129003,18448],{"encoding":4649},[78,129005,129007,129025],{"className":129006,"ariaHidden":1419},[4654],[78,129008,129010,129013,129016,129019,129022],{"className":129009},[4658],[78,129011],{"className":129012,"style":18224},[4662],[78,129014,17148],{"className":129015,"style":17276},[4667,4678],[78,129017],{"className":129018,"style":4740},[4739],[78,129020,4609],{"className":129021},[4744],[78,129023],{"className":129024,"style":4740},[4739],[78,129026,129028,129031,129034,129074,129077,129080,129120,129123,129126,129129,129132,129135,129138,129141,129181],{"className":129027},[4658],[78,129029],{"className":129030,"style":4663},[4662],[78,129032,4594],{"className":129033},[4674],[78,129035,129037,129040],{"className":129036},[4667],[78,129038,12172],{"className":129039},[4667,4678],[78,129041,129043],{"className":129042},[4689],[78,129044,129046,129066],{"className":129045},[4693,4694],[78,129047,129049,129063],{"className":129048},[4698],[78,129050,129052],{"className":129051,"style":18264},[4702],[78,129053,129054,129057],{"style":4706},[78,129055],{"className":129056,"style":4711},[4710],[78,129058,129060],{"className":129059},[4715,4716,4717,4718],[78,129061,469],{"className":129062},[4667,4718],[78,129064,4726],{"className":129065},[4725],[78,129067,129069],{"className":129068},[4698],[78,129070,129072],{"className":129071,"style":4733},[4702],[78,129073],{},[78,129075,2066],{"className":129076},[5126],[78,129078],{"className":129079,"style":4839},[4739],[78,129081,129083,129086],{"className":129082},[4667],[78,129084,12172],{"className":129085},[4667,4678],[78,129087,129089],{"className":129088},[4689],[78,129090,129092,129112],{"className":129091},[4693,4694],[78,129093,129095,129109],{"className":129094},[4698],[78,129096,129098],{"className":129097,"style":18264},[4702],[78,129099,129100,129103],{"style":4706},[78,129101],{"className":129102,"style":4711},[4710],[78,129104,129106],{"className":129105},[4715,4716,4717,4718],[78,129107,472],{"className":129108},[4667,4718],[78,129110,4726],{"className":129111},[4725],[78,129113,129115],{"className":129114},[4698],[78,129116,129118],{"className":129117,"style":4733},[4702],[78,129119],{},[78,129121,2066],{"className":129122},[5126],[78,129124],{"className":129125,"style":4839},[4739],[78,129127,18198],{"className":129128},[18342],[78,129130],{"className":129131,"style":4839},[4739],[78,129133],{"className":129134,"style":4839},[4739],[78,129136,2066],{"className":129137},[5126],[78,129139],{"className":129140,"style":4839},[4739],[78,129142,129144,129147],{"className":129143},[4667],[78,129145,12172],{"className":129146},[4667,4678],[78,129148,129150],{"className":129149},[4689],[78,129151,129153,129173],{"className":129152},[4693,4694],[78,129154,129156,129170],{"className":129155},[4698],[78,129157,129159],{"className":129158,"style":5279},[4702],[78,129160,129161,129164],{"style":4706},[78,129162],{"className":129163,"style":4711},[4710],[78,129165,129167],{"className":129166},[4715,4716,4717,4718],[78,129168,19],{"className":129169},[4667,4678,4718],[78,129171,4726],{"className":129172},[4725],[78,129174,129176],{"className":129175},[4698],[78,129177,129179],{"className":129178,"style":4733},[4702],[78,129180],{},[78,129182,4604],{"className":129183},[4682],[78,129185,129187],{"className":129186},[4566],[78,129188,129190,129283],{"className":129189},[4570],[78,129191,129193],{"className":129192},[4574],[4576,129194,129195],{"xmlns":4578,"display":4579},[4581,129196,129197,129281],{},[4584,129198,129199,129201,129203,129205,129207,129209,129211,129213,129215,129217,129219,129221,129223,129225,129227,129229,129231,129233,129235,129237,129243,129249,129251,129257,129263,129265,129267,129269,129275],{},[4596,129200,39],{},[4596,129202,19],{},[4596,129204,19],{},[4596,129206,4618],{},[4596,129208,17132],{},[4596,129210,18027],{"mathvariant":7101},[4596,129212,13],{},[4596,129214,17132],{},[4596,129216,5025],{},[4596,129218,5245],{},[4596,129220,18038],{},[4596,129222,7360],{},[4596,129224,5012],{},[4591,129226,4594],{"stretchy":4593},[4596,129228,17143],{},[4591,129230,2066],{"separator":1419},[4596,129232,17148],{},[4591,129234,4604],{"stretchy":4593},[4591,129236,4609],{},[4600,129238,129239,129241],{},[4596,129240,5009],{},[7077,129242,469],{},[4600,129244,129245,129247],{},[4596,129246,12172],{},[7077,129248,469],{},[4591,129250,7351],{},[4600,129252,129253,129255],{},[4596,129254,5009],{},[7077,129256,472],{},[4600,129258,129259,129261],{},[4596,129260,12172],{},[7077,129262,472],{},[4591,129264,7351],{},[4591,129266,18198],{},[4591,129268,7351],{},[4600,129270,129271,129273],{},[4596,129272,5009],{},[4596,129274,19],{},[4600,129276,129277,129279],{},[4596,129278,12172],{},[4596,129280,19],{},[4647,129282,18729],{"encoding":4649},[78,129284,129286,129349,129444,129539,129557],{"className":129285,"ariaHidden":1419},[4654],[78,129287,129289,129292,129295,129298,129301,129304,129307,129310,129313,129316,129319,129322,129325,129328,129331,129334,129337,129340,129343,129346],{"className":129288},[4658],[78,129290],{"className":129291,"style":18073},[4662],[78,129293,18077],{"className":129294},[4667,4678],[78,129296,18081],{"className":129297,"style":17251},[4667,4678],[78,129299,18027],{"className":129300,"style":17251},[4667],[78,129302,13],{"className":129303},[4667,4678],[78,129305,17132],{"className":129306,"style":17251},[4667,4678],[78,129308,5025],{"className":129309},[4667,4678],[78,129311,5245],{"className":129312},[4667,4678],[78,129314,18038],{"className":129315},[4667,4678],[78,129317,7360],{"className":129318},[4667,4678],[78,129320,5012],{"className":129321},[4667,4678],[78,129323,4594],{"className":129324},[4674],[78,129326,17143],{"className":129327},[4667,4678],[78,129329,2066],{"className":129330},[5126],[78,129332],{"className":129333,"style":4839},[4739],[78,129335,17148],{"className":129336,"style":17276},[4667,4678],[78,129338,4604],{"className":129339},[4682],[78,129341],{"className":129342,"style":4740},[4739],[78,129344,4609],{"className":129345},[4744],[78,129347],{"className":129348,"style":4740},[4739],[78,129350,129352,129355,129395,129435,129438,129441],{"className":129351},[4658],[78,129353],{"className":129354,"style":5260},[4662],[78,129356,129358,129361],{"className":129357},[4667],[78,129359,5009],{"className":129360},[4667,4678],[78,129362,129364],{"className":129363},[4689],[78,129365,129367,129387],{"className":129366},[4693,4694],[78,129368,129370,129384],{"className":129369},[4698],[78,129371,129373],{"className":129372,"style":18264},[4702],[78,129374,129375,129378],{"style":4706},[78,129376],{"className":129377,"style":4711},[4710],[78,129379,129381],{"className":129380},[4715,4716,4717,4718],[78,129382,469],{"className":129383},[4667,4718],[78,129385,4726],{"className":129386},[4725],[78,129388,129390],{"className":129389},[4698],[78,129391,129393],{"className":129392,"style":4733},[4702],[78,129394],{},[78,129396,129398,129401],{"className":129397},[4667],[78,129399,12172],{"className":129400},[4667,4678],[78,129402,129404],{"className":129403},[4689],[78,129405,129407,129427],{"className":129406},[4693,4694],[78,129408,129410,129424],{"className":129409},[4698],[78,129411,129413],{"className":129412,"style":18264},[4702],[78,129414,129415,129418],{"style":4706},[78,129416],{"className":129417,"style":4711},[4710],[78,129419,129421],{"className":129420},[4715,4716,4717,4718],[78,129422,469],{"className":129423},[4667,4718],[78,129425,4726],{"className":129426},[4725],[78,129428,129430],{"className":129429},[4698],[78,129431,129433],{"className":129432,"style":4733},[4702],[78,129434],{},[78,129436],{"className":129437,"style":5143},[4739],[78,129439,7351],{"className":129440},[7450],[78,129442],{"className":129443,"style":5143},[4739],[78,129445,129447,129450,129490,129530,129533,129536],{"className":129446},[4658],[78,129448],{"className":129449,"style":5260},[4662],[78,129451,129453,129456],{"className":129452},[4667],[78,129454,5009],{"className":129455},[4667,4678],[78,129457,129459],{"className":129458},[4689],[78,129460,129462,129482],{"className":129461},[4693,4694],[78,129463,129465,129479],{"className":129464},[4698],[78,129466,129468],{"className":129467,"style":18264},[4702],[78,129469,129470,129473],{"style":4706},[78,129471],{"className":129472,"style":4711},[4710],[78,129474,129476],{"className":129475},[4715,4716,4717,4718],[78,129477,472],{"className":129478},[4667,4718],[78,129480,4726],{"className":129481},[4725],[78,129483,129485],{"className":129484},[4698],[78,129486,129488],{"className":129487,"style":4733},[4702],[78,129489],{},[78,129491,129493,129496],{"className":129492},[4667],[78,129494,12172],{"className":129495},[4667,4678],[78,129497,129499],{"className":129498},[4689],[78,129500,129502,129522],{"className":129501},[4693,4694],[78,129503,129505,129519],{"className":129504},[4698],[78,129506,129508],{"className":129507,"style":18264},[4702],[78,129509,129510,129513],{"style":4706},[78,129511],{"className":129512,"style":4711},[4710],[78,129514,129516],{"className":129515},[4715,4716,4717,4718],[78,129517,472],{"className":129518},[4667,4718],[78,129520,4726],{"className":129521},[4725],[78,129523,129525],{"className":129524},[4698],[78,129526,129528],{"className":129527,"style":4733},[4702],[78,129529],{},[78,129531],{"className":129532,"style":5143},[4739],[78,129534,7351],{"className":129535},[7450],[78,129537],{"className":129538,"style":5143},[4739],[78,129540,129542,129545,129548,129551,129554],{"className":129541},[4658],[78,129543],{"className":129544,"style":18992},[4662],[78,129546,18198],{"className":129547},[18342],[78,129549],{"className":129550,"style":5143},[4739],[78,129552,7351],{"className":129553},[7450],[78,129555],{"className":129556,"style":5143},[4739],[78,129558,129560,129563,129603],{"className":129559},[4658],[78,129561],{"className":129562,"style":5260},[4662],[78,129564,129566,129569],{"className":129565},[4667],[78,129567,5009],{"className":129568},[4667,4678],[78,129570,129572],{"className":129571},[4689],[78,129573,129575,129595],{"className":129574},[4693,4694],[78,129576,129578,129592],{"className":129577},[4698],[78,129579,129581],{"className":129580,"style":5279},[4702],[78,129582,129583,129586],{"style":4706},[78,129584],{"className":129585,"style":4711},[4710],[78,129587,129589],{"className":129588},[4715,4716,4717,4718],[78,129590,19],{"className":129591},[4667,4678,4718],[78,129593,4726],{"className":129594},[4725],[78,129596,129598],{"className":129597},[4698],[78,129599,129601],{"className":129600,"style":4733},[4702],[78,129602],{},[78,129604,129606,129609],{"className":129605},[4667],[78,129607,12172],{"className":129608},[4667,4678],[78,129610,129612],{"className":129611},[4689],[78,129613,129615,129635],{"className":129614},[4693,4694],[78,129616,129618,129632],{"className":129617},[4698],[78,129619,129621],{"className":129620,"style":5279},[4702],[78,129622,129623,129626],{"style":4706},[78,129624],{"className":129625,"style":4711},[4710],[78,129627,129629],{"className":129628},[4715,4716,4717,4718],[78,129630,19],{"className":129631},[4667,4678,4718],[78,129633,4726],{"className":129634},[4725],[78,129636,129638],{"className":129637},[4698],[78,129639,129641],{"className":129640,"style":4733},[4702],[78,129642],{},[13,129644,19093],{},[78,129646,129648],{"className":129647},[4566],[78,129649,129651,129692],{"className":129650},[4570],[78,129652,129654],{"className":129653},[4574],[4576,129655,129656],{"xmlns":4578,"display":4579},[4581,129657,129658,129690],{},[4584,129659,129660,129662,129664,129666,129668,129670,129672,129674,129676,129678,129680,129682,129684,129686,129688],{},[4596,129661,17143],{"mathvariant":17159},[4591,129663,17162],{},[4596,129665,17148],{"mathvariant":17159},[4591,129667,4609],{},[4596,129669,17169],{"mathvariant":7101},[4596,129671,17143],{"mathvariant":17159},[4596,129673,17169],{"mathvariant":7101},[4596,129675,17169],{"mathvariant":7101},[4596,129677,17148],{"mathvariant":17159},[4596,129679,17169],{"mathvariant":7101},[4596,129681,7484],{},[4591,129683,17553],{},[4591,129685,4594],{"stretchy":4593},[4596,129687,17463],{},[4591,129689,4604],{"stretchy":4593},[4647,129691,19141],{"encoding":4649},[78,129693,129695,129713,129731],{"className":129694,"ariaHidden":1419},[4654],[78,129696,129698,129701,129704,129707,129710],{"className":129697},[4658],[78,129699],{"className":129700,"style":17415},[4662],[78,129702,17143],{"className":129703},[4667,17329],[78,129705],{"className":129706,"style":5143},[4739],[78,129708,17162],{"className":129709},[7450],[78,129711],{"className":129712,"style":5143},[4739],[78,129714,129716,129719,129722,129725,129728],{"className":129715},[4658],[78,129717],{"className":129718,"style":17415},[4662],[78,129720,17148],{"className":129721},[4667,17329],[78,129723],{"className":129724,"style":4740},[4739],[78,129726,4609],{"className":129727},[4744],[78,129729],{"className":129730,"style":4740},[4739],[78,129732,129734,129737,129740,129743,129746,129749,129752,129755,129758,129761,129764],{"className":129733},[4658],[78,129735],{"className":129736,"style":4663},[4662],[78,129738,17169],{"className":129739},[4667],[78,129741,17143],{"className":129742},[4667,17329],[78,129744,17333],{"className":129745},[4667],[78,129747,17148],{"className":129748},[4667,17329],[78,129750,17169],{"className":129751},[4667],[78,129753],{"className":129754,"style":4839},[4739],[78,129756,7484],{"className":129757},[4788],[78,129759,4594],{"className":129760},[4674],[78,129762,17463],{"className":129763,"style":17251},[4667,4678],[78,129765,4604],{"className":129766},[4682],[10548,129768,19219],{"id":19219},[13,129770,19222,129771,19226],{},[22,129772,19225],{},[78,129774,129776],{"className":129775},[4566],[78,129777,129779,129916],{"className":129778},[4570],[78,129780,129782],{"className":129781},[4574],[4576,129783,129784],{"xmlns":4578,"display":4579},[4581,129785,129786,129914],{},[4584,129787,129788,129790,129792,129794,129796,129798,129800,129802,129804,129806,129808,129810,129812,129814,129816,129818,129820,129822,129824,129826,129828,129830,129832,129834,129836],{},[4596,129789,4618],{},[4596,129791,18038],{},[4596,129793,7360],{},[4596,129795,7132],{},[4596,129797,39],{},[4596,129799,5245],{},[4596,129801,4618],{},[4596,129803,5009],{},[4596,129805,19],{},[4596,129807,18027],{"mathvariant":7101},[4596,129809,5245],{},[4596,129811,39],{},[4596,129813,262],{},[4596,129815,5012],{},[4596,129817,5009],{},[4596,129819,19],{},[4596,129821,7360],{},[4596,129823,4618],{},[4591,129825,4594],{"stretchy":4593},[4596,129827,17143],{},[4591,129829,2066],{"separator":1419},[4596,129831,17148],{},[4591,129833,4604],{"stretchy":4593},[4591,129835,4609],{},[5669,129837,129838],{},[4584,129839,129840,129842,129848,129850,129856,129862,129864,129866,129872,129874,129880,129886,129888,129890,129892,129894,129900,129902,129908],{},[4591,129841,4594],{"stretchy":4593},[4600,129843,129844,129846],{},[4596,129845,17143],{},[7077,129847,469],{},[4591,129849,17848],{},[4600,129851,129852,129854],{},[4596,129853,17148],{},[7077,129855,469],{},[4614,129857,129858,129860],{},[4591,129859,4604],{"stretchy":4593},[7077,129861,472],{},[4591,129863,7351],{},[4591,129865,4594],{"stretchy":4593},[4600,129867,129868,129870],{},[4596,129869,17143],{},[7077,129871,472],{},[4591,129873,17848],{},[4600,129875,129876,129878],{},[4596,129877,17148],{},[7077,129879,472],{},[4614,129881,129882,129884],{},[4591,129883,4604],{"stretchy":4593},[7077,129885,472],{},[4591,129887,7351],{},[4591,129889,18198],{},[4591,129891,7351],{},[4591,129893,4594],{"stretchy":4593},[4600,129895,129896,129898],{},[4596,129897,17143],{},[4596,129899,19],{},[4591,129901,17848],{},[4600,129903,129904,129906],{},[4596,129905,17148],{},[4596,129907,19],{},[4614,129909,129910,129912],{},[4591,129911,4604],{"stretchy":4593},[7077,129913,472],{},[4647,129915,19370],{"encoding":4649},[78,129917,129919,129997],{"className":129918,"ariaHidden":1419},[4654],[78,129920,129922,129925,129928,129931,129934,129937,129940,129943,129946,129949,129952,129955,129958,129961,129964,129967,129970,129973,129976,129979,129982,129985,129988,129991,129994],{"className":129921},[4658],[78,129923],{"className":129924,"style":18073},[4662],[78,129926,4618],{"className":129927},[4667,4678],[78,129929,18038],{"className":129930},[4667,4678],[78,129932,7360],{"className":129933},[4667,4678],[78,129935,7132],{"className":129936,"style":7300},[4667,4678],[78,129938,39],{"className":129939},[4667,4678],[78,129941,5245],{"className":129942},[4667,4678],[78,129944,4618],{"className":129945},[4667,4678],[78,129947,19404],{"className":129948},[4667,4678],[78,129950,18027],{"className":129951,"style":17251},[4667],[78,129953,5245],{"className":129954},[4667,4678],[78,129956,39],{"className":129957},[4667,4678],[78,129959,262],{"className":129960},[4667,4678],[78,129962,5012],{"className":129963},[4667,4678],[78,129965,19404],{"className":129966},[4667,4678],[78,129968,19426],{"className":129969},[4667,4678],[78,129971,4594],{"className":129972},[4674],[78,129974,17143],{"className":129975},[4667,4678],[78,129977,2066],{"className":129978},[5126],[78,129980],{"className":129981,"style":4839},[4739],[78,129983,17148],{"className":129984,"style":17276},[4667,4678],[78,129986,4604],{"className":129987},[4682],[78,129989],{"className":129990,"style":4740},[4739],[78,129992,4609],{"className":129993},[4744],[78,129995],{"className":129996,"style":4740},[4739],[78,129998,130000,130003],{"className":129999},[4658],[78,130001],{"className":130002,"style":19460},[4662],[78,130004,130006],{"className":130005},[4667,5809],[78,130007,130009,130432],{"className":130008},[4693,4694],[78,130010,130012,130429],{"className":130011},[4698],[78,130013,130015,130417],{"className":130014,"style":19473},[4702],[78,130016,130018,130021],{"className":130017,"style":19477},[5823],[78,130019],{"className":130020,"style":19481},[4710],[78,130022,130024,130027,130067,130070,130073,130076,130116,130145,130148,130151,130154,130157,130197,130200,130203,130206,130246,130275,130278,130281,130284,130287,130290,130293,130296,130299,130339,130342,130345,130348,130388],{"className":130023,"style":19485},[4667],[78,130025,4594],{"className":130026},[4674],[78,130028,130030,130033],{"className":130029},[4667],[78,130031,17143],{"className":130032},[4667,4678],[78,130034,130036],{"className":130035},[4689],[78,130037,130039,130059],{"className":130038},[4693,4694],[78,130040,130042,130056],{"className":130041},[4698],[78,130043,130045],{"className":130044,"style":18264},[4702],[78,130046,130047,130050],{"style":4706},[78,130048],{"className":130049,"style":4711},[4710],[78,130051,130053],{"className":130052},[4715,4716,4717,4718],[78,130054,469],{"className":130055},[4667,4718],[78,130057,4726],{"className":130058},[4725],[78,130060,130062],{"className":130061},[4698],[78,130063,130065],{"className":130064,"style":4733},[4702],[78,130066],{},[78,130068],{"className":130069,"style":5143},[4739],[78,130071,17848],{"className":130072},[7450],[78,130074],{"className":130075,"style":5143},[4739],[78,130077,130079,130082],{"className":130078},[4667],[78,130080,17148],{"className":130081,"style":17276},[4667,4678],[78,130083,130085],{"className":130084},[4689],[78,130086,130088,130108],{"className":130087},[4693,4694],[78,130089,130091,130105],{"className":130090},[4698],[78,130092,130094],{"className":130093,"style":18264},[4702],[78,130095,130096,130099],{"style":19558},[78,130097],{"className":130098,"style":4711},[4710],[78,130100,130102],{"className":130101},[4715,4716,4717,4718],[78,130103,469],{"className":130104},[4667,4718],[78,130106,4726],{"className":130107},[4725],[78,130109,130111],{"className":130110},[4698],[78,130112,130114],{"className":130113,"style":4733},[4702],[78,130115],{},[78,130117,130119,130122],{"className":130118},[4682],[78,130120,4604],{"className":130121},[4682],[78,130123,130125],{"className":130124},[4689],[78,130126,130128],{"className":130127},[4693],[78,130129,130131],{"className":130130},[4698],[78,130132,130134],{"className":130133,"style":19597},[4702],[78,130135,130136,130139],{"style":19600},[78,130137],{"className":130138,"style":4711},[4710],[78,130140,130142],{"className":130141},[4715,4716,4717,4718],[78,130143,472],{"className":130144},[4667,4718],[78,130146],{"className":130147,"style":5143},[4739],[78,130149,7351],{"className":130150},[7450],[78,130152],{"className":130153,"style":5143},[4739],[78,130155,4594],{"className":130156},[4674],[78,130158,130160,130163],{"className":130159},[4667],[78,130161,17143],{"className":130162},[4667,4678],[78,130164,130166],{"className":130165},[4689],[78,130167,130169,130189],{"className":130168},[4693,4694],[78,130170,130172,130186],{"className":130171},[4698],[78,130173,130175],{"className":130174,"style":18264},[4702],[78,130176,130177,130180],{"style":4706},[78,130178],{"className":130179,"style":4711},[4710],[78,130181,130183],{"className":130182},[4715,4716,4717,4718],[78,130184,472],{"className":130185},[4667,4718],[78,130187,4726],{"className":130188},[4725],[78,130190,130192],{"className":130191},[4698],[78,130193,130195],{"className":130194,"style":4733},[4702],[78,130196],{},[78,130198],{"className":130199,"style":5143},[4739],[78,130201,17848],{"className":130202},[7450],[78,130204],{"className":130205,"style":5143},[4739],[78,130207,130209,130212],{"className":130208},[4667],[78,130210,17148],{"className":130211,"style":17276},[4667,4678],[78,130213,130215],{"className":130214},[4689],[78,130216,130218,130238],{"className":130217},[4693,4694],[78,130219,130221,130235],{"className":130220},[4698],[78,130222,130224],{"className":130223,"style":18264},[4702],[78,130225,130226,130229],{"style":19558},[78,130227],{"className":130228,"style":4711},[4710],[78,130230,130232],{"className":130231},[4715,4716,4717,4718],[78,130233,472],{"className":130234},[4667,4718],[78,130236,4726],{"className":130237},[4725],[78,130239,130241],{"className":130240},[4698],[78,130242,130244],{"className":130243,"style":4733},[4702],[78,130245],{},[78,130247,130249,130252],{"className":130248},[4682],[78,130250,4604],{"className":130251},[4682],[78,130253,130255],{"className":130254},[4689],[78,130256,130258],{"className":130257},[4693],[78,130259,130261],{"className":130260},[4698],[78,130262,130264],{"className":130263,"style":19597},[4702],[78,130265,130266,130269],{"style":19600},[78,130267],{"className":130268,"style":4711},[4710],[78,130270,130272],{"className":130271},[4715,4716,4717,4718],[78,130273,472],{"className":130274},[4667,4718],[78,130276],{"className":130277,"style":5143},[4739],[78,130279,7351],{"className":130280},[7450],[78,130282],{"className":130283,"style":5143},[4739],[78,130285,18198],{"className":130286},[18342],[78,130288],{"className":130289,"style":5143},[4739],[78,130291,7351],{"className":130292},[7450],[78,130294],{"className":130295,"style":5143},[4739],[78,130297,4594],{"className":130298},[4674],[78,130300,130302,130305],{"className":130301},[4667],[78,130303,17143],{"className":130304},[4667,4678],[78,130306,130308],{"className":130307},[4689],[78,130309,130311,130331],{"className":130310},[4693,4694],[78,130312,130314,130328],{"className":130313},[4698],[78,130315,130317],{"className":130316,"style":5279},[4702],[78,130318,130319,130322],{"style":4706},[78,130320],{"className":130321,"style":4711},[4710],[78,130323,130325],{"className":130324},[4715,4716,4717,4718],[78,130326,19],{"className":130327},[4667,4678,4718],[78,130329,4726],{"className":130330},[4725],[78,130332,130334],{"className":130333},[4698],[78,130335,130337],{"className":130336,"style":4733},[4702],[78,130338],{},[78,130340],{"className":130341,"style":5143},[4739],[78,130343,17848],{"className":130344},[7450],[78,130346],{"className":130347,"style":5143},[4739],[78,130349,130351,130354],{"className":130350},[4667],[78,130352,17148],{"className":130353,"style":17276},[4667,4678],[78,130355,130357],{"className":130356},[4689],[78,130358,130360,130380],{"className":130359},[4693,4694],[78,130361,130363,130377],{"className":130362},[4698],[78,130364,130366],{"className":130365,"style":5279},[4702],[78,130367,130368,130371],{"style":19558},[78,130369],{"className":130370,"style":4711},[4710],[78,130372,130374],{"className":130373},[4715,4716,4717,4718],[78,130375,19],{"className":130376},[4667,4678,4718],[78,130378,4726],{"className":130379},[4725],[78,130381,130383],{"className":130382},[4698],[78,130384,130386],{"className":130385,"style":4733},[4702],[78,130387],{},[78,130389,130391,130394],{"className":130390},[4682],[78,130392,4604],{"className":130393},[4682],[78,130395,130397],{"className":130396},[4689],[78,130398,130400],{"className":130399},[4693],[78,130401,130403],{"className":130402},[4698],[78,130404,130406],{"className":130405,"style":19597},[4702],[78,130407,130408,130411],{"style":19600},[78,130409],{"className":130410,"style":4711},[4710],[78,130412,130414],{"className":130413},[4715,4716,4717,4718],[78,130415,472],{"className":130416},[4667,4718],[78,130418,130419,130422],{"style":19884},[78,130420],{"className":130421,"style":19481},[4710],[78,130423,130425],{"className":130424,"style":19891},[5881],[5884,130426,130427],{"xmlns":5886,"width":5887,"height":19894,"viewBox":19895,"preserveAspectRatio":5890},[5892,130428],{"d":19898},[78,130430,4726],{"className":130431},[4725],[78,130433,130435],{"className":130434},[4698],[78,130436,130438],{"className":130437,"style":19908},[4702],[78,130439],{},[13,130441,17388,130442,1018,130672,20375,130902,1018,130971,17770,131040,1018,131068,20573,131096,20603],{},[78,130443,130445,130492],{"className":130444},[4570],[78,130446,130448],{"className":130447},[4574],[4576,130449,130450],{"xmlns":4578},[4581,130451,130452,130490],{},[4584,130453,130454,130456,130458,130460,130466,130468,130474,130476,130478,130480,130482,130488],{},[4596,130455,17143],{},[4591,130457,4609],{},[4591,130459,4594],{"stretchy":4593},[4600,130461,130462,130464],{},[4596,130463,17143],{},[7077,130465,469],{},[4591,130467,2066],{"separator":1419},[4600,130469,130470,130472],{},[4596,130471,17143],{},[7077,130473,472],{},[4591,130475,2066],{"separator":1419},[4591,130477,18198],{},[4587,130479,18201],{},[4591,130481,2066],{"separator":1419},[4600,130483,130484,130486],{},[4596,130485,17143],{},[4596,130487,19],{},[4591,130489,4604],{"stretchy":4593},[4647,130491,19963],{"encoding":4649},[78,130493,130495,130513],{"className":130494,"ariaHidden":1419},[4654],[78,130496,130498,130501,130504,130507,130510],{"className":130497},[4658],[78,130499],{"className":130500,"style":18224},[4662],[78,130502,17143],{"className":130503},[4667,4678],[78,130505],{"className":130506,"style":4740},[4739],[78,130508,4609],{"className":130509},[4744],[78,130511],{"className":130512,"style":4740},[4739],[78,130514,130516,130519,130522,130562,130565,130568,130608,130611,130614,130617,130620,130623,130626,130629,130669],{"className":130515},[4658],[78,130517],{"className":130518,"style":4663},[4662],[78,130520,4594],{"className":130521},[4674],[78,130523,130525,130528],{"className":130524},[4667],[78,130526,17143],{"className":130527},[4667,4678],[78,130529,130531],{"className":130530},[4689],[78,130532,130534,130554],{"className":130533},[4693,4694],[78,130535,130537,130551],{"className":130536},[4698],[78,130538,130540],{"className":130539,"style":18264},[4702],[78,130541,130542,130545],{"style":4706},[78,130543],{"className":130544,"style":4711},[4710],[78,130546,130548],{"className":130547},[4715,4716,4717,4718],[78,130549,469],{"className":130550},[4667,4718],[78,130552,4726],{"className":130553},[4725],[78,130555,130557],{"className":130556},[4698],[78,130558,130560],{"className":130559,"style":4733},[4702],[78,130561],{},[78,130563,2066],{"className":130564},[5126],[78,130566],{"className":130567,"style":4839},[4739],[78,130569,130571,130574],{"className":130570},[4667],[78,130572,17143],{"className":130573},[4667,4678],[78,130575,130577],{"className":130576},[4689],[78,130578,130580,130600],{"className":130579},[4693,4694],[78,130581,130583,130597],{"className":130582},[4698],[78,130584,130586],{"className":130585,"style":18264},[4702],[78,130587,130588,130591],{"style":4706},[78,130589],{"className":130590,"style":4711},[4710],[78,130592,130594],{"className":130593},[4715,4716,4717,4718],[78,130595,472],{"className":130596},[4667,4718],[78,130598,4726],{"className":130599},[4725],[78,130601,130603],{"className":130602},[4698],[78,130604,130606],{"className":130605,"style":4733},[4702],[78,130607],{},[78,130609,2066],{"className":130610},[5126],[78,130612],{"className":130613,"style":4839},[4739],[78,130615,18198],{"className":130616},[18342],[78,130618],{"className":130619,"style":4839},[4739],[78,130621],{"className":130622,"style":4839},[4739],[78,130624,2066],{"className":130625},[5126],[78,130627],{"className":130628,"style":4839},[4739],[78,130630,130632,130635],{"className":130631},[4667],[78,130633,17143],{"className":130634},[4667,4678],[78,130636,130638],{"className":130637},[4689],[78,130639,130641,130661],{"className":130640},[4693,4694],[78,130642,130644,130658],{"className":130643},[4698],[78,130645,130647],{"className":130646,"style":5279},[4702],[78,130648,130649,130652],{"style":4706},[78,130650],{"className":130651,"style":4711},[4710],[78,130653,130655],{"className":130654},[4715,4716,4717,4718],[78,130656,19],{"className":130657},[4667,4678,4718],[78,130659,4726],{"className":130660},[4725],[78,130662,130664],{"className":130663},[4698],[78,130665,130667],{"className":130666,"style":4733},[4702],[78,130668],{},[78,130670,4604],{"className":130671},[4682],[78,130673,130675,130722],{"className":130674},[4570],[78,130676,130678],{"className":130677},[4574],[4576,130679,130680],{"xmlns":4578},[4581,130681,130682,130720],{},[4584,130683,130684,130686,130688,130690,130696,130698,130704,130706,130708,130710,130712,130718],{},[4596,130685,17148],{},[4591,130687,4609],{},[4591,130689,4594],{"stretchy":4593},[4600,130691,130692,130694],{},[4596,130693,17148],{},[7077,130695,469],{},[4591,130697,2066],{"separator":1419},[4600,130699,130700,130702],{},[4596,130701,17148],{},[7077,130703,472],{},[4591,130705,2066],{"separator":1419},[4591,130707,18198],{},[4587,130709,18201],{},[4591,130711,2066],{"separator":1419},[4600,130713,130714,130716],{},[4596,130715,17148],{},[4596,130717,19],{},[4591,130719,4604],{"stretchy":4593},[4647,130721,20194],{"encoding":4649},[78,130723,130725,130743],{"className":130724,"ariaHidden":1419},[4654],[78,130726,130728,130731,130734,130737,130740],{"className":130727},[4658],[78,130729],{"className":130730,"style":18224},[4662],[78,130732,17148],{"className":130733,"style":17276},[4667,4678],[78,130735],{"className":130736,"style":4740},[4739],[78,130738,4609],{"className":130739},[4744],[78,130741],{"className":130742,"style":4740},[4739],[78,130744,130746,130749,130752,130792,130795,130798,130838,130841,130844,130847,130850,130853,130856,130859,130899],{"className":130745},[4658],[78,130747],{"className":130748,"style":4663},[4662],[78,130750,4594],{"className":130751},[4674],[78,130753,130755,130758],{"className":130754},[4667],[78,130756,17148],{"className":130757,"style":17276},[4667,4678],[78,130759,130761],{"className":130760},[4689],[78,130762,130764,130784],{"className":130763},[4693,4694],[78,130765,130767,130781],{"className":130766},[4698],[78,130768,130770],{"className":130769,"style":18264},[4702],[78,130771,130772,130775],{"style":19558},[78,130773],{"className":130774,"style":4711},[4710],[78,130776,130778],{"className":130777},[4715,4716,4717,4718],[78,130779,469],{"className":130780},[4667,4718],[78,130782,4726],{"className":130783},[4725],[78,130785,130787],{"className":130786},[4698],[78,130788,130790],{"className":130789,"style":4733},[4702],[78,130791],{},[78,130793,2066],{"className":130794},[5126],[78,130796],{"className":130797,"style":4839},[4739],[78,130799,130801,130804],{"className":130800},[4667],[78,130802,17148],{"className":130803,"style":17276},[4667,4678],[78,130805,130807],{"className":130806},[4689],[78,130808,130810,130830],{"className":130809},[4693,4694],[78,130811,130813,130827],{"className":130812},[4698],[78,130814,130816],{"className":130815,"style":18264},[4702],[78,130817,130818,130821],{"style":19558},[78,130819],{"className":130820,"style":4711},[4710],[78,130822,130824],{"className":130823},[4715,4716,4717,4718],[78,130825,472],{"className":130826},[4667,4718],[78,130828,4726],{"className":130829},[4725],[78,130831,130833],{"className":130832},[4698],[78,130834,130836],{"className":130835,"style":4733},[4702],[78,130837],{},[78,130839,2066],{"className":130840},[5126],[78,130842],{"className":130843,"style":4839},[4739],[78,130845,18198],{"className":130846},[18342],[78,130848],{"className":130849,"style":4839},[4739],[78,130851],{"className":130852,"style":4839},[4739],[78,130854,2066],{"className":130855},[5126],[78,130857],{"className":130858,"style":4839},[4739],[78,130860,130862,130865],{"className":130861},[4667],[78,130863,17148],{"className":130864,"style":17276},[4667,4678],[78,130866,130868],{"className":130867},[4689],[78,130869,130871,130891],{"className":130870},[4693,4694],[78,130872,130874,130888],{"className":130873},[4698],[78,130875,130877],{"className":130876,"style":5279},[4702],[78,130878,130879,130882],{"style":19558},[78,130880],{"className":130881,"style":4711},[4710],[78,130883,130885],{"className":130884},[4715,4716,4717,4718],[78,130886,19],{"className":130887},[4667,4678,4718],[78,130889,4726],{"className":130890},[4725],[78,130892,130894],{"className":130893},[4698],[78,130895,130897],{"className":130896,"style":4733},[4702],[78,130898],{},[78,130900,4604],{"className":130901},[4682],[78,130903,130905,130922],{"className":130904},[4570],[78,130906,130908],{"className":130907},[4574],[4576,130909,130910],{"xmlns":4578},[4581,130911,130912,130920],{},[4584,130913,130914],{},[4600,130915,130916,130918],{},[4596,130917,17143],{},[4596,130919,39],{},[4647,130921,20396],{"encoding":4649},[78,130923,130925],{"className":130924,"ariaHidden":1419},[4654],[78,130926,130928,130931],{"className":130927},[4658],[78,130929],{"className":130930,"style":20406},[4662],[78,130932,130934,130937],{"className":130933},[4667],[78,130935,17143],{"className":130936},[4667,4678],[78,130938,130940],{"className":130939},[4689],[78,130941,130943,130963],{"className":130942},[4693,4694],[78,130944,130946,130960],{"className":130945},[4698],[78,130947,130949],{"className":130948,"style":4703},[4702],[78,130950,130951,130954],{"style":4706},[78,130952],{"className":130953,"style":4711},[4710],[78,130955,130957],{"className":130956},[4715,4716,4717,4718],[78,130958,39],{"className":130959},[4667,4678,4718],[78,130961,4726],{"className":130962},[4725],[78,130964,130966],{"className":130965},[4698],[78,130967,130969],{"className":130968,"style":4733},[4702],[78,130970],{},[78,130972,130974,130991],{"className":130973},[4570],[78,130975,130977],{"className":130976},[4574],[4576,130978,130979],{"xmlns":4578},[4581,130980,130981,130989],{},[4584,130982,130983],{},[4600,130984,130985,130987],{},[4596,130986,17148],{},[4596,130988,39],{},[4647,130990,20467],{"encoding":4649},[78,130992,130994],{"className":130993,"ariaHidden":1419},[4654],[78,130995,130997,131000],{"className":130996},[4658],[78,130998],{"className":130999,"style":20406},[4662],[78,131001,131003,131006],{"className":131002},[4667],[78,131004,17148],{"className":131005,"style":17276},[4667,4678],[78,131007,131009],{"className":131008},[4689],[78,131010,131012,131032],{"className":131011},[4693,4694],[78,131013,131015,131029],{"className":131014},[4698],[78,131016,131018],{"className":131017,"style":4703},[4702],[78,131019,131020,131023],{"style":19558},[78,131021],{"className":131022,"style":4711},[4710],[78,131024,131026],{"className":131025},[4715,4716,4717,4718],[78,131027,39],{"className":131028},[4667,4678,4718],[78,131030,4726],{"className":131031},[4725],[78,131033,131035],{"className":131034},[4698],[78,131036,131038],{"className":131037,"style":4733},[4702],[78,131039],{},[78,131041,131043,131056],{"className":131042},[4570],[78,131044,131046],{"className":131045},[4574],[4576,131047,131048],{"xmlns":4578},[4581,131049,131050,131054],{},[4584,131051,131052],{},[4596,131053,17143],{},[4647,131055,17143],{"encoding":4649},[78,131057,131059],{"className":131058,"ariaHidden":1419},[4654],[78,131060,131062,131065],{"className":131061},[4658],[78,131063],{"className":131064,"style":18224},[4662],[78,131066,17143],{"className":131067},[4667,4678],[78,131069,131071,131084],{"className":131070},[4570],[78,131072,131074],{"className":131073},[4574],[4576,131075,131076],{"xmlns":4578},[4581,131077,131078,131082],{},[4584,131079,131080],{},[4596,131081,17148],{},[4647,131083,17148],{"encoding":4649},[78,131085,131087],{"className":131086,"ariaHidden":1419},[4654],[78,131088,131090,131093],{"className":131089},[4658],[78,131091],{"className":131092,"style":18224},[4662],[78,131094,17148],{"className":131095,"style":17276},[4667,4678],[78,131097,131099,131112],{"className":131098},[4570],[78,131100,131102],{"className":131101},[4574],[4576,131103,131104],{"xmlns":4578},[4581,131105,131106,131110],{},[4584,131107,131108],{},[4596,131109,39],{},[4647,131111,39],{"encoding":4649},[78,131113,131115],{"className":131114,"ariaHidden":1419},[4654],[78,131116,131118,131121],{"className":131117},[4658],[78,131119],{"className":131120,"style":20599},[4662],[78,131122,39],{"className":131123},[4667,4678],[13,131125,20606],{},[7759,131127,20610],{"id":20609},[10548,131129,20613],{"id":20613},[2285,131131,131132,131134,131136,131138],{},[52,131133,20618],{},[52,131135,20621],{},[52,131137,20624],{},[52,131139,20627],{},[10548,131141,20630],{"id":20630},[2285,131143,131144,131146,131148],{},[52,131145,20635],{},[52,131147,20638],{},[52,131149,20641],{},[13,131151,20644],{},[107,131153,20648],{"id":20647},[7759,131155,20651],{"id":20651},[10548,131157,20654],{"id":20654},[13,131159,20657],{},[114,131161,131163],{"className":131162,"code":20661,"language":299},[297],[17,131164,20661],{"__ignoreMap":119},[10548,131166,20666],{"id":20666},[2285,131168,131169,131171],{},[52,131170,20671],{},[52,131172,20674],{},[8366,131174,131175,131191],{},[8369,131176,131177],{},[8372,131178,131179,131181,131183,131185,131187,131189],{},[8375,131180,20683],{},[8375,131182,20686],{},[8375,131184,20689],{},[8375,131186,20692],{},[8375,131188,14455],{},[8375,131190,20697],{},[8386,131192,131193,131219,131249],{},[8372,131194,131195,131197,131199,131205,131211,131217],{},[8391,131196,20704],{},[8391,131198,20707],{},[8391,131200,20710,131201,20713,131203,20716],{},[2996,131202],{},[2996,131204],{},[8391,131206,20719,131207,20722,131209,20725],{},[2996,131208],{},[2996,131210],{},[8391,131212,20728,131213,20731,131215,20734],{},[2996,131214],{},[2996,131216],{},[8391,131218,20737],{},[8372,131220,131221,131223,131225,131231,131237,131243],{},[8391,131222,20742],{},[8391,131224,20745],{},[8391,131226,20748,131227,20751,131229,20754],{},[2996,131228],{},[2996,131230],{},[8391,131232,20757,131233,20760,131235,20763],{},[2996,131234],{},[2996,131236],{},[8391,131238,20766,131239,20769,131241,20772],{},[2996,131240],{},[2996,131242],{},[8391,131244,20775,131245,20778,131247,20781],{},[2996,131246],{},[2996,131248],{},[8372,131250,131251,131253,131255,131261,131267,131273],{},[8391,131252,20786],{},[8391,131254,20789],{},[8391,131256,20792,131257,20795,131259,20798],{},[2996,131258],{},[2996,131260],{},[8391,131262,20801,131263,20804,131265,20807],{},[2996,131264],{},[2996,131266],{},[8391,131268,20766,131269,20812,131271,20815],{},[2996,131270],{},[2996,131272],{},[8391,131274,20818,131275,20821,131277,20824],{},[2996,131276],{},[2996,131278],{},[2285,131280,131281,131283],{"start":138},[52,131282,20829],{},[52,131284,20832],{},[13,131286,20835],{},[49,131288,131289,131291,131293],{},[52,131290,20840],{},[52,131292,20843],{},[52,131294,20846],{},[7759,131296,20849],{"id":20849},[10548,131298,20852],{"id":20852},[13,131300,20855],{},[10548,131302,20858],{"id":20858},[13,131304,20861],{},[10548,131306,20864],{"id":20864},[13,131308,20867],{},[10548,131310,20870],{"id":20870},[13,131312,20873],{},{"title":119,"searchDepth":144,"depth":144,"links":131314},[131315,131320],{"id":16752,"depth":132,"text":16753,"children":131316},[131317,131318,131319],{"id":16756,"depth":144,"text":16756},{"id":17082,"depth":144,"text":17082},{"id":20609,"depth":144,"text":20610},{"id":20647,"depth":132,"text":20648,"children":131321},[131322,131323],{"id":20651,"depth":144,"text":20651},{"id":20849,"depth":144,"text":20849},{},{"title":16745,"description":119},[14968,7744,246,10715,14542],{"id":20893,"title":20894,"assetBase":7,"author":8,"body":131328,"category":16218,"collection":233,"date":21172,"description":21173,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":131563,"navigation":128,"originalPath":239,"path":21175,"seo":131564,"source":243,"stem":21177,"tags":131565,"weight":250,"__hash__":21179},{"type":10,"value":131329,"toc":131560},[131330,131334,131338,131342,131360,131364,131368,131386,131390,131400,131404,131430,131432,131434,131558],[13,131331,20899,131332,20903],{},[22,131333,20902],{},[13,131335,131336],{},[22,131337,293],{},[13,131339,131340],{},[617,131341],{"alt":619,"src":20912},[72,131343,131344],{},[13,131345,131346,16269,131348,20922,131350,1048,131352,20927,131354,20930,131356,20933,131358],{},[22,131347,1040],{},[78,131349,20921],{},[22,131351,1047],{},[22,131353,1051],{},[17,131355,11047],{},[17,131357,469],{},[17,131359,20936],{},[13,131361,131362],{},[22,131363,306],{},[13,131365,131366],{},[617,131367],{"alt":619,"src":20945},[72,131369,131370],{},[13,131371,131372,16269,131374,20954,131376,3233,131378,20927,131380,20930,131382,20933,131384,20966],{},[22,131373,1040],{},[78,131375,20921],{},[22,131377,1047],{},[22,131379,1051],{},[17,131381,11047],{},[17,131383,1014],{},[17,131385,20965],{},[13,131387,131388],{},[22,131389,1265],{},[72,131391,131392],{},[13,131393,131394,16269,131396,20980,131398,1690],{},[22,131395,1040],{},[78,131397,20979],{},[22,131399,1047],{},[13,131401,131402],{},[22,131403,317],{},[49,131405,131406,131410,131414,131420,131424],{},[52,131407,20991,131408,20994],{},[17,131409,13552],{},[52,131411,131412],{},[17,131413,16311],{},[52,131415,21001,131416,1052,131418,285],{},[17,131417,21004],{},[17,131419,1517],{},[52,131421,131422],{},[17,131423,21011],{},[52,131425,131426,1018,131428,21018],{},[17,131427,13],{},[17,131429,5067],{},[107,131431,109],{"id":109},[13,131433,112],{},[114,131435,131436],{"className":116,"code":21025,"language":118,"meta":119,"style":119},[17,131437,131438,131442,131446,131450,131454,131458,131462,131466,131470,131474,131478,131482,131486,131490,131494,131498,131502,131506,131510,131514,131518,131522,131526,131530,131534,131538,131542,131546,131550,131554],{"__ignoreMap":119},[78,131439,131440],{"class":124,"line":125},[78,131441,129],{"emptyLinePlaceholder":128},[78,131443,131444],{"class":124,"line":132},[78,131445,16084],{},[78,131447,131448],{"class":124,"line":138},[78,131449,16089],{},[78,131451,131452],{"class":124,"line":144},[78,131453,21044],{},[78,131455,131456],{"class":124,"line":150},[78,131457,21049],{},[78,131459,131460],{"class":124,"line":156},[78,131461,21054],{},[78,131463,131464],{"class":124,"line":162},[78,131465,21059],{},[78,131467,131468],{"class":124,"line":168},[78,131469,129],{"emptyLinePlaceholder":128},[78,131471,131472],{"class":124,"line":174},[78,131473,135],{},[78,131475,131476],{"class":124,"line":180},[78,131477,21072],{},[78,131479,131480],{"class":124,"line":186},[78,131481,21077],{},[78,131483,131484],{"class":124,"line":192},[78,131485,21082],{},[78,131487,131488],{"class":124,"line":198},[78,131489,21087],{},[78,131491,131492],{"class":124,"line":204},[78,131493,21092],{},[78,131495,131496],{"class":124,"line":210},[78,131497,21097],{},[78,131499,131500],{"class":124,"line":216},[78,131501,21102],{},[78,131503,131504],{"class":124,"line":222},[78,131505,21107],{},[78,131507,131508],{"class":124,"line":421},[78,131509,129],{"emptyLinePlaceholder":128},[78,131511,131512],{"class":124,"line":427},[78,131513,21116],{},[78,131515,131516],{"class":124,"line":433},[78,131517,21097],{},[78,131519,131520],{"class":124,"line":2443},[78,131521,699],{},[78,131523,131524],{"class":124,"line":2448},[78,131525,21129],{},[78,131527,131528],{"class":124,"line":2454},[78,131529,1359],{},[78,131531,131532],{"class":124,"line":2460},[78,131533,21138],{},[78,131535,131536],{"class":124,"line":2465},[78,131537,207],{},[78,131539,131540],{"class":124,"line":2470},[78,131541,21147],{},[78,131543,131544],{"class":124,"line":2903},[78,131545,21152],{},[78,131547,131548],{"class":124,"line":2909},[78,131549,21157],{},[78,131551,131552],{"class":124,"line":11477},[78,131553,21162],{},[78,131555,131556],{"class":124,"line":13374},[78,131557,207],{},[226,131559,228],{},{"title":119,"searchDepth":144,"depth":144,"links":131561},[131562],{"id":109,"depth":132,"text":109},{},{"title":20894,"description":21173},[246,16226,16227],{"id":21181,"title":21182,"assetBase":7,"author":8,"body":131567,"category":21464,"collection":233,"date":21172,"description":21465,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":131806,"navigation":128,"originalPath":239,"path":21467,"seo":131807,"source":243,"stem":21469,"tags":131808,"weight":250,"__hash__":21472},{"type":10,"value":131568,"toc":131803},[131569,131577,131583,131587,131591,131611,131615,131629,131633,131645,131649,131669,131671,131673,131801],[13,131570,21187,131571,21190,131573,21194,131575,21197],{},[22,131572,16239],{},[22,131574,21193],{},[22,131576,21193],{},[2285,131578,131579,131581],{},[52,131580,21202],{},[52,131582,21205],{},[13,131584,131585],{},[22,131586,70],{},[13,131588,131589],{},[617,131590],{"alt":619,"src":21214},[72,131592,131593],{},[13,131594,131595,16269,131597,21224,131599,131601,131603,21232,131605,21235,131607,11315,131609],{},[22,131596,1040],{},[78,131598,21223],{},[22,131600,1047],{},[78,131602,21229],{},[22,131604,1051],{},[78,131606,21229],{},[78,131608,21238],{},[617,131610],{"alt":619,"src":21241},[13,131612,131613],{},[22,131614,635],{},[72,131616,131617],{},[13,131618,131619,16269,131621,21254,131623,1052,131625,131627,21261],{},[22,131620,1433],{},[78,131622,21223],{},[22,131624,1440],{},[78,131626,21223],{},[22,131628,1444],{},[13,131630,131631],{},[22,131632,21266],{},[72,131634,131635],{},[13,131636,131637,16269,131639,21254,131641,1052,131643],{},[22,131638,1433],{},[78,131640],{},[22,131642,1440],{},[78,131644],{},[13,131646,131647],{},[22,131648,88],{},[49,131650,131651,131655,131659,131661,131665],{},[52,131652,21287,131653,21291],{},[17,131654,21290],{},[52,131656,131657],{},[17,131658,21296],{},[52,131660,21299],{},[52,131662,131663,21304],{},[17,131664,16239],{},[52,131666,131667],{},[17,131668,21309],{},[107,131670,109],{"id":109},[13,131672,112],{},[114,131674,131675],{"className":116,"code":21316,"language":118,"meta":119,"style":119},[17,131676,131677,131681,131685,131689,131693,131697,131701,131705,131709,131713,131717,131721,131725,131729,131733,131737,131741,131745,131749,131753,131757,131761,131765,131769,131773,131777,131781,131785,131789,131793,131797],{"__ignoreMap":119},[78,131678,131679],{"class":124,"line":125},[78,131680,129],{"emptyLinePlaceholder":128},[78,131682,131683],{"class":124,"line":132},[78,131684,16084],{},[78,131686,131687],{"class":124,"line":138},[78,131688,16089],{},[78,131690,131691],{"class":124,"line":144},[78,131692,16094],{},[78,131694,131695],{"class":124,"line":150},[78,131696,13255],{},[78,131698,131699],{"class":124,"line":156},[78,131700,16103],{},[78,131702,131703],{"class":124,"line":162},[78,131704,16108],{},[78,131706,131707],{"class":124,"line":168},[78,131708,135],{},[78,131710,131711],{"class":124,"line":174},[78,131712,21355],{},[78,131714,131715],{"class":124,"line":180},[78,131716,21360],{},[78,131718,131719],{"class":124,"line":186},[78,131720,16367],{},[78,131722,131723],{"class":124,"line":192},[78,131724,13871],{},[78,131726,131727],{"class":124,"line":198},[78,131728,21373],{},[78,131730,131731],{"class":124,"line":204},[78,131732,21378],{},[78,131734,131735],{"class":124,"line":210},[78,131736,21383],{},[78,131738,131739],{"class":124,"line":216},[78,131740,21388],{},[78,131742,131743],{"class":124,"line":222},[78,131744,15844],{},[78,131746,131747],{"class":124,"line":421},[78,131748,21397],{},[78,131750,131751],{"class":124,"line":427},[78,131752,21402],{},[78,131754,131755],{"class":124,"line":433},[78,131756,699],{},[78,131758,131759],{"class":124,"line":2443},[78,131760,21411],{},[78,131762,131763],{"class":124,"line":2448},[78,131764,21416],{},[78,131766,131767],{"class":124,"line":2454},[78,131768,21421],{},[78,131770,131771],{"class":124,"line":2460},[78,131772,21426],{},[78,131774,131775],{"class":124,"line":2465},[78,131776,21431],{},[78,131778,131779],{"class":124,"line":2470},[78,131780,21436],{},[78,131782,131783],{"class":124,"line":2903},[78,131784,207],{},[78,131786,131787],{"class":124,"line":2909},[78,131788,16440],{},[78,131790,131791],{"class":124,"line":11477},[78,131792,21449],{},[78,131794,131795],{"class":124,"line":13374},[78,131796,21454],{},[78,131798,131799],{"class":124,"line":13380},[78,131800,207],{},[226,131802,228],{},{"title":119,"searchDepth":144,"depth":144,"links":131804},[131805],{"id":109,"depth":132,"text":109},{},{"title":21182,"description":21465},[246,16226,21471],{"id":21474,"title":21475,"assetBase":7,"author":8,"body":131810,"category":21709,"collection":233,"date":21710,"description":21711,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":132001,"navigation":128,"originalPath":239,"path":21713,"seo":132002,"source":243,"stem":21715,"tags":132003,"weight":250,"__hash__":21717},{"type":10,"value":131811,"toc":131998},[131812,131836,131840,131856,131860,131876,131880,131908,131910,131912,131996],[13,131813,21480,131814,21483,131816,21486,131818,21489,131820,21492,131822,21496,131824,21500,131826,21504,131828,21507,131830,21511,131832,21514,131834,67],{},[17,131815,19],{},[17,131817,2949],{},[17,131819,63],{},[17,131821,2949],{},[22,131823,21495],{},[17,131825,21499],{},[17,131827,21503],{},[17,131829,39],{},[22,131831,21510],{},[17,131833,1419],{},[17,131835,4593],{},[13,131837,131838],{},[22,131839,293],{},[72,131841,131842],{},[13,131843,131844,21527,131846,2066,131848,2066,131850,2070,131852,1441,131854,21538],{},[22,131845,1040],{},[78,131847,472],{},[78,131849,1025],{},[78,131851],{},[22,131853,1047],{},[22,131855,1051],{},[13,131857,131858],{},[22,131859,306],{},[72,131861,131862],{},[13,131863,131864,21549,131866,2066,131868,2066,131870,2070,131872,2542,131874,21561],{},[22,131865,1040],{},[78,131867,21552],{},[78,131869,472],{},[78,131871,2949],{},[22,131873,1047],{},[22,131875,1051],{},[13,131877,131878],{},[22,131879,317],{},[49,131881,131882,131886,131890,131894,131898,131902],{},[52,131883,131884],{},[17,131885,21572],{},[52,131887,131888],{},[17,131889,21577],{},[52,131891,131892],{},[17,131893,21582],{},[52,131895,131896],{},[17,131897,21587],{},[52,131899,131900],{},[17,131901,21592],{},[52,131903,21001,131904,21597,131906],{},[17,131905,21503],{},[22,131907,1517],{},[107,131909,109],{"id":109},[13,131911,112],{},[114,131913,131914],{"className":116,"code":21606,"language":118,"meta":119,"style":119},[17,131915,131916,131920,131924,131928,131932,131936,131940,131944,131948,131952,131956,131960,131964,131968,131972,131976,131980,131984,131988,131992],{"__ignoreMap":119},[78,131917,131918],{"class":124,"line":125},[78,131919,129],{"emptyLinePlaceholder":128},[78,131921,131922],{"class":124,"line":132},[78,131923,135],{},[78,131925,131926],{"class":124,"line":138},[78,131927,21621],{},[78,131929,131930],{"class":124,"line":144},[78,131931,21626],{},[78,131933,131934],{"class":124,"line":150},[78,131935,21631],{},[78,131937,131938],{"class":124,"line":156},[78,131939,21636],{},[78,131941,131942],{"class":124,"line":162},[78,131943,21641],{},[78,131945,131946],{"class":124,"line":168},[78,131947,21646],{},[78,131949,131950],{"class":124,"line":174},[78,131951,21651],{},[78,131953,131954],{"class":124,"line":180},[78,131955,21656],{},[78,131957,131958],{"class":124,"line":186},[78,131959,21661],{},[78,131961,131962],{"class":124,"line":192},[78,131963,21666],{},[78,131965,131966],{"class":124,"line":198},[78,131967,21671],{},[78,131969,131970],{"class":124,"line":204},[78,131971,21676],{},[78,131973,131974],{"class":124,"line":210},[78,131975,21681],{},[78,131977,131978],{"class":124,"line":216},[78,131979,21686],{},[78,131981,131982],{"class":124,"line":222},[78,131983,207],{},[78,131985,131986],{"class":124,"line":421},[78,131987,21695],{},[78,131989,131990],{"class":124,"line":427},[78,131991,1592],{},[78,131993,131994],{"class":124,"line":433},[78,131995,207],{},[226,131997,228],{},{"title":119,"searchDepth":144,"depth":144,"links":131999},[132000],{"id":109,"depth":132,"text":109},{},{"title":21475,"description":21711},[246,16227,1192],{"id":21719,"title":21720,"assetBase":7,"author":8,"body":132005,"category":21709,"collection":233,"date":21710,"description":21978,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":132218,"navigation":128,"originalPath":239,"path":21980,"seo":132219,"source":243,"stem":21982,"tags":132220,"weight":250,"__hash__":21984},{"type":10,"value":132006,"toc":132215},[132007,132039,132043,132047,132059,132063,132067,132079,132083,132113,132115,132117,132213],[13,132008,21480,132009,21727,132011,21730,132013,21733,132015,21730,132017,21738,132019,21730,132021,21743,132023,21747,132025,21750,132027,10730,132029,21757,132031,21760,132033,21763,132035,21767,132037,21770],{},[17,132010,19],{},[17,132012,5009],{},[17,132014,12172],{},[17,132016,12172],{},[17,132018,7360],{},[17,132020,5009],{},[17,132022,7360],{},[22,132024,21746],{},[17,132026,12371],{},[17,132028,21753],{},[17,132030,21756],{},[17,132032,39],{},[17,132034,4635],{},[17,132036,21766],{},[22,132038,21746],{},[13,132040,132041],{},[22,132042,293],{},[13,132044,132045],{},[617,132046],{"alt":619,"src":21779},[72,132048,132049],{},[13,132050,132051,21786,132053,2066,132055,2070,132057,3639],{},[22,132052,1040],{},[78,132054,21789],{},[78,132056,21792],{},[22,132058,1047],{},[13,132060,132061],{},[22,132062,306],{},[13,132064,132065],{},[617,132066],{"alt":619,"src":21803},[72,132068,132069],{},[13,132070,132071,21810,132073,2066,132075,2070,132077,2994],{},[22,132072,1040],{},[78,132074,21813],{},[78,132076,21792],{},[22,132078,1047],{},[13,132080,132081],{},[22,132082,317],{},[49,132084,132085,132089,132093,132097,132105,132109],{},[52,132086,132087],{},[17,132088,12484],{},[52,132090,132091],{},[17,132092,21832],{},[52,132094,132095],{},[17,132096,21837],{},[52,132098,132099,3848,132101,275,132103],{},[17,132100,21842],{},[17,132102,469],{},[17,132104,2949],{},[52,132106,132107],{},[17,132108,21851],{},[52,132110,132111],{},[17,132112,21856],{},[107,132114,109],{"id":109},[13,132116,112],{},[114,132118,132119],{"className":116,"code":21863,"language":118,"meta":119,"style":119},[17,132120,132121,132125,132129,132133,132137,132141,132145,132149,132153,132157,132161,132165,132169,132173,132177,132181,132185,132189,132193,132197,132201,132205,132209],{"__ignoreMap":119},[78,132122,132123],{"class":124,"line":125},[78,132124,129],{"emptyLinePlaceholder":128},[78,132126,132127],{"class":124,"line":132},[78,132128,135],{},[78,132130,132131],{"class":124,"line":138},[78,132132,21878],{},[78,132134,132135],{"class":124,"line":144},[78,132136,21883],{},[78,132138,132139],{"class":124,"line":150},[78,132140,21888],{},[78,132142,132143],{"class":124,"line":156},[78,132144,21893],{},[78,132146,132147],{"class":124,"line":162},[78,132148,129],{"emptyLinePlaceholder":128},[78,132150,132151],{"class":124,"line":168},[78,132152,21902],{},[78,132154,132155],{"class":124,"line":174},[78,132156,21907],{},[78,132158,132159],{"class":124,"line":180},[78,132160,21912],{},[78,132162,132163],{"class":124,"line":186},[78,132164,21917],{},[78,132166,132167],{"class":124,"line":192},[78,132168,21922],{},[78,132170,132171],{"class":124,"line":198},[78,132172,1359],{},[78,132174,132175],{"class":124,"line":204},[78,132176,21931],{},[78,132178,132179],{"class":124,"line":210},[78,132180,21936],{},[78,132182,132183],{"class":124,"line":216},[78,132184,21941],{},[78,132186,132187],{"class":124,"line":222},[78,132188,21946],{},[78,132190,132191],{"class":124,"line":421},[78,132192,129],{"emptyLinePlaceholder":128},[78,132194,132195],{"class":124,"line":427},[78,132196,21955],{},[78,132198,132199],{"class":124,"line":433},[78,132200,207],{},[78,132202,132203],{"class":124,"line":2443},[78,132204,21964],{},[78,132206,132207],{"class":124,"line":2448},[78,132208,219],{},[78,132210,132211],{"class":124,"line":2454},[78,132212,207],{},[226,132214,228],{},{"title":119,"searchDepth":144,"depth":144,"links":132216},[132217],{"id":109,"depth":132,"text":109},{},{"title":21720,"description":21978},[246,16227,1192],{"id":21986,"title":21987,"assetBase":7,"author":8,"body":132222,"category":21709,"collection":233,"date":21710,"description":22265,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":132455,"navigation":128,"originalPath":239,"path":22267,"seo":132456,"source":243,"stem":22269,"tags":132457,"weight":250,"__hash__":22271},{"type":10,"value":132223,"toc":132452},[132224,132244,132248,132252,132270,132274,132278,132294,132298,132308,132312,132334,132336,132338,132450],[13,132225,132226,21994,132228,21486,132230,22000,132232,22003,132234,22007,132236,22011,132238,21486,132240,22016,132242,22019],{},[17,132227,19],{},[17,132229,2949],{},[17,132231,21999],{},[17,132233,21999],{},[17,132235,22006],{},[17,132237,22010],{},[17,132239,5009],{},[17,132241,12172],{},[22,132243,1915],{},[13,132245,132246],{},[22,132247,293],{},[13,132249,132250],{},[617,132251],{"alt":619,"src":22028},[72,132253,132254],{},[13,132255,132256,22035,132258,2066,132260,2066,132262,2066,132264,2070,132266,1048,132268,22051],{},[22,132257,1040],{},[78,132259,22038],{},[78,132261,1867],{},[78,132263,22043],{},[78,132265,22046],{},[22,132267,1047],{},[22,132269,1051],{},[13,132271,132272],{},[22,132273,306],{},[13,132275,132276],{},[617,132277],{"alt":619,"src":22060},[72,132279,132280],{},[13,132281,132282,22067,132284,2066,132286,2066,132288,2070,132290,1071,132292,22051],{},[22,132283,1040],{},[78,132285,20979],{},[78,132287,22072],{},[78,132289,22075],{},[22,132291,1047],{},[22,132293,1051],{},[13,132295,132296],{},[22,132297,1265],{},[72,132299,132300],{},[13,132301,132302,22090,132304,2070,132306,1277],{},[22,132303,1040],{},[78,132305,22093],{},[22,132307,1047],{},[13,132309,132310],{},[22,132311,317],{},[49,132313,132314,132318,132322,132326,132330],{},[52,132315,132316],{},[17,132317,22106],{},[52,132319,132320],{},[17,132321,22111],{},[52,132323,132324],{},[17,132325,22116],{},[52,132327,132328],{},[17,132329,22121],{},[52,132331,132332],{},[17,132333,22126],{},[107,132335,109],{"id":109},[13,132337,112],{},[114,132339,132340],{"className":116,"code":22133,"language":118,"meta":119,"style":119},[17,132341,132342,132346,132350,132354,132358,132362,132366,132370,132374,132378,132382,132386,132390,132394,132398,132402,132406,132410,132414,132418,132422,132426,132430,132434,132438,132442,132446],{"__ignoreMap":119},[78,132343,132344],{"class":124,"line":125},[78,132345,129],{"emptyLinePlaceholder":128},[78,132347,132348],{"class":124,"line":132},[78,132349,135],{},[78,132351,132352],{"class":124,"line":138},[78,132353,22148],{},[78,132355,132356],{"class":124,"line":144},[78,132357,22153],{},[78,132359,132360],{"class":124,"line":150},[78,132361,22158],{},[78,132363,132364],{"class":124,"line":156},[78,132365,22163],{},[78,132367,132368],{"class":124,"line":162},[78,132369,22168],{},[78,132371,132372],{"class":124,"line":168},[78,132373,22173],{},[78,132375,132376],{"class":124,"line":174},[78,132377,1359],{},[78,132379,132380],{"class":124,"line":180},[78,132381,21888],{},[78,132383,132384],{"class":124,"line":186},[78,132385,22186],{},[78,132387,132388],{"class":124,"line":192},[78,132389,1359],{},[78,132391,132392],{"class":124,"line":198},[78,132393,22195],{},[78,132395,132396],{"class":124,"line":204},[78,132397,16641],{},[78,132399,132400],{"class":124,"line":210},[78,132401,22204],{},[78,132403,132404],{"class":124,"line":216},[78,132405,22209],{},[78,132407,132408],{"class":124,"line":222},[78,132409,22214],{},[78,132411,132412],{"class":124,"line":421},[78,132413,22219],{},[78,132415,132416],{"class":124,"line":427},[78,132417,22224],{},[78,132419,132420],{"class":124,"line":433},[78,132421,1359],{},[78,132423,132424],{"class":124,"line":2443},[78,132425,22233],{},[78,132427,132428],{"class":124,"line":2448},[78,132429,22238],{},[78,132431,132432],{"class":124,"line":2454},[78,132433,207],{},[78,132435,132436],{"class":124,"line":2460},[78,132437,535],{},[78,132439,132440],{"class":124,"line":2465},[78,132441,22251],{},[78,132443,132444],{"class":124,"line":2470},[78,132445,219],{},[78,132447,132448],{"class":124,"line":2903},[78,132449,207],{},[226,132451,228],{},{"title":119,"searchDepth":144,"depth":144,"links":132453},[132454],{"id":109,"depth":132,"text":109},{},{"title":21987,"description":22265},[246,16227,1192],{"id":22273,"title":22274,"assetBase":7,"author":8,"body":132459,"category":22696,"collection":233,"date":22697,"description":22698,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":132782,"navigation":128,"originalPath":239,"path":22700,"seo":132783,"source":243,"stem":22702,"tags":132784,"weight":250,"__hash__":22705},{"type":10,"value":132460,"toc":132779},[132461,132495,132499,132539,132543,132565,132569,132587,132591,132629,132631,132633,132777],[13,132462,22279,132463,22283,132465,22287,132467,1018,132469,22294,132471,22298,132473,275,132475,22305,132477,22309,132479,21757,132481,22315,132483,22319,132485,22323,132487,22327,132489,22330,132491,22333,132493,22336],{},[17,132464,22282],{},[17,132466,22286],{},[17,132468,22290],{},[17,132470,22293],{},[17,132472,22297],{},[17,132474,22301],{},[17,132476,22304],{},[17,132478,22308],{},[17,132480,22312],{},[17,132482,4635],{},[17,132484,22318],{},[22,132486,22322],{},[17,132488,22326],{},[17,132490,22326],{},[22,132492,11250],{},[22,132494,11250],{},[13,132496,132497],{},[22,132498,293],{},[72,132500,132501],{},[13,132502,132503,22347,132505,22351,132507,22355,132509,2066,132511,2066,132513,2066,132515,2070,132517,132519,132521,22375,132523,2066,132525,22382,132527,2066,132529,2066,132531,2066,132533,2066,132535,22398,132537,22402],{},[22,132504,1040],{},[78,132506,22350],{},[78,132508,22354],{},[78,132510,22358],{},[78,132512,22361],{},[78,132514,22364],{},[78,132516,22367],{},[22,132518,1047],{},[78,132520,22372],{},[22,132522,1051],{},[596,132524,22378],{},[596,132526,22381],{},[596,132528,22385],{},[596,132530,22388],{},[596,132532,22391],{},[596,132534,22394],{},[596,132536,22397],{},[78,132538,22401],{},[13,132540,132541],{},[22,132542,306],{},[72,132544,132545],{},[13,132546,132547,22347,132549,2066,132551,22351,132553,22355,132555,2066,132557,2066,132559,2070,132561,132563],{},[22,132548,1040],{},[78,132550,22350],{},[78,132552,22417],{},[78,132554,22420],{},[78,132556,22423],{},[78,132558,22417],{},[78,132560,22428],{},[22,132562,1047],{},[78,132564,22433],{},[13,132566,132567],{},[22,132568,1265],{},[72,132570,132571],{},[13,132572,132573,22444,132575,22448,132577,2066,132579,2066,132581,2070,132583,132585],{},[22,132574,1040],{},[78,132576,22447],{},[78,132578,22358],{},[78,132580,22453],{},[78,132582,22456],{},[22,132584,1047],{},[78,132586,22461],{},[13,132588,132589],{},[22,132590,317],{},[49,132592,132593,132597,132601,132605,132609,132613,132617,132621,132625],{},[52,132594,132595],{},[17,132596,22472],{},[52,132598,132599],{},[17,132600,22477],{},[52,132602,132603],{},[17,132604,22482],{},[52,132606,132607],{},[17,132608,22487],{},[52,132610,132611],{},[17,132612,22492],{},[52,132614,132615],{},[17,132616,22497],{},[52,132618,132619],{},[17,132620,22502],{},[52,132622,132623],{},[17,132624,22507],{},[52,132626,132627,22513],{},[17,132628,22512],{},[107,132630,109],{"id":109},[13,132632,112],{},[114,132634,132635],{"className":116,"code":22520,"language":118,"meta":119,"style":119},[17,132636,132637,132641,132645,132649,132653,132657,132661,132665,132669,132673,132677,132681,132685,132689,132693,132697,132701,132705,132709,132713,132717,132721,132725,132729,132733,132737,132741,132745,132749,132753,132757,132761,132765,132769,132773],{"__ignoreMap":119},[78,132638,132639],{"class":124,"line":125},[78,132640,129],{"emptyLinePlaceholder":128},[78,132642,132643],{"class":124,"line":132},[78,132644,135],{},[78,132646,132647],{"class":124,"line":138},[78,132648,22535],{},[78,132650,132651],{"class":124,"line":144},[78,132652,22540],{},[78,132654,132655],{"class":124,"line":150},[78,132656,22545],{},[78,132658,132659],{"class":124,"line":156},[78,132660,22550],{},[78,132662,132663],{"class":124,"line":162},[78,132664,22555],{},[78,132666,132667],{"class":124,"line":168},[78,132668,22560],{},[78,132670,132671],{"class":124,"line":174},[78,132672,22565],{},[78,132674,132675],{"class":124,"line":180},[78,132676,22570],{},[78,132678,132679],{"class":124,"line":186},[78,132680,22575],{},[78,132682,132683],{"class":124,"line":192},[78,132684,22580],{},[78,132686,132687],{"class":124,"line":198},[78,132688,1359],{},[78,132690,132691],{"class":124,"line":204},[78,132692,22589],{},[78,132694,132695],{"class":124,"line":210},[78,132696,22594],{},[78,132698,132699],{"class":124,"line":216},[78,132700,22599],{},[78,132702,132703],{"class":124,"line":222},[78,132704,22604],{},[78,132706,132707],{"class":124,"line":421},[78,132708,22609],{},[78,132710,132711],{"class":124,"line":427},[78,132712,22614],{},[78,132714,132715],{"class":124,"line":433},[78,132716,22619],{},[78,132718,132719],{"class":124,"line":2443},[78,132720,22624],{},[78,132722,132723],{"class":124,"line":2448},[78,132724,1359],{},[78,132726,132727],{"class":124,"line":2454},[78,132728,22633],{},[78,132730,132731],{"class":124,"line":2460},[78,132732,22638],{},[78,132734,132735],{"class":124,"line":2465},[78,132736,22643],{},[78,132738,132739],{"class":124,"line":2470},[78,132740,22648],{},[78,132742,132743],{"class":124,"line":2903},[78,132744,699],{},[78,132746,132747],{"class":124,"line":2909},[78,132748,22657],{},[78,132750,132751],{"class":124,"line":11477},[78,132752,22662],{},[78,132754,132755],{"class":124,"line":13374},[78,132756,207],{},[78,132758,132759],{"class":124,"line":13380},[78,132760,22671],{},[78,132762,132763],{"class":124,"line":13386},[78,132764,22676],{},[78,132766,132767],{"class":124,"line":13722},[78,132768,22681],{},[78,132770,132771],{"class":124,"line":13727},[78,132772,22686],{},[78,132774,132775],{"class":124,"line":13953},[78,132776,207],{},[226,132778,228],{},{"title":119,"searchDepth":144,"depth":144,"links":132780},[132781],{"id":109,"depth":132,"text":109},{},{"title":22274,"description":22698},[246,16227,1192,22704],{"id":22707,"title":22708,"assetBase":7,"author":8,"body":132786,"category":23072,"collection":233,"date":23073,"description":23074,"difficulty":236,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":133077,"navigation":128,"originalPath":239,"path":23076,"seo":133078,"source":243,"stem":23078,"tags":133079,"weight":250,"__hash__":23080},{"type":10,"value":132787,"toc":133074},[132788,132826,132830,132896,132900,132954,132958,132980,132982,132984,133072],[13,132789,22713,132790,1018,132792,22720,132794,1018,132796,10730,132798,21757,132800,22730,132802,21757,132804,22736,132806,22740,132808,22744,132810,132812,22750,132814,22754,132816,22757,132818,22761,132820,22765,132822,22768,132824,22772],{},[17,132791,22716],{},[17,132793,22719],{},[17,132795,19],{},[17,132797,5058],{},[17,132799,22727],{},[17,132801,39],{},[17,132803,22733],{},[17,132805,4635],{},[17,132807,22739],{},[22,132809,22743],{},[22,132811,22747],{},[17,132813,22739],{},[22,132815,22753],{},[17,132817,19],{},[17,132819,22760],{},[17,132821,22764],{},[17,132823,39],{},[22,132825,22771],{},[13,132827,132828],{},[22,132829,293],{},[72,132831,132832,132846],{},[13,132833,132834,22783,132836,22787,132838,22790,132840,132842,132844],{},[22,132835,1040],{},[78,132837,22786],{},[78,132839,10997],{},[22,132841,1047],{},[78,132843,22795],{},[22,132845,1051],{},[49,132847,132848,132870,132876],{},[52,132849,22802,132850,22805,132852,22828],{},[78,132851,10997],{},[78,132853,22808,132854,2066,132858,2066,132862,2066,132866],{},[596,132855,132856],{},[22,132857,11237],{},[596,132859,132860],{},[22,132861,22817],{},[596,132863,132864],{},[22,132865,22822],{},[596,132867,132868],{},[22,132869,22827],{},[52,132871,22831,132872,22805,132874,22836],{},[78,132873,10997],{},[78,132875,10997],{},[52,132877,22839,132878,22805,132880,22857,132894,285],{},[78,132879,10997],{},[78,132881,22844,132882,2066,132886,2066,132890],{},[596,132883,132884],{},[22,132885,1017],{},[596,132887,132888],{},[22,132889,1044],{},[596,132891,132892],{},[22,132893,22817],{},[78,132895,22795],{},[13,132897,132898],{},[22,132899,306],{},[72,132901,132902,132916],{},[13,132903,132904,22783,132906,22787,132908,22876,132910,132912,132914],{},[22,132905,1040],{},[78,132907,22872],{},[78,132909,22875],{},[22,132911,1047],{},[78,132913,22881],{},[22,132915,1051],{},[49,132917,132918,132932,132938],{},[52,132919,22888,132920,22805,132922,22903],{},[78,132921,22875],{},[78,132923,132924,22898,132928],{},[596,132925,132926],{},[22,132927,22897],{},[596,132929,132930],{},[22,132931,22897],{},[52,132933,22831,132934,22805,132936,22836],{},[78,132935,22875],{},[78,132937,22875],{},[52,132939,22912,132940,22805,132942,22926,132952,285],{},[78,132941,22875],{},[78,132943,132944,22921,132948],{},[596,132945,132946],{},[22,132947,1021],{},[596,132949,132950],{},[22,132951,1021],{},[78,132953,22881],{},[13,132955,132956],{},[22,132957,317],{},[49,132959,132960,132964,132968,132972,132976],{},[52,132961,132962],{},[17,132963,22939],{},[52,132965,132966],{},[17,132967,22944],{},[52,132969,132970],{},[17,132971,22949],{},[52,132973,132974],{},[17,132975,22954],{},[52,132977,132978],{},[17,132979,22959],{},[107,132981,109],{"id":109},[13,132983,112],{},[114,132985,132986],{"className":116,"code":22966,"language":118,"meta":119,"style":119},[17,132987,132988,132992,132996,133000,133004,133008,133012,133016,133020,133024,133028,133032,133036,133040,133044,133048,133052,133056,133060,133064,133068],{"__ignoreMap":119},[78,132989,132990],{"class":124,"line":125},[78,132991,129],{"emptyLinePlaceholder":128},[78,132993,132994],{"class":124,"line":132},[78,132995,135],{},[78,132997,132998],{"class":124,"line":138},[78,132999,22981],{},[78,133001,133002],{"class":124,"line":144},[78,133003,22986],{},[78,133005,133006],{"class":124,"line":150},[78,133007,22991],{},[78,133009,133010],{"class":124,"line":156},[78,133011,22996],{},[78,133013,133014],{"class":124,"line":162},[78,133015,23001],{},[78,133017,133018],{"class":124,"line":168},[78,133019,1359],{},[78,133021,133022],{"class":124,"line":174},[78,133023,23010],{},[78,133025,133026],{"class":124,"line":180},[78,133027,23015],{},[78,133029,133030],{"class":124,"line":186},[78,133031,1359],{},[78,133033,133034],{"class":124,"line":192},[78,133035,23024],{},[78,133037,133038],{"class":124,"line":198},[78,133039,23029],{},[78,133041,133042],{"class":124,"line":204},[78,133043,23034],{},[78,133045,133046],{"class":124,"line":210},[78,133047,23039],{},[78,133049,133050],{"class":124,"line":216},[78,133051,207],{},[78,133053,133054],{"class":124,"line":222},[78,133055,23048],{},[78,133057,133058],{"class":124,"line":421},[78,133059,23053],{},[78,133061,133062],{"class":124,"line":427},[78,133063,23058],{},[78,133065,133066],{"class":124,"line":433},[78,133067,365],{},[78,133069,133070],{"class":124,"line":2443},[78,133071,207],{},[226,133073,228],{},{"title":119,"searchDepth":144,"depth":144,"links":133075},[133076],{"id":109,"depth":132,"text":109},{},{"title":22708,"description":23074},[246,248,1819,3759],{"id":23082,"title":23083,"assetBase":7,"author":8,"body":133081,"category":23240,"collection":233,"date":23241,"description":23088,"difficulty":580,"extension":237,"kind":238,"language":118,"leetcode":239,"meta":133209,"navigation":128,"originalPath":239,"path":23243,"seo":133210,"source":243,"stem":23245,"tags":133211,"weight":250,"__hash__":23249},{"type":10,"value":133082,"toc":133201},[133083,133085,133087,133089,133091,133093,133095,133100,133102,133107,133109,133111,133113,133115,133199],[13,133084,23088],{},[23090,133086,23092],{"id":23092},[13,133088,23095],{},[23090,133090,23098],{"id":23098},[13,133092,23101],{},[23090,133094,23104],{"id":23104},[114,133096,133098],{"className":133097,"code":23108,"language":299},[297],[17,133099,23108],{"__ignoreMap":119},[23090,133101,23113],{"id":23113},[114,133103,133105],{"className":133104,"code":23117,"language":299},[297],[17,133106,23117],{"__ignoreMap":119},[23090,133108,23122],{"id":23122},[13,133110,23125],{},[107,133112,109],{"id":109},[13,133114,112],{},[114,133116,133117],{"className":116,"code":23132,"language":118,"meta":119,"style":119},[17,133118,133119,133123,133127,133131,133135,133139,133143,133147,133151,133155,133159,133163,133167,133171,133175,133179,133183,133187,133191,133195],{"__ignoreMap":119},[78,133120,133121],{"class":124,"line":125},[78,133122,129],{"emptyLinePlaceholder":128},[78,133124,133125],{"class":124,"line":132},[78,133126,14990],{},[78,133128,133129],{"class":124,"line":138},[78,133130,23147],{},[78,133132,133133],{"class":124,"line":144},[78,133134,129],{"emptyLinePlaceholder":128},[78,133136,133137],{"class":124,"line":150},[78,133138,23156],{},[78,133140,133141],{"class":124,"line":156},[78,133142,23161],{},[78,133144,133145],{"class":124,"line":162},[78,133146,23166],{},[78,133148,133149],{"class":124,"line":168},[78,133150,23171],{},[78,133152,133153],{"class":124,"line":174},[78,133154,23176],{},[78,133156,133157],{"class":124,"line":180},[78,133158,23181],{},[78,133160,133161],{"class":124,"line":186},[78,133162,129],{"emptyLinePlaceholder":128},[78,133164,133165],{"class":124,"line":192},[78,133166,23190],{},[78,133168,133169],{"class":124,"line":198},[78,133170,23195],{},[78,133172,133173],{"class":124,"line":204},[78,133174,23200],{},[78,133176,133177],{"class":124,"line":210},[78,133178,23205],{},[78,133180,133181],{"class":124,"line":216},[78,133182,23210],{},[78,133184,133185],{"class":124,"line":222},[78,133186,23215],{},[78,133188,133189],{"class":124,"line":421},[78,133190,129],{"emptyLinePlaceholder":128},[78,133192,133193],{"class":124,"line":427},[78,133194,23224],{},[78,133196,133197],{"class":124,"line":433},[78,133198,23229],{},[226,133200,228],{},{"title":119,"searchDepth":144,"depth":144,"links":133202},[133203,133204,133205,133206,133207,133208],{"id":23092,"depth":138,"text":23092},{"id":23098,"depth":138,"text":23098},{"id":23104,"depth":138,"text":23104},{"id":23113,"depth":138,"text":23113},{"id":23122,"depth":138,"text":23122},{"id":109,"depth":132,"text":109},{},{"title":23083,"description":23088},[246,23247,23248],{"id":23251,"title":23252,"assetBase":239,"author":8,"body":133213,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":133261,"navigation":128,"originalPath":23327,"path":23328,"seo":133262,"source":23330,"stem":23331,"tags":133263,"weight":250,"__hash__":23334},{"type":10,"value":133214,"toc":133258},[133215,133217,133225,133227,133229,133233,133238,133240,133242,133244,133248,133250,133252,133254,133256],[4517,133216,23258],{"id":23257},[72,133218,133219,133223],{},[13,133220,133221],{},[22,133222,23265],{},[13,133224,23268],{},[13,133226,23271],{},[107,133228,23275],{"id":23274},[10548,133230,133231],{"id":23278},[22,133232,23281],{},[114,133234,133236],{"className":133235,"code":23285,"language":299},[297],[17,133237,23285],{"__ignoreMap":119},[23289,133239],{},[10548,133241,23294],{"id":23293},[13,133243,23297],{},[13,133245,23300,133246,23304],{},[23302,133247],{"value":119},[13,133249,23307],{},[13,133251,23310],{},[13,133253,23313],{},[13,133255,23316],{},[13,133257,23319],{},{"title":119,"searchDepth":144,"depth":144,"links":133259},[133260],{"id":23274,"depth":132,"text":23275},{},{"title":23252,"description":119},[23333],{"id":23336,"title":23337,"assetBase":239,"author":8,"body":133265,"category":23371,"collection":23324,"date":23325,"description":23345,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":133289,"navigation":128,"originalPath":23373,"path":23374,"seo":133290,"source":23330,"stem":23376,"tags":133291,"weight":250,"__hash__":23379},{"type":10,"value":133266,"toc":133287},[133267,133269,133271,133273,133275,133281,133283,133285],[4517,133268,23337],{"id":23342},[13,133270,23345],{},[13,133272,23348],{},[13,133274,23351],{},[72,133276,133277,133279],{},[13,133278,23356],{},[13,133280,23359],{},[13,133282,23362],{},[13,133284,23365],{},[13,133286,23368],{},{"title":119,"searchDepth":144,"depth":144,"links":133288},[],{},{"title":23337,"description":23345},[23378,14542,23333],{"id":23381,"title":23382,"assetBase":239,"author":8,"body":133293,"category":23936,"collection":23324,"date":23325,"description":23387,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":133737,"navigation":128,"originalPath":23938,"path":23939,"seo":133738,"source":23330,"stem":23941,"tags":133739,"weight":250,"__hash__":23943},{"type":10,"value":133294,"toc":133735},[133295,133297,133299,133301,133303,133305,133307,133399,133401,133493,133495,133497,133502,133542,133544,133616,133618,133620,133680,133682,133710,133712,133714,133716,133718,133723,133728,133733],[13,133296,23387],{},[13,133298,23390],{},[13,133300,23393],{},[13,133302,23396],{},[13,133304,23399],{},[10548,133306,23403],{"id":23402},[114,133308,133309],{"className":23406,"code":23407,"language":23408,"meta":119,"style":119},[17,133310,133311,133315,133319,133323,133327,133331,133335,133339,133343,133347,133351,133355,133359,133363,133367,133371,133375,133379,133383,133387,133391,133395],{"__ignoreMap":119},[78,133312,133313],{"class":124,"line":125},[78,133314,23415],{},[78,133316,133317],{"class":124,"line":132},[78,133318,23420],{},[78,133320,133321],{"class":124,"line":138},[78,133322,129],{"emptyLinePlaceholder":128},[78,133324,133325],{"class":124,"line":144},[78,133326,23429],{},[78,133328,133329],{"class":124,"line":150},[78,133330,23434],{},[78,133332,133333],{"class":124,"line":156},[78,133334,23439],{},[78,133336,133337],{"class":124,"line":162},[78,133338,23444],{},[78,133340,133341],{"class":124,"line":168},[78,133342,23449],{},[78,133344,133345],{"class":124,"line":174},[78,133346,23454],{},[78,133348,133349],{"class":124,"line":180},[78,133350,23459],{},[78,133352,133353],{"class":124,"line":186},[78,133354,23464],{},[78,133356,133357],{"class":124,"line":192},[78,133358,23469],{},[78,133360,133361],{"class":124,"line":198},[78,133362,23474],{},[78,133364,133365],{"class":124,"line":204},[78,133366,23479],{},[78,133368,133369],{"class":124,"line":210},[78,133370,23484],{},[78,133372,133373],{"class":124,"line":216},[78,133374,23489],{},[78,133376,133377],{"class":124,"line":222},[78,133378,23494],{},[78,133380,133381],{"class":124,"line":421},[78,133382,23499],{},[78,133384,133385],{"class":124,"line":427},[78,133386,15810],{},[78,133388,133389],{"class":124,"line":433},[78,133390,23508],{},[78,133392,133393],{"class":124,"line":2443},[78,133394,23513],{},[78,133396,133397],{"class":124,"line":2448},[78,133398,23518],{},[10548,133400,23522],{"id":23521},[114,133402,133403],{"className":23525,"code":23526,"language":23527,"meta":119,"style":119},[17,133404,133405,133409,133413,133417,133421,133425,133429,133433,133437,133441,133445,133449,133453,133457,133461,133465,133469,133473,133477,133481,133485,133489],{"__ignoreMap":119},[78,133406,133407],{"class":124,"line":125},[78,133408,23534],{},[78,133410,133411],{"class":124,"line":132},[78,133412,23539],{},[78,133414,133415],{"class":124,"line":138},[78,133416,23544],{},[78,133418,133419],{"class":124,"line":144},[78,133420,129],{"emptyLinePlaceholder":128},[78,133422,133423],{"class":124,"line":150},[78,133424,23553],{},[78,133426,133427],{"class":124,"line":156},[78,133428,23558],{},[78,133430,133431],{"class":124,"line":162},[78,133432,23563],{},[78,133434,133435],{"class":124,"line":168},[78,133436,23568],{},[78,133438,133439],{"class":124,"line":174},[78,133440,23573],{},[78,133442,133443],{"class":124,"line":180},[78,133444,23578],{},[78,133446,133447],{"class":124,"line":186},[78,133448,23583],{},[78,133450,133451],{"class":124,"line":192},[78,133452,23588],{},[78,133454,133455],{"class":124,"line":198},[78,133456,129],{"emptyLinePlaceholder":128},[78,133458,133459],{"class":124,"line":204},[78,133460,23597],{},[78,133462,133463],{"class":124,"line":210},[78,133464,23602],{},[78,133466,133467],{"class":124,"line":216},[78,133468,23607],{},[78,133470,133471],{"class":124,"line":222},[78,133472,15810],{},[78,133474,133475],{"class":124,"line":421},[78,133476,23518],{},[78,133478,133479],{"class":124,"line":427},[78,133480,129],{"emptyLinePlaceholder":128},[78,133482,133483],{"class":124,"line":433},[78,133484,129],{"emptyLinePlaceholder":128},[78,133486,133487],{"class":124,"line":2443},[78,133488,23628],{},[78,133490,133491],{"class":124,"line":2448},[78,133492,23633],{},[13,133494,23636],{},[13,133496,23639],{},[13,133498,23642,133499,23649],{},[5009,133500,23648],{"href":23645,"rel":133501},[23647],[114,133503,133504],{"className":23652,"code":23653,"language":23654,"meta":119,"style":119},[17,133505,133506,133510,133514,133518,133522,133526,133530,133534,133538],{"__ignoreMap":119},[78,133507,133508],{"class":124,"line":125},[78,133509,23661],{},[78,133511,133512],{"class":124,"line":132},[78,133513,129],{"emptyLinePlaceholder":128},[78,133515,133516],{"class":124,"line":138},[78,133517,23670],{},[78,133519,133520],{"class":124,"line":144},[78,133521,23675],{},[78,133523,133524],{"class":124,"line":150},[78,133525,23680],{},[78,133527,133528],{"class":124,"line":156},[78,133529,23544],{},[78,133531,133532],{"class":124,"line":162},[78,133533,129],{"emptyLinePlaceholder":128},[78,133535,133536],{"class":124,"line":168},[78,133537,23693],{},[78,133539,133540],{"class":124,"line":174},[78,133541,23698],{},[13,133543,23701],{},[114,133545,133546],{"className":23406,"code":23704,"language":23408,"meta":119,"style":119},[17,133547,133548,133552,133556,133560,133564,133568,133572,133576,133580,133584,133588,133592,133596,133600,133604,133608,133612],{"__ignoreMap":119},[78,133549,133550],{"class":124,"line":125},[78,133551,23711],{},[78,133553,133554],{"class":124,"line":132},[78,133555,129],{"emptyLinePlaceholder":128},[78,133557,133558],{"class":124,"line":138},[78,133559,23720],{},[78,133561,133562],{"class":124,"line":144},[78,133563,23725],{},[78,133565,133566],{"class":124,"line":150},[78,133567,23730],{},[78,133569,133570],{"class":124,"line":156},[78,133571,23735],{},[78,133573,133574],{"class":124,"line":162},[78,133575,23740],{},[78,133577,133578],{"class":124,"line":168},[78,133579,23745],{},[78,133581,133582],{"class":124,"line":174},[78,133583,23750],{},[78,133585,133586],{"class":124,"line":180},[78,133587,23755],{},[78,133589,133590],{"class":124,"line":186},[78,133591,23760],{},[78,133593,133594],{"class":124,"line":192},[78,133595,23518],{},[78,133597,133598],{"class":124,"line":198},[78,133599,129],{"emptyLinePlaceholder":128},[78,133601,133602],{"class":124,"line":204},[78,133603,23773],{},[78,133605,133606],{"class":124,"line":210},[78,133607,23778],{},[78,133609,133610],{"class":124,"line":216},[78,133611,23783],{},[78,133613,133614],{"class":124,"line":222},[78,133615,23518],{},[13,133617,23790],{},[13,133619,23793],{},[114,133621,133622],{"className":23652,"code":23796,"language":23654,"meta":119,"style":119},[17,133623,133624,133628,133632,133636,133640,133644,133648,133652,133656,133660,133664,133668,133672,133676],{"__ignoreMap":119},[78,133625,133626],{"class":124,"line":125},[78,133627,23803],{},[78,133629,133630],{"class":124,"line":132},[78,133631,23808],{},[78,133633,133634],{"class":124,"line":138},[78,133635,23813],{},[78,133637,133638],{"class":124,"line":144},[78,133639,23818],{},[78,133641,133642],{"class":124,"line":150},[78,133643,23823],{},[78,133645,133646],{"class":124,"line":156},[78,133647,23828],{},[78,133649,133650],{"class":124,"line":162},[78,133651,23833],{},[78,133653,133654],{"class":124,"line":168},[78,133655,23518],{},[78,133657,133658],{"class":124,"line":174},[78,133659,129],{"emptyLinePlaceholder":128},[78,133661,133662],{"class":124,"line":180},[78,133663,23628],{},[78,133665,133666],{"class":124,"line":186},[78,133667,23850],{},[78,133669,133670],{"class":124,"line":192},[78,133671,23855],{},[78,133673,133674],{"class":124,"line":198},[78,133675,23860],{},[78,133677,133678],{"class":124,"line":204},[78,133679,23865],{},[13,133681,23868],{},[114,133683,133684],{"className":23652,"code":23871,"language":23654,"meta":119,"style":119},[17,133685,133686,133690,133694,133698,133702,133706],{"__ignoreMap":119},[78,133687,133688],{"class":124,"line":125},[78,133689,23878],{},[78,133691,133692],{"class":124,"line":132},[78,133693,23878],{},[78,133695,133696],{"class":124,"line":138},[78,133697,129],{"emptyLinePlaceholder":128},[78,133699,133700],{"class":124,"line":144},[78,133701,23628],{},[78,133703,133704],{"class":124,"line":150},[78,133705,23895],{},[78,133707,133708],{"class":124,"line":156},[78,133709,23900],{},[13,133711,23903],{},[13,133713,23906],{},[23289,133715],{},[13,133717,23911],{},[13,133719,133720],{},[5009,133721,23918],{"href":23916,"rel":133722},[23647],[13,133724,133725],{},[5009,133726,23925],{"href":23923,"rel":133727},[23647],[13,133729,133730],{},[5009,133731,23925],{"href":23930,"rel":133732},[23647],[226,133734,228],{},{"title":119,"searchDepth":144,"depth":144,"links":133736},[],{},{"title":23382,"description":23387},[23378,10715],{"id":23945,"title":23946,"assetBase":239,"author":8,"body":133741,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":134979,"navigation":128,"originalPath":25493,"path":25494,"seo":134980,"source":23330,"stem":25496,"tags":134981,"weight":250,"__hash__":25498},{"type":10,"value":133742,"toc":134973},[133743,133745,133763,133765,134037,134039,134041,134045,134217,134221,134409,134411,134415,134819,134823,134967,134969,134971],[4517,133744,23952],{"id":23951},[72,133746,133747,133749,133751,133756,133761],{},[13,133748,23957],{},[13,133750,23960],{},[13,133752,133753],{},[5009,133754,23967],{"href":23965,"rel":133755},[23647],[13,133757,133758],{},[5009,133759,23974],{"href":23972,"rel":133760},[23647],[13,133762,23977],{},[107,133764,23981],{"id":23980},[114,133766,133767],{"className":116,"code":23984,"language":118,"meta":119,"style":119},[17,133768,133769,133773,133777,133781,133785,133789,133793,133797,133801,133805,133809,133813,133817,133821,133825,133829,133833,133837,133841,133845,133849,133853,133857,133861,133865,133869,133873,133877,133881,133885,133889,133893,133897,133901,133905,133909,133913,133917,133921,133925,133929,133933,133937,133941,133945,133949,133953,133957,133961,133965,133969,133973,133977,133981,133985,133989,133993,133997,134001,134005,134009,134013,134017,134021,134025,134029,134033],{"__ignoreMap":119},[78,133770,133771],{"class":124,"line":125},[78,133772,7771],{},[78,133774,133775],{"class":124,"line":132},[78,133776,129],{"emptyLinePlaceholder":128},[78,133778,133779],{"class":124,"line":138},[78,133780,23999],{},[78,133782,133783],{"class":124,"line":144},[78,133784,24004],{},[78,133786,133787],{"class":124,"line":150},[78,133788,24009],{},[78,133790,133791],{"class":124,"line":156},[78,133792,24014],{},[78,133794,133795],{"class":124,"line":162},[78,133796,24019],{},[78,133798,133799],{"class":124,"line":168},[78,133800,129],{"emptyLinePlaceholder":128},[78,133802,133803],{"class":124,"line":174},[78,133804,24028],{},[78,133806,133807],{"class":124,"line":180},[78,133808,129],{"emptyLinePlaceholder":128},[78,133810,133811],{"class":124,"line":186},[78,133812,24037],{},[78,133814,133815],{"class":124,"line":192},[78,133816,24042],{},[78,133818,133819],{"class":124,"line":198},[78,133820,24047],{},[78,133822,133823],{"class":124,"line":204},[78,133824,24052],{},[78,133826,133827],{"class":124,"line":210},[78,133828,24057],{},[78,133830,133831],{"class":124,"line":216},[78,133832,24062],{},[78,133834,133835],{"class":124,"line":222},[78,133836,24067],{},[78,133838,133839],{"class":124,"line":421},[78,133840,23518],{},[78,133842,133843],{"class":124,"line":427},[78,133844,129],{"emptyLinePlaceholder":128},[78,133846,133847],{"class":124,"line":433},[78,133848,129],{"emptyLinePlaceholder":128},[78,133850,133851],{"class":124,"line":2443},[78,133852,24084],{},[78,133854,133855],{"class":124,"line":2448},[78,133856,24089],{},[78,133858,133859],{"class":124,"line":2454},[78,133860,24094],{},[78,133862,133863],{"class":124,"line":2460},[78,133864,24099],{},[78,133866,133867],{"class":124,"line":2465},[78,133868,24104],{},[78,133870,133871],{"class":124,"line":2470},[78,133872,24109],{},[78,133874,133875],{"class":124,"line":2903},[78,133876,24114],{},[78,133878,133879],{"class":124,"line":2909},[78,133880,24119],{},[78,133882,133883],{"class":124,"line":11477},[78,133884,129],{"emptyLinePlaceholder":128},[78,133886,133887],{"class":124,"line":13374},[78,133888,129],{"emptyLinePlaceholder":128},[78,133890,133891],{"class":124,"line":13380},[78,133892,24132],{},[78,133894,133895],{"class":124,"line":13386},[78,133896,24137],{},[78,133898,133899],{"class":124,"line":13722},[78,133900,24142],{},[78,133902,133903],{"class":124,"line":13727},[78,133904,24147],{},[78,133906,133907],{"class":124,"line":13953},[78,133908,24152],{},[78,133910,133911],{"class":124,"line":13958},[78,133912,24157],{},[78,133914,133915],{"class":124,"line":13964},[78,133916,24162],{},[78,133918,133919],{"class":124,"line":13969},[78,133920,24167],{},[78,133922,133923],{"class":124,"line":24170},[78,133924,129],{"emptyLinePlaceholder":128},[78,133926,133927],{"class":124,"line":24175},[78,133928,129],{"emptyLinePlaceholder":128},[78,133930,133931],{"class":124,"line":24180},[78,133932,24183],{},[78,133934,133935],{"class":124,"line":24186},[78,133936,24189],{},[78,133938,133939],{"class":124,"line":24192},[78,133940,24195],{},[78,133942,133943],{"class":124,"line":24198},[78,133944,24201],{},[78,133946,133947],{"class":124,"line":24204},[78,133948,24207],{},[78,133950,133951],{"class":124,"line":24210},[78,133952,129],{"emptyLinePlaceholder":128},[78,133954,133955],{"class":124,"line":24215},[78,133956,129],{"emptyLinePlaceholder":128},[78,133958,133959],{"class":124,"line":24220},[78,133960,24223],{},[78,133962,133963],{"class":124,"line":24226},[78,133964,24229],{},[78,133966,133967],{"class":124,"line":24232},[78,133968,24235],{},[78,133970,133971],{"class":124,"line":24238},[78,133972,24241],{},[78,133974,133975],{"class":124,"line":24244},[78,133976,24247],{},[78,133978,133979],{"class":124,"line":24250},[78,133980,24253],{},[78,133982,133983],{"class":124,"line":24256},[78,133984,24259],{},[78,133986,133987],{"class":124,"line":24262},[78,133988,129],{"emptyLinePlaceholder":128},[78,133990,133991],{"class":124,"line":24267},[78,133992,24270],{},[78,133994,133995],{"class":124,"line":24273},[78,133996,24276],{},[78,133998,133999],{"class":124,"line":24279},[78,134000,129],{"emptyLinePlaceholder":128},[78,134002,134003],{"class":124,"line":24284},[78,134004,24287],{},[78,134006,134007],{"class":124,"line":24290},[78,134008,24293],{},[78,134010,134011],{"class":124,"line":24296},[78,134012,24299],{},[78,134014,134015],{"class":124,"line":24302},[78,134016,24305],{},[78,134018,134019],{"class":124,"line":24308},[78,134020,24311],{},[78,134022,134023],{"class":124,"line":24314},[78,134024,24317],{},[78,134026,134027],{"class":124,"line":24320},[78,134028,129],{"emptyLinePlaceholder":128},[78,134030,134031],{"class":124,"line":24325},[78,134032,24328],{},[78,134034,134035],{"class":124,"line":24331},[78,134036,7818],{},[13,134038,24336],{},[107,134040,24340],{"id":24339},[49,134042,134043],{},[52,134044,24345],{},[114,134046,134047],{"className":116,"code":24348,"language":118,"meta":119,"style":119},[17,134048,134049,134053,134057,134061,134065,134069,134073,134077,134081,134085,134089,134093,134097,134101,134105,134109,134113,134117,134121,134125,134129,134133,134137,134141,134145,134149,134153,134157,134161,134165,134169,134173,134177,134181,134185,134189,134193,134197,134201,134205,134209,134213],{"__ignoreMap":119},[78,134050,134051],{"class":124,"line":125},[78,134052,7771],{},[78,134054,134055],{"class":124,"line":132},[78,134056,129],{"emptyLinePlaceholder":128},[78,134058,134059],{"class":124,"line":138},[78,134060,24363],{},[78,134062,134063],{"class":124,"line":144},[78,134064,24368],{},[78,134066,134067],{"class":124,"line":150},[78,134068,24373],{},[78,134070,134071],{"class":124,"line":156},[78,134072,24378],{},[78,134074,134075],{"class":124,"line":162},[78,134076,24383],{},[78,134078,134079],{"class":124,"line":168},[78,134080,129],{"emptyLinePlaceholder":128},[78,134082,134083],{"class":124,"line":174},[78,134084,24392],{},[78,134086,134087],{"class":124,"line":180},[78,134088,24397],{},[78,134090,134091],{"class":124,"line":186},[78,134092,24402],{},[78,134094,134095],{"class":124,"line":192},[78,134096,24407],{},[78,134098,134099],{"class":124,"line":198},[78,134100,129],{"emptyLinePlaceholder":128},[78,134102,134103],{"class":124,"line":204},[78,134104,129],{"emptyLinePlaceholder":128},[78,134106,134107],{"class":124,"line":210},[78,134108,24420],{},[78,134110,134111],{"class":124,"line":216},[78,134112,24425],{},[78,134114,134115],{"class":124,"line":222},[78,134116,24430],{},[78,134118,134119],{"class":124,"line":421},[78,134120,129],{"emptyLinePlaceholder":128},[78,134122,134123],{"class":124,"line":427},[78,134124,129],{"emptyLinePlaceholder":128},[78,134126,134127],{"class":124,"line":433},[78,134128,24443],{},[78,134130,134131],{"class":124,"line":2443},[78,134132,24448],{},[78,134134,134135],{"class":124,"line":2448},[78,134136,24453],{},[78,134138,134139],{"class":124,"line":2454},[78,134140,24458],{},[78,134142,134143],{"class":124,"line":2460},[78,134144,24463],{},[78,134146,134147],{"class":124,"line":2465},[78,134148,24468],{},[78,134150,134151],{"class":124,"line":2470},[78,134152,129],{"emptyLinePlaceholder":128},[78,134154,134155],{"class":124,"line":2903},[78,134156,129],{"emptyLinePlaceholder":128},[78,134158,134159],{"class":124,"line":2909},[78,134160,24481],{},[78,134162,134163],{"class":124,"line":11477},[78,134164,24486],{},[78,134166,134167],{"class":124,"line":13374},[78,134168,24491],{},[78,134170,134171],{"class":124,"line":13380},[78,134172,24496],{},[78,134174,134175],{"class":124,"line":13386},[78,134176,24501],{},[78,134178,134179],{"class":124,"line":13722},[78,134180,24506],{},[78,134182,134183],{"class":124,"line":13727},[78,134184,24511],{},[78,134186,134187],{"class":124,"line":13953},[78,134188,24516],{},[78,134190,134191],{"class":124,"line":13958},[78,134192,24521],{},[78,134194,134195],{"class":124,"line":13964},[78,134196,129],{"emptyLinePlaceholder":128},[78,134198,134199],{"class":124,"line":13969},[78,134200,129],{"emptyLinePlaceholder":128},[78,134202,134203],{"class":124,"line":24170},[78,134204,24534],{},[78,134206,134207],{"class":124,"line":24175},[78,134208,24539],{},[78,134210,134211],{"class":124,"line":24180},[78,134212,24544],{},[78,134214,134215],{"class":124,"line":24186},[78,134216,24549],{},[49,134218,134219],{},[52,134220,24554],{},[114,134222,134223],{"className":116,"code":24557,"language":118,"meta":119,"style":119},[17,134224,134225,134229,134233,134237,134241,134245,134249,134253,134257,134261,134265,134269,134273,134277,134281,134285,134289,134293,134297,134301,134305,134309,134313,134317,134321,134325,134329,134333,134337,134341,134345,134349,134353,134357,134361,134365,134369,134373,134377,134381,134385,134389,134393,134397,134401,134405],{"__ignoreMap":119},[78,134226,134227],{"class":124,"line":125},[78,134228,24564],{},[78,134230,134231],{"class":124,"line":132},[78,134232,24569],{},[78,134234,134235],{"class":124,"line":138},[78,134236,24574],{},[78,134238,134239],{"class":124,"line":144},[78,134240,24579],{},[78,134242,134243],{"class":124,"line":150},[78,134244,24584],{},[78,134246,134247],{"class":124,"line":156},[78,134248,7771],{},[78,134250,134251],{"class":124,"line":162},[78,134252,129],{"emptyLinePlaceholder":128},[78,134254,134255],{"class":124,"line":168},[78,134256,24597],{},[78,134258,134259],{"class":124,"line":174},[78,134260,24602],{},[78,134262,134263],{"class":124,"line":180},[78,134264,129],{"emptyLinePlaceholder":128},[78,134266,134267],{"class":124,"line":186},[78,134268,129],{"emptyLinePlaceholder":128},[78,134270,134271],{"class":124,"line":192},[78,134272,24615],{},[78,134274,134275],{"class":124,"line":198},[78,134276,24620],{},[78,134278,134279],{"class":124,"line":204},[78,134280,24625],{},[78,134282,134283],{"class":124,"line":210},[78,134284,24630],{},[78,134286,134287],{"class":124,"line":216},[78,134288,129],{"emptyLinePlaceholder":128},[78,134290,134291],{"class":124,"line":222},[78,134292,129],{"emptyLinePlaceholder":128},[78,134294,134295],{"class":124,"line":421},[78,134296,24643],{},[78,134298,134299],{"class":124,"line":427},[78,134300,24648],{},[78,134302,134303],{"class":124,"line":433},[78,134304,24653],{},[78,134306,134307],{"class":124,"line":2443},[78,134308,24658],{},[78,134310,134311],{"class":124,"line":2448},[78,134312,24663],{},[78,134314,134315],{"class":124,"line":2454},[78,134316,129],{"emptyLinePlaceholder":128},[78,134318,134319],{"class":124,"line":2460},[78,134320,24672],{},[78,134322,134323],{"class":124,"line":2465},[78,134324,24677],{},[78,134326,134327],{"class":124,"line":2470},[78,134328,24682],{},[78,134330,134331],{"class":124,"line":2903},[78,134332,129],{"emptyLinePlaceholder":128},[78,134334,134335],{"class":124,"line":2909},[78,134336,24691],{},[78,134338,134339],{"class":124,"line":11477},[78,134340,24696],{},[78,134342,134343],{"class":124,"line":13374},[78,134344,24701],{},[78,134346,134347],{"class":124,"line":13380},[78,134348,24706],{},[78,134350,134351],{"class":124,"line":13386},[78,134352,129],{"emptyLinePlaceholder":128},[78,134354,134355],{"class":124,"line":13722},[78,134356,129],{"emptyLinePlaceholder":128},[78,134358,134359],{"class":124,"line":13727},[78,134360,24719],{},[78,134362,134363],{"class":124,"line":13953},[78,134364,24724],{},[78,134366,134367],{"class":124,"line":13958},[78,134368,24729],{},[78,134370,134371],{"class":124,"line":13964},[78,134372,129],{"emptyLinePlaceholder":128},[78,134374,134375],{"class":124,"line":13969},[78,134376,129],{"emptyLinePlaceholder":128},[78,134378,134379],{"class":124,"line":24170},[78,134380,24742],{},[78,134382,134383],{"class":124,"line":24175},[78,134384,24747],{},[78,134386,134387],{"class":124,"line":24180},[78,134388,24752],{},[78,134390,134391],{"class":124,"line":24186},[78,134392,24757],{},[78,134394,134395],{"class":124,"line":24192},[78,134396,24762],{},[78,134398,134399],{"class":124,"line":24198},[78,134400,24767],{},[78,134402,134403],{"class":124,"line":24204},[78,134404,24772],{},[78,134406,134407],{"class":124,"line":24210},[78,134408,24777],{},[107,134410,24781],{"id":24780},[49,134412,134413],{},[52,134414,24786],{},[114,134416,134417],{"className":116,"code":24789,"language":118,"meta":119,"style":119},[17,134418,134419,134423,134427,134431,134435,134439,134443,134447,134451,134455,134459,134463,134467,134471,134475,134479,134483,134487,134491,134495,134499,134503,134507,134511,134515,134519,134523,134527,134531,134535,134539,134543,134547,134551,134555,134559,134563,134567,134571,134575,134579,134583,134587,134591,134595,134599,134603,134607,134611,134615,134619,134623,134627,134631,134635,134639,134643,134647,134651,134655,134659,134663,134667,134671,134675,134679,134683,134687,134691,134695,134699,134703,134707,134711,134715,134719,134723,134727,134731,134735,134739,134743,134747,134751,134755,134759,134763,134767,134771,134775,134779,134783,134787,134791,134795,134799,134803,134807,134811,134815],{"__ignoreMap":119},[78,134420,134421],{"class":124,"line":125},[78,134422,24796],{},[78,134424,134425],{"class":124,"line":132},[78,134426,129],{"emptyLinePlaceholder":128},[78,134428,134429],{"class":124,"line":138},[78,134430,24805],{},[78,134432,134433],{"class":124,"line":144},[78,134434,24810],{},[78,134436,134437],{"class":124,"line":150},[78,134438,24815],{},[78,134440,134441],{"class":124,"line":156},[78,134442,24820],{},[78,134444,134445],{"class":124,"line":162},[78,134446,24825],{},[78,134448,134449],{"class":124,"line":168},[78,134450,24830],{},[78,134452,134453],{"class":124,"line":174},[78,134454,24835],{},[78,134456,134457],{"class":124,"line":180},[78,134458,129],{"emptyLinePlaceholder":128},[78,134460,134461],{"class":124,"line":186},[78,134462,24844],{},[78,134464,134465],{"class":124,"line":192},[78,134466,24849],{},[78,134468,134469],{"class":124,"line":198},[78,134470,24854],{},[78,134472,134473],{"class":124,"line":204},[78,134474,129],{"emptyLinePlaceholder":128},[78,134476,134477],{"class":124,"line":210},[78,134478,24863],{},[78,134480,134481],{"class":124,"line":216},[78,134482,24868],{},[78,134484,134485],{"class":124,"line":222},[78,134486,129],{"emptyLinePlaceholder":128},[78,134488,134489],{"class":124,"line":421},[78,134490,129],{"emptyLinePlaceholder":128},[78,134492,134493],{"class":124,"line":427},[78,134494,24881],{},[78,134496,134497],{"class":124,"line":433},[78,134498,24886],{},[78,134500,134501],{"class":124,"line":2443},[78,134502,24891],{},[78,134504,134505],{"class":124,"line":2448},[78,134506,24896],{},[78,134508,134509],{"class":124,"line":2454},[78,134510,24901],{},[78,134512,134513],{"class":124,"line":2460},[78,134514,24906],{},[78,134516,134517],{"class":124,"line":2465},[78,134518,24911],{},[78,134520,134521],{"class":124,"line":2470},[78,134522,24916],{},[78,134524,134525],{"class":124,"line":2903},[78,134526,24921],{},[78,134528,134529],{"class":124,"line":2909},[78,134530,24926],{},[78,134532,134533],{"class":124,"line":11477},[78,134534,24931],{},[78,134536,134537],{"class":124,"line":13374},[78,134538,129],{"emptyLinePlaceholder":128},[78,134540,134541],{"class":124,"line":13380},[78,134542,129],{"emptyLinePlaceholder":128},[78,134544,134545],{"class":124,"line":13386},[78,134546,24944],{},[78,134548,134549],{"class":124,"line":13722},[78,134550,24949],{},[78,134552,134553],{"class":124,"line":13727},[78,134554,24954],{},[78,134556,134557],{"class":124,"line":13953},[78,134558,24959],{},[78,134560,134561],{"class":124,"line":13958},[78,134562,129],{"emptyLinePlaceholder":128},[78,134564,134565],{"class":124,"line":13964},[78,134566,24968],{},[78,134568,134569],{"class":124,"line":13969},[78,134570,24973],{},[78,134572,134573],{"class":124,"line":24170},[78,134574,24978],{},[78,134576,134577],{"class":124,"line":24175},[78,134578,24983],{},[78,134580,134581],{"class":124,"line":24180},[78,134582,129],{"emptyLinePlaceholder":128},[78,134584,134585],{"class":124,"line":24186},[78,134586,24992],{},[78,134588,134589],{"class":124,"line":24192},[78,134590,24997],{},[78,134592,134593],{"class":124,"line":24198},[78,134594,129],{"emptyLinePlaceholder":128},[78,134596,134597],{"class":124,"line":24204},[78,134598,25006],{},[78,134600,134601],{"class":124,"line":24210},[78,134602,25011],{},[78,134604,134605],{"class":124,"line":24215},[78,134606,129],{"emptyLinePlaceholder":128},[78,134608,134609],{"class":124,"line":24220},[78,134610,25020],{},[78,134612,134613],{"class":124,"line":24226},[78,134614,25025],{},[78,134616,134617],{"class":124,"line":24232},[78,134618,25030],{},[78,134620,134621],{"class":124,"line":24238},[78,134622,129],{"emptyLinePlaceholder":128},[78,134624,134625],{"class":124,"line":24244},[78,134626,25039],{},[78,134628,134629],{"class":124,"line":24250},[78,134630,25044],{},[78,134632,134633],{"class":124,"line":24256},[78,134634,129],{"emptyLinePlaceholder":128},[78,134636,134637],{"class":124,"line":24262},[78,134638,25053],{},[78,134640,134641],{"class":124,"line":24267},[78,134642,25058],{},[78,134644,134645],{"class":124,"line":24273},[78,134646,25063],{},[78,134648,134649],{"class":124,"line":24279},[78,134650,25068],{},[78,134652,134653],{"class":124,"line":24284},[78,134654,25073],{},[78,134656,134657],{"class":124,"line":24290},[78,134658,25078],{},[78,134660,134661],{"class":124,"line":24296},[78,134662,25083],{},[78,134664,134665],{"class":124,"line":24302},[78,134666,25088],{},[78,134668,134669],{"class":124,"line":24308},[78,134670,25093],{},[78,134672,134673],{"class":124,"line":24314},[78,134674,24992],{},[78,134676,134677],{"class":124,"line":24320},[78,134678,25102],{},[78,134680,134681],{"class":124,"line":24325},[78,134682,25107],{},[78,134684,134685],{"class":124,"line":24331},[78,134686,25112],{},[78,134688,134689],{"class":124,"line":25115},[78,134690,25118],{},[78,134692,134693],{"class":124,"line":25121},[78,134694,25124],{},[78,134696,134697],{"class":124,"line":25127},[78,134698,24167],{},[78,134700,134701],{"class":124,"line":25132},[78,134702,129],{"emptyLinePlaceholder":128},[78,134704,134705],{"class":124,"line":25137},[78,134706,25140],{},[78,134708,134709],{"class":124,"line":25143},[78,134710,25146],{},[78,134712,134713],{"class":124,"line":25149},[78,134714,25152],{},[78,134716,134717],{"class":124,"line":25155},[78,134718,25158],{},[78,134720,134721],{"class":124,"line":25161},[78,134722,129],{"emptyLinePlaceholder":128},[78,134724,134725],{"class":124,"line":25166},[78,134726,25169],{},[78,134728,134729],{"class":124,"line":25172},[78,134730,25175],{},[78,134732,134733],{"class":124,"line":25178},[78,134734,25181],{},[78,134736,134737],{"class":124,"line":25184},[78,134738,25187],{},[78,134740,134741],{"class":124,"line":25190},[78,134742,25193],{},[78,134744,134745],{"class":124,"line":25196},[78,134746,25199],{},[78,134748,134749],{"class":124,"line":25202},[78,134750,129],{"emptyLinePlaceholder":128},[78,134752,134753],{"class":124,"line":25207},[78,134754,129],{"emptyLinePlaceholder":128},[78,134756,134757],{"class":124,"line":25212},[78,134758,25215],{},[78,134760,134761],{"class":124,"line":25218},[78,134762,25221],{},[78,134764,134765],{"class":124,"line":25224},[78,134766,25227],{},[78,134768,134769],{"class":124,"line":25230},[78,134770,25233],{},[78,134772,134773],{"class":124,"line":25236},[78,134774,129],{"emptyLinePlaceholder":128},[78,134776,134777],{"class":124,"line":25241},[78,134778,129],{"emptyLinePlaceholder":128},[78,134780,134781],{"class":124,"line":25246},[78,134782,25249],{},[78,134784,134785],{"class":124,"line":25252},[78,134786,25255],{},[78,134788,134789],{"class":124,"line":25258},[78,134790,25261],{},[78,134792,134793],{"class":124,"line":25264},[78,134794,129],{"emptyLinePlaceholder":128},[78,134796,134797],{"class":124,"line":25269},[78,134798,129],{"emptyLinePlaceholder":128},[78,134800,134801],{"class":124,"line":25274},[78,134802,25277],{},[78,134804,134805],{"class":124,"line":25280},[78,134806,25283],{},[78,134808,134809],{"class":124,"line":25286},[78,134810,25289],{},[78,134812,134813],{"class":124,"line":25292},[78,134814,25295],{},[78,134816,134817],{"class":124,"line":25298},[78,134818,25199],{},[49,134820,134821],{},[52,134822,25305],{},[114,134824,134825],{"className":116,"code":25308,"language":118,"meta":119,"style":119},[17,134826,134827,134831,134835,134839,134843,134847,134851,134855,134859,134863,134867,134871,134875,134879,134883,134887,134891,134895,134899,134903,134907,134911,134915,134919,134923,134927,134931,134935,134939,134943,134947,134951,134955,134959,134963],{"__ignoreMap":119},[78,134828,134829],{"class":124,"line":125},[78,134830,25315],{},[78,134832,134833],{"class":124,"line":132},[78,134834,25320],{},[78,134836,134837],{"class":124,"line":138},[78,134838,129],{"emptyLinePlaceholder":128},[78,134840,134841],{"class":124,"line":144},[78,134842,25329],{},[78,134844,134845],{"class":124,"line":150},[78,134846,129],{"emptyLinePlaceholder":128},[78,134848,134849],{"class":124,"line":156},[78,134850,25338],{},[78,134852,134853],{"class":124,"line":162},[78,134854,25343],{},[78,134856,134857],{"class":124,"line":168},[78,134858,25348],{},[78,134860,134861],{"class":124,"line":174},[78,134862,129],{"emptyLinePlaceholder":128},[78,134864,134865],{"class":124,"line":180},[78,134866,25357],{},[78,134868,134869],{"class":124,"line":186},[78,134870,25362],{},[78,134872,134873],{"class":124,"line":192},[78,134874,25367],{},[78,134876,134877],{"class":124,"line":198},[78,134878,25372],{},[78,134880,134881],{"class":124,"line":204},[78,134882,25377],{},[78,134884,134885],{"class":124,"line":210},[78,134886,129],{"emptyLinePlaceholder":128},[78,134888,134889],{"class":124,"line":216},[78,134890,25386],{},[78,134892,134893],{"class":124,"line":222},[78,134894,25391],{},[78,134896,134897],{"class":124,"line":421},[78,134898,25396],{},[78,134900,134901],{"class":124,"line":427},[78,134902,25401],{},[78,134904,134905],{"class":124,"line":433},[78,134906,25406],{},[78,134908,134909],{"class":124,"line":2443},[78,134910,129],{"emptyLinePlaceholder":128},[78,134912,134913],{"class":124,"line":2448},[78,134914,25415],{},[78,134916,134917],{"class":124,"line":2454},[78,134918,25420],{},[78,134920,134921],{"class":124,"line":2460},[78,134922,25425],{},[78,134924,134925],{"class":124,"line":2465},[78,134926,25430],{},[78,134928,134929],{"class":124,"line":2470},[78,134930,25435],{},[78,134932,134933],{"class":124,"line":2903},[78,134934,25440],{},[78,134936,134937],{"class":124,"line":2909},[78,134938,129],{"emptyLinePlaceholder":128},[78,134940,134941],{"class":124,"line":11477},[78,134942,25449],{},[78,134944,134945],{"class":124,"line":13374},[78,134946,129],{"emptyLinePlaceholder":128},[78,134948,134949],{"class":124,"line":13380},[78,134950,25458],{},[78,134952,134953],{"class":124,"line":13386},[78,134954,25463],{},[78,134956,134957],{"class":124,"line":13722},[78,134958,129],{"emptyLinePlaceholder":128},[78,134960,134961],{"class":124,"line":13727},[78,134962,25472],{},[78,134964,134965],{"class":124,"line":13953},[78,134966,25477],{},[107,134968,25480],{"id":25480},[13,134970,25483],{},[226,134972,228],{},{"title":119,"searchDepth":144,"depth":144,"links":134974},[134975,134976,134977,134978],{"id":23980,"depth":132,"text":23981},{"id":24339,"depth":132,"text":24340},{"id":24780,"depth":132,"text":24781},{"id":25480,"depth":132,"text":25480},{},{"title":23946,"description":119},[794,14541,10715,6380,14542],{"id":25500,"title":25501,"assetBase":239,"author":8,"body":134983,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":134987,"navigation":128,"originalPath":25508,"path":25509,"seo":134988,"source":23330,"stem":25511,"tags":134989,"weight":250,"__hash__":25513},{"type":10,"value":134984,"toc":134985},[],{"title":119,"searchDepth":144,"depth":144,"links":134986},[],{},{"title":25501,"description":119},[2708],{"id":25515,"title":25516,"assetBase":239,"author":8,"body":134991,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":135929,"navigation":128,"originalPath":26775,"path":26776,"seo":135930,"source":23330,"stem":26778,"tags":135931,"weight":250,"__hash__":26780},{"type":10,"value":134992,"toc":135912},[134993,134995,134997,134999,135016,135018,135020,135022,135024,135026,135028,135042,135044,135048,135050,135052,135054,135056,135058,135060,135062,135064,135066,135068,135070,135072,135074,135076,135078,135082,135084,135088,135090,135092,135098,135100,135102,135104,135106,135108,135118,135120,135129,135131,135133,135137,135143,135145,135147,135151,135153,135157,135159,135161,135163,135167,135169,135171,135173,135175,135177,135179,135181,135183,135185,135192,135194,135196,135198,135200,135202,135204,135206,135208,135210,135214,135216,135218,135220,135222,135224,135228,135230,135232,135234,135236,135238,135240,135244,135246,135248,135254,135258,135260,135262,135266,135270,135272,135274,135278,135280,135282,135284,135288,135292,135294,135296,135300,135302,135305,135309,135317,135321,135325,135674,135676,135678,135680,135682,135684,135686,135688,135690,135692,135694,135696,135698,135700,135702,135706,135710,135712,135716,135718,135720,135724,135726,135728,135730,135732,135734,135736,135738,135740,135742,135744,135746,135750,135752,135754,135756,135758,135760,135762,135764,135766,135768,135770,135772,135774,135776,135778,135780,135782,135784,135786,135788,135790,135792,135794,135796,135798,135800,135802,135804,135806,135808,135810,135812,135814,135816,135818,135822,135840,135842,135844,135846,135848,135856,135858,135860,135862,135864,135868,135870,135872,135874,135876,135878,135880,135882,135884,135886,135888,135890,135900,135902,135904,135906,135908,135910],[107,134994,25522],{"id":25521},[7759,134996,25526],{"id":25525},[7759,134998,25530],{"id":25529},[72,135000,135001,135005,135007,135012,135014],{},[13,135002,135003],{},[22,135004,25537],{},[13,135006,25540],{},[13,135008,25543,135009,25549],{},[5009,135010,25548],{"href":25546,"rel":135011},[23647],[13,135013,25552],{},[13,135015,25555],{},[7759,135017,25559],{"id":25558},[13,135019,25562],{},[13,135021,25565],{},[13,135023,25568],{},[13,135025,25571],{},[13,135027,25574],{},[49,135029,135030,135032,135034,135036,135038,135040],{},[52,135031,25579],{},[52,135033,25582],{},[52,135035,25585],{},[52,135037,25588],{},[52,135039,25591],{},[52,135041,25594],{},[13,135043,25597],{},[13,135045,135046],{},[617,135047],{"alt":25602,"src":25603},[13,135049,25606],{},[10548,135051,25610],{"id":25609},[13,135053,25613],{},[7759,135055,25617],{"id":25616},[13,135057,25620],{},[10548,135059,25624],{"id":25623},[13,135061,25627],{},[10548,135063,25631],{"id":25630},[13,135065,25634],{},[10548,135067,25638],{"id":25637},[13,135069,25641],{},[13,135071,25644],{},[13,135073,25647],{},[10548,135075,25651],{"id":25650},[13,135077,25654],{},[72,135079,135080],{},[13,135081,25659],{},[13,135083,25662],{},[13,135085,135086],{},[617,135087],{"alt":25667,"src":25668},[13,135089,25671],{},[10548,135091,25675],{"id":25674},[72,135093,135094,135096],{},[13,135095,25680],{},[13,135097,25683],{},[13,135099,25686],{},[13,135101,25689],{},[7759,135103,25693],{"id":25692},[13,135105,25696],{},[13,135107,25699],{},[49,135109,135110,135112,135114,135116],{},[52,135111,25704],{},[52,135113,25707],{},[52,135115,25710],{},[52,135117,25713],{},[13,135119,25716],{},[72,135121,135122,135124],{},[13,135123,25721],{},[13,135125,25724,135126],{},[5009,135127,25729],{"href":25727,"rel":135128},[23647],[13,135130,25732],{},[10548,135132,25736],{"id":25735},[13,135134,25739,135135,25743],{},[596,135136,25742],{},[13,135138,25746,135139,25750,135141,25754],{},[596,135140,25749],{},[596,135142,25753],{},[13,135144,25757],{},[13,135146,25760],{},[13,135148,135149],{},[617,135150],{"alt":119,"src":25765},[13,135152,25768],{},[13,135154,135155],{},[617,135156],{"alt":119,"src":25773},[13,135158,25776],{},[7759,135160,25780],{"id":25779},[13,135162,25783],{},[13,135164,135165],{},[617,135166],{"alt":119,"src":25788},[13,135168,25791],{},[10548,135170,25795],{"id":25794},[13,135172,25798],{},[13,135174,25801],{},[10548,135176,25805],{"id":25804},[13,135178,25808],{},[10548,135180,25812],{"id":25811},[13,135182,25815],{},[13,135184,25818],{},[72,135186,135187],{},[13,135188,25823,135189],{},[5009,135190,25828],{"href":25826,"rel":135191},[23647],[10548,135193,25832],{"id":25831},[13,135195,25835],{},[10548,135197,25839],{"id":25838},[13,135199,25842],{},[7759,135201,25846],{"id":25845},[13,135203,25849],{},[10548,135205,25853],{"id":25852},[13,135207,25856],{},[13,135209,25859],{},[13,135211,135212],{},[617,135213],{"alt":119,"src":25864},[13,135215,25867],{},[13,135217,25870],{},[10548,135219,25874],{"id":25873},[13,135221,25877],{},[13,135223,25880],{},[13,135225,135226],{},[617,135227],{"alt":119,"src":25885},[7759,135229,25889],{"id":25888},[13,135231,25892],{},[13,135233,25895],{},[10548,135235,25899],{"id":25898},[13,135237,25902],{},[13,135239,25905],{},[13,135241,135242],{},[617,135243],{"alt":119,"src":25910},[13,135245,25913],{},[13,135247,25916],{},[13,135249,25919,135250,25924,135252,25927],{},[25921,135251,25923],{},[25921,135253,17463],{},[13,135255,135256],{},[617,135257],{"alt":119,"src":25932},[13,135259,25935],{},[13,135261,25938],{},[13,135263,135264],{},[617,135265],{"alt":119,"src":25943},[13,135267,25946,135268,25950],{},[25921,135269,25949],{},[13,135271,25953],{},[13,135273,25956],{},[13,135275,135276],{},[617,135277],{"alt":119,"src":25961},[13,135279,25964],{},[13,135281,25967],{},[13,135283,25970],{},[13,135285,135286],{},[617,135287],{"alt":119,"src":25975},[13,135289,25978,135290,25981],{},[25921,135291,5012],{},[13,135293,25984],{},[13,135295,25987],{},[13,135297,135298],{},[617,135299],{"alt":119,"src":25992},[13,135301,25995],{},[78,135303,26002],{"className":135304,"title":26000,"style":26001},[25999],[13,135306,26005,135307,26009],{},[25921,135308,26008],{},[13,135310,26012,135311,26015,135313,26015,135315,26021],{},[25921,135312,5535],{},[25921,135314,5079],{},[25921,135316,26020],{},[13,135318,135319],{},[617,135320],{"alt":119,"src":26026},[13,135322,26029,135323,26032],{},[25921,135324,39],{},[78,135326,135328],{"className":135327},[4566],[78,135329,135331,135406],{"className":135330},[4570],[78,135332,135334],{"className":135333},[4574],[4576,135335,135336],{"xmlns":4578,"display":4579},[4581,135337,135338,135404],{},[4584,135339,135340,135346,135348,135350,135352,135354,135356,135358,135360,135362,135364,135366,135368,135370,135378,135380,135382,135390,135392,135394,135402],{},[4600,135341,135342,135344],{},[4596,135343,26052],{},[4596,135345,39],{},[4591,135347,4609],{},[4596,135349,17143],{},[4596,135351,5012],{},[4596,135353,5012],{},[4596,135355,4618],{},[4596,135357,19],{},[4596,135359,5012],{},[4596,135361,39],{},[4596,135363,5025],{},[4596,135365,19],{},[4591,135367,4594],{"stretchy":4593},[4596,135369,5032],{},[26080,135371,135372,135374,135376],{},[4596,135373,6107],{},[4596,135375,39],{},[4596,135377,5032],{},[4591,135379,2066],{"separator":1419},[4596,135381,5037],{},[26080,135383,135384,135386,135388],{},[4596,135385,6107],{},[4596,135387,39],{},[4596,135389,5037],{},[4591,135391,2066],{"separator":1419},[4596,135393,5042],{},[26080,135395,135396,135398,135400],{},[4596,135397,6107],{},[4596,135399,39],{},[4596,135401,5042],{},[4591,135403,4604],{"stretchy":4593},[4647,135405,26116],{"encoding":4649},[78,135407,135409,135464],{"className":135408,"ariaHidden":1419},[4654],[78,135410,135412,135415,135455,135458,135461],{"className":135411},[4658],[78,135413],{"className":135414,"style":5260},[4662],[78,135416,135418,135421],{"className":135417},[4667],[78,135419,26052],{"className":135420},[4667,4678],[78,135422,135424],{"className":135423},[4689],[78,135425,135427,135447],{"className":135426},[4693,4694],[78,135428,135430,135444],{"className":135429},[4698],[78,135431,135433],{"className":135432,"style":4703},[4702],[78,135434,135435,135438],{"style":4706},[78,135436],{"className":135437,"style":4711},[4710],[78,135439,135441],{"className":135440},[4715,4716,4717,4718],[78,135442,39],{"className":135443},[4667,4678,4718],[78,135445,4726],{"className":135446},[4725],[78,135448,135450],{"className":135449},[4698],[78,135451,135453],{"className":135452,"style":4733},[4702],[78,135454],{},[78,135456],{"className":135457,"style":4740},[4739],[78,135459,4609],{"className":135460},[4744],[78,135462],{"className":135463,"style":4740},[4739],[78,135465,135467,135470,135473,135476,135479,135482,135485,135488,135491,135494,135497,135500,135551,135554,135557,135560,135611,135614,135617,135620,135671],{"className":135466},[4658],[78,135468],{"className":135469,"style":26181},[4662],[78,135471,17143],{"className":135472},[4667,4678],[78,135474,5098],{"className":135475},[4667,4678],[78,135477,4618],{"className":135478},[4667,4678],[78,135480,19],{"className":135481},[4667,4678],[78,135483,5012],{"className":135484},[4667,4678],[78,135486,39],{"className":135487},[4667,4678],[78,135489,5025],{"className":135490},[4667,4678],[78,135492,19],{"className":135493},[4667,4678],[78,135495,4594],{"className":135496},[4674],[78,135498,5032],{"className":135499},[4667,4678],[78,135501,135503,135506],{"className":135502},[4667],[78,135504,6107],{"className":135505,"style":5219},[4667,4678],[78,135507,135509],{"className":135508},[4689],[78,135510,135512,135543],{"className":135511},[4693,4694],[78,135513,135515,135540],{"className":135514},[4698],[78,135516,135518,135529],{"className":135517,"style":26230},[4702],[78,135519,135520,135523],{"style":26233},[78,135521],{"className":135522,"style":4711},[4710],[78,135524,135526],{"className":135525},[4715,4716,4717,4718],[78,135527,39],{"className":135528},[4667,4678,4718],[78,135530,135531,135534],{"style":26245},[78,135532],{"className":135533,"style":4711},[4710],[78,135535,135537],{"className":135536},[4715,4716,4717,4718],[78,135538,5032],{"className":135539},[4667,4678,4718],[78,135541,4726],{"className":135542},[4725],[78,135544,135546],{"className":135545},[4698],[78,135547,135549],{"className":135548,"style":26264},[4702],[78,135550],{},[78,135552,2066],{"className":135553},[5126],[78,135555],{"className":135556,"style":4839},[4739],[78,135558,5037],{"className":135559,"style":5133},[4667,4678],[78,135561,135563,135566],{"className":135562},[4667],[78,135564,6107],{"className":135565,"style":5219},[4667,4678],[78,135567,135569],{"className":135568},[4689],[78,135570,135572,135603],{"className":135571},[4693,4694],[78,135573,135575,135600],{"className":135574},[4698],[78,135576,135578,135589],{"className":135577,"style":5206},[4702],[78,135579,135580,135583],{"style":26296},[78,135581],{"className":135582,"style":4711},[4710],[78,135584,135586],{"className":135585},[4715,4716,4717,4718],[78,135587,39],{"className":135588},[4667,4678,4718],[78,135590,135591,135594],{"style":5209},[78,135592],{"className":135593,"style":4711},[4710],[78,135595,135597],{"className":135596},[4715,4716,4717,4718],[78,135598,5037],{"className":135599,"style":5133},[4667,4678,4718],[78,135601,4726],{"className":135602},[4725],[78,135604,135606],{"className":135605},[4698],[78,135607,135609],{"className":135608,"style":26326},[4702],[78,135610],{},[78,135612,2066],{"className":135613},[5126],[78,135615],{"className":135616,"style":4839},[4739],[78,135618,5042],{"className":135619,"style":5143},[4667,4678],[78,135621,135623,135626],{"className":135622},[4667],[78,135624,6107],{"className":135625,"style":5219},[4667,4678],[78,135627,135629],{"className":135628},[4689],[78,135630,135632,135663],{"className":135631},[4693,4694],[78,135633,135635,135660],{"className":135634},[4698],[78,135636,135638,135649],{"className":135637,"style":5206},[4702],[78,135639,135640,135643],{"style":26296},[78,135641],{"className":135642,"style":4711},[4710],[78,135644,135646],{"className":135645},[4715,4716,4717,4718],[78,135647,39],{"className":135648},[4667,4678,4718],[78,135650,135651,135654],{"style":5209},[78,135652],{"className":135653,"style":4711},[4710],[78,135655,135657],{"className":135656},[4715,4716,4717,4718],[78,135658,5042],{"className":135659,"style":5143},[4667,4678,4718],[78,135661,4726],{"className":135662},[4725],[78,135664,135666],{"className":135665},[4698],[78,135667,135669],{"className":135668,"style":26326},[4702],[78,135670],{},[78,135672,4604],{"className":135673},[4682],[13,135675,26394],{},[13,135677,26397],{},[13,135679,26400],{},[13,135681,26403],{},[10548,135683,26407],{"id":26406},[13,135685,26410],{},[13,135687,26413],{},[13,135689,26416],{},[13,135691,26419],{},[13,135693,26422],{},[13,135695,26425],{},[13,135697,26428],{},[13,135699,26431],{},[13,135701,26434],{},[13,135703,135704],{},[617,135705],{"alt":119,"src":26439},[13,135707,135708],{},[617,135709],{"alt":119,"src":26444},[13,135711,26447],{},[13,135713,135714],{},[617,135715],{"alt":119,"src":26452},[13,135717,26455],{},[13,135719,26458],{},[13,135721,135722],{},[617,135723],{"alt":119,"src":26463},[13,135725,26466],{},[13,135727,26469],{},[13,135729,26472],{},[13,135731,26475],{},[13,135733,26478],{},[13,135735,26481],{},[13,135737,26484],{},[10548,135739,26488],{"id":26487},[13,135741,26491],{},[13,135743,26494],{},[13,135745,26497],{},[13,135747,26500,135748,26503],{},[25921,135749,5535],{},[13,135751,26506],{},[13,135753,26509],{},[13,135755,26512],{},[13,135757,26515],{},[13,135759,26518],{},[13,135761,26521],{},[13,135763,26524],{},[13,135765,26527],{},[13,135767,26530],{},[13,135769,26533],{},[13,135771,26536],{},[13,135773,26539],{},[7759,135775,26543],{"id":26542},[13,135777,26546],{},[13,135779,26549],{},[10548,135781,26553],{"id":26552},[13,135783,26556],{},[13,135785,26559],{},[13,135787,26562],{},[13,135789,26565],{},[13,135791,26568],{},[13,135793,26571],{},[13,135795,26574],{},[13,135797,26577],{},[13,135799,26580],{},[10548,135801,26584],{"id":26583},[13,135803,26587],{},[13,135805,26590],{},[7759,135807,26594],{"id":26593},[13,135809,26597],{},[10548,135811,26601],{"id":26600},[13,135813,26604],{},[13,135815,26607],{},[13,135817,26610],{},[13,135819,26613,135820,26617],{},[22,135821,26616],{},[49,135823,135824,135826,135828,135830,135832,135834,135836,135838],{},[52,135825,26622],{},[52,135827,26625],{},[52,135829,26628],{},[52,135831,26631],{},[52,135833,26634],{},[52,135835,26637],{},[52,135837,26640],{},[52,135839,26643],{},[13,135841,26646],{},[10548,135843,26650],{"id":26649},[13,135845,26653],{},[13,135847,26656],{},[49,135849,135850,135852,135854],{},[52,135851,26661],{},[52,135853,26664],{},[52,135855,26667],{},[13,135857,26670],{},[13,135859,26673],{},[13,135861,26676],{},[13,135863,26679],{},[13,135865,135866],{},[617,135867],{"alt":119,"src":26684},[13,135869,26687],{},[13,135871,26690],{},[7759,135873,26694],{"id":26693},[10548,135875,26698],{"id":26697},[13,135877,26701],{},[10548,135879,26705],{"id":26704},[13,135881,26708],{},[10548,135883,26712],{"id":26711},[13,135885,26715],{},[10548,135887,26719],{"id":26718},[13,135889,26722],{},[49,135891,135892,135894,135896,135898],{},[52,135893,26727],{},[52,135895,26730],{},[52,135897,26733],{},[52,135899,26736],{},[7759,135901,26740],{"id":26739},[13,135903,26743],{},[13,135905,26746],{},[7759,135907,26750],{"id":26749},[13,135909,26753],{},[13,135911,26756],{},{"title":119,"searchDepth":144,"depth":144,"links":135913},[135914],{"id":25521,"depth":132,"text":25522,"children":135915},[135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928],{"id":25525,"depth":144,"text":25526},{"id":25529,"depth":144,"text":25530},{"id":25558,"depth":144,"text":25559},{"id":25616,"depth":144,"text":25617},{"id":25692,"depth":144,"text":25693},{"id":25779,"depth":144,"text":25780},{"id":25845,"depth":144,"text":25846},{"id":25888,"depth":144,"text":25889},{"id":26542,"depth":144,"text":26543},{"id":26593,"depth":144,"text":26594},{"id":26693,"depth":144,"text":26694},{"id":26739,"depth":144,"text":26740},{"id":26749,"depth":144,"text":26750},{},{"title":25516,"description":119},[14541,9133,7744,246,6380,14542],{"id":26782,"title":26783,"assetBase":239,"author":8,"body":135933,"category":29019,"collection":23324,"date":23325,"description":26791,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":137452,"navigation":128,"originalPath":29021,"path":29022,"seo":137453,"source":23330,"stem":29024,"tags":137454,"weight":250,"__hash__":29026},{"type":10,"value":135934,"toc":137397},[135935,135937,135939,135941,135943,135945,135947,135949,135957,135961,135969,135971,135981,135983,135989,135991,136023,136025,136027,136039,136043,136045,136049,136053,136055,136057,136059,136061,136069,136071,136093,136095,136125,136127,136129,136145,136149,136161,136165,136167,136173,136177,136185,136187,136191,136195,136199,136203,136205,136221,136225,136229,136233,136235,136239,136243,136245,136247,136275,136277,136289,136293,136295,136297,136331,136335,136337,136339,136363,136365,136367,136371,136375,136377,136387,136389,136391,136393,136399,136401,136407,136409,136413,136423,136425,136451,136453,136457,136459,136497,136499,136503,136507,136509,136513,136515,136565,136567,136569,136599,136601,136605,136607,136609,136611,136615,136617,136625,136629,136635,136637,136639,136661,136663,136693,136695,136699,136701,136703,136707,136711,136715,136717,136721,136723,136727,136729,136733,136735,136739,136741,136745,136747,136751,136759,136761,136769,136771,136779,136781,136789,136791,136793,136797,136799,136861,136863,136869,136877,136879,136883,136885,136889,136891,136895,136897,136901,136903,136907,136909,136911,136915,136919,136921,136925,136929,136931,136933,136935,136939,136941,136957,136959,136963,136965,136967,136979,136981,136993,136995,136997,137001,137009,137011,137015,137019,137023,137025,137027,137029,137037,137043,137055,137061,137069,137071,137085,137089,137091,137121,137125,137127,137129,137139,137143,137153,137155,137163,137167,137171,137175,137177,137181,137183,137187,137193,137195,137197,137205,137207,137211,137219,137221,137225,137227,137229,137237,137239,137241,137243,137251,137255,137257,137261,137263,137267,137275,137279,137281,137283,137285,137293,137295,137297,137307,137309,137311,137321,137323,137325,137331,137333,137337,137343,137347,137349,137353,137355,137359,137361,137363,137369,137373,137375,137377,137379,137387,137391,137393],[4517,135936,26788],{"id":26788},[13,135938,26791],{},[107,135940,26795],{"id":26794},[23289,135942],{},[107,135944,26801],{"id":26800},[7759,135946,26805],{"id":26804},[13,135948,26808],{},[49,135950,135951,135953,135955],{},[52,135952,26813],{},[52,135954,26816],{},[52,135956,26819],{},[13,135958,135959],{},[617,135960],{"alt":119,"src":26824},[49,135962,135963,135965,135967],{},[52,135964,26829],{},[52,135966,26832],{},[52,135968,26835],{},[7759,135970,26839],{"id":26838},[49,135972,135973,135975,135977,135979],{},[52,135974,26844],{},[52,135976,26847],{},[52,135978,26850],{},[52,135980,26853],{},[7759,135982,26857],{"id":26856},[49,135984,135985,135987],{},[52,135986,26862],{},[52,135988,26865],{},[7759,135990,26869],{"id":26868},[49,135992,135993,135995,136001,136009,136017,136019,136021],{},[52,135994,26874],{},[52,135996,26877,135997],{},[49,135998,135999],{},[52,136000,26882],{},[52,136002,26885,136003],{},[49,136004,136005,136007],{},[52,136006,26890],{},[52,136008,26893],{},[52,136010,26896,136011],{},[49,136012,136013,136015],{},[52,136014,26901],{},[52,136016,26904],{},[52,136018,26907],{},[52,136020,26910],{},[52,136022,26913],{},[7759,136024,26917],{"id":26916},[13,136026,26920],{},[49,136028,136029,136031,136033,136035,136037],{},[52,136030,26925],{},[52,136032,26928],{},[52,136034,26931],{},[52,136036,26934],{},[52,136038,26937],{},[13,136040,136041],{},[617,136042],{"alt":119,"src":26942},[7759,136044,26946],{"id":26945},[13,136046,136047],{},[617,136048],{"alt":119,"src":26951},[13,136050,136051],{},[617,136052],{"alt":119,"src":26956},[13,136054,26959],{},[23289,136056],{},[107,136058,26965],{"id":26964},[7759,136060,26969],{"id":26968},[49,136062,136063,136065,136067],{},[52,136064,26974],{},[52,136066,26977],{},[52,136068,26980],{},[7759,136070,26984],{"id":26983},[49,136072,136073,136081,136089,136091],{},[52,136074,26989,136075],{},[49,136076,136077,136079],{},[52,136078,26994],{},[52,136080,26997],{},[52,136082,27000,136083],{},[49,136084,136085,136087],{},[52,136086,27005],{},[52,136088,27008],{},[52,136090,27011],{},[52,136092,27014],{},[7759,136094,27018],{"id":27017},[49,136096,136097,136099,136101,136103,136111,136119,136121,136123],{},[52,136098,27023],{},[52,136100,27026],{},[52,136102,27029],{},[52,136104,27032,136105],{},[49,136106,136107,136109],{},[52,136108,27037],{},[52,136110,27040],{},[52,136112,27043,136113],{},[49,136114,136115,136117],{},[52,136116,27048],{},[52,136118,27051],{},[52,136120,27054],{},[52,136122,27057],{},[52,136124,27060],{},[7759,136126,27064],{"id":27063},[13,136128,27067],{},[49,136130,136131,136133,136135,136137],{},[52,136132,27072],{},[52,136134,27075],{},[52,136136,27078],{},[52,136138,27081,136139],{},[49,136140,136141,136143],{},[52,136142,27086],{},[52,136144,27089],{},[13,136146,136147],{},[617,136148],{"alt":119,"src":27094},[49,136150,136151],{},[52,136152,27099,136153],{},[49,136154,136155,136159],{},[52,136156,27104,136157,27108],{},[25921,136158,27107],{},[52,136160,27111],{},[13,136162,136163],{},[617,136164],{"alt":119,"src":27116},[13,136166,27119],{},[49,136168,136169,136171],{},[52,136170,27124],{},[52,136172,27127],{},[13,136174,136175],{},[617,136176],{"alt":119,"src":27132},[49,136178,136179,136181,136183],{},[52,136180,27137],{},[52,136182,27140],{},[52,136184,27143],{},[13,136186,27146],{},[13,136188,27149,136189,27153],{},[25921,136190,27152],{},[13,136192,27156,136193,27159],{},[25921,136194,27152],{},[49,136196,136197],{},[52,136198,27164],{},[13,136200,136201],{},[617,136202],{"alt":119,"src":27169},[7759,136204,27173],{"id":27172},[49,136206,136207,136209,136219],{},[52,136208,27178],{},[52,136210,27181,136211],{},[49,136212,136213,136215,136217],{},[52,136214,27186],{},[52,136216,27189],{},[52,136218,27192],{},[52,136220,27195],{},[13,136222,136223],{},[617,136224],{"alt":119,"src":27200},[49,136226,136227],{},[52,136228,27205],{},[13,136230,136231],{},[617,136232],{"alt":119,"src":27210},[7759,136234,27214],{"id":27213},[49,136236,136237],{},[52,136238,27219],{},[13,136240,136241],{},[617,136242],{"alt":119,"src":27224},[13,136244,27227],{},[10548,136246,27231],{"id":27230},[49,136248,136249,136251,136253,136265],{},[52,136250,27236],{},[52,136252,27239],{},[52,136254,27242,136255],{},[49,136256,136257,136259,136261,136263],{},[52,136258,27247],{},[52,136260,27250],{},[52,136262,27253],{},[52,136264,27256],{},[52,136266,27259,136267],{},[49,136268,136269,136271,136273],{},[52,136270,27264],{},[52,136272,27267],{},[52,136274,27270],{},[10548,136276,27274],{"id":27273},[49,136278,136279],{},[52,136280,27279,136281],{},[49,136282,136283,136285,136287],{},[52,136284,27284],{},[52,136286,27287],{},[52,136288,27290],{},[13,136290,136291],{},[617,136292],{"alt":119,"src":27295},[10548,136294,27299],{"id":27298},[13,136296,27302],{},[49,136298,136299,136303,136315,136317,136319],{},[52,136300,136301,27310],{},[22,136302,27309],{},[52,136304,136305,136307],{},[22,136306,27315],{},[49,136308,136309,136313],{},[52,136310,27320,136311,67],{},[22,136312,27323],{},[52,136314,27326],{},[52,136316,27329],{},[52,136318,27332],{},[52,136320,27335,136321],{},[49,136322,136323,136327],{},[52,136324,136325,27343],{},[22,136326,27342],{},[52,136328,136329,27349],{},[22,136330,27348],{},[13,136332,136333],{},[617,136334],{"alt":119,"src":27354},[7759,136336,27358],{"id":27357},[10548,136338,27362],{"id":27361},[49,136340,136341,136343,136359],{},[52,136342,27367],{},[52,136344,27370,136345,27374,136347,11315,136349],{},[22,136346,27373],{},[22,136348,27377],{},[49,136350,136351,136355],{},[52,136352,27382,136353,27386],{},[22,136354,27385],{},[52,136356,27389,136357],{},[22,136358,27392],{},[52,136360,27395,136361],{},[22,136362,27398],{},[10548,136364,27402],{"id":27401},[13,136366,27405],{},[13,136368,136369],{},[617,136370],{"alt":119,"src":27410},[13,136372,136373],{},[617,136374],{"alt":119,"src":27415},[10548,136376,27419],{"id":27418},[49,136378,136379,136381],{},[52,136380,27424],{},[52,136382,27427,136383,27430,136385],{},[25921,136384,2949],{},[25921,136386,27433],{},[7759,136388,27437],{"id":27436},[10548,136390,27362],{"id":27440},[13,136392,27443],{},[49,136394,136395,136397],{},[52,136396,27448],{},[52,136398,27451],{},[13,136400,27454],{},[49,136402,136403,136405],{},[52,136404,27459],{},[52,136406,27462],{},[10548,136408,27466],{"id":27465},[13,136410,136411],{},[617,136412],{"alt":119,"src":27471},[49,136414,136415,136419],{},[52,136416,27476,136417],{},[22,136418,27479],{},[52,136420,27476,136421],{},[22,136422,27484],{},[7759,136424,27488],{"id":27487},[49,136426,136427,136433,136437,136439,136443,136447],{},[52,136428,27493,136429,27497,136431],{},[22,136430,27496],{},[22,136432,27500],{},[52,136434,27503,136435,27507],{},[22,136436,27506],{},[52,136438,27510],{},[52,136440,136441],{},[22,136442,27515],{},[52,136444,136445,27521],{},[22,136446,27520],{},[52,136448,27524,136449],{},[22,136450,27527],{},[7759,136452,27531],{"id":27530},[13,136454,136455],{},[617,136456],{"alt":119,"src":27536},[10548,136458,27540],{"id":27539},[49,136460,136461,136467,136473,136475,136481,136485],{},[52,136462,27545,136463,27549,136465],{},[22,136464,27548],{},[22,136466,27552],{},[52,136468,27555,136469,27559,136471],{},[22,136470,27558],{},[22,136472,27562],{},[52,136474,27565],{},[52,136476,27568,136477,27572,136479,27576],{},[22,136478,27571],{},[22,136480,27575],{},[52,136482,27579,136483,67],{},[22,136484,27582],{},[52,136486,27585,136487],{},[49,136488,136489,136493],{},[52,136490,136491],{},[22,136492,27592],{},[52,136494,136495,27598],{},[22,136496,27597],{},[10548,136498,27602],{"id":27601},[13,136500,136501],{},[617,136502],{"alt":119,"src":27607},[13,136504,136505],{},[22,136506,27612],{},[10548,136508,27616],{"id":27615},[13,136510,136511],{},[617,136512],{"alt":119,"src":27621},[10548,136514,27625],{"id":27624},[49,136516,136517,136543],{},[52,136518,27630,136519],{},[49,136520,136521,136527],{},[52,136522,27635,136523,27639,136525,67],{},[22,136524,27638],{},[22,136526,27642],{},[52,136528,27645,136529],{},[49,136530,136531,136535,136539],{},[52,136532,136533,27653],{},[22,136534,27652],{},[52,136536,136537,27659],{},[22,136538,27658],{},[52,136540,136541],{},[22,136542,27664],{},[52,136544,27667,136545,27671,136547,67,136549],{},[22,136546,27670],{},[22,136548,27674],{},[49,136550,136551,136555,136559],{},[52,136552,27679,136553,27683],{},[22,136554,27682],{},[52,136556,27686,136557],{},[22,136558,27689],{},[52,136560,27692,136561,27696,136563],{},[22,136562,27695],{},[22,136564,27699],{},[7759,136566,27703],{"id":27702},[10548,136568,27707],{"id":27706},[49,136570,136571,136575,136577,136589],{},[52,136572,27712,136573],{},[22,136574,27715],{},[52,136576,27718],{},[52,136578,27721,136579,819,136581],{},[22,136580,27724],{},[49,136582,136583,136585,136587],{},[52,136584,27652],{},[52,136586,27731],{},[52,136588,27734],{},[52,136590,27737,136591],{},[49,136592,136593,136595],{},[52,136594,27742],{},[52,136596,27745,136597,67],{},[22,136598,27748],{},[10548,136600,27752],{"id":27751},[13,136602,136603],{},[617,136604],{"alt":119,"src":27757},[23289,136606],{},[107,136608,27763],{"id":27762},[7759,136610,27767],{"id":27766},[13,136612,27770,136613],{},[22,136614,27773],{},[13,136616,27776],{},[49,136618,136619,136621,136623],{},[52,136620,27781],{},[52,136622,27784],{},[52,136624,27787],{},[13,136626,27790,136627,67],{},[22,136628,27793],{},[13,136630,27796,136631,27800,136633,67],{},[22,136632,27799],{},[22,136634,27803],{},[7759,136636,27807],{"id":27806},[10548,136638,27811],{"id":27810},[49,136640,136641,136645,136649,136653,136657],{},[52,136642,136643],{},[22,136644,27818],{},[52,136646,27821,136647,27825],{},[22,136648,27824],{},[52,136650,27828,136651],{},[22,136652,27831],{},[52,136654,27834,136655,27838],{},[22,136656,27837],{},[52,136658,136659],{},[22,136660,27843],{},[10548,136662,27847],{"id":27846},[49,136664,136665,136669,136673,136677,136681,136685,136689],{},[52,136666,136667],{},[22,136668,27854],{},[52,136670,136671],{},[22,136672,27859],{},[52,136674,136675],{},[22,136676,27864],{},[52,136678,27867,136679],{},[22,136680,27870],{},[52,136682,27873,136683],{},[22,136684,27876],{},[52,136686,27879,136687,27883],{},[22,136688,27882],{},[52,136690,27886,136691,27890],{},[22,136692,27889],{},[10548,136694,27894],{"id":27893},[13,136696,136697],{},[617,136698],{"alt":119,"src":27899},[7759,136700,27903],{"id":27902},[10548,136702,27707],{"id":27906},[13,136704,136705],{},[617,136706],{"alt":119,"src":27911},[13,136708,27914,136709,27918],{},[22,136710,27917],{},[13,136712,136713],{},[617,136714],{"alt":119,"src":27923},[10548,136716,27927],{"id":27926},[13,136718,136719],{},[617,136720],{"alt":119,"src":27932},[10548,136722,27936],{"id":27935},[13,136724,136725],{},[617,136726],{"alt":119,"src":27941},[10548,136728,27945],{"id":27944},[13,136730,136731],{},[617,136732],{"alt":119,"src":27950},[10548,136734,27954],{"id":27953},[13,136736,136737],{},[617,136738],{"alt":119,"src":27959},[7759,136740,27963],{"id":27962},[13,136742,136743],{},[617,136744],{"alt":119,"src":27968},[7759,136746,27972],{"id":27971},[10548,136748,27976,136749],{"id":27975},[22,136750,27979],{},[49,136752,136753,136757],{},[52,136754,27984,136755,67],{},[22,136756,27987],{},[52,136758,27990],{},[10548,136760,27994],{"id":27993},[49,136762,136763,136765,136767],{},[52,136764,27999],{},[52,136766,28002],{},[52,136768,28005],{},[10548,136770,28009],{"id":28008},[49,136772,136773,136775,136777],{},[52,136774,28014],{},[52,136776,28017],{},[52,136778,28020],{},[10548,136780,28024],{"id":28023},[49,136782,136783,136785,136787],{},[52,136784,28029],{},[52,136786,28032],{},[52,136788,28035],{},[7759,136790,28039],{"id":28038},[10548,136792,27707],{"id":28042},[13,136794,136795],{},[617,136796],{"alt":119,"src":28047},[10548,136798,28051],{"id":28050},[49,136800,136801,136803,136807,136823,136829,136833,136843],{},[52,136802,28056],{},[52,136804,28059,136805,28063],{},[22,136806,28062],{},[52,136808,28066,136809,28070,136811,136813],{},[22,136810,28069],{},[22,136812,28073],{},[49,136814,136815,136817,136819],{},[52,136816,28078],{},[52,136818,28081],{},[52,136820,28084,136821,67],{},[22,136822,28087],{},[52,136824,28090,136825,28094,136827],{},[22,136826,28093],{},[22,136828,28097],{},[52,136830,28100,136831],{},[22,136832,28103],{},[52,136834,28106,136835],{},[49,136836,136837,136839,136841],{},[52,136838,28111],{},[52,136840,28114],{},[52,136842,28117],{},[52,136844,28120,136845,28124,136847],{},[22,136846,28123],{},[49,136848,136849,136853,136857],{},[52,136850,136851,28132],{},[22,136852,28131],{},[52,136854,28135,136855,28139],{},[22,136856,28138],{},[52,136858,28142,136859,28146],{},[22,136860,28145],{},[10548,136862,28150],{"id":28149},[13,136864,28153,136865,28157,136867,28161],{},[22,136866,28156],{},[22,136868,28160],{},[13,136870,28164,136871,28168,136873,28172,136875,67],{},[22,136872,28167],{},[22,136874,28171],{},[22,136876,28175],{},[13,136878,28178],{},[13,136880,136881],{},[617,136882],{"alt":119,"src":28183},[10548,136884,28187],{"id":28186},[13,136886,136887],{},[617,136888],{"alt":119,"src":28192},[7759,136890,28196],{"id":28195},[13,136892,136893],{},[617,136894],{"alt":119,"src":28201},[7759,136896,28205],{"id":28204},[13,136898,136899],{},[617,136900],{"alt":119,"src":28210},[7759,136902,28214],{"id":28213},[13,136904,136905],{},[617,136906],{"alt":119,"src":28219},[23289,136908],{},[107,136910,28225],{"id":28224},[13,136912,28228,136913,67],{},[22,136914,28231],{},[13,136916,28234,136917,28238],{},[22,136918,28237],{},[7759,136920,27767],{"id":28241},[13,136922,28244,136923,67],{},[22,136924,28247],{},[13,136926,28250,136927,67],{},[22,136928,28253],{},[7759,136930,28257],{"id":28256},[10548,136932,28261],{"id":28260},[13,136934,28264],{},[13,136936,28267,136937,67],{},[22,136938,28270],{},[13,136940,28273],{},[49,136942,136943,136953],{},[52,136944,28278,136945],{},[49,136946,136947,136949,136951],{},[52,136948,28283],{},[52,136950,28286],{},[52,136952,28289],{},[52,136954,136955],{},[22,136956,28294],{},[10548,136958,28298],{"id":28297},[13,136960,136961],{},[617,136962],{"alt":119,"src":28303},[7759,136964,28307],{"id":28306},[10548,136966,28311],{"id":28310},[49,136968,136969,136971,136973,136975,136977],{},[52,136970,28316],{},[52,136972,28319],{},[52,136974,28322],{},[52,136976,28325],{},[52,136978,28328],{},[10548,136980,28332],{"id":28331},[49,136982,136983,136985,136987,136989,136991],{},[52,136984,28337],{},[52,136986,28340],{},[52,136988,28343],{},[52,136990,28346],{},[52,136992,28349],{},[7759,136994,28353],{"id":28352},[13,136996,28356],{},[13,136998,28359,136999,67],{},[22,137000,28362],{},[13,137002,28365,137003,28368,137005,28372,137007,67],{},[22,137004,11676],{},[22,137006,28371],{},[22,137008,28375],{},[7759,137010,28379],{"id":28378},[13,137012,28382,137013,28386],{},[22,137014,28385],{},[13,137016,28389,137017],{},[22,137018,28392],{},[13,137020,137021],{},[617,137022],{"alt":119,"src":28397},[23289,137024],{},[10548,137026,28403],{"id":28402},[13,137028,28406],{},[49,137030,137031,137033,137035],{},[52,137032,28411],{},[52,137034,28414],{},[52,137036,28417],{},[13,137038,28420,137039,28424,137041,67],{},[22,137040,28423],{},[22,137042,28427],{},[49,137044,137045,137049],{},[52,137046,28432,137047,28436],{},[22,137048,28435],{},[52,137050,28439,137051,28443,137053,28447],{},[22,137052,28442],{},[22,137054,28446],{},[13,137056,28450,137057,28454,137059,28458],{},[22,137058,28453],{},[22,137060,28457],{},[49,137062,137063,137065,137067],{},[52,137064,28463],{},[52,137066,28466],{},[52,137068,28469],{},[10548,137070,28473],{"id":28472},[49,137072,137073,137081,137083],{},[52,137074,28478,137075],{},[49,137076,137077,137079],{},[52,137078,28483],{},[52,137080,28486],{},[52,137082,28489],{},[52,137084,28492],{},[13,137086,137087],{},[617,137088],{"alt":119,"src":28497},[10548,137090,28501],{"id":28500},[49,137092,137093,137105],{},[52,137094,28506,137095],{},[49,137096,137097,137099,137101,137103],{},[52,137098,28511],{},[52,137100,28514],{},[52,137102,28517],{},[52,137104,28520],{},[52,137106,28523,137107],{},[49,137108,137109,137111],{},[52,137110,28528],{},[52,137112,28531,137113],{},[49,137114,137115,137117,137119],{},[52,137116,28536],{},[52,137118,28539],{},[52,137120,28542],{},[13,137122,137123],{},[617,137124],{"alt":119,"src":28547},[7759,137126,28551],{"id":28550},[10548,137128,28555],{"id":28554},[49,137130,137131,137133],{},[52,137132,28560],{},[52,137134,28563,137135,28569],{},[22,137136,28566,137137],{},[25921,137138,262],{},[13,137140,137141],{},[617,137142],{"alt":119,"src":28574},[49,137144,137145],{},[52,137146,28579,137147,28582,137149,67],{},[25921,137148,262],{},[22,137150,28585,137151],{},[25921,137152,262],{},[10548,137154,28591],{"id":28590},[13,137156,28594,137157,28601,137161,28604],{},[22,137158,28597,137159,28600],{},[25921,137160,262],{},[25921,137162,262],{},[49,137164,137165],{},[52,137166,28609],{},[13,137168,28612,137169,28616],{},[22,137170,28615],{},[13,137172,137173],{},[617,137174],{"alt":119,"src":28621},[7759,137176,28625],{"id":28624},[13,137178,28628,137179,28632],{},[22,137180,28631],{},[10548,137182,28636],{"id":28635},[13,137184,28639,137185,67],{},[22,137186,28642],{},[49,137188,137189,137191],{},[52,137190,28647],{},[52,137192,28650],{},[10548,137194,28654],{"id":28653},[13,137196,28657],{},[49,137198,137199,137201],{},[52,137200,28662],{},[52,137202,28665,137203,67],{},[22,137204,28668],{},[10548,137206,28672],{"id":28671},[13,137208,28675,137209,28679],{},[22,137210,28678],{},[49,137212,137213,137217],{},[52,137214,137215,28687],{},[22,137216,28686],{},[52,137218,28690],{},[10548,137220,28672],{"id":28693},[13,137222,137223,28699],{},[22,137224,28698],{},[7759,137226,28703],{"id":28702},[13,137228,28706],{},[49,137230,137231,137233,137235],{},[52,137232,28711],{},[52,137234,28714],{},[52,137236,28717],{},[13,137238,28720],{},[10548,137240,28724],{"id":28723},[13,137242,28727],{},[49,137244,137245,137247,137249],{},[52,137246,28732],{},[52,137248,28735],{},[52,137250,28738],{},[13,137252,137253],{},[617,137254],{"alt":119,"src":28743},[10548,137256,28747],{"id":28746},[13,137258,137259],{},[617,137260],{"alt":119,"src":28752},[7759,137262,28756],{"id":28755},[13,137264,28759,137265,28762],{},[22,137266,28343],{},[49,137268,137269,137273],{},[52,137270,28767,137271,28771],{},[22,137272,28770],{},[52,137274,28774],{},[13,137276,137277],{},[617,137278],{"alt":119,"src":28779},[23289,137280],{},[107,137282,28785],{"id":28784},[13,137284,28788],{},[49,137286,137287,137289,137291],{},[52,137288,28793],{},[52,137290,28796],{},[52,137292,28799],{},[7759,137294,28803],{"id":28802},[10548,137296,28807],{"id":28806},[49,137298,137299,137301,137303,137305],{},[52,137300,28812],{},[52,137302,28815],{},[52,137304,28818],{},[52,137306,28821],{},[10548,137308,28825],{"id":28824},[10548,137310,28829],{"id":28828},[49,137312,137313,137317],{},[52,137314,28834,137315,67],{},[22,137316,28837],{},[52,137318,28840,137319,28844],{},[22,137320,28843],{},[7759,137322,28848],{"id":28847},[10548,137324,28852],{"id":28851},[13,137326,28855,137327,28859,137329,28863],{},[22,137328,28858],{},[22,137330,28862],{},[13,137332,28866],{},[13,137334,28869,137335,28873],{},[22,137336,28872],{},[13,137338,28876,137339,28880,137341,67],{},[22,137340,28879],{},[22,137342,28883],{},[13,137344,28886,137345,28890],{},[22,137346,28889],{},[7759,137348,28894],{"id":28893},[13,137350,137351],{},[617,137352],{"alt":119,"src":28899},[7759,137354,28903],{"id":28902},[13,137356,137357],{},[617,137358],{"alt":119,"src":28908},[7759,137360,28912],{"id":28911},[13,137362,28915],{},[49,137364,137365,137367],{},[52,137366,28920],{},[52,137368,28923],{},[13,137370,137371],{},[617,137372],{"alt":119,"src":28928},[7759,137374,28932],{"id":28931},[13,137376,28935],{},[13,137378,28938],{},[49,137380,137381,137383,137385],{},[52,137382,28943],{},[52,137384,28946],{},[52,137386,28949],{},[13,137388,137389],{},[617,137390],{"alt":119,"src":28954},[7759,137392,28958],{"id":28957},[13,137394,137395],{},[617,137396],{"alt":119,"src":28963},{"title":119,"searchDepth":144,"depth":144,"links":137398},[137399,137400,137408,137421,137432,137443],{"id":26794,"depth":132,"text":26795},{"id":26800,"depth":132,"text":26801,"children":137401},[137402,137403,137404,137405,137406,137407],{"id":26804,"depth":144,"text":26805},{"id":26838,"depth":144,"text":26839},{"id":26856,"depth":144,"text":26857},{"id":26868,"depth":144,"text":26869},{"id":26916,"depth":144,"text":26917},{"id":26945,"depth":144,"text":26946},{"id":26964,"depth":132,"text":26965,"children":137409},[137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420],{"id":26968,"depth":144,"text":26969},{"id":26983,"depth":144,"text":26984},{"id":27017,"depth":144,"text":27018},{"id":27063,"depth":144,"text":27064},{"id":27172,"depth":144,"text":27173},{"id":27213,"depth":144,"text":27214},{"id":27357,"depth":144,"text":27358},{"id":27436,"depth":144,"text":27437},{"id":27487,"depth":144,"text":27488},{"id":27530,"depth":144,"text":27531},{"id":27702,"depth":144,"text":27703},{"id":27762,"depth":132,"text":27763,"children":137422},[137423,137424,137425,137426,137427,137428,137429,137430,137431],{"id":27766,"depth":144,"text":27767},{"id":27806,"depth":144,"text":27807},{"id":27902,"depth":144,"text":27903},{"id":27962,"depth":144,"text":27963},{"id":27971,"depth":144,"text":27972},{"id":28038,"depth":144,"text":28039},{"id":28195,"depth":144,"text":28196},{"id":28204,"depth":144,"text":28205},{"id":28213,"depth":144,"text":28214},{"id":28224,"depth":132,"text":28225,"children":137433},[137434,137435,137436,137437,137438,137439,137440,137441,137442],{"id":28241,"depth":144,"text":27767},{"id":28256,"depth":144,"text":28257},{"id":28306,"depth":144,"text":28307},{"id":28352,"depth":144,"text":28353},{"id":28378,"depth":144,"text":28379},{"id":28550,"depth":144,"text":28551},{"id":28624,"depth":144,"text":28625},{"id":28702,"depth":144,"text":28703},{"id":28755,"depth":144,"text":28756},{"id":28784,"depth":132,"text":28785,"children":137444},[137445,137446,137447,137448,137449,137450,137451],{"id":28802,"depth":144,"text":28803},{"id":28847,"depth":144,"text":28848},{"id":28893,"depth":144,"text":28894},{"id":28902,"depth":144,"text":28903},{"id":28911,"depth":144,"text":28912},{"id":28931,"depth":144,"text":28932},{"id":28957,"depth":144,"text":28958},{},{"title":26783,"description":26791},[2708],{"id":29028,"title":29029,"assetBase":239,"author":8,"body":137456,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":138335,"navigation":128,"originalPath":30313,"path":30314,"seo":138336,"source":23330,"stem":30316,"tags":138337,"weight":250,"__hash__":30318},{"type":10,"value":137457,"toc":138309},[137458,137460,137464,137466,137470,137472,137474,137476,137480,137484,137486,137488,137490,137492,137522,137524,137526,137528,137536,137538,137540,137542,137544,137548,137556,137570,137590,137592,137670,137672,137674,137676,137678,137708,137710,137730,137732,137736,137762,137764,137766,137768,137772,137778,137780,137782,137792,137794,137796,137804,137806,137808,137812,137824,137828,137830,137832,137836,137840,137844,137848,137852,137856,137860,137864,137866,137868,137872,137876,137880,137884,137886,137888,137890,137894,137902,137906,137908,137910,137930,137932,137934,137982,137984,137986,137998,138002,138004,138006,138008,138010,138012,138016,138018,138020,138022,138032,138034,138036,138046,138048,138050,138060,138062,138064,138066,138070,138074,138076,138080,138084,138088,138090,138094,138102,138106,138114,138116,138120,138124,138128,138130,138132,138134,138136,138138,138140,138142,138144,138146,138148,138150,138152,138154,138156,138160,138162,138164,138166,138168,138170,138172,138176,138180,138184,138188,138190,138192,138194,138196,138201,138203,138205,138207,138209,138211,138213,138215,138217,138221,138223,138227,138231,138235,138239,138243,138247,138251,138255,138257,138259,138261,138263,138265,138267,138269,138275,138277,138279,138281,138283,138285,138287,138289,138291,138299,138301],[4517,137459,29029],{"id":29034},[72,137461,137462],{},[13,137463,29039],{},[107,137465,29043],{"id":29042},[72,137467,137468],{},[13,137469,29048],{},[7759,137471,29052],{"id":29051},[10548,137473,29056],{"id":29055},[13,137475,29059],{},[13,137477,29062,137478,29066],{},[22,137479,29065],{},[13,137481,29069,137482,29073],{},[22,137483,29072],{},[10548,137485,29077],{"id":29076},[13,137487,29080],{},[10548,137489,29084],{"id":29083},[13,137491,29087],{},[49,137493,137494,137504,137510,137516],{},[52,137495,29092,137496],{},[49,137497,137498,137500,137502],{},[52,137499,29097],{},[52,137501,29100],{},[52,137503,29103],{},[52,137505,29106,137506],{},[49,137507,137508],{},[52,137509,29111],{},[52,137511,29114,137512],{},[49,137513,137514],{},[52,137515,29119],{},[52,137517,29122,137518],{},[49,137519,137520],{},[52,137521,29127],{},[10548,137523,29131],{"id":29130},[13,137525,29134],{},[13,137527,29137],{},[49,137529,137530,137532,137534],{},[52,137531,29142],{},[52,137533,29145],{},[52,137535,29148],{},[10548,137537,29152],{"id":29151},[13,137539,29155],{},[7759,137541,29159],{"id":29158},[10548,137543,29163],{"id":29162},[13,137545,29166,137546,29170],{},[22,137547,29169],{},[49,137549,137550],{},[52,137551,29175,137552],{},[49,137553,137554],{},[52,137555,29180],{},[72,137557,137558,137562,137564,137566,137568],{},[13,137559,137560],{},[22,137561,29187],{},[13,137563,29190],{},[13,137565,29193],{},[13,137567,29196],{},[13,137569,29199],{},[49,137571,137572,137578,137580],{},[52,137573,29204,137574],{},[49,137575,137576],{},[52,137577,29209],{},[52,137579,29212],{},[52,137581,29215,137582],{},[49,137583,137584,137586,137588],{},[52,137585,29220],{},[52,137587,29223],{},[52,137589,29226],{},[10548,137591,29230],{"id":29229},[49,137593,137594,137604,137616],{},[52,137595,29235,137596],{},[49,137597,137598,137600,137602],{},[52,137599,29240],{},[52,137601,29243],{},[52,137603,29246],{},[52,137605,29249,137606],{},[49,137607,137608,137610,137612,137614],{},[52,137609,29254],{},[52,137611,29257],{},[52,137613,29260],{},[52,137615,29263],{},[52,137617,29266,137618,137632,137650],{},[49,137619,137620],{},[52,137621,29271,137622],{},[49,137623,137624,137626,137628,137630],{},[52,137625,29276],{},[52,137627,29279],{},[52,137629,29282],{},[52,137631,29285],{},[72,137633,137634,137638],{},[13,137635,137636],{},[22,137637,29292],{},[2285,137639,137640,137642,137644,137646,137648],{},[52,137641,29297],{},[52,137643,29300],{},[52,137645,29303],{},[52,137647,29306],{},[52,137649,29309],{},[49,137651,137652,137668],{},[52,137653,29314,137654],{},[49,137655,137656,137658,137660,137662,137664,137666],{},[52,137657,29319],{},[52,137659,29322],{},[52,137661,29325],{},[52,137663,29328],{},[52,137665,29331],{},[52,137667,29334],{},[52,137669,29337],{},[13,137671,29340],{},[7759,137673,29344],{"id":29343},[10548,137675,29348],{"id":29347},[13,137677,29351],{},[49,137679,137680],{},[52,137681,29356,137682],{},[49,137683,137684,137696,137698,137706],{},[52,137685,29361,137686],{},[49,137687,137688,137690,137692,137694],{},[52,137689,29366],{},[52,137691,29369],{},[52,137693,29372],{},[52,137695,29375],{},[52,137697,29378],{},[52,137699,29381,137700],{},[49,137701,137702,137704],{},[52,137703,29386],{},[52,137705,29389],{},[52,137707,29392],{},[10548,137709,29396],{"id":29395},[49,137711,137712,137714,137716,137718,137720,137722,137724,137726,137728],{},[52,137713,29401],{},[52,137715,29404],{},[52,137717,29407],{},[52,137719,29410],{},[52,137721,29413],{},[52,137723,29416],{},[52,137725,29419],{},[52,137727,29422],{},[52,137729,29425],{},[10548,137731,29429],{"id":29428},[13,137733,137734],{},[617,137735],{"alt":119,"src":29434},[49,137737,137738,137742,137746,137750,137754,137758],{},[52,137739,137740,29442],{},[22,137741,29441],{},[52,137743,137744,29448],{},[22,137745,29447],{},[52,137747,137748,29454],{},[22,137749,29453],{},[52,137751,137752,29460],{},[22,137753,29459],{},[52,137755,137756,29466],{},[22,137757,29465],{},[52,137759,137760,29472],{},[22,137761,29471],{},[23289,137763],{},[107,137765,29478],{"id":29477},[7759,137767,29482],{"id":29481},[13,137769,29485,137770],{},[22,137771,29488],{},[49,137773,137774,137776],{},[52,137775,29493],{},[52,137777,29496],{},[10548,137779,29499],{"id":29499},[13,137781,29502],{},[49,137783,137784,137786,137788,137790],{},[52,137785,29507],{},[52,137787,29510],{},[52,137789,29513],{},[52,137791,29516],{},[10548,137793,29519],{"id":29519},[13,137795,29522],{},[49,137797,137798,137800,137802],{},[52,137799,29527],{},[52,137801,29530],{},[52,137803,29533],{},[7759,137805,29537],{"id":29536},[10548,137807,29541],{"id":29540},[13,137809,29544,137810,67],{},[22,137811,29547],{},[49,137813,137814,137816,137818,137820,137822],{},[52,137815,29552],{},[52,137817,29555],{},[52,137819,29558],{},[52,137821,29561],{},[52,137823,29564],{},[13,137825,137826],{},[22,137827,29569],{},[13,137829,29572],{},[10548,137831,29576],{"id":29575},[13,137833,137834,29581],{},[22,137835,29257],{},[49,137837,137838],{},[52,137839,29586],{},[13,137841,137842,29592],{},[22,137843,29591],{},[49,137845,137846],{},[52,137847,29597],{},[13,137849,137850,29603],{},[22,137851,29602],{},[49,137853,137854],{},[52,137855,29608],{},[13,137857,137858,29614],{},[22,137859,29613],{},[49,137861,137862],{},[52,137863,29619],{},[7759,137865,29623],{"id":29622},[13,137867,29626],{},[13,137869,29629,137870],{},[22,137871,29632],{},[13,137873,137874],{},[22,137875,29637],{},[13,137877,29640,137878,67],{},[22,137879,29643],{},[13,137881,29646,137882,67],{},[22,137883,29649],{},[10548,137885,29652],{"id":29652},[13,137887,29655],{},[13,137889,29658],{},[13,137891,29661,137892,29665],{},[22,137893,29664],{},[49,137895,137896,137898,137900],{},[52,137897,29670],{},[52,137899,29673],{},[52,137901,29676],{},[13,137903,29679,137904,29683],{},[22,137905,29682],{},[7759,137907,29687],{"id":29686},[13,137909,29690],{},[49,137911,137912,137918,137924],{},[52,137913,29695,137914],{},[49,137915,137916],{},[52,137917,29700],{},[52,137919,29703,137920],{},[49,137921,137922],{},[52,137923,29708],{},[52,137925,29711,137926],{},[49,137927,137928],{},[52,137929,29716],{},[7759,137931,29720],{"id":29719},[13,137933,29723],{},[49,137935,137936,137944,137952,137960],{},[52,137937,137938,29731,137940],{},[22,137939,29730],{},[49,137941,137942],{},[52,137943,29736],{},[52,137945,137946,29742,137948],{},[22,137947,29741],{},[49,137949,137950],{},[52,137951,29747],{},[52,137953,137954,29753,137956],{},[22,137955,29752],{},[49,137957,137958],{},[52,137959,29758],{},[52,137961,137962,29764,137964],{},[22,137963,29763],{},[49,137965,137966,137972],{},[52,137967,29769,137968,1011,137970,67],{},[78,137969,29772],{},[78,137971,29775],{},[52,137973,29778,137974],{},[49,137975,137976,137978,137980],{},[52,137977,29783],{},[52,137979,29786],{},[52,137981,29789],{},[7759,137983,29793],{"id":29792},[13,137985,29796],{},[49,137987,137988,137990,137992,137994,137996],{},[52,137989,29801],{},[52,137991,29804],{},[52,137993,29807],{},[52,137995,29810],{},[52,137997,29813],{},[72,137999,138000],{},[13,138001,29818],{},[23289,138003],{},[107,138005,29824],{"id":29823},[7759,138007,29828],{"id":29827},[13,138009,29831],{},[13,138011,29834],{},[13,138013,138014],{},[617,138015],{"alt":119,"src":29839},[10548,138017,29843],{"id":29842},[13,138019,29846],{},[13,138021,29849],{},[49,138023,138024,138028],{},[52,138025,138026,29857],{},[22,138027,29856],{},[52,138029,138030,29863],{},[22,138031,29862],{},[10548,138033,29867],{"id":29866},[13,138035,29870],{},[49,138037,138038,138040,138042,138044],{},[52,138039,29875],{},[52,138041,29878],{},[52,138043,29881],{},[52,138045,29884],{},[10548,138047,29888],{"id":29887},[13,138049,29891],{},[49,138051,138052,138054,138056,138058],{},[52,138053,29896],{},[52,138055,29899],{},[52,138057,29902],{},[52,138059,29905],{},[7759,138061,29909],{"id":29908},[13,138063,29912],{},[10548,138065,29916],{"id":29915},[13,138067,138068,29922],{},[22,138069,29921],{},[13,138071,138072,29928],{},[22,138073,29927],{},[10548,138075,29932],{"id":29931},[13,138077,138078,29938],{},[22,138079,29937],{},[13,138081,138082,29944],{},[22,138083,29943],{},[13,138085,138086,29950],{},[22,138087,29949],{},[10548,138089,29954],{"id":29953},[13,138091,138092,29960],{},[22,138093,29959],{},[49,138095,138096,138098,138100],{},[52,138097,29965],{},[52,138099,29968],{},[52,138101,29971],{},[13,138103,138104,29977],{},[22,138105,29976],{},[49,138107,138108,138110,138112],{},[52,138109,29982],{},[52,138111,29985],{},[52,138113,29988],{},[10548,138115,29992],{"id":29991},[13,138117,138118,29998],{},[22,138119,29997],{},[13,138121,138122,30004],{},[22,138123,30003],{},[13,138125,138126,30010],{},[22,138127,30009],{},[10548,138129,30014],{"id":30013},[13,138131,30017],{},[13,138133,30020],{},[13,138135,30023],{},[13,138137,30026],{},[7759,138139,30030],{"id":30029},[13,138141,30033],{},[10548,138143,30037],{"id":30036},[13,138145,30040],{},[13,138147,30043],{},[13,138149,30046],{},[10548,138151,30050],{"id":30049},[13,138153,30053],{},[13,138155,30056],{},[13,138157,138158],{},[22,138159,30061],{},[10548,138161,30065],{"id":30064},[13,138163,30068],{},[13,138165,30071],{},[13,138167,30074],{},[13,138169,30077],{},[10548,138171,30081],{"id":30080},[13,138173,138174],{},[22,138175,30086],{},[49,138177,138178],{},[52,138179,30091],{},[13,138181,138182],{},[22,138183,30096],{},[49,138185,138186],{},[52,138187,30101],{},[10548,138189,30105],{"id":30104},[13,138191,30108],{},[13,138193,30111],{},[7759,138195,30115],{"id":30114},[13,138197,30118,138198,30124],{},[5009,138199,30123],{"href":30121,"rel":138200},[23647],[23289,138202],{},[107,138204,30130],{"id":30129},[7759,138206,30134],{"id":30133},[10548,138208,30138],{"id":30137},[13,138210,30141],{},[10548,138212,30145],{"id":30144},[13,138214,30148],{},[10548,138216,30152],{"id":30151},[13,138218,138219],{},[617,138220],{"alt":119,"src":30157},[10548,138222,30161],{"id":30160},[13,138224,138225],{},[22,138226,30166],{},[49,138228,138229],{},[52,138230,30171],{},[13,138232,138233],{},[22,138234,30176],{},[49,138236,138237],{},[52,138238,30181],{},[13,138240,138241],{},[22,138242,30186],{},[49,138244,138245],{},[52,138246,30191],{},[13,138248,138249],{},[22,138250,30196],{},[49,138252,138253],{},[52,138254,30201],{},[7759,138256,30205],{"id":30204},[10548,138258,30209],{"id":30208},[13,138260,30212],{},[10548,138262,30216],{"id":30215},[13,138264,30219],{},[10548,138266,30223],{"id":30222},[13,138268,30226],{},[49,138270,138271,138273],{},[52,138272,30231],{},[52,138274,30234],{},[10548,138276,30238],{"id":30237},[13,138278,30241],{},[7759,138280,30245],{"id":30244},[10548,138282,30248],{"id":30248},[13,138284,30251],{},[13,138286,30254],{},[13,138288,30257],{},[13,138290,30260],{},[49,138292,138293,138295,138297],{},[52,138294,30265],{},[52,138296,30268],{},[52,138298,30271],{},[13,138300,30274],{},[49,138302,138303,138305,138307],{},[52,138304,30279],{},[52,138306,30282],{},[52,138308,30285],{},{"title":119,"searchDepth":144,"depth":144,"links":138310},[138311,138316,138324,138330],{"id":29042,"depth":132,"text":29043,"children":138312},[138313,138314,138315],{"id":29051,"depth":144,"text":29052},{"id":29158,"depth":144,"text":29159},{"id":29343,"depth":144,"text":29344},{"id":29477,"depth":132,"text":29478,"children":138317},[138318,138319,138320,138321,138322,138323],{"id":29481,"depth":144,"text":29482},{"id":29536,"depth":144,"text":29537},{"id":29622,"depth":144,"text":29623},{"id":29686,"depth":144,"text":29687},{"id":29719,"depth":144,"text":29720},{"id":29792,"depth":144,"text":29793},{"id":29823,"depth":132,"text":29824,"children":138325},[138326,138327,138328,138329],{"id":29827,"depth":144,"text":29828},{"id":29908,"depth":144,"text":29909},{"id":30029,"depth":144,"text":30030},{"id":30114,"depth":144,"text":30115},{"id":30129,"depth":132,"text":30130,"children":138331},[138332,138333,138334],{"id":30133,"depth":144,"text":30134},{"id":30204,"depth":144,"text":30205},{"id":30244,"depth":144,"text":30245},{},{"title":29029,"description":119},[14968,7744,246,23378,10715,6380],{"id":30320,"title":30321,"assetBase":239,"author":8,"body":138339,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":140165,"navigation":128,"originalPath":32966,"path":32967,"seo":140166,"source":23330,"stem":32969,"tags":140167,"weight":250,"__hash__":32971},{"type":10,"value":138340,"toc":140089},[138341,138343,138353,138355,138357,138359,138363,138365,138367,138369,138371,138373,138375,138377,138379,138381,138383,138385,138387,138389,138391,138393,138395,138397,138421,138423,138425,138439,138441,138467,138469,138471,138473,138475,138477,138479,138481,138483,138485,138487,138489,138491,138493,138495,138497,138501,138503,138505,138507,138509,138511,138519,138521,138523,138531,138533,138535,138541,138543,138551,138553,138561,138563,138565,138567,138569,138573,138575,138577,138579,138581,138583,138585,138587,138589,138591,138599,138601,138603,138607,138609,138611,138613,138631,138633,138635,138637,138643,138645,138647,138649,138651,138663,138665,138667,138669,138673,138675,138699,138701,138703,138707,138773,138775,138777,138779,138781,138783,138785,138787,138789,138791,138793,138795,138797,138807,138809,138811,138813,138819,138821,138827,138829,138831,138833,138835,138883,138885,138887,138889,138891,138899,138901,138903,138905,138907,138941,138943,138945,138947,138949,138951,138959,138961,138963,138965,138967,138969,138971,138973,138975,138977,138979,138983,138985,138989,138991,138997,138999,139003,139005,139007,139009,139013,139015,139017,139019,139021,139025,139027,139029,139031,139033,139063,139065,139109,139111,139113,139115,139117,139121,139123,139125,139127,139129,139131,139133,139135,139139,139149,139151,139153,139155,139157,139159,139161,139163,139175,139177,139203,139205,139211,139213,139221,139223,139225,139227,139229,139239,139241,139243,139245,139253,139255,139263,139265,139267,139277,139279,139281,139289,139291,139293,139295,139305,139307,139309,139311,139313,139317,139319,139343,139345,139347,139383,139385,139389,139391,139393,139395,139397,139399,139401,139403,139405,139415,139417,139419,139421,139457,139459,139467,139469,139471,139477,139479,139487,139489,139495,139497,139499,139501,139503,139505,139507,139515,139517,139519,139525,139527,139529,139543,139545,139553,139555,139557,139559,139561,139563,139565,139567,139569,139571,139573,139575,139577,139579,139581,139583,139585,139587,139589,139591,139593,139595,139597,139599,139601,139603,139605,139611,139613,139667,139669,139673,139675,139683,139685,139687,139697,139699,139707,139709,139711,139723,139725,139731,139733,139737,139739,139745,139747,139749,139757,139759,139761,139763,139765,139767,139773,139775,139777,139779,139781,139783,139785,139789,139791,139793,139795,139797,139799,139801,139803,139807,139831,139835,139845,139847,139849,139853,139881,139885,139891,139893,139895,139897,139901,139907,139911,139913,139915,139917,139919,139923,139931,139935,139961,139963,139965,139969,139979,139983,139985,139987,139989,139991,139993,139995,139997,139999,140001,140011,140013,140017,140019,140031,140033,140035,140037,140039,140041,140043,140045,140047,140049,140051,140055,140057,140061,140063,140065,140067,140071,140073,140075,140077,140079,140081,140083,140085,140087],[4517,138342,30326],{"id":30326},[72,138344,138345,138349,138351],{},[13,138346,138347],{},[22,138348,23957],{},[13,138350,30335],{},[13,138352,30338],{},[107,138354,30342],{"id":30341},[13,138356,30345],{},[7759,138358,30349],{"id":30348},[13,138360,138361],{},[617,138362],{"alt":119,"src":29434},[7759,138364,30357],{"id":30356},[10548,138366,30361],{"id":30360},[13,138368,30364],{},[10548,138370,30368],{"id":30367},[13,138372,30371],{},[13,138374,30374],{},[13,138376,30377],{},[10548,138378,30381],{"id":30380},[13,138380,30384],{},[13,138382,30387],{},[10548,138384,30391],{"id":30390},[13,138386,30394],{},[23289,138388],{},[107,138390,30400],{"id":30399},[7759,138392,30404],{"id":30403},[10548,138394,30408],{"id":30407},[13,138396,30411],{},[49,138398,138399,138409],{},[52,138400,30416,138401],{},[49,138402,138403,138405],{},[52,138404,30421],{},[52,138406,138407],{},[617,138408],{"alt":119,"src":30426},[52,138410,30429,138411],{},[49,138412,138413,138415,138417,138419],{},[52,138414,30434],{},[52,138416,30437],{},[52,138418,30440],{},[52,138420,30443],{},[10548,138422,30447],{"id":30446},[13,138424,30450],{},[49,138426,138427],{},[52,138428,30455,138429],{},[49,138430,138431,138433,138435,138437],{},[52,138432,30460],{},[52,138434,30463],{},[52,138436,30466],{},[52,138438,30469],{},[10548,138440,30473],{"id":30472},[49,138442,138443,138449,138455,138461],{},[52,138444,30478,138445],{},[49,138446,138447],{},[52,138448,30483],{},[52,138450,30486,138451],{},[49,138452,138453],{},[52,138454,30491],{},[52,138456,30494,138457],{},[49,138458,138459],{},[52,138460,30499],{},[52,138462,30502,138463],{},[49,138464,138465],{},[52,138466,30507],{},[7759,138468,30511],{"id":30510},[13,138470,30514],{},[13,138472,30517],{},[13,138474,30520],{},[10548,138476,30523],{"id":30523},[13,138478,30526],{},[10548,138480,30529],{"id":30529},[13,138482,30532],{},[13,138484,30535],{},[7759,138486,30539],{"id":30538},[10548,138488,30543],{"id":30542},[13,138490,30546],{},[10548,138492,30550],{"id":30549},[13,138494,30553],{},[10548,138496,30557],{"id":30556},[13,138498,138499],{},[617,138500],{"alt":119,"src":30562},[23289,138502],{},[107,138504,30568],{"id":30567},[13,138506,30571],{},[7759,138508,30575],{"id":30574},[13,138510,30578],{},[49,138512,138513,138515,138517],{},[52,138514,30583],{},[52,138516,30586],{},[52,138518,30589],{},[7759,138520,30593],{"id":30592},[13,138522,30596],{},[49,138524,138525,138527,138529],{},[52,138526,30601],{},[52,138528,30604],{},[52,138530,30607],{},[7759,138532,30611],{"id":30610},[13,138534,30614],{},[49,138536,138537,138539],{},[52,138538,30619],{},[52,138540,30622],{},[10548,138542,30625],{"id":30625},[49,138544,138545,138547,138549],{},[52,138546,30630],{},[52,138548,30633],{},[52,138550,30636],{},[10548,138552,30639],{"id":30639},[49,138554,138555,138557,138559],{},[52,138556,30644],{},[52,138558,30647],{},[52,138560,30650],{},[7759,138562,30654],{"id":30653},[10548,138564,30658],{"id":30657},[13,138566,30661],{},[13,138568,30664],{},[13,138570,138571],{},[617,138572],{"alt":119,"src":29839},[13,138574,30671],{},[10548,138576,30675],{"id":30674},[13,138578,30678],{},[13,138580,30681],{},[7759,138582,30685],{"id":30684},[10548,138584,30689],{"id":30688},[13,138586,30692],{},[10548,138588,30696],{"id":30695},[13,138590,30699],{},[49,138592,138593,138595,138597],{},[52,138594,30704],{},[52,138596,30707],{},[52,138598,30710],{},[13,138600,30713],{},[10548,138602,30717],{"id":30716},[13,138604,30720,138605,30724],{},[22,138606,30723],{},[13,138608,30727],{},[10548,138610,30731],{"id":30730},[13,138612,30734],{},[49,138614,138615,138617,138619,138621,138623,138625,138627,138629],{},[52,138616,30739],{},[52,138618,30742],{},[52,138620,30745],{},[52,138622,30748],{},[52,138624,30751],{},[52,138626,30754],{},[52,138628,30757],{},[52,138630,30760],{},[10548,138632,30764],{"id":30763},[13,138634,30767],{},[13,138636,30770],{},[49,138638,138639,138641],{},[52,138640,30775],{},[52,138642,30778],{},[23289,138644],{},[107,138646,30784],{"id":30783},[7759,138648,30788],{"id":30787},[13,138650,30791],{},[49,138652,138653,138655,138657,138659,138661],{},[52,138654,30796],{},[52,138656,30799],{},[52,138658,30802],{},[52,138660,30805],{},[52,138662,30808],{},[10548,138664,30812],{"id":30811},[13,138666,30815],{},[13,138668,30818],{},[13,138670,138671],{},[617,138672],{"alt":119,"src":30157},[13,138674,30825],{},[49,138676,138677,138679,138681,138697],{},[52,138678,30830],{},[52,138680,30833],{},[52,138682,30836,138683],{},[49,138684,138685,138687,138689,138691,138693,138695],{},[52,138686,30841],{},[52,138688,30844],{},[52,138690,30847],{},[52,138692,30850],{},[52,138694,30853],{},[52,138696,30856],{},[52,138698,30859],{},[10548,138700,30863],{"id":30862},[13,138702,30866],{},[13,138704,138705],{},[617,138706],{"alt":119,"src":30871},[49,138708,138709,138715,138731,138747],{},[52,138710,30876,138711],{},[49,138712,138713],{},[52,138714,30881],{},[52,138716,30884,138717],{},[49,138718,138719,138721],{},[52,138720,30889],{},[52,138722,30892,138723],{},[49,138724,138725,138727,138729],{},[52,138726,30897],{},[52,138728,30900],{},[52,138730,30903],{},[52,138732,30906,138733],{},[49,138734,138735,138737],{},[52,138736,30911],{},[52,138738,30914,138739],{},[49,138740,138741,138743],{},[52,138742,30919],{},[52,138744,138745],{},[617,138746],{"alt":119,"src":30924},[52,138748,30927,138749],{},[49,138750,138751,138759],{},[52,138752,30932,138753],{},[49,138754,138755,138757],{},[52,138756,30937],{},[52,138758,30940],{},[52,138760,30943,138761],{},[49,138762,138763,138765,138767,138769],{},[52,138764,30948],{},[52,138766,30951],{},[52,138768,30954],{},[52,138770,138771],{},[617,138772],{"alt":119,"src":30959},[7759,138774,30963],{"id":30962},[13,138776,30966],{},[10548,138778,30969],{"id":30969},[13,138780,30972],{},[10548,138782,30975],{"id":30975},[13,138784,30978],{},[10548,138786,30981],{"id":30981},[13,138788,30984],{},[23289,138790],{},[107,138792,30990],{"id":30989},[13,138794,30993],{},[13,138796,30996],{},[49,138798,138799,138801,138803,138805],{},[52,138800,31001],{},[52,138802,31004],{},[52,138804,31007],{},[52,138806,31010],{},[7759,138808,31014],{"id":31013},[10548,138810,31018],{"id":31017},[13,138812,31021],{},[49,138814,138815,138817],{},[52,138816,31026],{},[52,138818,31029],{},[13,138820,31032],{},[49,138822,138823,138825],{},[52,138824,31037],{},[52,138826,31040],{},[10548,138828,31044],{"id":31043},[13,138830,31047],{},[13,138832,31050],{},[13,138834,31053],{},[49,138836,138837,138861,138867],{},[52,138838,31058,138839],{},[49,138840,138841,138843,138845,138853],{},[52,138842,31063],{},[52,138844,31066],{},[52,138846,31069,138847],{},[49,138848,138849,138851],{},[52,138850,31074],{},[52,138852,31077],{},[52,138854,31080,138855],{},[49,138856,138857,138859],{},[52,138858,31085],{},[52,138860,31088],{},[52,138862,31091,138863],{},[49,138864,138865],{},[52,138866,31096],{},[52,138868,31099,138869],{},[49,138870,138871,138881],{},[52,138872,31104,138873],{},[49,138874,138875,138877,138879],{},[52,138876,31109],{},[52,138878,31112],{},[52,138880,31115],{},[52,138882,31118],{},[10548,138884,31122],{"id":31121},[13,138886,31125],{},[10548,138888,31129],{"id":31128},[13,138890,31132],{},[49,138892,138893,138895,138897],{},[52,138894,31137],{},[52,138896,31140],{},[52,138898,31143],{},[7759,138900,31147],{"id":31146},[13,138902,31150],{},[13,138904,31153],{},[10548,138906,31157],{"id":31156},[49,138908,138909,138917,138923,138929,138935],{},[52,138910,31162,138911],{},[49,138912,138913,138915],{},[52,138914,31167],{},[52,138916,31170],{},[52,138918,31173,138919],{},[49,138920,138921],{},[52,138922,31178],{},[52,138924,31181,138925],{},[49,138926,138927],{},[52,138928,31186],{},[52,138930,31189,138931],{},[49,138932,138933],{},[52,138934,31194],{},[52,138936,31197,138937],{},[49,138938,138939],{},[52,138940,31202],{},[10548,138942,31206],{"id":31205},[13,138944,31209],{},[13,138946,31212],{},[10548,138948,31216],{"id":31215},[13,138950,31219],{},[49,138952,138953,138955,138957],{},[52,138954,31224],{},[52,138956,31227],{},[52,138958,31230],{},[7759,138960,31234],{"id":31233},[10548,138962,31238],{"id":31237},[10548,138964,31242],{"id":31241},[10548,138966,31246],{"id":31245},[10548,138968,31250],{"id":31249},[10548,138970,31254],{"id":31253},[23289,138972],{},[107,138974,31260],{"id":31259},[7759,138976,31264],{"id":31263},[10548,138978,31268],{"id":31267},[13,138980,138981],{},[617,138982],{"alt":119,"src":31273},[10548,138984,31277],{"id":31276},[13,138986,138987],{},[617,138988],{"alt":119,"src":31282},[13,138990,31285],{},[49,138992,138993,138995],{},[52,138994,31290],{},[52,138996,31293],{},[10548,138998,31297],{"id":31296},[13,139000,139001],{},[617,139002],{"alt":119,"src":31302},[13,139004,31305],{},[13,139006,31308],{},[10548,139008,31312],{"id":31311},[13,139010,139011],{},[617,139012],{"alt":119,"src":31317},[13,139014,31320],{},[13,139016,31323],{},[13,139018,31326],{},[10548,139020,31330],{"id":31329},[13,139022,139023],{},[617,139024],{"alt":119,"src":31335},[13,139026,31338],{},[13,139028,31341],{},[7759,139030,31345],{"id":31344},[10548,139032,31349],{"id":31348},[49,139034,139035,139045,139055],{},[52,139036,31354,139037],{},[49,139038,139039,139041,139043],{},[52,139040,31359],{},[52,139042,31362],{},[52,139044,31365],{},[52,139046,31368,139047],{},[49,139048,139049,139051,139053],{},[52,139050,31373],{},[52,139052,31376],{},[52,139054,31379],{},[52,139056,31382,139057],{},[49,139058,139059,139061],{},[52,139060,31387],{},[52,139062,31390],{},[10548,139064,31394],{"id":31393},[49,139066,139067,139089,139097,139099,139107],{},[52,139068,31399,139069],{},[49,139070,139071,139079],{},[52,139072,31404,139073],{},[49,139074,139075],{},[52,139076,139077],{},[617,139078],{"alt":119,"src":31411},[52,139080,31414,139081],{},[49,139082,139083,139085,139087],{},[52,139084,31419],{},[52,139086,31422],{},[52,139088,31425],{},[52,139090,31428,139091],{},[49,139092,139093,139095],{},[52,139094,31433],{},[52,139096,31436],{},[52,139098,31439],{},[52,139100,31442,139101],{},[49,139102,139103,139105],{},[52,139104,31447],{},[52,139106,31450],{},[52,139108,31453],{},[23289,139110],{},[107,139112,31459],{"id":31458},[13,139114,31462],{},[7759,139116,31466],{"id":31465},[13,139118,139119],{},[617,139120],{"alt":119,"src":31471},[7759,139122,31475],{"id":31474},[13,139124,31478],{},[13,139126,31481],{},[13,139128,31484],{},[13,139130,31487],{},[10548,139132,31491],{"id":31490},[13,139134,31494],{},[13,139136,139137],{},[617,139138],{"alt":119,"src":31499},[49,139140,139141,139143,139145,139147],{},[52,139142,31504],{},[52,139144,31507],{},[52,139146,31510],{},[52,139148,31513],{},[10548,139150,31517],{"id":31516},[13,139152,31520],{},[7759,139154,31524],{"id":31523},[10548,139156,31528],{"id":31527},[13,139158,31531],{},[10548,139160,31535],{"id":31534},[13,139162,31538],{},[49,139164,139165,139167,139169,139171,139173],{},[52,139166,31543],{},[52,139168,31546],{},[52,139170,31549],{},[52,139172,31552],{},[52,139174,31555],{},[13,139176,31558],{},[49,139178,139179,139187,139195],{},[52,139180,31563,139181],{},[49,139182,139183,139185],{},[52,139184,31568],{},[52,139186,31571],{},[52,139188,31574,139189],{},[49,139190,139191,139193],{},[52,139192,31579],{},[52,139194,31582],{},[52,139196,31585,139197],{},[49,139198,139199,139201],{},[52,139200,31590],{},[52,139202,31593],{},[13,139204,31596],{},[49,139206,139207,139209],{},[52,139208,31601],{},[52,139210,31604],{},[13,139212,31607],{},[49,139214,139215,139217,139219],{},[52,139216,31612],{},[52,139218,31615],{},[52,139220,31618],{},[23289,139222],{},[107,139224,31624],{"id":31623},[13,139226,31627],{},[13,139228,31630],{},[49,139230,139231,139233,139235,139237],{},[52,139232,31635],{},[52,139234,31638],{},[52,139236,31641],{},[52,139238,31644],{},[7759,139240,31648],{"id":31647},[10548,139242,31652],{"id":31651},[13,139244,31655],{},[49,139246,139247,139249,139251],{},[52,139248,31660],{},[52,139250,31663],{},[52,139252,31666],{},[13,139254,31669],{},[49,139256,139257,139259,139261],{},[52,139258,31674],{},[52,139260,31677],{},[52,139262,31680],{},[10548,139264,31684],{"id":31683},[13,139266,31687],{},[49,139268,139269,139271,139273,139275],{},[52,139270,31692],{},[52,139272,31695],{},[52,139274,31698],{},[52,139276,31701],{},[10548,139278,31705],{"id":31704},[13,139280,31708],{},[49,139282,139283,139285,139287],{},[52,139284,31713],{},[52,139286,31716],{},[52,139288,31719],{},[13,139290,31722],{},[10548,139292,31726],{"id":31725},[13,139294,31729],{},[49,139296,139297,139299,139301,139303],{},[52,139298,31734],{},[52,139300,31737],{},[52,139302,31740],{},[52,139304,31743],{},[23289,139306],{},[107,139308,31749],{"id":31748},[13,139310,31752],{},[7759,139312,31755],{"id":31755},[13,139314,139315],{},[617,139316],{"alt":119,"src":31760},[7759,139318,31763],{"id":31763},[49,139320,139321,139327,139329,139335,139337,139339,139341],{},[52,139322,31768,139323],{},[49,139324,139325],{},[52,139326,31773],{},[52,139328,31776],{},[52,139330,31779,139331],{},[49,139332,139333],{},[52,139334,31784],{},[52,139336,31787],{},[52,139338,31790],{},[52,139340,31793],{},[52,139342,31796],{},[7759,139344,31799],{"id":31799},[10548,139346,31803],{"id":31802},[49,139348,139349,139361,139371],{},[52,139350,31808,139351],{},[49,139352,139353,139355,139357,139359],{},[52,139354,31813],{},[52,139356,31816],{},[52,139358,31819],{},[52,139360,31822],{},[52,139362,31825,139363],{},[49,139364,139365,139367,139369],{},[52,139366,31830],{},[52,139368,31833],{},[52,139370,31836],{},[52,139372,31839,139373],{},[49,139374,139375,139377,139379,139381],{},[52,139376,31844],{},[52,139378,31847],{},[52,139380,31850],{},[52,139382,31853],{},[10548,139384,31857],{"id":31856},[13,139386,139387],{},[617,139388],{"alt":119,"src":31862},[13,139390,31865],{},[23289,139392],{},[107,139394,31871],{"id":31870},[7759,139396,31875],{"id":31874},[10548,139398,31879],{"id":31878},[13,139400,31882],{},[13,139402,31885],{},[10548,139404,31889],{"id":31888},[49,139406,139407,139409,139411,139413],{},[52,139408,31894],{},[52,139410,31897],{},[52,139412,31900],{},[52,139414,31903],{},[10548,139416,31907],{"id":31906},[13,139418,31910],{},[13,139420,31913],{},[8366,139422,139423,139431],{},[8369,139424,139425],{},[8372,139426,139427,139429],{},[8375,139428,29763],{"align":9247},[8375,139430,31924],{"align":9247},[8386,139432,139433,139439,139445,139451],{},[8372,139434,139435,139437],{},[8391,139436,31931],{"align":9247},[8391,139438,31934],{"align":9247},[8372,139440,139441,139443],{},[8391,139442,31939],{"align":9247},[8391,139444,31942],{"align":9247},[8372,139446,139447,139449],{},[8391,139448,31947],{"align":9247},[8391,139450,31950],{"align":9247},[8372,139452,139453,139455],{},[8391,139454,31955],{"align":9247},[8391,139456,31958],{"align":9247},[10548,139458,31962],{"id":31961},[49,139460,139461,139463,139465],{},[52,139462,31967],{},[52,139464,31970],{},[52,139466,31973],{},[7759,139468,31977],{"id":31976},[10548,139470,31981],{"id":31980},[49,139472,139473,139475],{},[52,139474,31986],{},[52,139476,31989],{},[10548,139478,31993],{"id":31992},[49,139480,139481,139483,139485],{},[52,139482,31998],{},[52,139484,32001],{},[52,139486,32004],{},[10548,139488,32008],{"id":32007},[49,139490,139491,139493],{},[52,139492,32013],{},[52,139494,32016],{},[10548,139496,32020],{"id":32019},[13,139498,32023],{},[13,139500,32026],{},[13,139502,32029],{},[7759,139504,32033],{"id":32032},[10548,139506,32037],{"id":32036},[49,139508,139509,139511,139513],{},[52,139510,32042],{},[52,139512,32045],{},[52,139514,32048],{},[10548,139516,32052],{"id":32051},[13,139518,32055],{},[49,139520,139521,139523],{},[52,139522,32060],{},[52,139524,32063],{},[13,139526,32066],{},[10548,139528,32070],{"id":32069},[49,139530,139531,139537],{},[52,139532,32075,139533],{},[49,139534,139535],{},[52,139536,32080],{},[52,139538,32083,139539],{},[49,139540,139541],{},[52,139542,32088],{},[10548,139544,32092],{"id":32091},[49,139546,139547,139549,139551],{},[52,139548,32097],{},[52,139550,32100],{},[52,139552,32103],{},[23289,139554],{},[107,139556,32109],{"id":32108},[7759,139558,32113],{"id":32112},[13,139560,32116],{},[13,139562,32119],{},[10548,139564,32123],{"id":32122},[13,139566,32126],{},[13,139568,32129],{},[13,139570,32132],{},[13,139572,32135],{},[13,139574,32138],{},[13,139576,32141],{},[13,139578,32144],{},[13,139580,32147],{},[10548,139582,32151],{"id":32150},[13,139584,32154],{},[13,139586,32157],{},[13,139588,32160],{},[13,139590,32163],{},[13,139592,32166],{},[7759,139594,32170],{"id":32169},[10548,139596,32174],{"id":32173},[13,139598,32177],{},[10548,139600,32181],{"id":32180},[13,139602,32184],{},[10548,139604,32188],{"id":32187},[49,139606,139607,139609],{},[52,139608,32193],{},[52,139610,32196],{},[10548,139612,32200],{"id":32199},[8366,139614,139615,139625],{},[8369,139616,139617],{},[8372,139618,139619,139621,139623],{},[8375,139620],{"align":9247},[8375,139622,32211],{"align":9247},[8375,139624,32214],{"align":9247},[8386,139626,139627,139635,139643,139651,139659],{},[8372,139628,139629,139631,139633],{},[8391,139630,32221],{"align":9247},[8391,139632,32224],{"align":9247},[8391,139634,32227],{"align":9247},[8372,139636,139637,139639,139641],{},[8391,139638,32232],{"align":9247},[8391,139640,32235],{"align":9247},[8391,139642,32238],{"align":9247},[8372,139644,139645,139647,139649],{},[8391,139646,32243],{"align":9247},[8391,139648,32246],{"align":9247},[8391,139650,32249],{"align":9247},[8372,139652,139653,139655,139657],{},[8391,139654,32254],{"align":9247},[8391,139656,32257],{"align":9247},[8391,139658,32260],{"align":9247},[8372,139660,139661,139663,139665],{},[8391,139662,32265],{"align":9247},[8391,139664],{"align":9247},[8391,139666,32270],{"align":9247},[13,139668,32273],{},[13,139670,139671],{},[617,139672],{"alt":119,"src":32278},[10548,139674,32282],{"id":32281},[49,139676,139677,139679,139681],{},[52,139678,32287],{},[52,139680,32290],{},[52,139682,32293],{},[7759,139684,32297],{"id":32296},[13,139686,32300],{},[49,139688,139689,139691,139693,139695],{},[52,139690,32305],{},[52,139692,32308],{},[52,139694,32311],{},[52,139696,32314],{},[10548,139698,32317],{"id":32317},[49,139700,139701,139703,139705],{},[52,139702,32322],{},[52,139704,32325],{},[52,139706,32328],{},[7759,139708,32332],{"id":32331},[10548,139710,32336],{"id":32335},[49,139712,139713,139715,139717,139719,139721],{},[52,139714,32341],{},[52,139716,32344],{},[52,139718,32347],{},[52,139720,32350],{},[52,139722,32353],{},[10548,139724,32357],{"id":32356},[49,139726,139727,139729],{},[52,139728,32362],{},[52,139730,32365],{},[7759,139732,32369],{"id":32368},[13,139734,139735],{},[617,139736],{"alt":119,"src":32374},[7759,139738,32378],{"id":32377},[49,139740,139741,139743],{},[52,139742,32383],{},[52,139744,32386],{},[7759,139746,32390],{"id":32389},[10548,139748,32394],{"id":32393},[49,139750,139751,139753,139755],{},[52,139752,32399],{},[52,139754,32402],{},[52,139756,32405],{},[10548,139758,32409],{"id":32408},[13,139760,32412],{},[13,139762,32415],{},[13,139764,32418],{},[10548,139766,32422],{"id":32421},[49,139768,139769,139771],{},[52,139770,32427],{},[52,139772,32430],{},[23289,139774],{},[107,139776,32436],{"id":32435},[13,139778,32439],{},[13,139780,32442],{},[13,139782,32445],{},[7759,139784,32449],{"id":32448},[13,139786,139787],{},[617,139788],{"alt":119,"src":32454},[7759,139790,32458],{"id":32457},[13,139792,32461],{},[23289,139794],{},[107,139796,32467],{"id":32466},[7759,139798,32471],{"id":32470},[10548,139800,32475],{"id":32474},[13,139802,32478],{},[13,139804,139805],{},[22,139806,32483],{},[49,139808,139809,139817,139825],{},[52,139810,32488,139811],{},[49,139812,139813,139815],{},[52,139814,32493],{},[52,139816,32496],{},[52,139818,32499,139819],{},[49,139820,139821,139823],{},[52,139822,32504],{},[52,139824,32507],{},[52,139826,32510,139827],{},[49,139828,139829],{},[52,139830,32515],{},[13,139832,139833],{},[22,139834,32520],{},[49,139836,139837,139839,139841,139843],{},[52,139838,32525],{},[52,139840,32528],{},[52,139842,32531],{},[52,139844,32534],{},[10548,139846,32538],{"id":32537},[13,139848,32541],{},[13,139850,139851],{},[22,139852,32483],{},[49,139854,139855,139861,139869,139875],{},[52,139856,32550,139857],{},[49,139858,139859],{},[52,139860,32555],{},[52,139862,32558,139863],{},[49,139864,139865,139867],{},[52,139866,32563],{},[52,139868,32566],{},[52,139870,32569,139871],{},[49,139872,139873],{},[52,139874,32574],{},[52,139876,32577,139877],{},[49,139878,139879],{},[52,139880,32582],{},[13,139882,139883],{},[22,139884,32587],{},[49,139886,139887,139889],{},[52,139888,32592],{},[52,139890,32595],{},[7759,139892,32599],{"id":32598},[10548,139894,32603],{"id":32602},[13,139896,32606],{},[13,139898,139899],{},[22,139900,32611],{},[49,139902,139903,139905],{},[52,139904,32616],{},[52,139906,32619],{},[13,139908,139909],{},[22,139910,32624],{},[13,139912,32627],{},[13,139914,32630],{},[10548,139916,32634],{"id":32633},[13,139918,32637],{},[13,139920,139921],{},[22,139922,32611],{},[49,139924,139925,139927,139929],{},[52,139926,32646],{},[52,139928,32649],{},[52,139930,32652],{},[13,139932,139933],{},[22,139934,32624],{},[49,139936,139937,139943,139949],{},[52,139938,32661,139939],{},[49,139940,139941],{},[52,139942,32666],{},[52,139944,32669,139945],{},[49,139946,139947],{},[52,139948,32674],{},[52,139950,32677,139951],{},[49,139952,139953,139955,139957,139959],{},[52,139954,32682],{},[52,139956,32685],{},[52,139958,32688],{},[52,139960,32691],{},[10548,139962,32695],{"id":32694},[13,139964,32698],{},[13,139966,139967],{},[22,139968,32611],{},[49,139970,139971,139973,139975,139977],{},[52,139972,32707],{},[52,139974,32710],{},[52,139976,32713],{},[52,139978,32716],{},[13,139980,139981],{},[22,139982,32624],{},[13,139984,32723],{},[13,139986,32726],{},[13,139988,32729],{},[23289,139990],{},[107,139992,32735],{"id":32734},[13,139994,32738],{},[107,139996,32742],{"id":32741},[13,139998,32745],{},[7759,140000,32749],{"id":32748},[49,140002,140003,140005,140007,140009],{},[52,140004,32754],{},[52,140006,32757],{},[52,140008,32760],{},[52,140010,32763],{},[7759,140012,32767],{"id":32766},[13,140014,140015],{},[617,140016],{"alt":119,"src":32772},[7759,140018,32776],{"id":32775},[49,140020,140021,140023,140025,140027,140029],{},[52,140022,32781],{},[52,140024,32784],{},[52,140026,32787],{},[52,140028,32790],{},[52,140030,32793],{},[23289,140032],{},[107,140034,32799],{"id":32798},[7759,140036,32803],{"id":32802},[10548,140038,32807],{"id":32806},[13,140040,32810],{},[10548,140042,32814],{"id":32813},[13,140044,32817],{},[10548,140046,32821],{"id":32820},[13,140048,32824],{},[10548,140050,32828],{"id":32827},[13,140052,140053],{},[617,140054],{"alt":119,"src":32833},[10548,140056,32837],{"id":32836},[13,140058,140059],{},[617,140060],{"alt":119,"src":32842},[7759,140062,32846],{"id":32845},[13,140064,32849],{},[10548,140066,32853],{"id":32852},[13,140068,140069],{},[617,140070],{"alt":119,"src":32858},[10548,140072,32862],{"id":32861},[13,140074,32865],{},[10548,140076,32869],{"id":32868},[13,140078,32872],{},[10548,140080,32876],{"id":32875},[13,140082,32879],{},[10548,140084,32883],{"id":32882},[13,140086,32886],{},[23289,140088],{},{"title":119,"searchDepth":144,"depth":144,"links":140090},[140091,140095,140100,140107,140111,140116,140120,140125,140128,140133,140138,140147,140151,140155,140156,140161],{"id":30341,"depth":132,"text":30342,"children":140092},[140093,140094],{"id":30348,"depth":144,"text":30349},{"id":30356,"depth":144,"text":30357},{"id":30399,"depth":132,"text":30400,"children":140096},[140097,140098,140099],{"id":30403,"depth":144,"text":30404},{"id":30510,"depth":144,"text":30511},{"id":30538,"depth":144,"text":30539},{"id":30567,"depth":132,"text":30568,"children":140101},[140102,140103,140104,140105,140106],{"id":30574,"depth":144,"text":30575},{"id":30592,"depth":144,"text":30593},{"id":30610,"depth":144,"text":30611},{"id":30653,"depth":144,"text":30654},{"id":30684,"depth":144,"text":30685},{"id":30783,"depth":132,"text":30784,"children":140108},[140109,140110],{"id":30787,"depth":144,"text":30788},{"id":30962,"depth":144,"text":30963},{"id":30989,"depth":132,"text":30990,"children":140112},[140113,140114,140115],{"id":31013,"depth":144,"text":31014},{"id":31146,"depth":144,"text":31147},{"id":31233,"depth":144,"text":31234},{"id":31259,"depth":132,"text":31260,"children":140117},[140118,140119],{"id":31263,"depth":144,"text":31264},{"id":31344,"depth":144,"text":31345},{"id":31458,"depth":132,"text":31459,"children":140121},[140122,140123,140124],{"id":31465,"depth":144,"text":31466},{"id":31474,"depth":144,"text":31475},{"id":31523,"depth":144,"text":31524},{"id":31623,"depth":132,"text":31624,"children":140126},[140127],{"id":31647,"depth":144,"text":31648},{"id":31748,"depth":132,"text":31749,"children":140129},[140130,140131,140132],{"id":31755,"depth":144,"text":31755},{"id":31763,"depth":144,"text":31763},{"id":31799,"depth":144,"text":31799},{"id":31870,"depth":132,"text":31871,"children":140134},[140135,140136,140137],{"id":31874,"depth":144,"text":31875},{"id":31976,"depth":144,"text":31977},{"id":32032,"depth":144,"text":32033},{"id":32108,"depth":132,"text":32109,"children":140139},[140140,140141,140142,140143,140144,140145,140146],{"id":32112,"depth":144,"text":32113},{"id":32169,"depth":144,"text":32170},{"id":32296,"depth":144,"text":32297},{"id":32331,"depth":144,"text":32332},{"id":32368,"depth":144,"text":32369},{"id":32377,"depth":144,"text":32378},{"id":32389,"depth":144,"text":32390},{"id":32435,"depth":132,"text":32436,"children":140148},[140149,140150],{"id":32448,"depth":144,"text":32449},{"id":32457,"depth":144,"text":32458},{"id":32466,"depth":132,"text":32467,"children":140152},[140153,140154],{"id":32470,"depth":144,"text":32471},{"id":32598,"depth":144,"text":32599},{"id":32734,"depth":132,"text":32735},{"id":32741,"depth":132,"text":32742,"children":140157},[140158,140159,140160],{"id":32748,"depth":144,"text":32749},{"id":32766,"depth":144,"text":32767},{"id":32775,"depth":144,"text":32776},{"id":32798,"depth":132,"text":32799,"children":140162},[140163,140164],{"id":32802,"depth":144,"text":32803},{"id":32845,"depth":144,"text":32846},{},{"title":30321,"description":119},[246,23378,10715,6380,23333],{"id":32973,"title":32974,"assetBase":239,"author":8,"body":140169,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":140452,"navigation":128,"originalPath":33365,"path":33366,"seo":140453,"source":23330,"stem":33368,"tags":140454,"weight":250,"__hash__":33370},{"type":10,"value":140170,"toc":140437},[140171,140173,140175,140177,140179,140181,140193,140195,140197,140199,140207,140209,140211,140213,140223,140225,140229,140231,140239,140243,140245,140247,140249,140251,140253,140277,140279,140281,140291,140293,140305,140307,140315,140317,140319,140321,140329,140331,140343,140345,140353,140355,140357,140359,140361,140397,140399,140409,140411,140435],[4517,140172,32980],{"id":32979},[107,140174,32984],{"id":32983},[7759,140176,32987],{"id":32987},[10548,140178,32990],{"id":32990},[13,140180,32993],{},[49,140182,140183,140191],{},[52,140184,32998,140185],{},[49,140186,140187,140189],{},[52,140188,33003],{},[52,140190,33006],{},[52,140192,33009],{},[10548,140194,33012],{"id":33012},[13,140196,33015],{},[13,140198,33018],{},[49,140200,140201,140203,140205],{},[52,140202,33023],{},[52,140204,33026],{},[52,140206,33029],{},[10548,140208,33032],{"id":33032},[13,140210,33035],{},[10548,140212,33038],{"id":33038},[49,140214,140215,140217,140219,140221],{},[52,140216,33043],{},[52,140218,33046],{},[52,140220,33049],{},[52,140222,33052],{},[7759,140224,33055],{"id":33055},[13,140226,140227],{},[617,140228],{"alt":119,"src":29434},[10548,140230,33062],{"id":33062},[49,140232,140233,140235,140237],{},[52,140234,33067],{},[52,140236,33070],{},[52,140238,33073],{},[13,140240,140241],{},[617,140242],{"alt":119,"src":33078},[23289,140244],{},[107,140246,33084],{"id":33083},[7759,140248,33087],{"id":33087},[13,140250,33090],{},[10548,140252,33093],{"id":33093},[49,140254,140255,140267],{},[52,140256,33098,140257],{},[49,140258,140259,140261,140263,140265],{},[52,140260,33103],{},[52,140262,33106],{},[52,140264,33109],{},[52,140266,33112],{},[52,140268,33115,140269],{},[49,140270,140271,140273,140275],{},[52,140272,33120],{},[52,140274,33123],{},[52,140276,33126],{},[7759,140278,33129],{"id":33129},[13,140280,33132],{},[49,140282,140283],{},[52,140284,33137,140285],{},[49,140286,140287,140289],{},[52,140288,33142],{},[52,140290,33145],{},[10548,140292,33148],{"id":33148},[49,140294,140295,140297,140299,140301,140303],{},[52,140296,33153],{},[52,140298,33156],{},[52,140300,33159],{},[52,140302,33162],{},[52,140304,33165],{},[10548,140306,33168],{"id":33168},[49,140308,140309,140311,140313],{},[52,140310,33173],{},[52,140312,33176],{},[52,140314,33179],{},[7759,140316,33182],{"id":33182},[13,140318,33185],{},[10548,140320,33188],{"id":33188},[49,140322,140323,140325,140327],{},[52,140324,33193],{},[52,140326,33196],{},[52,140328,33199],{},[10548,140330,33202],{"id":33202},[49,140332,140333,140335,140337,140339,140341],{},[52,140334,33207],{},[52,140336,33210],{},[52,140338,33213],{},[52,140340,33216],{},[52,140342,33219],{},[10548,140344,33222],{"id":33222},[49,140346,140347,140349,140351],{},[52,140348,33227],{},[52,140350,33230],{},[52,140352,33233],{},[23289,140354],{},[107,140356,33239],{"id":33238},[13,140358,33242],{},[7759,140360,33245],{"id":33245},[49,140362,140363,140371,140381,140387],{},[52,140364,33250,140365],{},[49,140366,140367,140369],{},[52,140368,33255],{},[52,140370,33258],{},[52,140372,33261,140373],{},[49,140374,140375,140377,140379],{},[52,140376,33266],{},[52,140378,33269],{},[52,140380,33272],{},[52,140382,33275,140383],{},[49,140384,140385],{},[52,140386,33280],{},[52,140388,33283,140389],{},[49,140390,140391,140393,140395],{},[52,140392,33288],{},[52,140394,33291],{},[52,140396,33294],{},[10548,140398,33297],{"id":33297},[49,140400,140401,140403,140405,140407],{},[52,140402,33302],{},[52,140404,33305],{},[52,140406,33308],{},[52,140408,33311],{},[7759,140410,33314],{"id":33314},[49,140412,140413,140421,140427,140433],{},[52,140414,33319,140415],{},[49,140416,140417,140419],{},[52,140418,33324],{},[52,140420,33327],{},[52,140422,33330,140423],{},[49,140424,140425],{},[52,140426,33335],{},[52,140428,33338,140429],{},[49,140430,140431],{},[52,140432,33343],{},[52,140434,33346],{},[23289,140436],{},{"title":119,"searchDepth":144,"depth":144,"links":140438},[140439,140443,140448],{"id":32983,"depth":132,"text":32984,"children":140440},[140441,140442],{"id":32987,"depth":144,"text":32987},{"id":33055,"depth":144,"text":33055},{"id":33083,"depth":132,"text":33084,"children":140444},[140445,140446,140447],{"id":33087,"depth":144,"text":33087},{"id":33129,"depth":144,"text":33129},{"id":33182,"depth":144,"text":33182},{"id":33238,"depth":132,"text":33239,"children":140449},[140450,140451],{"id":33245,"depth":144,"text":33245},{"id":33314,"depth":144,"text":33314},{},{"title":32974,"description":119},[7744,246,23333],{"id":33372,"title":33373,"assetBase":239,"author":8,"body":140456,"category":23371,"collection":23324,"date":23325,"description":33378,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":140464,"navigation":128,"originalPath":33385,"path":33386,"seo":140465,"source":23330,"stem":33388,"tags":140466,"weight":250,"__hash__":33390},{"type":10,"value":140457,"toc":140462},[140458,140460],[13,140459,33378],{},[13,140461,33381],{},{"title":119,"searchDepth":144,"depth":144,"links":140463},[],{},{"title":33373,"description":33378},[23333],{"id":33392,"title":33393,"assetBase":239,"author":8,"body":140468,"category":29019,"collection":23324,"date":23325,"description":33401,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":140656,"navigation":128,"originalPath":33628,"path":33629,"seo":140657,"source":23330,"stem":33631,"tags":140658,"weight":250,"__hash__":33633},{"type":10,"value":140469,"toc":140653},[140470,140472,140474,140476,140529,140531,140539,140541,140543,140551,140553,140561,140563,140571,140573,140581,140583,140591,140593,140601,140603,140611,140613,140621,140623,140631,140633,140641,140643,140651],[4517,140471,33398],{"id":33398},[13,140473,33401],{},[13,140475,33404],{},[49,140477,140479,140484,140489,140494,140499,140504,140509,140514,140519,140524],{"className":140478},[33408],[52,140480,140482,33417],{"className":140481},[33412],[33414,140483],{"disabled":128,"type":33416},[52,140485,140487,33423],{"className":140486},[33412],[33414,140488],{"disabled":128,"type":33416},[52,140490,140492,33429],{"className":140491},[33412],[33414,140493],{"disabled":128,"type":33416},[52,140495,140497,33435],{"className":140496},[33412],[33414,140498],{"checked":128,"disabled":128,"type":33416},[52,140500,140502,33441],{"className":140501},[33412],[33414,140503],{"disabled":128,"type":33416},[52,140505,140507,33447],{"className":140506},[33412],[33414,140508],{"checked":128,"disabled":128,"type":33416},[52,140510,140512,33453],{"className":140511},[33412],[33414,140513],{"checked":128,"disabled":128,"type":33416},[52,140515,140517,33459],{"className":140516},[33412],[33414,140518],{"disabled":128,"type":33416},[52,140520,140522,33465],{"className":140521},[33412],[33414,140523],{"disabled":128,"type":33416},[52,140525,140527,33471],{"className":140526},[33412],[33414,140528],{"disabled":128,"type":33416},[7759,140530,33475],{"id":33474},[49,140532,140534],{"className":140533},[33408],[52,140535,140537,33484],{"className":140536},[33412],[33414,140538],{"disabled":128,"type":33416},[13,140540,33487],{},[13,140542,33490],{},[114,140544,140545],{"className":33493,"code":33494,"language":33495,"meta":119,"style":119},[17,140546,140547],{"__ignoreMap":119},[78,140548,140549],{"class":124,"line":125},[78,140550,33494],{},[13,140552,33504],{},[114,140554,140555],{"className":33493,"code":33507,"language":33495,"meta":119,"style":119},[17,140556,140557],{"__ignoreMap":119},[78,140558,140559],{"class":124,"line":125},[78,140560,33507],{},[13,140562,33516],{},[114,140564,140565],{"className":33493,"code":33519,"language":33495,"meta":119,"style":119},[17,140566,140567],{"__ignoreMap":119},[78,140568,140569],{"class":124,"line":125},[78,140570,33519],{},[13,140572,33528],{},[114,140574,140575],{"className":33493,"code":33531,"language":33495,"meta":119,"style":119},[17,140576,140577],{"__ignoreMap":119},[78,140578,140579],{"class":124,"line":125},[78,140580,33531],{},[13,140582,33540],{},[114,140584,140585],{"className":33493,"code":33543,"language":33495,"meta":119,"style":119},[17,140586,140587],{"__ignoreMap":119},[78,140588,140589],{"class":124,"line":125},[78,140590,33543],{},[13,140592,33552],{},[114,140594,140595],{"className":33493,"code":33555,"language":33495,"meta":119,"style":119},[17,140596,140597],{"__ignoreMap":119},[78,140598,140599],{"class":124,"line":125},[78,140600,33555],{},[13,140602,33564],{},[114,140604,140605],{"className":33493,"code":33567,"language":33495,"meta":119,"style":119},[17,140606,140607],{"__ignoreMap":119},[78,140608,140609],{"class":124,"line":125},[78,140610,33567],{},[13,140612,33576],{},[114,140614,140615],{"className":33493,"code":33579,"language":33495,"meta":119,"style":119},[17,140616,140617],{"__ignoreMap":119},[78,140618,140619],{"class":124,"line":125},[78,140620,33579],{},[13,140622,33588],{},[114,140624,140625],{"className":33493,"code":33591,"language":33495,"meta":119,"style":119},[17,140626,140627],{"__ignoreMap":119},[78,140628,140629],{"class":124,"line":125},[78,140630,33591],{},[13,140632,33600],{},[114,140634,140635],{"className":33493,"code":33603,"language":33495,"meta":119,"style":119},[17,140636,140637],{"__ignoreMap":119},[78,140638,140639],{"class":124,"line":125},[78,140640,33603],{},[13,140642,33612],{},[114,140644,140645],{"className":33493,"code":33615,"language":33495,"meta":119,"style":119},[17,140646,140647],{"__ignoreMap":119},[78,140648,140649],{"class":124,"line":125},[78,140650,33615],{},[226,140652,228],{},{"title":119,"searchDepth":144,"depth":144,"links":140654},[140655],{"id":33474,"depth":144,"text":33475},{},{"title":33393,"description":33401},[14968,23378,10715,6380],{"id":33635,"title":33636,"assetBase":239,"author":8,"body":140660,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":142327,"navigation":128,"originalPath":35720,"path":35721,"seo":142328,"source":23330,"stem":35723,"tags":142329,"weight":250,"__hash__":35726},{"type":10,"value":140661,"toc":142314},[140662,140692,140694,140696,140698,140726,140728,140756,140758,140762,140794,140798,140826,140831,140836,140841,140846,140848,140850,140852,140854,140870,140872,140874,140890,140892,140896,140916,140920,140948,140953,140958,140963,140965,140967,140969,140973,140981,140985,140993,140995,140997,141001,141009,141013,141021,141026,141031,141036,141038,141040,141042,141046,141054,141058,141066,141068,141070,141074,141082,141086,141094,141099,141104,141109,141111,141113,141115,141119,141127,141129,141131,141135,141143,141147,141155,141160,141165,141170,141175,141180,141185,141187,141189,141191,141199,141201,141203,141207,141219,141221,141297,141301,141313,141315,141431,141436,141441,141446,141451,141456,141458,141460,141462,141470,141472,141474,141478,141486,141488,141492,141500,141502,141507,141512,141517,141522,141527,141532,141534,141536,141538,141540,141544,141564,141568,141584,141589,141594,141599,141604,141606,141608,141610,141612,141616,141632,141636,141660,141665,141670,141675,141680,141685,141687,141689,141691,141693,141697,141717,141721,141741,141746,141751,141756,141761,141766,141768,141770,141772,141868,141870,141970,141972,142084,142086,142194,142196,142312],[72,140663,140664,140668,140670,140672,140674,140676,140678,140680,140682,140684,140686,140688,140690],{},[13,140665,140666],{},[22,140667,23957],{},[13,140669,33647],{},[13,140671,33650],{},[13,140673,33653],{},[13,140675,33656],{},[13,140677,33659],{},[13,140679,33662],{},[13,140681,33665],{},[13,140683,33668],{},[13,140685,33671],{},[13,140687,33674],{},[13,140689,33677],{},[13,140691,33680],{},[7759,140693,33684],{"id":33683},[13,140695,33687],{},[13,140697,33690],{},[114,140699,140700],{"className":33693,"code":33694,"language":33695,"meta":119,"style":119},[17,140701,140702,140706,140710,140714,140718,140722],{"__ignoreMap":119},[78,140703,140704],{"class":124,"line":125},[78,140705,33702],{},[78,140707,140708],{"class":124,"line":132},[78,140709,33707],{},[78,140711,140712],{"class":124,"line":138},[78,140713,33712],{},[78,140715,140716],{"class":124,"line":144},[78,140717,33717],{},[78,140719,140720],{"class":124,"line":150},[78,140721,33722],{},[78,140723,140724],{"class":124,"line":156},[78,140725,33727],{},[13,140727,33730],{},[114,140729,140730],{"className":33693,"code":33733,"language":33695,"meta":119,"style":119},[17,140731,140732,140736,140740,140744,140748,140752],{"__ignoreMap":119},[78,140733,140734],{"class":124,"line":125},[78,140735,33740],{},[78,140737,140738],{"class":124,"line":132},[78,140739,33745],{},[78,140741,140742],{"class":124,"line":138},[78,140743,33750],{},[78,140745,140746],{"class":124,"line":144},[78,140747,33717],{},[78,140749,140750],{"class":124,"line":150},[78,140751,33722],{},[78,140753,140754],{"class":124,"line":156},[78,140755,33727],{},[13,140757,33765],{},[49,140759,140760],{},[52,140761,33770],{},[114,140763,140764],{"className":33693,"code":33773,"language":33695,"meta":119,"style":119},[17,140765,140766,140770,140774,140778,140782,140786,140790],{"__ignoreMap":119},[78,140767,140768],{"class":124,"line":125},[78,140769,33780],{},[78,140771,140772],{"class":124,"line":132},[78,140773,33740],{},[78,140775,140776],{"class":124,"line":138},[78,140777,33789],{},[78,140779,140780],{"class":124,"line":144},[78,140781,33794],{},[78,140783,140784],{"class":124,"line":150},[78,140785,33799],{},[78,140787,140788],{"class":124,"line":156},[78,140789,33804],{},[78,140791,140792],{"class":124,"line":162},[78,140793,33809],{},[49,140795,140796],{},[52,140797,33814],{},[114,140799,140800],{"className":33693,"code":33817,"language":33695,"meta":119,"style":119},[17,140801,140802,140806,140810,140814,140818,140822],{"__ignoreMap":119},[78,140803,140804],{"class":124,"line":125},[78,140805,33824],{},[78,140807,140808],{"class":124,"line":132},[78,140809,33829],{},[78,140811,140812],{"class":124,"line":138},[78,140813,33834],{},[78,140815,140816],{"class":124,"line":144},[78,140817,33839],{},[78,140819,140820],{"class":124,"line":150},[78,140821,33844],{},[78,140823,140824],{"class":124,"line":156},[78,140825,33849],{},[13,140827,33852,140828],{},[5009,140829,33855],{"href":33855,"rel":140830},[23647],[13,140832,33859,140833],{},[5009,140834,33862],{"href":33862,"rel":140835},[23647],[13,140837,33866,140838],{},[5009,140839,33869],{"href":33869,"rel":140840},[23647],[13,140842,33873,140843],{},[5009,140844,33876],{"href":33876,"rel":140845},[23647],[23289,140847],{},[7759,140849,33883],{"id":33882},[13,140851,33886],{},[13,140853,33889],{},[114,140855,140856],{"className":33693,"code":33892,"language":33695,"meta":119,"style":119},[17,140857,140858,140862,140866],{"__ignoreMap":119},[78,140859,140860],{"class":124,"line":125},[78,140861,33899],{},[78,140863,140864],{"class":124,"line":132},[78,140865,33904],{},[78,140867,140868],{"class":124,"line":138},[78,140869,33909],{},[13,140871,33912],{},[13,140873,33915],{},[114,140875,140876],{"className":33693,"code":33918,"language":33695,"meta":119,"style":119},[17,140877,140878,140882,140886],{"__ignoreMap":119},[78,140879,140880],{"class":124,"line":125},[78,140881,33899],{},[78,140883,140884],{"class":124,"line":132},[78,140885,33929],{},[78,140887,140888],{"class":124,"line":138},[78,140889,33909],{},[13,140891,33765],{},[49,140893,140894],{},[52,140895,33940],{},[114,140897,140898],{"className":33693,"code":33943,"language":33695,"meta":119,"style":119},[17,140899,140900,140904,140908,140912],{"__ignoreMap":119},[78,140901,140902],{"class":124,"line":125},[78,140903,33950],{},[78,140905,140906],{"class":124,"line":132},[78,140907,33955],{},[78,140909,140910],{"class":124,"line":138},[78,140911,33960],{},[78,140913,140914],{"class":124,"line":144},[78,140915,33965],{},[49,140917,140918],{},[52,140919,33970],{},[114,140921,140922],{"className":33693,"code":33973,"language":33695,"meta":119,"style":119},[17,140923,140924,140928,140932,140936,140940,140944],{"__ignoreMap":119},[78,140925,140926],{"class":124,"line":125},[78,140927,33980],{},[78,140929,140930],{"class":124,"line":132},[78,140931,33985],{},[78,140933,140934],{"class":124,"line":138},[78,140935,33990],{},[78,140937,140938],{"class":124,"line":144},[78,140939,33995],{},[78,140941,140942],{"class":124,"line":150},[78,140943,33985],{},[78,140945,140946],{"class":124,"line":156},[78,140947,33965],{},[13,140949,34006,140950],{},[5009,140951,34009],{"href":34009,"rel":140952},[23647],[13,140954,34013,140955],{},[5009,140956,34016],{"href":34016,"rel":140957},[23647],[13,140959,34020,140960],{},[5009,140961,34023],{"href":34023,"rel":140962},[23647],[23289,140964],{},[7759,140966,34030],{"id":34029},[13,140968,34033],{},[49,140970,140971],{},[52,140972,34038],{},[114,140974,140975],{"className":33693,"code":34041,"language":33695,"meta":119,"style":119},[17,140976,140977],{"__ignoreMap":119},[78,140978,140979],{"class":124,"line":125},[78,140980,34041],{},[49,140982,140983],{},[52,140984,34052],{},[114,140986,140987],{"className":33693,"code":34055,"language":33695,"meta":119,"style":119},[17,140988,140989],{"__ignoreMap":119},[78,140990,140991],{"class":124,"line":125},[78,140992,34055],{},[13,140994,34064],{},[13,140996,33765],{},[49,140998,140999],{},[52,141000,34071],{},[114,141002,141003],{"className":33693,"code":34074,"language":33695,"meta":119,"style":119},[17,141004,141005],{"__ignoreMap":119},[78,141006,141007],{"class":124,"line":125},[78,141008,34074],{},[49,141010,141011],{},[52,141012,34085],{},[114,141014,141015],{"className":33693,"code":34088,"language":33695,"meta":119,"style":119},[17,141016,141017],{"__ignoreMap":119},[78,141018,141019],{"class":124,"line":125},[78,141020,34088],{},[13,141022,34097,141023],{},[5009,141024,34100],{"href":34100,"rel":141025},[23647],[13,141027,34104,141028],{},[5009,141029,34107],{"href":34107,"rel":141030},[23647],[13,141032,34111,141033],{},[5009,141034,34114],{"href":34114,"rel":141035},[23647],[23289,141037],{},[7759,141039,34121],{"id":34120},[13,141041,34124],{},[49,141043,141044],{},[52,141045,34129],{},[114,141047,141048],{"className":33693,"code":34132,"language":33695,"meta":119,"style":119},[17,141049,141050],{"__ignoreMap":119},[78,141051,141052],{"class":124,"line":125},[78,141053,34132],{},[49,141055,141056],{},[52,141057,34143],{},[114,141059,141060],{"className":33693,"code":34146,"language":33695,"meta":119,"style":119},[17,141061,141062],{"__ignoreMap":119},[78,141063,141064],{"class":124,"line":125},[78,141065,34146],{},[13,141067,34155],{},[13,141069,33765],{},[49,141071,141072],{},[52,141073,34162],{},[114,141075,141076],{"className":33693,"code":34165,"language":33695,"meta":119,"style":119},[17,141077,141078],{"__ignoreMap":119},[78,141079,141080],{"class":124,"line":125},[78,141081,34165],{},[49,141083,141084],{},[52,141085,34176],{},[114,141087,141088],{"className":33693,"code":34179,"language":33695,"meta":119,"style":119},[17,141089,141090],{"__ignoreMap":119},[78,141091,141092],{"class":124,"line":125},[78,141093,34179],{},[13,141095,34188,141096],{},[5009,141097,34191],{"href":34191,"rel":141098},[23647],[13,141100,34195,141101],{},[5009,141102,34198],{"href":34198,"rel":141103},[23647],[13,141105,34202,141106],{},[5009,141107,34205],{"href":34205,"rel":141108},[23647],[23289,141110],{},[7759,141112,34212],{"id":34211},[13,141114,34215],{},[49,141116,141117],{},[52,141118,34220],{},[114,141120,141121],{"className":33693,"code":34223,"language":33695,"meta":119,"style":119},[17,141122,141123],{"__ignoreMap":119},[78,141124,141125],{"class":124,"line":125},[78,141126,34223],{},[13,141128,34232],{},[13,141130,33765],{},[49,141132,141133],{},[52,141134,34239],{},[114,141136,141137],{"className":33693,"code":34242,"language":33695,"meta":119,"style":119},[17,141138,141139],{"__ignoreMap":119},[78,141140,141141],{"class":124,"line":125},[78,141142,34242],{},[49,141144,141145],{},[52,141146,34253],{},[114,141148,141149],{"className":33693,"code":34256,"language":33695,"meta":119,"style":119},[17,141150,141151],{"__ignoreMap":119},[78,141152,141153],{"class":124,"line":125},[78,141154,34256],{},[13,141156,34265,141157],{},[5009,141158,34268],{"href":34268,"rel":141159},[23647],[13,141161,34272,141162],{},[5009,141163,34275],{"href":34275,"rel":141164},[23647],[13,141166,34279,141167],{},[5009,141168,34282],{"href":34282,"rel":141169},[23647],[13,141171,34286,141172],{},[5009,141173,34289],{"href":34289,"rel":141174},[23647],[13,141176,34293,141177],{},[5009,141178,34296],{"href":34296,"rel":141179},[23647],[13,141181,34300,141182],{},[5009,141183,34303],{"href":34303,"rel":141184},[23647],[23289,141186],{},[7759,141188,34310],{"id":34309},[13,141190,34313],{},[114,141192,141193],{"className":33693,"code":34316,"language":33695,"meta":119,"style":119},[17,141194,141195],{"__ignoreMap":119},[78,141196,141197],{"class":124,"line":125},[78,141198,34316],{},[13,141200,34325],{},[13,141202,33765],{},[49,141204,141205],{},[52,141206,34332],{},[114,141208,141209],{"className":33693,"code":34335,"language":33695,"meta":119,"style":119},[17,141210,141211,141215],{"__ignoreMap":119},[78,141212,141213],{"class":124,"line":125},[78,141214,34342],{},[78,141216,141217],{"class":124,"line":132},[78,141218,34347],{},[13,141220,34350],{},[8366,141222,141223,141235],{},[8369,141224,141225],{},[8372,141226,141227,141229,141231,141233],{},[8375,141228,34359],{},[8375,141230,34362],{},[8375,141232,34365],{},[8375,141234,34368],{},[8386,141236,141237,141247,141257,141267,141277,141287],{},[8372,141238,141239,141241,141243,141245],{},[8391,141240,34375],{},[8391,141242,34378],{},[8391,141244,34381],{},[8391,141246,469],{},[8372,141248,141249,141251,141253,141255],{},[8391,141250,34388],{},[8391,141252,34391],{},[8391,141254,34381],{},[8391,141256,472],{},[8372,141258,141259,141261,141263,141265],{},[8391,141260,34400],{},[8391,141262,34403],{},[8391,141264,34381],{},[8391,141266,1025],{},[8372,141268,141269,141271,141273,141275],{},[8391,141270,34412],{},[8391,141272,34415],{},[8391,141274,34418],{},[8391,141276,469],{},[8372,141278,141279,141281,141283,141285],{},[8391,141280,34425],{},[8391,141282,34378],{},[8391,141284,34418],{},[8391,141286,472],{},[8372,141288,141289,141291,141293,141295],{},[8391,141290,34436],{},[8391,141292,34391],{},[8391,141294,34418],{},[8391,141296,1025],{},[49,141298,141299],{},[52,141300,34447],{},[114,141302,141303],{"className":33693,"code":34450,"language":33695,"meta":119,"style":119},[17,141304,141305,141309],{"__ignoreMap":119},[78,141306,141307],{"class":124,"line":125},[78,141308,34457],{},[78,141310,141311],{"class":124,"line":132},[78,141312,34462],{},[13,141314,34350],{},[8366,141316,141317,141329],{},[8369,141318,141319],{},[8372,141320,141321,141323,141325,141327],{},[8375,141322,34359],{},[8375,141324,34475],{},[8375,141326,34478],{},[8375,141328,34368],{},[8386,141330,141331,141341,141351,141361,141371,141381,141391,141401,141411,141421],{},[8372,141332,141333,141335,141337,141339],{},[8391,141334,34487],{},[8391,141336,34490],{},[8391,141338,17143],{},[8391,141340,469],{},[8372,141342,141343,141345,141347,141349],{},[8391,141344,34499],{},[8391,141346,34502],{},[8391,141348,17143],{},[8391,141350,472],{},[8372,141352,141353,141355,141357,141359],{},[8391,141354,34511],{},[8391,141356,34514],{},[8391,141358,17143],{},[8391,141360,1025],{},[8372,141362,141363,141365,141367,141369],{},[8391,141364,34523],{},[8391,141366,34526],{},[8391,141368,17143],{},[8391,141370,1014],{},[8372,141372,141373,141375,141377,141379],{},[8391,141374,34535],{},[8391,141376,34538],{},[8391,141378,17143],{},[8391,141380,11047],{},[8372,141382,141383,141385,141387,141389],{},[8391,141384,34547],{},[8391,141386,34550],{},[8391,141388,17148],{},[8391,141390,469],{},[8372,141392,141393,141395,141397,141399],{},[8391,141394,34559],{},[8391,141396,34562],{},[8391,141398,17148],{},[8391,141400,472],{},[8372,141402,141403,141405,141407,141409],{},[8391,141404,34571],{},[8391,141406,34574],{},[8391,141408,17148],{},[8391,141410,1025],{},[8372,141412,141413,141415,141417,141419],{},[8391,141414,34583],{},[8391,141416,34526],{},[8391,141418,17148],{},[8391,141420,1014],{},[8372,141422,141423,141425,141427,141429],{},[8391,141424,34594],{},[8391,141426,34597],{},[8391,141428,17148],{},[8391,141430,11047],{},[13,141432,34604,141433],{},[5009,141434,34607],{"href":34607,"rel":141435},[23647],[13,141437,34611,141438],{},[5009,141439,34614],{"href":34614,"rel":141440},[23647],[13,141442,34618,141443],{},[5009,141444,34621],{"href":34621,"rel":141445},[23647],[13,141447,34625,141448],{},[5009,141449,34628],{"href":34628,"rel":141450},[23647],[13,141452,34632,141453],{},[5009,141454,34635],{"href":34635,"rel":141455},[23647],[23289,141457],{},[7759,141459,34642],{"id":34641},[13,141461,34645],{},[114,141463,141464],{"className":33693,"code":34648,"language":33695,"meta":119,"style":119},[17,141465,141466],{"__ignoreMap":119},[78,141467,141468],{"class":124,"line":125},[78,141469,34648],{},[13,141471,34657],{},[13,141473,34660],{},[49,141475,141476],{},[52,141477,34665],{},[114,141479,141480],{"className":33693,"code":34668,"language":33695,"meta":119,"style":119},[17,141481,141482],{"__ignoreMap":119},[78,141483,141484],{"class":124,"line":125},[78,141485,34668],{},[13,141487,34677],{},[49,141489,141490],{},[52,141491,34682],{},[114,141493,141494],{"className":33693,"code":34685,"language":33695,"meta":119,"style":119},[17,141495,141496],{"__ignoreMap":119},[78,141497,141498],{"class":124,"line":125},[78,141499,34685],{},[13,141501,34694],{},[13,141503,34697,141504],{},[5009,141505,34700],{"href":34700,"rel":141506},[23647],[13,141508,34704,141509],{},[5009,141510,34707],{"href":34707,"rel":141511},[23647],[13,141513,34711,141514],{},[5009,141515,34714],{"href":34714,"rel":141516},[23647],[13,141518,34718,141519],{},[5009,141520,34721],{"href":34721,"rel":141521},[23647],[13,141523,34725,141524],{},[5009,141525,34728],{"href":34728,"rel":141526},[23647],[13,141528,34732,141529],{},[5009,141530,34735],{"href":34735,"rel":141531},[23647],[23289,141533],{},[7759,141535,34742],{"id":34741},[13,141537,34745],{},[13,141539,34660],{},[2285,141541,141542],{},[52,141543,34752],{},[114,141545,141546],{"className":33693,"code":34755,"language":33695,"meta":119,"style":119},[17,141547,141548,141552,141556,141560],{"__ignoreMap":119},[78,141549,141550],{"class":124,"line":125},[78,141551,34762],{},[78,141553,141554],{"class":124,"line":132},[78,141555,34767],{},[78,141557,141558],{"class":124,"line":138},[78,141559,34772],{},[78,141561,141562],{"class":124,"line":144},[78,141563,34347],{},[2285,141565,141566],{"start":132},[52,141567,34781],{},[114,141569,141570],{"className":33693,"code":34784,"language":33695,"meta":119,"style":119},[17,141571,141572,141576,141580],{"__ignoreMap":119},[78,141573,141574],{"class":124,"line":125},[78,141575,34791],{},[78,141577,141578],{"class":124,"line":132},[78,141579,34796],{},[78,141581,141582],{"class":124,"line":138},[78,141583,34801],{},[13,141585,34804,141586],{},[5009,141587,34807],{"href":34807,"rel":141588},[23647],[13,141590,34811,141591],{},[5009,141592,34814],{"href":34814,"rel":141593},[23647],[13,141595,34818,141596],{},[5009,141597,34821],{"href":34821,"rel":141598},[23647],[13,141600,34825,141601],{},[5009,141602,34828],{"href":34828,"rel":141603},[23647],[23289,141605],{},[7759,141607,34835],{"id":34834},[13,141609,34838],{},[13,141611,34660],{},[2285,141613,141614],{},[52,141615,34845],{},[114,141617,141618],{"className":33693,"code":34848,"language":33695,"meta":119,"style":119},[17,141619,141620,141624,141628],{"__ignoreMap":119},[78,141621,141622],{"class":124,"line":125},[78,141623,34855],{},[78,141625,141626],{"class":124,"line":132},[78,141627,34860],{},[78,141629,141630],{"class":124,"line":138},[78,141631,34865],{},[2285,141633,141634],{"start":132},[52,141635,34870],{},[114,141637,141638],{"className":33693,"code":34873,"language":33695,"meta":119,"style":119},[17,141639,141640,141644,141648,141652,141656],{"__ignoreMap":119},[78,141641,141642],{"class":124,"line":125},[78,141643,34880],{},[78,141645,141646],{"class":124,"line":132},[78,141647,34885],{},[78,141649,141650],{"class":124,"line":138},[78,141651,34890],{},[78,141653,141654],{"class":124,"line":144},[78,141655,34895],{},[78,141657,141658],{"class":124,"line":150},[78,141659,34900],{},[13,141661,34903,141662],{},[5009,141663,34906],{"href":34906,"rel":141664},[23647],[13,141666,34910,141667],{},[5009,141668,34913],{"href":34913,"rel":141669},[23647],[13,141671,34917,141672],{},[5009,141673,34920],{"href":34920,"rel":141674},[23647],[13,141676,34924,141677],{},[5009,141678,34927],{"href":34927,"rel":141679},[23647],[13,141681,34931,141682],{},[5009,141683,34934],{"href":34934,"rel":141684},[23647],[23289,141686],{},[7759,141688,34941],{"id":34940},[13,141690,34944],{},[13,141692,34660],{},[2285,141694,141695],{},[52,141696,34951],{},[114,141698,141699],{"className":33693,"code":34954,"language":33695,"meta":119,"style":119},[17,141700,141701,141705,141709,141713],{"__ignoreMap":119},[78,141702,141703],{"class":124,"line":125},[78,141704,34961],{},[78,141706,141707],{"class":124,"line":132},[78,141708,34966],{},[78,141710,141711],{"class":124,"line":138},[78,141712,34971],{},[78,141714,141715],{"class":124,"line":144},[78,141716,34976],{},[2285,141718,141719],{"start":132},[52,141720,34981],{},[114,141722,141723],{"className":33693,"code":34984,"language":33695,"meta":119,"style":119},[17,141724,141725,141729,141733,141737],{"__ignoreMap":119},[78,141726,141727],{"class":124,"line":125},[78,141728,34991],{},[78,141730,141731],{"class":124,"line":132},[78,141732,34996],{},[78,141734,141735],{"class":124,"line":138},[78,141736,34971],{},[78,141738,141739],{"class":124,"line":144},[78,141740,35005],{},[13,141742,35008,141743],{},[5009,141744,35011],{"href":35011,"rel":141745},[23647],[13,141747,35015,141748],{},[5009,141749,35018],{"href":35018,"rel":141750},[23647],[13,141752,35022,141753],{},[5009,141754,35025],{"href":35025,"rel":141755},[23647],[13,141757,35029,141758],{},[5009,141759,35032],{"href":35032,"rel":141760},[23647],[13,141762,35036,141763],{},[5009,141764,35039],{"href":35039,"rel":141765},[23647],[23289,141767],{},[7759,141769,35045],{"id":35045},[10548,141771,35049],{"id":35048},[114,141773,141774],{"className":33693,"code":35052,"language":33695,"meta":119,"style":119},[17,141775,141776,141780,141784,141788,141792,141796,141800,141804,141808,141812,141816,141820,141824,141828,141832,141836,141840,141844,141848,141852,141856,141860,141864],{"__ignoreMap":119},[78,141777,141778],{"class":124,"line":125},[78,141779,35059],{},[78,141781,141782],{"class":124,"line":132},[78,141783,35064],{},[78,141785,141786],{"class":124,"line":138},[78,141787,35069],{},[78,141789,141790],{"class":124,"line":144},[78,141791,35074],{},[78,141793,141794],{"class":124,"line":150},[78,141795,35079],{},[78,141797,141798],{"class":124,"line":156},[78,141799,35084],{},[78,141801,141802],{"class":124,"line":162},[78,141803,35089],{},[78,141805,141806],{"class":124,"line":168},[78,141807,35094],{},[78,141809,141810],{"class":124,"line":174},[78,141811,35099],{},[78,141813,141814],{"class":124,"line":180},[78,141815,35104],{},[78,141817,141818],{"class":124,"line":186},[78,141819,35109],{},[78,141821,141822],{"class":124,"line":192},[78,141823,35114],{},[78,141825,141826],{"class":124,"line":198},[78,141827,35119],{},[78,141829,141830],{"class":124,"line":204},[78,141831,35124],{},[78,141833,141834],{"class":124,"line":210},[78,141835,35129],{},[78,141837,141838],{"class":124,"line":216},[78,141839,35134],{},[78,141841,141842],{"class":124,"line":222},[78,141843,35134],{},[78,141845,141846],{"class":124,"line":421},[78,141847,35143],{},[78,141849,141850],{"class":124,"line":427},[78,141851,35148],{},[78,141853,141854],{"class":124,"line":433},[78,141855,35153],{},[78,141857,141858],{"class":124,"line":2443},[78,141859,35158],{},[78,141861,141862],{"class":124,"line":2448},[78,141863,35163],{},[78,141865,141866],{"class":124,"line":2454},[78,141867,35168],{},[10548,141869,35172],{"id":35171},[114,141871,141872],{"className":33693,"code":35175,"language":33695,"meta":119,"style":119},[17,141873,141874,141878,141882,141886,141890,141894,141898,141902,141906,141910,141914,141918,141922,141926,141930,141934,141938,141942,141946,141950,141954,141958,141962,141966],{"__ignoreMap":119},[78,141875,141876],{"class":124,"line":125},[78,141877,35182],{},[78,141879,141880],{"class":124,"line":132},[78,141881,35187],{},[78,141883,141884],{"class":124,"line":138},[78,141885,35192],{},[78,141887,141888],{"class":124,"line":144},[78,141889,35197],{},[78,141891,141892],{"class":124,"line":150},[78,141893,35202],{},[78,141895,141896],{"class":124,"line":156},[78,141897,35207],{},[78,141899,141900],{"class":124,"line":162},[78,141901,35212],{},[78,141903,141904],{"class":124,"line":168},[78,141905,35217],{},[78,141907,141908],{"class":124,"line":174},[78,141909,35222],{},[78,141911,141912],{"class":124,"line":180},[78,141913,35227],{},[78,141915,141916],{"class":124,"line":186},[78,141917,35232],{},[78,141919,141920],{"class":124,"line":192},[78,141921,35134],{},[78,141923,141924],{"class":124,"line":198},[78,141925,35134],{},[78,141927,141928],{"class":124,"line":204},[78,141929,35245],{},[78,141931,141932],{"class":124,"line":210},[78,141933,35250],{},[78,141935,141936],{"class":124,"line":216},[78,141937,35255],{},[78,141939,141940],{"class":124,"line":222},[78,141941,35158],{},[78,141943,141944],{"class":124,"line":421},[78,141945,35264],{},[78,141947,141948],{"class":124,"line":427},[78,141949,35269],{},[78,141951,141952],{"class":124,"line":433},[78,141953,35274],{},[78,141955,141956],{"class":124,"line":2443},[78,141957,35279],{},[78,141959,141960],{"class":124,"line":2448},[78,141961,35284],{},[78,141963,141964],{"class":124,"line":2454},[78,141965,35289],{},[78,141967,141968],{"class":124,"line":2460},[78,141969,35168],{},[10548,141971,35297],{"id":35296},[114,141973,141974],{"className":33693,"code":35300,"language":33695,"meta":119,"style":119},[17,141975,141976,141980,141984,141988,141992,141996,142000,142004,142008,142012,142016,142020,142024,142028,142032,142036,142040,142044,142048,142052,142056,142060,142064,142068,142072,142076,142080],{"__ignoreMap":119},[78,141977,141978],{"class":124,"line":125},[78,141979,35307],{},[78,141981,141982],{"class":124,"line":132},[78,141983,35312],{},[78,141985,141986],{"class":124,"line":138},[78,141987,35317],{},[78,141989,141990],{"class":124,"line":144},[78,141991,35322],{},[78,141993,141994],{"class":124,"line":150},[78,141995,35327],{},[78,141997,141998],{"class":124,"line":156},[78,141999,35332],{},[78,142001,142002],{"class":124,"line":162},[78,142003,35337],{},[78,142005,142006],{"class":124,"line":168},[78,142007,35342],{},[78,142009,142010],{"class":124,"line":174},[78,142011,35347],{},[78,142013,142014],{"class":124,"line":180},[78,142015,35217],{},[78,142017,142018],{"class":124,"line":186},[78,142019,35356],{},[78,142021,142022],{"class":124,"line":192},[78,142023,35361],{},[78,142025,142026],{"class":124,"line":198},[78,142027,35366],{},[78,142029,142030],{"class":124,"line":204},[78,142031,35371],{},[78,142033,142034],{"class":124,"line":210},[78,142035,35371],{},[78,142037,142038],{"class":124,"line":216},[78,142039,35245],{},[78,142041,142042],{"class":124,"line":222},[78,142043,35384],{},[78,142045,142046],{"class":124,"line":421},[78,142047,35389],{},[78,142049,142050],{"class":124,"line":427},[78,142051,35394],{},[78,142053,142054],{"class":124,"line":433},[78,142055,35399],{},[78,142057,142058],{"class":124,"line":2443},[78,142059,35404],{},[78,142061,142062],{"class":124,"line":2448},[78,142063,35409],{},[78,142065,142066],{"class":124,"line":2454},[78,142067,35414],{},[78,142069,142070],{"class":124,"line":2460},[78,142071,35419],{},[78,142073,142074],{"class":124,"line":2465},[78,142075,129],{"emptyLinePlaceholder":128},[78,142077,142078],{"class":124,"line":2470},[78,142079,35428],{},[78,142081,142082],{"class":124,"line":2903},[78,142083,35433],{},[10548,142085,35437],{"id":35436},[114,142087,142088],{"className":33693,"code":35440,"language":33695,"meta":119,"style":119},[17,142089,142090,142094,142098,142102,142106,142110,142114,142118,142122,142126,142130,142134,142138,142142,142146,142150,142154,142158,142162,142166,142170,142174,142178,142182,142186,142190],{"__ignoreMap":119},[78,142091,142092],{"class":124,"line":125},[78,142093,35447],{},[78,142095,142096],{"class":124,"line":132},[78,142097,35312],{},[78,142099,142100],{"class":124,"line":138},[78,142101,35456],{},[78,142103,142104],{"class":124,"line":144},[78,142105,35461],{},[78,142107,142108],{"class":124,"line":150},[78,142109,35466],{},[78,142111,142112],{"class":124,"line":156},[78,142113,35471],{},[78,142115,142116],{"class":124,"line":162},[78,142117,35476],{},[78,142119,142120],{"class":124,"line":168},[78,142121,35481],{},[78,142123,142124],{"class":124,"line":174},[78,142125,35217],{},[78,142127,142128],{"class":124,"line":180},[78,142129,35490],{},[78,142131,142132],{"class":124,"line":186},[78,142133,35495],{},[78,142135,142136],{"class":124,"line":192},[78,142137,35500],{},[78,142139,142140],{"class":124,"line":198},[78,142141,35505],{},[78,142143,142144],{"class":124,"line":204},[78,142145,35510],{},[78,142147,142148],{"class":124,"line":210},[78,142149,35515],{},[78,142151,142152],{"class":124,"line":216},[78,142153,129],{"emptyLinePlaceholder":128},[78,142155,142156],{"class":124,"line":222},[78,142157,129],{"emptyLinePlaceholder":128},[78,142159,142160],{"class":124,"line":421},[78,142161,35528],{},[78,142163,142164],{"class":124,"line":427},[78,142165,35533],{},[78,142167,142168],{"class":124,"line":433},[78,142169,35538],{},[78,142171,142172],{"class":124,"line":2443},[78,142173,35543],{},[78,142175,142176],{"class":124,"line":2448},[78,142177,35548],{},[78,142179,142180],{"class":124,"line":2454},[78,142181,35553],{},[78,142183,142184],{"class":124,"line":2460},[78,142185,129],{"emptyLinePlaceholder":128},[78,142187,142188],{"class":124,"line":2465},[78,142189,35428],{},[78,142191,142192],{"class":124,"line":2470},[78,142193,35566],{},[10548,142195,35570],{"id":35569},[114,142197,142198],{"className":33693,"code":35573,"language":33695,"meta":119,"style":119},[17,142199,142200,142204,142208,142212,142216,142220,142224,142228,142232,142236,142240,142244,142248,142252,142256,142260,142264,142268,142272,142276,142280,142284,142288,142292,142296,142300,142304,142308],{"__ignoreMap":119},[78,142201,142202],{"class":124,"line":125},[78,142203,35580],{},[78,142205,142206],{"class":124,"line":132},[78,142207,35312],{},[78,142209,142210],{"class":124,"line":138},[78,142211,35456],{},[78,142213,142214],{"class":124,"line":144},[78,142215,35593],{},[78,142217,142218],{"class":124,"line":150},[78,142219,35598],{},[78,142221,142222],{"class":124,"line":156},[78,142223,35603],{},[78,142225,142226],{"class":124,"line":162},[78,142227,35608],{},[78,142229,142230],{"class":124,"line":168},[78,142231,35613],{},[78,142233,142234],{"class":124,"line":174},[78,142235,35618],{},[78,142237,142238],{"class":124,"line":180},[78,142239,35217],{},[78,142241,142242],{"class":124,"line":186},[78,142243,35627],{},[78,142245,142246],{"class":124,"line":192},[78,142247,35593],{},[78,142249,142250],{"class":124,"line":198},[78,142251,35636],{},[78,142253,142254],{"class":124,"line":204},[78,142255,35641],{},[78,142257,142258],{"class":124,"line":210},[78,142259,35608],{},[78,142261,142262],{"class":124,"line":216},[78,142263,35650],{},[78,142265,142266],{"class":124,"line":222},[78,142267,35134],{},[78,142269,142270],{"class":124,"line":421},[78,142271,35134],{},[78,142273,142274],{"class":124,"line":427},[78,142275,35528],{},[78,142277,142278],{"class":124,"line":433},[78,142279,35533],{},[78,142281,142282],{"class":124,"line":2443},[78,142283,35671],{},[78,142285,142286],{"class":124,"line":2448},[78,142287,35676],{},[78,142289,142290],{"class":124,"line":2454},[78,142291,35389],{},[78,142293,142294],{"class":124,"line":2460},[78,142295,35394],{},[78,142297,142298],{"class":124,"line":2465},[78,142299,35399],{},[78,142301,142302],{"class":124,"line":2470},[78,142303,35693],{},[78,142305,142306],{"class":124,"line":2903},[78,142307,35698],{},[78,142309,142310],{"class":124,"line":2909},[78,142311,35703],{},[226,142313,228],{},{"title":119,"searchDepth":144,"depth":144,"links":142315},[142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326],{"id":33683,"depth":144,"text":33684},{"id":33882,"depth":144,"text":33883},{"id":34029,"depth":144,"text":34030},{"id":34120,"depth":144,"text":34121},{"id":34211,"depth":144,"text":34212},{"id":34309,"depth":144,"text":34310},{"id":34641,"depth":144,"text":34642},{"id":34741,"depth":144,"text":34742},{"id":34834,"depth":144,"text":34835},{"id":34940,"depth":144,"text":34941},{"id":35045,"depth":144,"text":35045},{},{"title":33636,"description":119},[23378,10715,35725],{"id":35728,"title":246,"assetBase":239,"author":8,"body":142331,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":142636,"navigation":128,"originalPath":36089,"path":36090,"seo":142637,"source":23330,"stem":36092,"tags":142638,"weight":250,"__hash__":36094},{"type":10,"value":142332,"toc":142631},[142333,142335,142407,142409,142485,142487,142555,142557,142629],[7759,142334,35734],{"id":35733},[114,142336,142337],{"className":23652,"code":35737,"language":23654,"meta":119,"style":119},[17,142338,142339,142343,142347,142351,142355,142359,142363,142367,142371,142375,142379,142383,142387,142391,142395,142399,142403],{"__ignoreMap":119},[78,142340,142341],{"class":124,"line":125},[78,142342,35744],{},[78,142344,142345],{"class":124,"line":132},[78,142346,35749],{},[78,142348,142349],{"class":124,"line":138},[78,142350,35754],{},[78,142352,142353],{"class":124,"line":144},[78,142354,35759],{},[78,142356,142357],{"class":124,"line":150},[78,142358,35764],{},[78,142360,142361],{"class":124,"line":156},[78,142362,35769],{},[78,142364,142365],{"class":124,"line":162},[78,142366,35774],{},[78,142368,142369],{"class":124,"line":168},[78,142370,35779],{},[78,142372,142373],{"class":124,"line":174},[78,142374,9615],{},[78,142376,142377],{"class":124,"line":180},[78,142378,10054],{},[78,142380,142381],{"class":124,"line":186},[78,142382,129],{"emptyLinePlaceholder":128},[78,142384,142385],{"class":124,"line":192},[78,142386,35796],{},[78,142388,142389],{"class":124,"line":198},[78,142390,35801],{},[78,142392,142393],{"class":124,"line":204},[78,142394,35806],{},[78,142396,142397],{"class":124,"line":210},[78,142398,10054],{},[78,142400,142401],{"class":124,"line":216},[78,142402,35815],{},[78,142404,142405],{"class":124,"line":222},[78,142406,15810],{},[7759,142408,35823],{"id":35822},[114,142410,142411],{"className":23652,"code":35826,"language":23654,"meta":119,"style":119},[17,142412,142413,142417,142421,142425,142429,142433,142437,142441,142445,142449,142453,142457,142461,142465,142469,142473,142477,142481],{"__ignoreMap":119},[78,142414,142415],{"class":124,"line":125},[78,142416,35833],{},[78,142418,142419],{"class":124,"line":132},[78,142420,35838],{},[78,142422,142423],{"class":124,"line":138},[78,142424,35843],{},[78,142426,142427],{"class":124,"line":144},[78,142428,35848],{},[78,142430,142431],{"class":124,"line":150},[78,142432,35853],{},[78,142434,142435],{"class":124,"line":156},[78,142436,35858],{},[78,142438,142439],{"class":124,"line":162},[78,142440,35863],{},[78,142442,142443],{"class":124,"line":168},[78,142444,35868],{},[78,142446,142447],{"class":124,"line":174},[78,142448,9615],{},[78,142450,142451],{"class":124,"line":180},[78,142452,35877],{},[78,142454,142455],{"class":124,"line":186},[78,142456,129],{"emptyLinePlaceholder":128},[78,142458,142459],{"class":124,"line":192},[78,142460,35886],{},[78,142462,142463],{"class":124,"line":198},[78,142464,35891],{},[78,142466,142467],{"class":124,"line":204},[78,142468,35896],{},[78,142470,142471],{"class":124,"line":210},[78,142472,35901],{},[78,142474,142475],{"class":124,"line":216},[78,142476,10054],{},[78,142478,142479],{"class":124,"line":222},[78,142480,35910],{},[78,142482,142483],{"class":124,"line":421},[78,142484,15810],{},[7759,142486,35918],{"id":35917},[114,142488,142489],{"className":23652,"code":35921,"language":23654,"meta":119,"style":119},[17,142490,142491,142495,142499,142503,142507,142511,142515,142519,142523,142527,142531,142535,142539,142543,142547,142551],{"__ignoreMap":119},[78,142492,142493],{"class":124,"line":125},[78,142494,35928],{},[78,142496,142497],{"class":124,"line":132},[78,142498,35933],{},[78,142500,142501],{"class":124,"line":138},[78,142502,35938],{},[78,142504,142505],{"class":124,"line":144},[78,142506,35943],{},[78,142508,142509],{"class":124,"line":150},[78,142510,129],{"emptyLinePlaceholder":128},[78,142512,142513],{"class":124,"line":156},[78,142514,35952],{},[78,142516,142517],{"class":124,"line":162},[78,142518,35957],{},[78,142520,142521],{"class":124,"line":168},[78,142522,35962],{},[78,142524,142525],{"class":124,"line":174},[78,142526,35967],{},[78,142528,142529],{"class":124,"line":180},[78,142530,10054],{},[78,142532,142533],{"class":124,"line":186},[78,142534,35976],{},[78,142536,142537],{"class":124,"line":192},[78,142538,35891],{},[78,142540,142541],{"class":124,"line":198},[78,142542,35806],{},[78,142544,142545],{"class":124,"line":204},[78,142546,10054],{},[78,142548,142549],{"class":124,"line":210},[78,142550,35815],{},[78,142552,142553],{"class":124,"line":216},[78,142554,15810],{},[10548,142556,35999],{"id":35999},[114,142558,142559],{"className":23652,"code":36002,"language":23654,"meta":119,"style":119},[17,142560,142561,142565,142569,142573,142577,142581,142585,142589,142593,142597,142601,142605,142609,142613,142617,142621,142625],{"__ignoreMap":119},[78,142562,142563],{"class":124,"line":125},[78,142564,35928],{},[78,142566,142567],{"class":124,"line":132},[78,142568,35933],{},[78,142570,142571],{"class":124,"line":138},[78,142572,35938],{},[78,142574,142575],{"class":124,"line":144},[78,142576,36021],{},[78,142578,142579],{"class":124,"line":150},[78,142580,36026],{},[78,142582,142583],{"class":124,"line":156},[78,142584,36031],{},[78,142586,142587],{"class":124,"line":162},[78,142588,36036],{},[78,142590,142591],{"class":124,"line":168},[78,142592,129],{"emptyLinePlaceholder":128},[78,142594,142595],{"class":124,"line":174},[78,142596,35957],{},[78,142598,142599],{"class":124,"line":180},[78,142600,36049],{},[78,142602,142603],{"class":124,"line":186},[78,142604,36054],{},[78,142606,142607],{"class":124,"line":192},[78,142608,36059],{},[78,142610,142611],{"class":124,"line":198},[78,142612,36064],{},[78,142614,142615],{"class":124,"line":204},[78,142616,10054],{},[78,142618,142619],{"class":124,"line":210},[78,142620,1359],{},[78,142622,142623],{"class":124,"line":216},[78,142624,35815],{},[78,142626,142627],{"class":124,"line":222},[78,142628,15810],{},[226,142630,228],{},{"title":119,"searchDepth":144,"depth":144,"links":142632},[142633,142634,142635],{"id":35733,"depth":144,"text":35734},{"id":35822,"depth":144,"text":35823},{"id":35917,"depth":144,"text":35918},{},{"title":246,"description":119},[246],{"id":36096,"title":36097,"assetBase":239,"author":8,"body":142640,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":142942,"navigation":128,"originalPath":36467,"path":36468,"seo":142943,"source":23330,"stem":36470,"tags":142944,"weight":250,"__hash__":36472},{"type":10,"value":142641,"toc":142934},[142642,142644,142646,142648,142650,142652,142654,142790,142792,142794,142796,142798,142804,142932],[4517,142643,36103],{"id":36102},[107,142645,36107],{"id":36106},[13,142647,36110],{},[13,142649,36113],{},[107,142651,36117],{"id":36116},[7759,142653,36121],{"id":36120},[114,142655,142656],{"className":23652,"code":36124,"language":23654,"meta":119,"style":119},[17,142657,142658,142662,142666,142670,142674,142678,142682,142686,142690,142694,142698,142702,142706,142710,142714,142718,142722,142726,142730,142734,142738,142742,142746,142750,142754,142758,142762,142766,142770,142774,142778,142782,142786],{"__ignoreMap":119},[78,142659,142660],{"class":124,"line":125},[78,142661,36131],{},[78,142663,142664],{"class":124,"line":132},[78,142665,36136],{},[78,142667,142668],{"class":124,"line":138},[78,142669,36141],{},[78,142671,142672],{"class":124,"line":144},[78,142673,36146],{},[78,142675,142676],{"class":124,"line":150},[78,142677,1359],{},[78,142679,142680],{"class":124,"line":156},[78,142681,36155],{},[78,142683,142684],{"class":124,"line":162},[78,142685,36160],{},[78,142687,142688],{"class":124,"line":168},[78,142689,36165],{},[78,142691,142692],{"class":124,"line":174},[78,142693,36170],{},[78,142695,142696],{"class":124,"line":180},[78,142697,36175],{},[78,142699,142700],{"class":124,"line":186},[78,142701,36180],{},[78,142703,142704],{"class":124,"line":192},[78,142705,1790],{},[78,142707,142708],{"class":124,"line":198},[78,142709,36189],{},[78,142711,142712],{"class":124,"line":204},[78,142713,36194],{},[78,142715,142716],{"class":124,"line":210},[78,142717,36199],{},[78,142719,142720],{"class":124,"line":216},[78,142721,36204],{},[78,142723,142724],{"class":124,"line":222},[78,142725,1790],{},[78,142727,142728],{"class":124,"line":421},[78,142729,36213],{},[78,142731,142732],{"class":124,"line":427},[78,142733,36218],{},[78,142735,142736],{"class":124,"line":433},[78,142737,36223],{},[78,142739,142740],{"class":124,"line":2443},[78,142741,10054],{},[78,142743,142744],{"class":124,"line":2448},[78,142745,15810],{},[78,142747,142748],{"class":124,"line":2454},[78,142749,1359],{},[78,142751,142752],{"class":124,"line":2460},[78,142753,36240],{},[78,142755,142756],{"class":124,"line":2465},[78,142757,36245],{},[78,142759,142760],{"class":124,"line":2470},[78,142761,36250],{},[78,142763,142764],{"class":124,"line":2903},[78,142765,36255],{},[78,142767,142768],{"class":124,"line":2909},[78,142769,36260],{},[78,142771,142772],{"class":124,"line":11477},[78,142773,10054],{},[78,142775,142776],{"class":124,"line":13374},[78,142777,15810],{},[78,142779,142780],{"class":124,"line":13380},[78,142781,1359],{},[78,142783,142784],{"class":124,"line":13386},[78,142785,36277],{},[78,142787,142788],{"class":124,"line":13722},[78,142789,23518],{},[7759,142791,36285],{"id":36284},[13,142793,36288],{},[7759,142795,36292],{"id":36291},[13,142797,36295],{},[13,142799,36298,142800,2066,142802,17857],{},[78,142801,36301],{},[78,142803,36304],{},[114,142805,142806],{"className":23652,"code":36307,"language":23654,"meta":119,"style":119},[17,142807,142808,142812,142816,142820,142824,142828,142832,142836,142840,142844,142848,142852,142856,142860,142864,142868,142872,142876,142880,142884,142888,142892,142896,142900,142904,142908,142912,142916,142920,142924,142928],{"__ignoreMap":119},[78,142809,142810],{"class":124,"line":125},[78,142811,36314],{},[78,142813,142814],{"class":124,"line":132},[78,142815,36319],{},[78,142817,142818],{"class":124,"line":138},[78,142819,129],{"emptyLinePlaceholder":128},[78,142821,142822],{"class":124,"line":144},[78,142823,36328],{},[78,142825,142826],{"class":124,"line":150},[78,142827,23558],{},[78,142829,142830],{"class":124,"line":156},[78,142831,36337],{},[78,142833,142834],{"class":124,"line":162},[78,142835,36342],{},[78,142837,142838],{"class":124,"line":168},[78,142839,36347],{},[78,142841,142842],{"class":124,"line":174},[78,142843,36352],{},[78,142845,142846],{"class":124,"line":180},[78,142847,36357],{},[78,142849,142850],{"class":124,"line":186},[78,142851,36362],{},[78,142853,142854],{"class":124,"line":192},[78,142855,36367],{},[78,142857,142858],{"class":124,"line":198},[78,142859,129],{"emptyLinePlaceholder":128},[78,142861,142862],{"class":124,"line":204},[78,142863,36376],{},[78,142865,142866],{"class":124,"line":210},[78,142867,36381],{},[78,142869,142870],{"class":124,"line":216},[78,142871,129],{"emptyLinePlaceholder":128},[78,142873,142874],{"class":124,"line":222},[78,142875,36390],{},[78,142877,142878],{"class":124,"line":421},[78,142879,36395],{},[78,142881,142882],{"class":124,"line":427},[78,142883,36400],{},[78,142885,142886],{"class":124,"line":433},[78,142887,36405],{},[78,142889,142890],{"class":124,"line":2443},[78,142891,36410],{},[78,142893,142894],{"class":124,"line":2448},[78,142895,36415],{},[78,142897,142898],{"class":124,"line":2454},[78,142899,9912],{},[78,142901,142902],{"class":124,"line":2460},[78,142903,9615],{},[78,142905,142906],{"class":124,"line":2465},[78,142907,36428],{},[78,142909,142910],{"class":124,"line":2470},[78,142911,36433],{},[78,142913,142914],{"class":124,"line":2903},[78,142915,10054],{},[78,142917,142918],{"class":124,"line":2909},[78,142919,36442],{},[78,142921,142922],{"class":124,"line":11477},[78,142923,36447],{},[78,142925,142926],{"class":124,"line":13374},[78,142927,15810],{},[78,142929,142930],{"class":124,"line":13380},[78,142931,23518],{},[226,142933,228],{},{"title":119,"searchDepth":144,"depth":144,"links":142935},[142936,142937],{"id":36106,"depth":132,"text":36107},{"id":36116,"depth":132,"text":36117,"children":142938},[142939,142940,142941],{"id":36120,"depth":144,"text":36121},{"id":36284,"depth":144,"text":36285},{"id":36291,"depth":144,"text":36292},{},{"title":36097,"description":119},[246,23378,10715,6380,35725],{"id":36474,"title":36475,"assetBase":239,"author":8,"body":142946,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":145599,"navigation":128,"originalPath":39442,"path":39443,"seo":145600,"source":23330,"stem":39445,"tags":145601,"weight":250,"__hash__":39447},{"type":10,"value":142947,"toc":145568},[142948,142950,142958,142960,142962,142976,142978,142980,143002,143004,143006,143008,143010,143012,143014,143016,143018,143020,143022,143070,143072,143074,143140,143142,143144,143146,143150,143174,143178,143208,143210,143212,143214,143216,143218,143220,143222,143224,143234,143238,143242,143244,143246,143248,143250,143252,143254,143256,143258,143260,143262,143264,143266,143268,143270,143272,143274,143276,143278,143280,143282,143284,143286,143288,143290,143292,143294,143296,143298,143300,143302,143304,143306,143308,143310,143312,143314,143316,143318,143320,143324,143328,143330,143334,143338,143340,143342,143344,143346,143350,143352,143356,143358,143360,143362,143364,143366,143368,143370,145433,145437,145439,145441,145443,145445,145447,145451,145455,145457,145459,145461,145463,145465,145467,145469,145471,145473,145475,145481,145483,145485,145493,145495,145497,145499,145503,145505,145507,145509,145511,145513,145515,145517,145519,145521,145525,145529,145533,145535,145537,145539,145541,145543,145545,145547,145549,145554,145558,145560,145562,145564,145566],[4517,142949,36475],{"id":36475},[72,142951,142952,142956],{},[13,142953,142954],{},[22,142955,23957],{},[13,142957,36488],{},[107,142959,36492],{"id":36491},[7759,142961,36496],{"id":36495},[49,142963,142964,142968,142972],{},[52,142965,36501,142966,36504],{},[2996,142967],{},[52,142969,36507,142970,36510],{},[2996,142971],{},[52,142973,36513,142974,36516],{},[2996,142975],{},[23289,142977],{},[7759,142979,36522],{"id":36521},[49,142981,142982,142998],{},[52,142983,36527,142984],{},[49,142985,142986,142988,142990,142992,142994,142996],{},[52,142987,36532],{},[52,142989,36535],{},[52,142991,36538],{},[52,142993,36541],{},[52,142995,36544],{},[52,142997,36547],{},[52,142999,36550,143000,36553],{},[2996,143001],{},[23289,143003],{},[7759,143005,36559],{"id":36558},[13,143007,36562],{},[13,143009,36565],{},[23289,143011],{},[7759,143013,36571],{"id":36570},[13,143015,36574],{},[13,143017,36577],{},[23289,143019],{},[7759,143021,36583],{"id":36582},[49,143023,143024,143026,143028,143030,143032,143034,143036,143038,143040,143042,143044,143046,143048,143050,143052,143054,143056,143058,143060,143062,143064,143066,143068],{},[52,143025,36588],{},[52,143027,36591],{},[52,143029,36594],{},[52,143031,36597],{},[52,143033,36600],{},[52,143035,36603],{},[52,143037,36606],{},[52,143039,36609],{},[52,143041,36612],{},[52,143043,36615],{},[52,143045,36618],{},[52,143047,36621],{},[52,143049,36624],{},[52,143051,36627],{},[52,143053,36630],{},[52,143055,36633],{},[52,143057,36636],{},[52,143059,36639],{},[52,143061,32990],{},[52,143063,36644],{},[52,143065,36647],{},[52,143067,36650],{},[52,143069,36653],{},[23289,143071],{},[7759,143073,36659],{"id":36658},[49,143075,143076,143080,143090,143104,143118,143120,143122,143124],{},[52,143077,36664,143078,36667],{},[2996,143079],{},[52,143081,36670,143082,36673,143084,36676,143086,36679,143088,36682],{},[2996,143083],{},[2996,143085],{},[2996,143087],{},[2996,143089],{},[52,143091,36685,143092,36688,143094,36691,143096,36694,143098,36697,143100,36700,143102,36703],{},[2996,143093],{},[2996,143095],{},[2996,143097],{},[2996,143099],{},[2996,143101],{},[2996,143103],{},[52,143105,36706,143106,36709,143108,36712,143110,36715,143112,36718,143114,36721,143116,36724],{},[2996,143107],{},[2996,143109],{},[2996,143111],{},[2996,143113],{},[2996,143115],{},[2996,143117],{},[52,143119,36727],{},[52,143121,36730],{},[52,143123,36733],{},[52,143125,36736,143126],{},[49,143127,143128,143130,143132,143134,143136,143138],{},[52,143129,36741],{},[52,143131,36744],{},[52,143133,36747],{},[52,143135,36750],{},[52,143137,36753],{},[52,143139,36756],{},[23289,143141],{},[107,143143,36762],{"id":36761},[13,143145,36765],{},[49,143147,143148],{},[52,143149,36770],{},[8366,143151,143152,143160],{},[8369,143153,143154],{},[8372,143155,143156,143158],{},[8375,143157,36779],{"align":9247},[8375,143159,36782],{"align":9247},[8386,143161,143162,143168],{},[8372,143163,143164,143166],{},[8391,143165],{"align":9247},[8391,143167],{"align":9247},[8372,143169,143170,143172],{},[8391,143171],{"align":9247},[8391,143173],{"align":9247},[49,143175,143176],{},[52,143177,36801],{},[8366,143179,143180,143190],{},[8369,143181,143182],{},[8372,143183,143184,143186,143188],{},[8375,143185,36810],{"align":9247},[8375,143187,36779],{"align":9247},[8375,143189,36782],{"align":9247},[8386,143191,143192,143200],{},[8372,143193,143194,143196,143198],{},[8391,143195],{"align":9247},[8391,143197],{"align":9247},[8391,143199],{"align":9247},[8372,143201,143202,143204,143206],{},[8391,143203],{"align":9247},[8391,143205],{"align":9247},[8391,143207],{"align":9247},[7759,143209,36836],{"id":36835},[10548,143211,36840],{"id":36839},[13,143213,36843],{},[13,143215,36846],{},[13,143217,36849],{},[13,143219,36852],{},[13,143221,36855],{},[13,143223,36858],{},[49,143225,143226,143228,143230,143232],{},[52,143227,36863],{},[52,143229,36866],{},[52,143231,36869],{},[52,143233,36872],{},[13,143235,143236],{},[617,143237],{"alt":36877,"src":36878},[13,143239,143240],{},[22,143241,2047],{},[13,143243,36885],{},[13,143245,36888],{},[13,143247,36891],{},[10548,143249,36895],{"id":36894},[13,143251,36898],{},[13,143253,36901],{},[13,143255,36904],{},[13,143257,36907],{},[13,143259,36910],{},[10548,143261,36914],{"id":36913},[13,143263,36898],{},[13,143265,36901],{},[13,143267,36904],{},[13,143269,36923],{},[13,143271,36926],{},[10548,143273,36930],{"id":36929},[13,143275,36843],{},[13,143277,36846],{},[13,143279,36849],{},[13,143281,36852],{},[13,143283,36855],{},[13,143285,36943],{},[10548,143287,36947],{"id":36946},[13,143289,36843],{},[13,143291,36846],{},[13,143293,36849],{},[13,143295,36852],{},[13,143297,36855],{},[13,143299,36960],{},[10548,143301,36964],{"id":36963},[13,143303,36967],{},[13,143305,36846],{},[13,143307,36849],{},[13,143309,36852],{},[13,143311,36976],{},[13,143313,36979],{},[23289,143315],{},[7759,143317,36985],{"id":36984},[10548,143319,36989],{"id":36988},[13,143321,143322],{},[617,143323],{"alt":36994,"src":36995},[13,143325,143326],{},[617,143327],{"alt":37000,"src":37001},[10548,143329,37005],{"id":37004},[13,143331,143332],{},[617,143333],{"alt":37010,"src":37011},[13,143335,143336],{},[617,143337],{"alt":37016,"src":37017},[23289,143339],{},[107,143341,37023],{"id":37022},[7759,143343,37027],{"id":37026},[10548,143345,37031],{"id":37030},[13,143347,143348],{},[617,143349],{"alt":37036,"src":37037},[10548,143351,37041],{"id":37040},[13,143353,143354],{},[617,143355],{"alt":37046,"src":37047},[10548,143357,37051],{"id":37050},[13,143359,37054],{},[23289,143361],{},[107,143363,37060],{"id":37059},[13,143365,37063],{},[13,143367,37066],{},[7759,143369,37070],{"id":37069},[78,143371,143373],{"className":143372},[4566],[78,143374,143376,144140],{"className":143375},[4570],[78,143377,143379],{"className":143378},[4574],[4576,143380,143381],{"xmlns":4578,"display":4579},[4581,143382,143383,144138],{},[37085,143384,143385,143428,143473,143514,143583,143648,143703,143754,143803,143854,143939,144020,144081],{"rowspacing":37087,"columnalign":37088,"columnspacing":37089},[37091,143386,143387,143390,143402,143422,143425],{},[37094,143388],{"className":143389},[37097],[37094,143391,143392],{},[37101,143393,143394],{"scriptlevel":2949,"displaystyle":1419},[4584,143395,143396,143398,143400],{},[4591,143397,4594],{"stretchy":4593},[7077,143399,469],{},[4591,143401,4604],{"stretchy":4593},[37094,143403,143404],{},[37101,143405,143406],{"scriptlevel":2949,"displaystyle":1419},[4584,143407,143408,143410,143412,143414,143416,143418,143420],{},[4584,143409],{},[4596,143411,37121],{"mathvariant":7101},[4596,143413,37121],{"mathvariant":7101},[4596,143415,7062],{},[4591,143417,37128],{},[4596,143419,7062],{},[4587,143421,37133],{},[37094,143423],{"className":143424},[37097],[37094,143426],{"className":143427},[37140],[37091,143429,143430,143433,143445,143467,143470],{},[37094,143431],{"className":143432},[37097],[37094,143434,143435],{},[37101,143436,143437],{"scriptlevel":2949,"displaystyle":1419},[4584,143438,143439,143441,143443],{},[4591,143440,4594],{"stretchy":4593},[7077,143442,472],{},[4591,143444,4604],{"stretchy":4593},[37094,143446,143447],{},[37101,143448,143449],{"scriptlevel":2949,"displaystyle":1419},[4584,143450,143451,143453,143455,143457,143459,143461,143463,143465],{},[4584,143452],{},[4596,143454,7062],{},[4591,143456,37170],{},[4596,143458,5032],{},[4591,143460,37128],{},[4596,143462,5032],{},[4591,143464,37170],{},[4596,143466,7062],{},[37094,143468],{"className":143469},[37097],[37094,143471],{"className":143472},[37140],[37091,143474,143475,143478,143484,143508,143511],{},[37094,143476],{"className":143477},[37097],[37094,143479,143480],{},[37101,143481,143482],{"scriptlevel":2949,"displaystyle":1419},[4584,143483],{},[37094,143485,143486],{},[37101,143487,143488],{"scriptlevel":2949,"displaystyle":1419},[4584,143489,143490,143492,143494,143496,143498,143500,143502,143504,143506],{},[4584,143491],{},[4596,143493,7062],{},[4591,143495,37210],{},[4596,143497,5032],{},[4591,143499,37128],{},[4596,143501,5032],{},[4591,143503,37210],{},[4596,143505,7062],{},[4587,143507,37223],{},[37094,143509],{"className":143510},[37097],[37094,143512],{"className":143513},[37140],[37091,143515,143516,143519,143531,143577,143580],{},[37094,143517],{"className":143518},[37097],[37094,143520,143521],{},[37101,143522,143523],{"scriptlevel":2949,"displaystyle":1419},[4584,143524,143525,143527,143529],{},[4591,143526,4594],{"stretchy":4593},[7077,143528,1025],{},[4591,143530,4604],{"stretchy":4593},[37094,143532,143533],{},[37101,143534,143535],{"scriptlevel":2949,"displaystyle":1419},[4584,143536,143537,143539,143541,143543,143545,143547,143549,143551,143553,143555,143557,143559,143561,143563,143565,143567,143569,143571,143573,143575],{},[4584,143538],{},[4596,143540,7062],{},[4591,143542,37170],{},[4591,143544,4594],{"stretchy":4593},[4596,143546,5032],{},[4591,143548,37210],{},[4596,143550,27152],{},[4591,143552,4604],{"stretchy":4593},[4591,143554,37128],{},[4591,143556,4594],{"stretchy":4593},[4596,143558,7062],{},[4591,143560,37170],{},[4596,143562,5032],{},[4591,143564,4604],{"stretchy":4593},[4591,143566,37210],{},[4591,143568,4594],{"stretchy":4593},[4596,143570,7062],{},[4591,143572,37170],{},[4596,143574,27152],{},[4591,143576,4604],{"stretchy":4593},[37094,143578],{"className":143579},[37097],[37094,143581],{"className":143582},[37140],[37091,143584,143585,143588,143594,143642,143645],{},[37094,143586],{"className":143587},[37097],[37094,143589,143590],{},[37101,143591,143592],{"scriptlevel":2949,"displaystyle":1419},[4584,143593],{},[37094,143595,143596],{},[37101,143597,143598],{"scriptlevel":2949,"displaystyle":1419},[4584,143599,143600,143602,143604,143606,143608,143610,143612,143614,143616,143618,143620,143622,143624,143626,143628,143630,143632,143634,143636,143638,143640],{},[4584,143601],{},[4596,143603,7062],{},[4591,143605,37210],{},[4591,143607,4594],{"stretchy":4593},[4596,143609,5032],{},[4591,143611,37170],{},[4596,143613,27152],{},[4591,143615,4604],{"stretchy":4593},[4591,143617,37128],{},[4591,143619,4594],{"stretchy":4593},[4596,143621,7062],{},[4591,143623,37210],{},[4596,143625,5032],{},[4591,143627,4604],{"stretchy":4593},[4591,143629,37170],{},[4591,143631,4594],{"stretchy":4593},[4596,143633,7062],{},[4591,143635,37210],{},[4596,143637,27152],{},[4591,143639,4604],{"stretchy":4593},[4587,143641,37358],{},[37094,143643],{"className":143644},[37097],[37094,143646],{"className":143647},[37140],[37091,143649,143650,143653,143665,143697,143700],{},[37094,143651],{"className":143652},[37097],[37094,143654,143655],{},[37101,143656,143657],{"scriptlevel":2949,"displaystyle":1419},[4584,143658,143659,143661,143663],{},[4591,143660,4594],{"stretchy":4593},[7077,143662,1014],{},[4591,143664,4604],{"stretchy":4593},[37094,143666,143667],{},[37101,143668,143669],{"scriptlevel":2949,"displaystyle":1419},[4584,143670,143671,143673,143675,143677,143679,143681,143683,143685,143687,143689,143691,143693,143695],{},[4584,143672],{},[4596,143674,37121],{"mathvariant":7101},[4591,143676,4594],{"stretchy":4593},[4596,143678,7062],{},[4591,143680,37170],{},[4596,143682,5032],{},[4591,143684,4604],{"stretchy":4593},[4591,143686,37128],{},[4596,143688,37121],{"mathvariant":7101},[4596,143690,7062],{},[4591,143692,37210],{},[4596,143694,37121],{"mathvariant":7101},[4596,143696,5032],{},[37094,143698],{"className":143699},[37097],[37094,143701],{"className":143702},[37140],[37091,143704,143705,143708,143714,143748,143751],{},[37094,143706],{"className":143707},[37097],[37094,143709,143710],{},[37101,143711,143712],{"scriptlevel":2949,"displaystyle":1419},[4584,143713],{},[37094,143715,143716],{},[37101,143717,143718],{"scriptlevel":2949,"displaystyle":1419},[4584,143719,143720,143722,143724,143726,143728,143730,143732,143734,143736,143738,143740,143742,143744,143746],{},[4584,143721],{},[4596,143723,37121],{"mathvariant":7101},[4591,143725,4594],{"stretchy":4593},[4596,143727,7062],{},[4591,143729,37210],{},[4596,143731,5032],{},[4591,143733,4604],{"stretchy":4593},[4591,143735,37128],{},[4596,143737,37121],{"mathvariant":7101},[4596,143739,7062],{},[4591,143741,37170],{},[4596,143743,37121],{"mathvariant":7101},[4596,143745,5032],{},[4587,143747,37465],{},[37094,143749],{"className":143750},[37097],[37094,143752],{"className":143753},[37140],[37091,143755,143756,143759,143771,143797,143800],{},[37094,143757],{"className":143758},[37097],[37094,143760,143761],{},[37101,143762,143763],{"scriptlevel":2949,"displaystyle":1419},[4584,143764,143765,143767,143769],{},[4591,143766,4594],{"stretchy":4593},[7077,143768,11047],{},[4591,143770,4604],{"stretchy":4593},[37094,143772,143773],{},[37101,143774,143775],{"scriptlevel":2949,"displaystyle":1419},[4584,143776,143777,143779,143781,143783,143785,143787,143789,143791,143793,143795],{},[4584,143778],{},[4596,143780,7062],{},[4591,143782,37501],{},[4596,143784,5032],{},[4591,143786,37128],{},[4596,143788,37121],{"mathvariant":7101},[4596,143790,7062],{},[4591,143792,37210],{},[4596,143794,5032],{},[4587,143796,37516],{},[37094,143798],{"className":143799},[37097],[37094,143801],{"className":143802},[37140],[37091,143804,143805,143808,143820,143848,143851],{},[37094,143806],{"className":143807},[37097],[37094,143809,143810],{},[37101,143811,143812],{"scriptlevel":2949,"displaystyle":1419},[4584,143813,143814,143816,143818],{},[4591,143815,4594],{"stretchy":4593},[7077,143817,1861],{},[4591,143819,4604],{"stretchy":4593},[37094,143821,143822],{},[37101,143823,143824],{"scriptlevel":2949,"displaystyle":1419},[4584,143825,143826,143828,143830,143832,143834,143836,143838,143840,143842,143844,143846],{},[4584,143827],{},[4596,143829,7062],{},[4591,143831,37501],{},[4596,143833,5032],{},[4591,143835,37128],{},[4596,143837,37121],{"mathvariant":7101},[4596,143839,5032],{},[4591,143841,37501],{},[4596,143843,37121],{"mathvariant":7101},[4596,143845,7062],{},[4587,143847,37568],{},[37094,143849],{"className":143850},[37097],[37094,143852],{"className":143853},[37140],[37091,143855,143856,143859,143871,143933,143936],{},[37094,143857],{"className":143858},[37097],[37094,143860,143861],{},[37101,143862,143863],{"scriptlevel":2949,"displaystyle":1419},[4584,143864,143865,143867,143869],{},[4591,143866,4594],{"stretchy":4593},[7077,143868,27433],{},[4591,143870,4604],{"stretchy":4593},[37094,143872,143873],{},[37101,143874,143875],{"scriptlevel":2949,"displaystyle":1419},[4584,143876,143877,143879,143881,143883,143885,143887,143889,143891,143893,143895,143897,143899,143901,143903,143905,143907,143909,143911,143913,143915,143917,143919,143921,143923,143925,143927,143929,143931],{},[4584,143878],{},[4596,143880,37602],{"mathvariant":7101},[4596,143882,4598],{},[4591,143884,4594],{"stretchy":4593},[4596,143886,17143],{},[4591,143888,4594],{"stretchy":4593},[4596,143890,4598],{},[4591,143892,4604],{"stretchy":4593},[4591,143894,37170],{},[4596,143896,17148],{},[4591,143898,4594],{"stretchy":4593},[4596,143900,4598],{},[4591,143902,4604],{"stretchy":4593},[4591,143904,4604],{"stretchy":4593},[4591,143906,37128],{},[4596,143908,37602],{"mathvariant":7101},[4596,143910,4598],{},[4596,143912,17143],{},[4591,143914,4594],{"stretchy":4593},[4596,143916,4598],{},[4591,143918,4604],{"stretchy":4593},[4591,143920,37170],{},[4596,143922,37602],{"mathvariant":7101},[4596,143924,4598],{},[4596,143926,17148],{},[4591,143928,4594],{"stretchy":4593},[4596,143930,4598],{},[4591,143932,4604],{"stretchy":4593},[37094,143934],{"className":143935},[37097],[37094,143937],{"className":143938},[37140],[37091,143940,143941,143944,143950,144014,144017],{},[37094,143942],{"className":143943},[37097],[37094,143945,143946],{},[37101,143947,143948],{"scriptlevel":2949,"displaystyle":1419},[4584,143949],{},[37094,143951,143952],{},[37101,143953,143954],{"scriptlevel":2949,"displaystyle":1419},[4584,143955,143956,143958,143960,143962,143964,143966,143968,143970,143972,143974,143976,143978,143980,143982,143984,143986,143988,143990,143992,143994,143996,143998,144000,144002,144004,144006,144008,144010,144012],{},[4584,143957],{},[4596,143959,37682],{"mathvariant":7101},[4596,143961,4598],{},[4591,143963,4594],{"stretchy":4593},[4596,143965,17143],{},[4591,143967,4594],{"stretchy":4593},[4596,143969,4598],{},[4591,143971,4604],{"stretchy":4593},[4591,143973,37210],{},[4596,143975,17148],{},[4591,143977,4594],{"stretchy":4593},[4596,143979,4598],{},[4591,143981,4604],{"stretchy":4593},[4591,143983,4604],{"stretchy":4593},[4591,143985,37128],{},[4596,143987,37682],{"mathvariant":7101},[4596,143989,4598],{},[4596,143991,17143],{},[4591,143993,4594],{"stretchy":4593},[4596,143995,4598],{},[4591,143997,4604],{"stretchy":4593},[4591,143999,37210],{},[4596,144001,37682],{"mathvariant":7101},[4596,144003,4598],{},[4596,144005,17148],{},[4591,144007,4594],{"stretchy":4593},[4596,144009,4598],{},[4591,144011,4604],{"stretchy":4593},[4587,144013,37737],{},[37094,144015],{"className":144016},[37097],[37094,144018],{"className":144019},[37140],[37091,144021,144022,144025,144037,144075,144078],{},[37094,144023],{"className":144024},[37097],[37094,144026,144027],{},[37101,144028,144029],{"scriptlevel":2949,"displaystyle":1419},[4584,144030,144031,144033,144035],{},[4591,144032,4594],{"stretchy":4593},[7077,144034,37759],{},[4591,144036,4604],{"stretchy":4593},[37094,144038,144039],{},[37101,144040,144041],{"scriptlevel":2949,"displaystyle":1419},[4584,144042,144043,144045,144047,144049,144051,144053,144055,144057,144059,144061,144063,144065,144067,144069,144071,144073],{},[4584,144044],{},[4596,144046,37121],{"mathvariant":7101},[4596,144048,37602],{"mathvariant":7101},[4596,144050,4598],{},[4596,144052,17143],{},[4591,144054,4594],{"stretchy":4593},[4596,144056,4598],{},[4591,144058,4604],{"stretchy":4593},[4591,144060,37128],{},[4596,144062,37682],{"mathvariant":7101},[4596,144064,4598],{},[4596,144066,37121],{"mathvariant":7101},[4596,144068,17143],{},[4591,144070,4594],{"stretchy":4593},[4596,144072,4598],{},[4591,144074,4604],{"stretchy":4593},[37094,144076],{"className":144077},[37097],[37094,144079],{"className":144080},[37140],[37091,144082,144083,144086,144092,144132,144135],{},[37094,144084],{"className":144085},[37097],[37094,144087,144088],{},[37101,144089,144090],{"scriptlevel":2949,"displaystyle":1419},[4584,144091],{},[37094,144093,144094],{},[37101,144095,144096],{"scriptlevel":2949,"displaystyle":1419},[4584,144097,144098,144100,144102,144104,144106,144108,144110,144112,144114,144116,144118,144120,144122,144124,144126,144128,144130],{},[4584,144099],{},[4596,144101,37121],{"mathvariant":7101},[4596,144103,37682],{"mathvariant":7101},[4596,144105,4598],{},[4596,144107,17143],{},[4591,144109,4594],{"stretchy":4593},[4596,144111,4598],{},[4591,144113,4604],{"stretchy":4593},[4591,144115,37128],{},[4596,144117,37602],{"mathvariant":7101},[4596,144119,4598],{},[4596,144121,37121],{"mathvariant":7101},[4596,144123,17143],{},[4591,144125,4594],{"stretchy":4593},[4596,144127,4598],{},[4591,144129,4604],{"stretchy":4593},[4587,144131,37857],{},[37094,144133],{"className":144134},[37097],[37094,144136],{"className":144137},[37140],[4647,144139,37866],{"encoding":4649},[78,144141,144143,145306],{"className":144142,"ariaHidden":1419},[4654],[78,144144,144146,144149],{"className":144145},[4658],[78,144147],{"className":144148,"style":37876},[4662],[78,144150,144152,144351],{"className":144151},[37085],[78,144153,144155],{"className":144154},[37883],[78,144156,144158,144343],{"className":144157},[4693,4694],[78,144159,144161,144340],{"className":144160},[4698],[78,144162,144164,144181,144198,144206,144223,144231,144248,144256,144273,144290,144307,144315,144332],{"className":144163,"style":37893},[4702],[78,144165,144166,144169],{"style":37896},[78,144167],{"className":144168,"style":4781},[4710],[78,144170,144172,144175,144178],{"className":144171},[4667],[78,144173,4594],{"className":144174},[4674],[78,144176,469],{"className":144177},[4667],[78,144179,4604],{"className":144180},[4682],[78,144182,144183,144186],{"style":37914},[78,144184],{"className":144185,"style":4781},[4710],[78,144187,144189,144192,144195],{"className":144188},[4667],[78,144190,4594],{"className":144191},[4674],[78,144193,472],{"className":144194},[4667],[78,144196,4604],{"className":144197},[4682],[78,144199,144200,144203],{"style":37932},[78,144201],{"className":144202,"style":4781},[4710],[78,144204],{"className":144205},[4667],[78,144207,144208,144211],{"style":37941},[78,144209],{"className":144210,"style":4781},[4710],[78,144212,144214,144217,144220],{"className":144213},[4667],[78,144215,4594],{"className":144216},[4674],[78,144218,1025],{"className":144219},[4667],[78,144221,4604],{"className":144222},[4682],[78,144224,144225,144228],{"style":37959},[78,144226],{"className":144227,"style":4781},[4710],[78,144229],{"className":144230},[4667],[78,144232,144233,144236],{"style":37968},[78,144234],{"className":144235,"style":4781},[4710],[78,144237,144239,144242,144245],{"className":144238},[4667],[78,144240,4594],{"className":144241},[4674],[78,144243,1014],{"className":144244},[4667],[78,144246,4604],{"className":144247},[4682],[78,144249,144250,144253],{"style":37986},[78,144251],{"className":144252,"style":4781},[4710],[78,144254],{"className":144255},[4667],[78,144257,144258,144261],{"style":37995},[78,144259],{"className":144260,"style":4781},[4710],[78,144262,144264,144267,144270],{"className":144263},[4667],[78,144265,4594],{"className":144266},[4674],[78,144268,11047],{"className":144269},[4667],[78,144271,4604],{"className":144272},[4682],[78,144274,144275,144278],{"style":38013},[78,144276],{"className":144277,"style":4781},[4710],[78,144279,144281,144284,144287],{"className":144280},[4667],[78,144282,4594],{"className":144283},[4674],[78,144285,1861],{"className":144286},[4667],[78,144288,4604],{"className":144289},[4682],[78,144291,144292,144295],{"style":38031},[78,144293],{"className":144294,"style":4781},[4710],[78,144296,144298,144301,144304],{"className":144297},[4667],[78,144299,4594],{"className":144300},[4674],[78,144302,27433],{"className":144303},[4667],[78,144305,4604],{"className":144306},[4682],[78,144308,144309,144312],{"style":38049},[78,144310],{"className":144311,"style":4781},[4710],[78,144313],{"className":144314},[4667],[78,144316,144317,144320],{"style":38058},[78,144318],{"className":144319,"style":4781},[4710],[78,144321,144323,144326,144329],{"className":144322},[4667],[78,144324,4594],{"className":144325},[4674],[78,144327,37759],{"className":144328},[4667],[78,144330,4604],{"className":144331},[4682],[78,144333,144334,144337],{"style":38076},[78,144335],{"className":144336,"style":4781},[4710],[78,144338],{"className":144339},[4667],[78,144341,4726],{"className":144342},[4725],[78,144344,144346],{"className":144345},[4698],[78,144347,144349],{"className":144348,"style":38092},[4702],[78,144350],{},[78,144352,144354],{"className":144353},[38098],[78,144355,144357,145298],{"className":144356},[4693,4694],[78,144358,144360,145295],{"className":144359},[4698],[78,144361,144363,144395,144445,144498,144602,144709,144774,144842,144898,144957,145064,145174,145233],{"className":144362,"style":37893},[4702],[78,144364,144365,144368],{"style":37896},[78,144366],{"className":144367,"style":4781},[4710],[78,144369,144371,144374,144377,144380,144383,144386,144389,144392],{"className":144370},[4667],[78,144372],{"className":144373},[4667],[78,144375,38122],{"className":144376},[4667],[78,144378,7062],{"className":144379,"style":5219},[4667,4678],[78,144381],{"className":144382,"style":4740},[4739],[78,144384,37128],{"className":144385},[4744],[78,144387],{"className":144388,"style":4740},[4739],[78,144390,7062],{"className":144391,"style":5219},[4667,4678],[78,144393,37133],{"className":144394},[4667,6184],[78,144396,144397,144400],{"style":37914},[78,144398],{"className":144399,"style":4781},[4710],[78,144401,144403,144406,144409,144412,144415,144418,144421,144424,144427,144430,144433,144436,144439,144442],{"className":144402},[4667],[78,144404],{"className":144405},[4667],[78,144407,7062],{"className":144408,"style":5219},[4667,4678],[78,144410],{"className":144411,"style":5143},[4739],[78,144413,37170],{"className":144414},[7450],[78,144416],{"className":144417,"style":5143},[4739],[78,144419,5032],{"className":144420},[4667,4678],[78,144422],{"className":144423,"style":4740},[4739],[78,144425,37128],{"className":144426},[4744],[78,144428],{"className":144429,"style":4740},[4739],[78,144431,5032],{"className":144432},[4667,4678],[78,144434],{"className":144435,"style":5143},[4739],[78,144437,37170],{"className":144438},[7450],[78,144440],{"className":144441,"style":5143},[4739],[78,144443,7062],{"className":144444,"style":5219},[4667,4678],[78,144446,144447,144450],{"style":37932},[78,144448],{"className":144449,"style":4781},[4710],[78,144451,144453,144456,144459,144462,144465,144468,144471,144474,144477,144480,144483,144486,144489,144492,144495],{"className":144452},[4667],[78,144454],{"className":144455},[4667],[78,144457,7062],{"className":144458,"style":5219},[4667,4678],[78,144460],{"className":144461,"style":5143},[4739],[78,144463,37210],{"className":144464},[7450],[78,144466],{"className":144467,"style":5143},[4739],[78,144469,5032],{"className":144470},[4667,4678],[78,144472],{"className":144473,"style":4740},[4739],[78,144475,37128],{"className":144476},[4744],[78,144478],{"className":144479,"style":4740},[4739],[78,144481,5032],{"className":144482},[4667,4678],[78,144484],{"className":144485,"style":5143},[4739],[78,144487,37210],{"className":144488},[7450],[78,144490],{"className":144491,"style":5143},[4739],[78,144493,7062],{"className":144494,"style":5219},[4667,4678],[78,144496,37223],{"className":144497},[4667,6184],[78,144499,144500,144503],{"style":37941},[78,144501],{"className":144502,"style":4781},[4710],[78,144504,144506,144509,144512,144515,144518,144521,144524,144527,144530,144533,144536,144539,144542,144545,144548,144551,144554,144557,144560,144563,144566,144569,144572,144575,144578,144581,144584,144587,144590,144593,144596,144599],{"className":144505},[4667],[78,144507],{"className":144508},[4667],[78,144510,7062],{"className":144511,"style":5219},[4667,4678],[78,144513],{"className":144514,"style":5143},[4739],[78,144516,37170],{"className":144517},[7450],[78,144519],{"className":144520,"style":5143},[4739],[78,144522,4594],{"className":144523},[4674],[78,144525,5032],{"className":144526},[4667,4678],[78,144528],{"className":144529,"style":5143},[4739],[78,144531,37210],{"className":144532},[7450],[78,144534],{"className":144535,"style":5143},[4739],[78,144537,27152],{"className":144538,"style":38285},[4667,4678],[78,144540,4604],{"className":144541},[4682],[78,144543],{"className":144544,"style":4740},[4739],[78,144546,37128],{"className":144547},[4744],[78,144549],{"className":144550,"style":4740},[4739],[78,144552,4594],{"className":144553},[4674],[78,144555,7062],{"className":144556,"style":5219},[4667,4678],[78,144558],{"className":144559,"style":5143},[4739],[78,144561,37170],{"className":144562},[7450],[78,144564],{"className":144565,"style":5143},[4739],[78,144567,5032],{"className":144568},[4667,4678],[78,144570,4604],{"className":144571},[4682],[78,144573],{"className":144574,"style":5143},[4739],[78,144576,37210],{"className":144577},[7450],[78,144579],{"className":144580,"style":5143},[4739],[78,144582,4594],{"className":144583},[4674],[78,144585,7062],{"className":144586,"style":5219},[4667,4678],[78,144588],{"className":144589,"style":5143},[4739],[78,144591,37170],{"className":144592},[7450],[78,144594],{"className":144595,"style":5143},[4739],[78,144597,27152],{"className":144598,"style":38285},[4667,4678],[78,144600,4604],{"className":144601},[4682],[78,144603,144604,144607],{"style":37959},[78,144605],{"className":144606,"style":4781},[4710],[78,144608,144610,144613,144616,144619,144622,144625,144628,144631,144634,144637,144640,144643,144646,144649,144652,144655,144658,144661,144664,144667,144670,144673,144676,144679,144682,144685,144688,144691,144694,144697,144700,144703,144706],{"className":144609},[4667],[78,144611],{"className":144612},[4667],[78,144614,7062],{"className":144615,"style":5219},[4667,4678],[78,144617],{"className":144618,"style":5143},[4739],[78,144620,37210],{"className":144621},[7450],[78,144623],{"className":144624,"style":5143},[4739],[78,144626,4594],{"className":144627},[4674],[78,144629,5032],{"className":144630},[4667,4678],[78,144632],{"className":144633,"style":5143},[4739],[78,144635,37170],{"className":144636},[7450],[78,144638],{"className":144639,"style":5143},[4739],[78,144641,27152],{"className":144642,"style":38285},[4667,4678],[78,144644,4604],{"className":144645},[4682],[78,144647],{"className":144648,"style":4740},[4739],[78,144650,37128],{"className":144651},[4744],[78,144653],{"className":144654,"style":4740},[4739],[78,144656,4594],{"className":144657},[4674],[78,144659,7062],{"className":144660,"style":5219},[4667,4678],[78,144662],{"className":144663,"style":5143},[4739],[78,144665,37210],{"className":144666},[7450],[78,144668],{"className":144669,"style":5143},[4739],[78,144671,5032],{"className":144672},[4667,4678],[78,144674,4604],{"className":144675},[4682],[78,144677],{"className":144678,"style":5143},[4739],[78,144680,37170],{"className":144681},[7450],[78,144683],{"className":144684,"style":5143},[4739],[78,144686,4594],{"className":144687},[4674],[78,144689,7062],{"className":144690,"style":5219},[4667,4678],[78,144692],{"className":144693,"style":5143},[4739],[78,144695,37210],{"className":144696},[7450],[78,144698],{"className":144699,"style":5143},[4739],[78,144701,27152],{"className":144702,"style":38285},[4667,4678],[78,144704,4604],{"className":144705},[4682],[78,144707,37358],{"className":144708},[4667,6184],[78,144710,144711,144714],{"style":37968},[78,144712],{"className":144713,"style":4781},[4710],[78,144715,144717,144720,144723,144726,144729,144732,144735,144738,144741,144744,144747,144750,144753,144756,144759,144762,144765,144768,144771],{"className":144716},[4667],[78,144718],{"className":144719},[4667],[78,144721,37121],{"className":144722},[4667],[78,144724,4594],{"className":144725},[4674],[78,144727,7062],{"className":144728,"style":5219},[4667,4678],[78,144730],{"className":144731,"style":5143},[4739],[78,144733,37170],{"className":144734},[7450],[78,144736],{"className":144737,"style":5143},[4739],[78,144739,5032],{"className":144740},[4667,4678],[78,144742,4604],{"className":144743},[4682],[78,144745],{"className":144746,"style":4740},[4739],[78,144748,37128],{"className":144749},[4744],[78,144751],{"className":144752,"style":4740},[4739],[78,144754,37121],{"className":144755},[4667],[78,144757,7062],{"className":144758,"style":5219},[4667,4678],[78,144760],{"className":144761,"style":5143},[4739],[78,144763,37210],{"className":144764},[7450],[78,144766],{"className":144767,"style":5143},[4739],[78,144769,37121],{"className":144770},[4667],[78,144772,5032],{"className":144773},[4667,4678],[78,144775,144776,144779],{"style":37986},[78,144777],{"className":144778,"style":4781},[4710],[78,144780,144782,144785,144788,144791,144794,144797,144800,144803,144806,144809,144812,144815,144818,144821,144824,144827,144830,144833,144836,144839],{"className":144781},[4667],[78,144783],{"className":144784},[4667],[78,144786,37121],{"className":144787},[4667],[78,144789,4594],{"className":144790},[4674],[78,144792,7062],{"className":144793,"style":5219},[4667,4678],[78,144795],{"className":144796,"style":5143},[4739],[78,144798,37210],{"className":144799},[7450],[78,144801],{"className":144802,"style":5143},[4739],[78,144804,5032],{"className":144805},[4667,4678],[78,144807,4604],{"className":144808},[4682],[78,144810],{"className":144811,"style":4740},[4739],[78,144813,37128],{"className":144814},[4744],[78,144816],{"className":144817,"style":4740},[4739],[78,144819,37121],{"className":144820},[4667],[78,144822,7062],{"className":144823,"style":5219},[4667,4678],[78,144825],{"className":144826,"style":5143},[4739],[78,144828,37170],{"className":144829},[7450],[78,144831],{"className":144832,"style":5143},[4739],[78,144834,37121],{"className":144835},[4667],[78,144837,5032],{"className":144838},[4667,4678],[78,144840,37465],{"className":144841},[4667,6184],[78,144843,144844,144847],{"style":37995},[78,144845],{"className":144846,"style":4781},[4710],[78,144848,144850,144853,144856,144859,144862,144865,144868,144871,144874,144877,144880,144883,144886,144889,144892,144895],{"className":144849},[4667],[78,144851],{"className":144852},[4667],[78,144854,7062],{"className":144855,"style":5219},[4667,4678],[78,144857],{"className":144858,"style":4740},[4739],[78,144860,37501],{"className":144861},[4744],[78,144863],{"className":144864,"style":4740},[4739],[78,144866,5032],{"className":144867},[4667,4678],[78,144869],{"className":144870,"style":4740},[4739],[78,144872,37128],{"className":144873},[4744],[78,144875],{"className":144876,"style":4740},[4739],[78,144878,37121],{"className":144879},[4667],[78,144881,7062],{"className":144882,"style":5219},[4667,4678],[78,144884],{"className":144885,"style":5143},[4739],[78,144887,37210],{"className":144888},[7450],[78,144890],{"className":144891,"style":5143},[4739],[78,144893,5032],{"className":144894},[4667,4678],[78,144896,37516],{"className":144897},[4667,6184],[78,144899,144900,144903],{"style":38013},[78,144901],{"className":144902,"style":4781},[4710],[78,144904,144906,144909,144912,144915,144918,144921,144924,144927,144930,144933,144936,144939,144942,144945,144948,144951,144954],{"className":144905},[4667],[78,144907],{"className":144908},[4667],[78,144910,7062],{"className":144911,"style":5219},[4667,4678],[78,144913],{"className":144914,"style":4740},[4739],[78,144916,37501],{"className":144917},[4744],[78,144919],{"className":144920,"style":4740},[4739],[78,144922,5032],{"className":144923},[4667,4678],[78,144925],{"className":144926,"style":4740},[4739],[78,144928,37128],{"className":144929},[4744],[78,144931],{"className":144932,"style":4740},[4739],[78,144934,37121],{"className":144935},[4667],[78,144937,5032],{"className":144938},[4667,4678],[78,144940],{"className":144941,"style":4740},[4739],[78,144943,37501],{"className":144944},[4744],[78,144946],{"className":144947,"style":4740},[4739],[78,144949,37121],{"className":144950},[4667],[78,144952,7062],{"className":144953,"style":5219},[4667,4678],[78,144955,37568],{"className":144956},[4667,6184],[78,144958,144959,144962],{"style":38031},[78,144960],{"className":144961,"style":4781},[4710],[78,144963,144965,144968,144971,144974,144977,144980,144983,144986,144989,144992,144995,144998,145001,145004,145007,145010,145013,145016,145019,145022,145025,145028,145031,145034,145037,145040,145043,145046,145049,145052,145055,145058,145061],{"className":144964},[4667],[78,144966],{"className":144967},[4667],[78,144969,37602],{"className":144970},[4667],[78,144972,4598],{"className":144973},[4667,4678],[78,144975,4594],{"className":144976},[4674],[78,144978,17143],{"className":144979},[4667,4678],[78,144981,4594],{"className":144982},[4674],[78,144984,4598],{"className":144985},[4667,4678],[78,144987,4604],{"className":144988},[4682],[78,144990],{"className":144991,"style":5143},[4739],[78,144993,37170],{"className":144994},[7450],[78,144996],{"className":144997,"style":5143},[4739],[78,144999,17148],{"className":145000,"style":17276},[4667,4678],[78,145002,4594],{"className":145003},[4674],[78,145005,4598],{"className":145006},[4667,4678],[78,145008,38757],{"className":145009},[4682],[78,145011],{"className":145012,"style":4740},[4739],[78,145014,37128],{"className":145015},[4744],[78,145017],{"className":145018,"style":4740},[4739],[78,145020,37602],{"className":145021},[4667],[78,145023,4598],{"className":145024},[4667,4678],[78,145026,17143],{"className":145027},[4667,4678],[78,145029,4594],{"className":145030},[4674],[78,145032,4598],{"className":145033},[4667,4678],[78,145035,4604],{"className":145036},[4682],[78,145038],{"className":145039,"style":5143},[4739],[78,145041,37170],{"className":145042},[7450],[78,145044],{"className":145045,"style":5143},[4739],[78,145047,37602],{"className":145048},[4667],[78,145050,4598],{"className":145051},[4667,4678],[78,145053,17148],{"className":145054,"style":17276},[4667,4678],[78,145056,4594],{"className":145057},[4674],[78,145059,4598],{"className":145060},[4667,4678],[78,145062,4604],{"className":145063},[4682],[78,145065,145066,145069],{"style":38049},[78,145067],{"className":145068,"style":4781},[4710],[78,145070,145072,145075,145078,145081,145084,145087,145090,145093,145096,145099,145102,145105,145108,145111,145114,145117,145120,145123,145126,145129,145132,145135,145138,145141,145144,145147,145150,145153,145156,145159,145162,145165,145168,145171],{"className":145071},[4667],[78,145073],{"className":145074},[4667],[78,145076,37682],{"className":145077},[4667],[78,145079,4598],{"className":145080},[4667,4678],[78,145082,4594],{"className":145083},[4674],[78,145085,17143],{"className":145086},[4667,4678],[78,145088,4594],{"className":145089},[4674],[78,145091,4598],{"className":145092},[4667,4678],[78,145094,4604],{"className":145095},[4682],[78,145097],{"className":145098,"style":5143},[4739],[78,145100,37210],{"className":145101},[7450],[78,145103],{"className":145104,"style":5143},[4739],[78,145106,17148],{"className":145107,"style":17276},[4667,4678],[78,145109,4594],{"className":145110},[4674],[78,145112,4598],{"className":145113},[4667,4678],[78,145115,38757],{"className":145116},[4682],[78,145118],{"className":145119,"style":4740},[4739],[78,145121,37128],{"className":145122},[4744],[78,145124],{"className":145125,"style":4740},[4739],[78,145127,37682],{"className":145128},[4667],[78,145130,4598],{"className":145131},[4667,4678],[78,145133,17143],{"className":145134},[4667,4678],[78,145136,4594],{"className":145137},[4674],[78,145139,4598],{"className":145140},[4667,4678],[78,145142,4604],{"className":145143},[4682],[78,145145],{"className":145146,"style":5143},[4739],[78,145148,37210],{"className":145149},[7450],[78,145151],{"className":145152,"style":5143},[4739],[78,145154,37682],{"className":145155},[4667],[78,145157,4598],{"className":145158},[4667,4678],[78,145160,17148],{"className":145161,"style":17276},[4667,4678],[78,145163,4594],{"className":145164},[4674],[78,145166,4598],{"className":145167},[4667,4678],[78,145169,4604],{"className":145170},[4682],[78,145172,37737],{"className":145173},[4667,6184],[78,145175,145176,145179],{"style":38058},[78,145177],{"className":145178,"style":4781},[4710],[78,145180,145182,145185,145188,145191,145194,145197,145200,145203,145206,145209,145212,145215,145218,145221,145224,145227,145230],{"className":145181},[4667],[78,145183],{"className":145184},[4667],[78,145186,38936],{"className":145187},[4667],[78,145189,4598],{"className":145190},[4667,4678],[78,145192,17143],{"className":145193},[4667,4678],[78,145195,4594],{"className":145196},[4674],[78,145198,4598],{"className":145199},[4667,4678],[78,145201,4604],{"className":145202},[4682],[78,145204],{"className":145205,"style":4740},[4739],[78,145207,37128],{"className":145208},[4744],[78,145210],{"className":145211,"style":4740},[4739],[78,145213,37682],{"className":145214},[4667],[78,145216,4598],{"className":145217},[4667,4678],[78,145219,37121],{"className":145220},[4667],[78,145222,17143],{"className":145223},[4667,4678],[78,145225,4594],{"className":145226},[4674],[78,145228,4598],{"className":145229},[4667,4678],[78,145231,4604],{"className":145232},[4682],[78,145234,145235,145238],{"style":38076},[78,145236],{"className":145237,"style":4781},[4710],[78,145239,145241,145244,145247,145250,145253,145256,145259,145262,145265,145268,145271,145274,145277,145280,145283,145286,145289,145292],{"className":145240},[4667],[78,145242],{"className":145243},[4667],[78,145245,38996],{"className":145246},[4667],[78,145248,4598],{"className":145249},[4667,4678],[78,145251,17143],{"className":145252},[4667,4678],[78,145254,4594],{"className":145255},[4674],[78,145257,4598],{"className":145258},[4667,4678],[78,145260,4604],{"className":145261},[4682],[78,145263],{"className":145264,"style":4740},[4739],[78,145266,37128],{"className":145267},[4744],[78,145269],{"className":145270,"style":4740},[4739],[78,145272,37602],{"className":145273},[4667],[78,145275,4598],{"className":145276},[4667,4678],[78,145278,37121],{"className":145279},[4667],[78,145281,17143],{"className":145282},[4667,4678],[78,145284,4594],{"className":145285},[4674],[78,145287,4598],{"className":145288},[4667,4678],[78,145290,4604],{"className":145291},[4682],[78,145293,37857],{"className":145294},[4667,6184],[78,145296,4726],{"className":145297},[4725],[78,145299,145301],{"className":145300},[4698],[78,145302,145304],{"className":145303,"style":38092},[4702],[78,145305],{},[78,145307,145309],{"className":145308},[39059],[78,145310,145312,145425],{"className":145311},[4693,4694],[78,145313,145315,145422],{"className":145314},[4698],[78,145316,145318,145326,145334,145342,145350,145358,145366,145374,145382,145390,145398,145406,145414],{"className":145317,"style":37893},[4702],[78,145319,145320,145323],{"style":39071},[78,145321],{"className":145322,"style":39075},[4710],[78,145324],{"className":145325},[39079],[78,145327,145328,145331],{"style":39082},[78,145329],{"className":145330,"style":39075},[4710],[78,145332],{"className":145333},[39079],[78,145335,145336,145339],{"style":39091},[78,145337],{"className":145338,"style":39075},[4710],[78,145340],{"className":145341},[39079],[78,145343,145344,145347],{"style":39100},[78,145345],{"className":145346,"style":39075},[4710],[78,145348],{"className":145349},[39079],[78,145351,145352,145355],{"style":39109},[78,145353],{"className":145354,"style":39075},[4710],[78,145356],{"className":145357},[39079],[78,145359,145360,145363],{"style":39118},[78,145361],{"className":145362,"style":39075},[4710],[78,145364],{"className":145365},[39079],[78,145367,145368,145371],{"style":39127},[78,145369],{"className":145370,"style":39075},[4710],[78,145372],{"className":145373},[39079],[78,145375,145376,145379],{"style":39136},[78,145377],{"className":145378,"style":39075},[4710],[78,145380],{"className":145381},[39079],[78,145383,145384,145387],{"style":39145},[78,145385],{"className":145386,"style":39075},[4710],[78,145388],{"className":145389},[39079],[78,145391,145392,145395],{"style":39154},[78,145393],{"className":145394,"style":39075},[4710],[78,145396],{"className":145397},[39079],[78,145399,145400,145403],{"style":39163},[78,145401],{"className":145402,"style":39075},[4710],[78,145404],{"className":145405},[39079],[78,145407,145408,145411],{"style":39172},[78,145409],{"className":145410,"style":39075},[4710],[78,145412],{"className":145413},[39079],[78,145415,145416,145419],{"style":39181},[78,145417],{"className":145418,"style":39075},[4710],[78,145420],{"className":145421},[39079],[78,145423,4726],{"className":145424},[4725],[78,145426,145428],{"className":145427},[4698],[78,145429,145431],{"className":145430,"style":38092},[4702],[78,145432],{},[13,145434,39201,145435,28447],{},[22,145436,39204],{},[23289,145438],{},[7759,145440,39210],{"id":39209},[10548,145442,39214],{"id":39213},[13,145444,39217],{},[13,145446,39220],{},[13,145448,39223,145449],{},[22,145450,39226],{},[13,145452,39229,145453],{},[22,145454,39232],{},[13,145456,39235],{},[13,145458,39238],{},[13,145460,39241],{},[13,145462,39244],{},[13,145464,39247],{},[10548,145466,39251],{"id":39250},[13,145468,39254],{},[107,145470,39257],{"id":39257},[7759,145472,39261],{"id":39260},[10548,145474,39265],{"id":39264},[49,145476,145477,145479],{},[52,145478,39270],{},[52,145480,39273],{},[10548,145482,39277],{"id":39276},[13,145484,39280],{},[49,145486,145487,145489,145491],{},[52,145488,39285],{},[52,145490,39288],{},[52,145492,39291],{},[10548,145494,39295],{"id":39294},[13,145496,39298],{},[10548,145498,39302],{"id":39301},[49,145500,145501],{},[52,145502,39307],{},[10548,145504,39311],{"id":39310},[7759,145506,39314],{"id":39314},[39316,145508,39319],{"id":39318},[10548,145510,39323],{"id":39322},[10548,145512,39327],{"id":39326},[23289,145514],{},[39316,145516,39333],{"id":39332},[13,145518,39336],{},[13,145520,39339],{},[13,145522,145523],{},[617,145524],{"alt":39344,"src":39345},[13,145526,145527],{},[617,145528],{"alt":39350,"src":39351},[13,145530,145531],{},[617,145532],{"alt":39350,"src":39356},[23289,145534],{},[39316,145536,39362],{"id":39361},[10548,145538,39366],{"id":39365},[13,145540,39369],{},[23289,145542],{},[39316,145544,39375],{"id":39374},[10548,145546,39379],{"id":39378},[13,145548,39382],{},[13,145550,145551],{},[5009,145552,39387],{"href":39387,"rel":145553},[23647],[13,145555,145556],{},[617,145557],{"alt":39393,"src":39394},[13,145559,39397],{},[13,145561,39400],{},[23289,145563],{},[39316,145565,39406],{"id":39405},[13,145567,39409],{},{"title":119,"searchDepth":144,"depth":144,"links":145569},[145570,145578,145582,145585,145589],{"id":36491,"depth":132,"text":36492,"children":145571},[145572,145573,145574,145575,145576,145577],{"id":36495,"depth":144,"text":36496},{"id":36521,"depth":144,"text":36522},{"id":36558,"depth":144,"text":36559},{"id":36570,"depth":144,"text":36571},{"id":36582,"depth":144,"text":36583},{"id":36658,"depth":144,"text":36659},{"id":36761,"depth":132,"text":36762,"children":145579},[145580,145581],{"id":36835,"depth":144,"text":36836},{"id":36984,"depth":144,"text":36985},{"id":37022,"depth":132,"text":37023,"children":145583},[145584],{"id":37026,"depth":144,"text":37027},{"id":37059,"depth":132,"text":37060,"children":145586},[145587,145588],{"id":37069,"depth":144,"text":37070},{"id":39209,"depth":144,"text":39210},{"id":39257,"depth":132,"text":39257,"children":145590},[145591,145592],{"id":39260,"depth":144,"text":39261},{"id":39314,"depth":144,"text":39314,"children":145593},[145594,145595,145596,145597,145598],{"id":39318,"depth":150,"text":39319},{"id":39332,"depth":150,"text":39333},{"id":39361,"depth":150,"text":39362},{"id":39374,"depth":150,"text":39375},{"id":39405,"depth":150,"text":39406},{},{"title":36475,"description":119},[9133,7744,246,14542],{"id":39449,"title":39450,"assetBase":239,"author":8,"body":145603,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":147243,"navigation":128,"originalPath":41593,"path":41594,"seo":147244,"source":23330,"stem":41596,"tags":147245,"weight":250,"__hash__":41598},{"type":10,"value":145604,"toc":147237},[145605,145607,146843,146845,146963,146965,147195,147197],[7759,145606,39455],{"id":39455},[8366,145608,145609,145625],{},[8369,145610,145611],{},[8372,145612,145613,145615,145617,145619,145621,145623],{},[8375,145614,39464],{},[8375,145616,39467],{},[8375,145618,39470],{},[8375,145620,39473],{},[8375,145622,39476],{},[8375,145624,39479],{},[8386,145626,145627,145651,145671,145695,145715,145737,145767,145791,145813,145835,145861,145893,145919,145939,145961,145983,146013,146035,146077,146101,146123,146145,146161,146181,146209,146231,146251,146269,146283,146301,146325,146339,146353,146367,146405,146425,146445,146469,146491,146513,146541,146577,146599,146641,146665,146697,146719,146739,146763,146783,146807,146829],{},[8372,145628,145629,145631,145633,145635,145637,145649],{},[8391,145630,39486],{},[8391,145632,39489],{},[8391,145634,39492],{},[8391,145636],{},[8391,145638,39497,145639,39500,145641,39503,145643,39506,145645,39509,145647,39512],{},[2996,145640],{},[2996,145642],{},[2996,145644],{},[2996,145646],{},[2996,145648],{},[8391,145650,39515],{},[8372,145652,145653,145655,145657,145659,145661,145669],{},[8391,145654,39486],{},[8391,145656,39522],{},[8391,145658,39525],{},[8391,145660],{},[8391,145662,39530,145663,39533,145665,39536,145667,39539],{},[2996,145664],{},[2996,145666],{},[2996,145668],{},[8391,145670,39542],{},[8372,145672,145673,145675,145677,145679,145681,145693],{},[8391,145674,39547],{},[8391,145676,39550],{},[8391,145678,39553],{},[8391,145680],{},[8391,145682,39558,145683,39561,145685,39564,145687,39567,145689,39570,145691,39573],{},[2996,145684],{},[2996,145686],{},[2996,145688],{},[2996,145690],{},[2996,145692],{},[8391,145694,39576],{},[8372,145696,145697,145699,145701,145703,145705,145713],{},[8391,145698,39581],{},[8391,145700,39584],{},[8391,145702,39587],{},[8391,145704],{},[8391,145706,39592,145707,39595,145709,39598,145711,39601],{},[2996,145708],{},[2996,145710],{},[2996,145712],{},[8391,145714,39515],{},[8372,145716,145717,145719,145721,145723,145725,145735],{},[8391,145718,39581],{},[8391,145720,39610],{},[8391,145722,39613],{},[8391,145724],{},[8391,145726,39618,145727,39621,145729,39624,145731,39627,145733,39630],{},[2996,145728],{},[2996,145730],{},[2996,145732],{},[2996,145734],{},[8391,145736,39633],{},[8372,145738,145739,145741,145743,145745,145747,145765],{},[8391,145740,39581],{},[8391,145742,39640],{},[8391,145744,39643],{},[8391,145746],{},[8391,145748,39648,145749,39651,145751,39654,145753,39657,145755,39660,145757,39663,145759,39666,145761,39669,145763,39672],{},[2996,145750],{},[2996,145752],{},[2996,145754],{},[2996,145756],{},[2996,145758],{},[2996,145760],{},[2996,145762],{},[2996,145764],{},[8391,145766,39515],{},[8372,145768,145769,145771,145773,145775,145777,145789],{},[8391,145770,39679],{},[8391,145772,39682],{},[8391,145774,39685],{},[8391,145776],{},[8391,145778,39690,145779,39693,145781,39696,145783,39699,145785,39702,145787,39705],{},[2996,145780],{},[2996,145782],{},[2996,145784],{},[2996,145786],{},[2996,145788],{},[8391,145790,39708],{},[8372,145792,145793,145795,145797,145799,145801,145811],{},[8391,145794,39679],{},[8391,145796,39715],{},[8391,145798,39643],{},[8391,145800,39720],{},[8391,145802,39723,145803,39726,145805,39729,145807,39732,145809,39735],{},[2996,145804],{},[2996,145806],{},[2996,145808],{},[2996,145810],{},[8391,145812,39738],{},[8372,145814,145815,145817,145819,145821,145823,145833],{},[8391,145816,39679],{},[8391,145818,39745],{},[8391,145820,39643],{},[8391,145822],{},[8391,145824,39752,145825,39755,145827,39758,145829,39761,145831,39764],{},[2996,145826],{},[2996,145828],{},[2996,145830],{},[2996,145832],{},[8391,145834,39767],{},[8372,145836,145837,145839,145841,145843,145845,145859],{},[8391,145838,39679],{},[8391,145840,39774],{},[8391,145842,39492],{},[8391,145844,39720],{},[8391,145846,39781,145847,39784,145849,39787,145851,39790,145853,39793,145855,39796,145857,39799],{},[2996,145848],{},[2996,145850],{},[2996,145852],{},[2996,145854],{},[2996,145856],{},[2996,145858],{},[8391,145860,39802],{},[8372,145862,145863,145865,145867,145869,145871,145891],{},[8391,145864,39807],{},[8391,145866,39810],{},[8391,145868,39813],{},[8391,145870,39720],{},[8391,145872,39818,145873,39821,145875,39824,145877,39827,145879,39830,145881,39833,145883,39836,145885,39839,145887,39842,145889,39845],{},[2996,145874],{},[2996,145876],{},[2996,145878],{},[2996,145880],{},[2996,145882],{},[2996,145884],{},[2996,145886],{},[2996,145888],{},[2996,145890],{},[8391,145892,39848],{},[8372,145894,145895,145897,145899,145901,145903,145917],{},[8391,145896,39807],{},[8391,145898,39855],{},[8391,145900,39553],{},[8391,145902],{},[8391,145904,39862,145905,39558,145907,39561,145909,39564,145911,39567,145913,39873,145915,39573],{},[2996,145906],{},[2996,145908],{},[2996,145910],{},[2996,145912],{},[2996,145914],{},[2996,145916],{},[8391,145918,39576],{},[8372,145920,145921,145923,145925,145927,145929,145937],{},[8391,145922,39882],{},[8391,145924,39885],{},[8391,145926,39492],{},[8391,145928],{},[8391,145930,39892,145931,39895,145933,39898,145935,39901],{},[2996,145932],{},[2996,145934],{},[2996,145936],{},[8391,145938,39904],{},[8372,145940,145941,145943,145945,145947,145949,145959],{},[8391,145942,39882],{},[8391,145944,39911],{},[8391,145946,39914],{},[8391,145948,39917],{},[8391,145950,39920,145951,39923,145953,39926,145955,39929,145957,39932],{},[2996,145952],{},[2996,145954],{},[2996,145956],{},[2996,145958],{},[8391,145960,39935],{},[8372,145962,145963,145965,145967,145969,145971,145981],{},[8391,145964,39940],{},[8391,145966,39943],{},[8391,145968,39492],{},[8391,145970],{},[8391,145972,39950,145973,39953,145975,39956,145977,39959,145979,39962],{},[2996,145974],{},[2996,145976],{},[2996,145978],{},[2996,145980],{},[8391,145982,39965],{},[8372,145984,145985,145987,145989,145991,145993,146011],{},[8391,145986,39970],{},[8391,145988,39973],{},[8391,145990,39813],{},[8391,145992,39738],{},[8391,145994,39980,145995,39983,145997,39986,145999,39989,146001,39992,146003,39995,146005,39998,146007,40001,146009,40004],{},[2996,145996],{},[2996,145998],{},[2996,146000],{},[2996,146002],{},[2996,146004],{},[2996,146006],{},[2996,146008],{},[2996,146010],{},[8391,146012,40007],{},[8372,146014,146015,146017,146019,146021,146023,146033],{},[8391,146016,39970],{},[8391,146018,40014],{},[8391,146020,39492],{},[8391,146022],{},[8391,146024,40021,146025,40024,146027,40027,146029,40030,146031,40033],{},[2996,146026],{},[2996,146028],{},[2996,146030],{},[2996,146032],{},[8391,146034,40036],{},[8372,146036,146037,146039,146041,146043,146045,146075],{},[8391,146038,40041],{},[8391,146040,40044],{},[8391,146042,39553],{},[8391,146044],{},[8391,146046,40051,146047,40054,146049,40057,146051,40060,146053,146055,40065,146057,40068,146059,146061,40073,146063,40076,146065,40079,146067,40082,146069,40085,146071,40088,146073,40091],{},[2996,146048],{},[2996,146050],{},[2996,146052],{},[2996,146054],{},[2996,146056],{},[2996,146058],{},[2996,146060],{},[2996,146062],{},[2996,146064],{},[2996,146066],{},[2996,146068],{},[2996,146070],{},[2996,146072],{},[2996,146074],{},[8391,146076,39576],{},[8372,146078,146079,146081,146083,146085,146087,146099],{},[8391,146080,40098],{},[8391,146082,40101],{},[8391,146084,40104],{},[8391,146086],{},[8391,146088,40109,146089,40112,146091,40115,146093,40118,146095,40121,146097,40124],{},[2996,146090],{},[2996,146092],{},[2996,146094],{},[2996,146096],{},[2996,146098],{},[8391,146100,39965],{},[8372,146102,146103,146105,146107,146109,146111,146121],{},[8391,146104,40131],{},[8391,146106,40134],{},[8391,146108,40137],{},[8391,146110],{},[8391,146112,40142,146113,40145,146115,40148,146117,40151,146119,40154],{},[2996,146114],{},[2996,146116],{},[2996,146118],{},[2996,146120],{},[8391,146122,39965],{},[8372,146124,146125,146127,146129,146131,146133,146143],{},[8391,146126,40161],{},[8391,146128,40164],{},[8391,146130,39813],{},[8391,146132],{},[8391,146134,40171,146135,40174,146137,40177,146139,40180,146141,40183],{},[2996,146136],{},[2996,146138],{},[2996,146140],{},[2996,146142],{},[8391,146144,40186],{},[8372,146146,146147,146149,146151,146153,146155,146159],{},[8391,146148,40191],{},[8391,146150,40194],{},[8391,146152,39492],{},[8391,146154],{},[8391,146156,40201,146157,40204],{},[2996,146158],{},[8391,146160,40207],{},[8372,146162,146163,146165,146167,146169,146171,146179],{},[8391,146164,40191],{},[8391,146166,40214],{},[8391,146168,39685],{},[8391,146170],{},[8391,146172,40221,146173,40224,146175,40227,146177,40230],{},[2996,146174],{},[2996,146176],{},[2996,146178],{},[8391,146180,40233],{},[8372,146182,146183,146185,146187,146189,146191,146207],{},[8391,146184,40238],{},[8391,146186,40241],{},[8391,146188,39813],{},[8391,146190],{},[8391,146192,40248,146193,40251,146195,40254,146197,40257,146199,40260,146201,40263,146203,40266,146205,40269],{},[2996,146194],{},[2996,146196],{},[2996,146198],{},[2996,146200],{},[2996,146202],{},[2996,146204],{},[2996,146206],{},[8391,146208,39738],{},[8372,146210,146211,146213,146215,146217,146219,146229],{},[8391,146212,40276],{},[8391,146214,40279],{},[8391,146216,40282],{},[8391,146218],{},[8391,146220,40287,146221,40290,146223,40293,146225,40296,146227,40299],{},[2996,146222],{},[2996,146224],{},[2996,146226],{},[2996,146228],{},[8391,146230,39576],{},[8372,146232,146233,146235,146237,146239,146241,146249],{},[8391,146234,40306],{},[8391,146236,40309],{},[8391,146238,39643],{},[8391,146240],{},[8391,146242,40316,146243,40319,146245,40322,146247,40325],{},[2996,146244],{},[2996,146246],{},[2996,146248],{},[8391,146250,39515],{},[8372,146252,146253,146255,146257,146259,146261,146267],{},[8391,146254,40332],{},[8391,146256,40335],{},[8391,146258,39492],{},[8391,146260],{},[8391,146262,40342,146263,40345,146265,40348],{},[2996,146264],{},[2996,146266],{},[8391,146268,40351],{},[8372,146270,146271,146273,146275,146277,146279,146281],{},[8391,146272,40356],{},[8391,146274,40359],{},[8391,146276,40362],{},[8391,146278],{},[8391,146280,40367],{},[8391,146282,39738],{},[8372,146284,146285,146287,146289,146291,146293,146299],{},[8391,146286,40356],{},[8391,146288,40376],{},[8391,146290,40379],{},[8391,146292,39720],{},[8391,146294,40384,146295,40387,146297,40390],{},[2996,146296],{},[2996,146298],{},[8391,146300,40393],{},[8372,146302,146303,146305,146307,146309,146311,146323],{},[8391,146304,40356],{},[8391,146306,40400],{},[8391,146308,39643],{},[8391,146310],{},[8391,146312,40407,146313,40410,146315,40413,146317,40416,146319,40419,146321,40422],{},[2996,146314],{},[2996,146316],{},[2996,146318],{},[2996,146320],{},[2996,146322],{},[8391,146324,39576],{},[8372,146326,146327,146329,146331,146333,146335,146337],{},[8391,146328,40429],{},[8391,146330,40432],{},[8391,146332],{},[8391,146334],{},[8391,146336],{},[8391,146338],{},[8372,146340,146341,146343,146345,146347,146349,146351],{},[8391,146342,40445],{},[8391,146344,40448],{},[8391,146346],{},[8391,146348],{},[8391,146350,40455],{},[8391,146352,40458],{},[8372,146354,146355,146357,146359,146361,146363,146365],{},[8391,146356,40463],{},[8391,146358,40466],{},[8391,146360],{},[8391,146362],{},[8391,146364],{},[8391,146366,40475],{},[8372,146368,146369,146371,146373,146375,146377,146403],{},[8391,146370],{},[8391,146372,40482],{},[8391,146374,40485],{},[8391,146376,39720],{},[8391,146378,40051,146379,40492,146381,40495,146383,40498,146385,40501,146387,40504,146389,40507,146391,146393,40073,146395,40514,146397,40517,146399,40520,146401,40523],{},[2996,146380],{},[2996,146382],{},[2996,146384],{},[2996,146386],{},[2996,146388],{},[2996,146390],{},[2996,146392],{},[2996,146394],{},[2996,146396],{},[2996,146398],{},[2996,146400],{},[2996,146402],{},[8391,146404],{},[8372,146406,146407,146409,146411,146413,146415,146423],{},[8391,146408],{},[8391,146410,40532],{},[8391,146412,39492],{},[8391,146414,40537],{},[8391,146416,40540,146417,40543,146419,40546,146421,40549],{},[2996,146418],{},[2996,146420],{},[2996,146422],{},[8391,146424],{},[8372,146426,146427,146429,146431,146433,146435,146443],{},[8391,146428],{},[8391,146430,40558],{},[8391,146432,39492],{},[8391,146434],{},[8391,146436,40565,146437,40568,146439,40571,146441,40574],{},[2996,146438],{},[2996,146440],{},[2996,146442],{},[8391,146444],{},[8372,146446,146447,146449,146451,146453,146455,146465],{},[8391,146448,40581],{},[8391,146450,40584],{},[8391,146452,39492],{},[8391,146454,39720],{},[8391,146456,40591,146457,40594,146459,40597,146461,40600,146463,40603],{},[2996,146458],{},[2996,146460],{},[2996,146462],{},[2996,146464],{},[8391,146466,40606,146467,40609],{},[2996,146468],{},[8372,146470,146471,146473,146475,146477,146479,146489],{},[8391,146472],{},[8391,146474,40616],{},[8391,146476,39553],{},[8391,146478],{},[8391,146480,40623,146481,40626,146483,40629,146485,40632,146487,40635],{},[2996,146482],{},[2996,146484],{},[2996,146486],{},[2996,146488],{},[8391,146490],{},[8372,146492,146493,146495,146497,146499,146501,146511],{},[8391,146494],{},[8391,146496,40644],{},[8391,146498,40647],{},[8391,146500,39720],{},[8391,146502,40652,146503,40655,146505,40658,146507,40661,146509,40664],{},[2996,146504],{},[2996,146506],{},[2996,146508],{},[2996,146510],{},[8391,146512],{},[8372,146514,146515,146517,146519,146521,146523,146539],{},[8391,146516],{},[8391,146518,40466],{},[8391,146520,39643],{},[8391,146522,39720],{},[8391,146524,40679,146525,40682,146527,40685,146529,40688,146531,40691,146533,40694,146535,40697,146537,40700],{},[2996,146526],{},[2996,146528],{},[2996,146530],{},[2996,146532],{},[2996,146534],{},[2996,146536],{},[2996,146538],{},[8391,146540],{},[8372,146542,146543,146545,146547,146549,146551,146575],{},[8391,146544],{},[8391,146546,40709],{},[8391,146548,40712],{},[8391,146550],{},[8391,146552,40051,146553,40719,146555,40722,146557,40725,146559,40728,146561,40731,146563,40734,146565,40073,146567,40739,146569,40742,146571,40745,146573,40748],{},[2996,146554],{},[2996,146556],{},[2996,146558],{},[2996,146560],{},[2996,146562],{},[2996,146564],{},[2996,146566],{},[2996,146568],{},[2996,146570],{},[2996,146572],{},[2996,146574],{},[8391,146576],{},[8372,146578,146579,146581,146583,146585,146587,146597],{},[8391,146580],{},[8391,146582,40757],{},[8391,146584,39492],{},[8391,146586,40762],{},[8391,146588,40765,146589,40768,146591,40771,146593,40774,146595,40777],{},[2996,146590],{},[2996,146592],{},[2996,146594],{},[2996,146596],{},[8391,146598],{},[8372,146600,146601,146603,146605,146607,146609,146639],{},[8391,146602],{},[8391,146604,40786],{},[8391,146606,40789],{},[8391,146608],{},[8391,146610,40794,146611,40797,146613,40800,146615,40803,146617,40806,146619,40809,146621,40812,146623,40815,146625,40818,146627,40821,146629,40824,146631,40827,146633,40830,146635,40833,146637,40836],{},[2996,146612],{},[2996,146614],{},[2996,146616],{},[2996,146618],{},[2996,146620],{},[2996,146622],{},[2996,146624],{},[2996,146626],{},[2996,146628],{},[2996,146630],{},[2996,146632],{},[2996,146634],{},[2996,146636],{},[2996,146638],{},[8391,146640],{},[8372,146642,146643,146645,146647,146649,146651,146663],{},[8391,146644],{},[8391,146646,40448],{},[8391,146648,39643],{},[8391,146650],{},[8391,146652,40851,146653,40854,146655,40857,146657,40860,146659,40863,146661,40866],{},[2996,146654],{},[2996,146656],{},[2996,146658],{},[2996,146660],{},[2996,146662],{},[8391,146664],{},[8372,146666,146667,146669,146671,146673,146675,146695],{},[8391,146668],{},[8391,146670,40875],{},[8391,146672,39643],{},[8391,146674],{},[8391,146676,40882,146677,40885,146679,40888,146681,40891,146683,40894,146685,40897,146687,40900,146689,40903,146691,40906,146693,40909],{},[2996,146678],{},[2996,146680],{},[2996,146682],{},[2996,146684],{},[2996,146686],{},[2996,146688],{},[2996,146690],{},[2996,146692],{},[2996,146694],{},[8391,146696],{},[8372,146698,146699,146701,146703,146705,146707,146717],{},[8391,146700],{},[8391,146702,40918],{},[8391,146704,40921],{},[8391,146706],{},[8391,146708,40926,146709,40929,146711,40932,146713,40935,146715,40938],{},[2996,146710],{},[2996,146712],{},[2996,146714],{},[2996,146716],{},[8391,146718],{},[8372,146720,146721,146723,146725,146727,146729,146737],{},[8391,146722],{},[8391,146724,40947],{},[8391,146726,40950],{},[8391,146728],{},[8391,146730,40955,146731,40958,146733,40961,146735,40964],{},[2996,146732],{},[2996,146734],{},[2996,146736],{},[8391,146738],{},[8372,146740,146741,146743,146745,146747,146749,146761],{},[8391,146742],{},[8391,146744,40973],{},[8391,146746,40976],{},[8391,146748],{},[8391,146750,40981,146751,40984,146753,40987,146755,40990,146757,40993,146759,40996],{},[2996,146752],{},[2996,146754],{},[2996,146756],{},[2996,146758],{},[2996,146760],{},[8391,146762],{},[8372,146764,146765,146767,146769,146771,146773,146781],{},[8391,146766],{},[8391,146768,41005],{},[8391,146770,41008],{},[8391,146772,39720],{},[8391,146774,41013,146775,41016,146777,41019,146779,41022],{},[2996,146776],{},[2996,146778],{},[2996,146780],{},[8391,146782],{},[8372,146784,146785,146787,146789,146791,146793,146805],{},[8391,146786],{},[8391,146788,41031],{},[8391,146790,41034],{},[8391,146792],{},[8391,146794,41039,146795,41042,146797,41045,146799,41048,146801,41051,146803,41054],{},[2996,146796],{},[2996,146798],{},[2996,146800],{},[2996,146802],{},[2996,146804],{},[8391,146806],{},[8372,146808,146809,146811,146813,146815,146817,146827],{},[8391,146810],{},[8391,146812,41063],{},[8391,146814,41066],{},[8391,146816],{},[8391,146818,41071,146819,41074,146821,41077,146823,41080,146825,41083],{},[2996,146820],{},[2996,146822],{},[2996,146824],{},[2996,146826],{},[8391,146828],{},[8372,146830,146831,146833,146835,146837,146839,146841],{},[8391,146832],{},[8391,146834],{},[8391,146836],{},[8391,146838],{},[8391,146840],{},[8391,146842],{},[7759,146844,41102],{"id":41102},[8366,146846,146847,146865],{},[8369,146848,146849],{},[8372,146850,146851,146853,146855,146857,146859,146861,146863],{},[8375,146852,39464],{},[8375,146854,39467],{},[8375,146856,39470],{},[8375,146858,41117],{},[8375,146860,39473],{},[8375,146862,39476],{},[8375,146864,39479],{},[8386,146866,146867,146883,146899,146915,146931,146947],{},[8372,146868,146869,146871,146873,146875,146877,146879,146881],{},[8391,146870,41130],{},[8391,146872,41133],{},[8391,146874,41136],{},[8391,146876,41139],{},[8391,146878,41142],{},[8391,146880,41145],{},[8391,146882,41148],{},[8372,146884,146885,146887,146889,146891,146893,146895,146897],{},[8391,146886,41130],{},[8391,146888,41155],{},[8391,146890,40712],{},[8391,146892,41160],{},[8391,146894,41163],{},[8391,146896,41166],{},[8391,146898,41169],{},[8372,146900,146901,146903,146905,146907,146909,146911,146913],{},[8391,146902,41130],{},[8391,146904,41176],{},[8391,146906,41179],{},[8391,146908],{},[8391,146910,41163],{},[8391,146912],{},[8391,146914],{},[8372,146916,146917,146919,146921,146923,146925,146927,146929],{},[8391,146918,39940],{},[8391,146920,41194],{},[8391,146922,41136],{},[8391,146924],{},[8391,146926,41163],{},[8391,146928,41203],{},[8391,146930,41206],{},[8372,146932,146933,146935,146937,146939,146941,146943,146945],{},[8391,146934,41211],{},[8391,146936,41214],{},[8391,146938,41217],{},[8391,146940,41220],{},[8391,146942,41223],{},[8391,146944],{},[8391,146946,41228],{},[8372,146948,146949,146951,146953,146955,146957,146959,146961],{},[8391,146950],{},[8391,146952],{},[8391,146954],{},[8391,146956],{},[8391,146958],{},[8391,146960],{},[8391,146962],{},[7759,146964,39720],{"id":39720},[8366,146966,146967,146979],{},[8369,146968,146969],{},[8372,146970,146971,146973,146975,146977],{},[8375,146972,39467],{},[8375,146974,39464],{},[8375,146976,41259],{},[8375,146978,41262],{},[8386,146980,146981,146991,147001,147015,147027,147039,147051,147063,147077,147089,147103,147115,147127,147139,147149,147161,147171,147183],{},[8372,146982,146983,146985,146987,146989],{},[8391,146984,40482],{},[8391,146986,41271],{},[8391,146988,41274],{},[8391,146990],{},[8372,146992,146993,146995,146997,146999],{},[8391,146994,41005],{},[8391,146996,41283],{},[8391,146998,41286],{},[8391,147000],{},[8372,147002,147003,147005,147007,147013],{},[8391,147004,40584],{},[8391,147006,41295],{},[8391,147008,41298,147009,41301,147011,41304],{},[2996,147010],{},[2996,147012],{},[8391,147014],{},[8372,147016,147017,147019,147021,147025],{},[8391,147018,40376],{},[8391,147020,41313],{},[8391,147022,41316,147023,41319],{},[2996,147024],{},[8391,147026],{},[8372,147028,147029,147031,147033,147037],{},[8391,147030,39715],{},[8391,147032,41328],{},[8391,147034,41331,147035,41334],{},[2996,147036],{},[8391,147038,39738],{},[8372,147040,147041,147043,147045,147049],{},[8391,147042,39774],{},[8391,147044,41343],{},[8391,147046,41346,147047,41349],{},[2996,147048],{},[8391,147050,41352],{},[8372,147052,147053,147055,147057,147061],{},[8391,147054,40757],{},[8391,147056,41359],{},[8391,147058,41362,147059,41365],{},[2996,147060],{},[8391,147062],{},[8372,147064,147065,147067,147069,147075],{},[8391,147066,40532],{},[8391,147068,41374],{},[8391,147070,41377,147071,41380,147073,41383],{},[2996,147072],{},[2996,147074],{},[8391,147076],{},[8372,147078,147079,147081,147083,147087],{},[8391,147080,39810],{},[8391,147082,41392],{},[8391,147084,41377,147085,41397],{},[2996,147086],{},[8391,147088,41400],{},[8372,147090,147091,147093,147095,147101],{},[8391,147092,40448],{},[8391,147094,41407],{},[8391,147096,41410,147097,41413,147099,41416],{},[2996,147098],{},[2996,147100],{},[8391,147102],{},[8372,147104,147105,147107,147109,147113],{},[8391,147106,40644],{},[8391,147108,41425],{},[8391,147110,41410,147111,41430],{},[2996,147112],{},[8391,147114],{},[8372,147116,147117,147119,147121,147125],{},[8391,147118,39973],{},[8391,147120,41439],{},[8391,147122,41442,147123,41445],{},[2996,147124],{},[8391,147126,40007],{},[8372,147128,147129,147131,147133,147137],{},[8391,147130,40241],{},[8391,147132,41454],{},[8391,147134,41457,147135,41460],{},[2996,147136],{},[8391,147138,39738],{},[8372,147140,147141,147143,147145,147147],{},[8391,147142,41467],{},[8391,147144,41470],{},[8391,147146,41473],{},[8391,147148,41476],{},[8372,147150,147151,147153,147155,147159],{},[8391,147152,41481],{},[8391,147154,41484],{},[8391,147156,41487,147157,41490],{},[2996,147158],{},[8391,147160,41493],{},[8372,147162,147163,147165,147167,147169],{},[8391,147164,41194],{},[8391,147166,41500],{},[8391,147168,41503],{},[8391,147170],{},[8372,147172,147173,147175,147177,147181],{},[8391,147174,41510],{},[8391,147176,41513],{},[8391,147178,41516,147179,41519],{},[2996,147180],{},[8391,147182,41522],{},[8372,147184,147185,147187,147189,147193],{},[8391,147186,41527],{},[8391,147188,41530],{},[8391,147190,41533,147191,41536],{},[2996,147192],{},[8391,147194],{},[7759,147196,41541],{"id":41541},[8366,147198,147199,147209],{},[8369,147200,147201],{},[8372,147202,147203,147205,147207],{},[8375,147204,39464],{},[8375,147206,39467],{},[8375,147208,41554],{},[8386,147210,147211,147221,147229],{},[8372,147212,147213,147215,147217],{},[8391,147214,41561],{},[8391,147216,41133],{},[8391,147218,147219],{},[617,147220],{"alt":41568,"src":41569},[8372,147222,147223,147225,147227],{},[8391,147224],{},[8391,147226],{},[8391,147228],{},[8372,147230,147231,147233,147235],{},[8391,147232],{},[8391,147234],{},[8391,147236],{},{"title":119,"searchDepth":144,"depth":144,"links":147238},[147239,147240,147241,147242],{"id":39455,"depth":144,"text":39455},{"id":41102,"depth":144,"text":41102},{"id":39720,"depth":144,"text":39720},{"id":41541,"depth":144,"text":41541},{},{"title":39450,"description":119},[7744,246,23378,10715,6380,14542,35725],{"id":41600,"title":41601,"assetBase":239,"author":8,"body":147247,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":148162,"navigation":128,"originalPath":42725,"path":42726,"seo":148163,"source":23330,"stem":42728,"tags":148164,"weight":250,"__hash__":42730},{"type":10,"value":147248,"toc":148145},[147249,147251,147255,147301,147305,147541,147543,147551,147555,147557,147559,147640,147642,147650,147654,147766,147768,147862,147864,147866,147868,147870,147872,147944,147946,147948,147960,147962,147964,148004,148008,148010,148012,148014,148016,148070,148074,148076,148130,148132,148143],[4517,147250,41607],{"id":41606},[107,147252,147253],{"id":41610},[22,147254,41610],{},[114,147256,147257],{"className":41615,"code":41616,"language":41617,"meta":119,"style":119},[17,147258,147259,147263,147281,147285,147289],{"__ignoreMap":119},[78,147260,147261],{"class":124,"line":125},[78,147262,41625],{"class":41624},[78,147264,147265,147267,147269,147271,147273,147275,147277,147279],{"class":124,"line":132},[78,147266,41631],{"class":41630},[78,147268,41635],{"class":41634},[78,147270,41639],{"class":41638},[78,147272,4609],{"class":41630},[78,147274,41645],{"class":41644},[78,147276,41648],{"class":41630},[78,147278,41635],{"class":41634},[78,147280,41653],{"class":41630},[78,147282,147283],{"class":124,"line":138},[78,147284,6942],{"class":41630},[78,147286,147287],{"class":124,"line":144},[78,147288,41662],{"class":41624},[78,147290,147291,147293,147295,147297,147299],{"class":124,"line":150},[78,147292,41631],{"class":41630},[78,147294,41669],{"class":41634},[78,147296,41672],{"class":41630},[78,147298,41669],{"class":41634},[78,147300,41653],{"class":41630},[107,147302,147303],{"id":41679},[22,147304,41682],{},[114,147306,147307],{"className":41685,"code":41686,"language":41687,"meta":119,"style":119},[17,147308,147309,147319,147329,147339,147351,147355,147365,147369,147377,147385,147389,147393,147403,147413,147419,147425,147429,147437,147445,147449,147453,147457,147461,147465,147469,147477,147485,147489,147493,147497,147501,147513,147521,147525,147529,147533],{"__ignoreMap":119},[78,147310,147311,147313,147315,147317],{"class":124,"line":125},[78,147312,41695],{"class":41694},[78,147314,41698],{"class":41630},[78,147316,41701],{"class":41694},[78,147318,41704],{"class":41644},[78,147320,147321,147323,147325,147327],{"class":124,"line":132},[78,147322,41695],{"class":41694},[78,147324,41711],{"class":41630},[78,147326,41701],{"class":41694},[78,147328,41716],{"class":41644},[78,147330,147331,147333,147335,147337],{"class":124,"line":138},[78,147332,41695],{"class":41694},[78,147334,41723],{"class":41630},[78,147336,41701],{"class":41694},[78,147338,41728],{"class":41644},[78,147340,147341,147343,147345,147347,147349],{"class":124,"line":144},[78,147342,41695],{"class":41694},[78,147344,41735],{"class":41630},[78,147346,41701],{"class":41694},[78,147348,41740],{"class":41644},[78,147350,41743],{"class":41624},[78,147352,147353],{"class":124,"line":150},[78,147354,129],{"emptyLinePlaceholder":128},[78,147356,147357,147359,147361,147363],{"class":124,"line":156},[78,147358,41752],{"class":41694},[78,147360,41756],{"class":41755},[78,147362,41759],{"class":41694},[78,147364,41762],{"class":41630},[78,147366,147367],{"class":124,"line":162},[78,147368,41767],{"class":41630},[78,147370,147371,147373,147375],{"class":124,"line":168},[78,147372,41772],{"class":41630},[78,147374,41775],{"class":41644},[78,147376,41778],{"class":41630},[78,147378,147379,147381,147383],{"class":124,"line":174},[78,147380,41783],{"class":41630},[78,147382,41786],{"class":41644},[78,147384,41789],{"class":41624},[78,147386,147387],{"class":124,"line":180},[78,147388,41794],{"class":41630},[78,147390,147391],{"class":124,"line":186},[78,147392,41767],{"class":41630},[78,147394,147395,147397,147399,147401],{"class":124,"line":192},[78,147396,41772],{"class":41630},[78,147398,41786],{"class":41644},[78,147400,41807],{"class":41630},[78,147402,41810],{"class":41624},[78,147404,147405,147407,147409,147411],{"class":124,"line":198},[78,147406,41815],{"class":41630},[78,147408,41818],{"class":41644},[78,147410,41807],{"class":41630},[78,147412,41823],{"class":41624},[78,147414,147415,147417],{"class":124,"line":204},[78,147416,41828],{"class":41630},[78,147418,41831],{"class":41624},[78,147420,147421,147423],{"class":124,"line":210},[78,147422,41836],{"class":41630},[78,147424,41839],{"class":41624},[78,147426,147427],{"class":124,"line":216},[78,147428,41844],{"class":41630},[78,147430,147431,147433,147435],{"class":124,"line":222},[78,147432,41849],{"class":41630},[78,147434,41852],{"class":41644},[78,147436,41778],{"class":41630},[78,147438,147439,147441,147443],{"class":124,"line":421},[78,147440,41859],{"class":41630},[78,147442,41862],{"class":41644},[78,147444,41778],{"class":41630},[78,147446,147447],{"class":124,"line":427},[78,147448,41869],{"class":41630},[78,147450,147451],{"class":124,"line":433},[78,147452,23499],{"class":41630},[78,147454,147455],{"class":124,"line":2443},[78,147456,8971],{"class":41630},[78,147458,147459],{"class":124,"line":2448},[78,147460,41794],{"class":41630},[78,147462,147463],{"class":124,"line":2454},[78,147464,129],{"emptyLinePlaceholder":128},[78,147466,147467],{"class":124,"line":2460},[78,147468,41767],{"class":41630},[78,147470,147471,147473,147475],{"class":124,"line":2465},[78,147472,41772],{"class":41630},[78,147474,41896],{"class":41644},[78,147476,41778],{"class":41630},[78,147478,147479,147481,147483],{"class":124,"line":2470},[78,147480,41815],{"class":41630},[78,147482,41905],{"class":41644},[78,147484,41778],{"class":41630},[78,147486,147487],{"class":124,"line":2903},[78,147488,41912],{"class":41630},[78,147490,147491],{"class":124,"line":2909},[78,147492,23513],{"class":41630},[78,147494,147495],{"class":124,"line":11477},[78,147496,2070],{"class":41630},[78,147498,147499],{"class":124,"line":13374},[78,147500,129],{"emptyLinePlaceholder":128},[78,147502,147503,147505,147507,147509,147511],{"class":124,"line":13380},[78,147504,41752],{"class":41694},[78,147506,41931],{"class":41755},[78,147508,41759],{"class":41694},[78,147510,41936],{"class":41638},[78,147512,41939],{"class":41630},[78,147514,147515,147517,147519],{"class":124,"line":13386},[78,147516,41944],{"class":41630},[78,147518,41947],{"class":41638},[78,147520,41950],{"class":41630},[78,147522,147523],{"class":124,"line":13722},[78,147524,41955],{"class":41630},[78,147526,147527],{"class":124,"line":13727},[78,147528,41960],{"class":41630},[78,147530,147531],{"class":124,"line":13953},[78,147532,129],{"emptyLinePlaceholder":128},[78,147534,147535,147537,147539],{"class":124,"line":13958},[78,147536,41969],{"class":41694},[78,147538,41972],{"class":41694},[78,147540,41975],{"class":41630},[7759,147542,41978],{"id":41978},[13,147544,147545,41984,147547,41987,147549,67],{},[17,147546,41983],{},[17,147548,41983],{},[17,147550,41983],{},[49,147552,147553],{},[52,147554,41994],{},[23289,147556],{},[107,147558,41999],{"id":41999},[13,147560,147561],{},[22,147562,42004,147563,42085],{},[78,147564,147566,147601],{"className":147565},[4570],[78,147567,147569],{"className":147568},[4574],[4576,147570,147571],{"xmlns":4578},[4581,147572,147573,147599],{},[4584,147574,147575,147577,147579,147581,147583,147585,147587,147589,147591,147593,147595,147597],{},[4596,147576,17132],{},[4596,147578,5025],{},[4596,147580,18038],{},[4596,147582,5012],{},[4596,147584,4618],{},[4596,147586,17132],{},[4587,147588,42031],{},[4596,147590,5012],{},[4596,147592,26052],{},[4596,147594,39],{},[4596,147596,262],{},[4596,147598,21291],{"mathvariant":7101},[4647,147600,42044],{"encoding":4649},[78,147602,147604],{"className":147603,"ariaHidden":1419},[4654],[78,147605,147607,147610,147613,147616,147619,147622,147625,147628,147631,147634,147637],{"className":147606},[4658],[78,147608],{"className":147609,"style":16794},[4662],[78,147611,17132],{"className":147612,"style":17251},[4667,4678],[78,147614,5025],{"className":147615},[4667,4678],[78,147617,18038],{"className":147618},[4667,4678],[78,147620,5012],{"className":147621},[4667,4678],[78,147623,18081],{"className":147624,"style":17251},[4667,4678],[78,147626,42031],{"className":147627},[4667,6184],[78,147629,5012],{"className":147630},[4667,4678],[78,147632,42078],{"className":147633},[4667,4678],[78,147635,262],{"className":147636},[4667,4678],[78,147638,21291],{"className":147639},[4667],[13,147641,42088],{},[13,147643,42091,147644,42095,147646,42099,147648,67],{},[17,147645,42094],{},[17,147647,42098],{},[17,147649,42102],{},[13,147651,147652],{},[617,147653],{"alt":42107,"src":42108},[114,147655,147656],{"className":41685,"code":42111,"language":41687,"meta":119,"style":119},[17,147657,147658,147662,147674,147678,147682,147694,147698,147702,147718,147722,147726,147742,147746,147750],{"__ignoreMap":119},[78,147659,147660],{"class":124,"line":125},[78,147661,42118],{"class":41624},[78,147663,147664,147666,147668,147670,147672],{"class":124,"line":132},[78,147665,42123],{"class":41630},[78,147667,42126],{"class":41638},[78,147669,4594],{"class":41630},[78,147671,42131],{"class":41644},[78,147673,8041],{"class":41630},[78,147675,147676],{"class":124,"line":138},[78,147677,129],{"emptyLinePlaceholder":128},[78,147679,147680],{"class":124,"line":144},[78,147681,42142],{"class":41624},[78,147683,147684,147686,147688,147690,147692],{"class":124,"line":150},[78,147685,42123],{"class":41630},[78,147687,42126],{"class":41638},[78,147689,42151],{"class":41630},[78,147691,42131],{"class":41644},[78,147693,42156],{"class":41630},[78,147695,147696],{"class":124,"line":156},[78,147697,129],{"emptyLinePlaceholder":128},[78,147699,147700],{"class":124,"line":162},[78,147701,42165],{"class":41624},[78,147703,147704,147706,147708,147710,147712,147714,147716],{"class":124,"line":168},[78,147705,42123],{"class":41630},[78,147707,42126],{"class":41638},[78,147709,42174],{"class":41630},[78,147711,42177],{"class":41644},[78,147713,42180],{"class":41630},[78,147715,42183],{"class":41644},[78,147717,42186],{"class":41630},[78,147719,147720],{"class":124,"line":174},[78,147721,129],{"emptyLinePlaceholder":128},[78,147723,147724],{"class":124,"line":180},[78,147725,42195],{"class":41624},[78,147727,147728,147730,147732,147734,147736,147738,147740],{"class":124,"line":186},[78,147729,42123],{"class":41630},[78,147731,42126],{"class":41638},[78,147733,42151],{"class":41630},[78,147735,42206],{"class":41644},[78,147737,42209],{"class":41630},[78,147739,42212],{"class":41644},[78,147741,42186],{"class":41630},[78,147743,147744],{"class":124,"line":192},[78,147745,129],{"emptyLinePlaceholder":128},[78,147747,147748],{"class":124,"line":198},[78,147749,42223],{"class":41624},[78,147751,147752,147754,147756,147758,147760,147762,147764],{"class":124,"line":204},[78,147753,42123],{"class":41630},[78,147755,42126],{"class":41638},[78,147757,42151],{"class":41630},[78,147759,42234],{"class":41644},[78,147761,42237],{"class":41630},[78,147763,42240],{"class":41644},[78,147765,42156],{"class":41630},[13,147767,42245],{},[114,147769,147770],{"className":41685,"code":42248,"language":41687,"meta":119,"style":119},[17,147771,147772,147782,147786,147804,147808,147826,147830,147844,147848],{"__ignoreMap":119},[78,147773,147774,147776,147778,147780],{"class":124,"line":125},[78,147775,41752],{"class":41694},[78,147777,42257],{"class":41755},[78,147779,41759],{"class":41694},[78,147781,42262],{"class":41644},[78,147783,147784],{"class":124,"line":132},[78,147785,42267],{"class":41624},[78,147787,147788,147790,147792,147794,147796,147798,147800,147802],{"class":124,"line":138},[78,147789,42123],{"class":41630},[78,147791,42126],{"class":41638},[78,147793,4594],{"class":41630},[78,147795,42278],{"class":41644},[78,147797,42281],{"class":41630},[78,147799,42284],{"class":41644},[78,147801,42287],{"class":41630},[78,147803,42290],{"class":41624},[78,147805,147806],{"class":124,"line":144},[78,147807,42295],{"class":41624},[78,147809,147810,147812,147814,147816,147818,147820,147822,147824],{"class":124,"line":150},[78,147811,42123],{"class":41630},[78,147813,42126],{"class":41638},[78,147815,42151],{"class":41630},[78,147817,42278],{"class":41644},[78,147819,42281],{"class":41630},[78,147821,42284],{"class":41644},[78,147823,42312],{"class":41630},[78,147825,42290],{"class":41624},[78,147827,147828],{"class":124,"line":156},[78,147829,42319],{"class":41624},[78,147831,147832,147834,147836,147838,147840,147842],{"class":124,"line":162},[78,147833,42123],{"class":41630},[78,147835,42126],{"class":41638},[78,147837,42174],{"class":41630},[78,147839,42177],{"class":41644},[78,147841,42332],{"class":41630},[78,147843,42290],{"class":41624},[78,147845,147846],{"class":124,"line":168},[78,147847,42339],{"class":41624},[78,147849,147850,147852,147854,147856,147858,147860],{"class":124,"line":174},[78,147851,42123],{"class":41630},[78,147853,42126],{"class":41638},[78,147855,42151],{"class":41630},[78,147857,42350],{"class":41644},[78,147859,42332],{"class":41630},[78,147861,42355],{"class":41624},[13,147863,42358],{},[107,147865,42361],{"id":42361},[23090,147867,42365],{"id":42364},[13,147869,42368],{},[23090,147871,42372],{"id":42371},[114,147873,147874],{"className":41685,"code":42375,"language":41687,"meta":119,"style":119},[17,147875,147876,147880,147888,147892,147896,147910,147914,147918,147930,147940],{"__ignoreMap":119},[78,147877,147878],{"class":124,"line":125},[78,147879,42382],{"class":41624},[78,147881,147882,147884,147886],{"class":124,"line":132},[78,147883,42387],{"class":41638},[78,147885,42390],{"class":41630},[78,147887,42393],{"class":41644},[78,147889,147890],{"class":124,"line":138},[78,147891,129],{"emptyLinePlaceholder":128},[78,147893,147894],{"class":124,"line":144},[78,147895,42402],{"class":41624},[78,147897,147898,147900,147902,147904,147906,147908],{"class":124,"line":150},[78,147899,42387],{"class":41638},[78,147901,42409],{"class":41630},[78,147903,34359],{"class":41638},[78,147905,42390],{"class":41630},[78,147907,42416],{"class":41644},[78,147909,42419],{"class":41630},[78,147911,147912],{"class":124,"line":156},[78,147913,129],{"emptyLinePlaceholder":128},[78,147915,147916],{"class":124,"line":162},[78,147917,42428],{"class":41624},[78,147919,147920,147922,147924,147926,147928],{"class":124,"line":168},[78,147921,42387],{"class":41638},[78,147923,42390],{"class":41630},[78,147925,42438],{"class":42437},[78,147927,42441],{"class":41694},[78,147929,42444],{"class":41630},[78,147931,147932,147934,147936,147938],{"class":124,"line":174},[78,147933,42449],{"class":41694},[78,147935,42452],{"class":41630},[78,147937,42455],{"class":41644},[78,147939,42458],{"class":41630},[78,147941,147942],{"class":124,"line":180},[78,147943,23518],{"class":41630},[13,147945,42465],{},[23090,147947,42469],{"id":42468},[114,147949,147950],{"className":41685,"code":42472,"language":41687,"meta":119,"style":119},[17,147951,147952],{"__ignoreMap":119},[78,147953,147954,147956,147958],{"class":124,"line":125},[78,147955,42479],{"class":41638},[78,147957,42390],{"class":41630},[78,147959,42484],{"class":41644},[13,147961,42487],{},[23090,147963,42491],{"id":42490},[114,147965,147966],{"className":41685,"code":42494,"language":41687,"meta":119,"style":119},[17,147967,147968,147982,147986],{"__ignoreMap":119},[78,147969,147970,147972,147974,147976,147978,147980],{"class":124,"line":125},[78,147971,41752],{"class":41694},[78,147973,41756],{"class":41755},[78,147975,41759],{"class":41694},[78,147977,42507],{"class":41630},[78,147979,42510],{"class":41644},[78,147981,42513],{"class":41630},[78,147983,147984],{"class":124,"line":132},[78,147985,42518],{"class":41624},[78,147987,147988,147990,147992,147994,147996,147998,148000,148002],{"class":124,"line":138},[78,147989,41752],{"class":41694},[78,147991,41756],{"class":41755},[78,147993,41759],{"class":41694},[78,147995,42507],{"class":41630},[78,147997,42510],{"class":41644},[78,147999,42533],{"class":41630},[78,148001,1419],{"class":41755},[78,148003,42538],{"class":41630},[13,148005,42541,148006,42545],{},[22,148007,42544],{},[13,148009,42548],{},[23090,148011,42552],{"id":42551},[13,148013,42555],{},[7759,148015,42559],{"id":42558},[114,148017,148018],{"className":41685,"code":42562,"language":41687,"meta":119,"style":119},[17,148019,148020,148030,148034,148046,148054,148058,148062,148066],{"__ignoreMap":119},[78,148021,148022,148024,148026,148028],{"class":124,"line":125},[78,148023,41695],{"class":41694},[78,148025,42571],{"class":41630},[78,148027,41701],{"class":41694},[78,148029,41704],{"class":41644},[78,148031,148032],{"class":124,"line":132},[78,148033,129],{"emptyLinePlaceholder":128},[78,148035,148036,148038,148040,148042,148044],{"class":124,"line":138},[78,148037,41752],{"class":41694},[78,148039,41931],{"class":41755},[78,148041,41759],{"class":41694},[78,148043,41936],{"class":41638},[78,148045,41939],{"class":41630},[78,148047,148048,148050,148052],{"class":124,"line":144},[78,148049,41944],{"class":41630},[78,148051,41947],{"class":41638},[78,148053,41950],{"class":41630},[78,148055,148056],{"class":124,"line":150},[78,148057,42604],{"class":41630},[78,148059,148060],{"class":124,"line":156},[78,148061,42609],{"class":41624},[78,148063,148064],{"class":124,"line":162},[78,148065,42614],{"class":41630},[78,148067,148068],{"class":124,"line":168},[78,148069,41960],{"class":41630},[13,148071,42621,148072,67],{},[22,148073,42624],{},[7759,148075,42628],{"id":42627},[114,148077,148078],{"className":41685,"code":42631,"language":41687,"meta":119,"style":119},[17,148079,148080,148090,148094,148106,148114,148118,148122,148126],{"__ignoreMap":119},[78,148081,148082,148084,148086,148088],{"class":124,"line":125},[78,148083,41695],{"class":41694},[78,148085,42640],{"class":41630},[78,148087,41701],{"class":41694},[78,148089,41704],{"class":41644},[78,148091,148092],{"class":124,"line":132},[78,148093,129],{"emptyLinePlaceholder":128},[78,148095,148096,148098,148100,148102,148104],{"class":124,"line":138},[78,148097,41752],{"class":41694},[78,148099,41931],{"class":41755},[78,148101,41759],{"class":41694},[78,148103,41936],{"class":41638},[78,148105,41939],{"class":41630},[78,148107,148108,148110,148112],{"class":124,"line":144},[78,148109,41944],{"class":41630},[78,148111,42667],{"class":41638},[78,148113,41950],{"class":41630},[78,148115,148116],{"class":124,"line":150},[78,148117,42604],{"class":41630},[78,148119,148120],{"class":124,"line":156},[78,148121,42609],{"class":41624},[78,148123,148124],{"class":124,"line":162},[78,148125,42614],{"class":41630},[78,148127,148128],{"class":124,"line":168},[78,148129,41960],{"class":41630},[13,148131,42688],{},[49,148133,148134],{},[52,148135,42693,148136,148138,42390,148140,42703],{},[2996,148137],{},[78,148139,42698],{},[5009,148141,42701],{"href":42701,"rel":148142},[23647],[226,148144,42706],{},{"title":119,"searchDepth":144,"depth":144,"links":148146},[148147,148148,148151,148152],{"id":41610,"depth":132,"text":41610},{"id":41679,"depth":132,"text":41682,"children":148149},[148150],{"id":41978,"depth":144,"text":41978},{"id":41999,"depth":132,"text":41999},{"id":42361,"depth":132,"text":42361,"children":148153},[148154,148155,148156,148157,148158],{"id":42364,"depth":138,"text":42365},{"id":42371,"depth":138,"text":42372},{"id":42468,"depth":138,"text":42469},{"id":42490,"depth":138,"text":42491},{"id":42551,"depth":138,"text":42552,"children":148159},[148160,148161],{"id":42558,"depth":144,"text":42559},{"id":42627,"depth":144,"text":42628},{},{"title":41601,"description":119},[23333],{"id":42732,"title":42733,"assetBase":239,"author":8,"body":148166,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":150983,"navigation":128,"originalPath":46179,"path":46180,"seo":150984,"source":23330,"stem":46182,"tags":150985,"weight":250,"__hash__":46184},{"type":10,"value":148167,"toc":150959},[148168,148170,148172,148174,148176,148178,148180,148182,148184,148186,148207,148209,148211,148326,148328,148598,148600,148602,148604,148609,148613,148615,148617,148619,148621,148623,148625,148627,148635,148637,148639,148645,148647,148731,148733,148735,148737,148815,148817,148833,148835,149180,149182,149184,149186,149210,149212,149228,149230,149232,149234,149236,149251,149253,149269,149271,149455,149457,149459,149463,149465,149467,149485,149489,149491,149579,149591,149593,149595,149613,149615,149617,149619,149621,149755,149757,149781,149805,149807,149812,149814,149816,149876,149878,149880,149884,149886,149888,149930,149934,149936,149938,149940,149944,149946,149948,149950,149952,149954,150234,150236,150238,150240,150242,150244,150250,150252,150355,150357,150359,150361,150387,150389,150401,150403,150725,150727,150823,150827,150829,150833,150835,150908,150910,150938,150940,150948,150952,150957],[107,148169,42739],{"id":42738},[13,148171,42742],{},[7759,148173,42746],{"id":42745},[10548,148175,42749],{"id":42749},[13,148177,42752],{},[10548,148179,42755],{"id":42755},[13,148181,42758],{},[10548,148183,42761],{"id":42761},[13,148185,42764],{},[72,148187,148188,148190,148192,148197,148202],{},[13,148189,42769],{},[13,148191,42772],{},[13,148193,42775,148194],{},[5009,148195,42778],{"href":42778,"rel":148196},[23647],[13,148198,42782,148199],{},[5009,148200,42785],{"href":42785,"rel":148201},[23647],[13,148203,42789,148204],{},[5009,148205,42792],{"href":42792,"rel":148206},[23647],[7759,148208,42797],{"id":42796},[13,148210,42800],{},[8366,148212,148213,148223],{},[8369,148214,148215],{},[8372,148216,148217,148219,148221],{},[8375,148218,42809],{},[8375,148220,42812],{},[8375,148222,42815],{},[8386,148224,148225,148233,148241,148249,148260,148268,148276,148284,148292,148300,148310,148318],{},[8372,148226,148227,148229,148231],{},[8391,148228,42822],{},[8391,148230,42825],{},[8391,148232,42828],{},[8372,148234,148235,148237,148239],{},[8391,148236,42833],{},[8391,148238,42836],{},[8391,148240,42839],{},[8372,148242,148243,148245,148247],{},[8391,148244,42844],{},[8391,148246,42847],{},[8391,148248],{},[8372,148250,148251,148253,148255],{},[8391,148252,42854],{},[8391,148254,42857],{},[8391,148256,42860,148257],{},[5009,148258,42865],{"href":42863,"rel":148259},[23647],[8372,148261,148262,148264,148266],{},[8391,148263,42870],{},[8391,148265,42873],{},[8391,148267,42876],{},[8372,148269,148270,148272,148274],{},[8391,148271,42881],{},[8391,148273,42884],{},[8391,148275,42887],{},[8372,148277,148278,148280,148282],{},[8391,148279,42892],{},[8391,148281,42895],{},[8391,148283],{},[8372,148285,148286,148288,148290],{},[8391,148287,42902],{},[8391,148289,42895],{},[8391,148291],{},[8372,148293,148294,148296,148298],{},[8391,148295,42911],{},[8391,148297,42895],{},[8391,148299],{},[8372,148301,148302,148304,148308],{},[8391,148303,42920],{},[8391,148305,148306],{},[22,148307,42925],{},[8391,148309,42928],{},[8372,148311,148312,148314,148316],{},[8391,148313,42933],{},[8391,148315,42936],{},[8391,148317],{},[8372,148319,148320,148322,148324],{},[8391,148321,42943],{},[8391,148323,42946],{},[8391,148325],{},[7759,148327,42952],{"id":42951},[8366,148329,148330,148344],{},[8369,148331,148332],{},[8372,148333,148334,148336,148338,148340,148342],{},[8375,148335,42961],{},[8375,148337,42964],{},[8375,148339,42967],{},[8375,148341,42970],{},[8375,148343,42973],{},[8386,148345,148346,148358,148370,148382,148394,148406,148418,148430,148442,148454,148466,148478,148490,148502,148514,148526,148538,148550,148562,148574,148586],{},[8372,148347,148348,148350,148352,148354,148356],{},[8391,148349,42980],{},[8391,148351,42983],{},[8391,148353,42986],{},[8391,148355],{},[8391,148357],{},[8372,148359,148360,148362,148364,148366,148368],{},[8391,148361],{},[8391,148363,42997],{},[8391,148365,42986],{},[8391,148367,42986],{},[8391,148369,42986],{},[8372,148371,148372,148374,148376,148378,148380],{},[8391,148373],{},[8391,148375,43010],{},[8391,148377],{},[8391,148379],{},[8391,148381,42986],{},[8372,148383,148384,148386,148388,148390,148392],{},[8391,148385,43021],{},[8391,148387,43024],{},[8391,148389,42986],{},[8391,148391,42986],{},[8391,148393,42986],{},[8372,148395,148396,148398,148400,148402,148404],{},[8391,148397],{},[8391,148399,43037],{},[8391,148401],{},[8391,148403,42986],{},[8391,148405],{},[8372,148407,148408,148410,148412,148414,148416],{},[8391,148409,42844],{},[8391,148411,43050],{},[8391,148413,42986],{},[8391,148415,42986],{},[8391,148417,42986],{},[8372,148419,148420,148422,148424,148426,148428],{},[8391,148421,43061],{},[8391,148423,42881],{},[8391,148425,42986],{},[8391,148427,42986],{},[8391,148429],{},[8372,148431,148432,148434,148436,148438,148440],{},[8391,148433,42892],{},[8391,148435,42892],{},[8391,148437,42986],{},[8391,148439,42986],{},[8391,148441,42986],{},[8372,148443,148444,148446,148448,148450,148452],{},[8391,148445,43086],{},[8391,148447,42881],{},[8391,148449],{},[8391,148451],{},[8391,148453,42986],{},[8372,148455,148456,148458,148460,148462,148464],{},[8391,148457,43099],{},[8391,148459,42881],{},[8391,148461],{},[8391,148463],{},[8391,148465,42986],{},[8372,148467,148468,148470,148472,148474,148476],{},[8391,148469,42870],{},[8391,148471],{},[8391,148473,42986],{},[8391,148475,42986],{},[8391,148477,42986],{},[8372,148479,148480,148482,148484,148486,148488],{},[8391,148481,43124],{},[8391,148483,43124],{},[8391,148485,42986],{},[8391,148487],{},[8391,148489],{},[8372,148491,148492,148494,148496,148498,148500],{},[8391,148493,42911],{},[8391,148495],{},[8391,148497,42986],{},[8391,148499,42986],{},[8391,148501,42986],{},[8372,148503,148504,148506,148508,148510,148512],{},[8391,148505,42902],{},[8391,148507],{},[8391,148509,42986],{},[8391,148511,42986],{},[8391,148513,42986],{},[8372,148515,148516,148518,148520,148522,148524],{},[8391,148517,42933],{},[8391,148519,43163],{},[8391,148521,42986],{},[8391,148523],{},[8391,148525],{},[8372,148527,148528,148530,148532,148534,148536],{},[8391,148529],{},[8391,148531,43176],{},[8391,148533,42986],{},[8391,148535],{},[8391,148537],{},[8372,148539,148540,148542,148544,148546,148548],{},[8391,148541],{},[8391,148543,43189],{},[8391,148545,42986],{},[8391,148547],{},[8391,148549],{},[8372,148551,148552,148554,148556,148558,148560],{},[8391,148553],{},[8391,148555,43202],{},[8391,148557,42986],{},[8391,148559,42986],{},[8391,148561,42986],{},[8372,148563,148564,148566,148568,148570,148572],{},[8391,148565],{},[8391,148567,43215],{},[8391,148569,42986],{},[8391,148571,42986],{},[8391,148573,42986],{},[8372,148575,148576,148578,148580,148582,148584],{},[8391,148577,42920],{},[8391,148579,42920],{},[8391,148581,42986],{},[8391,148583],{},[8391,148585],{},[8372,148587,148588,148590,148592,148594,148596],{},[8391,148589,43238],{},[8391,148591],{},[8391,148593,1021],{},[8391,148595,1028],{},[8391,148597,1044],{},[23289,148599],{},[107,148601,43252],{"id":43251},[7759,148603,43256],{"id":43255},[13,148605,43259,148606,67],{},[5009,148607,43264],{"href":43262,"rel":148608},[23647],[13,148610,148611,43270],{},[22,148612,43269],{},[13,148614,43273],{},[13,148616,43276],{},[7759,148618,43280],{"id":43279},[13,148620,43283],{},[7759,148622,43287],{"id":43286},[10548,148624,43291],{"id":43290},[13,148626,43294],{},[49,148628,148629,148631,148633],{},[52,148630,43299],{},[52,148632,43302],{},[52,148634,43305],{},[10548,148636,43309],{"id":43308},[13,148638,43294],{},[49,148640,148641,148643],{},[52,148642,43316],{},[52,148644,43319],{},[7759,148646,43323],{"id":43322},[114,148648,148649],{"className":33493,"code":43326,"language":33495,"meta":119,"style":119},[17,148650,148651,148655,148659,148663,148667,148671,148675,148679,148683,148687,148691,148695,148699,148703,148707,148711,148715,148719,148723,148727],{"__ignoreMap":119},[78,148652,148653],{"class":124,"line":125},[78,148654,43333],{},[78,148656,148657],{"class":124,"line":132},[78,148658,43338],{},[78,148660,148661],{"class":124,"line":138},[78,148662,43343],{},[78,148664,148665],{"class":124,"line":144},[78,148666,129],{"emptyLinePlaceholder":128},[78,148668,148669],{"class":124,"line":150},[78,148670,43352],{},[78,148672,148673],{"class":124,"line":156},[78,148674,43357],{},[78,148676,148677],{"class":124,"line":162},[78,148678,43362],{},[78,148680,148681],{"class":124,"line":168},[78,148682,43367],{},[78,148684,148685],{"class":124,"line":174},[78,148686,129],{"emptyLinePlaceholder":128},[78,148688,148689],{"class":124,"line":180},[78,148690,43376],{},[78,148692,148693],{"class":124,"line":186},[78,148694,43381],{},[78,148696,148697],{"class":124,"line":192},[78,148698,43386],{},[78,148700,148701],{"class":124,"line":198},[78,148702,129],{"emptyLinePlaceholder":128},[78,148704,148705],{"class":124,"line":204},[78,148706,43395],{},[78,148708,148709],{"class":124,"line":210},[78,148710,43400],{},[78,148712,148713],{"class":124,"line":216},[78,148714,43405],{},[78,148716,148717],{"class":124,"line":222},[78,148718,129],{"emptyLinePlaceholder":128},[78,148720,148721],{"class":124,"line":421},[78,148722,43414],{},[78,148724,148725],{"class":124,"line":427},[78,148726,43419],{},[78,148728,148729],{"class":124,"line":433},[78,148730,43424],{},[7759,148732,43428],{"id":43427},[13,148734,43431],{},[10548,148736,43435],{"id":43434},[49,148738,148739,148755,148765,148787,148797,148799,148801],{},[52,148740,43440,148741],{},[49,148742,148743,148745,148747,148749,148751,148753],{},[52,148744,43445],{},[52,148746,43448],{},[52,148748,43451],{},[52,148750,43454],{},[52,148752,43457],{},[52,148754,43460],{},[52,148756,43463,148757],{},[49,148758,148759,148761,148763],{},[52,148760,43468],{},[52,148762,43471],{},[52,148764,43474],{},[52,148766,43477,148767],{},[49,148768,148769,148771,148773,148775,148777,148779,148781,148783,148785],{},[52,148770,43482],{},[52,148772,43485],{},[52,148774,43488],{},[52,148776,43491],{},[52,148778,43494],{},[52,148780,43497],{},[52,148782,43500],{},[52,148784,43503],{},[52,148786,43506],{},[52,148788,43509,148789],{},[49,148790,148791,148793,148795],{},[52,148792,43514],{},[52,148794,43517],{},[52,148796,43520],{},[52,148798,43523],{},[52,148800,43526],{},[52,148802,43529,148803],{},[49,148804,148805],{},[52,148806,148807],{},[114,148808,148809],{"className":33493,"code":43536,"language":33495,"meta":119,"style":119},[17,148810,148811],{"__ignoreMap":119},[78,148812,148813],{"class":124,"line":125},[78,148814,43536],{},[10548,148816,43546],{"id":43545},[114,148818,148819],{"className":33493,"code":43549,"language":33495,"meta":119,"style":119},[17,148820,148821,148825,148829],{"__ignoreMap":119},[78,148822,148823],{"class":124,"line":125},[78,148824,43556],{},[78,148826,148827],{"class":124,"line":132},[78,148828,43561],{},[78,148830,148831],{"class":124,"line":138},[78,148832,43566],{},[10548,148834,43570],{"id":43569},[49,148836,148837,149167],{},[52,148838,43575,148839],{},[49,148840,148841,148843,148850],{},[52,148842,43580],{},[52,148844,148845],{},[114,148846,148848],{"className":148847,"code":43586,"language":299},[297],[17,148849,43586],{"__ignoreMap":119},[52,148851,148852],{},[78,148853,148855],{"className":148854},[4566],[78,148856,148858,148969],{"className":148857},[4570],[78,148859,148861],{"className":148860},[4574],[4576,148862,148863],{"xmlns":4578,"display":4579},[4581,148864,148865,148967],{},[4584,148866,148867,148869,148871,148873,148875,148877,148879,148881,148883,148885,148887,148889,148891,148893,148895,148897,148899,148901,148903,148905,148907,148909,148911,148913,148915,148917,148919,148921,148923,148925,148927,148929,148937,148939,148941,148943,148945,148947,148949,148951,148953,148955,148957,148959,148961,148963,148965],{},[4596,148868,5245],{},[4596,148870,5053],{},[4596,148872,262],{},[4596,148874,21291],{"mathvariant":7101},[4596,148876,19],{},[4596,148878,5009],{},[4596,148880,5058],{},[4596,148882,4618],{},[4596,148884,19],{},[4596,148886,5025],{},[4596,148888,5245],{},[4596,148890,4618],{},[4596,148892,21291],{"mathvariant":7101},[4596,148894,26052],{},[4596,148896,5009],{},[4596,148898,19],{},[4596,148900,5245],{},[4596,148902,7132],{},[4596,148904,4618],{},[4596,148906,17132],{},[4596,148908,21291],{"mathvariant":7101},[4596,148910,7360],{},[4596,148912,5025],{},[4596,148914,18038],{},[4596,148916,19],{},[4596,148918,5012],{},[4591,148920,4609],{},[7077,148922,22822],{},[4591,148924,43664],{},[4596,148926,7132],{},[4596,148928,5025],{},[26080,148930,148931,148933,148935],{},[4596,148932,43673],{},[4596,148934,4618],{},[4596,148936,43678],{},[4596,148938,7132],{},[4596,148940,18038],{},[4596,148942,262],{},[4596,148944,5012],{},[4596,148946,4618],{},[4596,148948,17132],{},[4596,148950,43693],{},[4596,148952,39],{},[4596,148954,25949],{},[4596,148956,4618],{},[4587,148958,43702],{},[7077,148960,37759],{},[4587,148962,43707],{},[7077,148964,43710],{},[4587,148966,67],{},[4647,148968,43715],{"encoding":4649},[78,148970,148972,149044,149062],{"className":148971,"ariaHidden":1419},[4654],[78,148973,148975,148978,148981,148984,148987,148990,148993,148996,148999,149002,149005,149008,149011,149014,149017,149020,149023,149026,149029,149032,149035,149038,149041],{"className":148974},[4658],[78,148976],{"className":148977,"style":43725},[4662],[78,148979,43729],{"className":148980,"style":5170},[4667,4678],[78,148982,262],{"className":148983},[4667,4678],[78,148985,21291],{"className":148986},[4667],[78,148988,43739],{"className":148989},[4667,4678],[78,148991,4618],{"className":148992},[4667,4678],[78,148994,19],{"className":148995},[4667,4678],[78,148997,5025],{"className":148998},[4667,4678],[78,149000,5245],{"className":149001},[4667,4678],[78,149003,4618],{"className":149004},[4667,4678],[78,149006,21291],{"className":149007},[4667],[78,149009,43761],{"className":149010},[4667,4678],[78,149012,5245],{"className":149013},[4667,4678],[78,149015,7132],{"className":149016,"style":7300},[4667,4678],[78,149018,18081],{"className":149019,"style":17251},[4667,4678],[78,149021,21291],{"className":149022},[4667],[78,149024,43777],{"className":149025},[4667,4678],[78,149027,18038],{"className":149028},[4667,4678],[78,149030,19],{"className":149031},[4667,4678],[78,149033,5012],{"className":149034},[4667,4678],[78,149036],{"className":149037,"style":4740},[4739],[78,149039,4609],{"className":149040},[4744],[78,149042],{"className":149043,"style":4740},[4739],[78,149045,149047,149050,149053,149056,149059],{"className":149046},[4658],[78,149048],{"className":149049,"style":17949},[4662],[78,149051,22822],{"className":149052},[4667],[78,149054],{"className":149055,"style":5143},[4739],[78,149057,43664],{"className":149058},[7450],[78,149060],{"className":149061,"style":5143},[4739],[78,149063,149065,149068,149071,149074,149125,149128,149131,149134,149137,149140,149143,149146,149149,149152,149155,149158,149161,149164],{"className":149064},[4658],[78,149066],{"className":149067,"style":43820},[4662],[78,149069,7132],{"className":149070,"style":7300},[4667,4678],[78,149072,5025],{"className":149073},[4667,4678],[78,149075,149077,149080],{"className":149076},[4667],[78,149078,43673],{"className":149079,"style":5187},[4667,4678],[78,149081,149083],{"className":149082},[4689],[78,149084,149086,149117],{"className":149085},[4693,4694],[78,149087,149089,149114],{"className":149088},[4698],[78,149090,149092,149103],{"className":149091,"style":5206},[4702],[78,149093,149094,149097],{"style":43847},[78,149095],{"className":149096,"style":4711},[4710],[78,149098,149100],{"className":149099},[4715,4716,4717,4718],[78,149101,4618],{"className":149102},[4667,4678,4718],[78,149104,149105,149108],{"style":5209},[78,149106],{"className":149107,"style":4711},[4710],[78,149109,149111],{"className":149110},[4715,4716,4717,4718],[78,149112,43678],{"className":149113,"style":5133},[4667,4678,4718],[78,149115,4726],{"className":149116},[4725],[78,149118,149120],{"className":149119},[4698],[78,149121,149123],{"className":149122,"style":26326},[4702],[78,149124],{},[78,149126,7132],{"className":149127,"style":7300},[4667,4678],[78,149129,18038],{"className":149130},[4667,4678],[78,149132,262],{"className":149133},[4667,4678],[78,149135,5012],{"className":149136},[4667,4678],[78,149138,18081],{"className":149139,"style":17251},[4667,4678],[78,149141,43693],{"className":149142,"style":7153},[4667,4678],[78,149144,39],{"className":149145},[4667,4678],[78,149147,25949],{"className":149148,"style":43903},[4667,4678],[78,149150,4618],{"className":149151},[4667,4678],[78,149153,43702],{"className":149154},[4667,6184],[78,149156,37759],{"className":149157},[4667],[78,149159,43707],{"className":149160},[4667,6184],[78,149162,43710],{"className":149163},[4667],[78,149165,67],{"className":149166},[4667,6184],[52,149168,43924,149169],{},[49,149170,149171,149173],{},[52,149172,43929],{},[52,149174,43932,149175],{},[114,149176,149178],{"className":149177,"code":43936,"language":299},[297],[17,149179,43936],{"__ignoreMap":119},[7759,149181,43942],{"id":43941},[13,149183,43945],{},[10548,149185,43949],{"id":43948},[49,149187,149188,149190,149208],{},[52,149189,43954],{},[52,149191,43957,149192],{},[49,149193,149194,149196,149198],{},[52,149195,43962],{},[52,149197,43965],{},[52,149199,43968,149200],{},[114,149201,149202],{"className":43971,"code":43972,"language":43973,"meta":119,"style":119},[17,149203,149204],{"__ignoreMap":119},[78,149205,149206],{"class":124,"line":125},[78,149207,43972],{},[52,149209,43982],{},[10548,149211,43986],{"id":43985},[114,149213,149214],{"className":33493,"code":43989,"language":33495,"meta":119,"style":119},[17,149215,149216,149220,149224],{"__ignoreMap":119},[78,149217,149218],{"class":124,"line":125},[78,149219,43996],{},[78,149221,149222],{"class":124,"line":132},[78,149223,44001],{},[78,149225,149226],{"class":124,"line":138},[78,149227,44006],{},[7759,149229,44010],{"id":44009},[13,149231,44013],{},[13,149233,44016],{},[10548,149235,43949],{"id":44019},[49,149237,149238,149249],{},[52,149239,44024,149240],{},[49,149241,149242],{},[52,149243,149244],{},[114,149245,149247],{"className":149246,"code":44032,"language":299},[297],[17,149248,44032],{"__ignoreMap":119},[52,149250,44037],{},[10548,149252,43986],{"id":44040},[114,149254,149255],{"className":33493,"code":44043,"language":33495,"meta":119,"style":119},[17,149256,149257,149261,149265],{"__ignoreMap":119},[78,149258,149259],{"class":124,"line":125},[78,149260,44050],{},[78,149262,149263],{"class":124,"line":132},[78,149264,44055],{},[78,149266,149267],{"class":124,"line":138},[78,149268,44060],{},[10548,149270,44064],{"id":44063},[49,149272,149273,149363,149403],{},[52,149274,44069,149275],{},[49,149276,149277,149281],{},[52,149278,44074,149279,44077],{},[2996,149280],{},[52,149282,149283,149291],{},[114,149284,149285],{"className":33493,"code":44082,"language":33495,"meta":119,"style":119},[17,149286,149287],{"__ignoreMap":119},[78,149288,149289],{"class":124,"line":125},[78,149290,44082],{},[8366,149292,149293,149301],{},[8369,149294,149295],{},[8372,149296,149297,149299],{},[8375,149298,44097],{},[8375,149300,9251],{},[8386,149302,149303,149309,149315,149321,149327,149333,149339,149345,149351,149357],{},[8372,149304,149305,149307],{},[8391,149306,44106],{},[8391,149308,44109],{},[8372,149310,149311,149313],{},[8391,149312,44114],{},[8391,149314,44117],{},[8372,149316,149317,149319],{},[8391,149318,44122],{},[8391,149320,44125],{},[8372,149322,149323,149325],{},[8391,149324,44130],{},[8391,149326,44133],{},[8372,149328,149329,149331],{},[8391,149330,44138],{},[8391,149332,44141],{},[8372,149334,149335,149337],{},[8391,149336,44146],{},[8391,149338,44149],{},[8372,149340,149341,149343],{},[8391,149342,44154],{},[8391,149344,44157],{},[8372,149346,149347,149349],{},[8391,149348,44162],{},[8391,149350,44165],{},[8372,149352,149353,149355],{},[8391,149354,44170],{},[8391,149356,44173],{},[8372,149358,149359,149361],{},[8391,149360,44178],{},[8391,149362,44181],{},[52,149364,44184,149365],{},[49,149366,149367,149369],{},[52,149368,44189],{},[52,149370,149371,149379],{},[114,149372,149373],{"className":33493,"code":44194,"language":33495,"meta":119,"style":119},[17,149374,149375],{"__ignoreMap":119},[78,149376,149377],{"class":124,"line":125},[78,149378,44194],{},[8366,149380,149381,149389],{},[8369,149382,149383],{},[8372,149384,149385,149387],{},[8375,149386,44097],{},[8375,149388,9251],{},[8386,149390,149391,149397],{},[8372,149392,149393,149395],{},[8391,149394,44106],{},[8391,149396,44109],{},[8372,149398,149399,149401],{},[8391,149400,44114],{},[8391,149402,44117],{},[52,149404,44227,149405],{},[49,149406,149407,149409],{},[52,149408,44232],{},[52,149410,149411,149419],{},[114,149412,149413],{"className":33493,"code":44237,"language":33495,"meta":119,"style":119},[17,149414,149415],{"__ignoreMap":119},[78,149416,149417],{"class":124,"line":125},[78,149418,44237],{},[8366,149420,149421,149429],{},[8369,149422,149423],{},[8372,149424,149425,149427],{},[8375,149426,44097],{},[8375,149428,9251],{},[8386,149430,149431,149437,149443,149449],{},[8372,149432,149433,149435],{},[8391,149434,44106],{},[8391,149436,44109],{},[8372,149438,149439,149441],{},[8391,149440,44114],{},[8391,149442,44117],{},[8372,149444,149445,149447],{},[8391,149446,44272],{},[8391,149448,44275],{},[8372,149450,149451,149453],{},[8391,149452,44280],{},[8391,149454,44283],{},[7759,149456,44287],{"id":44286},[13,149458,44290],{},[49,149460,149461],{},[52,149462,44295],{},[10548,149464,44299],{"id":44298},[13,149466,44302],{},[49,149468,149469,149479],{},[52,149470,44307,149471],{},[49,149472,149473,149475,149477],{},[52,149474,44312],{},[52,149476,44315],{},[52,149478,44318],{},[52,149480,44321,149481],{},[49,149482,149483],{},[52,149484,44326],{},[72,149486,149487],{},[13,149488,44331],{},[10548,149490,44335],{"id":44334},[114,149492,149493],{"className":44338,"code":44339,"language":44340,"meta":119,"style":119},[17,149494,149495,149499,149503,149507,149511,149515,149519,149523,149527,149531,149535,149539,149543,149547,149551,149555,149559,149563,149567,149571,149575],{"__ignoreMap":119},[78,149496,149497],{"class":124,"line":125},[78,149498,44347],{},[78,149500,149501],{"class":124,"line":132},[78,149502,44352],{},[78,149504,149505],{"class":124,"line":138},[78,149506,44357],{},[78,149508,149509],{"class":124,"line":144},[78,149510,44362],{},[78,149512,149513],{"class":124,"line":150},[78,149514,129],{"emptyLinePlaceholder":128},[78,149516,149517],{"class":124,"line":156},[78,149518,44371],{},[78,149520,149521],{"class":124,"line":162},[78,149522,44376],{},[78,149524,149525],{"class":124,"line":168},[78,149526,44381],{},[78,149528,149529],{"class":124,"line":174},[78,149530,44386],{},[78,149532,149533],{"class":124,"line":180},[78,149534,44391],{},[78,149536,149537],{"class":124,"line":186},[78,149538,44396],{},[78,149540,149541],{"class":124,"line":192},[78,149542,44401],{},[78,149544,149545],{"class":124,"line":198},[78,149546,129],{"emptyLinePlaceholder":128},[78,149548,149549],{"class":124,"line":204},[78,149550,44410],{},[78,149552,149553],{"class":124,"line":210},[78,149554,44415],{},[78,149556,149557],{"class":124,"line":216},[78,149558,44420],{},[78,149560,149561],{"class":124,"line":222},[78,149562,44425],{},[78,149564,149565],{"class":124,"line":421},[78,149566,44430],{},[78,149568,149569],{"class":124,"line":427},[78,149570,129],{"emptyLinePlaceholder":128},[78,149572,149573],{"class":124,"line":433},[78,149574,44439],{},[78,149576,149577],{"class":124,"line":2443},[78,149578,44444],{},[114,149580,149581],{"className":33493,"code":44447,"language":33495,"meta":119,"style":119},[17,149582,149583,149587],{"__ignoreMap":119},[78,149584,149585],{"class":124,"line":125},[78,149586,44454],{},[78,149588,149589],{"class":124,"line":132},[78,149590,44459],{},[7759,149592,44463],{"id":44462},[10548,149594,44466],{"id":44466},[49,149596,149597,149599,149601,149603],{},[52,149598,44471],{},[52,149600,44474],{},[52,149602,44477],{},[52,149604,44480,149605],{},[49,149606,149607,149609,149611],{},[52,149608,44485],{},[52,149610,44488],{},[52,149612,44491],{},[7759,149614,44495],{"id":44494},[13,149616,44498],{},[13,149618,44501],{},[10548,149620,43949],{"id":44504},[49,149622,149623,149695],{},[52,149624,44509,149625],{},[49,149626,149627,149673,149691],{},[52,149628,149629],{},[114,149630,149631],{"className":44516,"code":44517,"language":44518,"meta":119,"style":119},[17,149632,149633,149637,149641,149645,149649,149653,149657,149661,149665,149669],{"__ignoreMap":119},[78,149634,149635],{"class":124,"line":125},[78,149636,44525],{},[78,149638,149639],{"class":124,"line":132},[78,149640,129],{"emptyLinePlaceholder":128},[78,149642,149643],{"class":124,"line":138},[78,149644,44534],{},[78,149646,149647],{"class":124,"line":144},[78,149648,44539],{},[78,149650,149651],{"class":124,"line":150},[78,149652,44544],{},[78,149654,149655],{"class":124,"line":156},[78,149656,44549],{},[78,149658,149659],{"class":124,"line":162},[78,149660,44554],{},[78,149662,149663],{"class":124,"line":168},[78,149664,44559],{},[78,149666,149667],{"class":124,"line":174},[78,149668,44564],{},[78,149670,149671],{"class":124,"line":180},[78,149672,44569],{},[52,149674,44572,149675],{},[49,149676,149677,149683,149689],{},[52,149678,44577,149679,44580,149681,44583],{},[2996,149680],{},[2996,149682],{},[52,149684,44586,149685,44589,149687,44592],{},[2996,149686],{},[2996,149688],{},[52,149690,44595],{},[52,149692,149693],{},[22,149694,44600],{},[52,149696,44603,149697],{},[49,149698,149699,149701],{},[52,149700,44608],{},[52,149702,149703],{},[114,149704,149705],{"className":44613,"code":44614,"language":44615,"meta":119,"style":119},[17,149706,149707,149711,149715,149719,149723,149727,149731,149735,149739,149743,149747,149751],{"__ignoreMap":119},[78,149708,149709],{"class":124,"line":125},[78,149710,44622],{},[78,149712,149713],{"class":124,"line":132},[78,149714,44627],{},[78,149716,149717],{"class":124,"line":138},[78,149718,44632],{},[78,149720,149721],{"class":124,"line":144},[78,149722,44637],{},[78,149724,149725],{"class":124,"line":150},[78,149726,44642],{},[78,149728,149729],{"class":124,"line":156},[78,149730,44647],{},[78,149732,149733],{"class":124,"line":162},[78,149734,129],{"emptyLinePlaceholder":128},[78,149736,149737],{"class":124,"line":168},[78,149738,44656],{},[78,149740,149741],{"class":124,"line":174},[78,149742,44661],{},[78,149744,149745],{"class":124,"line":180},[78,149746,44666],{},[78,149748,149749],{"class":124,"line":186},[78,149750,44671],{},[78,149752,149753],{"class":124,"line":192},[78,149754,44676],{},[10548,149756,43986],{"id":44679},[114,149758,149759],{"className":33493,"code":44682,"language":33495,"meta":119,"style":119},[17,149760,149761,149765,149769,149773,149777],{"__ignoreMap":119},[78,149762,149763],{"class":124,"line":125},[78,149764,44689],{},[78,149766,149767],{"class":124,"line":132},[78,149768,44694],{},[78,149770,149771],{"class":124,"line":138},[78,149772,44699],{},[78,149774,149775],{"class":124,"line":144},[78,149776,129],{"emptyLinePlaceholder":128},[78,149778,149779],{"class":124,"line":150},[78,149780,44708],{},[49,149782,149783,149785],{},[52,149784,44713],{},[52,149786,44716,149787],{},[49,149788,149789,149791],{},[52,149790,44721],{},[52,149792,149793],{},[114,149794,149795],{"className":33493,"code":44726,"language":33495,"meta":119,"style":119},[17,149796,149797,149801],{"__ignoreMap":119},[78,149798,149799],{"class":124,"line":125},[78,149800,44733],{},[78,149802,149803],{"class":124,"line":132},[78,149804,44738],{},[7759,149806,44742],{"id":44741},[13,149808,44745,149809],{},[5009,149810,44748],{"href":44748,"rel":149811},[23647],[13,149813,44752],{},[10548,149815,43949],{"id":44755},[49,149817,149818],{},[52,149819,44760,149820],{},[49,149821,149822],{},[52,149823,149824],{},[114,149825,149826],{"className":33493,"code":44767,"language":33495,"meta":119,"style":119},[17,149827,149828,149832,149836,149840,149844,149848,149852,149856,149860,149864,149868,149872],{"__ignoreMap":119},[78,149829,149830],{"class":124,"line":125},[78,149831,44774],{},[78,149833,149834],{"class":124,"line":132},[78,149835,129],{"emptyLinePlaceholder":128},[78,149837,149838],{"class":124,"line":138},[78,149839,44783],{},[78,149841,149842],{"class":124,"line":144},[78,149843,44788],{},[78,149845,149846],{"class":124,"line":150},[78,149847,44793],{},[78,149849,149850],{"class":124,"line":156},[78,149851,44798],{},[78,149853,149854],{"class":124,"line":162},[78,149855,44803],{},[78,149857,149858],{"class":124,"line":168},[78,149859,44808],{},[78,149861,149862],{"class":124,"line":174},[78,149863,44813],{},[78,149865,149866],{"class":124,"line":180},[78,149867,44818],{},[78,149869,149870],{"class":124,"line":186},[78,149871,44823],{},[78,149873,149874],{"class":124,"line":192},[78,149875,44828],{},[10548,149877,44832],{"id":44831},[13,149879,44835],{},[13,149881,149882],{},[617,149883],{"alt":119,"src":44840},[10548,149885,44844],{"id":44843},[13,149887,44847],{},[8366,149889,149890,149898],{},[8369,149891,149892],{},[8372,149893,149894,149896],{},[8375,149895,44097],{},[8375,149897,42815],{},[8386,149899,149900,149906,149912,149918,149924],{},[8372,149901,149902,149904],{},[8391,149903,44864],{},[8391,149905,44867],{},[8372,149907,149908,149910],{},[8391,149909,44872],{},[8391,149911,44875],{},[8372,149913,149914,149916],{},[8391,149915,44880],{},[8391,149917,44883],{},[8372,149919,149920,149922],{},[8391,149921,44888],{},[8391,149923,44891],{},[8372,149925,149926,149928],{},[8391,149927,44896],{},[8391,149929,44899],{},[13,149931,149932],{},[22,149933,44904],{},[13,149935,44907],{},[13,149937,44910],{},[13,149939,44913],{},[13,149941,149942],{},[22,149943,44918],{},[13,149945,44921],{},[7759,149947,44925],{"id":44924},[13,149949,44928],{},[13,149951,44931],{},[10548,149953,44466],{"id":44934},[49,149955,149956,149958,149960,150202,150204,150214],{},[52,149957,44939],{},[52,149959,44942],{},[52,149961,44945,149962],{},[49,149963,149964],{},[52,149965,149966],{},[114,149967,149968],{"className":44952,"code":44953,"language":44954,"meta":119,"style":119},[17,149969,149970,149974,149978,149982,149986,149990,149994,149998,150002,150006,150010,150014,150018,150022,150026,150030,150034,150038,150042,150046,150050,150054,150058,150062,150066,150070,150074,150078,150082,150086,150090,150094,150098,150102,150106,150110,150114,150118,150122,150126,150130,150134,150138,150142,150146,150150,150154,150158,150162,150166,150170,150174,150178,150182,150186,150190,150194,150198],{"__ignoreMap":119},[78,149971,149972],{"class":124,"line":125},[78,149973,44961],{},[78,149975,149976],{"class":124,"line":132},[78,149977,44966],{},[78,149979,149980],{"class":124,"line":138},[78,149981,44971],{},[78,149983,149984],{"class":124,"line":144},[78,149985,44976],{},[78,149987,149988],{"class":124,"line":150},[78,149989,44981],{},[78,149991,149992],{"class":124,"line":156},[78,149993,44986],{},[78,149995,149996],{"class":124,"line":162},[78,149997,44991],{},[78,149999,150000],{"class":124,"line":168},[78,150001,129],{"emptyLinePlaceholder":128},[78,150003,150004],{"class":124,"line":174},[78,150005,44976],{},[78,150007,150008],{"class":124,"line":180},[78,150009,45004],{},[78,150011,150012],{"class":124,"line":186},[78,150013,45009],{},[78,150015,150016],{"class":124,"line":192},[78,150017,44991],{},[78,150019,150020],{"class":124,"line":198},[78,150021,129],{"emptyLinePlaceholder":128},[78,150023,150024],{"class":124,"line":204},[78,150025,44976],{},[78,150027,150028],{"class":124,"line":210},[78,150029,45026],{},[78,150031,150032],{"class":124,"line":216},[78,150033,45031],{},[78,150035,150036],{"class":124,"line":222},[78,150037,44991],{},[78,150039,150040],{"class":124,"line":421},[78,150041,129],{"emptyLinePlaceholder":128},[78,150043,150044],{"class":124,"line":427},[78,150045,44976],{},[78,150047,150048],{"class":124,"line":433},[78,150049,45048],{},[78,150051,150052],{"class":124,"line":2443},[78,150053,45053],{},[78,150055,150056],{"class":124,"line":2448},[78,150057,44991],{},[78,150059,150060],{"class":124,"line":2454},[78,150061,129],{"emptyLinePlaceholder":128},[78,150063,150064],{"class":124,"line":2460},[78,150065,44976],{},[78,150067,150068],{"class":124,"line":2465},[78,150069,45070],{},[78,150071,150072],{"class":124,"line":2470},[78,150073,45075],{},[78,150075,150076],{"class":124,"line":2903},[78,150077,44991],{},[78,150079,150080],{"class":124,"line":2909},[78,150081,129],{"emptyLinePlaceholder":128},[78,150083,150084],{"class":124,"line":11477},[78,150085,44976],{},[78,150087,150088],{"class":124,"line":13374},[78,150089,45092],{},[78,150091,150092],{"class":124,"line":13380},[78,150093,45097],{},[78,150095,150096],{"class":124,"line":13386},[78,150097,44991],{},[78,150099,150100],{"class":124,"line":13722},[78,150101,129],{"emptyLinePlaceholder":128},[78,150103,150104],{"class":124,"line":13727},[78,150105,44976],{},[78,150107,150108],{"class":124,"line":13953},[78,150109,45114],{},[78,150111,150112],{"class":124,"line":13958},[78,150113,45119],{},[78,150115,150116],{"class":124,"line":13964},[78,150117,44991],{},[78,150119,150120],{"class":124,"line":13969},[78,150121,129],{"emptyLinePlaceholder":128},[78,150123,150124],{"class":124,"line":24170},[78,150125,44976],{},[78,150127,150128],{"class":124,"line":24175},[78,150129,45136],{},[78,150131,150132],{"class":124,"line":24180},[78,150133,45141],{},[78,150135,150136],{"class":124,"line":24186},[78,150137,44991],{},[78,150139,150140],{"class":124,"line":24192},[78,150141,129],{"emptyLinePlaceholder":128},[78,150143,150144],{"class":124,"line":24198},[78,150145,44976],{},[78,150147,150148],{"class":124,"line":24204},[78,150149,45158],{},[78,150151,150152],{"class":124,"line":24210},[78,150153,45097],{},[78,150155,150156],{"class":124,"line":24215},[78,150157,44991],{},[78,150159,150160],{"class":124,"line":24220},[78,150161,6942],{},[78,150163,150164],{"class":124,"line":24226},[78,150165,44976],{},[78,150167,150168],{"class":124,"line":24232},[78,150169,45179],{},[78,150171,150172],{"class":124,"line":24238},[78,150173,45184],{},[78,150175,150176],{"class":124,"line":24244},[78,150177,44991],{},[78,150179,150180],{"class":124,"line":24250},[78,150181,129],{"emptyLinePlaceholder":128},[78,150183,150184],{"class":124,"line":24256},[78,150185,44976],{},[78,150187,150188],{"class":124,"line":24262},[78,150189,45201],{},[78,150191,150192],{"class":124,"line":24267},[78,150193,45184],{},[78,150195,150196],{"class":124,"line":24273},[78,150197,44991],{},[78,150199,150200],{"class":124,"line":24279},[78,150201,45214],{},[52,150203,45217],{},[52,150205,45220,150206],{},[114,150207,150208],{"className":33693,"code":45223,"language":33695,"meta":119,"style":119},[17,150209,150210],{"__ignoreMap":119},[78,150211,150212],{"class":124,"line":125},[78,150213,45223],{},[52,150215,45232,150216],{},[49,150217,150218,150220],{},[52,150219,45237],{},[52,150221,150222],{},[114,150223,150224],{"className":33693,"code":45242,"language":33695,"meta":119,"style":119},[17,150225,150226,150230],{"__ignoreMap":119},[78,150227,150228],{"class":124,"line":125},[78,150229,45249],{},[78,150231,150232],{"class":124,"line":132},[78,150233,45254],{},[7759,150235,45258],{"id":45257},[13,150237,45261],{},[10548,150239,45265],{"id":45264},[13,150241,45268],{},[13,150243,45271],{},[72,150245,150246,150248],{},[13,150247,45276],{},[13,150249,45279],{},[10548,150251,45283],{"id":45282},[49,150253,150254,150288,150342],{},[52,150255,45288,150256],{},[49,150257,150258],{},[52,150259,150260],{},[114,150261,150262],{"className":44338,"code":45295,"language":44340,"meta":119,"style":119},[17,150263,150264,150268,150272,150276,150280,150284],{"__ignoreMap":119},[78,150265,150266],{"class":124,"line":125},[78,150267,45302],{},[78,150269,150270],{"class":124,"line":132},[78,150271,45307],{},[78,150273,150274],{"class":124,"line":138},[78,150275,45312],{},[78,150277,150278],{"class":124,"line":144},[78,150279,45317],{},[78,150281,150282],{"class":124,"line":150},[78,150283,45322],{},[78,150285,150286],{"class":124,"line":156},[78,150287,45327],{},[52,150289,45330,150290],{},[49,150291,150292],{},[52,150293,150294],{},[114,150295,150296],{"className":44952,"code":45337,"language":44954,"meta":119,"style":119},[17,150297,150298,150302,150306,150310,150314,150318,150322,150326,150330,150334,150338],{"__ignoreMap":119},[78,150299,150300],{"class":124,"line":125},[78,150301,45344],{},[78,150303,150304],{"class":124,"line":132},[78,150305,45349],{},[78,150307,150308],{"class":124,"line":138},[78,150309,45354],{},[78,150311,150312],{"class":124,"line":144},[78,150313,45359],{},[78,150315,150316],{"class":124,"line":150},[78,150317,45364],{},[78,150319,150320],{"class":124,"line":156},[78,150321,35371],{},[78,150323,150324],{"class":124,"line":162},[78,150325,45373],{},[78,150327,150328],{"class":124,"line":168},[78,150329,45349],{},[78,150331,150332],{"class":124,"line":174},[78,150333,45382],{},[78,150335,150336],{"class":124,"line":180},[78,150337,45387],{},[78,150339,150340],{"class":124,"line":186},[78,150341,45364],{},[52,150343,45394,150344],{},[49,150345,150346,150348],{},[52,150347,45399],{},[52,150349,150350],{},[114,150351,150353],{"className":150352,"code":45405,"language":299},[297],[17,150354,45405],{"__ignoreMap":119},[7759,150356,45411],{"id":45410},[13,150358,45414],{},[10548,150360,45418],{"id":45417},[49,150362,150363,150367,150371,150375,150379,150383],{},[52,150364,150365,45425],{},[22,150366,43189],{},[52,150368,150369,45430],{},[22,150370,43202],{},[52,150372,150373,45436],{},[22,150374,45435],{},[52,150376,150377,45442],{},[22,150378,45441],{},[52,150380,150381,45448],{},[22,150382,45447],{},[52,150384,150385,45454],{},[22,150386,45453],{},[10548,150388,45458],{"id":45457},[49,150390,150391,150393,150395,150397,150399],{},[52,150392,45463],{},[52,150394,45466],{},[52,150396,45469],{},[52,150398,45472],{},[52,150400,45475],{},[10548,150402,45479],{"id":45478},[49,150404,150405,150675],{},[52,150406,45484,150407],{},[49,150408,150409],{},[52,150410,45489,150411],{},[114,150412,150413],{"className":44338,"code":45492,"language":44340,"meta":119,"style":119},[17,150414,150415,150419,150423,150427,150431,150435,150439,150443,150447,150451,150455,150459,150463,150467,150471,150475,150479,150483,150487,150491,150495,150499,150503,150507,150511,150515,150519,150523,150527,150531,150535,150539,150543,150547,150551,150555,150559,150563,150567,150571,150575,150579,150583,150587,150591,150595,150599,150603,150607,150611,150615,150619,150623,150627,150631,150635,150639,150643,150647,150651,150655,150659,150663,150667,150671],{"__ignoreMap":119},[78,150416,150417],{"class":124,"line":125},[78,150418,45499],{},[78,150420,150421],{"class":124,"line":132},[78,150422,45504],{},[78,150424,150425],{"class":124,"line":138},[78,150426,129],{"emptyLinePlaceholder":128},[78,150428,150429],{"class":124,"line":144},[78,150430,45513],{},[78,150432,150433],{"class":124,"line":150},[78,150434,45518],{},[78,150436,150437],{"class":124,"line":156},[78,150438,129],{"emptyLinePlaceholder":128},[78,150440,150441],{"class":124,"line":162},[78,150442,45527],{},[78,150444,150445],{"class":124,"line":168},[78,150446,45532],{},[78,150448,150449],{"class":124,"line":174},[78,150450,129],{"emptyLinePlaceholder":128},[78,150452,150453],{"class":124,"line":180},[78,150454,45541],{},[78,150456,150457],{"class":124,"line":186},[78,150458,45546],{},[78,150460,150461],{"class":124,"line":192},[78,150462,129],{"emptyLinePlaceholder":128},[78,150464,150465],{"class":124,"line":198},[78,150466,45555],{},[78,150468,150469],{"class":124,"line":204},[78,150470,45560],{},[78,150472,150473],{"class":124,"line":210},[78,150474,129],{"emptyLinePlaceholder":128},[78,150476,150477],{"class":124,"line":216},[78,150478,45569],{},[78,150480,150481],{"class":124,"line":222},[78,150482,45574],{},[78,150484,150485],{"class":124,"line":421},[78,150486,129],{"emptyLinePlaceholder":128},[78,150488,150489],{"class":124,"line":427},[78,150490,45583],{},[78,150492,150493],{"class":124,"line":433},[78,150494,45588],{},[78,150496,150497],{"class":124,"line":2443},[78,150498,129],{"emptyLinePlaceholder":128},[78,150500,150501],{"class":124,"line":2448},[78,150502,45597],{},[78,150504,150505],{"class":124,"line":2454},[78,150506,45602],{},[78,150508,150509],{"class":124,"line":2460},[78,150510,129],{"emptyLinePlaceholder":128},[78,150512,150513],{"class":124,"line":2465},[78,150514,45611],{},[78,150516,150517],{"class":124,"line":2470},[78,150518,45616],{},[78,150520,150521],{"class":124,"line":2903},[78,150522,129],{"emptyLinePlaceholder":128},[78,150524,150525],{"class":124,"line":2909},[78,150526,45625],{},[78,150528,150529],{"class":124,"line":11477},[78,150530,45630],{},[78,150532,150533],{"class":124,"line":13374},[78,150534,129],{"emptyLinePlaceholder":128},[78,150536,150537],{"class":124,"line":13380},[78,150538,45639],{},[78,150540,150541],{"class":124,"line":13386},[78,150542,45644],{},[78,150544,150545],{"class":124,"line":13722},[78,150546,129],{"emptyLinePlaceholder":128},[78,150548,150549],{"class":124,"line":13727},[78,150550,45653],{},[78,150552,150553],{"class":124,"line":13953},[78,150554,45658],{},[78,150556,150557],{"class":124,"line":13958},[78,150558,129],{"emptyLinePlaceholder":128},[78,150560,150561],{"class":124,"line":13964},[78,150562,45667],{},[78,150564,150565],{"class":124,"line":13969},[78,150566,45672],{},[78,150568,150569],{"class":124,"line":24170},[78,150570,129],{"emptyLinePlaceholder":128},[78,150572,150573],{"class":124,"line":24175},[78,150574,45681],{},[78,150576,150577],{"class":124,"line":24180},[78,150578,45686],{},[78,150580,150581],{"class":124,"line":24186},[78,150582,129],{"emptyLinePlaceholder":128},[78,150584,150585],{"class":124,"line":24192},[78,150586,45695],{},[78,150588,150589],{"class":124,"line":24198},[78,150590,45700],{},[78,150592,150593],{"class":124,"line":24204},[78,150594,129],{"emptyLinePlaceholder":128},[78,150596,150597],{"class":124,"line":24210},[78,150598,45709],{},[78,150600,150601],{"class":124,"line":24215},[78,150602,45714],{},[78,150604,150605],{"class":124,"line":24220},[78,150606,129],{"emptyLinePlaceholder":128},[78,150608,150609],{"class":124,"line":24226},[78,150610,45723],{},[78,150612,150613],{"class":124,"line":24232},[78,150614,45728],{},[78,150616,150617],{"class":124,"line":24238},[78,150618,129],{"emptyLinePlaceholder":128},[78,150620,150621],{"class":124,"line":24244},[78,150622,45737],{},[78,150624,150625],{"class":124,"line":24250},[78,150626,45742],{},[78,150628,150629],{"class":124,"line":24256},[78,150630,129],{"emptyLinePlaceholder":128},[78,150632,150633],{"class":124,"line":24262},[78,150634,45751],{},[78,150636,150637],{"class":124,"line":24267},[78,150638,45756],{},[78,150640,150641],{"class":124,"line":24273},[78,150642,129],{"emptyLinePlaceholder":128},[78,150644,150645],{"class":124,"line":24279},[78,150646,45765],{},[78,150648,150649],{"class":124,"line":24284},[78,150650,45770],{},[78,150652,150653],{"class":124,"line":24290},[78,150654,129],{"emptyLinePlaceholder":128},[78,150656,150657],{"class":124,"line":24296},[78,150658,45779],{},[78,150660,150661],{"class":124,"line":24302},[78,150662,45784],{},[78,150664,150665],{"class":124,"line":24308},[78,150666,129],{"emptyLinePlaceholder":128},[78,150668,150669],{"class":124,"line":24314},[78,150670,45793],{},[78,150672,150673],{"class":124,"line":24320},[78,150674,45798],{},[52,150676,45801,150677],{},[49,150678,150679,150689,150699,150713,150715],{},[52,150680,45806,150681],{},[114,150682,150683],{"className":33693,"code":45809,"language":33695,"meta":119,"style":119},[17,150684,150685],{"__ignoreMap":119},[78,150686,150687],{"class":124,"line":125},[78,150688,45809],{},[52,150690,45818,150691],{},[114,150692,150693],{"className":33693,"code":45821,"language":33695,"meta":119,"style":119},[17,150694,150695],{"__ignoreMap":119},[78,150696,150697],{"class":124,"line":125},[78,150698,45821],{},[52,150700,45830,150701],{},[114,150702,150703],{"className":33693,"code":45833,"language":33695,"meta":119,"style":119},[17,150704,150705,150709],{"__ignoreMap":119},[78,150706,150707],{"class":124,"line":125},[78,150708,45840],{},[78,150710,150711],{"class":124,"line":132},[78,150712,45845],{},[52,150714,45848],{},[52,150716,45851,150717],{},[114,150718,150719],{"className":33493,"code":45854,"language":33495,"meta":119,"style":119},[17,150720,150721],{"__ignoreMap":119},[78,150722,150723],{"class":124,"line":125},[78,150724,45854],{},[10548,150726,45864],{"id":45863},[114,150728,150729],{"className":33493,"code":45867,"language":33495,"meta":119,"style":119},[17,150730,150731,150735,150739,150743,150747,150751,150755,150759,150763,150767,150771,150775,150779,150783,150787,150791,150795,150799,150803,150807,150811,150815,150819],{"__ignoreMap":119},[78,150732,150733],{"class":124,"line":125},[78,150734,45874],{},[78,150736,150737],{"class":124,"line":132},[78,150738,45879],{},[78,150740,150741],{"class":124,"line":138},[78,150742,45884],{},[78,150744,150745],{"class":124,"line":144},[78,150746,129],{"emptyLinePlaceholder":128},[78,150748,150749],{"class":124,"line":150},[78,150750,45893],{},[78,150752,150753],{"class":124,"line":156},[78,150754,45898],{},[78,150756,150757],{"class":124,"line":162},[78,150758,45903],{},[78,150760,150761],{"class":124,"line":168},[78,150762,129],{"emptyLinePlaceholder":128},[78,150764,150765],{"class":124,"line":174},[78,150766,45912],{},[78,150768,150769],{"class":124,"line":180},[78,150770,45917],{},[78,150772,150773],{"class":124,"line":186},[78,150774,45922],{},[78,150776,150777],{"class":124,"line":192},[78,150778,129],{"emptyLinePlaceholder":128},[78,150780,150781],{"class":124,"line":198},[78,150782,45931],{},[78,150784,150785],{"class":124,"line":204},[78,150786,45936],{},[78,150788,150789],{"class":124,"line":210},[78,150790,45941],{},[78,150792,150793],{"class":124,"line":216},[78,150794,129],{"emptyLinePlaceholder":128},[78,150796,150797],{"class":124,"line":222},[78,150798,45950],{},[78,150800,150801],{"class":124,"line":421},[78,150802,45955],{},[78,150804,150805],{"class":124,"line":427},[78,150806,45960],{},[78,150808,150809],{"class":124,"line":433},[78,150810,129],{"emptyLinePlaceholder":128},[78,150812,150813],{"class":124,"line":2443},[78,150814,45969],{},[78,150816,150817],{"class":124,"line":2448},[78,150818,45974],{},[78,150820,150821],{"class":124,"line":2454},[78,150822,45979],{},[72,150824,150825],{},[13,150826,45984],{},[7759,150828,45988],{"id":45987},[72,150830,150831],{},[13,150832,45993],{},[10548,150834,45997],{"id":45996},[49,150836,150837,150839,150849,150859,150869,150879,150886,150888,150898],{},[52,150838,46002],{},[52,150840,46005,150841],{},[49,150842,150843,150845],{},[52,150844,46010],{},[52,150846,46013,150847,46017],{},[22,150848,46016],{},[52,150850,46020,150851],{},[114,150852,150853],{"className":33493,"code":46023,"language":33495,"meta":119,"style":119},[17,150854,150855],{"__ignoreMap":119},[78,150856,150857],{"class":124,"line":125},[78,150858,46023],{},[52,150860,46032,150861],{},[114,150862,150863],{"className":33493,"code":46035,"language":33495,"meta":119,"style":119},[17,150864,150865],{"__ignoreMap":119},[78,150866,150867],{"class":124,"line":125},[78,150868,46035],{},[52,150870,46044,150871],{},[114,150872,150873],{"className":33493,"code":46047,"language":33495,"meta":119,"style":119},[17,150874,150875],{"__ignoreMap":119},[78,150876,150877],{"class":124,"line":125},[78,150878,46047],{},[52,150880,46056,150881],{},[114,150882,150884],{"className":150883,"code":46060,"language":299},[297],[17,150885,46060],{"__ignoreMap":119},[52,150887,46065],{},[52,150889,46068,150890],{},[114,150891,150892],{"className":33493,"code":46071,"language":33495,"meta":119,"style":119},[17,150893,150894],{"__ignoreMap":119},[78,150895,150896],{"class":124,"line":125},[78,150897,46071],{},[52,150899,46080,150900],{},[114,150901,150902],{"className":33493,"code":46083,"language":33495,"meta":119,"style":119},[17,150903,150904],{"__ignoreMap":119},[78,150905,150906],{"class":124,"line":125},[78,150907,46083],{},[10548,150909,43986],{"id":46092},[114,150911,150912],{"className":33493,"code":46095,"language":33495,"meta":119,"style":119},[17,150913,150914,150918,150922,150926,150930,150934],{"__ignoreMap":119},[78,150915,150916],{"class":124,"line":125},[78,150917,46102],{},[78,150919,150920],{"class":124,"line":132},[78,150921,46107],{},[78,150923,150924],{"class":124,"line":138},[78,150925,46112],{},[78,150927,150928],{"class":124,"line":144},[78,150929,46117],{},[78,150931,150932],{"class":124,"line":150},[78,150933,46122],{},[78,150935,150936],{"class":124,"line":156},[78,150937,46127],{},[10548,150939,46131],{"id":46130},[114,150941,150942],{"className":33493,"code":46134,"language":33495,"meta":119,"style":119},[17,150943,150944],{"__ignoreMap":119},[78,150945,150946],{"class":124,"line":125},[78,150947,46134],{},[13,150949,150950],{},[22,150951,46145],{},[13,150953,150954],{},[5009,150955,46150],{"href":46150,"rel":150956},[23647],[226,150958,228],{},{"title":119,"searchDepth":144,"depth":144,"links":150960},[150961,150966],{"id":42738,"depth":132,"text":42739,"children":150962},[150963,150964,150965],{"id":42745,"depth":144,"text":42746},{"id":42796,"depth":144,"text":42797},{"id":42951,"depth":144,"text":42952},{"id":43251,"depth":132,"text":43252,"children":150967},[150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982],{"id":43255,"depth":144,"text":43256},{"id":43279,"depth":144,"text":43280},{"id":43286,"depth":144,"text":43287},{"id":43322,"depth":144,"text":43323},{"id":43427,"depth":144,"text":43428},{"id":43941,"depth":144,"text":43942},{"id":44009,"depth":144,"text":44010},{"id":44286,"depth":144,"text":44287},{"id":44462,"depth":144,"text":44463},{"id":44494,"depth":144,"text":44495},{"id":44741,"depth":144,"text":44742},{"id":44924,"depth":144,"text":44925},{"id":45257,"depth":144,"text":45258},{"id":45410,"depth":144,"text":45411},{"id":45987,"depth":144,"text":45988},{},{"title":42733,"description":119},[23378,10715,6380],{"id":46186,"title":46187,"assetBase":239,"author":8,"body":150987,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":152307,"navigation":128,"originalPath":47832,"path":47833,"seo":152308,"source":23330,"stem":47835,"tags":152309,"weight":250,"__hash__":47837},{"type":10,"value":150988,"toc":152287},[150989,150991,150997,150999,151011,151013,151015,151017,151019,151021,151027,151095,151099,151147,151151,151287,151289,151291,151293,151297,151301,151303,151305,151405,151407,151409,151414,151419,151424,151426,151428,151430,151432,151434,151436,151441,151443,151447,151449,151451,151453,151455,151457,151459,151461,151505,151509,151511,151513,151515,151517,151519,151521,151523,151667,151669,151675,151679,151693,151695,151697,151733,151735,151737,151739,151741,151757,151763,151769,151785,151787,151803,151805,151807,151817,151819,151935,151937,151939,151941,151943,151949,152001,152003,152007,152063,152065,152069,152077,152079,152081,152083,152085,152117,152119,152121,152123,152125,152129,152133,152135,152137,152141,152145,152147,152149,152153,152155,152159,152161,152163,152165,152201,152203,152271,152273,152275,152277,152279,152281,152283,152285],[4517,150990,46193],{"id":46192},[72,150992,150993,150995],{},[13,150994,23957],{},[13,150996,46200],{},[107,150998,46204],{"id":46203},[49,151000,151001,151003,151005,151007],{},[52,151002,46209],{},[52,151004,46212],{},[52,151006,46215],{},[52,151008,46218,151009],{},[25921,151010,46221],{},[23289,151012],{},[107,151014,46227],{"id":46226},[13,151016,46230],{},[7759,151018,46234],{"id":46233},[13,151020,46237],{},[49,151022,151023],{},[52,151024,151025,46245],{},[22,151026,46244],{},[114,151028,151029],{"className":116,"code":46248,"language":118,"meta":119,"style":119},[17,151030,151031,151035,151039,151043,151047,151051,151055,151059,151063,151067,151071,151075,151079,151083,151087,151091],{"__ignoreMap":119},[78,151032,151033],{"class":124,"line":125},[78,151034,46255],{},[78,151036,151037],{"class":124,"line":132},[78,151038,46260],{},[78,151040,151041],{"class":124,"line":138},[78,151042,46265],{},[78,151044,151045],{"class":124,"line":144},[78,151046,46270],{},[78,151048,151049],{"class":124,"line":150},[78,151050,46275],{},[78,151052,151053],{"class":124,"line":156},[78,151054,129],{"emptyLinePlaceholder":128},[78,151056,151057],{"class":124,"line":162},[78,151058,46284],{},[78,151060,151061],{"class":124,"line":168},[78,151062,46289],{},[78,151064,151065],{"class":124,"line":174},[78,151066,46294],{},[78,151068,151069],{"class":124,"line":180},[78,151070,129],{"emptyLinePlaceholder":128},[78,151072,151073],{"class":124,"line":186},[78,151074,46303],{},[78,151076,151077],{"class":124,"line":192},[78,151078,46308],{},[78,151080,151081],{"class":124,"line":198},[78,151082,46313],{},[78,151084,151085],{"class":124,"line":204},[78,151086,46318],{},[78,151088,151089],{"class":124,"line":210},[78,151090,129],{"emptyLinePlaceholder":128},[78,151092,151093],{"class":124,"line":216},[78,151094,46327],{},[49,151096,151097],{},[52,151098,46332],{},[114,151100,151101],{"className":46335,"code":46336,"language":46337,"meta":119,"style":119},[17,151102,151103,151107,151111,151115,151119,151123,151127,151131,151135,151139,151143],{"__ignoreMap":119},[78,151104,151105],{"class":124,"line":125},[78,151106,46344],{},[78,151108,151109],{"class":124,"line":132},[78,151110,46349],{},[78,151112,151113],{"class":124,"line":138},[78,151114,46354],{},[78,151116,151117],{"class":124,"line":144},[78,151118,46359],{},[78,151120,151121],{"class":124,"line":150},[78,151122,46364],{},[78,151124,151125],{"class":124,"line":156},[78,151126,46369],{},[78,151128,151129],{"class":124,"line":162},[78,151130,46374],{},[78,151132,151133],{"class":124,"line":168},[78,151134,46379],{},[78,151136,151137],{"class":124,"line":174},[78,151138,46384],{},[78,151140,151141],{"class":124,"line":180},[78,151142,46389],{},[78,151144,151145],{"class":124,"line":186},[78,151146,46394],{},[49,151148,151149],{},[52,151150,46399],{},[114,151152,151153],{"className":46335,"code":46402,"language":46337,"meta":119,"style":119},[17,151154,151155,151159,151163,151167,151171,151175,151179,151183,151187,151191,151195,151199,151203,151207,151211,151215,151219,151223,151227,151231,151235,151239,151243,151247,151251,151255,151259,151263,151267,151271,151275,151279,151283],{"__ignoreMap":119},[78,151156,151157],{"class":124,"line":125},[78,151158,46409],{},[78,151160,151161],{"class":124,"line":132},[78,151162,129],{"emptyLinePlaceholder":128},[78,151164,151165],{"class":124,"line":138},[78,151166,46418],{},[78,151168,151169],{"class":124,"line":144},[78,151170,46423],{},[78,151172,151173],{"class":124,"line":150},[78,151174,46428],{},[78,151176,151177],{"class":124,"line":156},[78,151178,46433],{},[78,151180,151181],{"class":124,"line":162},[78,151182,46438],{},[78,151184,151185],{"class":124,"line":168},[78,151186,46443],{},[78,151188,151189],{"class":124,"line":174},[78,151190,46448],{},[78,151192,151193],{"class":124,"line":180},[78,151194,46453],{},[78,151196,151197],{"class":124,"line":186},[78,151198,46458],{},[78,151200,151201],{"class":124,"line":192},[78,151202,46463],{},[78,151204,151205],{"class":124,"line":198},[78,151206,46468],{},[78,151208,151209],{"class":124,"line":204},[78,151210,46473],{},[78,151212,151213],{"class":124,"line":210},[78,151214,46478],{},[78,151216,151217],{"class":124,"line":216},[78,151218,46483],{},[78,151220,151221],{"class":124,"line":222},[78,151222,129],{"emptyLinePlaceholder":128},[78,151224,151225],{"class":124,"line":421},[78,151226,46492],{},[78,151228,151229],{"class":124,"line":427},[78,151230,129],{"emptyLinePlaceholder":128},[78,151232,151233],{"class":124,"line":433},[78,151234,46501],{},[78,151236,151237],{"class":124,"line":2443},[78,151238,46506],{},[78,151240,151241],{"class":124,"line":2448},[78,151242,129],{"emptyLinePlaceholder":128},[78,151244,151245],{"class":124,"line":2454},[78,151246,46515],{},[78,151248,151249],{"class":124,"line":2460},[78,151250,46520],{},[78,151252,151253],{"class":124,"line":2465},[78,151254,46525],{},[78,151256,151257],{"class":124,"line":2470},[78,151258,46530],{},[78,151260,151261],{"class":124,"line":2903},[78,151262,46535],{},[78,151264,151265],{"class":124,"line":2909},[78,151266,129],{"emptyLinePlaceholder":128},[78,151268,151269],{"class":124,"line":11477},[78,151270,46544],{},[78,151272,151273],{"class":124,"line":13374},[78,151274,129],{"emptyLinePlaceholder":128},[78,151276,151277],{"class":124,"line":13380},[78,151278,46553],{},[78,151280,151281],{"class":124,"line":13386},[78,151282,46558],{},[78,151284,151285],{"class":124,"line":13722},[78,151286,46563],{},[13,151288,46566],{},[7759,151290,46570],{"id":46569},[13,151292,46573],{},[13,151294,151295],{},[617,151296],{"alt":119,"src":46578},[13,151298,151299],{},[617,151300],{"alt":119,"src":46583},[13,151302,46586],{},[13,151304,46589],{},[114,151306,151307],{"className":116,"code":46592,"language":118,"meta":119,"style":119},[17,151308,151309,151313,151317,151321,151325,151329,151333,151337,151341,151345,151349,151353,151357,151361,151365,151369,151373,151377,151381,151385,151389,151393,151397,151401],{"__ignoreMap":119},[78,151310,151311],{"class":124,"line":125},[78,151312,46599],{},[78,151314,151315],{"class":124,"line":132},[78,151316,46604],{},[78,151318,151319],{"class":124,"line":138},[78,151320,129],{"emptyLinePlaceholder":128},[78,151322,151323],{"class":124,"line":144},[78,151324,46613],{},[78,151326,151327],{"class":124,"line":150},[78,151328,46618],{},[78,151330,151331],{"class":124,"line":156},[78,151332,46623],{},[78,151334,151335],{"class":124,"line":162},[78,151336,129],{"emptyLinePlaceholder":128},[78,151338,151339],{"class":124,"line":168},[78,151340,46632],{},[78,151342,151343],{"class":124,"line":174},[78,151344,46637],{},[78,151346,151347],{"class":124,"line":180},[78,151348,46642],{},[78,151350,151351],{"class":124,"line":186},[78,151352,46647],{},[78,151354,151355],{"class":124,"line":192},[78,151356,46652],{},[78,151358,151359],{"class":124,"line":198},[78,151360,46657],{},[78,151362,151363],{"class":124,"line":204},[78,151364,129],{"emptyLinePlaceholder":128},[78,151366,151367],{"class":124,"line":210},[78,151368,46666],{},[78,151370,151371],{"class":124,"line":216},[78,151372,46671],{},[78,151374,151375],{"class":124,"line":222},[78,151376,46676],{},[78,151378,151379],{"class":124,"line":421},[78,151380,46681],{},[78,151382,151383],{"class":124,"line":427},[78,151384,46686],{},[78,151386,151387],{"class":124,"line":433},[78,151388,46691],{},[78,151390,151391],{"class":124,"line":2443},[78,151392,129],{"emptyLinePlaceholder":128},[78,151394,151395],{"class":124,"line":2448},[78,151396,46700],{},[78,151398,151399],{"class":124,"line":2454},[78,151400,46705],{},[78,151402,151403],{"class":124,"line":2460},[78,151404,46710],{},[10548,151406,46714],{"id":46713},[13,151408,46717],{},[13,151410,46720,151411],{},[5009,151412,46725],{"href":46723,"rel":151413},[23647],[13,151415,46728,151416],{},[5009,151417,46733],{"href":46731,"rel":151418},[23647],[13,151420,46736,151421,46742],{},[5009,151422,46741],{"href":46739,"rel":151423},[23647],[23289,151425],{},[107,151427,46748],{"id":46747},[7759,151429,46752],{"id":46751},[13,151431,46755],{},[13,151433,46758],{},[7759,151435,46762],{"id":46761},[13,151437,46765,151438],{},[5009,151439,46769],{"href":23972,"rel":151440},[23647],[13,151442,46772],{},[13,151444,151445],{},[617,151446],{"alt":119,"src":46777},[13,151448,46780],{},[13,151450,46783],{},[13,151452,46786],{},[13,151454,46789],{},[13,151456,46792],{},[7759,151458,46796],{"id":46795},[13,151460,46799],{},[114,151462,151463],{"className":46802,"code":46803,"language":46804,"meta":119,"style":119},[17,151464,151465,151469,151473,151477,151481,151485,151489,151493,151497,151501],{"__ignoreMap":119},[78,151466,151467],{"class":124,"line":125},[78,151468,46811],{},[78,151470,151471],{"class":124,"line":132},[78,151472,129],{"emptyLinePlaceholder":128},[78,151474,151475],{"class":124,"line":138},[78,151476,46820],{},[78,151478,151479],{"class":124,"line":144},[78,151480,46825],{},[78,151482,151483],{"class":124,"line":150},[78,151484,46830],{},[78,151486,151487],{"class":124,"line":156},[78,151488,46835],{},[78,151490,151491],{"class":124,"line":162},[78,151492,129],{"emptyLinePlaceholder":128},[78,151494,151495],{"class":124,"line":168},[78,151496,46844],{},[78,151498,151499],{"class":124,"line":174},[78,151500,46849],{},[78,151502,151503],{"class":124,"line":180},[78,151504,46854],{},[13,151506,46857,151507,46861],{},[22,151508,46860],{},[23289,151510],{},[107,151512,46867],{"id":46866},[13,151514,46870],{},[13,151516,46873],{},[7759,151518,46877],{"id":46876},[13,151520,46880],{},[13,151522,46883],{},[114,151524,151525],{"className":116,"code":46886,"language":118,"meta":119,"style":119},[17,151526,151527,151531,151535,151539,151543,151547,151551,151555,151559,151563,151567,151571,151575,151579,151583,151587,151591,151595,151599,151603,151607,151611,151615,151619,151623,151627,151631,151635,151639,151643,151647,151651,151655,151659,151663],{"__ignoreMap":119},[78,151528,151529],{"class":124,"line":125},[78,151530,46893],{},[78,151532,151533],{"class":124,"line":132},[78,151534,46898],{},[78,151536,151537],{"class":124,"line":138},[78,151538,129],{"emptyLinePlaceholder":128},[78,151540,151541],{"class":124,"line":144},[78,151542,46907],{},[78,151544,151545],{"class":124,"line":150},[78,151546,46912],{},[78,151548,151549],{"class":124,"line":156},[78,151550,129],{"emptyLinePlaceholder":128},[78,151552,151553],{"class":124,"line":162},[78,151554,46921],{},[78,151556,151557],{"class":124,"line":168},[78,151558,46926],{},[78,151560,151561],{"class":124,"line":174},[78,151562,129],{"emptyLinePlaceholder":128},[78,151564,151565],{"class":124,"line":180},[78,151566,46935],{},[78,151568,151569],{"class":124,"line":186},[78,151570,46940],{},[78,151572,151573],{"class":124,"line":192},[78,151574,129],{"emptyLinePlaceholder":128},[78,151576,151577],{"class":124,"line":198},[78,151578,46949],{},[78,151580,151581],{"class":124,"line":204},[78,151582,46954],{},[78,151584,151585],{"class":124,"line":210},[78,151586,46959],{},[78,151588,151589],{"class":124,"line":216},[78,151590,7818],{},[78,151592,151593],{"class":124,"line":222},[78,151594,129],{"emptyLinePlaceholder":128},[78,151596,151597],{"class":124,"line":421},[78,151598,46972],{},[78,151600,151601],{"class":124,"line":427},[78,151602,46977],{},[78,151604,151605],{"class":124,"line":433},[78,151606,46959],{},[78,151608,151609],{"class":124,"line":2443},[78,151610,7818],{},[78,151612,151613],{"class":124,"line":2448},[78,151614,129],{"emptyLinePlaceholder":128},[78,151616,151617],{"class":124,"line":2454},[78,151618,46994],{},[78,151620,151621],{"class":124,"line":2460},[78,151622,46999],{},[78,151624,151625],{"class":124,"line":2465},[78,151626,47004],{},[78,151628,151629],{"class":124,"line":2470},[78,151630,47009],{},[78,151632,151633],{"class":124,"line":2903},[78,151634,47014],{},[78,151636,151637],{"class":124,"line":2909},[78,151638,47019],{},[78,151640,151641],{"class":124,"line":11477},[78,151642,47024],{},[78,151644,151645],{"class":124,"line":13374},[78,151646,47029],{},[78,151648,151649],{"class":124,"line":13380},[78,151650,47034],{},[78,151652,151653],{"class":124,"line":13386},[78,151654,47039],{},[78,151656,151657],{"class":124,"line":13722},[78,151658,47044],{},[78,151660,151661],{"class":124,"line":13727},[78,151662,47049],{},[78,151664,151665],{"class":124,"line":13953},[78,151666,46994],{},[13,151668,47056],{},[13,151670,47059,151671,47063,151673,47066],{},[17,151672,47062],{},[17,151674,47062],{},[13,151676,47069,151677,47073],{},[17,151678,47072],{},[49,151680,151681,151685,151689],{},[52,151682,151683,47081],{},[17,151684,47080],{},[52,151686,151687,47087],{},[17,151688,47086],{},[52,151690,151691,47093],{},[17,151692,47092],{},[13,151694,47096],{},[13,151696,47099],{},[114,151698,151699],{"className":116,"code":47102,"language":118,"meta":119,"style":119},[17,151700,151701,151705,151709,151713,151717,151721,151725,151729],{"__ignoreMap":119},[78,151702,151703],{"class":124,"line":125},[78,151704,23224],{},[78,151706,151707],{"class":124,"line":132},[78,151708,47113],{},[78,151710,151711],{"class":124,"line":138},[78,151712,47118],{},[78,151714,151715],{"class":124,"line":144},[78,151716,47123],{},[78,151718,151719],{"class":124,"line":150},[78,151720,129],{"emptyLinePlaceholder":128},[78,151722,151723],{"class":124,"line":156},[78,151724,47132],{},[78,151726,151727],{"class":124,"line":162},[78,151728,47137],{},[78,151730,151731],{"class":124,"line":168},[78,151732,47142],{},[13,151734,47145],{},[7759,151736,47149],{"id":47148},[10548,151738,47153],{"id":47152},[13,151740,47156],{},[114,151742,151743],{"className":116,"code":47159,"language":118,"meta":119,"style":119},[17,151744,151745,151749,151753],{"__ignoreMap":119},[78,151746,151747],{"class":124,"line":125},[78,151748,47166],{},[78,151750,151751],{"class":124,"line":132},[78,151752,47171],{},[78,151754,151755],{"class":124,"line":138},[78,151756,47176],{},[13,151758,47179,151759,47183,151761,47187],{},[17,151760,47182],{},[17,151762,47186],{},[13,151764,47190,151765,47193,151767,47197],{},[17,151766,47186],{},[17,151768,47196],{},[114,151770,151771],{"className":116,"code":47200,"language":118,"meta":119,"style":119},[17,151772,151773,151777,151781],{"__ignoreMap":119},[78,151774,151775],{"class":124,"line":125},[78,151776,7771],{},[78,151778,151779],{"class":124,"line":132},[78,151780,47211],{},[78,151782,151783],{"class":124,"line":138},[78,151784,47216],{},[13,151786,47219],{},[114,151788,151789],{"className":116,"code":47222,"language":118,"meta":119,"style":119},[17,151790,151791,151795,151799],{"__ignoreMap":119},[78,151792,151793],{"class":124,"line":125},[78,151794,46618],{},[78,151796,151797],{"class":124,"line":132},[78,151798,47233],{},[78,151800,151801],{"class":124,"line":138},[78,151802,47176],{},[13,151804,47240],{},[10548,151806,47244],{"id":47243},[72,151808,151809,151811,151813,151815],{},[13,151810,47249],{},[13,151812,47252],{},[13,151814,47255],{},[13,151816,47258],{},[13,151818,47261],{},[114,151820,151821],{"className":116,"code":47264,"language":118,"meta":119,"style":119},[17,151822,151823,151827,151831,151835,151839,151843,151847,151851,151855,151859,151863,151867,151871,151875,151879,151883,151887,151891,151895,151899,151903,151907,151911,151915,151919,151923,151927,151931],{"__ignoreMap":119},[78,151824,151825],{"class":124,"line":125},[78,151826,24004],{},[78,151828,151829],{"class":124,"line":132},[78,151830,47275],{},[78,151832,151833],{"class":124,"line":138},[78,151834,24042],{},[78,151836,151837],{"class":124,"line":144},[78,151838,24047],{},[78,151840,151841],{"class":124,"line":150},[78,151842,24052],{},[78,151844,151845],{"class":124,"line":156},[78,151846,24057],{},[78,151848,151849],{"class":124,"line":162},[78,151850,24062],{},[78,151852,151853],{"class":124,"line":168},[78,151854,24067],{},[78,151856,151857],{"class":124,"line":174},[78,151858,23518],{},[78,151860,151861],{"class":124,"line":180},[78,151862,129],{"emptyLinePlaceholder":128},[78,151864,151865],{"class":124,"line":186},[78,151866,24132],{},[78,151868,151869],{"class":124,"line":192},[78,151870,24137],{},[78,151872,151873],{"class":124,"line":198},[78,151874,24142],{},[78,151876,151877],{"class":124,"line":204},[78,151878,24147],{},[78,151880,151881],{"class":124,"line":210},[78,151882,24152],{},[78,151884,151885],{"class":124,"line":216},[78,151886,24157],{},[78,151888,151889],{"class":124,"line":222},[78,151890,24162],{},[78,151892,151893],{"class":124,"line":421},[78,151894,24167],{},[78,151896,151897],{"class":124,"line":427},[78,151898,129],{"emptyLinePlaceholder":128},[78,151900,151901],{"class":124,"line":433},[78,151902,47348],{},[78,151904,151905],{"class":124,"line":2443},[78,151906,47353],{},[78,151908,151909],{"class":124,"line":2448},[78,151910,129],{"emptyLinePlaceholder":128},[78,151912,151913],{"class":124,"line":2454},[78,151914,46994],{},[78,151916,151917],{"class":124,"line":2460},[78,151918,47366],{},[78,151920,151921],{"class":124,"line":2465},[78,151922,47371],{},[78,151924,151925],{"class":124,"line":2470},[78,151926,47376],{},[78,151928,151929],{"class":124,"line":2903},[78,151930,47381],{},[78,151932,151933],{"class":124,"line":2909},[78,151934,46994],{},[13,151936,47388],{},[7759,151938,47392],{"id":47391},[13,151940,47395],{},[13,151942,47398],{},[49,151944,151945,151947],{},[52,151946,47403],{},[52,151948,47406],{},[114,151950,151951],{"className":116,"code":47409,"language":118,"meta":119,"style":119},[17,151952,151953,151957,151961,151965,151969,151973,151977,151981,151985,151989,151993,151997],{"__ignoreMap":119},[78,151954,151955],{"class":124,"line":125},[78,151956,24014],{},[78,151958,151959],{"class":124,"line":132},[78,151960,24009],{},[78,151962,151963],{"class":124,"line":138},[78,151964,47424],{},[78,151966,151967],{"class":124,"line":144},[78,151968,24089],{},[78,151970,151971],{"class":124,"line":150},[78,151972,47433],{},[78,151974,151975],{"class":124,"line":156},[78,151976,24099],{},[78,151978,151979],{"class":124,"line":162},[78,151980,47442],{},[78,151982,151983],{"class":124,"line":168},[78,151984,24104],{},[78,151986,151987],{"class":124,"line":174},[78,151988,47451],{},[78,151990,151991],{"class":124,"line":180},[78,151992,24119],{},[78,151994,151995],{"class":124,"line":186},[78,151996,129],{"emptyLinePlaceholder":128},[78,151998,151999],{"class":124,"line":192},[78,152000,47464],{},[13,152002,47467],{},[49,152004,152005],{},[52,152006,47472],{},[114,152008,152009],{"className":116,"code":47475,"language":118,"meta":119,"style":119},[17,152010,152011,152015,152019,152023,152027,152031,152035,152039,152043,152047,152051,152055,152059],{"__ignoreMap":119},[78,152012,152013],{"class":124,"line":125},[78,152014,24019],{},[78,152016,152017],{"class":124,"line":132},[78,152018,47486],{},[78,152020,152021],{"class":124,"line":138},[78,152022,24183],{},[78,152024,152025],{"class":124,"line":144},[78,152026,47495],{},[78,152028,152029],{"class":124,"line":150},[78,152030,24195],{},[78,152032,152033],{"class":124,"line":156},[78,152034,47504],{},[78,152036,152037],{"class":124,"line":162},[78,152038,24201],{},[78,152040,152041],{"class":124,"line":168},[78,152042,24207],{},[78,152044,152045],{"class":124,"line":174},[78,152046,47517],{},[78,152048,152049],{"class":124,"line":180},[78,152050,24229],{},[78,152052,152053],{"class":124,"line":186},[78,152054,47526],{},[78,152056,152057],{"class":124,"line":192},[78,152058,24247],{},[78,152060,152061],{"class":124,"line":198},[78,152062,24259],{},[13,152064,47537],{},[49,152066,152067],{},[52,152068,47542],{},[114,152070,152071],{"className":116,"code":47545,"language":118,"meta":119,"style":119},[17,152072,152073],{"__ignoreMap":119},[78,152074,152075],{"class":124,"line":125},[78,152076,47545],{},[13,152078,47554],{},[7759,152080,47558],{"id":47557},[13,152082,47561],{},[13,152084,47564],{},[114,152086,152087],{"className":116,"code":47567,"language":118,"meta":119,"style":119},[17,152088,152089,152093,152097,152101,152105,152109,152113],{"__ignoreMap":119},[78,152090,152091],{"class":124,"line":125},[78,152092,47574],{},[78,152094,152095],{"class":124,"line":132},[78,152096,24293],{},[78,152098,152099],{"class":124,"line":138},[78,152100,24299],{},[78,152102,152103],{"class":124,"line":144},[78,152104,47587],{},[78,152106,152107],{"class":124,"line":150},[78,152108,24305],{},[78,152110,152111],{"class":124,"line":156},[78,152112,24311],{},[78,152114,152115],{"class":124,"line":162},[78,152116,8041],{},[13,152118,47602],{},[13,152120,47605],{},[13,152122,47608],{},[13,152124,47611],{},[49,152126,152127],{},[52,152128,47616],{},[13,152130,152131],{},[617,152132],{"alt":119,"src":47621},[13,152134,47624],{},[13,152136,47627],{},[49,152138,152139],{},[52,152140,47632],{},[13,152142,152143],{},[617,152144],{"alt":119,"src":47637},[13,152146,47640],{},[13,152148,47643],{},[49,152150,152151],{},[52,152152,47648],{},[13,152154,47651],{},[49,152156,152157],{},[52,152158,47656],{},[7759,152160,47660],{"id":47659},[13,152162,47663],{},[13,152164,47666],{},[114,152166,152167],{"className":116,"code":47669,"language":118,"meta":119,"style":119},[17,152168,152169,152173,152177,152181,152185,152189,152193,152197],{"__ignoreMap":119},[78,152170,152171],{"class":124,"line":125},[78,152172,47676],{},[78,152174,152175],{"class":124,"line":132},[78,152176,47681],{},[78,152178,152179],{"class":124,"line":138},[78,152180,24978],{},[78,152182,152183],{"class":124,"line":144},[78,152184,24983],{},[78,152186,152187],{"class":124,"line":150},[78,152188,47694],{},[78,152190,152191],{"class":124,"line":156},[78,152192,47699],{},[78,152194,152195],{"class":124,"line":162},[78,152196,47704],{},[78,152198,152199],{"class":124,"line":168},[78,152200,46676],{},[13,152202,47711],{},[114,152204,152205],{"className":116,"code":47714,"language":118,"meta":119,"style":119},[17,152206,152207,152211,152215,152219,152223,152227,152231,152235,152239,152243,152247,152251,152255,152259,152263,152267],{"__ignoreMap":119},[78,152208,152209],{"class":124,"line":125},[78,152210,47721],{},[78,152212,152213],{"class":124,"line":132},[78,152214,47726],{},[78,152216,152217],{"class":124,"line":138},[78,152218,25063],{},[78,152220,152221],{"class":124,"line":144},[78,152222,6942],{},[78,152224,152225],{"class":124,"line":150},[78,152226,25068],{},[78,152228,152229],{"class":124,"line":156},[78,152230,25073],{},[78,152232,152233],{"class":124,"line":162},[78,152234,25078],{},[78,152236,152237],{"class":124,"line":168},[78,152238,25083],{},[78,152240,152241],{"class":124,"line":174},[78,152242,47755],{},[78,152244,152245],{"class":124,"line":180},[78,152246,47760],{},[78,152248,152249],{"class":124,"line":186},[78,152250,47765],{},[78,152252,152253],{"class":124,"line":192},[78,152254,47770],{},[78,152256,152257],{"class":124,"line":198},[78,152258,47775],{},[78,152260,152261],{"class":124,"line":204},[78,152262,8041],{},[78,152264,152265],{"class":124,"line":210},[78,152266,25255],{},[78,152268,152269],{"class":124,"line":216},[78,152270,25261],{},[13,152272,47790],{},[23289,152274],{},[107,152276,47796],{"id":47795},[13,152278,47799],{},[13,152280,47802],{},[13,152282,47805],{},[13,152284,47808],{},[226,152286,228],{},{"title":119,"searchDepth":144,"depth":144,"links":152288},[152289,152290,152294,152299,152306],{"id":46203,"depth":132,"text":46204},{"id":46226,"depth":132,"text":46227,"children":152291},[152292,152293],{"id":46233,"depth":144,"text":46234},{"id":46569,"depth":144,"text":46570},{"id":46747,"depth":132,"text":46748,"children":152295},[152296,152297,152298],{"id":46751,"depth":144,"text":46752},{"id":46761,"depth":144,"text":46762},{"id":46795,"depth":144,"text":46796},{"id":46866,"depth":132,"text":46867,"children":152300},[152301,152302,152303,152304,152305],{"id":46876,"depth":144,"text":46877},{"id":47148,"depth":144,"text":47149},{"id":47391,"depth":144,"text":47392},{"id":47557,"depth":144,"text":47558},{"id":47659,"depth":144,"text":47660},{"id":47795,"depth":132,"text":47796},{},{"title":46187,"description":119},[794,14541,10715,6380,14542],{"id":47839,"title":47840,"assetBase":239,"author":8,"body":152311,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":152646,"navigation":128,"originalPath":48334,"path":48335,"seo":152647,"source":23330,"stem":48337,"tags":152648,"weight":250,"__hash__":48339},{"type":10,"value":152312,"toc":152617},[152313,152315,152317,152323,152325,152327,152329,152333,152335,152345,152349,152351,152355,152357,152367,152369,152371,152375,152377,152395,152397,152399,152401,152403,152413,152417,152419,152421,152427,152429,152443,152445,152447,152451,152453,152467,152469,152471,152475,152477,152487,152489,152491,152493,152495,152497,152499,152501,152503,152505,152507,152511,152513,152517,152519,152523,152525,152527,152529,152531,152533,152535,152537,152539,152541,152543,152545,152547,152549,152551,152553,152555,152589,152591,152595,152597,152601,152603,152605,152607,152609,152611,152613],[107,152314,47846],{"id":47845},[7759,152316,47850],{"id":47849},[13,152318,47853,152319,47857,152321,67],{},[22,152320,47856],{},[22,152322,47860],{},[13,152324,47863],{},[13,152326,47866],{},[7759,152328,47870],{"id":47869},[13,152330,152331],{},[22,152332,47875],{},[13,152334,47878],{},[2285,152336,152337,152339,152341,152343],{},[52,152338,47883],{},[52,152340,47886],{},[52,152342,47889],{},[52,152344,47892],{},[13,152346,47895,152347,47899],{},[22,152348,47898],{},[7759,152350,47903],{"id":47902},[13,152352,47906,152353],{},[22,152354,47909],{},[13,152356,47912],{},[2285,152358,152359,152361,152363,152365],{},[52,152360,47917],{},[52,152362,47920],{},[52,152364,47923],{},[52,152366,47926],{},[13,152368,47929],{},[7759,152370,47933],{"id":47932},[13,152372,47936,152373,47940],{},[22,152374,47939],{},[13,152376,47943],{},[2285,152378,152379,152383,152387,152391],{},[52,152380,152381,47951],{},[22,152382,47950],{},[52,152384,152385,47957],{},[22,152386,47956],{},[52,152388,152389,47963],{},[22,152390,47962],{},[52,152392,152393,47969],{},[22,152394,47968],{},[13,152396,47972],{},[7759,152398,47976],{"id":47975},[13,152400,47979],{},[13,152402,47982],{},[2285,152404,152405,152407,152409],{},[52,152406,47987],{},[52,152408,47990],{},[52,152410,152411,47996],{},[22,152412,47995],{},[13,152414,47999,152415,48003],{},[22,152416,48002],{},[13,152418,48006],{},[7759,152420,48010],{"id":48009},[13,152422,152423,67],{},[22,152424,48015,152425,48019],{},[22,152426,48018],{},[13,152428,48022],{},[2285,152430,152431,152435,152439],{},[52,152432,152433,48030],{},[22,152434,48029],{},[52,152436,152437,48036],{},[22,152438,48035],{},[52,152440,152441,48042],{},[22,152442,48041],{},[13,152444,48045],{},[7759,152446,48049],{"id":48048},[13,152448,152449,48055],{},[22,152450,48054],{},[13,152452,48058],{},[2285,152454,152455,152459,152463],{},[52,152456,152457,48066],{},[22,152458,48065],{},[52,152460,152461,48072],{},[22,152462,48071],{},[52,152464,152465,48078],{},[22,152466,48077],{},[13,152468,48081],{},[7759,152470,48085],{"id":48084},[13,152472,152473,48091],{},[22,152474,48090],{},[13,152476,48094],{},[2285,152478,152479,152481,152483,152485],{},[52,152480,48099],{},[52,152482,48102],{},[52,152484,48105],{},[52,152486,48108],{},[23289,152488],{},[107,152490,48114],{"id":48113},[7759,152492,48118],{"id":48117},[13,152494,48121],{},[13,152496,48124],{},[13,152498,48127],{},[7759,152500,48131],{"id":48130},[13,152502,48134],{},[13,152504,48137],{},[7759,152506,48141],{"id":48140},[13,152508,152509],{},[617,152510],{"alt":119,"src":25668},[7759,152512,48149],{"id":48148},[13,152514,152515],{},[617,152516],{"alt":119,"src":25603},[7759,152518,48157],{"id":48156},[13,152520,152521],{},[617,152522],{"alt":119,"src":25765},[13,152524,48164],{},[13,152526,48167],{},[13,152528,48170],{},[13,152530,48173],{},[7759,152532,48177],{"id":48176},[13,152534,48180],{},[13,152536,48183],{},[13,152538,48186],{},[23289,152540],{},[107,152542,48192],{"id":48191},[7759,152544,48196],{"id":48195},[13,152546,48199],{},[7759,152548,48203],{"id":48202},[13,152550,48206],{},[13,152552,48209],{},[7759,152554,48213],{"id":48212},[2285,152556,152557,152561,152565,152569,152573,152577,152581,152585],{},[52,152558,152559,48221],{},[22,152560,48220],{},[52,152562,152563,48227],{},[22,152564,48226],{},[52,152566,152567,48233],{},[22,152568,48232],{},[52,152570,152571,48239],{},[22,152572,48238],{},[52,152574,152575,48245],{},[22,152576,48244],{},[52,152578,152579,48251],{},[22,152580,48250],{},[52,152582,152583,48257],{},[22,152584,48256],{},[52,152586,152587,48263],{},[22,152588,48262],{},[7759,152590,48267],{"id":48266},[13,152592,152593],{},[617,152594],{"alt":119,"src":25961},[7759,152596,48275],{"id":48274},[13,152598,152599],{},[617,152600],{"alt":119,"src":25773},[13,152602,48282],{},[13,152604,48285],{},[13,152606,48288],{},[13,152608,48291],{},[7759,152610,48295],{"id":48294},[7759,152612,48299],{"id":48298},[13,152614,152615],{},[617,152616],{"alt":119,"src":25788},{"title":119,"searchDepth":144,"depth":144,"links":152618},[152619,152629,152637],{"id":47845,"depth":132,"text":47846,"children":152620},[152621,152622,152623,152624,152625,152626,152627,152628],{"id":47849,"depth":144,"text":47850},{"id":47869,"depth":144,"text":47870},{"id":47902,"depth":144,"text":47903},{"id":47932,"depth":144,"text":47933},{"id":47975,"depth":144,"text":47976},{"id":48009,"depth":144,"text":48010},{"id":48048,"depth":144,"text":48049},{"id":48084,"depth":144,"text":48085},{"id":48113,"depth":132,"text":48114,"children":152630},[152631,152632,152633,152634,152635,152636],{"id":48117,"depth":144,"text":48118},{"id":48130,"depth":144,"text":48131},{"id":48140,"depth":144,"text":48141},{"id":48148,"depth":144,"text":48149},{"id":48156,"depth":144,"text":48157},{"id":48176,"depth":144,"text":48177},{"id":48191,"depth":132,"text":48192,"children":152638},[152639,152640,152641,152642,152643,152644,152645],{"id":48195,"depth":144,"text":48196},{"id":48202,"depth":144,"text":48203},{"id":48212,"depth":144,"text":48213},{"id":48266,"depth":144,"text":48267},{"id":48274,"depth":144,"text":48275},{"id":48294,"depth":144,"text":48295},{"id":48298,"depth":144,"text":48299},{},{"title":47840,"description":119},[14968,7744,23378,10715,6380,14542],{"id":48341,"title":48342,"assetBase":239,"author":8,"body":152650,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":154419,"navigation":128,"originalPath":51060,"path":51061,"seo":154420,"source":23330,"stem":51063,"tags":154421,"weight":250,"__hash__":51065},{"type":10,"value":152651,"toc":154308},[152652,152654,152659,152661,152666,152668,152670,152674,152676,152678,152680,152682,152684,152686,152688,152690,152692,152694,152696,152700,152702,152704,152706,152710,152714,152716,152718,152720,152724,152726,152728,152730,152732,152734,152736,152738,152740,152742,152746,152748,152750,152752,152754,152756,152758,152764,152768,152772,152774,152776,152780,152782,152786,152790,152792,152796,152798,152800,152802,152808,152812,152816,152818,152820,152824,152826,152830,152832,152834,152836,152840,152842,152846,152848,152850,152852,152854,152856,152858,152860,152862,152864,152868,152874,152876,152878,152882,152884,152886,152888,152890,152892,152894,152896,152898,152900,152904,152906,152920,152922,152924,152926,152928,152956,152958,152960,152977,152981,152983,152985,152989,152991,152993,153016,153018,153036,153038,153040,153042,153044,153046,153048,153050,153052,153054,153058,153060,153062,153072,153074,153076,153078,153082,153086,153090,153092,153096,153098,153120,153122,153136,153138,153140,153142,153144,153146,153148,153150,153154,153156,153158,153160,153162,153164,153166,153168,153170,153174,153176,153178,153180,153184,153186,153188,153190,153192,153208,153210,153212,153216,153218,153220,153222,153224,153228,153230,153232,153242,153244,153246,153248,153250,153252,153254,153262,153264,153266,153268,153270,153272,153274,153276,153281,153283,153285,153295,153297,153299,153301,153329,153331,153333,153335,153337,153339,153341,153343,153345,153347,153353,153355,153357,153361,153363,153365,153367,153369,153371,153373,153375,153379,153381,153383,153385,153387,153389,153391,153393,153397,153399,153401,153407,153411,153413,153415,153417,153419,153425,153427,153429,153431,153433,153435,153437,153441,153443,153445,153447,153449,153451,153453,153455,153457,153459,153461,153463,153465,153469,153471,153475,153477,153479,153481,153483,153485,153495,153497,153505,153507,153509,153511,153513,153518,153520,153522,153524,153526,153528,153530,153532,153534,153536,153538,153540,153542,153544,153546,153548,153550,153552,153554,153558,153560,153564,153566,153568,153572,153574,153578,153580,153582,153584,153588,153590,153592,153594,153596,153598,153600,153602,153604,153606,153608,153610,153612,153614,153616,153618,153620,153622,153626,153628,153632,153638,153642,153644,153646,153648,153652,153654,153658,153660,153662,153664,153666,153668,153674,153676,153678,153680,153682,153684,153686,153688,153690,153692,153694,153696,153698,153700,153702,153704,153708,153710,153712,153714,153716,153730,153732,153734,153736,153740,153742,153744,153748,153750,153754,153756,153760,153766,153772,153774,153776,153778,153780,153782,153784,153788,153790,153792,153794,153796,153804,153806,153808,153810,153812,153814,153816,153818,153820,153822,153824,153826,153828,153830,153832,153834,153836,153838,153844,153846,153848,153852,153854,153856,153858,153860,153862,153864,153868,153878,153880,153886,153892,153894,153896,153898,153900,153902,153904,153908,153910,153912,153914,153918,153926,153928,153930,153934,153936,153938,153940,153942,153946,153948,153950,153954,153956,153958,153968,153970,153972,153974,153976,153980,153982,153984,153986,153992,153994,153996,153998,154000,154002,154004,154006,154011,154013,154017,154019,154021,154023,154025,154027,154029,154034,154036,154042,154044,154048,154050,154052,154054,154056,154058,154060,154062,154078,154080,154082,154084,154092,154094,154096,154098,154100,154102,154104,154106,154110,154112,154118,154120,154122,154124,154126,154128,154130,154132,154134,154136,154138,154140,154142,154144,154149,154151,154156,154158,154160,154162,154164,154168,154172,154174,154178,154180,154182,154184,154190,154192,154194,154196,154198,154200,154202,154204,154208,154212,154214,154216,154222,154224,154226,154240,154242,154244,154246,154248,154250,154252,154258,154260,154264,154270,154272,154280,154282,154284,154288,154292,154294,154296,154298,154300,154302,154304,154306],[107,152653,48347],{"id":48347},[13,152655,48350,152656,48356],{},[5009,152657,48355],{"href":48353,"rel":152658},[23647],[13,152660,48359],{},[13,152662,48362,152663,48368],{},[5009,152664,48367],{"href":48365,"rel":152665},[23647],[13,152667,48371],{},[107,152669,48375],{"id":48374},[13,152671,152672],{},[22,152673,48380],{},[7759,152675,48384],{"id":48383},[13,152677,48387],{},[13,152679,48390],{},[13,152681,48393],{},[7759,152683,48397],{"id":48396},[13,152685,48400],{},[13,152687,48403],{},[13,152689,48406],{},[13,152691,48409],{},[13,152693,48412],{},[7759,152695,48416],{"id":48415},[13,152697,152698],{},[22,152699,48421],{},[10548,152701,48425],{"id":48424},[13,152703,48428],{},[13,152705,48431],{},[13,152707,152708],{},[22,152709,48436],{},[13,152711,48439,152712,67],{},[22,152713,48442],{},[13,152715,48445],{},[13,152717,48448],{},[10548,152719,48452],{"id":48451},[13,152721,152722],{},[22,152723,48457],{},[13,152725,48460],{},[13,152727,48463],{},[7759,152729,48467],{"id":48466},[13,152731,48470],{},[10548,152733,48474],{"id":48473},[13,152735,48477],{},[10548,152737,48481],{"id":48480},[13,152739,48484],{},[10548,152741,48488],{"id":48487},[13,152743,48491,152744,48495],{},[78,152745,48494],{},[7759,152747,48499],{"id":48498},[13,152749,48502],{},[10548,152751,48506],{"id":48505},[13,152753,48509],{},[13,152755,48512],{},[10548,152757,48516],{"id":48515},[13,152759,48519,152760,48523,152762,48527],{},[22,152761,48522],{},[22,152763,48526],{},[49,152765,152766],{},[52,152767,48532],{},[13,152769,152770],{},[617,152771],{"alt":119,"src":29434},[13,152773,48539],{},[10548,152775,48543],{"id":48542},[13,152777,48546,152778],{},[22,152779,48549],{},[13,152781,48552],{},[49,152783,152784],{},[52,152785,48557],{},[13,152787,152788],{},[617,152789],{"alt":119,"src":33078},[13,152791,48564],{},[13,152793,48567,152794,48571],{},[22,152795,48570],{},[10548,152797,48575],{"id":48574},[13,152799,48578],{},[13,152801,48581],{},[13,152803,48584,152804,48588,152806],{},[22,152805,48587],{},[22,152807,48591],{},[13,152809,48594,152810,67],{},[22,152811,48597],{},[49,152813,152814],{},[52,152815,48602],{},[7759,152817,48606],{"id":48605},[10548,152819,48610],{"id":48609},[49,152821,152822],{},[52,152823,48615],{},[13,152825,48618],{},[49,152827,152828],{},[52,152829,48623],{},[13,152831,48626],{},[13,152833,48629],{},[10548,152835,48633],{"id":48632},[13,152837,48636,152838],{},[22,152839,48639],{},[13,152841,48642],{},[49,152843,152844],{},[52,152845,48647],{},[10548,152847,48651],{"id":48650},[13,152849,48654],{},[10548,152851,48658],{"id":48657},[13,152853,48661],{},[13,152855,48664],{},[23289,152857],{},[107,152859,48670],{"id":48669},[13,152861,48673],{},[7759,152863,48677],{"id":48676},[13,152865,48680,152866,48684],{},[22,152867,48683],{},[49,152869,152870],{},[52,152871,152872,48692],{},[22,152873,48691],{},[7759,152875,48696],{"id":48695},[13,152877,48699],{},[13,152879,48702,152880,48706],{},[22,152881,48705],{},[13,152883,48709],{},[7759,152885,48713],{"id":48712},[13,152887,48716],{},[13,152889,48719],{},[23289,152891],{},[107,152893,48725],{"id":48724},[13,152895,48728],{},[7759,152897,48732],{"id":48731},[13,152899,48735],{},[13,152901,48738,152902,48742],{},[22,152903,48741],{},[13,152905,48745],{},[49,152907,152908,152912,152916],{},[52,152909,48750,152910],{},[22,152911,48753],{},[52,152913,48756,152914],{},[22,152915,48759],{},[52,152917,48762,152918],{},[22,152919,48765],{},[7759,152921,48769],{"id":48768},[10548,152923,48773],{"id":48772},[13,152925,48776],{},[13,152927,48779],{},[49,152929,152930,152934,152938,152942,152946,152950],{},[52,152931,152932],{},[22,152933,48786],{},[52,152935,152936,48792],{},[22,152937,48791],{},[52,152939,152940,48798],{},[22,152941,48797],{},[52,152943,152944,48804],{},[22,152945,48803],{},[52,152947,152948,48810],{},[22,152949,48809],{},[52,152951,152952,48816,152954],{},[22,152953,48815],{},[22,152955,48819],{},[10548,152957,48823],{"id":48822},[13,152959,48826],{},[49,152961,152962,152967,152972],{},[52,152963,48831,152964,28447],{},[5009,152965,48836],{"href":48834,"rel":152966},[23647],[52,152968,48839,152969,28447],{},[5009,152970,48844],{"href":48842,"rel":152971},[23647],[52,152973,48847,152974,28447],{},[5009,152975,48852],{"href":48850,"rel":152976},[23647],[13,152978,48855,152979,48859],{},[22,152980,48858],{},[10548,152982,48863],{"id":48862},[13,152984,48866],{},[13,152986,48869,152987,67],{},[22,152988,48872],{},[10548,152990,48876],{"id":48875},[13,152992,48879],{},[49,152994,152995,153002,153009],{},[52,152996,152997,48887,152999,28447],{},[22,152998,48886],{},[5009,153000,48892],{"href":48890,"rel":153001},[23647],[52,153003,153004,48898,153006,48904],{},[22,153005,48897],{},[5009,153007,48903],{"href":48901,"rel":153008},[23647],[52,153010,153011,48910,153013,28447],{},[22,153012,48909],{},[5009,153014,48915],{"href":48913,"rel":153015},[23647],[10548,153017,48919],{"id":48918},[49,153019,153020,153024,153028,153032],{},[52,153021,153022,48927],{},[22,153023,48926],{},[52,153025,153026],{},[22,153027,48932],{},[52,153029,153030],{},[22,153031,48937],{},[52,153033,153034,48943],{},[22,153035,48942],{},[10548,153037,48947],{"id":48946},[13,153039,48950],{},[7759,153041,48954],{"id":48953},[13,153043,48957],{},[10548,153045,48961],{"id":48960},[13,153047,48964],{},[13,153049,48967],{},[10548,153051,48971],{"id":48970},[13,153053,48974],{},[13,153055,153056,48980],{},[22,153057,48979],{},[13,153059,48983],{},[10548,153061,48987],{"id":48986},[49,153063,153064,153068],{},[52,153065,153066,48995],{},[22,153067,48994],{},[52,153069,153070],{},[22,153071,49000],{},[10548,153073,49004],{"id":49003},[13,153075,49007],{},[10548,153077,49011],{"id":49010},[13,153079,49014,153080,49018],{},[22,153081,49017],{},[13,153083,49021,153084,49025],{},[22,153085,49024],{},[13,153087,153088],{},[22,153089,49030],{},[10548,153091,49034],{"id":49033},[13,153093,49037,153094,49041],{},[22,153095,49040],{},[13,153097,49044],{},[49,153099,153100,153102,153104,153106,153108,153110,153112,153114,153116,153118],{},[52,153101,49049],{},[52,153103,49052],{},[52,153105,49055],{},[52,153107,49058],{},[52,153109,49061],{},[52,153111,49064],{},[52,153113,49067],{},[52,153115,49070],{},[52,153117,49073],{},[52,153119,49076],{},[13,153121,49079],{},[49,153123,153124,153126,153128,153130,153132,153134],{},[52,153125,49084],{},[52,153127,49087],{},[52,153129,49090],{},[52,153131,49093],{},[52,153133,49096],{},[52,153135,49076],{},[7759,153137,49102],{"id":49101},[13,153139,49105],{},[13,153141,49108],{},[23289,153143],{},[107,153145,49114],{"id":49113},[13,153147,49117],{},[7759,153149,49121],{"id":49120},[13,153151,49124,153152,67],{},[22,153153,49127],{},[13,153155,49130],{},[13,153157,49133],{},[7759,153159,49137],{"id":49136},[13,153161,49140],{},[13,153163,49143],{},[13,153165,49146],{},[7759,153167,49150],{"id":49149},[13,153169,49153],{},[13,153171,49156,153172,49160],{},[22,153173,49159],{},[7759,153175,49164],{"id":49163},[10548,153177,49168],{"id":49167},[13,153179,49171],{},[13,153181,49174,153182,67],{},[22,153183,49177],{},[10548,153185,49181],{"id":49180},[13,153187,49184],{},[13,153189,49187],{},[10548,153191,49191],{"id":49190},[49,153193,153194,153196],{},[52,153195,49196],{},[52,153197,153198,49202,153200,49206,153202,49210,153204,49214,153206,49218],{},[22,153199,49201],{},[22,153201,49205],{},[22,153203,49209],{},[22,153205,49213],{},[22,153207,49217],{},[23289,153209],{},[107,153211,49224],{"id":49223},[13,153213,49227,153214],{},[22,153215,49230],{},[7759,153217,49234],{"id":49233},[13,153219,49237],{},[13,153221,49240],{},[7759,153223,49244],{"id":49243},[13,153225,49247,153226,49251],{},[22,153227,49250],{},[7759,153229,49255],{"id":49254},[13,153231,49258],{},[49,153233,153234,153236,153238,153240],{},[52,153235,49263],{},[52,153237,49266],{},[52,153239,49269],{},[52,153241,49272],{},[13,153243,49275],{},[7759,153245,49279],{"id":49278},[10548,153247,49283],{"id":49282},[13,153249,49286],{},[10548,153251,49290],{"id":49289},[13,153253,49293],{},[49,153255,153256,153258,153260],{},[52,153257,49298],{},[52,153259,49301],{},[52,153261,49304],{},[13,153263,49307],{},[23289,153265],{},[107,153267,49313],{"id":49312},[13,153269,49316],{},[7759,153271,49320],{"id":49319},[10548,153273,49324],{"id":49323},[13,153275,49327],{},[13,153277,49330,153278,28447],{},[5009,153279,49335],{"href":49333,"rel":153280},[23647],[10548,153282,49339],{"id":49338},[13,153284,49342],{},[49,153286,153287,153289,153291,153293],{},[52,153288,49347],{},[52,153290,49350],{},[52,153292,49353],{},[52,153294,49356],{},[10548,153296,49360],{"id":49359},[13,153298,49363],{},[13,153300,49366],{},[114,153302,153303],{"className":41615,"code":49369,"language":41617,"meta":119,"style":119},[17,153304,153305],{"__ignoreMap":119},[78,153306,153307,153309,153311,153313,153315,153317,153319,153321,153323,153325,153327],{"class":124,"line":125},[78,153308,41631],{"class":41630},[78,153310,5009],{"class":41634},[78,153312,49380],{"class":41638},[78,153314,4609],{"class":41630},[78,153316,49385],{"class":41644},[78,153318,49388],{"class":41638},[78,153320,4609],{"class":41630},[78,153322,49393],{"class":41644},[78,153324,49396],{"class":41630},[78,153326,5009],{"class":41634},[78,153328,41653],{"class":41630},[10548,153330,49404],{"id":49403},[13,153332,49407],{},[13,153334,49410],{},[7759,153336,49414],{"id":49413},[10548,153338,49418],{"id":49417},[13,153340,49421],{},[10548,153342,49425],{"id":49424},[13,153344,49428],{},[13,153346,49431],{},[49,153348,153349,153351],{},[52,153350,49436],{},[52,153352,49439],{},[13,153354,49442],{},[10548,153356,49446],{"id":49445},[13,153358,49449,153359,67],{},[22,153360,49452],{},[13,153362,49455],{},[23289,153364],{},[107,153366,49461],{"id":49460},[13,153368,49464],{},[7759,153370,49468],{"id":49467},[13,153372,49471],{},[10548,153374,49475],{"id":49474},[13,153376,49478,153377],{},[22,153378,49481],{},[10548,153380,49485],{"id":49484},[13,153382,49488],{},[13,153384,49491],{},[7759,153386,49495],{"id":49494},[10548,153388,49499],{"id":49498},[13,153390,49502],{},[13,153392,49505],{},[13,153394,49508,153395,67],{},[22,153396,49511],{},[10548,153398,49515],{"id":49514},[13,153400,49518],{},[49,153402,153403,153405],{},[52,153404,49523],{},[52,153406,49526],{},[13,153408,153409],{},[22,153410,49531],{},[10548,153412,49535],{"id":49534},[13,153414,49538],{},[10548,153416,49542],{"id":49541},[13,153418,49545],{},[13,153420,49548,153421,49552,153423,67],{},[22,153422,49551],{},[22,153424,49555],{},[10548,153426,49559],{"id":49558},[13,153428,49562],{},[13,153430,49565],{},[7759,153432,49569],{"id":49568},[13,153434,49572],{},[10548,153436,49576],{"id":49575},[13,153438,49579,153439,49583],{},[22,153440,49582],{},[10548,153442,49587],{"id":49586},[13,153444,49590],{},[10548,153446,49594],{"id":49593},[13,153448,49597],{},[10548,153450,49601],{"id":49600},[7759,153452,49605],{"id":49604},[13,153454,49608],{},[10548,153456,49612],{"id":49611},[13,153458,49615],{},[13,153460,49618],{},[10548,153462,49622],{"id":49621},[13,153464,49625],{},[13,153466,49628,153467,49632],{},[22,153468,49631],{},[10548,153470,49636],{"id":49635},[13,153472,49639,153473],{},[22,153474,49642],{},[13,153476,49645],{},[23289,153478],{},[107,153480,49651],{"id":49650},[7759,153482,27767],{"id":27706},[13,153484,49656],{},[49,153486,153487,153489,153491,153493],{},[52,153488,49661],{},[52,153490,49664],{},[52,153492,49667],{},[52,153494,49670],{},[13,153496,49673],{},[49,153498,153499,153501,153503],{},[52,153500,49678],{},[52,153502,49681],{},[52,153504,49684],{},[7759,153506,49688],{"id":49687},[13,153508,49691],{},[10548,153510,49695],{"id":49694},[13,153512,49698],{},[114,153514,153516],{"className":153515,"code":49702,"language":299},[297],[17,153517,49702],{"__ignoreMap":119},[13,153519,49707],{},[10548,153521,49711],{"id":49710},[13,153523,49714],{},[10548,153525,49718],{"id":49717},[13,153527,49721],{},[7759,153529,49725],{"id":49724},[10548,153531,49729],{"id":49728},[13,153533,49732],{},[10548,153535,49736],{"id":49735},[13,153537,49739],{},[10548,153539,49743],{"id":49742},[13,153541,49746],{},[10548,153543,49750],{"id":49749},[13,153545,49753],{},[23289,153547],{},[107,153549,49759],{"id":49758},[13,153551,49762],{},[7759,153553,49766],{"id":49765},[13,153555,49769,153556],{},[22,153557,49772],{},[13,153559,49775],{},[13,153561,49778,153562,67],{},[22,153563,49781],{},[7759,153565,49785],{"id":49784},[13,153567,49788],{},[13,153569,49791,153570,49795],{},[22,153571,49794],{},[7759,153573,49799],{"id":49798},[13,153575,49802,153576],{},[22,153577,49805],{},[7759,153579,49809],{"id":49808},[13,153581,49812],{},[13,153583,49815],{},[13,153585,49818,153586,49822],{},[22,153587,49821],{},[7759,153589,49826],{"id":49825},[13,153591,49829],{},[7759,153593,49833],{"id":49832},[13,153595,49836],{},[13,153597,49839],{},[13,153599,49842],{},[7759,153601,49846],{"id":49845},[13,153603,49849],{},[13,153605,49852],{},[13,153607,49855],{},[23289,153609],{},[107,153611,49861],{"id":49860},[13,153613,49864],{},[13,153615,49867],{},[13,153617,49870],{},[13,153619,49873],{},[7759,153621,49877],{"id":49876},[13,153623,153624,49883],{},[22,153625,49882],{},[13,153627,49886],{},[13,153629,153630,49892],{},[22,153631,49891],{},[49,153633,153634,153636],{},[52,153635,49897],{},[52,153637,49900],{},[13,153639,49903,153640,49907],{},[22,153641,49906],{},[13,153643,49910],{},[7759,153645,49914],{"id":49913},[13,153647,49917],{},[13,153649,49920,153650,67],{},[22,153651,49923],{},[7759,153653,49927],{"id":49926},[13,153655,49930,153656,67],{},[22,153657,49933],{},[23289,153659],{},[107,153661,49939],{"id":49938},[13,153663,49942],{},[7759,153665,27767],{"id":27766},[13,153667,49947],{},[49,153669,153670,153672],{},[52,153671,49952],{},[52,153673,49955],{},[13,153675,49958],{},[10548,153677,49962],{"id":49961},[13,153679,49965],{},[10548,153681,49969],{"id":49968},[13,153683,49972],{},[10548,153685,49976],{"id":49975},[13,153687,49979],{},[10548,153689,49983],{"id":49982},[13,153691,49986],{},[7759,153693,49990],{"id":49989},[13,153695,49993],{},[10548,153697,49997],{"id":49996},[13,153699,50000],{},[10548,153701,50004],{"id":50003},[13,153703,50007],{},[13,153705,50010,153706,50014],{},[22,153707,50013],{},[10548,153709,50018],{"id":50017},[13,153711,50021],{},[7759,153713,50025],{"id":50024},[13,153715,50028],{},[49,153717,153718,153720,153722,153724,153726,153728],{},[52,153719,50033],{},[52,153721,50036],{},[52,153723,50039],{},[52,153725,50042],{},[52,153727,50045],{},[52,153729,50048],{},[7759,153731,50052],{"id":50051},[13,153733,50055],{},[13,153735,50058],{},[13,153737,153738],{},[617,153739],{"alt":119,"src":32278},[13,153741,50065],{},[13,153743,50068],{},[13,153745,153746,50074],{},[22,153747,50073],{},[7759,153749,50078],{"id":50077},[13,153751,50081,153752],{},[22,153753,50084],{},[13,153755,50087],{},[13,153757,153758],{},[22,153759,50092],{},[49,153761,153762,153764],{},[52,153763,50097],{},[52,153765,50100],{},[13,153767,50103,153768,50107,153770],{},[22,153769,50106],{},[22,153771,50110],{},[7759,153773,50114],{"id":50113},[13,153775,50117],{},[13,153777,50120],{},[10548,153779,50124],{"id":50123},[13,153781,50127],{},[10548,153783,50131],{"id":50130},[13,153785,50134,153786],{},[22,153787,50137],{},[10548,153789,50141],{"id":50140},[13,153791,50144],{},[10548,153793,50148],{"id":50147},[13,153795,50151],{},[49,153797,153798,153800,153802],{},[52,153799,50156],{},[52,153801,50159],{},[52,153803,50162],{},[13,153805,50165],{},[7759,153807,50169],{"id":50168},[13,153809,50172],{},[10548,153811,50176],{"id":50175},[10548,153813,50180],{"id":50179},[10548,153815,50184],{"id":50183},[10548,153817,50188],{"id":50187},[10548,153819,50192],{"id":50191},[10548,153821,50196],{"id":50195},[10548,153823,50200],{"id":50199},[13,153825,50203],{},[10548,153827,50207],{"id":50206},[10548,153829,50211],{"id":50210},[10548,153831,50215],{"id":50214},[23289,153833],{},[107,153835,50221],{"id":50220},[13,153837,50224],{},[49,153839,153840,153842],{},[52,153841,50229],{},[52,153843,50232],{},[7759,153845,50236],{"id":50235},[13,153847,50239],{},[13,153849,50242,153850,67],{},[22,153851,50245],{},[13,153853,50248],{},[7759,153855,50252],{"id":50251},[13,153857,50255],{},[13,153859,50258],{},[7759,153861,50262],{"id":50261},[13,153863,50265],{},[13,153865,50268,153866,50272],{},[22,153867,50271],{},[49,153869,153870,153872,153874,153876],{},[52,153871,50277],{},[52,153873,50280],{},[52,153875,50283],{},[52,153877,50286],{},[7759,153879,50290],{"id":50289},[13,153881,50293,153882,50297,153884,819],{},[22,153883,50296],{},[22,153885,50300],{},[49,153887,153888,153890],{},[52,153889,50305],{},[52,153891,50308],{},[7759,153893,50312],{"id":50311},[13,153895,50315],{},[23289,153897],{},[107,153899,50321],{"id":50320},[13,153901,50324],{},[7759,153903,50328],{"id":50327},[13,153905,50331,153906,50335],{},[22,153907,50334],{},[13,153909,50338],{},[13,153911,50341],{},[13,153913,50344],{},[13,153915,153916],{},[617,153917],{"alt":119,"src":50349},[49,153919,153920,153922,153924],{},[52,153921,50354],{},[52,153923,50357],{},[52,153925,50360],{},[13,153927,50363],{},[13,153929,50366],{},[13,153931,50369,153932],{},[22,153933,50372],{},[7759,153935,50376],{"id":50375},[13,153937,50379],{},[10548,153939,50383],{"id":50382},[13,153941,50386],{},[13,153943,50389,153944,50393],{},[22,153945,50392],{},[13,153947,50396],{},[10548,153949,50400],{"id":50399},[13,153951,50403,153952,50407],{},[22,153953,50406],{},[13,153955,50410],{},[10548,153957,50414],{"id":50413},[49,153959,153960,153962,153964],{},[52,153961,50419],{},[52,153963,50422],{},[52,153965,153966,67],{},[22,153967,50427],{},[13,153969,50430],{},[7759,153971,50434],{"id":50433},[13,153973,50437],{},[10548,153975,50441],{"id":50440},[13,153977,50444,153978],{},[22,153979,50447],{},[10548,153981,50451],{"id":50450},[13,153983,50454],{},[13,153985,50457],{},[13,153987,153988,50463,153990],{},[22,153989,50462],{},[22,153991,50466],{},[10548,153993,50470],{"id":50469},[13,153995,50473],{},[13,153997,50476],{},[13,153999,50479],{},[7759,154001,50483],{"id":50482},[13,154003,50486],{},[13,154005,50489],{},[114,154007,154009],{"className":154008,"code":50493,"language":299},[297],[17,154010,50493],{"__ignoreMap":119},[13,154012,50498],{},[13,154014,154015],{},[617,154016],{"alt":119,"src":50503},[13,154018,50506],{},[13,154020,50509],{},[23289,154022],{},[107,154024,50515],{"id":50514},[7759,154026,50519],{"id":50518},[13,154028,50522],{},[114,154030,154032],{"className":154031,"code":50526,"language":299},[297],[17,154033,50526],{"__ignoreMap":119},[13,154035,50531],{},[49,154037,154038,154040],{},[52,154039,50536],{},[52,154041,50539],{},[10548,154043,50543],{"id":50542},[13,154045,50546,154046,50550],{},[22,154047,50549],{},[10548,154049,50554],{"id":50553},[13,154051,50557],{},[7759,154053,50561],{"id":50560},[10548,154055,50565],{"id":50564},[13,154057,50568],{},[10548,154059,50572],{"id":50571},[13,154061,50575],{},[114,154063,154064],{"className":50578,"code":50579,"language":50580,"meta":119,"style":119},[17,154065,154066,154070,154074],{"__ignoreMap":119},[78,154067,154068],{"class":124,"line":125},[78,154069,50587],{},[78,154071,154072],{"class":124,"line":132},[78,154073,129],{"emptyLinePlaceholder":128},[78,154075,154076],{"class":124,"line":138},[78,154077,50596],{},[13,154079,50599],{},[13,154081,50602],{},[10548,154083,50606],{"id":50605},[49,154085,154086,154088,154090],{},[52,154087,50611],{},[52,154089,50614],{},[52,154091,50617],{},[7759,154093,50621],{"id":50620},[23289,154095],{},[107,154097,50627],{"id":50626},[13,154099,50630],{},[7759,154101,50634],{"id":50633},[13,154103,50637],{},[13,154105,50640],{},[13,154107,50643,154108,50647],{},[22,154109,50646],{},[13,154111,50650],{},[49,154113,154114,154116],{},[52,154115,50655],{},[52,154117,50658],{},[13,154119,50661],{},[7759,154121,50665],{"id":50664},[13,154123,50668],{},[13,154125,50671],{},[13,154127,50674],{},[7759,154129,50678],{"id":50677},[13,154131,50681],{},[13,154133,50684],{},[7759,154135,50688],{"id":50687},[13,154137,50691],{},[13,154139,50694],{},[7759,154141,50698],{"id":50697},[13,154143,50701],{},[114,154145,154147],{"className":154146,"code":50705,"language":299},[297],[17,154148,50705],{"__ignoreMap":119},[13,154150,50710],{},[114,154152,154154],{"className":154153,"code":50714,"language":299},[297],[17,154155,50714],{"__ignoreMap":119},[13,154157,50719],{},[23289,154159],{},[107,154161,50725],{"id":50724},[7759,154163,50728],{"id":50728},[13,154165,50731,154166,67],{},[22,154167,50734],{},[13,154169,50737,154170,50741],{},[22,154171,50740],{},[10548,154173,50745],{"id":50744},[13,154175,154176],{},[22,154177,50750],{},[13,154179,50753],{},[10548,154181,50757],{"id":50756},[13,154183,50760],{},[49,154185,154186,154188],{},[52,154187,50765],{},[52,154189,50768],{},[7759,154191,50771],{"id":50771},[13,154193,50774],{},[23289,154195],{},[107,154197,50780],{"id":50779},[13,154199,50783],{},[7759,154201,48732],{"id":50786},[13,154203,50789],{},[13,154205,154206],{},[617,154207],{"alt":119,"src":50794},[13,154209,50797,154210],{},[22,154211,50800],{},[7759,154213,50804],{"id":50803},[13,154215,50807],{},[13,154217,50810,154218,50814,154220,50818],{},[22,154219,50813],{},[22,154221,50817],{},[7759,154223,50822],{"id":50821},[13,154225,50825],{},[49,154227,154228,154230,154232,154234,154236,154238],{},[52,154229,50830],{},[52,154231,50833],{},[52,154233,50836],{},[52,154235,50839],{},[52,154237,50842],{},[52,154239,50845],{},[13,154241,50848],{},[7759,154243,50852],{"id":50851},[13,154245,50855],{},[13,154247,50858],{},[7759,154249,50862],{"id":50861},[13,154251,50865],{},[49,154253,154254,154256],{},[52,154255,50870],{},[52,154257,50873],{},[7759,154259,50877],{"id":50876},[13,154261,50880,154262,50884],{},[22,154263,50883],{},[49,154265,154266,154268],{},[52,154267,50889],{},[52,154269,50892],{},[13,154271,50895],{},[49,154273,154274,154276,154278],{},[52,154275,50900],{},[52,154277,50903],{},[52,154279,50906],{},[23289,154281],{},[107,154283,50912],{"id":50911},[13,154285,50915,154286,50919],{},[22,154287,50918],{},[13,154289,154290],{},[22,154291,50924],{},[23289,154293],{},[107,154295,50929],{"id":50929},[13,154297,50932],{},[13,154299,50935],{},[13,154301,50938],{},[13,154303,50941],{},[13,154305,50944],{},[226,154307,50947],{},{"title":119,"searchDepth":144,"depth":144,"links":154309},[154310,154311,154319,154324,154330,154336,154342,154346,154352,154357,154366,154371,154380,154387,154393,154398,154405,154409,154417,154418],{"id":48347,"depth":132,"text":48347},{"id":48374,"depth":132,"text":48375,"children":154312},[154313,154314,154315,154316,154317,154318],{"id":48383,"depth":144,"text":48384},{"id":48396,"depth":144,"text":48397},{"id":48415,"depth":144,"text":48416},{"id":48466,"depth":144,"text":48467},{"id":48498,"depth":144,"text":48499},{"id":48605,"depth":144,"text":48606},{"id":48669,"depth":132,"text":48670,"children":154320},[154321,154322,154323],{"id":48676,"depth":144,"text":48677},{"id":48695,"depth":144,"text":48696},{"id":48712,"depth":144,"text":48713},{"id":48724,"depth":132,"text":48725,"children":154325},[154326,154327,154328,154329],{"id":48731,"depth":144,"text":48732},{"id":48768,"depth":144,"text":48769},{"id":48953,"depth":144,"text":48954},{"id":49101,"depth":144,"text":49102},{"id":49113,"depth":132,"text":49114,"children":154331},[154332,154333,154334,154335],{"id":49120,"depth":144,"text":49121},{"id":49136,"depth":144,"text":49137},{"id":49149,"depth":144,"text":49150},{"id":49163,"depth":144,"text":49164},{"id":49223,"depth":132,"text":49224,"children":154337},[154338,154339,154340,154341],{"id":49233,"depth":144,"text":49234},{"id":49243,"depth":144,"text":49244},{"id":49254,"depth":144,"text":49255},{"id":49278,"depth":144,"text":49279},{"id":49312,"depth":132,"text":49313,"children":154343},[154344,154345],{"id":49319,"depth":144,"text":49320},{"id":49413,"depth":144,"text":49414},{"id":49460,"depth":132,"text":49461,"children":154347},[154348,154349,154350,154351],{"id":49467,"depth":144,"text":49468},{"id":49494,"depth":144,"text":49495},{"id":49568,"depth":144,"text":49569},{"id":49604,"depth":144,"text":49605},{"id":49650,"depth":132,"text":49651,"children":154353},[154354,154355,154356],{"id":27706,"depth":144,"text":27767},{"id":49687,"depth":144,"text":49688},{"id":49724,"depth":144,"text":49725},{"id":49758,"depth":132,"text":49759,"children":154358},[154359,154360,154361,154362,154363,154364,154365],{"id":49765,"depth":144,"text":49766},{"id":49784,"depth":144,"text":49785},{"id":49798,"depth":144,"text":49799},{"id":49808,"depth":144,"text":49809},{"id":49825,"depth":144,"text":49826},{"id":49832,"depth":144,"text":49833},{"id":49845,"depth":144,"text":49846},{"id":49860,"depth":132,"text":49861,"children":154367},[154368,154369,154370],{"id":49876,"depth":144,"text":49877},{"id":49913,"depth":144,"text":49914},{"id":49926,"depth":144,"text":49927},{"id":49938,"depth":132,"text":49939,"children":154372},[154373,154374,154375,154376,154377,154378,154379],{"id":27766,"depth":144,"text":27767},{"id":49989,"depth":144,"text":49990},{"id":50024,"depth":144,"text":50025},{"id":50051,"depth":144,"text":50052},{"id":50077,"depth":144,"text":50078},{"id":50113,"depth":144,"text":50114},{"id":50168,"depth":144,"text":50169},{"id":50220,"depth":132,"text":50221,"children":154381},[154382,154383,154384,154385,154386],{"id":50235,"depth":144,"text":50236},{"id":50251,"depth":144,"text":50252},{"id":50261,"depth":144,"text":50262},{"id":50289,"depth":144,"text":50290},{"id":50311,"depth":144,"text":50312},{"id":50320,"depth":132,"text":50321,"children":154388},[154389,154390,154391,154392],{"id":50327,"depth":144,"text":50328},{"id":50375,"depth":144,"text":50376},{"id":50433,"depth":144,"text":50434},{"id":50482,"depth":144,"text":50483},{"id":50514,"depth":132,"text":50515,"children":154394},[154395,154396,154397],{"id":50518,"depth":144,"text":50519},{"id":50560,"depth":144,"text":50561},{"id":50620,"depth":144,"text":50621},{"id":50626,"depth":132,"text":50627,"children":154399},[154400,154401,154402,154403,154404],{"id":50633,"depth":144,"text":50634},{"id":50664,"depth":144,"text":50665},{"id":50677,"depth":144,"text":50678},{"id":50687,"depth":144,"text":50688},{"id":50697,"depth":144,"text":50698},{"id":50724,"depth":132,"text":50725,"children":154406},[154407,154408],{"id":50728,"depth":144,"text":50728},{"id":50771,"depth":144,"text":50771},{"id":50779,"depth":132,"text":50780,"children":154410},[154411,154412,154413,154414,154415,154416],{"id":50786,"depth":144,"text":48732},{"id":50803,"depth":144,"text":50804},{"id":50821,"depth":144,"text":50822},{"id":50851,"depth":144,"text":50852},{"id":50861,"depth":144,"text":50862},{"id":50876,"depth":144,"text":50877},{"id":50911,"depth":132,"text":50912},{"id":50929,"depth":132,"text":50929},{},{"title":48342,"description":119},[14968,246,23378,10715,14542,23333],{"id":51067,"title":246,"assetBase":239,"author":8,"body":154423,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":163905,"navigation":128,"originalPath":61652,"path":61653,"seo":163906,"source":23330,"stem":61655,"tags":163907,"weight":250,"__hash__":61657},{"type":10,"value":154424,"toc":163887},[154425,154427,154429,154431,154433,154437,154441,154443,154445,154447,154449,154451,154453,154455,154457,154459,154461,154493,154495,154497,154499,155175,155177,155179,155181,155183,155295,155299,155301,155303,155894,155896,156756,156758,156906,156908,156910,156912,156914,157499,157501,157503,157505,157507,158514,158518,158520,158522,158526,158528,159561,159567,159569,159571,159643,159645,159701,159703,159779,159781,159783,159843,159845,159941,159943,160007,160009,160049,160051,160115,160117,160181,160183,160257,160259,160387,160389,160391,160451,160453,160565,160567,160647,160649,160749,160751,160827,160829,160865,160867,160869,160913,160915,161031,161033,161035,161037,161039,161147,161149,161151,161243,161245,161247,161311,161313,161433,161435,161437,161439,161527,161529,161531,161533,161601,161603,161667,161669,161679,161683,161763,161765,161881,161883,161885,161997,162001,162061,162065,162067,162069,162073,162087,162155,162157,162161,162163,162223,162225,162313,162315,162317,162405,162485,162487,162489,162495,162591,162593,162595,162599,162715,162717,162719,162721,162725,162805,162807,162887,162889,162891,163019,163021,163161,163163,163267,163371,163373,163375,163455,163457,163549,163551,163579,163581,163583,163591,163593,163595,163647,163649,163709,163711,163759,163761,163813,163815,163875,163877,163879,163881,163883,163885],[4517,154426,246],{"id":246},[107,154428,51074],{"id":51074},[10548,154430,51077],{"id":51077},[13,154432,51080],{},[13,154434,51083,154435],{},[51085,154436,51087],{},[13,154438,154439],{},[617,154440],{"alt":51092,"src":51093},[10548,154442,51096],{"id":51096},[13,154444,51099],{},[13,154446,51102],{},[10548,154448,51105],{"id":51105},[13,154450,51108],{},[13,154452,51111],{},[10548,154454,51114],{"id":51114},[13,154456,51117],{},[13,154458,51120],{},[10548,154460,51123],{"id":51123},[114,154462,154463],{"className":51126,"code":51127,"language":51128,"meta":119,"style":119},[17,154464,154465,154469,154473,154477,154481,154485,154489],{"__ignoreMap":119},[78,154466,154467],{"class":124,"line":125},[78,154468,51135],{},[78,154470,154471],{"class":124,"line":132},[78,154472,51140],{},[78,154474,154475],{"class":124,"line":138},[78,154476,51145],{},[78,154478,154479],{"class":124,"line":144},[78,154480,51150],{},[78,154482,154483],{"class":124,"line":150},[78,154484,51155],{},[78,154486,154487],{"class":124,"line":156},[78,154488,51160],{},[78,154490,154491],{"class":124,"line":162},[78,154492,51165],{},[13,154494,51168],{},[10548,154496,51172],{"id":51171},[13,154498,51175],{},[114,154500,154501],{"className":51126,"code":51178,"language":51128,"meta":119,"style":119},[17,154502,154503,154507,154511,154515,154519,154523,154527,154531,154535,154539,154543,154547,154551,154555,154559,154563,154567,154571,154575,154579,154583,154587,154591,154595,154599,154603,154607,154611,154615,154619,154623,154627,154631,154635,154639,154643,154647,154651,154655,154659,154663,154667,154671,154675,154679,154683,154687,154691,154695,154699,154703,154707,154711,154715,154719,154723,154727,154731,154735,154739,154743,154747,154751,154755,154759,154763,154767,154771,154775,154779,154783,154787,154791,154795,154799,154803,154807,154811,154815,154819,154823,154827,154831,154835,154839,154843,154847,154851,154855,154859,154863,154867,154871,154875,154879,154883,154887,154891,154895,154899,154903,154907,154911,154915,154919,154923,154927,154931,154935,154939,154943,154947,154951,154955,154959,154963,154967,154971,154975,154979,154983,154987,154991,154995,154999,155003,155007,155011,155015,155019,155023,155027,155031,155035,155039,155043,155047,155051,155055,155059,155063,155067,155071,155075,155079,155083,155087,155091,155095,155099,155103,155107,155111,155115,155119,155123,155127,155131,155135,155139,155143,155147,155151,155155,155159,155163,155167,155171],{"__ignoreMap":119},[78,154504,154505],{"class":124,"line":125},[78,154506,51185],{},[78,154508,154509],{"class":124,"line":132},[78,154510,51190],{},[78,154512,154513],{"class":124,"line":138},[78,154514,51195],{},[78,154516,154517],{"class":124,"line":144},[78,154518,51200],{},[78,154520,154521],{"class":124,"line":150},[78,154522,51205],{},[78,154524,154525],{"class":124,"line":156},[78,154526,51135],{},[78,154528,154529],{"class":124,"line":162},[78,154530,51214],{},[78,154532,154533],{"class":124,"line":168},[78,154534,51219],{},[78,154536,154537],{"class":124,"line":174},[78,154538,51224],{},[78,154540,154541],{"class":124,"line":180},[78,154542,51229],{},[78,154544,154545],{"class":124,"line":186},[78,154546,51234],{},[78,154548,154549],{"class":124,"line":192},[78,154550,51239],{},[78,154552,154553],{"class":124,"line":198},[78,154554,51244],{},[78,154556,154557],{"class":124,"line":204},[78,154558,51249],{},[78,154560,154561],{"class":124,"line":210},[78,154562,51254],{},[78,154564,154565],{"class":124,"line":216},[78,154566,51259],{},[78,154568,154569],{"class":124,"line":222},[78,154570,51264],{},[78,154572,154573],{"class":124,"line":421},[78,154574,51269],{},[78,154576,154577],{"class":124,"line":427},[78,154578,51274],{},[78,154580,154581],{"class":124,"line":433},[78,154582,51279],{},[78,154584,154585],{"class":124,"line":2443},[78,154586,51284],{},[78,154588,154589],{"class":124,"line":2448},[78,154590,51289],{},[78,154592,154593],{"class":124,"line":2454},[78,154594,51294],{},[78,154596,154597],{"class":124,"line":2460},[78,154598,51299],{},[78,154600,154601],{"class":124,"line":2465},[78,154602,51304],{},[78,154604,154605],{"class":124,"line":2470},[78,154606,51309],{},[78,154608,154609],{"class":124,"line":2903},[78,154610,51314],{},[78,154612,154613],{"class":124,"line":2909},[78,154614,51319],{},[78,154616,154617],{"class":124,"line":11477},[78,154618,51324],{},[78,154620,154621],{"class":124,"line":13374},[78,154622,51329],{},[78,154624,154625],{"class":124,"line":13380},[78,154626,51334],{},[78,154628,154629],{"class":124,"line":13386},[78,154630,51339],{},[78,154632,154633],{"class":124,"line":13722},[78,154634,51309],{},[78,154636,154637],{"class":124,"line":13727},[78,154638,51348],{},[78,154640,154641],{"class":124,"line":13953},[78,154642,51353],{},[78,154644,154645],{"class":124,"line":13958},[78,154646,51358],{},[78,154648,154649],{"class":124,"line":13964},[78,154650,51309],{},[78,154652,154653],{"class":124,"line":13969},[78,154654,51348],{},[78,154656,154657],{"class":124,"line":24170},[78,154658,51353],{},[78,154660,154661],{"class":124,"line":24175},[78,154662,51375],{},[78,154664,154665],{"class":124,"line":24180},[78,154666,51380],{},[78,154668,154669],{"class":124,"line":24186},[78,154670,51385],{},[78,154672,154673],{"class":124,"line":24192},[78,154674,51390],{},[78,154676,154677],{"class":124,"line":24198},[78,154678,51385],{},[78,154680,154681],{"class":124,"line":24204},[78,154682,51399],{},[78,154684,154685],{"class":124,"line":24210},[78,154686,51404],{},[78,154688,154689],{"class":124,"line":24215},[78,154690,51309],{},[78,154692,154693],{"class":124,"line":24220},[78,154694,51413],{},[78,154696,154697],{"class":124,"line":24226},[78,154698,51418],{},[78,154700,154701],{"class":124,"line":24232},[78,154702,51353],{},[78,154704,154705],{"class":124,"line":24238},[78,154706,51427],{},[78,154708,154709],{"class":124,"line":24244},[78,154710,51309],{},[78,154712,154713],{"class":124,"line":24250},[78,154714,51436],{},[78,154716,154717],{"class":124,"line":24256},[78,154718,51418],{},[78,154720,154721],{"class":124,"line":24262},[78,154722,51445],{},[78,154724,154725],{"class":124,"line":24267},[78,154726,51450],{},[78,154728,154729],{"class":124,"line":24273},[78,154730,51385],{},[78,154732,154733],{"class":124,"line":24279},[78,154734,51459],{},[78,154736,154737],{"class":124,"line":24284},[78,154738,51385],{},[78,154740,154741],{"class":124,"line":24290},[78,154742,51165],{},[78,154744,154745],{"class":124,"line":24296},[78,154746,51472],{},[78,154748,154749],{"class":124,"line":24302},[78,154750,51477],{},[78,154752,154753],{"class":124,"line":24308},[78,154754,51482],{},[78,154756,154757],{"class":124,"line":24314},[78,154758,51219],{},[78,154760,154761],{"class":124,"line":24320},[78,154762,51491],{},[78,154764,154765],{"class":124,"line":24325},[78,154766,51496],{},[78,154768,154769],{"class":124,"line":24331},[78,154770,51309],{},[78,154772,154773],{"class":124,"line":25115},[78,154774,51505],{},[78,154776,154777],{"class":124,"line":25121},[78,154778,51510],{},[78,154780,154781],{"class":124,"line":25127},[78,154782,51515],{},[78,154784,154785],{"class":124,"line":25132},[78,154786,51353],{},[78,154788,154789],{"class":124,"line":25137},[78,154790,51524],{},[78,154792,154793],{"class":124,"line":25143},[78,154794,51529],{},[78,154796,154797],{"class":124,"line":25149},[78,154798,51472],{},[78,154800,154801],{"class":124,"line":25155},[78,154802,51538],{},[78,154804,154805],{"class":124,"line":25161},[78,154806,51472],{},[78,154808,154809],{"class":124,"line":25166},[78,154810,51547],{},[78,154812,154813],{"class":124,"line":25172},[78,154814,51552],{},[78,154816,154817],{"class":124,"line":25178},[78,154818,51219],{},[78,154820,154821],{"class":124,"line":25184},[78,154822,51561],{},[78,154824,154825],{"class":124,"line":25190},[78,154826,51566],{},[78,154828,154829],{"class":124,"line":25196},[78,154830,51496],{},[78,154832,154833],{"class":124,"line":25202},[78,154834,51575],{},[78,154836,154837],{"class":124,"line":25207},[78,154838,51580],{},[78,154840,154841],{"class":124,"line":25212},[78,154842,51585],{},[78,154844,154845],{"class":124,"line":25218},[78,154846,23518],{},[78,154848,154849],{"class":124,"line":25224},[78,154850,51594],{},[78,154852,154853],{"class":124,"line":25230},[78,154854,51599],{},[78,154856,154857],{"class":124,"line":25236},[78,154858,51219],{},[78,154860,154861],{"class":124,"line":25241},[78,154862,51561],{},[78,154864,154865],{"class":124,"line":25246},[78,154866,51566],{},[78,154868,154869],{"class":124,"line":25252},[78,154870,51496],{},[78,154872,154873],{"class":124,"line":25258},[78,154874,51575],{},[78,154876,154877],{"class":124,"line":25264},[78,154878,51624],{},[78,154880,154881],{"class":124,"line":25269},[78,154882,51585],{},[78,154884,154885],{"class":124,"line":25274},[78,154886,23518],{},[78,154888,154889],{"class":124,"line":25280},[78,154890,51637],{},[78,154892,154893],{"class":124,"line":25286},[78,154894,51642],{},[78,154896,154897],{"class":124,"line":25292},[78,154898,51219],{},[78,154900,154901],{"class":124,"line":25298},[78,154902,51651],{},[78,154904,154905],{"class":124,"line":51654},[78,154906,51566],{},[78,154908,154909],{"class":124,"line":51659},[78,154910,51496],{},[78,154912,154913],{"class":124,"line":51664},[78,154914,51575],{},[78,154916,154917],{"class":124,"line":51669},[78,154918,51672],{},[78,154920,154921],{"class":124,"line":51675},[78,154922,51678],{},[78,154924,154925],{"class":124,"line":51681},[78,154926,51684],{},[78,154928,154929],{"class":124,"line":51687},[78,154930,51690],{},[78,154932,154933],{"class":124,"line":51693},[78,154934,23499],{},[78,154936,154937],{"class":124,"line":51698},[78,154938,51585],{},[78,154940,154941],{"class":124,"line":51703},[78,154942,23518],{},[78,154944,154945],{"class":124,"line":51708},[78,154946,51711],{},[78,154948,154949],{"class":124,"line":51714},[78,154950,51717],{},[78,154952,154953],{"class":124,"line":51720},[78,154954,51219],{},[78,154956,154957],{"class":124,"line":51725},[78,154958,51728],{},[78,154960,154961],{"class":124,"line":51731},[78,154962,51734],{},[78,154964,154965],{"class":124,"line":51737},[78,154966,51496],{},[78,154968,154969],{"class":124,"line":51742},[78,154970,51575],{},[78,154972,154973],{"class":124,"line":51747},[78,154974,51750],{},[78,154976,154977],{"class":124,"line":51753},[78,154978,51585],{},[78,154980,154981],{"class":124,"line":51758},[78,154982,23518],{},[78,154984,154985],{"class":124,"line":51763},[78,154986,51766],{},[78,154988,154989],{"class":124,"line":51769},[78,154990,51772],{},[78,154992,154993],{"class":124,"line":51775},[78,154994,51219],{},[78,154996,154997],{"class":124,"line":51780},[78,154998,51728],{},[78,155000,155001],{"class":124,"line":51785},[78,155002,51734],{},[78,155004,155005],{"class":124,"line":51790},[78,155006,51496],{},[78,155008,155009],{"class":124,"line":51795},[78,155010,51575],{},[78,155012,155013],{"class":124,"line":51800},[78,155014,51803],{},[78,155016,155017],{"class":124,"line":51806},[78,155018,51585],{},[78,155020,155021],{"class":124,"line":51811},[78,155022,23518],{},[78,155024,155025],{"class":124,"line":51816},[78,155026,51819],{},[78,155028,155029],{"class":124,"line":51822},[78,155030,51825],{},[78,155032,155033],{"class":124,"line":51828},[78,155034,51219],{},[78,155036,155037],{"class":124,"line":51833},[78,155038,51728],{},[78,155040,155041],{"class":124,"line":51838},[78,155042,51734],{},[78,155044,155045],{"class":124,"line":51843},[78,155046,51496],{},[78,155048,155049],{"class":124,"line":51848},[78,155050,51575],{},[78,155052,155053],{"class":124,"line":51853},[78,155054,51856],{},[78,155056,155057],{"class":124,"line":51859},[78,155058,51585],{},[78,155060,155061],{"class":124,"line":51864},[78,155062,23518],{},[78,155064,155065],{"class":124,"line":51869},[78,155066,51872],{},[78,155068,155069],{"class":124,"line":51875},[78,155070,51878],{},[78,155072,155073],{"class":124,"line":51881},[78,155074,51219],{},[78,155076,155077],{"class":124,"line":51886},[78,155078,51728],{},[78,155080,155081],{"class":124,"line":51891},[78,155082,51734],{},[78,155084,155085],{"class":124,"line":51896},[78,155086,51496],{},[78,155088,155089],{"class":124,"line":51901},[78,155090,51575],{},[78,155092,155093],{"class":124,"line":51906},[78,155094,51909],{},[78,155096,155097],{"class":124,"line":51912},[78,155098,51585],{},[78,155100,155101],{"class":124,"line":51917},[78,155102,23518],{},[78,155104,155105],{"class":124,"line":51922},[78,155106,51925],{},[78,155108,155109],{"class":124,"line":51928},[78,155110,51931],{},[78,155112,155113],{"class":124,"line":51934},[78,155114,51219],{},[78,155116,155117],{"class":124,"line":51939},[78,155118,51942],{},[78,155120,155121],{"class":124,"line":51945},[78,155122,23518],{},[78,155124,155125],{"class":124,"line":51950},[78,155126,51953],{},[78,155128,155129],{"class":124,"line":51956},[78,155130,51959],{},[78,155132,155133],{"class":124,"line":51962},[78,155134,51219],{},[78,155136,155137],{"class":124,"line":51967},[78,155138,51970],{},[78,155140,155141],{"class":124,"line":51973},[78,155142,51566],{},[78,155144,155145],{"class":124,"line":51978},[78,155146,51496],{},[78,155148,155149],{"class":124,"line":51983},[78,155150,51575],{},[78,155152,155153],{"class":124,"line":51988},[78,155154,51991],{},[78,155156,155157],{"class":124,"line":51994},[78,155158,51585],{},[78,155160,155161],{"class":124,"line":51999},[78,155162,23518],{},[78,155164,155165],{"class":124,"line":52004},[78,155166,51472],{},[78,155168,155169],{"class":124,"line":52009},[78,155170,52012],{},[78,155172,155173],{"class":124,"line":52015},[78,155174,51472],{},[107,155176,52020],{"id":52020},[7759,155178,52024],{"id":52023},[10548,155180,52028],{"id":52027},[13,155182,52031],{},[8366,155184,155185,155197],{},[8369,155186,155187],{},[8372,155188,155189,155193,155195],{},[8375,155190,155191],{"align":9247},[22,155192,52042],{},[8375,155194,52045],{"align":9247},[8375,155196,52048],{"align":9247},[8386,155198,155199,155213,155227,155241,155255,155269,155283],{},[8372,155200,155201,155205,155209],{},[8391,155202,155203],{"align":9247},[22,155204,52057],{},[8391,155206,155207],{"align":9247},[22,155208,52062],{},[8391,155210,155211],{"align":9247},[22,155212,52067],{},[8372,155214,155215,155219,155223],{},[8391,155216,155217],{"align":9247},[22,155218,52057],{},[8391,155220,155221],{"align":9247},[22,155222,52078],{},[8391,155224,155225],{"align":9247},[22,155226,52083],{},[8372,155228,155229,155233,155237],{},[8391,155230,155231],{"align":9247},[22,155232,52090],{},[8391,155234,155235],{"align":9247},[22,155236,52095],{},[8391,155238,155239],{"align":9247},[22,155240,52100],{},[8372,155242,155243,155247,155251],{},[8391,155244,155245],{"align":9247},[22,155246,52090],{},[8391,155248,155249],{"align":9247},[22,155250,52111],{},[8391,155252,155253],{"align":9247},[22,155254,52116],{},[8372,155256,155257,155261,155265],{},[8391,155258,155259],{"align":9247},[22,155260,52123],{},[8391,155262,155263],{"align":9247},[22,155264,52128],{},[8391,155266,155267],{"align":9247},[22,155268,52133],{},[8372,155270,155271,155275,155279],{},[8391,155272,155273],{"align":9247},[22,155274,52140],{},[8391,155276,155277],{"align":9247},[22,155278,52145],{},[8391,155280,155281],{"align":9247},[22,155282,52150],{},[8372,155284,155285,155289,155293],{},[8391,155286,155287],{"align":9247},[22,155288,52157],{},[8391,155290,155291],{"align":9247},[22,155292,52162],{},[8391,155294],{"align":9247},[13,155296,155297],{},[22,155298,11250],{},[13,155300,52171],{},[10548,155302,52175],{"id":52174},[78,155304,155306],{"className":155305},[4566],[78,155307,155309,155466],{"className":155308},[4570],[78,155310,155312],{"className":155311},[4574],[4576,155313,155314],{"xmlns":4578,"display":4579},[4581,155315,155316,155464],{},[4584,155317,155318,155320,155322,155324,155326,155328,155330,155332,155334,155336,155338,155340,155358,155380,155382,155384,155386,155388,155390,155392,155394,155396,155398,155400,155402,155404,155406,155408,155410,155412,155414,155416,155418,155436,155458,155460,155462],{},[4587,155319,52193],{},[4596,155321,5053],{},[4591,155323,4594],{"stretchy":4593},[4596,155325,19],{},[4591,155327,4604],{"stretchy":4593},[4587,155329,52204],{},[4596,155331,43673],{},[4591,155333,4594],{"stretchy":4593},[4596,155335,19],{},[4591,155337,4604],{"stretchy":4593},[4587,155339,52215],{},[4628,155341,155342,155348],{},[4584,155343,155344,155346],{},[4596,155345,52222],{},[4591,155347,17553],{},[4584,155349,155350,155352,155354,155356],{},[4596,155351,19],{},[4591,155353,52231],{},[4591,155355,7351],{},[4596,155357,52236],{"mathvariant":7101},[4611,155359,155360,155370],{},[4584,155361,155362,155364,155366,155368],{},[4596,155363,5053],{},[4591,155365,4594],{"stretchy":4593},[4596,155367,19],{},[4591,155369,4604],{"stretchy":4593},[4584,155371,155372,155374,155376,155378],{},[4596,155373,43673],{},[4591,155375,4594],{"stretchy":4593},[4596,155377,19],{},[4591,155379,4604],{"stretchy":4593},[4587,155381,52261],{},[4596,155383,5053],{},[4591,155385,4594],{"stretchy":4593},[4596,155387,19],{},[4591,155389,4604],{"stretchy":4593},[4591,155391,4609],{},[4596,155393,52274],{},[4591,155395,4594],{"stretchy":4593},[4596,155397,43673],{},[4591,155399,4594],{"stretchy":4593},[4596,155401,19],{},[4591,155403,4604],{"stretchy":4593},[4591,155405,4604],{"stretchy":4593},[4587,155407,52289],{},[4596,155409,7360],{},[4591,155411,52294],{},[7077,155413,2949],{},[4591,155415,2066],{"separator":1419},[4587,155417,52301],{},[4628,155419,155420,155426],{},[4584,155421,155422,155424],{},[4596,155423,52222],{},[4591,155425,17553],{},[4584,155427,155428,155430,155432,155434],{},[4596,155429,19],{},[4591,155431,52231],{},[4591,155433,7351],{},[4596,155435,52236],{"mathvariant":7101},[4611,155437,155438,155448],{},[4584,155439,155440,155442,155444,155446],{},[4596,155441,5053],{},[4591,155443,4594],{"stretchy":4593},[4596,155445,19],{},[4591,155447,4604],{"stretchy":4593},[4584,155449,155450,155452,155454,155456],{},[4596,155451,43673],{},[4591,155453,4594],{"stretchy":4593},[4596,155455,19],{},[4591,155457,4604],{"stretchy":4593},[4591,155459,52344],{},[4596,155461,7360],{},[4587,155463,67],{},[4647,155465,52351],{"encoding":4649},[78,155467,155469,155674,155713,155882],{"className":155468,"ariaHidden":1419},[4654],[78,155470,155472,155475,155478,155481,155484,155487,155490,155493,155496,155499,155502,155505,155508,155511,155567,155570,155650,155653,155656,155659,155662,155665,155668,155671],{"className":155471},[4658],[78,155473],{"className":155474,"style":52361},[4662],[78,155476,52193],{"className":155477},[4667,6184],[78,155479,5053],{"className":155480,"style":5170},[4667,4678],[78,155482,4594],{"className":155483},[4674],[78,155485,19],{"className":155486},[4667,4678],[78,155488,4604],{"className":155489},[4682],[78,155491,52204],{"className":155492},[4667,6184],[78,155494,43673],{"className":155495,"style":5187},[4667,4678],[78,155497,4594],{"className":155498},[4674],[78,155500,19],{"className":155501},[4667,4678],[78,155503,4604],{"className":155504},[4682],[78,155506,52215],{"className":155507},[4667,6184],[78,155509],{"className":155510,"style":4839},[4739],[78,155512,155514],{"className":155513},[4788,52401],[78,155515,155517,155559],{"className":155516},[4693,4694],[78,155518,155520,155556],{"className":155519},[4698],[78,155521,155523,155546],{"className":155522,"style":16794},[4702],[78,155524,155525,155528],{"style":52413},[78,155526],{"className":155527,"style":4781},[4710],[78,155529,155531],{"className":155530},[4715,4716,4717,4718],[78,155532,155534,155537,155540,155543],{"className":155533},[4667,4718],[78,155535,19],{"className":155536},[4667,4678,4718],[78,155538,52231],{"className":155539},[4744,4718],[78,155541,7351],{"className":155542},[4667,4718],[78,155544,52236],{"className":155545},[4667,4718],[78,155547,155548,155551],{"style":5824},[78,155549],{"className":155550,"style":4781},[4710],[78,155552,155553],{},[78,155554,52222],{"className":155555},[4788],[78,155557,4726],{"className":155558},[4725],[78,155560,155562],{"className":155561},[4698],[78,155563,155565],{"className":155564,"style":52454},[4702],[78,155566],{},[78,155568],{"className":155569,"style":4839},[4739],[78,155571,155573,155576,155647],{"className":155572},[4667],[78,155574],{"className":155575},[4674,4761],[78,155577,155579],{"className":155578},[4611],[78,155580,155582,155639],{"className":155581},[4693,4694],[78,155583,155585,155636],{"className":155584},[4698],[78,155586,155588,155608,155616],{"className":155587,"style":52478},[4702],[78,155589,155590,155593],{"style":4777},[78,155591],{"className":155592,"style":4781},[4710],[78,155594,155596,155599,155602,155605],{"className":155595},[4667],[78,155597,43673],{"className":155598,"style":5187},[4667,4678],[78,155600,4594],{"className":155601},[4674],[78,155603,19],{"className":155604},[4667,4678],[78,155606,4604],{"className":155607},[4682],[78,155609,155610,155613],{"style":4919},[78,155611],{"className":155612,"style":4781},[4710],[78,155614],{"className":155615,"style":4927},[4926],[78,155617,155618,155621],{"style":4930},[78,155619],{"className":155620,"style":4781},[4710],[78,155622,155624,155627,155630,155633],{"className":155623},[4667],[78,155625,5053],{"className":155626,"style":5170},[4667,4678],[78,155628,4594],{"className":155629},[4674],[78,155631,19],{"className":155632},[4667,4678],[78,155634,4604],{"className":155635},[4682],[78,155637,4726],{"className":155638},[4725],[78,155640,155642],{"className":155641},[4698],[78,155643,155645],{"className":155644,"style":17380},[4702],[78,155646],{},[78,155648],{"className":155649},[4682,4761],[78,155651,52261],{"className":155652},[4667,6184],[78,155654,5053],{"className":155655,"style":5170},[4667,4678],[78,155657,4594],{"className":155658},[4674],[78,155660,19],{"className":155661},[4667,4678],[78,155663,4604],{"className":155664},[4682],[78,155666],{"className":155667,"style":4740},[4739],[78,155669,4609],{"className":155670},[4744],[78,155672],{"className":155673,"style":4740},[4739],[78,155675,155677,155680,155683,155686,155689,155692,155695,155698,155701,155704,155707,155710],{"className":155676},[4658],[78,155678],{"className":155679,"style":4663},[4662],[78,155681,52274],{"className":155682,"style":17251},[4667,4678],[78,155684,4594],{"className":155685},[4674],[78,155687,43673],{"className":155688,"style":5187},[4667,4678],[78,155690,4594],{"className":155691},[4674],[78,155693,19],{"className":155694},[4667,4678],[78,155696,38757],{"className":155697},[4682],[78,155699,52289],{"className":155700},[4667,6184],[78,155702,7360],{"className":155703},[4667,4678],[78,155705],{"className":155706,"style":4740},[4739],[78,155708,52294],{"className":155709},[4744],[78,155711],{"className":155712,"style":4740},[4739],[78,155714,155716,155719,155722,155725,155728,155731,155734,155790,155793,155873,155876,155879],{"className":155715},[4658],[78,155717],{"className":155718,"style":52361},[4662],[78,155720,2949],{"className":155721},[4667],[78,155723,2066],{"className":155724},[5126],[78,155726],{"className":155727,"style":4839},[4739],[78,155729,52301],{"className":155730},[4667,6184],[78,155732],{"className":155733,"style":4839},[4739],[78,155735,155737],{"className":155736},[4788,52401],[78,155738,155740,155782],{"className":155739},[4693,4694],[78,155741,155743,155779],{"className":155742},[4698],[78,155744,155746,155769],{"className":155745,"style":16794},[4702],[78,155747,155748,155751],{"style":52413},[78,155749],{"className":155750,"style":4781},[4710],[78,155752,155754],{"className":155753},[4715,4716,4717,4718],[78,155755,155757,155760,155763,155766],{"className":155756},[4667,4718],[78,155758,19],{"className":155759},[4667,4678,4718],[78,155761,52231],{"className":155762},[4744,4718],[78,155764,7351],{"className":155765},[4667,4718],[78,155767,52236],{"className":155768},[4667,4718],[78,155770,155771,155774],{"style":5824},[78,155772],{"className":155773,"style":4781},[4710],[78,155775,155776],{},[78,155777,52222],{"className":155778},[4788],[78,155780,4726],{"className":155781},[4725],[78,155783,155785],{"className":155784},[4698],[78,155786,155788],{"className":155787,"style":52454},[4702],[78,155789],{},[78,155791],{"className":155792,"style":4839},[4739],[78,155794,155796,155799,155870],{"className":155795},[4667],[78,155797],{"className":155798},[4674,4761],[78,155800,155802],{"className":155801},[4611],[78,155803,155805,155862],{"className":155804},[4693,4694],[78,155806,155808,155859],{"className":155807},[4698],[78,155809,155811,155831,155839],{"className":155810,"style":52478},[4702],[78,155812,155813,155816],{"style":4777},[78,155814],{"className":155815,"style":4781},[4710],[78,155817,155819,155822,155825,155828],{"className":155818},[4667],[78,155820,43673],{"className":155821,"style":5187},[4667,4678],[78,155823,4594],{"className":155824},[4674],[78,155826,19],{"className":155827},[4667,4678],[78,155829,4604],{"className":155830},[4682],[78,155832,155833,155836],{"style":4919},[78,155834],{"className":155835,"style":4781},[4710],[78,155837],{"className":155838,"style":4927},[4926],[78,155840,155841,155844],{"style":4930},[78,155842],{"className":155843,"style":4781},[4710],[78,155845,155847,155850,155853,155856],{"className":155846},[4667],[78,155848,5053],{"className":155849,"style":5170},[4667,4678],[78,155851,4594],{"className":155852},[4674],[78,155854,19],{"className":155855},[4667,4678],[78,155857,4604],{"className":155858},[4682],[78,155860,4726],{"className":155861},[4725],[78,155863,155865],{"className":155864},[4698],[78,155866,155868],{"className":155867,"style":17380},[4702],[78,155869],{},[78,155871],{"className":155872},[4682,4761],[78,155874],{"className":155875,"style":4740},[4739],[78,155877,52344],{"className":155878},[4744],[78,155880],{"className":155881,"style":4740},[4739],[78,155883,155885,155888,155891],{"className":155884},[4658],[78,155886],{"className":155887,"style":18224},[4662],[78,155889,7360],{"className":155890},[4667,4678],[78,155892,67],{"className":155893},[4667,6184],[10548,155895,52788],{"id":52787},[78,155897,155899],{"className":155898},[4566],[78,155900,155902,156115],{"className":155901},[4570],[78,155903,155905],{"className":155904},[4574],[4576,155906,155907],{"xmlns":4578,"display":4579},[4581,155908,155909,156113],{},[4584,155910,155911,155913,155915,155917,155919,155921,155935,155937,155939,155941,155943,155945,155947,155949,155951,155953,155955,155957,155967,155969,155971,155973,155983,155985,155987,155989,155991,156007,156009,156011,156013,156023,156025,156027,156029,156031,156037,156039,156041,156043,156049,156051,156053,156055,156067,156069,156071,156077,156079,156081,156083,156089,156091,156093,156099,156101,156103,156105,156107,156109,156111],{},[4587,155912,52806],{},[4596,155914,4598],{},[4587,155916,52204],{},[4596,155918,52813],{},[4587,155920,52816],{},[4614,155922,155923,155929],{},[4584,155924,155925,155927],{},[4596,155926,52823],{},[4591,155928,17553],{},[4584,155930,155931,155933],{},[4591,155932,17848],{},[4596,155934,4598],{},[4596,155936,19],{},[4591,155938,4609],{},[4596,155940,52274],{},[4591,155942,4594],{"stretchy":4593},[7077,155944,469],{},[4591,155946,4604],{"stretchy":4593},[4591,155948,2066],{"separator":1419},[4596,155950,4598],{},[4591,155952,4609],{},[4596,155954,52274],{},[4591,155956,4594],{"stretchy":4593},[4614,155958,155959,155965],{},[4584,155960,155961,155963],{},[4596,155962,52823],{},[4591,155964,17553],{},[4596,155966,52813],{},[4596,155968,19],{},[4591,155970,4604],{"stretchy":4593},[4591,155972,2066],{"separator":1419},[4614,155974,155975,155981],{},[4584,155976,155977,155979],{},[4596,155978,52823],{},[4591,155980,17553],{},[4596,155982,4598],{},[4596,155984,19],{},[4591,155986,4609],{},[4596,155988,52274],{},[4591,155990,4594],{"stretchy":4593},[4614,155992,155993,155999],{},[4584,155994,155995,155997],{},[4596,155996,52823],{},[4591,155998,17553],{},[4584,156000,156001,156003,156005],{},[4596,156002,4598],{},[4591,156004,7351],{},[4596,156006,52813],{},[4596,156008,19],{},[4591,156010,4604],{"stretchy":4593},[4591,156012,2066],{"separator":1419},[4614,156014,156015,156021],{},[4584,156016,156017,156019],{},[4596,156018,52823],{},[4591,156020,17553],{},[4596,156022,4598],{},[4596,156024,19],{},[4591,156026,4609],{},[4596,156028,52274],{},[4591,156030,4594],{"stretchy":4593},[4614,156032,156033,156035],{},[4596,156034,19],{},[4596,156036,52813],{},[4591,156038,4604],{"stretchy":4593},[4591,156040,2066],{"separator":1419},[4739,156042],{"linebreak":52940},[4614,156044,156045,156047],{},[4596,156046,19],{},[4596,156048,4598],{},[4591,156050,4609],{},[4596,156052,52274],{},[4591,156054,4594],{"stretchy":4593},[4614,156056,156057,156059],{},[4596,156058,19],{},[4584,156060,156061,156063,156065],{},[4596,156062,4598],{},[4591,156064,7351],{},[4596,156066,52813],{},[4591,156068,4604],{"stretchy":4593},[4591,156070,2066],{"separator":1419},[4614,156072,156073,156075],{},[4596,156074,19],{},[4596,156076,4598],{},[4591,156078,4609],{},[4596,156080,52274],{},[4591,156082,4594],{"stretchy":4593},[4614,156084,156085,156087],{},[7077,156086,472],{},[4596,156088,19],{},[4591,156090,4604],{"stretchy":4593},[4587,156092,52204],{},[4614,156094,156095,156097],{},[7077,156096,472],{},[4596,156098,19],{},[4591,156100,4609],{},[4596,156102,52274],{},[4591,156104,4594],{"stretchy":4593},[7077,156106,472],{},[4591,156108,53007],{"stretchy":4593},[4591,156110,4604],{"stretchy":4593},[4587,156112,53012],{},[4647,156114,53015],{"encoding":4649},[78,156116,156118,156194,156230,156340,156456,156506,156509,156553,156650,156735],{"className":156117,"ariaHidden":1419},[4654],[78,156119,156121,156124,156127,156130,156133,156136,156139,156142,156179,156182,156185,156188,156191],{"className":156120},[4658],[78,156122],{"className":156123,"style":53025},[4662],[78,156125,52806],{"className":156126},[4667,6184],[78,156128,4598],{"className":156129},[4667,4678],[78,156131,52204],{"className":156132},[4667,6184],[78,156134,52813],{"className":156135},[4667,4678],[78,156137,52816],{"className":156138},[4667,6184],[78,156140],{"className":156141,"style":4839},[4739],[78,156143,156145,156150],{"className":156144},[4788],[78,156146,53050,156148],{"className":156147},[4788],[78,156149,43673],{"style":53053},[78,156151,156153],{"className":156152},[4689],[78,156154,156156],{"className":156155},[4693],[78,156157,156159],{"className":156158},[4698],[78,156160,156162],{"className":156161,"style":53066},[4702],[78,156163,156164,156167],{"style":53069},[78,156165],{"className":156166,"style":4711},[4710],[78,156168,156170],{"className":156169},[4715,4716,4717,4718],[78,156171,156173,156176],{"className":156172},[4667,4718],[78,156174,17848],{"className":156175},[4667,4718],[78,156177,4598],{"className":156178},[4667,4678,4718],[78,156180],{"className":156181,"style":4839},[4739],[78,156183,19],{"className":156184},[4667,4678],[78,156186],{"className":156187,"style":4740},[4739],[78,156189,4609],{"className":156190},[4744],[78,156192],{"className":156193,"style":4740},[4739],[78,156195,156197,156200,156203,156206,156209,156212,156215,156218,156221,156224,156227],{"className":156196},[4658],[78,156198],{"className":156199,"style":4663},[4662],[78,156201,52274],{"className":156202,"style":17251},[4667,4678],[78,156204,4594],{"className":156205},[4674],[78,156207,469],{"className":156208},[4667],[78,156210,4604],{"className":156211},[4682],[78,156213,2066],{"className":156214},[5126],[78,156216],{"className":156217,"style":4839},[4739],[78,156219,4598],{"className":156220},[4667,4678],[78,156222],{"className":156223,"style":4740},[4739],[78,156225,4609],{"className":156226},[4744],[78,156228],{"className":156229,"style":4740},[4739],[78,156231,156233,156236,156239,156242,156276,156279,156282,156285,156288,156291,156325,156328,156331,156334,156337],{"className":156232},[4658],[78,156234],{"className":156235,"style":4663},[4662],[78,156237,52274],{"className":156238,"style":17251},[4667,4678],[78,156240,4594],{"className":156241},[4674],[78,156243,156245,156250],{"className":156244},[4788],[78,156246,53050,156248],{"className":156247},[4788],[78,156249,43673],{"style":53053},[78,156251,156253],{"className":156252},[4689],[78,156254,156256],{"className":156255},[4693],[78,156257,156259],{"className":156258},[4698],[78,156260,156262],{"className":156261,"style":53168},[4702],[78,156263,156264,156267],{"style":53069},[78,156265],{"className":156266,"style":4711},[4710],[78,156268,156270],{"className":156269},[4715,4716,4717,4718],[78,156271,156273],{"className":156272},[4667,4718],[78,156274,52813],{"className":156275},[4667,4678,4718],[78,156277],{"className":156278,"style":4839},[4739],[78,156280,19],{"className":156281},[4667,4678],[78,156283,4604],{"className":156284},[4682],[78,156286,2066],{"className":156287},[5126],[78,156289],{"className":156290,"style":4839},[4739],[78,156292,156294,156299],{"className":156293},[4788],[78,156295,53050,156297],{"className":156296},[4788],[78,156298,43673],{"style":53053},[78,156300,156302],{"className":156301},[4689],[78,156303,156305],{"className":156304},[4693],[78,156306,156308],{"className":156307},[4698],[78,156309,156311],{"className":156310,"style":53168},[4702],[78,156312,156313,156316],{"style":53069},[78,156314],{"className":156315,"style":4711},[4710],[78,156317,156319],{"className":156318},[4715,4716,4717,4718],[78,156320,156322],{"className":156321},[4667,4718],[78,156323,4598],{"className":156324},[4667,4678,4718],[78,156326],{"className":156327,"style":4839},[4739],[78,156329,19],{"className":156330},[4667,4678],[78,156332],{"className":156333,"style":4740},[4739],[78,156335,4609],{"className":156336},[4744],[78,156338],{"className":156339,"style":4740},[4739],[78,156341,156343,156346,156349,156352,156392,156395,156398,156401,156404,156407,156441,156444,156447,156450,156453],{"className":156342},[4658],[78,156344],{"className":156345,"style":53253},[4662],[78,156347,52274],{"className":156348,"style":17251},[4667,4678],[78,156350,4594],{"className":156351},[4674],[78,156353,156355,156360],{"className":156354},[4788],[78,156356,53050,156358],{"className":156357},[4788],[78,156359,43673],{"style":53053},[78,156361,156363],{"className":156362},[4689],[78,156364,156366],{"className":156365},[4693],[78,156367,156369],{"className":156368},[4698],[78,156370,156372],{"className":156371,"style":53066},[4702],[78,156373,156374,156377],{"style":53069},[78,156375],{"className":156376,"style":4711},[4710],[78,156378,156380],{"className":156379},[4715,4716,4717,4718],[78,156381,156383,156386,156389],{"className":156382},[4667,4718],[78,156384,4598],{"className":156385},[4667,4678,4718],[78,156387,7351],{"className":156388},[7450,4718],[78,156390,52813],{"className":156391},[4667,4678,4718],[78,156393],{"className":156394,"style":4839},[4739],[78,156396,19],{"className":156397},[4667,4678],[78,156399,4604],{"className":156400},[4682],[78,156402,2066],{"className":156403},[5126],[78,156405],{"className":156406,"style":4839},[4739],[78,156408,156410,156415],{"className":156409},[4788],[78,156411,53050,156413],{"className":156412},[4788],[78,156414,43673],{"style":53053},[78,156416,156418],{"className":156417},[4689],[78,156419,156421],{"className":156420},[4693],[78,156422,156424],{"className":156423},[4698],[78,156425,156427],{"className":156426,"style":53168},[4702],[78,156428,156429,156432],{"style":53069},[78,156430],{"className":156431,"style":4711},[4710],[78,156433,156435],{"className":156434},[4715,4716,4717,4718],[78,156436,156438],{"className":156437},[4667,4718],[78,156439,4598],{"className":156440},[4667,4678,4718],[78,156442],{"className":156443,"style":4839},[4739],[78,156445,19],{"className":156446},[4667,4678],[78,156448],{"className":156449,"style":4740},[4739],[78,156451,4609],{"className":156452},[4744],[78,156454],{"className":156455,"style":4740},[4739],[78,156457,156459,156462,156465,156468,156500,156503],{"className":156458},[4658],[78,156460],{"className":156461,"style":4663},[4662],[78,156463,52274],{"className":156464,"style":17251},[4667,4678],[78,156466,4594],{"className":156467},[4674],[78,156469,156471,156474],{"className":156470},[4667],[78,156472,19],{"className":156473},[4667,4678],[78,156475,156477],{"className":156476},[4689],[78,156478,156480],{"className":156479},[4693],[78,156481,156483],{"className":156482},[4698],[78,156484,156486],{"className":156485,"style":53394},[4702],[78,156487,156488,156491],{"style":5209},[78,156489],{"className":156490,"style":4711},[4710],[78,156492,156494],{"className":156493},[4715,4716,4717,4718],[78,156495,156497],{"className":156496},[4667,4718],[78,156498,52813],{"className":156499},[4667,4678,4718],[78,156501,4604],{"className":156502},[4682],[78,156504,2066],{"className":156505},[5126],[78,156507],{"className":156508},[4739,52940],[78,156510,156512,156515,156544,156547,156550],{"className":156511},[4658],[78,156513],{"className":156514,"style":53394},[4662],[78,156516,156518,156521],{"className":156517},[4667],[78,156519,19],{"className":156520},[4667,4678],[78,156522,156524],{"className":156523},[4689],[78,156525,156527],{"className":156526},[4693],[78,156528,156530],{"className":156529},[4698],[78,156531,156533],{"className":156532,"style":53394},[4702],[78,156534,156535,156538],{"style":5209},[78,156536],{"className":156537,"style":4711},[4710],[78,156539,156541],{"className":156540},[4715,4716,4717,4718],[78,156542,4598],{"className":156543},[4667,4678,4718],[78,156545],{"className":156546,"style":4740},[4739],[78,156548,4609],{"className":156549},[4744],[78,156551],{"className":156552,"style":4740},[4739],[78,156554,156556,156559,156562,156565,156603,156606,156609,156612,156641,156644,156647],{"className":156555},[4658],[78,156557],{"className":156558,"style":53468},[4662],[78,156560,52274],{"className":156561,"style":17251},[4667,4678],[78,156563,4594],{"className":156564},[4674],[78,156566,156568,156571],{"className":156567},[4667],[78,156569,19],{"className":156570},[4667,4678],[78,156572,156574],{"className":156573},[4689],[78,156575,156577],{"className":156576},[4693],[78,156578,156580],{"className":156579},[4698],[78,156581,156583],{"className":156582,"style":53493},[4702],[78,156584,156585,156588],{"style":5209},[78,156586],{"className":156587,"style":4711},[4710],[78,156589,156591],{"className":156590},[4715,4716,4717,4718],[78,156592,156594,156597,156600],{"className":156593},[4667,4718],[78,156595,4598],{"className":156596},[4667,4678,4718],[78,156598,7351],{"className":156599},[7450,4718],[78,156601,52813],{"className":156602},[4667,4678,4718],[78,156604,4604],{"className":156605},[4682],[78,156607,2066],{"className":156608},[5126],[78,156610],{"className":156611,"style":4839},[4739],[78,156613,156615,156618],{"className":156614},[4667],[78,156616,19],{"className":156617},[4667,4678],[78,156619,156621],{"className":156620},[4689],[78,156622,156624],{"className":156623},[4693],[78,156625,156627],{"className":156626},[4698],[78,156628,156630],{"className":156629,"style":53394},[4702],[78,156631,156632,156635],{"style":5209},[78,156633],{"className":156634,"style":4711},[4710],[78,156636,156638],{"className":156637},[4715,4716,4717,4718],[78,156639,4598],{"className":156640},[4667,4678,4718],[78,156642],{"className":156643,"style":4740},[4739],[78,156645,4609],{"className":156646},[4744],[78,156648],{"className":156649,"style":4740},[4739],[78,156651,156653,156656,156659,156662,156691,156694,156697,156726,156729,156732],{"className":156652},[4658],[78,156654],{"className":156655,"style":4663},[4662],[78,156657,52274],{"className":156658,"style":17251},[4667,4678],[78,156660,4594],{"className":156661},[4674],[78,156663,156665,156668],{"className":156664},[4667],[78,156666,472],{"className":156667},[4667],[78,156669,156671],{"className":156670},[4689],[78,156672,156674],{"className":156673},[4693],[78,156675,156677],{"className":156676},[4698],[78,156678,156680],{"className":156679,"style":53394},[4702],[78,156681,156682,156685],{"style":5209},[78,156683],{"className":156684,"style":4711},[4710],[78,156686,156688],{"className":156687},[4715,4716,4717,4718],[78,156689,19],{"className":156690},[4667,4678,4718],[78,156692,4604],{"className":156693},[4682],[78,156695,52204],{"className":156696},[4667,6184],[78,156698,156700,156703],{"className":156699},[4667],[78,156701,472],{"className":156702},[4667],[78,156704,156706],{"className":156705},[4689],[78,156707,156709],{"className":156708},[4693],[78,156710,156712],{"className":156711},[4698],[78,156713,156715],{"className":156714,"style":53394},[4702],[78,156716,156717,156720],{"style":5209},[78,156718],{"className":156719,"style":4711},[4710],[78,156721,156723],{"className":156722},[4715,4716,4717,4718],[78,156724,19],{"className":156725},[4667,4678,4718],[78,156727],{"className":156728,"style":4740},[4739],[78,156730,4609],{"className":156731},[4744],[78,156733],{"className":156734,"style":4740},[4739],[78,156736,156738,156741,156744,156747,156750,156753],{"className":156737},[4658],[78,156739],{"className":156740,"style":4663},[4662],[78,156742,52274],{"className":156743,"style":17251},[4667,4678],[78,156745,4594],{"className":156746},[4674],[78,156748,472],{"className":156749},[4667],[78,156751,53664],{"className":156752},[4682],[78,156754,53012],{"className":156755},[4667,6184],[13,156757,53670],{},[78,156759,156761],{"className":156760},[4566],[78,156762,156764,156801],{"className":156763},[4570],[78,156765,156767],{"className":156766},[4574],[4576,156768,156769],{"xmlns":4578,"display":4579},[4581,156770,156771,156799],{},[4584,156772,156773,156783,156785,156787,156789,156791,156797],{},[4614,156774,156775,156781],{},[4584,156776,156777,156779],{},[4596,156778,52823],{},[4591,156780,17553],{},[7077,156782,22822],{},[4596,156784,19],{},[4591,156786,4609],{},[4596,156788,52274],{},[4591,156790,4594],{"stretchy":4593},[4614,156792,156793,156795],{},[4596,156794,19],{},[7077,156796,53710],{},[4591,156798,4604],{"stretchy":4593},[4647,156800,53715],{"encoding":4649},[78,156802,156804,156859],{"className":156803,"ariaHidden":1419},[4654],[78,156805,156807,156810,156844,156847,156850,156853,156856],{"className":156806},[4658],[78,156808],{"className":156809,"style":53725},[4662],[78,156811,156813,156818],{"className":156812},[4788],[78,156814,53050,156816],{"className":156815},[4788],[78,156817,43673],{"style":53053},[78,156819,156821],{"className":156820},[4689],[78,156822,156824],{"className":156823},[4693],[78,156825,156827],{"className":156826},[4698],[78,156828,156830],{"className":156829,"style":53746},[4702],[78,156831,156832,156835],{"style":53069},[78,156833],{"className":156834,"style":4711},[4710],[78,156836,156838],{"className":156837},[4715,4716,4717,4718],[78,156839,156841],{"className":156840},[4667,4718],[78,156842,22822],{"className":156843},[4667,4718],[78,156845],{"className":156846,"style":4839},[4739],[78,156848,19],{"className":156849},[4667,4678],[78,156851],{"className":156852,"style":4740},[4739],[78,156854,4609],{"className":156855},[4744],[78,156857],{"className":156858,"style":4740},[4739],[78,156860,156862,156865,156868,156871,156903],{"className":156861},[4658],[78,156863],{"className":156864,"style":53782},[4662],[78,156866,52274],{"className":156867,"style":17251},[4667,4678],[78,156869,4594],{"className":156870},[4674],[78,156872,156874,156877],{"className":156873},[4667],[78,156875,19],{"className":156876},[4667,4678],[78,156878,156880],{"className":156879},[4689],[78,156881,156883],{"className":156882},[4693],[78,156884,156886],{"className":156885},[4698],[78,156887,156889],{"className":156888,"style":53807},[4702],[78,156890,156891,156894],{"style":5209},[78,156892],{"className":156893,"style":4711},[4710],[78,156895,156897],{"className":156896},[4715,4716,4717,4718],[78,156898,156900],{"className":156899},[4667,4718],[78,156901,53710],{"className":156902},[4667,4718],[78,156904,4604],{"className":156905},[4682],[7759,156907,53828],{"id":53827},[10548,156909,53832],{"id":53831},[13,156911,53835],{},[10548,156913,53839],{"id":53838},[78,156915,156917],{"className":156916},[4566],[78,156918,156920,157077],{"className":156919},[4570],[78,156921,156923],{"className":156922},[4574],[4576,156924,156925],{"xmlns":4578,"display":4579},[4581,156926,156927,157075],{},[4584,156928,156929,156931,156933,156935,156937,156939,156941,156943,156945,156947,156949,156951,156969,156991,156993,156995,156997,156999,157001,157003,157005,157007,157009,157011,157013,157015,157017,157019,157021,157023,157025,157027,157045,157067,157069,157071,157073],{},[4587,156930,53857],{},[4596,156932,5053],{},[4591,156934,4594],{"stretchy":4593},[4596,156936,19],{},[4591,156938,4604],{"stretchy":4593},[4587,156940,52204],{},[4596,156942,43673],{},[4591,156944,4594],{"stretchy":4593},[4596,156946,19],{},[4591,156948,4604],{"stretchy":4593},[4587,156950,52215],{},[4628,156952,156953,156959],{},[4584,156954,156955,156957],{},[4596,156956,52222],{},[4591,156958,17553],{},[4584,156960,156961,156963,156965,156967],{},[4596,156962,19],{},[4591,156964,52231],{},[4591,156966,7351],{},[4596,156968,52236],{"mathvariant":7101},[4611,156970,156971,156981],{},[4584,156972,156973,156975,156977,156979],{},[4596,156974,43673],{},[4591,156976,4594],{"stretchy":4593},[4596,156978,19],{},[4591,156980,4604],{"stretchy":4593},[4584,156982,156983,156985,156987,156989],{},[4596,156984,5053],{},[4591,156986,4594],{"stretchy":4593},[4596,156988,19],{},[4591,156990,4604],{"stretchy":4593},[4587,156992,52261],{},[4596,156994,5053],{},[4591,156996,4594],{"stretchy":4593},[4596,156998,19],{},[4591,157000,4604],{"stretchy":4593},[4591,157002,4609],{},[4596,157004,53932],{"mathvariant":7101},[4591,157006,4594],{"stretchy":4593},[4596,157008,43673],{},[4591,157010,4594],{"stretchy":4593},[4596,157012,19],{},[4591,157014,4604],{"stretchy":4593},[4591,157016,4604],{"stretchy":4593},[4587,157018,53947],{},[4596,157020,7360],{},[4591,157022,52294],{},[7077,157024,2949],{},[4587,157026,53956],{},[4628,157028,157029,157035],{},[4584,157030,157031,157033],{},[4596,157032,52222],{},[4591,157034,17553],{},[4584,157036,157037,157039,157041,157043],{},[4596,157038,19],{},[4591,157040,52231],{},[4591,157042,7351],{},[4596,157044,52236],{"mathvariant":7101},[4611,157046,157047,157057],{},[4584,157048,157049,157051,157053,157055],{},[4596,157050,43673],{},[4591,157052,4594],{"stretchy":4593},[4596,157054,19],{},[4591,157056,4604],{"stretchy":4593},[4584,157058,157059,157061,157063,157065],{},[4596,157060,5053],{},[4591,157062,4594],{"stretchy":4593},[4596,157064,19],{},[4591,157066,4604],{"stretchy":4593},[4591,157068,41631],{},[4591,157070,4609],{},[4596,157072,7360],{},[4587,157074,67],{},[4647,157076,54007],{"encoding":4649},[78,157078,157080,157285,157324,157487],{"className":157079,"ariaHidden":1419},[4654],[78,157081,157083,157086,157089,157092,157095,157098,157101,157104,157107,157110,157113,157116,157119,157122,157178,157181,157261,157264,157267,157270,157273,157276,157279,157282],{"className":157082},[4658],[78,157084],{"className":157085,"style":52361},[4662],[78,157087,53857],{"className":157088},[4667,6184],[78,157090,5053],{"className":157091,"style":5170},[4667,4678],[78,157093,4594],{"className":157094},[4674],[78,157096,19],{"className":157097},[4667,4678],[78,157099,4604],{"className":157100},[4682],[78,157102,52204],{"className":157103},[4667,6184],[78,157105,43673],{"className":157106,"style":5187},[4667,4678],[78,157108,4594],{"className":157109},[4674],[78,157111,19],{"className":157112},[4667,4678],[78,157114,4604],{"className":157115},[4682],[78,157117,52215],{"className":157118},[4667,6184],[78,157120],{"className":157121,"style":4839},[4739],[78,157123,157125],{"className":157124},[4788,52401],[78,157126,157128,157170],{"className":157127},[4693,4694],[78,157129,157131,157167],{"className":157130},[4698],[78,157132,157134,157157],{"className":157133,"style":16794},[4702],[78,157135,157136,157139],{"style":52413},[78,157137],{"className":157138,"style":4781},[4710],[78,157140,157142],{"className":157141},[4715,4716,4717,4718],[78,157143,157145,157148,157151,157154],{"className":157144},[4667,4718],[78,157146,19],{"className":157147},[4667,4678,4718],[78,157149,52231],{"className":157150},[4744,4718],[78,157152,7351],{"className":157153},[4667,4718],[78,157155,52236],{"className":157156},[4667,4718],[78,157158,157159,157162],{"style":5824},[78,157160],{"className":157161,"style":4781},[4710],[78,157163,157164],{},[78,157165,52222],{"className":157166},[4788],[78,157168,4726],{"className":157169},[4725],[78,157171,157173],{"className":157172},[4698],[78,157174,157176],{"className":157175,"style":52454},[4702],[78,157177],{},[78,157179],{"className":157180,"style":4839},[4739],[78,157182,157184,157187,157258],{"className":157183},[4667],[78,157185],{"className":157186},[4674,4761],[78,157188,157190],{"className":157189},[4611],[78,157191,157193,157250],{"className":157192},[4693,4694],[78,157194,157196,157247],{"className":157195},[4698],[78,157197,157199,157219,157227],{"className":157198,"style":52478},[4702],[78,157200,157201,157204],{"style":4777},[78,157202],{"className":157203,"style":4781},[4710],[78,157205,157207,157210,157213,157216],{"className":157206},[4667],[78,157208,5053],{"className":157209,"style":5170},[4667,4678],[78,157211,4594],{"className":157212},[4674],[78,157214,19],{"className":157215},[4667,4678],[78,157217,4604],{"className":157218},[4682],[78,157220,157221,157224],{"style":4919},[78,157222],{"className":157223,"style":4781},[4710],[78,157225],{"className":157226,"style":4927},[4926],[78,157228,157229,157232],{"style":4930},[78,157230],{"className":157231,"style":4781},[4710],[78,157233,157235,157238,157241,157244],{"className":157234},[4667],[78,157236,43673],{"className":157237,"style":5187},[4667,4678],[78,157239,4594],{"className":157240},[4674],[78,157242,19],{"className":157243},[4667,4678],[78,157245,4604],{"className":157246},[4682],[78,157248,4726],{"className":157249},[4725],[78,157251,157253],{"className":157252},[4698],[78,157254,157256],{"className":157255,"style":17380},[4702],[78,157257],{},[78,157259],{"className":157260},[4682,4761],[78,157262,52261],{"className":157263},[4667,6184],[78,157265,5053],{"className":157266,"style":5170},[4667,4678],[78,157268,4594],{"className":157269},[4674],[78,157271,19],{"className":157272},[4667,4678],[78,157274,4604],{"className":157275},[4682],[78,157277],{"className":157278,"style":4740},[4739],[78,157280,4609],{"className":157281},[4744],[78,157283],{"className":157284,"style":4740},[4739],[78,157286,157288,157291,157294,157297,157300,157303,157306,157309,157312,157315,157318,157321],{"className":157287},[4658],[78,157289],{"className":157290,"style":4663},[4662],[78,157292,53932],{"className":157293},[4667],[78,157295,4594],{"className":157296},[4674],[78,157298,43673],{"className":157299,"style":5187},[4667,4678],[78,157301,4594],{"className":157302},[4674],[78,157304,19],{"className":157305},[4667,4678],[78,157307,38757],{"className":157308},[4682],[78,157310,53947],{"className":157311},[4667,6184],[78,157313,7360],{"className":157314},[4667,4678],[78,157316],{"className":157317,"style":4740},[4739],[78,157319,52294],{"className":157320},[4744],[78,157322],{"className":157323,"style":4740},[4739],[78,157325,157327,157330,157333,157336,157339,157395,157398,157478,157481,157484],{"className":157326},[4658],[78,157328],{"className":157329,"style":52361},[4662],[78,157331,2949],{"className":157332},[4667],[78,157334,53956],{"className":157335},[4667,6184],[78,157337],{"className":157338,"style":4839},[4739],[78,157340,157342],{"className":157341},[4788,52401],[78,157343,157345,157387],{"className":157344},[4693,4694],[78,157346,157348,157384],{"className":157347},[4698],[78,157349,157351,157374],{"className":157350,"style":16794},[4702],[78,157352,157353,157356],{"style":52413},[78,157354],{"className":157355,"style":4781},[4710],[78,157357,157359],{"className":157358},[4715,4716,4717,4718],[78,157360,157362,157365,157368,157371],{"className":157361},[4667,4718],[78,157363,19],{"className":157364},[4667,4678,4718],[78,157366,52231],{"className":157367},[4744,4718],[78,157369,7351],{"className":157370},[4667,4718],[78,157372,52236],{"className":157373},[4667,4718],[78,157375,157376,157379],{"style":5824},[78,157377],{"className":157378,"style":4781},[4710],[78,157380,157381],{},[78,157382,52222],{"className":157383},[4788],[78,157385,4726],{"className":157386},[4725],[78,157388,157390],{"className":157389},[4698],[78,157391,157393],{"className":157392,"style":52454},[4702],[78,157394],{},[78,157396],{"className":157397,"style":4839},[4739],[78,157399,157401,157404,157475],{"className":157400},[4667],[78,157402],{"className":157403},[4674,4761],[78,157405,157407],{"className":157406},[4611],[78,157408,157410,157467],{"className":157409},[4693,4694],[78,157411,157413,157464],{"className":157412},[4698],[78,157414,157416,157436,157444],{"className":157415,"style":52478},[4702],[78,157417,157418,157421],{"style":4777},[78,157419],{"className":157420,"style":4781},[4710],[78,157422,157424,157427,157430,157433],{"className":157423},[4667],[78,157425,5053],{"className":157426,"style":5170},[4667,4678],[78,157428,4594],{"className":157429},[4674],[78,157431,19],{"className":157432},[4667,4678],[78,157434,4604],{"className":157435},[4682],[78,157437,157438,157441],{"style":4919},[78,157439],{"className":157440,"style":4781},[4710],[78,157442],{"className":157443,"style":4927},[4926],[78,157445,157446,157449],{"style":4930},[78,157447],{"className":157448,"style":4781},[4710],[78,157450,157452,157455,157458,157461],{"className":157451},[4667],[78,157453,43673],{"className":157454,"style":5187},[4667,4678],[78,157456,4594],{"className":157457},[4674],[78,157459,19],{"className":157460},[4667,4678],[78,157462,4604],{"className":157463},[4682],[78,157465,4726],{"className":157466},[4725],[78,157468,157470],{"className":157469},[4698],[78,157471,157473],{"className":157472,"style":17380},[4702],[78,157474],{},[78,157476],{"className":157477},[4682,4761],[78,157479],{"className":157480,"style":4740},[4739],[78,157482,54415],{"className":157483},[4744],[78,157485],{"className":157486,"style":4740},[4739],[78,157488,157490,157493,157496],{"className":157489},[4658],[78,157491],{"className":157492,"style":18224},[4662],[78,157494,7360],{"className":157495},[4667,4678],[78,157497,67],{"className":157498},[4667,6184],[7759,157500,54434],{"id":54433},[10548,157502,54438],{"id":54437},[13,157504,54441],{},[10548,157506,54445],{"id":54444},[78,157508,157510],{"className":157509},[4566],[78,157511,157513,157772],{"className":157512},[4570],[78,157514,157516],{"className":157515},[4574],[4576,157517,157518],{"xmlns":4578,"display":4579},[4581,157519,157520,157770],{},[4584,157521,157522,157524,157526,157528,157530,157532,157534,157536,157538,157540,157542,157544,157562,157584,157586,157604,157626,157628,157630,157632,157634,157636,157638,157640,157642,157644,157646,157648,157650,157652,157654,157656,157658,157660,157662,157664,157666,157668,157670,157688,157710,157712,157714,157716,157718,157720,157738,157760,157762,157764,157766,157768],{},[4587,157523,52193],{},[4596,157525,5053],{},[4591,157527,4594],{"stretchy":4593},[4596,157529,19],{},[4591,157531,4604],{"stretchy":4593},[4587,157533,52204],{},[4596,157535,43673],{},[4591,157537,4594],{"stretchy":4593},[4596,157539,19],{},[4591,157541,4604],{"stretchy":4593},[4587,157543,52215],{},[4628,157545,157546,157552],{},[4584,157547,157548,157550],{},[4596,157549,52222],{},[4591,157551,17553],{},[4584,157553,157554,157556,157558,157560],{},[4596,157555,19],{},[4591,157557,52231],{},[4591,157559,7351],{},[4596,157561,52236],{"mathvariant":7101},[4611,157563,157564,157574],{},[4584,157565,157566,157568,157570,157572],{},[4596,157567,5053],{},[4591,157569,4594],{"stretchy":4593},[4596,157571,19],{},[4591,157573,4604],{"stretchy":4593},[4584,157575,157576,157578,157580,157582],{},[4596,157577,43673],{},[4591,157579,4594],{"stretchy":4593},[4596,157581,19],{},[4591,157583,4604],{"stretchy":4593},[4587,157585,54525],{},[4628,157587,157588,157594],{},[4584,157589,157590,157592],{},[4596,157591,52222],{},[4591,157593,17553],{},[4584,157595,157596,157598,157600,157602],{},[4596,157597,19],{},[4591,157599,52231],{},[4591,157601,7351],{},[4596,157603,52236],{"mathvariant":7101},[4611,157605,157606,157616],{},[4584,157607,157608,157610,157612,157614],{},[4596,157609,43673],{},[4591,157611,4594],{"stretchy":4593},[4596,157613,19],{},[4591,157615,4604],{"stretchy":4593},[4584,157617,157618,157620,157622,157624],{},[4596,157619,5053],{},[4591,157621,4594],{"stretchy":4593},[4596,157623,19],{},[4591,157625,4604],{"stretchy":4593},[4587,157627,54568],{},[4596,157629,5053],{},[4591,157631,4594],{"stretchy":4593},[4596,157633,19],{},[4591,157635,4604],{"stretchy":4593},[4591,157637,4609],{},[4596,157639,54581],{"mathvariant":7101},[4591,157641,4594],{"stretchy":4593},[4596,157643,43673],{},[4591,157645,4594],{"stretchy":4593},[4596,157647,19],{},[4591,157649,4604],{"stretchy":4593},[4591,157651,4604],{"stretchy":4593},[4587,157653,54596],{},[4596,157655,7360],{},[7077,157657,469],{},[4587,157659,52816],{},[4596,157661,7360],{},[7077,157663,472],{},[4587,157665,52816],{},[4739,157667],{"linebreak":52940},[4587,157669,52301],{},[4628,157671,157672,157678],{},[4584,157673,157674,157676],{},[4596,157675,52222],{},[4591,157677,17553],{},[4584,157679,157680,157682,157684,157686],{},[4596,157681,19],{},[4591,157683,52231],{},[4591,157685,7351],{},[4596,157687,52236],{"mathvariant":7101},[4611,157689,157690,157700],{},[4584,157691,157692,157694,157696,157698],{},[4596,157693,43673],{},[4591,157695,4594],{"stretchy":4593},[4596,157697,19],{},[4591,157699,4604],{"stretchy":4593},[4584,157701,157702,157704,157706,157708],{},[4596,157703,5053],{},[4591,157705,4594],{"stretchy":4593},[4596,157707,19],{},[4591,157709,4604],{"stretchy":4593},[4591,157711,41631],{},[4591,157713,4609],{},[4596,157715,7360],{},[7077,157717,469],{},[4591,157719,2066],{"separator":1419},[4628,157721,157722,157728],{},[4584,157723,157724,157726],{},[4596,157725,52222],{},[4591,157727,17553],{},[4584,157729,157730,157732,157734,157736],{},[4596,157731,19],{},[4591,157733,52231],{},[4591,157735,7351],{},[4596,157737,52236],{"mathvariant":7101},[4611,157739,157740,157750],{},[4584,157741,157742,157744,157746,157748],{},[4596,157743,5053],{},[4591,157745,4594],{"stretchy":4593},[4596,157747,19],{},[4591,157749,4604],{"stretchy":4593},[4584,157751,157752,157754,157756,157758],{},[4596,157753,43673],{},[4591,157755,4594],{"stretchy":4593},[4596,157757,19],{},[4591,157759,4604],{"stretchy":4593},[4591,157761,41631],{},[4591,157763,4609],{},[4596,157765,7360],{},[7077,157767,472],{},[4587,157769,67],{},[4647,157771,54715],{"encoding":4649},[78,157773,157775,158125,158170,158173,158333,158499],{"className":157774,"ariaHidden":1419},[4654],[78,157776,157778,157781,157784,157787,157790,157793,157796,157799,157802,157805,157808,157811,157814,157817,157873,157876,157956,157959,157962,158018,158021,158101,158104,158107,158110,158113,158116,158119,158122],{"className":157777},[4658],[78,157779],{"className":157780,"style":52361},[4662],[78,157782,52193],{"className":157783},[4667,6184],[78,157785,5053],{"className":157786,"style":5170},[4667,4678],[78,157788,4594],{"className":157789},[4674],[78,157791,19],{"className":157792},[4667,4678],[78,157794,4604],{"className":157795},[4682],[78,157797,52204],{"className":157798},[4667,6184],[78,157800,43673],{"className":157801,"style":5187},[4667,4678],[78,157803,4594],{"className":157804},[4674],[78,157806,19],{"className":157807},[4667,4678],[78,157809,4604],{"className":157810},[4682],[78,157812,52215],{"className":157813},[4667,6184],[78,157815],{"className":157816,"style":4839},[4739],[78,157818,157820],{"className":157819},[4788,52401],[78,157821,157823,157865],{"className":157822},[4693,4694],[78,157824,157826,157862],{"className":157825},[4698],[78,157827,157829,157852],{"className":157828,"style":16794},[4702],[78,157830,157831,157834],{"style":52413},[78,157832],{"className":157833,"style":4781},[4710],[78,157835,157837],{"className":157836},[4715,4716,4717,4718],[78,157838,157840,157843,157846,157849],{"className":157839},[4667,4718],[78,157841,19],{"className":157842},[4667,4678,4718],[78,157844,52231],{"className":157845},[4744,4718],[78,157847,7351],{"className":157848},[4667,4718],[78,157850,52236],{"className":157851},[4667,4718],[78,157853,157854,157857],{"style":5824},[78,157855],{"className":157856,"style":4781},[4710],[78,157858,157859],{},[78,157860,52222],{"className":157861},[4788],[78,157863,4726],{"className":157864},[4725],[78,157866,157868],{"className":157867},[4698],[78,157869,157871],{"className":157870,"style":52454},[4702],[78,157872],{},[78,157874],{"className":157875,"style":4839},[4739],[78,157877,157879,157882,157953],{"className":157878},[4667],[78,157880],{"className":157881},[4674,4761],[78,157883,157885],{"className":157884},[4611],[78,157886,157888,157945],{"className":157887},[4693,4694],[78,157889,157891,157942],{"className":157890},[4698],[78,157892,157894,157914,157922],{"className":157893,"style":52478},[4702],[78,157895,157896,157899],{"style":4777},[78,157897],{"className":157898,"style":4781},[4710],[78,157900,157902,157905,157908,157911],{"className":157901},[4667],[78,157903,43673],{"className":157904,"style":5187},[4667,4678],[78,157906,4594],{"className":157907},[4674],[78,157909,19],{"className":157910},[4667,4678],[78,157912,4604],{"className":157913},[4682],[78,157915,157916,157919],{"style":4919},[78,157917],{"className":157918,"style":4781},[4710],[78,157920],{"className":157921,"style":4927},[4926],[78,157923,157924,157927],{"style":4930},[78,157925],{"className":157926,"style":4781},[4710],[78,157928,157930,157933,157936,157939],{"className":157929},[4667],[78,157931,5053],{"className":157932,"style":5170},[4667,4678],[78,157934,4594],{"className":157935},[4674],[78,157937,19],{"className":157938},[4667,4678],[78,157940,4604],{"className":157941},[4682],[78,157943,4726],{"className":157944},[4725],[78,157946,157948],{"className":157947},[4698],[78,157949,157951],{"className":157950,"style":17380},[4702],[78,157952],{},[78,157954],{"className":157955},[4682,4761],[78,157957,54525],{"className":157958},[4667,6184],[78,157960],{"className":157961,"style":4839},[4739],[78,157963,157965],{"className":157964},[4788,52401],[78,157966,157968,158010],{"className":157967},[4693,4694],[78,157969,157971,158007],{"className":157970},[4698],[78,157972,157974,157997],{"className":157973,"style":16794},[4702],[78,157975,157976,157979],{"style":52413},[78,157977],{"className":157978,"style":4781},[4710],[78,157980,157982],{"className":157981},[4715,4716,4717,4718],[78,157983,157985,157988,157991,157994],{"className":157984},[4667,4718],[78,157986,19],{"className":157987},[4667,4678,4718],[78,157989,52231],{"className":157990},[4744,4718],[78,157992,7351],{"className":157993},[4667,4718],[78,157995,52236],{"className":157996},[4667,4718],[78,157998,157999,158002],{"style":5824},[78,158000],{"className":158001,"style":4781},[4710],[78,158003,158004],{},[78,158005,52222],{"className":158006},[4788],[78,158008,4726],{"className":158009},[4725],[78,158011,158013],{"className":158012},[4698],[78,158014,158016],{"className":158015,"style":52454},[4702],[78,158017],{},[78,158019],{"className":158020,"style":4839},[4739],[78,158022,158024,158027,158098],{"className":158023},[4667],[78,158025],{"className":158026},[4674,4761],[78,158028,158030],{"className":158029},[4611],[78,158031,158033,158090],{"className":158032},[4693,4694],[78,158034,158036,158087],{"className":158035},[4698],[78,158037,158039,158059,158067],{"className":158038,"style":52478},[4702],[78,158040,158041,158044],{"style":4777},[78,158042],{"className":158043,"style":4781},[4710],[78,158045,158047,158050,158053,158056],{"className":158046},[4667],[78,158048,5053],{"className":158049,"style":5170},[4667,4678],[78,158051,4594],{"className":158052},[4674],[78,158054,19],{"className":158055},[4667,4678],[78,158057,4604],{"className":158058},[4682],[78,158060,158061,158064],{"style":4919},[78,158062],{"className":158063,"style":4781},[4710],[78,158065],{"className":158066,"style":4927},[4926],[78,158068,158069,158072],{"style":4930},[78,158070],{"className":158071,"style":4781},[4710],[78,158073,158075,158078,158081,158084],{"className":158074},[4667],[78,158076,43673],{"className":158077,"style":5187},[4667,4678],[78,158079,4594],{"className":158080},[4674],[78,158082,19],{"className":158083},[4667,4678],[78,158085,4604],{"className":158086},[4682],[78,158088,4726],{"className":158089},[4725],[78,158091,158093],{"className":158092},[4698],[78,158094,158096],{"className":158095,"style":17380},[4702],[78,158097],{},[78,158099],{"className":158100},[4682,4761],[78,158102,54568],{"className":158103},[4667,6184],[78,158105,5053],{"className":158106,"style":5170},[4667,4678],[78,158108,4594],{"className":158109},[4674],[78,158111,19],{"className":158112},[4667,4678],[78,158114,4604],{"className":158115},[4682],[78,158117],{"className":158118,"style":4740},[4739],[78,158120,4609],{"className":158121},[4744],[78,158123],{"className":158124,"style":4740},[4739],[78,158126,158128,158131,158134,158137,158140,158143,158146,158149,158152,158155,158158,158161,158164,158167],{"className":158127},[4658],[78,158129],{"className":158130,"style":4663},[4662],[78,158132,54581],{"className":158133},[4667],[78,158135,4594],{"className":158136},[4674],[78,158138,43673],{"className":158139,"style":5187},[4667,4678],[78,158141,4594],{"className":158142},[4674],[78,158144,19],{"className":158145},[4667,4678],[78,158147,38757],{"className":158148},[4682],[78,158150,54596],{"className":158151},[4667,6184],[78,158153,7360],{"className":158154},[4667,4678],[78,158156,469],{"className":158157},[4667],[78,158159,52816],{"className":158160},[4667,6184],[78,158162,7360],{"className":158163},[4667,4678],[78,158165,472],{"className":158166},[4667],[78,158168,52816],{"className":158169},[4667,6184],[78,158171],{"className":158172},[4739,52940],[78,158174,158176,158179,158182,158185,158241,158244,158324,158327,158330],{"className":158175},[4658],[78,158177],{"className":158178,"style":52361},[4662],[78,158180,52301],{"className":158181},[4667,6184],[78,158183],{"className":158184,"style":4839},[4739],[78,158186,158188],{"className":158187},[4788,52401],[78,158189,158191,158233],{"className":158190},[4693,4694],[78,158192,158194,158230],{"className":158193},[4698],[78,158195,158197,158220],{"className":158196,"style":16794},[4702],[78,158198,158199,158202],{"style":52413},[78,158200],{"className":158201,"style":4781},[4710],[78,158203,158205],{"className":158204},[4715,4716,4717,4718],[78,158206,158208,158211,158214,158217],{"className":158207},[4667,4718],[78,158209,19],{"className":158210},[4667,4678,4718],[78,158212,52231],{"className":158213},[4744,4718],[78,158215,7351],{"className":158216},[4667,4718],[78,158218,52236],{"className":158219},[4667,4718],[78,158221,158222,158225],{"style":5824},[78,158223],{"className":158224,"style":4781},[4710],[78,158226,158227],{},[78,158228,52222],{"className":158229},[4788],[78,158231,4726],{"className":158232},[4725],[78,158234,158236],{"className":158235},[4698],[78,158237,158239],{"className":158238,"style":52454},[4702],[78,158240],{},[78,158242],{"className":158243,"style":4839},[4739],[78,158245,158247,158250,158321],{"className":158246},[4667],[78,158248],{"className":158249},[4674,4761],[78,158251,158253],{"className":158252},[4611],[78,158254,158256,158313],{"className":158255},[4693,4694],[78,158257,158259,158310],{"className":158258},[4698],[78,158260,158262,158282,158290],{"className":158261,"style":52478},[4702],[78,158263,158264,158267],{"style":4777},[78,158265],{"className":158266,"style":4781},[4710],[78,158268,158270,158273,158276,158279],{"className":158269},[4667],[78,158271,5053],{"className":158272,"style":5170},[4667,4678],[78,158274,4594],{"className":158275},[4674],[78,158277,19],{"className":158278},[4667,4678],[78,158280,4604],{"className":158281},[4682],[78,158283,158284,158287],{"style":4919},[78,158285],{"className":158286,"style":4781},[4710],[78,158288],{"className":158289,"style":4927},[4926],[78,158291,158292,158295],{"style":4930},[78,158293],{"className":158294,"style":4781},[4710],[78,158296,158298,158301,158304,158307],{"className":158297},[4667],[78,158299,43673],{"className":158300,"style":5187},[4667,4678],[78,158302,4594],{"className":158303},[4674],[78,158305,19],{"className":158306},[4667,4678],[78,158308,4604],{"className":158309},[4682],[78,158311,4726],{"className":158312},[4725],[78,158314,158316],{"className":158315},[4698],[78,158317,158319],{"className":158318,"style":17380},[4702],[78,158320],{},[78,158322],{"className":158323},[4682,4761],[78,158325],{"className":158326,"style":4740},[4739],[78,158328,54415],{"className":158329},[4744],[78,158331],{"className":158332,"style":4740},[4739],[78,158334,158336,158339,158342,158345,158348,158351,158407,158410,158490,158493,158496],{"className":158335},[4658],[78,158337],{"className":158338,"style":52361},[4662],[78,158340,7360],{"className":158341},[4667,4678],[78,158343,469],{"className":158344},[4667],[78,158346,2066],{"className":158347},[5126],[78,158349],{"className":158350,"style":4839},[4739],[78,158352,158354],{"className":158353},[4788,52401],[78,158355,158357,158399],{"className":158356},[4693,4694],[78,158358,158360,158396],{"className":158359},[4698],[78,158361,158363,158386],{"className":158362,"style":16794},[4702],[78,158364,158365,158368],{"style":52413},[78,158366],{"className":158367,"style":4781},[4710],[78,158369,158371],{"className":158370},[4715,4716,4717,4718],[78,158372,158374,158377,158380,158383],{"className":158373},[4667,4718],[78,158375,19],{"className":158376},[4667,4678,4718],[78,158378,52231],{"className":158379},[4744,4718],[78,158381,7351],{"className":158382},[4667,4718],[78,158384,52236],{"className":158385},[4667,4718],[78,158387,158388,158391],{"style":5824},[78,158389],{"className":158390,"style":4781},[4710],[78,158392,158393],{},[78,158394,52222],{"className":158395},[4788],[78,158397,4726],{"className":158398},[4725],[78,158400,158402],{"className":158401},[4698],[78,158403,158405],{"className":158404,"style":52454},[4702],[78,158406],{},[78,158408],{"className":158409,"style":4839},[4739],[78,158411,158413,158416,158487],{"className":158412},[4667],[78,158414],{"className":158415},[4674,4761],[78,158417,158419],{"className":158418},[4611],[78,158420,158422,158479],{"className":158421},[4693,4694],[78,158423,158425,158476],{"className":158424},[4698],[78,158426,158428,158448,158456],{"className":158427,"style":52478},[4702],[78,158429,158430,158433],{"style":4777},[78,158431],{"className":158432,"style":4781},[4710],[78,158434,158436,158439,158442,158445],{"className":158435},[4667],[78,158437,43673],{"className":158438,"style":5187},[4667,4678],[78,158440,4594],{"className":158441},[4674],[78,158443,19],{"className":158444},[4667,4678],[78,158446,4604],{"className":158447},[4682],[78,158449,158450,158453],{"style":4919},[78,158451],{"className":158452,"style":4781},[4710],[78,158454],{"className":158455,"style":4927},[4926],[78,158457,158458,158461],{"style":4930},[78,158459],{"className":158460,"style":4781},[4710],[78,158462,158464,158467,158470,158473],{"className":158463},[4667],[78,158465,5053],{"className":158466,"style":5170},[4667,4678],[78,158468,4594],{"className":158469},[4674],[78,158471,19],{"className":158472},[4667,4678],[78,158474,4604],{"className":158475},[4682],[78,158477,4726],{"className":158478},[4725],[78,158480,158482],{"className":158481},[4698],[78,158483,158485],{"className":158484,"style":17380},[4702],[78,158486],{},[78,158488],{"className":158489},[4682,4761],[78,158491],{"className":158492,"style":4740},[4739],[78,158494,54415],{"className":158495},[4744],[78,158497],{"className":158498,"style":4740},[4739],[78,158500,158502,158505,158508,158511],{"className":158501},[4658],[78,158503],{"className":158504,"style":18224},[4662],[78,158506,7360],{"className":158507},[4667,4678],[78,158509,472],{"className":158510},[4667],[78,158512,67],{"className":158513},[4667,6184],[49,158515,158516],{},[52,158517,55462],{},[7759,158519,55466],{"id":55465},[10548,158521,55470],{"id":55469},[13,158523,55473,158524,55477],{},[78,158525,55476],{},[10548,158527,55481],{"id":55480},[78,158529,158531],{"className":158530},[4566],[78,158532,158534,158785],{"className":158533},[4570],[78,158535,158537],{"className":158536},[4574],[4576,158538,158539],{"xmlns":4578,"display":4579},[4581,158540,158541,158783],{},[4584,158542,158543,158545,158547,158549,158551,158553,158555,158557,158559,158561,158563,158565,158567,158569,158571,158573,158575,158577,158579,158581,158583,158585,158587,158589,158591,158593,158595,158597,158599,158601,158607,158609,158611,158613,158615,158617,158619,158621,158623,158625,158627,158629,158631,158633,158635,158637,158639,158641,158643],{},[4587,158544,55499],{},[4596,158546,5009],{},[4591,158548,52294],{},[7077,158550,2949],{},[4591,158552,2066],{"separator":1419},[4596,158554,12172],{},[4591,158556,52294],{},[7077,158558,469],{},[4591,158560,2066],{"separator":1419},[4596,158562,55518],{},[4591,158564,52294],{},[4591,158566,4609],{},[7077,158568,2949],{},[4587,158570,55527],{},[4596,158572,5074],{},[4591,158574,4594],{"stretchy":4593},[4596,158576,19],{},[4591,158578,4604],{"stretchy":4593},[4591,158580,4609],{},[4596,158582,5009],{},[4596,158584,5074],{},[4591,158586,4594],{"stretchy":4593},[4596,158588,19],{},[4596,158590,7102],{"mathvariant":7101},[4596,158592,12172],{},[4591,158594,4604],{"stretchy":4593},[4591,158596,7351],{},[4596,158598,55556],{},[4591,158600,4594],{"stretchy":4593},[4614,158602,158603,158605],{},[4596,158604,19],{},[4596,158606,55518],{},[4591,158608,4604],{"stretchy":4593},[4591,158610,4594],{"stretchy":4593},[4596,158612,55556],{},[4587,158614,55573],{},[4596,158616,52274],{},[4587,158618,1011],{},[4596,158620,53932],{"mathvariant":7101},[4587,158622,1011],{},[4596,158624,54581],{"mathvariant":7101},[4587,158626,55586],{},[4591,158628,4604],{"stretchy":4593},[4587,158630,55591],{},[4739,158632],{"linebreak":52940},[4596,158634,5074],{},[4591,158636,4594],{"stretchy":4593},[4596,158638,19],{},[4591,158640,4604],{"stretchy":4593},[4591,158642,4609],{},[4584,158644,158645,158647],{},[4591,158646,55608],{"fence":1419},[37085,158648,158649,158699,158745],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,158650,158651],{},[37094,158652,158653],{},[37101,158654,158655],{"scriptlevel":2949,"displaystyle":4593},[4584,158656,158657,158659,158661,158679,158681,158683,158685,158687,158697],{},[4596,158658,55556],{},[4591,158660,4594],{"stretchy":4593},[4614,158662,158663,158665],{},[4596,158664,19],{},[4584,158666,158667,158677],{},[4600,158668,158669,158675],{},[4584,158670,158671,158673],{},[4596,158672,52823],{},[4591,158674,17553],{},[4596,158676,12172],{},[4596,158678,5009],{},[4591,158680,4604],{"stretchy":4593},[4591,158682,2066],{"separator":1419},[4596,158684,55518],{},[4591,158686,41631],{},[4600,158688,158689,158695],{},[4584,158690,158691,158693],{},[4596,158692,52823],{},[4591,158694,17553],{},[4596,158696,12172],{},[4596,158698,5009],{},[37091,158700,158701],{},[37094,158702,158703],{},[37101,158704,158705],{"scriptlevel":2949,"displaystyle":4593},[4584,158706,158707,158709,158711,158717,158719,158721,158723,158725,158727,158729,158731,158733,158743],{},[4596,158708,55556],{},[4591,158710,4594],{"stretchy":4593},[4614,158712,158713,158715],{},[4596,158714,19],{},[4596,158716,55518],{},[4596,158718,7132],{},[4596,158720,5025],{},[4596,158722,43673],{},[4596,158724,19],{},[4591,158726,4604],{"stretchy":4593},[4591,158728,2066],{"separator":1419},[4596,158730,55518],{},[4591,158732,4609],{},[4600,158734,158735,158741],{},[4584,158736,158737,158739],{},[4596,158738,52823],{},[4591,158740,17553],{},[4596,158742,12172],{},[4596,158744,5009],{},[37091,158746,158747],{},[37094,158748,158749],{},[37101,158750,158751],{"scriptlevel":2949,"displaystyle":4593},[4584,158752,158753,158755,158757,158763,158765,158767,158769,158771,158781],{},[4596,158754,55556],{},[4591,158756,4594],{"stretchy":4593},[4614,158758,158759,158761],{},[4596,158760,19],{},[4596,158762,55518],{},[4591,158764,4604],{"stretchy":4593},[4591,158766,2066],{"separator":1419},[4596,158768,55518],{},[4591,158770,52294],{},[4600,158772,158773,158779],{},[4584,158774,158775,158777],{},[4596,158776,52823],{},[4591,158778,17553],{},[4596,158780,12172],{},[4596,158782,5009],{},[4647,158784,55750],{"encoding":4649},[78,158786,158788,158809,158836,158863,158896,158932,159009,159012,159039],{"className":158787,"ariaHidden":1419},[4654],[78,158789,158791,158794,158797,158800,158803,158806],{"className":158790},[4658],[78,158792],{"className":158793,"style":55760},[4662],[78,158795,55499],{"className":158796},[4667,6184],[78,158798,5009],{"className":158799},[4667,4678],[78,158801],{"className":158802,"style":4740},[4739],[78,158804,52294],{"className":158805},[4744],[78,158807],{"className":158808,"style":4740},[4739],[78,158810,158812,158815,158818,158821,158824,158827,158830,158833],{"className":158811},[4658],[78,158813],{"className":158814,"style":43725},[4662],[78,158816,2949],{"className":158817},[4667],[78,158819,2066],{"className":158820},[5126],[78,158822],{"className":158823,"style":4839},[4739],[78,158825,12172],{"className":158826},[4667,4678],[78,158828],{"className":158829,"style":4740},[4739],[78,158831,52294],{"className":158832},[4744],[78,158834],{"className":158835,"style":4740},[4739],[78,158837,158839,158842,158845,158848,158851,158854,158857,158860],{"className":158838},[4658],[78,158840],{"className":158841,"style":55809},[4662],[78,158843,469],{"className":158844},[4667],[78,158846,2066],{"className":158847},[5126],[78,158849],{"className":158850,"style":4839},[4739],[78,158852,55518],{"className":158853,"style":55822},[4667,4678],[78,158855],{"className":158856,"style":4740},[4739],[78,158858,55829],{"className":158859},[4744],[78,158861],{"className":158862,"style":4740},[4739],[78,158864,158866,158869,158872,158875,158878,158881,158884,158887,158890,158893],{"className":158865},[4658],[78,158867],{"className":158868,"style":4663},[4662],[78,158870,2949],{"className":158871},[4667],[78,158873,55527],{"className":158874},[4667,6184],[78,158876,5074],{"className":158877,"style":5219},[4667,4678],[78,158879,4594],{"className":158880},[4674],[78,158882,19],{"className":158883},[4667,4678],[78,158885,4604],{"className":158886},[4682],[78,158888],{"className":158889,"style":4740},[4739],[78,158891,4609],{"className":158892},[4744],[78,158894],{"className":158895,"style":4740},[4739],[78,158897,158899,158902,158905,158908,158911,158914,158917,158920,158923,158926,158929],{"className":158898},[4658],[78,158900],{"className":158901,"style":4663},[4662],[78,158903,5009],{"className":158904},[4667,4678],[78,158906,5074],{"className":158907,"style":5219},[4667,4678],[78,158909,4594],{"className":158910},[4674],[78,158912,19],{"className":158913},[4667,4678],[78,158915,7102],{"className":158916},[4667],[78,158918,12172],{"className":158919},[4667,4678],[78,158921,4604],{"className":158922},[4682],[78,158924],{"className":158925,"style":5143},[4739],[78,158927,7351],{"className":158928},[7450],[78,158930],{"className":158931,"style":5143},[4739],[78,158933,158935,158938,158941,158944,158973,158976,158979,158982,158985,158988,158991,158994,158997,159000,159003,159006],{"className":158934},[4658],[78,158936],{"className":158937,"style":4663},[4662],[78,158939,55556],{"className":158940,"style":55911},[4667,4678],[78,158942,4594],{"className":158943},[4674],[78,158945,158947,158950],{"className":158946},[4667],[78,158948,19],{"className":158949},[4667,4678],[78,158951,158953],{"className":158952},[4689],[78,158954,158956],{"className":158955},[4693],[78,158957,158959],{"className":158958},[4698],[78,158960,158962],{"className":158961,"style":53394},[4702],[78,158963,158964,158967],{"style":5209},[78,158965],{"className":158966,"style":4711},[4710],[78,158968,158970],{"className":158969},[4715,4716,4717,4718],[78,158971,55518],{"className":158972,"style":55822},[4667,4678,4718],[78,158974,4604],{"className":158975},[4682],[78,158977,4594],{"className":158978},[4674],[78,158980,55556],{"className":158981,"style":55911},[4667,4678],[78,158983,55573],{"className":158984},[4667,6184],[78,158986,52274],{"className":158987,"style":17251},[4667,4678],[78,158989,1011],{"className":158990},[4667,6184],[78,158992,53932],{"className":158993},[4667],[78,158995,1011],{"className":158996},[4667,6184],[78,158998,54581],{"className":158999},[4667],[78,159001,55586],{"className":159002},[4667,6184],[78,159004,4604],{"className":159005},[4682],[78,159007,55591],{"className":159008},[4667,6184],[78,159010],{"className":159011},[4739,52940],[78,159013,159015,159018,159021,159024,159027,159030,159033,159036],{"className":159014},[4658],[78,159016],{"className":159017,"style":4663},[4662],[78,159019,5074],{"className":159020,"style":5219},[4667,4678],[78,159022,4594],{"className":159023},[4674],[78,159025,19],{"className":159026},[4667,4678],[78,159028,4604],{"className":159029},[4682],[78,159031],{"className":159032,"style":4740},[4739],[78,159034,4609],{"className":159035},[4744],[78,159037],{"className":159038,"style":4740},[4739],[78,159040,159042,159045],{"className":159041},[4658],[78,159043],{"className":159044,"style":56016},[4662],[78,159046,159048,159126,159558],{"className":159047},[18342],[78,159049,159051],{"className":159050},[4674],[78,159052,159054],{"className":159053},[56026,56027],[78,159055,159057,159118],{"className":159056},[4693,4694],[78,159058,159060,159115],{"className":159059},[4698],[78,159061,159063,159073,159084,159094,159105],{"className":159062,"style":56037},[4702],[78,159064,159065,159068],{"style":56040},[78,159066],{"className":159067,"style":56044},[4710],[78,159069,159071],{"className":159070},[56048,56049],[78,159072,56052],{},[78,159074,159075,159078],{"style":56055},[78,159076],{"className":159077,"style":56044},[4710],[78,159079,159080],{"style":56061},[5884,159081,159082],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,159083],{"d":56071},[78,159085,159086,159089],{"style":56074},[78,159087],{"className":159088,"style":56044},[4710],[78,159090,159092],{"className":159091},[56048,56049],[78,159093,56083],{},[78,159095,159096,159099],{"style":56086},[78,159097],{"className":159098,"style":56044},[4710],[78,159100,159101],{"style":56061},[5884,159102,159103],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,159104],{"d":56071},[78,159106,159107,159110],{"style":56098},[78,159108],{"className":159109,"style":56044},[4710],[78,159111,159113],{"className":159112},[56048,56049],[78,159114,56107],{},[78,159116,4726],{"className":159117},[4725],[78,159119,159121],{"className":159120},[4698],[78,159122,159124],{"className":159123,"style":56117},[4702],[78,159125],{},[78,159127,159129],{"className":159128},[4667],[78,159130,159132],{"className":159131},[37085],[78,159133,159135],{"className":159134},[38098],[78,159136,159138,159550],{"className":159137},[4693,4694],[78,159139,159141,159547],{"className":159140},[4698],[78,159142,159144,159311,159435],{"className":159143,"style":56138},[4702],[78,159145,159146,159149],{"style":56141},[78,159147],{"className":159148,"style":56145},[4710],[78,159150,159152,159155,159158,159242,159245,159248,159251,159254,159257,159260,159263,159305,159308],{"className":159151},[4667],[78,159153,55556],{"className":159154,"style":55911},[4667,4678],[78,159156,4594],{"className":159157},[4674],[78,159159,159161,159164],{"className":159160},[4667],[78,159162,19],{"className":159163},[4667,4678],[78,159165,159167],{"className":159166},[4689],[78,159168,159170],{"className":159169},[4693],[78,159171,159173],{"className":159172},[4698],[78,159174,159176],{"className":159175,"style":56173},[4702],[78,159177,159178,159181],{"style":4958},[78,159179],{"className":159180,"style":4711},[4710],[78,159182,159184],{"className":159183},[4715,4716,4717,4718],[78,159185,159187,159236,159239],{"className":159186},[4667,4718],[78,159188,159190,159202],{"className":159189},[4788,4718],[78,159191,159193,159196,159199],{"className":159192},[4788,4718],[78,159194,7132],{"className":159195},[4718],[78,159197,5025],{"className":159198},[4718],[78,159200,43673],{"className":159201,"style":53053},[4718],[78,159203,159205],{"className":159204},[4689],[78,159206,159208,159228],{"className":159207},[4693,4694],[78,159209,159211,159225],{"className":159210},[4698],[78,159212,159214],{"className":159213,"style":56212},[4702],[78,159215,159216,159219],{"style":56215},[78,159217],{"className":159218,"style":4896},[4710],[78,159220,159222],{"className":159221},[4715,4900,4901,4718],[78,159223,12172],{"className":159224},[4667,4678,4718],[78,159226,4726],{"className":159227},[4725],[78,159229,159231],{"className":159230},[4698],[78,159232,159234],{"className":159233,"style":56234},[4702],[78,159235],{},[78,159237],{"className":159238,"style":56240},[4739,4718],[78,159240,5009],{"className":159241},[4667,4678,4718],[78,159243,4604],{"className":159244},[4682],[78,159246,2066],{"className":159247},[5126],[78,159249],{"className":159250,"style":4839},[4739],[78,159252,55518],{"className":159253,"style":55822},[4667,4678],[78,159255],{"className":159256,"style":4740},[4739],[78,159258,41631],{"className":159259},[4744],[78,159261],{"className":159262,"style":4740},[4739],[78,159264,159266,159271],{"className":159265},[4788],[78,159267,53050,159269],{"className":159268},[4788],[78,159270,43673],{"style":53053},[78,159272,159274],{"className":159273},[4689],[78,159275,159277,159297],{"className":159276},[4693,4694],[78,159278,159280,159294],{"className":159279},[4698],[78,159281,159283],{"className":159282,"style":56285},[4702],[78,159284,159285,159288],{"style":56288},[78,159286],{"className":159287,"style":4711},[4710],[78,159289,159291],{"className":159290},[4715,4716,4717,4718],[78,159292,12172],{"className":159293},[4667,4678,4718],[78,159295,4726],{"className":159296},[4725],[78,159298,159300],{"className":159299},[4698],[78,159301,159303],{"className":159302,"style":56307},[4702],[78,159304],{},[78,159306],{"className":159307,"style":4839},[4739],[78,159309,5009],{"className":159310},[4667,4678],[78,159312,159313,159316],{"style":56318},[78,159314],{"className":159315,"style":56145},[4710],[78,159317,159319,159322,159325,159354,159357,159360,159363,159366,159369,159372,159375,159378,159381,159384,159387,159429,159432],{"className":159318},[4667],[78,159320,55556],{"className":159321,"style":55911},[4667,4678],[78,159323,4594],{"className":159324},[4674],[78,159326,159328,159331],{"className":159327},[4667],[78,159329,19],{"className":159330},[4667,4678],[78,159332,159334],{"className":159333},[4689],[78,159335,159337],{"className":159336},[4693],[78,159338,159340],{"className":159339},[4698],[78,159341,159343],{"className":159342,"style":56349},[4702],[78,159344,159345,159348],{"style":4958},[78,159346],{"className":159347,"style":4711},[4710],[78,159349,159351],{"className":159350},[4715,4716,4717,4718],[78,159352,55518],{"className":159353,"style":55822},[4667,4678,4718],[78,159355,7132],{"className":159356,"style":7300},[4667,4678],[78,159358,5025],{"className":159359},[4667,4678],[78,159361,43673],{"className":159362,"style":5187},[4667,4678],[78,159364,19],{"className":159365},[4667,4678],[78,159367,4604],{"className":159368},[4682],[78,159370,2066],{"className":159371},[5126],[78,159373],{"className":159374,"style":4839},[4739],[78,159376,55518],{"className":159377,"style":55822},[4667,4678],[78,159379],{"className":159380,"style":4740},[4739],[78,159382,4609],{"className":159383},[4744],[78,159385],{"className":159386,"style":4740},[4739],[78,159388,159390,159395],{"className":159389},[4788],[78,159391,53050,159393],{"className":159392},[4788],[78,159394,43673],{"style":53053},[78,159396,159398],{"className":159397},[4689],[78,159399,159401,159421],{"className":159400},[4693,4694],[78,159402,159404,159418],{"className":159403},[4698],[78,159405,159407],{"className":159406,"style":56285},[4702],[78,159408,159409,159412],{"style":56288},[78,159410],{"className":159411,"style":4711},[4710],[78,159413,159415],{"className":159414},[4715,4716,4717,4718],[78,159416,12172],{"className":159417},[4667,4678,4718],[78,159419,4726],{"className":159420},[4725],[78,159422,159424],{"className":159423},[4698],[78,159425,159427],{"className":159426,"style":56307},[4702],[78,159428],{},[78,159430],{"className":159431,"style":4839},[4739],[78,159433,5009],{"className":159434},[4667,4678],[78,159436,159437,159440],{"style":56444},[78,159438],{"className":159439,"style":56145},[4710],[78,159441,159443,159446,159449,159478,159481,159484,159487,159490,159493,159496,159499,159541,159544],{"className":159442},[4667],[78,159444,55556],{"className":159445,"style":55911},[4667,4678],[78,159447,4594],{"className":159448},[4674],[78,159450,159452,159455],{"className":159451},[4667],[78,159453,19],{"className":159454},[4667,4678],[78,159456,159458],{"className":159457},[4689],[78,159459,159461],{"className":159460},[4693],[78,159462,159464],{"className":159463},[4698],[78,159465,159467],{"className":159466,"style":56349},[4702],[78,159468,159469,159472],{"style":4958},[78,159470],{"className":159471,"style":4711},[4710],[78,159473,159475],{"className":159474},[4715,4716,4717,4718],[78,159476,55518],{"className":159477,"style":55822},[4667,4678,4718],[78,159479,4604],{"className":159480},[4682],[78,159482,2066],{"className":159483},[5126],[78,159485],{"className":159486,"style":4839},[4739],[78,159488,55518],{"className":159489,"style":55822},[4667,4678],[78,159491],{"className":159492,"style":4740},[4739],[78,159494,52294],{"className":159495},[4744],[78,159497],{"className":159498,"style":4740},[4739],[78,159500,159502,159507],{"className":159501},[4788],[78,159503,53050,159505],{"className":159504},[4788],[78,159506,43673],{"style":53053},[78,159508,159510],{"className":159509},[4689],[78,159511,159513,159533],{"className":159512},[4693,4694],[78,159514,159516,159530],{"className":159515},[4698],[78,159517,159519],{"className":159518,"style":56285},[4702],[78,159520,159521,159524],{"style":56288},[78,159522],{"className":159523,"style":4711},[4710],[78,159525,159527],{"className":159526},[4715,4716,4717,4718],[78,159528,12172],{"className":159529},[4667,4678,4718],[78,159531,4726],{"className":159532},[4725],[78,159534,159536],{"className":159535},[4698],[78,159537,159539],{"className":159538,"style":56307},[4702],[78,159540],{},[78,159542],{"className":159543,"style":4839},[4739],[78,159545,5009],{"className":159546},[4667,4678],[78,159548,4726],{"className":159549},[4725],[78,159551,159553],{"className":159552},[4698],[78,159554,159556],{"className":159555,"style":56564},[4702],[78,159557],{},[78,159559],{"className":159560},[4682,4761],[49,159562,159563],{},[52,159564,56574,159565,67],{},[22,159566,56577],{},[107,159568,56580],{"id":56580},[10548,159570,56584],{"id":56583},[114,159572,159573],{"className":51126,"code":56587,"language":51128,"meta":119,"style":119},[17,159574,159575,159579,159583,159587,159591,159595,159599,159603,159607,159611,159615,159619,159623,159627,159631,159635,159639],{"__ignoreMap":119},[78,159576,159577],{"class":124,"line":125},[78,159578,51135],{},[78,159580,159581],{"class":124,"line":132},[78,159582,56598],{},[78,159584,159585],{"class":124,"line":138},[78,159586,51145],{},[78,159588,159589],{"class":124,"line":144},[78,159590,56607],{},[78,159592,159593],{"class":124,"line":150},[78,159594,56612],{},[78,159596,159597],{"class":124,"line":156},[78,159598,56617],{},[78,159600,159601],{"class":124,"line":162},[78,159602,56622],{},[78,159604,159605],{"class":124,"line":168},[78,159606,23518],{},[78,159608,159609],{"class":124,"line":174},[78,159610,51135],{},[78,159612,159613],{"class":124,"line":180},[78,159614,56635],{},[78,159616,159617],{"class":124,"line":186},[78,159618,51145],{},[78,159620,159621],{"class":124,"line":192},[78,159622,56644],{},[78,159624,159625],{"class":124,"line":198},[78,159626,56649],{},[78,159628,159629],{"class":124,"line":204},[78,159630,56654],{},[78,159632,159633],{"class":124,"line":210},[78,159634,15810],{},[78,159636,159637],{"class":124,"line":216},[78,159638,23518],{},[78,159640,159641],{"class":124,"line":222},[78,159642,56667],{},[10548,159644,56671],{"id":56670},[114,159646,159647],{"className":51126,"code":56674,"language":51128,"meta":119,"style":119},[17,159648,159649,159653,159657,159661,159665,159669,159673,159677,159681,159685,159689,159693,159697],{"__ignoreMap":119},[78,159650,159651],{"class":124,"line":125},[78,159652,56681],{},[78,159654,159655],{"class":124,"line":132},[78,159656,56686],{},[78,159658,159659],{"class":124,"line":138},[78,159660,56691],{},[78,159662,159663],{"class":124,"line":144},[78,159664,51145],{},[78,159666,159667],{"class":124,"line":150},[78,159668,56700],{},[78,159670,159671],{"class":124,"line":156},[78,159672,56705],{},[78,159674,159675],{"class":124,"line":162},[78,159676,56710],{},[78,159678,159679],{"class":124,"line":168},[78,159680,56715],{},[78,159682,159683],{"class":124,"line":174},[78,159684,56720],{},[78,159686,159687],{"class":124,"line":180},[78,159688,56725],{},[78,159690,159691],{"class":124,"line":186},[78,159692,56730],{},[78,159694,159695],{"class":124,"line":192},[78,159696,23518],{},[78,159698,159699],{"class":124,"line":198},[78,159700,56739],{},[10548,159702,56743],{"id":56742},[114,159704,159705],{"className":51126,"code":56746,"language":51128,"meta":119,"style":119},[17,159706,159707,159711,159715,159719,159723,159727,159731,159735,159739,159743,159747,159751,159755,159759,159763,159767,159771,159775],{"__ignoreMap":119},[78,159708,159709],{"class":124,"line":125},[78,159710,56753],{},[78,159712,159713],{"class":124,"line":132},[78,159714,51135],{},[78,159716,159717],{"class":124,"line":138},[78,159718,56762],{},[78,159720,159721],{"class":124,"line":144},[78,159722,51145],{},[78,159724,159725],{"class":124,"line":150},[78,159726,56771],{},[78,159728,159729],{"class":124,"line":156},[78,159730,56776],{},[78,159732,159733],{"class":124,"line":162},[78,159734,56781],{},[78,159736,159737],{"class":124,"line":168},[78,159738,56786],{},[78,159740,159741],{"class":124,"line":174},[78,159742,23518],{},[78,159744,159745],{"class":124,"line":180},[78,159746,51135],{},[78,159748,159749],{"class":124,"line":186},[78,159750,56799],{},[78,159752,159753],{"class":124,"line":192},[78,159754,51145],{},[78,159756,159757],{"class":124,"line":198},[78,159758,56808],{},[78,159760,159761],{"class":124,"line":204},[78,159762,56813],{},[78,159764,159765],{"class":124,"line":210},[78,159766,56818],{},[78,159768,159769],{"class":124,"line":216},[78,159770,15810],{},[78,159772,159773],{"class":124,"line":222},[78,159774,23518],{},[78,159776,159777],{"class":124,"line":421},[78,159778,56667],{},[107,159780,56833],{"id":56833},[10548,159782,56836],{"id":56836},[114,159784,159785],{"className":51126,"code":56839,"language":51128,"meta":119,"style":119},[17,159786,159787,159791,159795,159799,159803,159807,159811,159815,159819,159823,159827,159831,159835,159839],{"__ignoreMap":119},[78,159788,159789],{"class":124,"line":125},[78,159790,51135],{},[78,159792,159793],{"class":124,"line":132},[78,159794,51140],{},[78,159796,159797],{"class":124,"line":138},[78,159798,51145],{},[78,159800,159801],{"class":124,"line":144},[78,159802,51150],{},[78,159804,159805],{"class":124,"line":150},[78,159806,51160],{},[78,159808,159809],{"class":124,"line":156},[78,159810,51165],{},[78,159812,159813],{"class":124,"line":162},[78,159814,56870],{},[78,159816,159817],{"class":124,"line":168},[78,159818,56875],{},[78,159820,159821],{"class":124,"line":174},[78,159822,51145],{},[78,159824,159825],{"class":124,"line":180},[78,159826,56884],{},[78,159828,159829],{"class":124,"line":186},[78,159830,56889],{},[78,159832,159833],{"class":124,"line":192},[78,159834,56894],{},[78,159836,159837],{"class":124,"line":198},[78,159838,56899],{},[78,159840,159841],{"class":124,"line":204},[78,159842,23518],{},[10548,159844,56906],{"id":56906},[114,159846,159847],{"className":51126,"code":56909,"language":51128,"meta":119,"style":119},[17,159848,159849,159853,159857,159861,159865,159869,159873,159877,159881,159885,159889,159893,159897,159901,159905,159909,159913,159917,159921,159925,159929,159933,159937],{"__ignoreMap":119},[78,159850,159851],{"class":124,"line":125},[78,159852,51135],{},[78,159854,159855],{"class":124,"line":132},[78,159856,51140],{},[78,159858,159859],{"class":124,"line":138},[78,159860,51145],{},[78,159862,159863],{"class":124,"line":144},[78,159864,51150],{},[78,159866,159867],{"class":124,"line":150},[78,159868,51160],{},[78,159870,159871],{"class":124,"line":156},[78,159872,51165],{},[78,159874,159875],{"class":124,"line":162},[78,159876,56870],{},[78,159878,159879],{"class":124,"line":168},[78,159880,56944],{},[78,159882,159883],{"class":124,"line":174},[78,159884,51145],{},[78,159886,159887],{"class":124,"line":180},[78,159888,56884],{},[78,159890,159891],{"class":124,"line":186},[78,159892,56957],{},[78,159894,159895],{"class":124,"line":192},[78,159896,56962],{},[78,159898,159899],{"class":124,"line":198},[78,159900,56967],{},[78,159902,159903],{"class":124,"line":204},[78,159904,56972],{},[78,159906,159907],{"class":124,"line":210},[78,159908,56977],{},[78,159910,159911],{"class":124,"line":216},[78,159912,56982],{},[78,159914,159915],{"class":124,"line":222},[78,159916,56987],{},[78,159918,159919],{"class":124,"line":421},[78,159920,56992],{},[78,159922,159923],{"class":124,"line":427},[78,159924,56997],{},[78,159926,159927],{"class":124,"line":433},[78,159928,15810],{},[78,159930,159931],{"class":124,"line":2443},[78,159932,23518],{},[78,159934,159935],{"class":124,"line":2448},[78,159936,57010],{},[78,159938,159939],{"class":124,"line":2454},[78,159940,57015],{},[10548,159942,57018],{"id":57018},[114,159944,159945],{"className":51126,"code":57021,"language":51128,"meta":119,"style":119},[17,159946,159947,159951,159955,159959,159963,159967,159971,159975,159979,159983,159987,159991,159995,159999,160003],{"__ignoreMap":119},[78,159948,159949],{"class":124,"line":125},[78,159950,57028],{},[78,159952,159953],{"class":124,"line":132},[78,159954,57033],{},[78,159956,159957],{"class":124,"line":138},[78,159958,51145],{},[78,159960,159961],{"class":124,"line":144},[78,159962,57042],{},[78,159964,159965],{"class":124,"line":150},[78,159966,57047],{},[78,159968,159969],{"class":124,"line":156},[78,159970,57052],{},[78,159972,159973],{"class":124,"line":162},[78,159974,56967],{},[78,159976,159977],{"class":124,"line":168},[78,159978,57061],{},[78,159980,159981],{"class":124,"line":174},[78,159982,57066],{},[78,159984,159985],{"class":124,"line":180},[78,159986,57071],{},[78,159988,159989],{"class":124,"line":186},[78,159990,57076],{},[78,159992,159993],{"class":124,"line":192},[78,159994,15810],{},[78,159996,159997],{"class":124,"line":198},[78,159998,23518],{},[78,160000,160001],{"class":124,"line":204},[78,160002,57089],{},[78,160004,160005],{"class":124,"line":210},[78,160006,57094],{},[10548,160008,57097],{"id":57097},[114,160010,160011],{"className":51126,"code":57100,"language":51128,"meta":119,"style":119},[17,160012,160013,160017,160021,160025,160029,160033,160037,160041,160045],{"__ignoreMap":119},[78,160014,160015],{"class":124,"line":125},[78,160016,57028],{},[78,160018,160019],{"class":124,"line":132},[78,160020,57111],{},[78,160022,160023],{"class":124,"line":138},[78,160024,51145],{},[78,160026,160027],{"class":124,"line":144},[78,160028,57042],{},[78,160030,160031],{"class":124,"line":150},[78,160032,57124],{},[78,160034,160035],{"class":124,"line":156},[78,160036,57129],{},[78,160038,160039],{"class":124,"line":162},[78,160040,57134],{},[78,160042,160043],{"class":124,"line":168},[78,160044,57139],{},[78,160046,160047],{"class":124,"line":174},[78,160048,23518],{},[10548,160050,57147],{"id":57146},[114,160052,160053],{"className":51126,"code":57150,"language":51128,"meta":119,"style":119},[17,160054,160055,160059,160063,160067,160071,160075,160079,160083,160087,160091,160095,160099,160103,160107,160111],{"__ignoreMap":119},[78,160056,160057],{"class":124,"line":125},[78,160058,57157],{},[78,160060,160061],{"class":124,"line":132},[78,160062,51135],{},[78,160064,160065],{"class":124,"line":138},[78,160066,51140],{},[78,160068,160069],{"class":124,"line":144},[78,160070,51145],{},[78,160072,160073],{"class":124,"line":150},[78,160074,51150],{},[78,160076,160077],{"class":124,"line":156},[78,160078,51155],{},[78,160080,160081],{"class":124,"line":162},[78,160082,57182],{},[78,160084,160085],{"class":124,"line":168},[78,160086,51165],{},[78,160088,160089],{"class":124,"line":174},[78,160090,57191],{},[78,160092,160093],{"class":124,"line":180},[78,160094,57196],{},[78,160096,160097],{"class":124,"line":186},[78,160098,51145],{},[78,160100,160101],{"class":124,"line":192},[78,160102,57205],{},[78,160104,160105],{"class":124,"line":198},[78,160106,57210],{},[78,160108,160109],{"class":124,"line":204},[78,160110,57215],{},[78,160112,160113],{"class":124,"line":210},[78,160114,23518],{},[10548,160116,57223],{"id":57222},[114,160118,160119],{"className":51126,"code":57226,"language":51128,"meta":119,"style":119},[17,160120,160121,160125,160129,160133,160137,160141,160145,160149,160153,160157,160161,160165,160169,160173,160177],{"__ignoreMap":119},[78,160122,160123],{"class":124,"line":125},[78,160124,51135],{},[78,160126,160127],{"class":124,"line":132},[78,160128,57237],{},[78,160130,160131],{"class":124,"line":138},[78,160132,51145],{},[78,160134,160135],{"class":124,"line":144},[78,160136,51150],{},[78,160138,160139],{"class":124,"line":150},[78,160140,57250],{},[78,160142,160143],{"class":124,"line":156},[78,160144,57255],{},[78,160146,160147],{"class":124,"line":162},[78,160148,51165],{},[78,160150,160151],{"class":124,"line":168},[78,160152,57264],{},[78,160154,160155],{"class":124,"line":174},[78,160156,57269],{},[78,160158,160159],{"class":124,"line":180},[78,160160,51145],{},[78,160162,160163],{"class":124,"line":186},[78,160164,56884],{},[78,160166,160167],{"class":124,"line":192},[78,160168,57282],{},[78,160170,160171],{"class":124,"line":198},[78,160172,57287],{},[78,160174,160175],{"class":124,"line":204},[78,160176,57292],{},[78,160178,160179],{"class":124,"line":210},[78,160180,23518],{},[10548,160182,57300],{"id":57299},[114,160184,160185],{"className":51126,"code":57303,"language":51128,"meta":119,"style":119},[17,160186,160187,160193,160197,160201,160205,160209,160213,160217,160221,160225,160229,160233,160237,160241,160245,160249,160253],{"__ignoreMap":119},[78,160188,160189,160191],{"class":124,"line":125},[78,160190,57310],{},[78,160192,57313],{},[78,160194,160195],{"class":124,"line":132},[78,160196,57318],{},[78,160198,160199],{"class":124,"line":138},[78,160200,57323],{},[78,160202,160203],{"class":124,"line":144},[78,160204,57328],{},[78,160206,160207],{"class":124,"line":150},[78,160208,51145],{},[78,160210,160211],{"class":124,"line":156},[78,160212,57042],{},[78,160214,160215],{"class":124,"line":162},[78,160216,57341],{},[78,160218,160219],{"class":124,"line":168},[78,160220,57346],{},[78,160222,160223],{"class":124,"line":174},[78,160224,57351],{},[78,160226,160227],{"class":124,"line":180},[78,160228,57356],{},[78,160230,160231],{"class":124,"line":186},[78,160232,57066],{},[78,160234,160235],{"class":124,"line":192},[78,160236,57365],{},[78,160238,160239],{"class":124,"line":198},[78,160240,57370],{},[78,160242,160243],{"class":124,"line":204},[78,160244,57375],{},[78,160246,160247],{"class":124,"line":210},[78,160248,57380],{},[78,160250,160251],{"class":124,"line":216},[78,160252,57385],{},[78,160254,160255],{"class":124,"line":222},[78,160256,23518],{},[10548,160258,57393],{"id":57392},[114,160260,160261],{"className":51126,"code":57396,"language":51128,"meta":119,"style":119},[17,160262,160263,160267,160271,160275,160279,160283,160287,160291,160295,160299,160303,160307,160311,160315,160319,160323,160327,160331,160335,160339,160343,160347,160351,160355,160359,160363,160367,160371,160375,160379,160383],{"__ignoreMap":119},[78,160264,160265],{"class":124,"line":125},[78,160266,57403],{},[78,160268,160269],{"class":124,"line":132},[78,160270,57408],{},[78,160272,160273],{"class":124,"line":138},[78,160274,51145],{},[78,160276,160277],{"class":124,"line":144},[78,160278,57042],{},[78,160280,160281],{"class":124,"line":150},[78,160282,57047],{},[78,160284,160285],{"class":124,"line":156},[78,160286,57425],{},[78,160288,160289],{"class":124,"line":162},[78,160290,57430],{},[78,160292,160293],{"class":124,"line":168},[78,160294,56967],{},[78,160296,160297],{"class":124,"line":174},[78,160298,57061],{},[78,160300,160301],{"class":124,"line":180},[78,160302,57066],{},[78,160304,160305],{"class":124,"line":186},[78,160306,57071],{},[78,160308,160309],{"class":124,"line":192},[78,160310,57451],{},[78,160312,160313],{"class":124,"line":198},[78,160314,10054],{},[78,160316,160317],{"class":124,"line":204},[78,160318,57460],{},[78,160320,160321],{"class":124,"line":210},[78,160322,23518],{},[78,160324,160325],{"class":124,"line":216},[78,160326,57469],{},[78,160328,160329],{"class":124,"line":222},[78,160330,51145],{},[78,160332,160333],{"class":124,"line":421},[78,160334,57042],{},[78,160336,160337],{"class":124,"line":427},[78,160338,57482],{},[78,160340,160341],{"class":124,"line":433},[78,160342,57487],{},[78,160344,160345],{"class":124,"line":2443},[78,160346,57492],{},[78,160348,160349],{"class":124,"line":2448},[78,160350,57497],{},[78,160352,160353],{"class":124,"line":2454},[78,160354,57502],{},[78,160356,160357],{"class":124,"line":2460},[78,160358,57507],{},[78,160360,160361],{"class":124,"line":2465},[78,160362,23518],{},[78,160364,160365],{"class":124,"line":2470},[78,160366,57516],{},[78,160368,160369],{"class":124,"line":2903},[78,160370,57521],{},[78,160372,160373],{"class":124,"line":2909},[78,160374,57521],{},[78,160376,160377],{"class":124,"line":11477},[78,160378,57521],{},[78,160380,160381],{"class":124,"line":13374},[78,160382,57534],{},[78,160384,160385],{"class":124,"line":13380},[78,160386,57539],{},[107,160388,57542],{"id":57542},[10548,160390,57546],{"id":57545},[114,160392,160393],{"className":51126,"code":57549,"language":51128,"meta":119,"style":119},[17,160394,160395,160399,160403,160407,160411,160415,160419,160423,160427,160431,160435,160439,160443,160447],{"__ignoreMap":119},[78,160396,160397],{"class":124,"line":125},[78,160398,57556],{},[78,160400,160401],{"class":124,"line":132},[78,160402,56686],{},[78,160404,160405],{"class":124,"line":138},[78,160406,57565],{},[78,160408,160409],{"class":124,"line":144},[78,160410,51145],{},[78,160412,160413],{"class":124,"line":150},[78,160414,57574],{},[78,160416,160417],{"class":124,"line":156},[78,160418,57579],{},[78,160420,160421],{"class":124,"line":162},[78,160422,57584],{},[78,160424,160425],{"class":124,"line":168},[78,160426,57589],{},[78,160428,160429],{"class":124,"line":174},[78,160430,57594],{},[78,160432,160433],{"class":124,"line":180},[78,160434,57599],{},[78,160436,160437],{"class":124,"line":186},[78,160438,15810],{},[78,160440,160441],{"class":124,"line":192},[78,160442,57608],{},[78,160444,160445],{"class":124,"line":198},[78,160446,23518],{},[78,160448,160449],{"class":124,"line":204},[78,160450,57617],{},[10548,160452,57620],{"id":57620},[114,160454,160455],{"className":51126,"code":57623,"language":51128,"meta":119,"style":119},[17,160456,160457,160461,160465,160469,160473,160477,160481,160485,160489,160493,160497,160501,160505,160509,160513,160517,160521,160525,160529,160533,160537,160541,160545,160549,160553,160557,160561],{"__ignoreMap":119},[78,160458,160459],{"class":124,"line":125},[78,160460,51135],{},[78,160462,160463],{"class":124,"line":132},[78,160464,57634],{},[78,160466,160467],{"class":124,"line":138},[78,160468,51145],{},[78,160470,160471],{"class":124,"line":144},[78,160472,57643],{},[78,160474,160475],{"class":124,"line":150},[78,160476,57648],{},[78,160478,160479],{"class":124,"line":156},[78,160480,57653],{},[78,160482,160483],{"class":124,"line":162},[78,160484,57658],{},[78,160486,160487],{"class":124,"line":168},[78,160488,57663],{},[78,160490,160491],{"class":124,"line":174},[78,160492,57668],{},[78,160494,160495],{"class":124,"line":180},[78,160496,57673],{},[78,160498,160499],{"class":124,"line":186},[78,160500,57678],{},[78,160502,160503],{"class":124,"line":192},[78,160504,57683],{},[78,160506,160507],{"class":124,"line":198},[78,160508,57688],{},[78,160510,160511],{"class":124,"line":204},[78,160512,57693],{},[78,160514,160515],{"class":124,"line":210},[78,160516,57698],{},[78,160518,160519],{"class":124,"line":216},[78,160520,57703],{},[78,160522,160523],{"class":124,"line":222},[78,160524,23518],{},[78,160526,160527],{"class":124,"line":421},[78,160528,51135],{},[78,160530,160531],{"class":124,"line":427},[78,160532,57716],{},[78,160534,160535],{"class":124,"line":433},[78,160536,51145],{},[78,160538,160539],{"class":124,"line":2443},[78,160540,57725],{},[78,160542,160543],{"class":124,"line":2448},[78,160544,57730],{},[78,160546,160547],{"class":124,"line":2454},[78,160548,57735],{},[78,160550,160551],{"class":124,"line":2460},[78,160552,57740],{},[78,160554,160555],{"class":124,"line":2465},[78,160556,57745],{},[78,160558,160559],{"class":124,"line":2470},[78,160560,23518],{},[78,160562,160563],{"class":124,"line":2903},[78,160564,57754],{},[10548,160566,57757],{"id":57757},[114,160568,160569],{"className":51126,"code":57760,"language":51128,"meta":119,"style":119},[17,160570,160571,160575,160579,160583,160587,160591,160595,160599,160603,160607,160611,160615,160619,160623,160627,160631,160635,160639,160643],{"__ignoreMap":119},[78,160572,160573],{"class":124,"line":125},[78,160574,51135],{},[78,160576,160577],{"class":124,"line":132},[78,160578,57771],{},[78,160580,160581],{"class":124,"line":138},[78,160582,51145],{},[78,160584,160585],{"class":124,"line":144},[78,160586,57780],{},[78,160588,160589],{"class":124,"line":150},[78,160590,57785],{},[78,160592,160593],{"class":124,"line":156},[78,160594,57790],{},[78,160596,160597],{"class":124,"line":162},[78,160598,57795],{},[78,160600,160601],{"class":124,"line":168},[78,160602,57800],{},[78,160604,160605],{"class":124,"line":174},[78,160606,57805],{},[78,160608,160609],{"class":124,"line":180},[78,160610,23518],{},[78,160612,160613],{"class":124,"line":186},[78,160614,51135],{},[78,160616,160617],{"class":124,"line":192},[78,160618,57818],{},[78,160620,160621],{"class":124,"line":198},[78,160622,51145],{},[78,160624,160625],{"class":124,"line":204},[78,160626,57725],{},[78,160628,160629],{"class":124,"line":210},[78,160630,57831],{},[78,160632,160633],{"class":124,"line":216},[78,160634,57836],{},[78,160636,160637],{"class":124,"line":222},[78,160638,57841],{},[78,160640,160641],{"class":124,"line":421},[78,160642,23518],{},[78,160644,160645],{"class":124,"line":427},[78,160646,57850],{},[10548,160648,57853],{"id":57853},[114,160650,160651],{"className":51126,"code":57856,"language":51128,"meta":119,"style":119},[17,160652,160653,160657,160661,160665,160669,160673,160677,160681,160685,160689,160693,160697,160701,160705,160709,160713,160717,160721,160725,160729,160733,160737,160741,160745],{"__ignoreMap":119},[78,160654,160655],{"class":124,"line":125},[78,160656,51135],{},[78,160658,160659],{"class":124,"line":132},[78,160660,57771],{},[78,160662,160663],{"class":124,"line":138},[78,160664,51145],{},[78,160666,160667],{"class":124,"line":144},[78,160668,57780],{},[78,160670,160671],{"class":124,"line":150},[78,160672,57879],{},[78,160674,160675],{"class":124,"line":156},[78,160676,57790],{},[78,160678,160679],{"class":124,"line":162},[78,160680,57795],{},[78,160682,160683],{"class":124,"line":168},[78,160684,57892],{},[78,160686,160687],{"class":124,"line":174},[78,160688,57805],{},[78,160690,160691],{"class":124,"line":180},[78,160692,23518],{},[78,160694,160695],{"class":124,"line":186},[78,160696,51135],{},[78,160698,160699],{"class":124,"line":192},[78,160700,57909],{},[78,160702,160703],{"class":124,"line":198},[78,160704,51145],{},[78,160706,160707],{"class":124,"line":204},[78,160708,57574],{},[78,160710,160711],{"class":124,"line":210},[78,160712,57922],{},[78,160714,160715],{"class":124,"line":216},[78,160716,57927],{},[78,160718,160719],{"class":124,"line":222},[78,160720,57932],{},[78,160722,160723],{"class":124,"line":421},[78,160724,57937],{},[78,160726,160727],{"class":124,"line":427},[78,160728,57599],{},[78,160730,160731],{"class":124,"line":433},[78,160732,15810],{},[78,160734,160735],{"class":124,"line":2443},[78,160736,23518],{},[78,160738,160739],{"class":124,"line":2448},[78,160740,57954],{},[78,160742,160743],{"class":124,"line":2454},[78,160744,57959],{},[78,160746,160747],{"class":124,"line":2460},[78,160748,57964],{},[10548,160750,57968],{"id":57967},[114,160752,160753],{"className":51126,"code":57971,"language":51128,"meta":119,"style":119},[17,160754,160755,160759,160763,160767,160771,160775,160779,160783,160787,160791,160795,160799,160803,160807,160811,160815,160819,160823],{"__ignoreMap":119},[78,160756,160757],{"class":124,"line":125},[78,160758,51135],{},[78,160760,160761],{"class":124,"line":132},[78,160762,57982],{},[78,160764,160765],{"class":124,"line":138},[78,160766,51145],{},[78,160768,160769],{"class":124,"line":144},[78,160770,57991],{},[78,160772,160773],{"class":124,"line":150},[78,160774,57996],{},[78,160776,160777],{"class":124,"line":156},[78,160778,57668],{},[78,160780,160781],{"class":124,"line":162},[78,160782,57673],{},[78,160784,160785],{"class":124,"line":168},[78,160786,58009],{},[78,160788,160789],{"class":124,"line":174},[78,160790,57683],{},[78,160792,160793],{"class":124,"line":180},[78,160794,57678],{},[78,160796,160797],{"class":124,"line":186},[78,160798,58022],{},[78,160800,160801],{"class":124,"line":192},[78,160802,58027],{},[78,160804,160805],{"class":124,"line":198},[78,160806,57693],{},[78,160808,160809],{"class":124,"line":204},[78,160810,58036],{},[78,160812,160813],{"class":124,"line":210},[78,160814,57703],{},[78,160816,160817],{"class":124,"line":216},[78,160818,58045],{},[78,160820,160821],{"class":124,"line":222},[78,160822,23518],{},[78,160824,160825],{"class":124,"line":421},[78,160826,58054],{},[10548,160828,58057],{"id":58057},[114,160830,160831],{"className":51126,"code":58060,"language":51128,"meta":119,"style":119},[17,160832,160833,160837,160841,160845,160849,160853,160857,160861],{"__ignoreMap":119},[78,160834,160835],{"class":124,"line":125},[78,160836,58067],{},[78,160838,160839],{"class":124,"line":132},[78,160840,51145],{},[78,160842,160843],{"class":124,"line":138},[78,160844,58076],{},[78,160846,160847],{"class":124,"line":144},[78,160848,58081],{},[78,160850,160851],{"class":124,"line":150},[78,160852,58086],{},[78,160854,160855],{"class":124,"line":156},[78,160856,57795],{},[78,160858,160859],{"class":124,"line":162},[78,160860,57805],{},[78,160862,160863],{"class":124,"line":168},[78,160864,23518],{},[107,160866,58101],{"id":58101},[10548,160868,58104],{"id":58104},[114,160870,160871],{"className":51126,"code":58107,"language":51128,"meta":119,"style":119},[17,160872,160873,160877,160881,160885,160889,160893,160897,160901,160905,160909],{"__ignoreMap":119},[78,160874,160875],{"class":124,"line":125},[78,160876,58114],{},[78,160878,160879],{"class":124,"line":132},[78,160880,51145],{},[78,160882,160883],{"class":124,"line":138},[78,160884,58123],{},[78,160886,160887],{"class":124,"line":144},[78,160888,58128],{},[78,160890,160891],{"class":124,"line":150},[78,160892,58133],{},[78,160894,160895],{"class":124,"line":156},[78,160896,58138],{},[78,160898,160899],{"class":124,"line":162},[78,160900,58143],{},[78,160902,160903],{"class":124,"line":168},[78,160904,58148],{},[78,160906,160907],{"class":124,"line":174},[78,160908,58153],{},[78,160910,160911],{"class":124,"line":180},[78,160912,23518],{},[10548,160914,58160],{"id":58160},[114,160916,160917],{"className":51126,"code":58163,"language":51128,"meta":119,"style":119},[17,160918,160919,160923,160927,160931,160935,160939,160943,160947,160951,160955,160959,160963,160967,160971,160975,160979,160983,160987,160991,160995,160999,161003,161007,161011,161015,161019,161023,161027],{"__ignoreMap":119},[78,160920,160921],{"class":124,"line":125},[78,160922,58170],{},[78,160924,160925],{"class":124,"line":132},[78,160926,51145],{},[78,160928,160929],{"class":124,"line":138},[78,160930,58179],{},[78,160932,160933],{"class":124,"line":144},[78,160934,58184],{},[78,160936,160937],{"class":124,"line":150},[78,160938,58189],{},[78,160940,160941],{"class":124,"line":156},[78,160942,57375],{},[78,160944,160945],{"class":124,"line":162},[78,160946,58198],{},[78,160948,160949],{"class":124,"line":168},[78,160950,58203],{},[78,160952,160953],{"class":124,"line":174},[78,160954,58081],{},[78,160956,160957],{"class":124,"line":180},[78,160958,58212],{},[78,160960,160961],{"class":124,"line":186},[78,160962,58217],{},[78,160964,160965],{"class":124,"line":192},[78,160966,58081],{},[78,160968,160969],{"class":124,"line":198},[78,160970,58226],{},[78,160972,160973],{"class":124,"line":204},[78,160974,23518],{},[78,160976,160977],{"class":124,"line":210},[78,160978,58235],{},[78,160980,160981],{"class":124,"line":216},[78,160982,51145],{},[78,160984,160985],{"class":124,"line":222},[78,160986,58244],{},[78,160988,160989],{"class":124,"line":421},[78,160990,58249],{},[78,160992,160993],{"class":124,"line":427},[78,160994,58254],{},[78,160996,160997],{"class":124,"line":433},[78,160998,58138],{},[78,161000,161001],{"class":124,"line":2443},[78,161002,58263],{},[78,161004,161005],{"class":124,"line":2448},[78,161006,58268],{},[78,161008,161009],{"class":124,"line":2454},[78,161010,58273],{},[78,161012,161013],{"class":124,"line":2460},[78,161014,58278],{},[78,161016,161017],{"class":124,"line":2465},[78,161018,58283],{},[78,161020,161021],{"class":124,"line":2470},[78,161022,58153],{},[78,161024,161025],{"class":124,"line":2903},[78,161026,23518],{},[78,161028,161029],{"class":124,"line":2909},[78,161030,58296],{},[10548,161032,58299],{"id":58299},[13,161034,58302],{},[13,161036,58305],{},[13,161038,58308],{},[114,161040,161041],{"className":51126,"code":58311,"language":51128,"meta":119,"style":119},[17,161042,161043,161047,161051,161055,161059,161063,161067,161071,161075,161079,161083,161087,161091,161095,161099,161103,161107,161111,161115,161119,161123,161127,161131,161135,161139,161143],{"__ignoreMap":119},[78,161044,161045],{"class":124,"line":125},[78,161046,58318],{},[78,161048,161049],{"class":124,"line":132},[78,161050,51145],{},[78,161052,161053],{"class":124,"line":138},[78,161054,58327],{},[78,161056,161057],{"class":124,"line":144},[78,161058,58184],{},[78,161060,161061],{"class":124,"line":150},[78,161062,58336],{},[78,161064,161065],{"class":124,"line":156},[78,161066,57375],{},[78,161068,161069],{"class":124,"line":162},[78,161070,58345],{},[78,161072,161073],{"class":124,"line":168},[78,161074,58203],{},[78,161076,161077],{"class":124,"line":174},[78,161078,58081],{},[78,161080,161081],{"class":124,"line":180},[78,161082,58358],{},[78,161084,161085],{"class":124,"line":186},[78,161086,58363],{},[78,161088,161089],{"class":124,"line":192},[78,161090,58081],{},[78,161092,161093],{"class":124,"line":198},[78,161094,58372],{},[78,161096,161097],{"class":124,"line":204},[78,161098,23518],{},[78,161100,161101],{"class":124,"line":210},[78,161102,58381],{},[78,161104,161105],{"class":124,"line":216},[78,161106,51145],{},[78,161108,161109],{"class":124,"line":222},[78,161110,58345],{},[78,161112,161113],{"class":124,"line":421},[78,161114,58394],{},[78,161116,161117],{"class":124,"line":427},[78,161118,58133],{},[78,161120,161121],{"class":124,"line":433},[78,161122,58403],{},[78,161124,161125],{"class":124,"line":2443},[78,161126,58408],{},[78,161128,161129],{"class":124,"line":2448},[78,161130,58413],{},[78,161132,161133],{"class":124,"line":2454},[78,161134,58418],{},[78,161136,161137],{"class":124,"line":2460},[78,161138,58153],{},[78,161140,161141],{"class":124,"line":2465},[78,161142,23518],{},[78,161144,161145],{"class":124,"line":2470},[78,161146,58431],{},[10548,161148,58435],{"id":58434},[13,161150,58438],{},[114,161152,161153],{"className":51126,"code":58441,"language":51128,"meta":119,"style":119},[17,161154,161155,161159,161163,161167,161171,161175,161179,161183,161187,161191,161195,161199,161203,161207,161211,161215,161219,161223,161227,161231,161235,161239],{"__ignoreMap":119},[78,161156,161157],{"class":124,"line":125},[78,161158,58448],{},[78,161160,161161],{"class":124,"line":132},[78,161162,58453],{},[78,161164,161165],{"class":124,"line":138},[78,161166,58458],{},[78,161168,161169],{"class":124,"line":144},[78,161170,51145],{},[78,161172,161173],{"class":124,"line":150},[78,161174,57042],{},[78,161176,161177],{"class":124,"line":156},[78,161178,58471],{},[78,161180,161181],{"class":124,"line":162},[78,161182,58476],{},[78,161184,161185],{"class":124,"line":168},[78,161186,58481],{},[78,161188,161189],{"class":124,"line":174},[78,161190,58486],{},[78,161192,161193],{"class":124,"line":180},[78,161194,58491],{},[78,161196,161197],{"class":124,"line":186},[78,161198,57066],{},[78,161200,161201],{"class":124,"line":192},[78,161202,58500],{},[78,161204,161205],{"class":124,"line":198},[78,161206,58505],{},[78,161208,161209],{"class":124,"line":204},[78,161210,58510],{},[78,161212,161213],{"class":124,"line":210},[78,161214,58515],{},[78,161216,161217],{"class":124,"line":216},[78,161218,57066],{},[78,161220,161221],{"class":124,"line":222},[78,161222,58524],{},[78,161224,161225],{"class":124,"line":421},[78,161226,58529],{},[78,161228,161229],{"class":124,"line":427},[78,161230,15810],{},[78,161232,161233],{"class":124,"line":433},[78,161234,58538],{},[78,161236,161237],{"class":124,"line":2443},[78,161238,23518],{},[78,161240,161241],{"class":124,"line":2448},[78,161242,58547],{},[10548,161244,58551],{"id":58550},[13,161246,58554],{},[114,161248,161249],{"className":51126,"code":58557,"language":51128,"meta":119,"style":119},[17,161250,161251,161255,161259,161263,161267,161271,161275,161279,161283,161287,161291,161295,161299,161303,161307],{"__ignoreMap":119},[78,161252,161253],{"class":124,"line":125},[78,161254,58564],{},[78,161256,161257],{"class":124,"line":132},[78,161258,51145],{},[78,161260,161261],{"class":124,"line":138},[78,161262,58573],{},[78,161264,161265],{"class":124,"line":144},[78,161266,58578],{},[78,161268,161269],{"class":124,"line":150},[78,161270,58583],{},[78,161272,161273],{"class":124,"line":156},[78,161274,58588],{},[78,161276,161277],{"class":124,"line":162},[78,161278,58593],{},[78,161280,161281],{"class":124,"line":168},[78,161282,58598],{},[78,161284,161285],{"class":124,"line":174},[78,161286,58603],{},[78,161288,161289],{"class":124,"line":180},[78,161290,58608],{},[78,161292,161293],{"class":124,"line":186},[78,161294,58613],{},[78,161296,161297],{"class":124,"line":192},[78,161298,58618],{},[78,161300,161301],{"class":124,"line":198},[78,161302,15810],{},[78,161304,161305],{"class":124,"line":204},[78,161306,58627],{},[78,161308,161309],{"class":124,"line":210},[78,161310,23518],{},[10548,161312,58634],{"id":58634},[114,161314,161315],{"className":51126,"code":58637,"language":51128,"meta":119,"style":119},[17,161316,161317,161321,161325,161329,161333,161337,161341,161345,161349,161353,161357,161361,161365,161369,161373,161377,161381,161385,161389,161393,161397,161401,161405,161409,161413,161417,161421,161425,161429],{"__ignoreMap":119},[78,161318,161319],{"class":124,"line":125},[78,161320,58644],{},[78,161322,161323],{"class":124,"line":132},[78,161324,51205],{},[78,161326,161327],{"class":124,"line":138},[78,161328,58653],{},[78,161330,161331],{"class":124,"line":144},[78,161332,58658],{},[78,161334,161335],{"class":124,"line":150},[78,161336,51145],{},[78,161338,161339],{"class":124,"line":156},[78,161340,58667],{},[78,161342,161343],{"class":124,"line":162},[78,161344,23518],{},[78,161346,161347],{"class":124,"line":168},[78,161348,58676],{},[78,161350,161351],{"class":124,"line":174},[78,161352,51145],{},[78,161354,161355],{"class":124,"line":180},[78,161356,58685],{},[78,161358,161359],{"class":124,"line":186},[78,161360,58690],{},[78,161362,161363],{"class":124,"line":192},[78,161364,58695],{},[78,161366,161367],{"class":124,"line":198},[78,161368,58700],{},[78,161370,161371],{"class":124,"line":204},[78,161372,23518],{},[78,161374,161375],{"class":124,"line":210},[78,161376,58709],{},[78,161378,161379],{"class":124,"line":216},[78,161380,51145],{},[78,161382,161383],{"class":124,"line":222},[78,161384,58718],{},[78,161386,161387],{"class":124,"line":421},[78,161388,58723],{},[78,161390,161391],{"class":124,"line":427},[78,161392,58728],{},[78,161394,161395],{"class":124,"line":433},[78,161396,58733],{},[78,161398,161399],{"class":124,"line":2443},[78,161400,58738],{},[78,161402,161403],{"class":124,"line":2448},[78,161404,58743],{},[78,161406,161407],{"class":124,"line":2454},[78,161408,58748],{},[78,161410,161411],{"class":124,"line":2460},[78,161412,58753],{},[78,161414,161415],{"class":124,"line":2465},[78,161416,58758],{},[78,161418,161419],{"class":124,"line":2470},[78,161420,15810],{},[78,161422,161423],{"class":124,"line":2903},[78,161424,58153],{},[78,161426,161427],{"class":124,"line":2909},[78,161428,23518],{},[78,161430,161431],{"class":124,"line":11477},[78,161432,58775],{},[13,161434,58778],{},[13,161436,58781],{},[13,161438,58784],{},[114,161440,161441],{"className":23652,"code":58787,"language":23654,"meta":119,"style":119},[17,161442,161443,161447,161451,161455,161459,161463,161467,161471,161475,161479,161483,161487,161491,161495,161499,161503,161507,161511,161515,161519,161523],{"__ignoreMap":119},[78,161444,161445],{"class":124,"line":125},[78,161446,58794],{},[78,161448,161449],{"class":124,"line":132},[78,161450,58799],{},[78,161452,161453],{"class":124,"line":138},[78,161454,58804],{},[78,161456,161457],{"class":124,"line":144},[78,161458,58809],{},[78,161460,161461],{"class":124,"line":150},[78,161462,58814],{},[78,161464,161465],{"class":124,"line":156},[78,161466,58819],{},[78,161468,161469],{"class":124,"line":162},[78,161470,58824],{},[78,161472,161473],{"class":124,"line":168},[78,161474,58829],{},[78,161476,161477],{"class":124,"line":174},[78,161478,58834],{},[78,161480,161481],{"class":124,"line":180},[78,161482,58839],{},[78,161484,161485],{"class":124,"line":186},[78,161486,9615],{},[78,161488,161489],{"class":124,"line":192},[78,161490,10054],{},[78,161492,161493],{"class":124,"line":198},[78,161494,58852],{},[78,161496,161497],{"class":124,"line":204},[78,161498,15810],{},[78,161500,161501],{"class":124,"line":210},[78,161502,58861],{},[78,161504,161505],{"class":124,"line":216},[78,161506,58866],{},[78,161508,161509],{"class":124,"line":222},[78,161510,58871],{},[78,161512,161513],{"class":124,"line":421},[78,161514,58876],{},[78,161516,161517],{"class":124,"line":427},[78,161518,15810],{},[78,161520,161521],{"class":124,"line":433},[78,161522,58885],{},[78,161524,161525],{"class":124,"line":2443},[78,161526,23518],{},[107,161528,58892],{"id":58892},[10548,161530,58895],{"id":58895},[13,161532,58898],{},[114,161534,161535],{"className":51126,"code":58901,"language":51128,"meta":119,"style":119},[17,161536,161537,161541,161545,161549,161553,161557,161561,161565,161569,161573,161577,161581,161585,161589,161593,161597],{"__ignoreMap":119},[78,161538,161539],{"class":124,"line":125},[78,161540,58908],{},[78,161542,161543],{"class":124,"line":132},[78,161544,51145],{},[78,161546,161547],{"class":124,"line":138},[78,161548,58917],{},[78,161550,161551],{"class":124,"line":144},[78,161552,58922],{},[78,161554,161555],{"class":124,"line":150},[78,161556,58927],{},[78,161558,161559],{"class":124,"line":156},[78,161560,58932],{},[78,161562,161563],{"class":124,"line":162},[78,161564,58937],{},[78,161566,161567],{"class":124,"line":168},[78,161568,58942],{},[78,161570,161571],{"class":124,"line":174},[78,161572,58947],{},[78,161574,161575],{"class":124,"line":180},[78,161576,9615],{},[78,161578,161579],{"class":124,"line":186},[78,161580,10054],{},[78,161582,161583],{"class":124,"line":192},[78,161584,15810],{},[78,161586,161587],{"class":124,"line":198},[78,161588,58964],{},[78,161590,161591],{"class":124,"line":204},[78,161592,23518],{},[78,161594,161595],{"class":124,"line":210},[78,161596,58973],{},[78,161598,161599],{"class":124,"line":216},[78,161600,58978],{},[10548,161602,58981],{"id":58981},[114,161604,161605],{"className":51126,"code":58984,"language":51128,"meta":119,"style":119},[17,161606,161607,161611,161615,161619,161623,161627,161631,161635,161639,161643,161647,161651,161655,161659,161663],{"__ignoreMap":119},[78,161608,161609],{"class":124,"line":125},[78,161610,58991],{},[78,161612,161613],{"class":124,"line":132},[78,161614,51145],{},[78,161616,161617],{"class":124,"line":138},[78,161618,57042],{},[78,161620,161621],{"class":124,"line":144},[78,161622,59004],{},[78,161624,161625],{"class":124,"line":150},[78,161626,59009],{},[78,161628,161629],{"class":124,"line":156},[78,161630,59014],{},[78,161632,161633],{"class":124,"line":162},[78,161634,59019],{},[78,161636,161637],{"class":124,"line":168},[78,161638,59024],{},[78,161640,161641],{"class":124,"line":174},[78,161642,59029],{},[78,161644,161645],{"class":124,"line":180},[78,161646,59034],{},[78,161648,161649],{"class":124,"line":186},[78,161650,9615],{},[78,161652,161653],{"class":124,"line":192},[78,161654,59043],{},[78,161656,161657],{"class":124,"line":198},[78,161658,23518],{},[78,161660,161661],{"class":124,"line":204},[78,161662,58973],{},[78,161664,161665],{"class":124,"line":210},[78,161666,59056],{},[10548,161668,59059],{"id":59059},[49,161670,161671,161673,161675,161677],{},[52,161672,59064],{},[52,161674,59067],{},[52,161676,59070],{},[52,161678,59073],{},[13,161680,161681],{},[617,161682],{"alt":59059,"src":59078},[114,161684,161685],{"className":51126,"code":59081,"language":51128,"meta":119,"style":119},[17,161686,161687,161691,161695,161699,161703,161707,161711,161715,161719,161723,161727,161731,161735,161739,161743,161747,161751,161755,161759],{"__ignoreMap":119},[78,161688,161689],{"class":124,"line":125},[78,161690,59088],{},[78,161692,161693],{"class":124,"line":132},[78,161694,51145],{},[78,161696,161697],{"class":124,"line":138},[78,161698,59097],{},[78,161700,161701],{"class":124,"line":144},[78,161702,59102],{},[78,161704,161705],{"class":124,"line":150},[78,161706,59107],{},[78,161708,161709],{"class":124,"line":156},[78,161710,59112],{},[78,161712,161713],{"class":124,"line":162},[78,161714,59117],{},[78,161716,161717],{"class":124,"line":168},[78,161718,59122],{},[78,161720,161721],{"class":124,"line":174},[78,161722,59127],{},[78,161724,161725],{"class":124,"line":180},[78,161726,59132],{},[78,161728,161729],{"class":124,"line":186},[78,161730,59137],{},[78,161732,161733],{"class":124,"line":192},[78,161734,15810],{},[78,161736,161737],{"class":124,"line":198},[78,161738,59146],{},[78,161740,161741],{"class":124,"line":204},[78,161742,59151],{},[78,161744,161745],{"class":124,"line":210},[78,161746,59156],{},[78,161748,161749],{"class":124,"line":216},[78,161750,59161],{},[78,161752,161753],{"class":124,"line":222},[78,161754,58153],{},[78,161756,161757],{"class":124,"line":421},[78,161758,23518],{},[78,161760,161761],{"class":124,"line":427},[78,161762,56667],{},[10548,161764,59176],{"id":59176},[114,161766,161767],{"className":51126,"code":59179,"language":51128,"meta":119,"style":119},[17,161768,161769,161773,161777,161781,161785,161789,161793,161797,161801,161805,161809,161813,161817,161821,161825,161829,161833,161837,161841,161845,161849,161853,161857,161861,161865,161869,161873,161877],{"__ignoreMap":119},[78,161770,161771],{"class":124,"line":125},[78,161772,59186],{},[78,161774,161775],{"class":124,"line":132},[78,161776,51145],{},[78,161778,161779],{"class":124,"line":138},[78,161780,59195],{},[78,161782,161783],{"class":124,"line":144},[78,161784,59200],{},[78,161786,161787],{"class":124,"line":150},[78,161788,59205],{},[78,161790,161791],{"class":124,"line":156},[78,161792,59210],{},[78,161794,161795],{"class":124,"line":162},[78,161796,59215],{},[78,161798,161799],{"class":124,"line":168},[78,161800,59220],{},[78,161802,161803],{"class":124,"line":174},[78,161804,59225],{},[78,161806,161807],{"class":124,"line":180},[78,161808,59230],{},[78,161810,161811],{"class":124,"line":186},[78,161812,59235],{},[78,161814,161815],{"class":124,"line":192},[78,161816,59240],{},[78,161818,161819],{"class":124,"line":198},[78,161820,59245],{},[78,161822,161823],{"class":124,"line":204},[78,161824,23518],{},[78,161826,161827],{"class":124,"line":210},[78,161828,59254],{},[78,161830,161831],{"class":124,"line":216},[78,161832,51145],{},[78,161834,161835],{"class":124,"line":222},[78,161836,59263],{},[78,161838,161839],{"class":124,"line":421},[78,161840,59268],{},[78,161842,161843],{"class":124,"line":427},[78,161844,59273],{},[78,161846,161847],{"class":124,"line":433},[78,161848,59278],{},[78,161850,161851],{"class":124,"line":2443},[78,161852,59283],{},[78,161854,161855],{"class":124,"line":2448},[78,161856,59288],{},[78,161858,161859],{"class":124,"line":2454},[78,161860,59293],{},[78,161862,161863],{"class":124,"line":2460},[78,161864,59298],{},[78,161866,161867],{"class":124,"line":2465},[78,161868,59303],{},[78,161870,161871],{"class":124,"line":2470},[78,161872,59308],{},[78,161874,161875],{"class":124,"line":2903},[78,161876,23518],{},[78,161878,161879],{"class":124,"line":2909},[78,161880,59317],{},[10548,161882,59321],{"id":59320},[13,161884,59324],{},[114,161886,161887],{"className":51126,"code":59327,"language":51128,"meta":119,"style":119},[17,161888,161889,161893,161897,161901,161905,161909,161913,161917,161921,161925,161929,161933,161937,161941,161945,161949,161953,161957,161961,161965,161969,161973,161977,161981,161985,161989,161993],{"__ignoreMap":119},[78,161890,161891],{"class":124,"line":125},[78,161892,51195],{},[78,161894,161895],{"class":124,"line":132},[78,161896,59338],{},[78,161898,161899],{"class":124,"line":138},[78,161900,59343],{},[78,161902,161903],{"class":124,"line":144},[78,161904,51205],{},[78,161906,161907],{"class":124,"line":150},[78,161908,59352],{},[78,161910,161911],{"class":124,"line":156},[78,161912,59357],{},[78,161914,161915],{"class":124,"line":162},[78,161916,59362],{},[78,161918,161919],{"class":124,"line":168},[78,161920,59367],{},[78,161922,161923],{"class":124,"line":174},[78,161924,59372],{},[78,161926,161927],{"class":124,"line":180},[78,161928,59377],{},[78,161930,161931],{"class":124,"line":186},[78,161932,59382],{},[78,161934,161935],{"class":124,"line":192},[78,161936,59387],{},[78,161938,161939],{"class":124,"line":198},[78,161940,59392],{},[78,161942,161943],{"class":124,"line":204},[78,161944,59397],{},[78,161946,161947],{"class":124,"line":210},[78,161948,59402],{},[78,161950,161951],{"class":124,"line":216},[78,161952,59407],{},[78,161954,161955],{"class":124,"line":222},[78,161956,59412],{},[78,161958,161959],{"class":124,"line":421},[78,161960,59417],{},[78,161962,161963],{"class":124,"line":427},[78,161964,59422],{},[78,161966,161967],{"class":124,"line":433},[78,161968,59427],{},[78,161970,161971],{"class":124,"line":2443},[78,161972,59432],{},[78,161974,161975],{"class":124,"line":2448},[78,161976,59437],{},[78,161978,161979],{"class":124,"line":2454},[78,161980,59442],{},[78,161982,161983],{"class":124,"line":2460},[78,161984,59447],{},[78,161986,161987],{"class":124,"line":2465},[78,161988,59452],{},[78,161990,161991],{"class":124,"line":2470},[78,161992,59457],{},[78,161994,161995],{"class":124,"line":2903},[78,161996,23518],{},[13,161998,59464,161999,28447],{},[25921,162000,59467],{},[114,162002,162003],{"className":23652,"code":59470,"language":23654,"meta":119,"style":119},[17,162004,162005,162009,162013,162017,162021,162025,162029,162033,162037,162041,162045,162049,162053,162057],{"__ignoreMap":119},[78,162006,162007],{"class":124,"line":125},[78,162008,59477],{},[78,162010,162011],{"class":124,"line":132},[78,162012,59482],{},[78,162014,162015],{"class":124,"line":138},[78,162016,59487],{},[78,162018,162019],{"class":124,"line":144},[78,162020,59492],{},[78,162022,162023],{"class":124,"line":150},[78,162024,59497],{},[78,162026,162027],{"class":124,"line":156},[78,162028,59502],{},[78,162030,162031],{"class":124,"line":162},[78,162032,59507],{},[78,162034,162035],{"class":124,"line":168},[78,162036,59235],{},[78,162038,162039],{"class":124,"line":174},[78,162040,59516],{},[78,162042,162043],{"class":124,"line":180},[78,162044,10054],{},[78,162046,162047],{"class":124,"line":186},[78,162048,15810],{},[78,162050,162051],{"class":124,"line":192},[78,162052,59529],{},[78,162054,162055],{"class":124,"line":198},[78,162056,23518],{},[78,162058,162059],{"class":124,"line":204},[78,162060,59538],{},[13,162062,59541,162063,59545],{},[25921,162064,59544],{},[107,162066,59548],{"id":59548},[10548,162068,59552],{"id":59551},[13,162070,59555,162071],{},[78,162072,4074],{},[13,162074,59560,162075,59563,162077,59563,162079,59563,162081,59563,162083,59563,162085,67],{},[78,162076,4074],{},[78,162078,4079],{},[78,162080,59568],{},[78,162082,59571],{},[78,162084,22872],{},[78,162086,4092],{},[114,162088,162089],{"className":51126,"code":59578,"language":51128,"meta":119,"style":119},[17,162090,162091,162095,162099,162103,162107,162111,162115,162119,162123,162127,162131,162135,162139,162143,162147,162151],{"__ignoreMap":119},[78,162092,162093],{"class":124,"line":125},[78,162094,59585],{},[78,162096,162097],{"class":124,"line":132},[78,162098,59590],{},[78,162100,162101],{"class":124,"line":138},[78,162102,51145],{},[78,162104,162105],{"class":124,"line":144},[78,162106,59599],{},[78,162108,162109],{"class":124,"line":150},[78,162110,59604],{},[78,162112,162113],{"class":124,"line":156},[78,162114,59609],{},[78,162116,162117],{"class":124,"line":162},[78,162118,57678],{},[78,162120,162121],{"class":124,"line":168},[78,162122,59618],{},[78,162124,162125],{"class":124,"line":174},[78,162126,59623],{},[78,162128,162129],{"class":124,"line":180},[78,162130,59628],{},[78,162132,162133],{"class":124,"line":186},[78,162134,59633],{},[78,162136,162137],{"class":124,"line":192},[78,162138,9615],{},[78,162140,162141],{"class":124,"line":198},[78,162142,57375],{},[78,162144,162145],{"class":124,"line":204},[78,162146,59646],{},[78,162148,162149],{"class":124,"line":210},[78,162150,59651],{},[78,162152,162153],{"class":124,"line":216},[78,162154,23518],{},[10548,162156,59659],{"id":59658},[13,162158,59662,162159],{},[78,162160,4074],{},[13,162162,59667],{},[114,162164,162165],{"className":51126,"code":59670,"language":51128,"meta":119,"style":119},[17,162166,162167,162171,162175,162179,162183,162187,162191,162195,162199,162203,162207,162211,162215,162219],{"__ignoreMap":119},[78,162168,162169],{"class":124,"line":125},[78,162170,59677],{},[78,162172,162173],{"class":124,"line":132},[78,162174,51145],{},[78,162176,162177],{"class":124,"line":138},[78,162178,59686],{},[78,162180,162181],{"class":124,"line":144},[78,162182,59691],{},[78,162184,162185],{"class":124,"line":150},[78,162186,59609],{},[78,162188,162189],{"class":124,"line":156},[78,162190,59700],{},[78,162192,162193],{"class":124,"line":162},[78,162194,59705],{},[78,162196,162197],{"class":124,"line":168},[78,162198,59710],{},[78,162200,162201],{"class":124,"line":174},[78,162202,59715],{},[78,162204,162205],{"class":124,"line":180},[78,162206,59720],{},[78,162208,162209],{"class":124,"line":186},[78,162210,10054],{},[78,162212,162213],{"class":124,"line":192},[78,162214,57375],{},[78,162216,162217],{"class":124,"line":198},[78,162218,59733],{},[78,162220,162221],{"class":124,"line":204},[78,162222,23518],{},[10548,162224,59740],{"id":59740},[114,162226,162227],{"className":51126,"code":59743,"language":51128,"meta":119,"style":119},[17,162228,162229,162233,162237,162241,162245,162249,162253,162257,162261,162265,162269,162273,162277,162281,162285,162289,162293,162297,162301,162305,162309],{"__ignoreMap":119},[78,162230,162231],{"class":124,"line":125},[78,162232,59750],{},[78,162234,162235],{"class":124,"line":132},[78,162236,59755],{},[78,162238,162239],{"class":124,"line":138},[78,162240,51145],{},[78,162242,162243],{"class":124,"line":144},[78,162244,57042],{},[78,162246,162247],{"class":124,"line":150},[78,162248,59768],{},[78,162250,162251],{"class":124,"line":156},[78,162252,59773],{},[78,162254,162255],{"class":124,"line":162},[78,162256,59778],{},[78,162258,162259],{"class":124,"line":168},[78,162260,59783],{},[78,162262,162263],{"class":124,"line":174},[78,162264,59788],{},[78,162266,162267],{"class":124,"line":180},[78,162268,59793],{},[78,162270,162271],{"class":124,"line":186},[78,162272,59798],{},[78,162274,162275],{"class":124,"line":192},[78,162276,59803],{},[78,162278,162279],{"class":124,"line":198},[78,162280,59808],{},[78,162282,162283],{"class":124,"line":204},[78,162284,59813],{},[78,162286,162287],{"class":124,"line":210},[78,162288,59803],{},[78,162290,162291],{"class":124,"line":216},[78,162292,9615],{},[78,162294,162295],{"class":124,"line":222},[78,162296,57375],{},[78,162298,162299],{"class":124,"line":421},[78,162300,59830],{},[78,162302,162303],{"class":124,"line":427},[78,162304,59835],{},[78,162306,162307],{"class":124,"line":433},[78,162308,59840],{},[78,162310,162311],{"class":124,"line":2443},[78,162312,23518],{},[10548,162314,59848],{"id":59847},[13,162316,59851],{},[114,162318,162319],{"className":51126,"code":59854,"language":51128,"meta":119,"style":119},[17,162320,162321,162325,162329,162333,162337,162341,162345,162349,162353,162357,162361,162365,162369,162373,162377,162381,162385,162389,162393,162397,162401],{"__ignoreMap":119},[78,162322,162323],{"class":124,"line":125},[78,162324,59861],{},[78,162326,162327],{"class":124,"line":132},[78,162328,59866],{},[78,162330,162331],{"class":124,"line":138},[78,162332,51145],{},[78,162334,162335],{"class":124,"line":144},[78,162336,58123],{},[78,162338,162339],{"class":124,"line":150},[78,162340,59879],{},[78,162342,162343],{"class":124,"line":156},[78,162344,59884],{},[78,162346,162347],{"class":124,"line":162},[78,162348,59889],{},[78,162350,162351],{"class":124,"line":168},[78,162352,59894],{},[78,162354,162355],{"class":124,"line":174},[78,162356,59899],{},[78,162358,162359],{"class":124,"line":180},[78,162360,59904],{},[78,162362,162363],{"class":124,"line":186},[78,162364,59909],{},[78,162366,162367],{"class":124,"line":192},[78,162368,59914],{},[78,162370,162371],{"class":124,"line":198},[78,162372,59715],{},[78,162374,162375],{"class":124,"line":204},[78,162376,59923],{},[78,162378,162379],{"class":124,"line":210},[78,162380,59928],{},[78,162382,162383],{"class":124,"line":216},[78,162384,10054],{},[78,162386,162387],{"class":124,"line":222},[78,162388,57375],{},[78,162390,162391],{"class":124,"line":421},[78,162392,59941],{},[78,162394,162395],{"class":124,"line":427},[78,162396,59946],{},[78,162398,162399],{"class":124,"line":433},[78,162400,59951],{},[78,162402,162403],{"class":124,"line":2443},[78,162404,23518],{},[114,162406,162407],{"className":51126,"code":59958,"language":51128,"meta":119,"style":119},[17,162408,162409,162413,162417,162421,162425,162429,162433,162437,162441,162445,162449,162453,162457,162461,162465,162469,162473,162477,162481],{"__ignoreMap":119},[78,162410,162411],{"class":124,"line":125},[78,162412,59965],{},[78,162414,162415],{"class":124,"line":132},[78,162416,51145],{},[78,162418,162419],{"class":124,"line":138},[78,162420,58123],{},[78,162422,162423],{"class":124,"line":144},[78,162424,59686],{},[78,162426,162427],{"class":124,"line":150},[78,162428,59884],{},[78,162430,162431],{"class":124,"line":156},[78,162432,59986],{},[78,162434,162435],{"class":124,"line":162},[78,162436,59899],{},[78,162438,162439],{"class":124,"line":168},[78,162440,59904],{},[78,162442,162443],{"class":124,"line":174},[78,162444,59999],{},[78,162446,162447],{"class":124,"line":180},[78,162448,59914],{},[78,162450,162451],{"class":124,"line":186},[78,162452,59715],{},[78,162454,162455],{"class":124,"line":192},[78,162456,60012],{},[78,162458,162459],{"class":124,"line":198},[78,162460,59928],{},[78,162462,162463],{"class":124,"line":204},[78,162464,10054],{},[78,162466,162467],{"class":124,"line":210},[78,162468,57375],{},[78,162470,162471],{"class":124,"line":216},[78,162472,60029],{},[78,162474,162475],{"class":124,"line":222},[78,162476,59946],{},[78,162478,162479],{"class":124,"line":421},[78,162480,23518],{},[78,162482,162483],{"class":124,"line":427},[78,162484,60042],{},[10548,162486,60045],{"id":60045},[13,162488,60048],{},[49,162490,162491,162493],{},[52,162492,60053],{},[52,162494,60056],{},[114,162496,162497],{"className":51126,"code":60059,"language":51128,"meta":119,"style":119},[17,162498,162499,162503,162507,162511,162515,162519,162523,162527,162531,162535,162539,162543,162547,162551,162555,162559,162563,162567,162571,162575,162579,162583,162587],{"__ignoreMap":119},[78,162500,162501],{"class":124,"line":125},[78,162502,60066],{},[78,162504,162505],{"class":124,"line":132},[78,162506,51145],{},[78,162508,162509],{"class":124,"line":138},[78,162510,60075],{},[78,162512,162513],{"class":124,"line":144},[78,162514,60080],{},[78,162516,162517],{"class":124,"line":150},[78,162518,60085],{},[78,162520,162521],{"class":124,"line":156},[78,162522,58538],{},[78,162524,162525],{"class":124,"line":162},[78,162526,23518],{},[78,162528,162529],{"class":124,"line":168},[78,162530,60098],{},[78,162532,162533],{"class":124,"line":174},[78,162534,51145],{},[78,162536,162537],{"class":124,"line":180},[78,162538,60107],{},[78,162540,162541],{"class":124,"line":186},[78,162542,60112],{},[78,162544,162545],{"class":124,"line":192},[78,162546,60117],{},[78,162548,162549],{"class":124,"line":198},[78,162550,60122],{},[78,162552,162553],{"class":124,"line":204},[78,162554,60127],{},[78,162556,162557],{"class":124,"line":210},[78,162558,59904],{},[78,162560,162561],{"class":124,"line":216},[78,162562,60136],{},[78,162564,162565],{"class":124,"line":222},[78,162566,59715],{},[78,162568,162569],{"class":124,"line":421},[78,162570,60145],{},[78,162572,162573],{"class":124,"line":427},[78,162574,10054],{},[78,162576,162577],{"class":124,"line":433},[78,162578,57375],{},[78,162580,162581],{"class":124,"line":2443},[78,162582,60158],{},[78,162584,162585],{"class":124,"line":2448},[78,162586,59840],{},[78,162588,162589],{"class":124,"line":2454},[78,162590,23518],{},[10548,162592,60169],{"id":60169},[13,162594,60172],{},[49,162596,162597],{},[52,162598,60177],{},[114,162600,162601],{"className":51126,"code":60180,"language":51128,"meta":119,"style":119},[17,162602,162603,162607,162611,162615,162619,162623,162627,162631,162635,162639,162643,162647,162651,162655,162659,162663,162667,162671,162675,162679,162683,162687,162691,162695,162699,162703,162707,162711],{"__ignoreMap":119},[78,162604,162605],{"class":124,"line":125},[78,162606,60187],{},[78,162608,162609],{"class":124,"line":132},[78,162610,60192],{},[78,162612,162613],{"class":124,"line":138},[78,162614,60197],{},[78,162616,162617],{"class":124,"line":144},[78,162618,51205],{},[78,162620,162621],{"class":124,"line":150},[78,162622,60206],{},[78,162624,162625],{"class":124,"line":156},[78,162626,51145],{},[78,162628,162629],{"class":124,"line":162},[78,162630,60215],{},[78,162632,162633],{"class":124,"line":168},[78,162634,60220],{},[78,162636,162637],{"class":124,"line":174},[78,162638,60085],{},[78,162640,162641],{"class":124,"line":180},[78,162642,58538],{},[78,162644,162645],{"class":124,"line":186},[78,162646,23518],{},[78,162648,162649],{"class":124,"line":192},[78,162650,60237],{},[78,162652,162653],{"class":124,"line":198},[78,162654,51145],{},[78,162656,162657],{"class":124,"line":204},[78,162658,60246],{},[78,162660,162661],{"class":124,"line":210},[78,162662,60251],{},[78,162664,162665],{"class":124,"line":216},[78,162666,60256],{},[78,162668,162669],{"class":124,"line":222},[78,162670,60261],{},[78,162672,162673],{"class":124,"line":421},[78,162674,60266],{},[78,162676,162677],{"class":124,"line":427},[78,162678,59793],{},[78,162680,162681],{"class":124,"line":433},[78,162682,60275],{},[78,162684,162685],{"class":124,"line":2443},[78,162686,60280],{},[78,162688,162689],{"class":124,"line":2448},[78,162690,60285],{},[78,162692,162693],{"class":124,"line":2454},[78,162694,60290],{},[78,162696,162697],{"class":124,"line":2460},[78,162698,9615],{},[78,162700,162701],{"class":124,"line":2465},[78,162702,60299],{},[78,162704,162705],{"class":124,"line":2470},[78,162706,60304],{},[78,162708,162709],{"class":124,"line":2903},[78,162710,59840],{},[78,162712,162713],{"class":124,"line":2909},[78,162714,23518],{},[107,162716,60315],{"id":60315},[13,162718,60318],{},[10548,162720,60322],{"id":60321},[49,162722,162723],{},[52,162724,60327],{},[114,162726,162727],{"className":51126,"code":60330,"language":51128,"meta":119,"style":119},[17,162728,162729,162733,162737,162741,162745,162749,162753,162757,162761,162765,162769,162773,162777,162781,162785,162789,162793,162797,162801],{"__ignoreMap":119},[78,162730,162731],{"class":124,"line":125},[78,162732,60337],{},[78,162734,162735],{"class":124,"line":132},[78,162736,51145],{},[78,162738,162739],{"class":124,"line":138},[78,162740,60346],{},[78,162742,162743],{"class":124,"line":144},[78,162744,58263],{},[78,162746,162747],{"class":124,"line":150},[78,162748,51165],{},[78,162750,162751],{"class":124,"line":156},[78,162752,60359],{},[78,162754,162755],{"class":124,"line":162},[78,162756,51145],{},[78,162758,162759],{"class":124,"line":168},[78,162760,60368],{},[78,162762,162763],{"class":124,"line":174},[78,162764,60373],{},[78,162766,162767],{"class":124,"line":180},[78,162768,60378],{},[78,162770,162771],{"class":124,"line":186},[78,162772,60383],{},[78,162774,162775],{"class":124,"line":192},[78,162776,56967],{},[78,162778,162779],{"class":124,"line":198},[78,162780,60392],{},[78,162782,162783],{"class":124,"line":204},[78,162784,59609],{},[78,162786,162787],{"class":124,"line":210},[78,162788,59427],{},[78,162790,162791],{"class":124,"line":216},[78,162792,60405],{},[78,162794,162795],{"class":124,"line":222},[78,162796,60410],{},[78,162798,162799],{"class":124,"line":421},[78,162800,15810],{},[78,162802,162803],{"class":124,"line":427},[78,162804,23518],{},[10548,162806,60422],{"id":60421},[114,162808,162809],{"className":51126,"code":60425,"language":51128,"meta":119,"style":119},[17,162810,162811,162815,162819,162823,162827,162831,162835,162839,162843,162847,162851,162855,162859,162863,162867,162871,162875,162879,162883],{"__ignoreMap":119},[78,162812,162813],{"class":124,"line":125},[78,162814,60432],{},[78,162816,162817],{"class":124,"line":132},[78,162818,51145],{},[78,162820,162821],{"class":124,"line":138},[78,162822,60441],{},[78,162824,162825],{"class":124,"line":144},[78,162826,58263],{},[78,162828,162829],{"class":124,"line":150},[78,162830,51165],{},[78,162832,162833],{"class":124,"line":156},[78,162834,60454],{},[78,162836,162837],{"class":124,"line":162},[78,162838,51145],{},[78,162840,162841],{"class":124,"line":168},[78,162842,60463],{},[78,162844,162845],{"class":124,"line":174},[78,162846,59686],{},[78,162848,162849],{"class":124,"line":180},[78,162850,60383],{},[78,162852,162853],{"class":124,"line":186},[78,162854,56967],{},[78,162856,162857],{"class":124,"line":192},[78,162858,60480],{},[78,162860,162861],{"class":124,"line":198},[78,162862,59609],{},[78,162864,162865],{"class":124,"line":204},[78,162866,60489],{},[78,162868,162869],{"class":124,"line":210},[78,162870,60494],{},[78,162872,162873],{"class":124,"line":216},[78,162874,60499],{},[78,162876,162877],{"class":124,"line":222},[78,162878,10054],{},[78,162880,162881],{"class":124,"line":421},[78,162882,15810],{},[78,162884,162885],{"class":124,"line":427},[78,162886,23518],{},[13,162888,60514],{},[10548,162890,59740],{"id":60517},[114,162892,162893],{"className":51126,"code":60520,"language":51128,"meta":119,"style":119},[17,162894,162895,162899,162903,162907,162911,162915,162919,162923,162927,162931,162935,162939,162943,162947,162951,162955,162959,162963,162967,162971,162975,162979,162983,162987,162991,162995,162999,163003,163007,163011,163015],{"__ignoreMap":119},[78,162896,162897],{"class":124,"line":125},[78,162898,60527],{},[78,162900,162901],{"class":124,"line":132},[78,162902,51145],{},[78,162904,162905],{"class":124,"line":138},[78,162906,60346],{},[78,162908,162909],{"class":124,"line":144},[78,162910,58263],{},[78,162912,162913],{"class":124,"line":150},[78,162914,60544],{},[78,162916,162917],{"class":124,"line":156},[78,162918,51165],{},[78,162920,162921],{"class":124,"line":162},[78,162922,60553],{},[78,162924,162925],{"class":124,"line":168},[78,162926,51145],{},[78,162928,162929],{"class":124,"line":174},[78,162930,60562],{},[78,162932,162933],{"class":124,"line":180},[78,162934,23518],{},[78,162936,162937],{"class":124,"line":186},[78,162938,59755],{},[78,162940,162941],{"class":124,"line":192},[78,162942,51145],{},[78,162944,162945],{"class":124,"line":198},[78,162946,60579],{},[78,162948,162949],{"class":124,"line":204},[78,162950,57042],{},[78,162952,162953],{"class":124,"line":210},[78,162954,60588],{},[78,162956,162957],{"class":124,"line":216},[78,162958,60378],{},[78,162960,162961],{"class":124,"line":222},[78,162962,60597],{},[78,162964,162965],{"class":124,"line":421},[78,162966,60602],{},[78,162968,162969],{"class":124,"line":427},[78,162970,60607],{},[78,162972,162973],{"class":124,"line":433},[78,162974,60612],{},[78,162976,162977],{"class":124,"line":2443},[78,162978,60617],{},[78,162980,162981],{"class":124,"line":2448},[78,162982,59788],{},[78,162984,162985],{"class":124,"line":2454},[78,162986,59793],{},[78,162988,162989],{"class":124,"line":2460},[78,162990,59618],{},[78,162992,162993],{"class":124,"line":2465},[78,162994,59803],{},[78,162996,162997],{"class":124,"line":2470},[78,162998,60638],{},[78,163000,163001],{"class":124,"line":2903},[78,163002,60643],{},[78,163004,163005],{"class":124,"line":2909},[78,163006,9615],{},[78,163008,163009],{"class":124,"line":11477},[78,163010,15810],{},[78,163012,163013],{"class":124,"line":13374},[78,163014,59840],{},[78,163016,163017],{"class":124,"line":13380},[78,163018,23518],{},[10548,163020,60045],{"id":60662},[114,163022,163023],{"className":51126,"code":60665,"language":51128,"meta":119,"style":119},[17,163024,163025,163029,163033,163037,163041,163045,163049,163053,163057,163061,163065,163069,163073,163077,163081,163085,163089,163093,163097,163101,163105,163109,163113,163117,163121,163125,163129,163133,163137,163141,163145,163149,163153,163157],{"__ignoreMap":119},[78,163026,163027],{"class":124,"line":125},[78,163028,60672],{},[78,163030,163031],{"class":124,"line":132},[78,163032,51145],{},[78,163034,163035],{"class":124,"line":138},[78,163036,60075],{},[78,163038,163039],{"class":124,"line":144},[78,163040,60685],{},[78,163042,163043],{"class":124,"line":150},[78,163044,58538],{},[78,163046,163047],{"class":124,"line":156},[78,163048,23518],{},[78,163050,163051],{"class":124,"line":162},[78,163052,60698],{},[78,163054,163055],{"class":124,"line":168},[78,163056,51145],{},[78,163058,163059],{"class":124,"line":174},[78,163060,60441],{},[78,163062,163063],{"class":124,"line":180},[78,163064,60711],{},[78,163066,163067],{"class":124,"line":186},[78,163068,51165],{},[78,163070,163071],{"class":124,"line":192},[78,163072,60720],{},[78,163074,163075],{"class":124,"line":198},[78,163076,51145],{},[78,163078,163079],{"class":124,"line":204},[78,163080,60729],{},[78,163082,163083],{"class":124,"line":210},[78,163084,23518],{},[78,163086,163087],{"class":124,"line":216},[78,163088,60738],{},[78,163090,163091],{"class":124,"line":222},[78,163092,51145],{},[78,163094,163095],{"class":124,"line":421},[78,163096,60747],{},[78,163098,163099],{"class":124,"line":427},[78,163100,57042],{},[78,163102,163103],{"class":124,"line":433},[78,163104,60756],{},[78,163106,163107],{"class":124,"line":2443},[78,163108,60761],{},[78,163110,163111],{"class":124,"line":2448},[78,163112,60766],{},[78,163114,163115],{"class":124,"line":2454},[78,163116,60607],{},[78,163118,163119],{"class":124,"line":2460},[78,163120,60775],{},[78,163122,163123],{"class":124,"line":2465},[78,163124,60122],{},[78,163126,163127],{"class":124,"line":2470},[78,163128,60127],{},[78,163130,163131],{"class":124,"line":2903},[78,163132,59904],{},[78,163134,163135],{"class":124,"line":2909},[78,163136,60792],{},[78,163138,163139],{"class":124,"line":11477},[78,163140,59715],{},[78,163142,163143],{"class":124,"line":13374},[78,163144,60801],{},[78,163146,163147],{"class":124,"line":13380},[78,163148,10054],{},[78,163150,163151],{"class":124,"line":13386},[78,163152,15810],{},[78,163154,163155],{"class":124,"line":13722},[78,163156,59840],{},[78,163158,163159],{"class":124,"line":13727},[78,163160,23518],{},[10548,163162,60821],{"id":60820},[114,163164,163165],{"className":51126,"code":60824,"language":51128,"meta":119,"style":119},[17,163166,163167,163171,163175,163179,163183,163187,163191,163195,163199,163203,163207,163211,163215,163219,163223,163227,163231,163235,163239,163243,163247,163251,163255,163259,163263],{"__ignoreMap":119},[78,163168,163169],{"class":124,"line":125},[78,163170,60831],{},[78,163172,163173],{"class":124,"line":132},[78,163174,51145],{},[78,163176,163177],{"class":124,"line":138},[78,163178,60441],{},[78,163180,163181],{"class":124,"line":144},[78,163182,60844],{},[78,163184,163185],{"class":124,"line":150},[78,163186,51165],{},[78,163188,163189],{"class":124,"line":156},[78,163190,59965],{},[78,163192,163193],{"class":124,"line":162},[78,163194,51145],{},[78,163196,163197],{"class":124,"line":168},[78,163198,60861],{},[78,163200,163201],{"class":124,"line":174},[78,163202,58123],{},[78,163204,163205],{"class":124,"line":180},[78,163206,59686],{},[78,163208,163209],{"class":124,"line":186},[78,163210,60029],{},[78,163212,163213],{"class":124,"line":192},[78,163214,60878],{},[78,163216,163217],{"class":124,"line":198},[78,163218,56967],{},[78,163220,163221],{"class":124,"line":204},[78,163222,60887],{},[78,163224,163225],{"class":124,"line":210},[78,163226,60892],{},[78,163228,163229],{"class":124,"line":216},[78,163230,60127],{},[78,163232,163233],{"class":124,"line":222},[78,163234,59904],{},[78,163236,163237],{"class":124,"line":421},[78,163238,60905],{},[78,163240,163241],{"class":124,"line":427},[78,163242,60910],{},[78,163244,163245],{"class":124,"line":433},[78,163246,59715],{},[78,163248,163249],{"class":124,"line":2443},[78,163250,60919],{},[78,163252,163253],{"class":124,"line":2448},[78,163254,60924],{},[78,163256,163257],{"class":124,"line":2454},[78,163258,10054],{},[78,163260,163261],{"class":124,"line":2460},[78,163262,57375],{},[78,163264,163265],{"class":124,"line":2465},[78,163266,23518],{},[114,163268,163269],{"className":51126,"code":60939,"language":51128,"meta":119,"style":119},[17,163270,163271,163275,163279,163283,163287,163291,163295,163299,163303,163307,163311,163315,163319,163323,163327,163331,163335,163339,163343,163347,163351,163355,163359,163363,163367],{"__ignoreMap":119},[78,163272,163273],{"class":124,"line":125},[78,163274,60831],{},[78,163276,163277],{"class":124,"line":132},[78,163278,51145],{},[78,163280,163281],{"class":124,"line":138},[78,163282,60441],{},[78,163284,163285],{"class":124,"line":144},[78,163286,60844],{},[78,163288,163289],{"class":124,"line":150},[78,163290,51165],{},[78,163292,163293],{"class":124,"line":156},[78,163294,59866],{},[78,163296,163297],{"class":124,"line":162},[78,163298,51145],{},[78,163300,163301],{"class":124,"line":168},[78,163302,60861],{},[78,163304,163305],{"class":124,"line":174},[78,163306,58123],{},[78,163308,163309],{"class":124,"line":180},[78,163310,59879],{},[78,163312,163313],{"class":124,"line":186},[78,163314,60029],{},[78,163316,163317],{"class":124,"line":192},[78,163318,60878],{},[78,163320,163321],{"class":124,"line":198},[78,163322,56967],{},[78,163324,163325],{"class":124,"line":204},[78,163326,60998],{},[78,163328,163329],{"class":124,"line":210},[78,163330,61003],{},[78,163332,163333],{"class":124,"line":216},[78,163334,59894],{},[78,163336,163337],{"class":124,"line":222},[78,163338,60127],{},[78,163340,163341],{"class":124,"line":421},[78,163342,59904],{},[78,163344,163345],{"class":124,"line":427},[78,163346,61020],{},[78,163348,163349],{"class":124,"line":433},[78,163350,59715],{},[78,163352,163353],{"class":124,"line":2443},[78,163354,61029],{},[78,163356,163357],{"class":124,"line":2448},[78,163358,10054],{},[78,163360,163361],{"class":124,"line":2454},[78,163362,15810],{},[78,163364,163365],{"class":124,"line":2460},[78,163366,59951],{},[78,163368,163369],{"class":124,"line":2465},[78,163370,23518],{},[107,163372,61048],{"id":61048},[10548,163374,61051],{"id":61051},[114,163376,163377],{"className":51126,"code":61054,"language":51128,"meta":119,"style":119},[17,163378,163379,163383,163387,163391,163395,163399,163403,163407,163411,163415,163419,163423,163427,163431,163435,163439,163443,163447,163451],{"__ignoreMap":119},[78,163380,163381],{"class":124,"line":125},[78,163382,51135],{},[78,163384,163385],{"class":124,"line":132},[78,163386,57771],{},[78,163388,163389],{"class":124,"line":138},[78,163390,51145],{},[78,163392,163393],{"class":124,"line":144},[78,163394,61073],{},[78,163396,163397],{"class":124,"line":150},[78,163398,61078],{},[78,163400,163401],{"class":124,"line":156},[78,163402,57879],{},[78,163404,163405],{"class":124,"line":162},[78,163406,61087],{},[78,163408,163409],{"class":124,"line":168},[78,163410,57795],{},[78,163412,163413],{"class":124,"line":174},[78,163414,57892],{},[78,163416,163417],{"class":124,"line":180},[78,163418,57805],{},[78,163420,163421],{"class":124,"line":186},[78,163422,23518],{},[78,163424,163425],{"class":124,"line":192},[78,163426,51135],{},[78,163428,163429],{"class":124,"line":198},[78,163430,57818],{},[78,163432,163433],{"class":124,"line":204},[78,163434,51145],{},[78,163436,163437],{"class":124,"line":210},[78,163438,57725],{},[78,163440,163441],{"class":124,"line":216},[78,163442,57831],{},[78,163444,163445],{"class":124,"line":222},[78,163446,61128],{},[78,163448,163449],{"class":124,"line":421},[78,163450,57841],{},[78,163452,163453],{"class":124,"line":427},[78,163454,23518],{},[10548,163456,61139],{"id":61139},[114,163458,163459],{"className":51126,"code":61142,"language":51128,"meta":119,"style":119},[17,163460,163461,163465,163469,163473,163477,163481,163485,163489,163493,163497,163501,163505,163509,163513,163517,163521,163525,163529,163533,163537,163541,163545],{"__ignoreMap":119},[78,163462,163463],{"class":124,"line":125},[78,163464,51135],{},[78,163466,163467],{"class":124,"line":132},[78,163468,57771],{},[78,163470,163471],{"class":124,"line":138},[78,163472,51145],{},[78,163474,163475],{"class":124,"line":144},[78,163476,61161],{},[78,163478,163479],{"class":124,"line":150},[78,163480,61078],{},[78,163482,163483],{"class":124,"line":156},[78,163484,57879],{},[78,163486,163487],{"class":124,"line":162},[78,163488,61087],{},[78,163490,163491],{"class":124,"line":168},[78,163492,57795],{},[78,163494,163495],{"class":124,"line":174},[78,163496,57892],{},[78,163498,163499],{"class":124,"line":180},[78,163500,57805],{},[78,163502,163503],{"class":124,"line":186},[78,163504,23518],{},[78,163506,163507],{"class":124,"line":192},[78,163508,51135],{},[78,163510,163511],{"class":124,"line":198},[78,163512,57909],{},[78,163514,163515],{"class":124,"line":204},[78,163516,51145],{},[78,163518,163519],{"class":124,"line":210},[78,163520,57574],{},[78,163522,163523],{"class":124,"line":216},[78,163524,57922],{},[78,163526,163527],{"class":124,"line":222},[78,163528,57927],{},[78,163530,163531],{"class":124,"line":421},[78,163532,61218],{},[78,163534,163535],{"class":124,"line":427},[78,163536,57937],{},[78,163538,163539],{"class":124,"line":433},[78,163540,57599],{},[78,163542,163543],{"class":124,"line":2443},[78,163544,15810],{},[78,163546,163547],{"class":124,"line":2448},[78,163548,23518],{},[10548,163550,61237],{"id":61237},[114,163552,163553],{"className":51126,"code":61240,"language":51128,"meta":119,"style":119},[17,163554,163555,163559,163563,163567,163571,163575],{"__ignoreMap":119},[78,163556,163557],{"class":124,"line":125},[78,163558,51135],{},[78,163560,163561],{"class":124,"line":132},[78,163562,61251],{},[78,163564,163565],{"class":124,"line":138},[78,163566,51145],{},[78,163568,163569],{"class":124,"line":144},[78,163570,61260],{},[78,163572,163573],{"class":124,"line":150},[78,163574,61265],{},[78,163576,163577],{"class":124,"line":156},[78,163578,23518],{},[10548,163580,61273],{"id":61272},[13,163582,61276],{},[49,163584,163585,163587,163589],{},[52,163586,61281],{},[52,163588,61284],{},[52,163590,61287],{},[13,163592,61290],{},[10548,163594,61294],{"id":61293},[114,163596,163597],{"className":51126,"code":61297,"language":51128,"meta":119,"style":119},[17,163598,163599,163603,163607,163611,163615,163619,163623,163627,163631,163635,163639,163643],{"__ignoreMap":119},[78,163600,163601],{"class":124,"line":125},[78,163602,61304],{},[78,163604,163605],{"class":124,"line":132},[78,163606,51145],{},[78,163608,163609],{"class":124,"line":138},[78,163610,57042],{},[78,163612,163613],{"class":124,"line":144},[78,163614,60378],{},[78,163616,163617],{"class":124,"line":150},[78,163618,61321],{},[78,163620,163621],{"class":124,"line":156},[78,163622,61326],{},[78,163624,163625],{"class":124,"line":162},[78,163626,61331],{},[78,163628,163629],{"class":124,"line":168},[78,163630,61336],{},[78,163632,163633],{"class":124,"line":174},[78,163634,61341],{},[78,163636,163637],{"class":124,"line":180},[78,163638,15810],{},[78,163640,163641],{"class":124,"line":186},[78,163642,58538],{},[78,163644,163645],{"class":124,"line":192},[78,163646,23518],{},[10548,163648,61357],{"id":61356},[114,163650,163651],{"className":51126,"code":61360,"language":51128,"meta":119,"style":119},[17,163652,163653,163657,163661,163665,163669,163673,163677,163681,163685,163689,163693,163697,163701,163705],{"__ignoreMap":119},[78,163654,163655],{"class":124,"line":125},[78,163656,61367],{},[78,163658,163659],{"class":124,"line":132},[78,163660,61372],{},[78,163662,163663],{"class":124,"line":138},[78,163664,51145],{},[78,163666,163667],{"class":124,"line":144},[78,163668,58198],{},[78,163670,163671],{"class":124,"line":150},[78,163672,61385],{},[78,163674,163675],{"class":124,"line":156},[78,163676,61390],{},[78,163678,163679],{"class":124,"line":162},[78,163680,61395],{},[78,163682,163683],{"class":124,"line":168},[78,163684,61400],{},[78,163686,163687],{"class":124,"line":174},[78,163688,57678],{},[78,163690,163691],{"class":124,"line":180},[78,163692,61409],{},[78,163694,163695],{"class":124,"line":186},[78,163696,61414],{},[78,163698,163699],{"class":124,"line":192},[78,163700,15810],{},[78,163702,163703],{"class":124,"line":198},[78,163704,61423],{},[78,163706,163707],{"class":124,"line":204},[78,163708,23518],{},[10548,163710,61431],{"id":61430},[114,163712,163713],{"className":51126,"code":61434,"language":51128,"meta":119,"style":119},[17,163714,163715,163719,163723,163727,163731,163735,163739,163743,163747,163751,163755],{"__ignoreMap":119},[78,163716,163717],{"class":124,"line":125},[78,163718,61441],{},[78,163720,163721],{"class":124,"line":132},[78,163722,51145],{},[78,163724,163725],{"class":124,"line":138},[78,163726,57042],{},[78,163728,163729],{"class":124,"line":144},[78,163730,60378],{},[78,163732,163733],{"class":124,"line":150},[78,163734,61458],{},[78,163736,163737],{"class":124,"line":156},[78,163738,61331],{},[78,163740,163741],{"class":124,"line":162},[78,163742,61467],{},[78,163744,163745],{"class":124,"line":168},[78,163746,61472],{},[78,163748,163749],{"class":124,"line":174},[78,163750,15810],{},[78,163752,163753],{"class":124,"line":180},[78,163754,58538],{},[78,163756,163757],{"class":124,"line":186},[78,163758,23518],{},[10548,163760,61488],{"id":61487},[114,163762,163763],{"className":51126,"code":61491,"language":51128,"meta":119,"style":119},[17,163764,163765,163769,163773,163777,163781,163785,163789,163793,163797,163801,163805,163809],{"__ignoreMap":119},[78,163766,163767],{"class":124,"line":125},[78,163768,61498],{},[78,163770,163771],{"class":124,"line":132},[78,163772,51145],{},[78,163774,163775],{"class":124,"line":138},[78,163776,61507],{},[78,163778,163779],{"class":124,"line":144},[78,163780,61512],{},[78,163782,163783],{"class":124,"line":150},[78,163784,61395],{},[78,163786,163787],{"class":124,"line":156},[78,163788,61521],{},[78,163790,163791],{"class":124,"line":162},[78,163792,57678],{},[78,163794,163795],{"class":124,"line":168},[78,163796,61409],{},[78,163798,163799],{"class":124,"line":174},[78,163800,61341],{},[78,163802,163803],{"class":124,"line":180},[78,163804,15810],{},[78,163806,163807],{"class":124,"line":186},[78,163808,61542],{},[78,163810,163811],{"class":124,"line":192},[78,163812,23518],{},[10548,163814,61550],{"id":61549},[114,163816,163817],{"className":51126,"code":61553,"language":51128,"meta":119,"style":119},[17,163818,163819,163823,163827,163831,163835,163839,163843,163847,163851,163855,163859,163863,163867,163871],{"__ignoreMap":119},[78,163820,163821],{"class":124,"line":125},[78,163822,61560],{},[78,163824,163825],{"class":124,"line":132},[78,163826,51145],{},[78,163828,163829],{"class":124,"line":138},[78,163830,61569],{},[78,163832,163833],{"class":124,"line":144},[78,163834,58081],{},[78,163836,163837],{"class":124,"line":150},[78,163838,61395],{},[78,163840,163841],{"class":124,"line":156},[78,163842,61582],{},[78,163844,163845],{"class":124,"line":162},[78,163846,57678],{},[78,163848,163849],{"class":124,"line":168},[78,163850,61409],{},[78,163852,163853],{"class":124,"line":174},[78,163854,61595],{},[78,163856,163857],{"class":124,"line":180},[78,163858,58081],{},[78,163860,163861],{"class":124,"line":186},[78,163862,61604],{},[78,163864,163865],{"class":124,"line":192},[78,163866,61609],{},[78,163868,163869],{"class":124,"line":198},[78,163870,58538],{},[78,163872,163873],{"class":124,"line":204},[78,163874,23518],{},[107,163876,25480],{"id":25480},[13,163878,61622],{},[13,163880,61625],{},[23289,163882],{},[13,163884,61630],{},[226,163886,228],{},{"title":119,"searchDepth":144,"depth":144,"links":163888},[163889,163890,163896,163897,163898,163899,163900,163901,163902,163903,163904],{"id":51074,"depth":132,"text":51074},{"id":52020,"depth":132,"text":52020,"children":163891},[163892,163893,163894,163895],{"id":52023,"depth":144,"text":52024},{"id":53827,"depth":144,"text":53828},{"id":54433,"depth":144,"text":54434},{"id":55465,"depth":144,"text":55466},{"id":56580,"depth":132,"text":56580},{"id":56833,"depth":132,"text":56833},{"id":57542,"depth":132,"text":57542},{"id":58101,"depth":132,"text":58101},{"id":58892,"depth":132,"text":58892},{"id":59548,"depth":132,"text":59548},{"id":60315,"depth":132,"text":60315},{"id":61048,"depth":132,"text":61048},{"id":25480,"depth":132,"text":25480},{},{"title":246,"description":119},[14541,246],{"id":61659,"title":61660,"assetBase":239,"author":8,"body":163909,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":164813,"navigation":128,"originalPath":62990,"path":62991,"seo":164814,"source":23330,"stem":62993,"tags":164815,"weight":250,"__hash__":62995},{"type":10,"value":163910,"toc":164753},[163911,163913,163923,163925,163927,163929,163931,163933,163937,163939,163943,163945,163947,163951,163953,163955,163957,163959,163961,163963,163967,163969,164005,164007,164033,164035,164037,164045,164047,164049,164053,164055,164057,164059,164061,164063,164065,164067,164069,164071,164073,164075,164077,164081,164083,164085,164089,164091,164093,164095,164097,164099,164101,164105,164107,164109,164111,164121,164125,164127,164129,164131,164133,164135,164147,164149,164153,164155,164159,164161,164163,164165,164167,164169,164171,164175,164177,164179,164187,164189,164191,164199,164201,164203,164207,164209,164211,164213,164215,164217,164219,164223,164225,164237,164239,164241,164253,164255,164259,164265,164267,164277,164279,164287,164289,164291,164295,164297,164299,164303,164305,164327,164329,164331,164333,164347,164349,164351,164355,164357,164359,164361,164363,164367,164369,164371,164373,164375,164387,164389,164391,164393,164395,164397,164399,164401,164403,164405,164407,164409,164411,164413,164415,164417,164419,164421,164425,164427,164429,164431,164433,164435,164437,164439,164445,164447,164449,164451,164461,164463,164465,164467,164469,164479,164481,164491,164493,164495,164497,164499,164501,164503,164507,164509,164519,164521,164525,164527,164531,164535,164537,164539,164541,164543,164545,164547,164549,164551,164555,164557,164559,164561,164565,164569,164583,164585,164587,164593,164597,164599,164601,164607,164609,164615,164617,164619,164621,164623,164627,164629,164631,164633,164635,164639,164641,164645,164647,164651,164653,164655,164659,164661,164663,164665,164667,164669,164671,164673,164675,164677,164679,164681,164683,164685,164687,164689,164693,164695,164697,164699,164701,164703,164705,164709,164715,164717,164719,164721,164723,164725,164727,164729,164731,164733,164735,164737,164739],[4517,163912,61660],{"id":61660},[72,163914,163915,163919,163921],{},[13,163916,163917],{},[22,163918,23957],{},[13,163920,61673],{},[13,163922,61676],{},[107,163924,61680],{"id":61679},[7759,163926,61684],{"id":61683},[10548,163928,61688],{"id":61687},[13,163930,61691],{},[13,163932,61694],{},[13,163934,61697,163935],{},[22,163936,61700],{},[13,163938,61703],{},[72,163940,163941],{},[13,163942,61708],{},[10548,163944,61712],{"id":61711},[13,163946,61715],{},[72,163948,163949],{},[13,163950,61720],{},[13,163952,61723],{},[7759,163954,61727],{"id":61726},[10548,163956,61731],{"id":61730},[13,163958,61734],{},[10548,163960,61738],{"id":61737},[13,163962,61741],{},[13,163964,61744,163965],{},[22,163966,61747],{},[10548,163968,61751],{"id":61750},[2285,163970,163971,163977,163983,163989,163993,163999],{},[52,163972,163973,163975,61761],{},[22,163974,61758],{},[2996,163976],{},[52,163978,163979,163981,61769],{},[22,163980,61766],{},[2996,163982],{},[52,163984,163985,163987,61777],{},[22,163986,61774],{},[2996,163988],{},[52,163990,163991],{},[22,163992,61782],{},[52,163994,163995,163997,61790],{},[22,163996,61787],{},[2996,163998],{},[52,164000,164001,164003,61798],{},[22,164002,61795],{},[2996,164004],{},[10548,164006,61802],{"id":61801},[2285,164008,164009,164015,164021,164027],{},[52,164010,164011,164013,61811],{},[22,164012,29591],{},[2996,164014],{},[52,164016,164017,164019,61819],{},[22,164018,61816],{},[2996,164020],{},[52,164022,164023,164025,61827],{},[22,164024,61824],{},[2996,164026],{},[52,164028,164029,164031,61835],{},[22,164030,61832],{},[2996,164032],{},[7759,164034,61839],{"id":61838},[10548,164036,61843],{"id":61842},[49,164038,164039,164041,164043],{},[52,164040,61848],{},[52,164042,61851],{},[52,164044,61854],{},[10548,164046,61858],{"id":61857},[13,164048,61861],{},[72,164050,164051],{},[13,164052,61866],{},[10548,164054,61870],{"id":61869},[13,164056,61873],{},[13,164058,61876],{},[10548,164060,61880],{"id":61879},[13,164062,61883],{},[13,164064,61886],{},[10548,164066,61890],{"id":61889},[13,164068,61893],{},[23289,164070],{},[107,164072,61899],{"id":61898},[7759,164074,61903],{"id":61902},[10548,164076,61907],{"id":61906},[13,164078,164079],{},[617,164080],{"alt":119,"src":61912},[10548,164082,61916],{"id":61915},[13,164084,61919],{},[72,164086,164087],{},[13,164088,61924],{},[10548,164090,61928],{"id":61927},[13,164092,61931],{},[10548,164094,61935],{"id":61934},[13,164096,61938],{},[10548,164098,61942],{"id":61941},[13,164100,61945],{},[13,164102,164103],{},[617,164104],{"alt":119,"src":61950},[7759,164106,61954],{"id":61953},[13,164108,61957],{},[13,164110,61960],{},[49,164112,164113,164115,164117,164119],{},[52,164114,61965],{},[52,164116,61968],{},[52,164118,61971],{},[52,164120,61974],{},[13,164122,164123],{},[22,164124,61979],{},[13,164126,61982],{},[23289,164128],{},[107,164130,61988],{"id":61987},[7759,164132,61992],{"id":61991},[13,164134,61995],{},[49,164136,164137,164139,164141,164143,164145],{},[52,164138,62000],{},[52,164140,62003],{},[52,164142,62006],{},[52,164144,62009],{},[52,164146,62012],{},[10548,164148,62015],{"id":62015},[13,164150,164151],{},[617,164152],{"alt":119,"src":62020},[7759,164154,62024],{"id":62023},[13,164156,164157],{},[22,164158,62029],{},[10548,164160,62033],{"id":62032},[13,164162,62036],{},[10548,164164,62040],{"id":62039},[13,164166,62043],{},[10548,164168,62047],{"id":62046},[13,164170,62050],{},[72,164172,164173],{},[13,164174,62055],{},[10548,164176,62059],{"id":62058},[13,164178,62062],{},[49,164180,164181,164183,164185],{},[52,164182,62067],{},[52,164184,62070],{},[52,164186,62073],{},[7759,164188,30030],{"id":30029},[10548,164190,62079],{"id":62078},[49,164192,164193,164195,164197],{},[52,164194,62084],{},[52,164196,62087],{},[52,164198,62090],{},[10548,164200,62094],{"id":62093},[13,164202,62097],{},[72,164204,164205],{},[13,164206,62102],{},[7759,164208,62106],{"id":62105},[10548,164210,30037],{"id":30036},[13,164212,62111],{},[13,164214,62114],{},[10548,164216,62118],{"id":62117},[13,164218,62121],{},[72,164220,164221],{},[13,164222,62126],{},[10548,164224,62130],{"id":62129},[49,164226,164227,164229,164231,164233,164235],{},[52,164228,62135],{},[52,164230,62138],{},[52,164232,62141],{},[52,164234,62144],{},[52,164236,62147],{},[7759,164238,47976],{"id":47975},[10548,164240,62153],{"id":62152},[49,164242,164243,164245,164247,164249,164251],{},[52,164244,62158],{},[52,164246,62161],{},[52,164248,62164],{},[52,164250,62167],{},[52,164252,62170],{},[10548,164254,62174],{"id":62173},[13,164256,62177,164257],{},[22,164258,62180],{},[49,164260,164261,164263],{},[52,164262,62185],{},[52,164264,62188],{},[10548,164266,62191],{"id":29622},[49,164268,164269,164271,164273,164275],{},[52,164270,62196],{},[52,164272,62199],{},[52,164274,62202],{},[52,164276,62205],{},[10548,164278,62209],{"id":62208},[49,164280,164281,164283,164285],{},[52,164282,62214],{},[52,164284,62217],{},[52,164286,62220],{},[7759,164288,62224],{"id":62223},[10548,164290,62228],{"id":62227},[13,164292,164293],{},[617,164294],{"alt":119,"src":62233},[7759,164296,62237],{"id":62236},[10548,164298,29843],{"id":29842},[13,164300,62242,164301],{},[22,164302,62245],{},[10548,164304,29867],{"id":29866},[49,164306,164307,164313,164321],{},[52,164308,62252,164309],{},[49,164310,164311],{},[52,164312,62257],{},[52,164314,62260,164315],{},[49,164316,164317,164319],{},[52,164318,62265],{},[52,164320,62268],{},[52,164322,62271,164323],{},[49,164324,164325],{},[52,164326,62276],{},[13,164328,62279],{},[10548,164330,29888],{"id":29887},[13,164332,62284],{},[49,164334,164335],{},[52,164336,62289,164337],{},[49,164338,164339,164341,164343,164345],{},[52,164340,62294],{},[52,164342,62297],{},[52,164344,62300],{},[52,164346,62303],{},[7759,164348,62307],{"id":62306},[13,164350,62310],{},[72,164352,164353],{},[13,164354,62315],{},[7759,164356,62319],{"id":62318},[13,164358,62322],{},[13,164360,62325],{},[13,164362,62328],{},[72,164364,164365],{},[13,164366,62333],{},[7759,164368,62337],{"id":62336},[13,164370,62340],{},[13,164372,62343],{},[10548,164374,62346],{"id":62346},[49,164376,164377,164379,164381,164383,164385],{},[52,164378,62351],{},[52,164380,62354],{},[52,164382,62357],{},[52,164384,62360],{},[52,164386,62363],{},[23289,164388],{},[107,164390,62369],{"id":62368},[13,164392,62372],{},[13,164394,62375],{},[7759,164396,62379],{"id":62378},[13,164398,62382],{},[7759,164400,62385],{"id":32356},[10548,164402,62389],{"id":62388},[13,164404,62392],{},[10548,164406,62396],{"id":62395},[13,164408,62399],{},[10548,164410,62403],{"id":62402},[13,164412,62406],{},[10548,164414,62410],{"id":62409},[13,164416,62413],{},[7759,164418,62417],{"id":62416},[13,164420,62420],{},[13,164422,164423],{},[617,164424],{"alt":119,"src":30157},[7759,164426,62428],{"id":62427},[10548,164428,62432],{"id":62431},[13,164430,62435],{},[10548,164432,62439],{"id":62438},[13,164434,62442],{},[23289,164436],{},[107,164438,62448],{"id":62447},[72,164440,164441,164443],{},[13,164442,62453],{},[13,164444,62456],{},[107,164446,62460],{"id":62459},[7759,164448,62464],{"id":62463},[13,164450,62467],{},[49,164452,164453,164455,164457,164459],{},[52,164454,62472],{},[52,164456,62475],{},[52,164458,62478],{},[52,164460,62481],{},[7759,164462,62485],{"id":62484},[10548,164464,62489],{"id":62488},[13,164466,62492],{},[10548,164468,32357],{"id":62495},[49,164470,164471,164473,164475,164477],{},[52,164472,62500],{},[52,164474,62503],{},[52,164476,62506],{},[52,164478,62509],{},[10548,164480,62513],{"id":62512},[49,164482,164483,164485,164487,164489],{},[52,164484,62518],{},[52,164486,62521],{},[52,164488,62524],{},[52,164490,62527],{},[23289,164492],{},[107,164494,62533],{"id":62532},[7759,164496,62537],{"id":62536},[13,164498,62540],{},[7759,164500,62544],{"id":62543},[13,164502,62547],{},[13,164504,164505],{},[617,164506],{"alt":119,"src":31471},[7759,164508,62555],{"id":62554},[49,164510,164511,164513,164515,164517],{},[52,164512,62560],{},[52,164514,62563],{},[52,164516,62566],{},[52,164518,62569],{},[7759,164520,62573],{"id":62572},[49,164522,164523],{},[52,164524,62578],{},[13,164526,62581],{},[49,164528,164529],{},[52,164530,62586],{},[13,164532,164533],{},[617,164534],{"alt":119,"src":31499},[23289,164536],{},[107,164538,62596],{"id":62595},[13,164540,62599],{},[7759,164542,62603],{"id":62602},[10548,164544,62489],{"id":62606},[13,164546,62609],{},[10548,164548,32409],{"id":32408},[13,164550,62614],{},[13,164552,164553],{},[617,164554],{"alt":119,"src":62619},[7759,164556,62623],{"id":62622},[10548,164558,62627],{"id":62626},[13,164560,62630],{},[49,164562,164563],{},[52,164564,62635],{},[13,164566,164567],{},[617,164568],{"alt":119,"src":62640},[49,164570,164571],{},[52,164572,62645,164573],{},[49,164574,164575,164577,164581],{},[52,164576,62650],{},[52,164578,62653,164579],{},[22,164580,62656],{},[52,164582,62659],{},[10548,164584,62663],{"id":62662},[13,164586,62666],{},[49,164588,164589,164591],{},[52,164590,62671],{},[52,164592,62674],{},[13,164594,164595],{},[617,164596],{"alt":119,"src":62679},[7759,164598,62683],{"id":62682},[10548,164600,62687],{"id":62686},[49,164602,164603,164605],{},[52,164604,62692],{},[52,164606,62695],{},[10548,164608,62699],{"id":62698},[49,164610,164611,164613],{},[52,164612,62704],{},[52,164614,62707],{},[23289,164616],{},[107,164618,62713],{"id":62712},[13,164620,62716],{},[13,164622,62719],{},[13,164624,62722,164625],{},[22,164626,62725],{},[23289,164628],{},[107,164630,62731],{"id":62730},[7759,164632,62735],{"id":62734},[13,164634,62738],{},[13,164636,62741,164637],{},[22,164638,62744],{},[7759,164640,62748],{"id":62747},[72,164642,164643],{},[13,164644,62753],{},[10548,164646,62757],{"id":62756},[13,164648,62760,164649],{},[22,164650,62763],{},[13,164652,62766],{},[10548,164654,62770],{"id":62769},[13,164656,62773,164657],{},[22,164658,62776],{},[13,164660,62779],{},[10548,164662,62783],{"id":62782},[13,164664,62786],{},[7759,164666,62790],{"id":62789},[13,164668,62793],{},[7759,164670,62797],{"id":62796},[10548,164672,62801],{"id":62800},[13,164674,62804],{},[13,164676,62807],{},[10548,164678,62811],{"id":62810},[13,164680,62814],{},[10548,164682,62818],{"id":62817},[13,164684,62821],{},[23289,164686],{},[107,164688,62827],{"id":62826},[13,164690,62830,164691],{},[22,164692,62833],{},[13,164694,62836],{},[7759,164696,62840],{"id":62839},[10548,164698,62489],{"id":62843},[13,164700,62846],{},[13,164702,62849],{},[10548,164704,62853],{"id":62852},[13,164706,62856,164707,29665],{},[22,164708,62859],{},[49,164710,164711,164713],{},[52,164712,62864],{},[52,164714,62867],{},[7759,164716,62871],{"id":62870},[13,164718,62874],{},[13,164720,62877],{},[7759,164722,62881],{"id":62880},[10548,164724,62885],{"id":62884},[13,164726,62888],{},[10548,164728,62892],{"id":62891},[13,164730,62895],{},[10548,164732,62899],{"id":62898},[23289,164734],{},[107,164736,62905],{"id":62904},[7759,164738,62908],{"id":62908},[49,164740,164741,164745,164749],{},[52,164742,62913,164743,62916],{},[2996,164744],{},[52,164746,62919,164747,62922],{},[2996,164748],{},[52,164750,62925,164751,62928],{},[2996,164752],{},{"title":119,"searchDepth":144,"depth":144,"links":164754},[164755,164760,164764,164776,164782,164783,164787,164793,164798,164799,164805,164810],{"id":61679,"depth":132,"text":61680,"children":164756},[164757,164758,164759],{"id":61683,"depth":144,"text":61684},{"id":61726,"depth":144,"text":61727},{"id":61838,"depth":144,"text":61839},{"id":61898,"depth":132,"text":61899,"children":164761},[164762,164763],{"id":61902,"depth":144,"text":61903},{"id":61953,"depth":144,"text":61954},{"id":61987,"depth":132,"text":61988,"children":164765},[164766,164767,164768,164769,164770,164771,164772,164773,164774,164775],{"id":61991,"depth":144,"text":61992},{"id":62023,"depth":144,"text":62024},{"id":30029,"depth":144,"text":30030},{"id":62105,"depth":144,"text":62106},{"id":47975,"depth":144,"text":47976},{"id":62223,"depth":144,"text":62224},{"id":62236,"depth":144,"text":62237},{"id":62306,"depth":144,"text":62307},{"id":62318,"depth":144,"text":62319},{"id":62336,"depth":144,"text":62337},{"id":62368,"depth":132,"text":62369,"children":164777},[164778,164779,164780,164781],{"id":62378,"depth":144,"text":62379},{"id":32356,"depth":144,"text":62385},{"id":62416,"depth":144,"text":62417},{"id":62427,"depth":144,"text":62428},{"id":62447,"depth":132,"text":62448},{"id":62459,"depth":132,"text":62460,"children":164784},[164785,164786],{"id":62463,"depth":144,"text":62464},{"id":62484,"depth":144,"text":62485},{"id":62532,"depth":132,"text":62533,"children":164788},[164789,164790,164791,164792],{"id":62536,"depth":144,"text":62537},{"id":62543,"depth":144,"text":62544},{"id":62554,"depth":144,"text":62555},{"id":62572,"depth":144,"text":62573},{"id":62595,"depth":132,"text":62596,"children":164794},[164795,164796,164797],{"id":62602,"depth":144,"text":62603},{"id":62622,"depth":144,"text":62623},{"id":62682,"depth":144,"text":62683},{"id":62712,"depth":132,"text":62713},{"id":62730,"depth":132,"text":62731,"children":164800},[164801,164802,164803,164804],{"id":62734,"depth":144,"text":62735},{"id":62747,"depth":144,"text":62748},{"id":62789,"depth":144,"text":62790},{"id":62796,"depth":144,"text":62797},{"id":62826,"depth":132,"text":62827,"children":164806},[164807,164808,164809],{"id":62839,"depth":144,"text":62840},{"id":62870,"depth":144,"text":62871},{"id":62880,"depth":144,"text":62881},{"id":62904,"depth":132,"text":62905,"children":164811},[164812],{"id":62908,"depth":144,"text":62908},{},{"title":61660,"description":119},[14968,7744,246,23378,10715,6380],{"id":62997,"title":10715,"assetBase":239,"author":8,"body":164817,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":166605,"navigation":128,"originalPath":65230,"path":65231,"seo":166606,"source":23330,"stem":65233,"tags":166607,"weight":250,"__hash__":65235},{"type":10,"value":164818,"toc":166592},[164819,164821,164823,164825,164827,164829,164831,164833,164835,164837,164839,164843,164845,164849,164851,164855,164857,164861,164863,164865,164867,164871,164873,164877,164879,164883,164885,164889,164891,164893,164895,164897,164899,164901,164903,164905,164907,164913,164915,164917,164919,164925,164927,164929,164931,164933,164935,164943,164945,164949,164951,164959,164961,164965,164967,164969,164971,164973,164975,164977,164979,164981,164985,164987,164991,164993,164997,165001,165003,165007,165009,165011,165013,165015,165017,165019,165021,165023,165025,165029,165305,165307,165311,165477,165479,165483,165485,165489,165493,165497,165499,165503,165858,165860,165862,165864,165876,165878,165880,165882,165884,165886,165888,165890,165892,165894,165896,165898,165900,165902,165904,165906,165908,165910,165912,165914,165916,165918,165920,165922,165924,165926,165928,165930,165932,165934,165938,165940,165944,165946,165948,165950,165960,165962,165964,165966,165986,165988,166000,166002,166022,166024,166040,166042,166044,166046,166048,166056,166058,166060,166076,166078,166080,166096,166098,166114,166116,166122,166124,166126,166128,166130,166132,166134,166136,166138,166140,166152,166154,166156,166158,166160,166162,166164,166168,166174,166178,166180,166184,166186,166190,166196,166200,166202,166204,166206,166208,166212,166214,166218,166220,166224,166226,166230,166232,166234,166236,166238,166242,166244,166246,166248,166254,166256,166258,166260,166262,166264,166266,166270,166272,166276,166278,166282,166284,166288,166290,166294,166296,166300,166302,166304,166306,166308,166310,166312,166314,166316,166318,166320,166322,166324,166326,166328,166330,166332,166334,166336,166338,166340,166342,166344,166346,166348,166350,166352,166354,166356,166358,166360,166362,166364,166366,166368,166370,166372,166374,166376,166378,166380,166382,166384,166386,166388,166390,166392,166394,166396,166412,166414,166416,166418,166420,166422,166424,166426,166428,166430,166432,166434,166436,166438,166440,166442,166444,166446,166448,166450,166452,166458,166460,166462,166464,166466,166468,166470,166472,166474,166476,166478,166480,166482,166484,166488,166490,166494,166496,166498,166500,166504,166506,166508,166512,166514,166516,166520,166522,166524,166526,166528,166530,166532,166534,166536,166538,166540,166542,166544,166548,166550,166552,166554,166556,166560,166562,166564,166566,166568,166570,166572,166574,166576,166578,166580,166582,166584,166586,166588,166590],[4517,164820,10715],{"id":10715},[107,164822,63005],{"id":63004},[10548,164824,63009],{"id":63008},[10548,164826,63013],{"id":63012},[10548,164828,63017],{"id":63016},[10548,164830,63021],{"id":63020},[10548,164832,63025],{"id":63024},[23289,164834],{},[107,164836,63031],{"id":63030},[10548,164838,63035],{"id":63034},[13,164840,164841],{},[22,164842,63040],{},[13,164844,63043],{},[13,164846,164847],{},[22,164848,63048],{},[13,164850,63051],{},[13,164852,164853],{},[22,164854,63056],{},[13,164856,63059],{},[13,164858,164859],{},[22,164860,63064],{},[13,164862,63067],{},[23289,164864],{},[10548,164866,63073],{"id":63072},[13,164868,164869],{},[22,164870,63078],{},[13,164872,63081],{},[13,164874,164875],{},[22,164876,63086],{},[13,164878,63089],{},[13,164880,164881],{},[22,164882,63094],{},[13,164884,63097],{},[13,164886,164887],{},[22,164888,63102],{},[13,164890,63105],{},[13,164892,63108],{},[23289,164894],{},[10548,164896,63114],{"id":63113},[13,164898,63117],{},[13,164900,63120],{},[13,164902,63123],{},[13,164904,63126],{},[13,164906,63129],{},[13,164908,63132,164909,63136,164911,63139],{},[78,164910,63135],{},[78,164912,63135],{},[23289,164914],{},[10548,164916,63145],{"id":63144},[13,164918,63148],{},[13,164920,63151,164921,63154,164923,63158],{},[78,164922,63135],{},[78,164924,63157],{},[13,164926,63161],{},[23289,164928],{},[10548,164930,63167],{"id":63166},[13,164932,63170],{},[13,164934,63173],{},[49,164936,164937,164939,164941],{},[52,164938,63178],{},[52,164940,63181],{},[52,164942,63184],{},[13,164944,63187],{},[13,164946,164947],{},[22,164948,63192],{},[13,164950,32055],{},[49,164952,164953,164955,164957],{},[52,164954,63199],{},[52,164956,63202],{},[52,164958,63205],{},[13,164960,63208],{},[49,164962,164963],{},[52,164964,63213],{},[23289,164966],{},[10548,164968,63219],{"id":63218},[13,164970,63222],{},[13,164972,63225],{},[13,164974,63228],{},[23289,164976],{},[107,164978,63234],{"id":63233},[10548,164980,63238],{"id":63237},[13,164982,28636,164983],{},[22,164984,63243],{},[13,164986,63246],{},[13,164988,28654,164989],{},[22,164990,63251],{},[13,164992,63254],{},[13,164994,63257,164995,67],{},[22,164996,63260],{},[13,164998,63263,164999,67],{},[22,165000,63266],{},[13,165002,63269],{},[13,165004,63272,165005,67],{},[22,165006,63275],{},[23289,165008],{},[10548,165010,63281],{"id":63280},[13,165012,63284],{},[13,165014,63287],{},[13,165016,63290],{},[13,165018,63293],{},[13,165020,63296],{},[23289,165022],{},[10548,165024,63302],{"id":63301},[13,165026,28636,165027,63308],{},[22,165028,63307],{},[78,165030,165032],{"className":165031},[4566],[78,165033,165035,165096],{"className":165034},[4570],[78,165036,165038],{"className":165037},[4574],[4576,165039,165040],{"xmlns":4578,"display":4579},[4581,165041,165042,165094],{},[4584,165043,165044,165050,165052,165054,165056,165058,165060,165062,165064,165066,165068,165070,165072,165074,165076,165078,165080,165086,165092],{},[4600,165045,165046,165048],{},[4596,165047,63328],{},[4596,165049,63331],{},[4591,165051,4594],{"stretchy":4593},[4596,165053,27152],{},[4591,165055,4604],{"stretchy":4593},[4591,165057,4609],{},[4591,165059,55608],{"stretchy":4593},[4596,165061,5012],{},[4596,165063,63346],{"mathvariant":7101},[4596,165065,5012],{},[4591,165067,63351],{},[4596,165069,27152],{},[4591,165071,63356],{},[4596,165073,63331],{},[4591,165075,4594],{"stretchy":4593},[4596,165077,5012],{},[4591,165079,4604],{"stretchy":4593},[4614,165081,165082,165084],{},[4591,165083,4609],{},[4591,165085,63371],{"mathvariant":7101,"lspace":37089,"rspace":37089},[4614,165087,165088,165090],{},[4587,165089,63376],{},[4591,165091,63371],{"mathvariant":7101,"lspace":37089,"rspace":37089},[4591,165093,63381],{"stretchy":4593},[4647,165095,63384],{"encoding":4649},[78,165097,165099,165163,165190,165208,165264],{"className":165098,"ariaHidden":1419},[4654],[78,165100,165102,165105,165145,165148,165151,165154,165157,165160],{"className":165101},[4658],[78,165103],{"className":165104,"style":4663},[4662],[78,165106,165108,165111],{"className":165107},[4667],[78,165109,63328],{"className":165110,"style":5187},[4667,4678],[78,165112,165114],{"className":165113},[4689],[78,165115,165117,165137],{"className":165116},[4693,4694],[78,165118,165120,165134],{"className":165119},[4698],[78,165121,165123],{"className":165122,"style":63412},[4702],[78,165124,165125,165128],{"style":63415},[78,165126],{"className":165127,"style":4711},[4710],[78,165129,165131],{"className":165130},[4715,4716,4717,4718],[78,165132,63331],{"className":165133,"style":5219},[4667,4678,4718],[78,165135,4726],{"className":165136},[4725],[78,165138,165140],{"className":165139},[4698],[78,165141,165143],{"className":165142,"style":4733},[4702],[78,165144],{},[78,165146,4594],{"className":165147},[4674],[78,165149,27152],{"className":165150,"style":38285},[4667,4678],[78,165152,4604],{"className":165153},[4682],[78,165155],{"className":165156,"style":4740},[4739],[78,165158,4609],{"className":165159},[4744],[78,165161],{"className":165162,"style":4740},[4739],[78,165164,165166,165169,165172,165175,165178,165181,165184,165187],{"className":165165},[4658],[78,165167],{"className":165168,"style":4663},[4662],[78,165170,55608],{"className":165171},[4674],[78,165173,5012],{"className":165174},[4667,4678],[78,165176,63346],{"className":165177},[4667],[78,165179,5012],{"className":165180},[4667,4678],[78,165182],{"className":165183,"style":4740},[4739],[78,165185,63351],{"className":165186},[4744],[78,165188],{"className":165189,"style":4740},[4739],[78,165191,165193,165196,165199,165202,165205],{"className":165192},[4658],[78,165194],{"className":165195,"style":18224},[4662],[78,165197,27152],{"className":165198,"style":38285},[4667,4678],[78,165200],{"className":165201,"style":5143},[4739],[78,165203,63356],{"className":165204},[7450],[78,165206],{"className":165207,"style":5143},[4739],[78,165209,165211,165214,165217,165220,165223,165226,165229,165261],{"className":165210},[4658],[78,165212],{"className":165213,"style":63505},[4662],[78,165215,63331],{"className":165216,"style":5219},[4667,4678],[78,165218,4594],{"className":165219},[4674],[78,165221,5012],{"className":165222},[4667,4678],[78,165224,4604],{"className":165225},[4682],[78,165227],{"className":165228,"style":4740},[4739],[78,165230,165232,165235],{"className":165231},[4744],[78,165233,4609],{"className":165234},[4744],[78,165236,165238],{"className":165237},[4689],[78,165239,165241],{"className":165240},[4693],[78,165242,165244],{"className":165243},[4698],[78,165245,165247],{"className":165246,"style":63539},[4702],[78,165248,165249,165252],{"style":5209},[78,165250],{"className":165251,"style":4711},[4710],[78,165253,165255],{"className":165254},[4715,4716,4717,4718],[78,165256,165258],{"className":165257},[4667,4718],[78,165259,63371],{"className":165260},[4667,4718],[78,165262],{"className":165263,"style":4740},[4739],[78,165265,165267,165270,165302],{"className":165266},[4658],[78,165268],{"className":165269,"style":63505},[4662],[78,165271,165273,165276],{"className":165272},[4667],[78,165274,63376],{"className":165275},[4667,6184],[78,165277,165279],{"className":165278},[4689],[78,165280,165282],{"className":165281},[4693],[78,165283,165285],{"className":165284},[4698],[78,165286,165288],{"className":165287,"style":63539},[4702],[78,165289,165290,165293],{"style":5209},[78,165291],{"className":165292,"style":4711},[4710],[78,165294,165296],{"className":165295},[4715,4716,4717,4718],[78,165297,165299],{"className":165298},[4667,4718],[78,165300,63371],{"className":165301},[4667,4718],[78,165303,63381],{"className":165304},[4682],[13,165306,63600],{},[13,165308,28654,165309],{},[22,165310,63605],{},[78,165312,165314],{"className":165313},[4566],[78,165315,165317,165362],{"className":165316},[4570],[78,165318,165320],{"className":165319},[4574],[4576,165321,165322],{"xmlns":4578,"display":4579},[4581,165323,165324,165360],{},[4584,165325,165326,165332,165334,165336,165338,165340,165342,165344,165346,165348,165350,165352,165354,165356,165358],{},[4600,165327,165328,165330],{},[4596,165329,63625],{"mathvariant":7101},[4596,165331,17143],{},[4591,165333,4594],{"stretchy":4593},[4596,165335,27152],{},[4591,165337,4604],{"stretchy":4593},[4591,165339,4609],{},[4591,165341,55608],{"stretchy":4593},[4596,165343,5012],{},[4591,165345,17845],{"stretchy":4593},[4596,165347,17143],{},[4591,165349,17857],{"stretchy":4593},[4596,165351,63346],{"mathvariant":7101},[4596,165353,5012],{},[4591,165355,63351],{},[4596,165357,27152],{},[4591,165359,63381],{"stretchy":4593},[4647,165361,63658],{"encoding":4649},[78,165363,165365,165429,165465],{"className":165364,"ariaHidden":1419},[4654],[78,165366,165368,165371,165411,165414,165417,165420,165423,165426],{"className":165367},[4658],[78,165369],{"className":165370,"style":4663},[4662],[78,165372,165374,165377],{"className":165373},[4667],[78,165375,63625],{"className":165376},[4667],[78,165378,165380],{"className":165379},[4689],[78,165381,165383,165403],{"className":165382},[4693,4694],[78,165384,165386,165400],{"className":165385},[4698],[78,165387,165389],{"className":165388,"style":63412},[4702],[78,165390,165391,165394],{"style":4706},[78,165392],{"className":165393,"style":4711},[4710],[78,165395,165397],{"className":165396},[4715,4716,4717,4718],[78,165398,17143],{"className":165399},[4667,4678,4718],[78,165401,4726],{"className":165402},[4725],[78,165404,165406],{"className":165405},[4698],[78,165407,165409],{"className":165408,"style":4733},[4702],[78,165410],{},[78,165412,4594],{"className":165413},[4674],[78,165415,27152],{"className":165416,"style":38285},[4667,4678],[78,165418,4604],{"className":165419},[4682],[78,165421],{"className":165422,"style":4740},[4739],[78,165424,4609],{"className":165425},[4744],[78,165427],{"className":165428,"style":4740},[4739],[78,165430,165432,165435,165438,165441,165444,165447,165450,165453,165456,165459,165462],{"className":165431},[4658],[78,165433],{"className":165434,"style":4663},[4662],[78,165436,55608],{"className":165437},[4674],[78,165439,5012],{"className":165440},[4667,4678],[78,165442,17845],{"className":165443},[4674],[78,165445,17143],{"className":165446},[4667,4678],[78,165448,17857],{"className":165449},[4682],[78,165451,63346],{"className":165452},[4667],[78,165454,5012],{"className":165455},[4667,4678],[78,165457],{"className":165458,"style":4740},[4739],[78,165460,63351],{"className":165461},[4744],[78,165463],{"className":165464,"style":4740},[4739],[78,165466,165468,165471,165474],{"className":165467},[4658],[78,165469],{"className":165470,"style":4663},[4662],[78,165472,27152],{"className":165473,"style":38285},[4667,4678],[78,165475,63381],{"className":165476},[4682],[13,165478,63776],{},[13,165480,28672,165481,63782],{},[22,165482,63781],{},[13,165484,63785],{},[13,165486,63788,165487,67],{},[22,165488,63791],{},[13,165490,165491,63797],{},[22,165492,63796],{},[13,165494,165495,63803],{},[22,165496,63802],{},[13,165498,63806],{},[13,165500,63809,165501],{},[22,165502,63812],{},[78,165504,165506],{"className":165505},[4566],[78,165507,165509,165578],{"className":165508},[4570],[78,165510,165512],{"className":165511},[4574],[4576,165513,165514],{"xmlns":4578,"display":4579},[4581,165515,165516,165576],{},[4584,165517,165518,165520,165522,165524,165526,165528,165534,165536,165538,165540,165542,165548,165550,165552,165554,165560,165562,165564,165566,165568,165574],{},[4596,165519,27152],{},[4591,165521,63832],{},[4596,165523,43693],{},[4591,165525,4609],{},[4591,165527,55608],{"stretchy":4593},[4600,165529,165530,165532],{},[4596,165531,5012],{},[4596,165533,17132],{},[4591,165535,17845],{"stretchy":4593},[4596,165537,4598],{},[4591,165539,17857],{"stretchy":4593},[4596,165541,63346],{"mathvariant":7101},[4600,165543,165544,165546],{},[4596,165545,5012],{},[4596,165547,17132],{},[4591,165549,63351],{},[4596,165551,27152],{},[4591,165553,63356],{},[4600,165555,165556,165558],{},[4596,165557,63625],{"mathvariant":7101},[4596,165559,63871],{},[4591,165561,4594],{"stretchy":4593},[4596,165563,43693],{},[4591,165565,4604],{"stretchy":4593},[4591,165567,63880],{},[4600,165569,165570,165572],{},[4596,165571,63871],{},[4596,165573,4598],{},[4591,165575,63381],{"stretchy":4593},[4647,165577,63891],{"encoding":4649},[78,165579,165581,165599,165617,165727,165745,165809],{"className":165580,"ariaHidden":1419},[4654],[78,165582,165584,165587,165590,165593,165596],{"className":165583},[4658],[78,165585],{"className":165586,"style":63901},[4662],[78,165588,27152],{"className":165589,"style":38285},[4667,4678],[78,165591],{"className":165592,"style":5143},[4739],[78,165594,63832],{"className":165595},[7450],[78,165597],{"className":165598,"style":5143},[4739],[78,165600,165602,165605,165608,165611,165614],{"className":165601},[4658],[78,165603],{"className":165604,"style":18224},[4662],[78,165606,43693],{"className":165607,"style":7153},[4667,4678],[78,165609],{"className":165610,"style":4740},[4739],[78,165612,4609],{"className":165613},[4744],[78,165615],{"className":165616,"style":4740},[4739],[78,165618,165620,165623,165626,165666,165669,165672,165675,165678,165718,165721,165724],{"className":165619},[4658],[78,165621],{"className":165622,"style":4663},[4662],[78,165624,55608],{"className":165625},[4674],[78,165627,165629,165632],{"className":165628},[4667],[78,165630,5012],{"className":165631},[4667,4678],[78,165633,165635],{"className":165634},[4689],[78,165636,165638,165658],{"className":165637},[4693,4694],[78,165639,165641,165655],{"className":165640},[4698],[78,165642,165644],{"className":165643,"style":5279},[4702],[78,165645,165646,165649],{"style":4706},[78,165647],{"className":165648,"style":4711},[4710],[78,165650,165652],{"className":165651},[4715,4716,4717,4718],[78,165653,17132],{"className":165654,"style":17251},[4667,4678,4718],[78,165656,4726],{"className":165657},[4725],[78,165659,165661],{"className":165660},[4698],[78,165662,165664],{"className":165663,"style":4733},[4702],[78,165665],{},[78,165667,17845],{"className":165668},[4674],[78,165670,4598],{"className":165671},[4667,4678],[78,165673,17857],{"className":165674},[4682],[78,165676,63346],{"className":165677},[4667],[78,165679,165681,165684],{"className":165680},[4667],[78,165682,5012],{"className":165683},[4667,4678],[78,165685,165687],{"className":165686},[4689],[78,165688,165690,165710],{"className":165689},[4693,4694],[78,165691,165693,165707],{"className":165692},[4698],[78,165694,165696],{"className":165695,"style":5279},[4702],[78,165697,165698,165701],{"style":4706},[78,165699],{"className":165700,"style":4711},[4710],[78,165702,165704],{"className":165703},[4715,4716,4717,4718],[78,165705,17132],{"className":165706,"style":17251},[4667,4678,4718],[78,165708,4726],{"className":165709},[4725],[78,165711,165713],{"className":165712},[4698],[78,165714,165716],{"className":165715,"style":4733},[4702],[78,165717],{},[78,165719],{"className":165720,"style":4740},[4739],[78,165722,63351],{"className":165723},[4744],[78,165725],{"className":165726,"style":4740},[4739],[78,165728,165730,165733,165736,165739,165742],{"className":165729},[4658],[78,165731],{"className":165732,"style":18224},[4662],[78,165734,27152],{"className":165735,"style":38285},[4667,4678],[78,165737],{"className":165738,"style":5143},[4739],[78,165740,63356],{"className":165741},[7450],[78,165743],{"className":165744,"style":5143},[4739],[78,165746,165748,165751,165791,165794,165797,165800,165803,165806],{"className":165747},[4658],[78,165749],{"className":165750,"style":4663},[4662],[78,165752,165754,165757],{"className":165753},[4667],[78,165755,63625],{"className":165756},[4667],[78,165758,165760],{"className":165759},[4689],[78,165761,165763,165783],{"className":165762},[4693,4694],[78,165764,165766,165780],{"className":165765},[4698],[78,165767,165769],{"className":165768,"style":63412},[4702],[78,165770,165771,165774],{"style":4706},[78,165772],{"className":165773,"style":4711},[4710],[78,165775,165777],{"className":165776},[4715,4716,4717,4718],[78,165778,63871],{"className":165779,"style":5143},[4667,4678,4718],[78,165781,4726],{"className":165782},[4725],[78,165784,165786],{"className":165785},[4698],[78,165787,165789],{"className":165788,"style":4733},[4702],[78,165790],{},[78,165792,4594],{"className":165793},[4674],[78,165795,43693],{"className":165796,"style":7153},[4667,4678],[78,165798,4604],{"className":165799},[4682],[78,165801],{"className":165802,"style":4740},[4739],[78,165804,63880],{"className":165805},[4744],[78,165807],{"className":165808,"style":4740},[4739],[78,165810,165812,165815,165855],{"className":165811},[4658],[78,165813],{"className":165814,"style":4663},[4662],[78,165816,165818,165821],{"className":165817},[4667],[78,165819,63871],{"className":165820,"style":5143},[4667,4678],[78,165822,165824],{"className":165823},[4689],[78,165825,165827,165847],{"className":165826},[4693,4694],[78,165828,165830,165844],{"className":165829},[4698],[78,165831,165833],{"className":165832,"style":5279},[4702],[78,165834,165835,165838],{"style":64150},[78,165836],{"className":165837,"style":4711},[4710],[78,165839,165841],{"className":165840},[4715,4716,4717,4718],[78,165842,4598],{"className":165843},[4667,4678,4718],[78,165845,4726],{"className":165846},[4725],[78,165848,165850],{"className":165849},[4698],[78,165851,165853],{"className":165852,"style":4733},[4702],[78,165854],{},[78,165856,63381],{"className":165857},[4682],[13,165859,64176],{},[23289,165861],{},[10548,165863,64182],{"id":64181},[49,165865,165866,165868,165870,165872,165874],{},[52,165867,64187],{},[52,165869,64190],{},[52,165871,64193],{},[52,165873,64196],{},[52,165875,64199],{},[23289,165877],{},[107,165879,64205],{"id":64204},[10548,165881,64209],{"id":64208},[13,165883,64212],{},[13,165885,64215],{},[13,165887,64218],{},[13,165889,64221],{},[13,165891,64224],{},[23289,165893],{},[10548,165895,64230],{"id":64229},[13,165897,64233],{},[13,165899,64236],{},[13,165901,64239],{},[13,165903,64242],{},[23289,165905],{},[107,165907,64248],{"id":64247},[13,165909,64251],{},[10548,165911,64255],{"id":64254},[13,165913,64258],{},[13,165915,64261],{},[13,165917,64264],{},[13,165919,64267],{},[13,165921,64270],{},[13,165923,64273],{},[13,165925,64276],{},[13,165927,64279],{},[23289,165929],{},[10548,165931,64285],{"id":64284},[13,165933,64288],{},[13,165935,28636,165936],{},[22,165937,64293],{},[13,165939,64296],{},[13,165941,28654,165942],{},[22,165943,64301],{},[13,165945,64304],{},[23289,165947],{},[10548,165949,64310],{"id":64309},[13,165951,64313,165952,1011,165954,64320,165956,64324,165958,64328],{},[22,165953,64316],{},[22,165955,64319],{},[22,165957,64323],{},[22,165959,64327],{},[23289,165961],{},[10548,165963,64334],{"id":64333},[13,165965,64337],{},[114,165967,165968],{"className":33693,"code":64340,"language":33695,"meta":119,"style":119},[17,165969,165970,165974,165978,165982],{"__ignoreMap":119},[78,165971,165972],{"class":124,"line":125},[78,165973,64347],{},[78,165975,165976],{"class":124,"line":132},[78,165977,64352],{},[78,165979,165980],{"class":124,"line":138},[78,165981,64357],{},[78,165983,165984],{"class":124,"line":144},[78,165985,64362],{},[13,165987,64365],{},[114,165989,165990],{"className":33693,"code":64368,"language":33695,"meta":119,"style":119},[17,165991,165992,165996],{"__ignoreMap":119},[78,165993,165994],{"class":124,"line":125},[78,165995,64375],{},[78,165997,165998],{"class":124,"line":132},[78,165999,64380],{},[13,166001,64383],{},[114,166003,166004],{"className":33693,"code":64386,"language":33695,"meta":119,"style":119},[17,166005,166006,166010,166014,166018],{"__ignoreMap":119},[78,166007,166008],{"class":124,"line":125},[78,166009,64393],{},[78,166011,166012],{"class":124,"line":132},[78,166013,64352],{},[78,166015,166016],{"class":124,"line":138},[78,166017,64402],{},[78,166019,166020],{"class":124,"line":144},[78,166021,64407],{},[13,166023,64365],{},[114,166025,166026],{"className":33693,"code":64412,"language":33695,"meta":119,"style":119},[17,166027,166028,166032,166036],{"__ignoreMap":119},[78,166029,166030],{"class":124,"line":125},[78,166031,64419],{},[78,166033,166034],{"class":124,"line":132},[78,166035,64424],{},[78,166037,166038],{"class":124,"line":138},[78,166039,64429],{},[23289,166041],{},[10548,166043,64435],{"id":64434},[13,166045,64438],{},[13,166047,64441],{},[114,166049,166050],{"className":33693,"code":64444,"language":33695,"meta":119,"style":119},[17,166051,166052],{"__ignoreMap":119},[78,166053,166054],{"class":124,"line":125},[78,166055,64444],{},[13,166057,64453],{},[13,166059,64456],{},[114,166061,166062],{"className":33693,"code":64459,"language":33695,"meta":119,"style":119},[17,166063,166064,166068,166072],{"__ignoreMap":119},[78,166065,166066],{"class":124,"line":125},[78,166067,64347],{},[78,166069,166070],{"class":124,"line":132},[78,166071,64470],{},[78,166073,166074],{"class":124,"line":138},[78,166075,64475],{},[13,166077,64478],{},[13,166079,64481],{},[114,166081,166082],{"className":33693,"code":64484,"language":33695,"meta":119,"style":119},[17,166083,166084,166088,166092],{"__ignoreMap":119},[78,166085,166086],{"class":124,"line":125},[78,166087,64491],{},[78,166089,166090],{"class":124,"line":132},[78,166091,64496],{},[78,166093,166094],{"class":124,"line":138},[78,166095,64501],{},[13,166097,64504],{},[114,166099,166100],{"className":33693,"code":64507,"language":33695,"meta":119,"style":119},[17,166101,166102,166106,166110],{"__ignoreMap":119},[78,166103,166104],{"class":124,"line":125},[78,166105,64393],{},[78,166107,166108],{"class":124,"line":132},[78,166109,64518],{},[78,166111,166112],{"class":124,"line":138},[78,166113,64523],{},[107,166115,64527],{"id":64526},[13,166117,64530,166118,52204,166120,67],{},[22,166119,64533],{},[22,166121,64536],{},[13,166123,64539],{},[10548,166125,64543],{"id":64542},[13,166127,64546],{},[13,166129,64549],{},[13,166131,64552],{},[23289,166133],{},[10548,166135,64558],{"id":64557},[13,166137,64561],{},[13,166139,64564],{},[114,166141,166142],{"className":33693,"code":64567,"language":33695,"meta":119,"style":119},[17,166143,166144,166148],{"__ignoreMap":119},[78,166145,166146],{"class":124,"line":125},[78,166147,64574],{},[78,166149,166150],{"class":124,"line":132},[78,166151,64579],{},[23289,166153],{},[10548,166155,64585],{"id":64584},[13,166157,64588],{},[23289,166159],{},[107,166161,64594],{"id":64593},[10548,166163,64598],{"id":64597},[13,166165,166166],{},[22,166167,64603],{},[13,166169,64606,166170,64610,166172,64614],{},[22,166171,64609],{},[22,166173,64613],{},[13,166175,166176],{},[22,166177,64619],{},[13,166179,64622],{},[13,166181,166182],{},[22,166183,64627],{},[13,166185,64630],{},[13,166187,166188],{},[22,166189,64635],{},[13,166191,64638,166192,64642,166194,67],{},[22,166193,64641],{},[22,166195,64645],{},[13,166197,166198],{},[22,166199,64650],{},[13,166201,64653],{},[23289,166203],{},[10548,166205,64659],{"id":64658},[13,166207,64662],{},[13,166209,166210],{},[22,166211,64667],{},[13,166213,64670],{},[13,166215,166216],{},[22,166217,64675],{},[13,166219,64678],{},[13,166221,166222],{},[22,166223,64683],{},[13,166225,64686],{},[13,166227,166228],{},[22,166229,64691],{},[13,166231,64694],{},[23289,166233],{},[10548,166235,64700],{"id":64699},[13,166237,64703],{},[13,166239,166240,64709],{},[22,166241,64708],{},[13,166243,64712],{},[13,166245,64715],{},[13,166247,64718],{},[13,166249,64721,166250,1011,166252,67],{},[22,166251,64724],{},[22,166253,64727],{},[23289,166255],{},[107,166257,64733],{"id":64732},[10548,166259,64737],{"id":64736},[13,166261,64740],{},[23289,166263],{},[10548,166265,64746],{"id":64745},[13,166267,166268],{},[22,166269,64751],{},[13,166271,64754],{},[13,166273,166274],{},[22,166275,64759],{},[13,166277,64762],{},[13,166279,166280],{},[22,166281,64767],{},[13,166283,64770],{},[13,166285,166286],{},[22,166287,64775],{},[13,166289,64778],{},[13,166291,166292],{},[22,166293,64783],{},[13,166295,64786],{},[13,166297,166298],{},[22,166299,64791],{},[13,166301,64794],{},[23289,166303],{},[10548,166305,64800],{"id":64799},[13,166307,64803],{},[13,166309,64806],{},[13,166311,64809],{},[13,166313,64812],{},[13,166315,64815],{},[13,166317,64818],{},[13,166319,64821],{},[13,166321,64824],{},[13,166323,64827],{},[13,166325,64830],{},[13,166327,64833],{},[13,166329,64836],{},[13,166331,64839],{},[13,166333,64842],{},[23289,166335],{},[10548,166337,64848],{"id":64847},[13,166339,64851],{},[13,166341,64854],{},[13,166343,64857],{},[13,166345,64860],{},[13,166347,64863],{},[13,166349,64866],{},[13,166351,64869],{},[13,166353,64872],{},[13,166355,64875],{},[13,166357,64878],{},[13,166359,64881],{},[23289,166361],{},[10548,166363,64887],{"id":64886},[13,166365,64890],{},[13,166367,64893],{},[13,166369,64896],{},[13,166371,64899],{},[13,166373,64902],{},[13,166375,64905],{},[13,166377,64908],{},[23289,166379],{},[10548,166381,64914],{"id":64913},[13,166383,64917],{},[13,166385,64920],{},[23289,166387],{},[107,166389,64926],{"id":64925},[10548,166391,64930],{"id":64929},[13,166393,64933],{},[13,166395,64936],{},[114,166397,166398],{"className":33693,"code":64939,"language":33695,"meta":119,"style":119},[17,166399,166400,166404,166408],{"__ignoreMap":119},[78,166401,166402],{"class":124,"line":125},[78,166403,64946],{},[78,166405,166406],{"class":124,"line":132},[78,166407,64951],{},[78,166409,166410],{"class":124,"line":138},[78,166411,64956],{},[23289,166413],{},[10548,166415,64962],{"id":64961},[13,166417,64965],{},[13,166419,64968],{},[13,166421,64971],{},[13,166423,64974],{},[13,166425,64977],{},[13,166427,64980],{},[13,166429,64983],{},[13,166431,64986],{},[23289,166433],{},[10548,166435,64992],{"id":64991},[13,166437,64995],{},[13,166439,64998],{},[13,166441,65001],{},[13,166443,65004],{},[23289,166445],{},[107,166447,65010],{"id":65009},[13,166449,65013],{},[13,166451,65016],{},[13,166453,65019,166454,52204,166456,65025],{},[22,166455,65022],{},[22,166457,31793],{},[10548,166459,65029],{"id":65028},[13,166461,65032],{},[13,166463,65035],{},[13,166465,65038],{},[13,166467,65041],{},[13,166469,65044],{},[23289,166471],{},[10548,166473,65050],{"id":65049},[13,166475,65053],{},[13,166477,65056],{},[23289,166479],{},[10548,166481,65062],{"id":65061},[13,166483,65065],{},[13,166485,166486],{},[22,166487,65070],{},[13,166489,65073],{},[13,166491,166492],{},[22,166493,65078],{},[13,166495,65081],{},[23289,166497],{},[10548,166499,65087],{"id":65086},[13,166501,166502],{},[22,166503,65092],{},[13,166505,65095],{},[13,166507,65098],{},[13,166509,166510],{},[22,166511,65103],{},[13,166513,65106],{},[13,166515,65109],{},[13,166517,166518],{},[22,166519,65114],{},[13,166521,65117],{},[13,166523,65120],{},[13,166525,65123],{},[23289,166527],{},[10548,166529,65129],{"id":65128},[13,166531,65132],{},[13,166533,65135],{},[13,166535,65138],{},[13,166537,65141],{},[13,166539,65144],{},[23289,166541],{},[10548,166543,65150],{"id":65149},[13,166545,166546],{},[22,166547,65155],{},[13,166549,65158],{},[13,166551,63208],{},[13,166553,65163],{},[13,166555,65166],{},[13,166557,166558],{},[22,166559,65171],{},[13,166561,65174],{},[13,166563,63208],{},[13,166565,65179],{},[13,166567,65182],{},[23289,166569],{},[10548,166571,65188],{"id":65187},[13,166573,65191],{},[13,166575,65194],{},[13,166577,65197],{},[13,166579,65200],{},[13,166581,65203],{},[23289,166583],{},[107,166585,25480],{"id":25480},[13,166587,65210],{},[13,166589,65213],{},[226,166591,228],{},{"title":119,"searchDepth":144,"depth":144,"links":166593},[166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604],{"id":63004,"depth":132,"text":63005},{"id":63030,"depth":132,"text":63031},{"id":63233,"depth":132,"text":63234},{"id":64204,"depth":132,"text":64205},{"id":64247,"depth":132,"text":64248},{"id":64526,"depth":132,"text":64527},{"id":64593,"depth":132,"text":64594},{"id":64732,"depth":132,"text":64733},{"id":64925,"depth":132,"text":64926},{"id":65009,"depth":132,"text":65010},{"id":25480,"depth":132,"text":25480},{},{"title":10715,"description":119},[14968,246,10715],{"id":65237,"title":65238,"assetBase":239,"author":8,"body":166609,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":167600,"navigation":128,"originalPath":66627,"path":66628,"seo":167601,"source":23330,"stem":66630,"tags":167602,"weight":250,"__hash__":66632},{"type":10,"value":166610,"toc":167567},[166611,166613,166621,166623,166625,166663,166665,166667,166689,166693,166707,166711,166887,166889,166891,166917,166919,166921,166961,166963,166965,166997,167001,167003,167033,167035,167037,167051,167053,167063,167065,167067,167069,167071,167073,167075,167077,167081,167083,167085,167087,167089,167091,167093,167095,167097,167099,167109,167111,167113,167115,167123,167125,167127,167129,167131,167133,167157,167161,167163,167165,167169,167173,167177,167179,167189,167191,167195,167197,167199,167201,167203,167205,167207,167215,167217,167219,167221,167223,167225,167227,167229,167231,167233,167235,167237,167239,167241,167243,167245,167247,167251,167253,167259,167261,167269,167271,167279,167281,167287,167289,167291,167305,167307,167325,167327,167329,167331,167333,167337,167339,167351,167353,167355,167357,167359,167361,167363,167365,167367,167369,167371,167373,167375,167377,167379,167389,167391,167401,167403,167413,167415,167451,167453,167455,167457,167459,167463,167465,167481,167483,167485,167487,167491,167493,167495,167505,167507,167513,167515,167517,167519,167521,167535,167537,167555,167557,167559,167561,167563,167565],[4517,166612,65244],{"id":65243},[72,166614,166615,166619],{},[13,166616,166617],{},[22,166618,23957],{},[13,166620,65253],{},[107,166622,65257],{"id":65256},[107,166624,65261],{"id":65260},[49,166626,166627,166629,166631,166633,166637,166639,166641,166649,166651,166653],{},[52,166628,65266],{},[52,166630,65269],{},[52,166632,65272],{},[52,166634,65275,166635,65278],{},[2996,166636],{},[52,166638,65281],{},[52,166640,65284],{},[52,166642,65287,166643],{},[49,166644,166645,166647],{},[52,166646,65292],{},[52,166648,65295],{},[52,166650,65298],{},[52,166652,65301],{},[52,166654,65304,166655],{},[49,166656,166657,166659,166661],{},[52,166658,65309],{},[52,166660,65312],{},[52,166662,65315],{},[23289,166664],{},[107,166666,65321],{"id":65320},[49,166668,166669,166671,166673,166681],{},[52,166670,65326],{},[52,166672,65329],{},[52,166674,65332,166675],{},[49,166676,166677,166679],{},[52,166678,65337],{},[52,166680,65340],{},[52,166682,65343,166683],{},[49,166684,166685,166687],{},[52,166686,65348],{},[52,166688,65351],{},[13,166690,166691],{},[617,166692],{"alt":119,"src":30426},[49,166694,166695],{},[52,166696,65360,166697],{},[49,166698,166699,166701],{},[52,166700,65365],{},[52,166702,65368,166703],{},[49,166704,166705],{},[52,166706,65373],{},[13,166708,166709],{},[617,166710],{"alt":119,"src":30562},[49,166712,166713,166811,166813,166815],{},[52,166714,65382,166715],{},[49,166716,166717,166755,166785],{},[52,166718,65387,166719],{},[49,166720,166721,166723,166725,166729,166743,166753],{},[52,166722,65392],{},[52,166724,65395],{},[52,166726,166727],{},[617,166728],{"alt":119,"src":65400},[52,166730,65403,166731],{},[49,166732,166733,166735,166737,166739,166741],{},[52,166734,65408],{},[52,166736,65411],{},[52,166738,65414],{},[52,166740,65417],{},[52,166742,65420],{},[52,166744,65423,166745],{},[49,166746,166747,166749,166751],{},[52,166748,65428],{},[52,166750,65431],{},[52,166752,65434],{},[52,166754,65437],{},[52,166756,65440,166757],{},[49,166758,166759,166761,166763,166771,166773],{},[52,166760,65445],{},[52,166762,65448],{},[52,166764,65451,166765],{},[49,166766,166767,166769],{},[52,166768,65456],{},[52,166770,65459],{},[52,166772,65462],{},[52,166774,65465,166775],{},[49,166776,166777,166779,166781,166783],{},[52,166778,65470],{},[52,166780,65473],{},[52,166782,65476],{},[52,166784,65479],{},[52,166786,65482,166787],{},[49,166788,166789,166791,166793],{},[52,166790,65487],{},[52,166792,65490],{},[52,166794,65493,166795],{},[49,166796,166797,166799,166801,166803,166805,166807,166809],{},[52,166798,65498],{},[52,166800,65501],{},[52,166802,65504],{},[52,166804,65507],{},[52,166806,65510],{},[52,166808,65513],{},[52,166810,65516],{},[52,166812,65519],{},[52,166814,65522],{},[52,166816,65525,166817],{},[49,166818,166819,166849,166867],{},[52,166820,65530,166821],{},[49,166822,166823,166837],{},[52,166824,65535,166825],{},[49,166826,166827,166829,166831,166833,166835],{},[52,166828,65540],{},[52,166830,65543],{},[52,166832,65546],{},[52,166834,65549],{},[52,166836,65552],{},[52,166838,65555,166839],{},[49,166840,166841,166843,166845,166847],{},[52,166842,65560],{},[52,166844,65563],{},[52,166846,65566],{},[52,166848,65569],{},[52,166850,65572,166851],{},[49,166852,166853],{},[52,166854,65577,166855],{},[49,166856,166857,166859,166861,166863,166865],{},[52,166858,65582],{},[52,166860,65585],{},[52,166862,65588],{},[52,166864,65591],{},[52,166866,65594],{},[52,166868,65597,166869],{},[49,166870,166871,166873,166875,166877],{},[52,166872,65602],{},[52,166874,65605],{},[52,166876,65608],{},[52,166878,65611,166879],{},[49,166880,166881,166883,166885],{},[52,166882,65616],{},[52,166884,65619],{},[52,166886,65622],{},[23289,166888],{},[107,166890,65628],{"id":65627},[49,166892,166893,166905,166915],{},[52,166894,65633,166895],{},[49,166896,166897,166899,166901,166903],{},[52,166898,65638],{},[52,166900,65641],{},[52,166902,65644],{},[52,166904,65647],{},[52,166906,65650,166907],{},[49,166908,166909,166911,166913],{},[52,166910,65655],{},[52,166912,65658],{},[52,166914,65661],{},[52,166916,65664],{},[7759,166918,65668],{"id":65667},[13,166920,65671],{},[49,166922,166923,166949],{},[52,166924,65676,166925],{},[49,166926,166927,166935,166945,166947],{},[52,166928,65681,166929],{},[49,166930,166931,166933],{},[52,166932,65686],{},[52,166934,65689],{},[52,166936,65692,166937],{},[49,166938,166939,166941],{},[52,166940,65697],{},[52,166942,166943],{},[617,166944],{"alt":119,"src":29839},[52,166946,65704],{},[52,166948,65707],{},[52,166950,65710,166951],{},[49,166952,166953,166955,166957,166959],{},[52,166954,65715],{},[52,166956,65718],{},[52,166958,65721],{},[52,166960,65724],{},[7759,166962,65727],{"id":65727},[13,166964,65730],{},[49,166966,166967,166985],{},[52,166968,65735,166969],{},[49,166970,166971,166973,166975],{},[52,166972,65740],{},[52,166974,65743],{},[52,166976,65746,166977],{},[49,166978,166979,166981,166983],{},[52,166980,65751],{},[52,166982,65754],{},[52,166984,65757],{},[52,166986,65760,166987],{},[49,166988,166989,166991,166993,166995],{},[52,166990,65765],{},[52,166992,65768],{},[52,166994,65771],{},[52,166996,65774],{},[13,166998,65777,166999,67],{},[22,167000,65780],{},[7759,167002,65783],{"id":65783},[49,167004,167005,167011,167015,167021,167023,167029],{},[52,167006,65788,167007,65791,167009,65794],{},[2996,167008],{},[2996,167010],{},[52,167012,65797,167013,65800],{},[2996,167014],{},[52,167016,65803,167017,65806,167019,65809],{},[2996,167018],{},[2996,167020],{},[52,167022,65812],{},[52,167024,65815,167025,167027,65821],{},[2996,167026],{},[22,167028,65820],{},[52,167030,65824,167031,65827],{},[2996,167032],{},[7759,167034,65830],{"id":65830},[13,167036,65833],{},[49,167038,167039,167043,167047],{},[52,167040,65838,167041,65841],{},[2996,167042],{},[52,167044,65844,167045,65847],{},[2996,167046],{},[52,167048,65850,167049,65853],{},[2996,167050],{},[10548,167052,65856],{"id":65856},[49,167054,167055,167057,167059,167061],{},[52,167056,65861],{},[52,167058,65864],{},[52,167060,65867],{},[52,167062,65870],{},[23289,167064],{},[107,167066,65876],{"id":65875},[13,167068,65879],{},[13,167070,65882],{},[13,167072,65885],{},[13,167074,65888],{},[13,167076,65891],{},[13,167078,167079],{},[617,167080],{"alt":119,"src":30157},[13,167082,65898],{},[13,167084,65901],{},[13,167086,65904],{},[13,167088,65907],{},[13,167090,65910],{},[13,167092,65913],{},[13,167094,65916],{},[13,167096,65919],{},[13,167098,65922],{},[49,167100,167101,167103,167105,167107],{},[52,167102,65927],{},[52,167104,65930],{},[52,167106,65933],{},[52,167108,65936],{},[10548,167110,65940],{"id":65939},[7759,167112,65943],{"id":65943},[13,167114,65946],{},[49,167116,167117,167119,167121],{},[52,167118,65951],{},[52,167120,65954],{},[52,167122,65957],{},[10548,167124,65960],{"id":65960},[13,167126,65963],{},[13,167128,65966],{},[13,167130,65969],{},[7759,167132,65972],{"id":65972},[2285,167134,167135,167137,167139,167141,167143,167145,167147,167149,167151,167153,167155],{},[52,167136,65977],{},[52,167138,65980],{},[52,167140,65983],{},[52,167142,65986],{},[52,167144,65989],{},[52,167146,65992],{},[52,167148,65995],{},[52,167150,65998],{},[52,167152,66001],{},[52,167154,66004],{},[52,167156,66007],{},[13,167158,167159],{},[22,167160,66012],{},[7759,167162,66015],{"id":66015},[13,167164,66018],{},[13,167166,66021,167167,66025],{},[22,167168,66024],{},[13,167170,167171],{},[617,167172],{"alt":119,"src":30871},[13,167174,167175],{},[617,167176],{"alt":119,"src":30924},[13,167178,66036],{},[49,167180,167181,167183,167185,167187],{},[52,167182,66041],{},[52,167184,66044],{},[52,167186,66047],{},[52,167188,66050],{},[10548,167190,66054],{"id":66053},[13,167192,167193],{},[617,167194],{"alt":119,"src":66059},[23289,167196],{},[107,167198,66065],{"id":66064},[13,167200,66068],{},[13,167202,66071],{},[7759,167204,66074],{"id":66074},[10548,167206,66077],{"id":66077},[49,167208,167209,167211,167213],{},[52,167210,66082],{},[52,167212,66085],{},[52,167214,66088],{},[13,167216,66091],{},[13,167218,66094],{},[7759,167220,66097],{"id":66097},[13,167222,66100],{},[13,167224,66103],{},[10548,167226,66106],{"id":66106},[13,167228,66109],{},[13,167230,66112],{},[10548,167232,66115],{"id":66115},[13,167234,66118],{},[10548,167236,66121],{"id":66121},[13,167238,66124],{},[13,167240,66127],{},[10548,167242,66130],{"id":66130},[13,167244,66133],{},[7759,167246,66136],{"id":66136},[13,167248,167249],{},[617,167250],{"alt":119,"src":66141},[10548,167252,66144],{"id":66144},[49,167254,167255,167257],{},[52,167256,66149],{},[52,167258,66152],{},[10548,167260,66155],{"id":66155},[49,167262,167263,167265,167267],{},[52,167264,66160],{},[52,167266,66163],{},[52,167268,66166],{},[10548,167270,66169],{"id":66169},[49,167272,167273,167275,167277],{},[52,167274,66174],{},[52,167276,66177],{},[52,167278,66180],{},[10548,167280,66183],{"id":66183},[49,167282,167283,167285],{},[52,167284,66188],{},[52,167286,66191],{},[10548,167288,66194],{"id":66194},[13,167290,66197],{},[49,167292,167293,167295,167297,167299,167301,167303],{},[52,167294,66202],{},[52,167296,66205],{},[52,167298,66208],{},[52,167300,66211],{},[52,167302,66214],{},[52,167304,66217],{},[7759,167306,66220],{"id":66220},[49,167308,167309,167311,167313],{},[52,167310,66225],{},[52,167312,66163],{},[52,167314,66230,167315],{},[49,167316,167317,167319,167321,167323],{},[52,167318,66235],{},[52,167320,66238],{},[52,167322,66241],{},[52,167324,66244],{},[23289,167326],{},[107,167328,66250],{"id":66249},[7759,167330,66253],{"id":66253},[13,167332,66256],{},[13,167334,167335],{},[617,167336],{"alt":119,"src":31273},[7759,167338,66263],{"id":66263},[49,167340,167341,167343,167345,167347,167349],{},[52,167342,66268],{},[52,167344,66271],{},[52,167346,66274],{},[52,167348,66277],{},[52,167350,66280],{},[7759,167352,66284],{"id":66283},[13,167354,66287],{},[13,167356,66290],{},[13,167358,66293],{},[10548,167360,66297],{"id":66296},[13,167362,66300],{},[10548,167364,66304],{"id":66303},[13,167366,66307],{},[10548,167368,66311],{"id":66310},[13,167370,66314],{},[10548,167372,66318],{"id":66317},[10548,167374,66322],{"id":66321},[13,167376,66325],{},[10548,167378,66328],{"id":66328},[49,167380,167381,167383,167385,167387],{},[52,167382,66333],{},[52,167384,66336],{},[52,167386,66339],{},[52,167388,66342],{},[10548,167390,66345],{"id":66345},[49,167392,167393,167395,167397,167399],{},[52,167394,66350],{},[52,167396,66353],{},[52,167398,66356],{},[52,167400,66359],{},[10548,167402,66362],{"id":66362},[49,167404,167405,167407,167409,167411],{},[52,167406,66367],{},[52,167408,66370],{},[52,167410,66373],{},[52,167412,66376],{},[10548,167414,66379],{"id":66379},[49,167416,167417,167425,167431,167437],{},[52,167418,66384,167419],{},[49,167420,167421,167423],{},[52,167422,66389],{},[52,167424,66392],{},[52,167426,66395,167427],{},[49,167428,167429],{},[52,167430,66400],{},[52,167432,66403,167433],{},[49,167434,167435],{},[52,167436,66408],{},[52,167438,66411,167439],{},[49,167440,167441],{},[52,167442,66416,167443],{},[49,167444,167445,167447,167449],{},[52,167446,66421],{},[52,167448,66424],{},[52,167450,66427],{},[23289,167452],{},[107,167454,66433],{"id":66432},[13,167456,66436],{},[13,167458,66439],{},[13,167460,66442,167461,66446],{},[22,167462,66445],{},[10548,167464,66449],{"id":66449},[49,167466,167467,167469,167471,167473,167475,167477,167479],{},[52,167468,66454],{},[52,167470,66457],{},[52,167472,66460],{},[52,167474,66463],{},[52,167476,66466],{},[52,167478,66469],{},[52,167480,66472],{},[23289,167482],{},[107,167484,66478],{"id":66477},[13,167486,66481],{},[13,167488,167489],{},[22,167490,66486],{},[13,167492,66489],{},[10548,167494,66493],{"id":66492},[49,167496,167497,167499,167501,167503],{},[52,167498,66498],{},[52,167500,66501],{},[52,167502,66504],{},[52,167504,66507],{},[10548,167506,66510],{"id":66510},[49,167508,167509,167511],{},[52,167510,66515],{},[52,167512,66518],{},[13,167514,66521],{},[23289,167516],{},[107,167518,66527],{"id":66526},[13,167520,66530],{},[49,167522,167523,167525,167527,167529,167531,167533],{},[52,167524,66535],{},[52,167526,66538],{},[52,167528,66541],{},[52,167530,66544],{},[52,167532,66547],{},[52,167534,66550],{},[7759,167536,66553],{"id":66553},[49,167538,167539,167547,167549,167551,167553],{},[52,167540,66558,167541],{},[49,167542,167543],{},[52,167544,167545],{},[617,167546],{"alt":119,"src":31760},[52,167548,66567],{},[52,167550,66570],{},[52,167552,66573],{},[52,167554,66576],{},[23289,167556],{},[107,167558,50929],{"id":50929},[13,167560,66583],{},[13,167562,66586],{},[13,167564,66589],{},[13,167566,66592],{},{"title":119,"searchDepth":144,"depth":144,"links":167568},[167569,167570,167571,167572,167578,167583,167589,167594,167595,167596,167599],{"id":65256,"depth":132,"text":65257},{"id":65260,"depth":132,"text":65261},{"id":65320,"depth":132,"text":65321},{"id":65627,"depth":132,"text":65628,"children":167573},[167574,167575,167576,167577],{"id":65667,"depth":144,"text":65668},{"id":65727,"depth":144,"text":65727},{"id":65783,"depth":144,"text":65783},{"id":65830,"depth":144,"text":65830},{"id":65875,"depth":132,"text":65876,"children":167579},[167580,167581,167582],{"id":65943,"depth":144,"text":65943},{"id":65972,"depth":144,"text":65972},{"id":66015,"depth":144,"text":66015},{"id":66064,"depth":132,"text":66065,"children":167584},[167585,167586,167587,167588],{"id":66074,"depth":144,"text":66074},{"id":66097,"depth":144,"text":66097},{"id":66136,"depth":144,"text":66136},{"id":66220,"depth":144,"text":66220},{"id":66249,"depth":132,"text":66250,"children":167590},[167591,167592,167593],{"id":66253,"depth":144,"text":66253},{"id":66263,"depth":144,"text":66263},{"id":66283,"depth":144,"text":66284},{"id":66432,"depth":132,"text":66433},{"id":66477,"depth":132,"text":66478},{"id":66526,"depth":132,"text":66527,"children":167597},[167598],{"id":66553,"depth":144,"text":66553},{"id":50929,"depth":132,"text":50929},{},{"title":65238,"description":119},[6380,14542,23333],{"id":66634,"title":66635,"assetBase":239,"author":8,"body":167604,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":168718,"navigation":128,"originalPath":68069,"path":68070,"seo":168719,"source":23330,"stem":68072,"tags":168720,"weight":250,"__hash__":68074},{"type":10,"value":167605,"toc":168714},[167606,167608,167614,167616,167618,167626,167628,167636,167638,167646,167648,167700,167702,167710,167712,167720,167722,167730,167732,167740,167742,167750,167752,167760,167762,167770,167772,167780,167782,167790,167792,167800,167802,167822,167824,167836,167838,167850,167852,167860,167862,167870,167872,167880,167882,167890,167892,167904,167906,167914,167916,167924,167926,167938,167940,168036,168038,168050,168052,168064,168066,168078,168080,168096,168098,168100,168132,168134,168150,168152,168192,168194,168230,168232,168248,168250,168278,168280,168300,168302,168326,168328,168364,168366,168398,168400,168412,168414,168470,168472,168508,168510,168554,168556,168712],[4517,167607,66635],{"id":66640},[72,167609,167610,167612],{},[13,167611,66645],{},[13,167613,66648],{},[107,167615,66651],{"id":66651},[10548,167617,66655],{"id":66654},[114,167619,167620],{"className":33693,"code":66658,"language":33695,"meta":119,"style":119},[17,167621,167622],{"__ignoreMap":119},[78,167623,167624],{"class":124,"line":125},[78,167625,66658],{},[10548,167627,66668],{"id":66667},[114,167629,167630],{"className":33693,"code":66671,"language":33695,"meta":119,"style":119},[17,167631,167632],{"__ignoreMap":119},[78,167633,167634],{"class":124,"line":125},[78,167635,66671],{},[10548,167637,66681],{"id":66680},[114,167639,167640],{"className":33693,"code":66684,"language":33695,"meta":119,"style":119},[17,167641,167642],{"__ignoreMap":119},[78,167643,167644],{"class":124,"line":125},[78,167645,66684],{},[10548,167647,66694],{"id":66693},[114,167649,167650],{"className":33693,"code":66697,"language":33695,"meta":119,"style":119},[17,167651,167652,167656,167660,167664,167668,167672,167676,167680,167684,167688,167692,167696],{"__ignoreMap":119},[78,167653,167654],{"class":124,"line":125},[78,167655,66704],{},[78,167657,167658],{"class":124,"line":132},[78,167659,66709],{},[78,167661,167662],{"class":124,"line":138},[78,167663,66714],{},[78,167665,167666],{"class":124,"line":144},[78,167667,66719],{},[78,167669,167670],{"class":124,"line":150},[78,167671,66724],{},[78,167673,167674],{"class":124,"line":156},[78,167675,66729],{},[78,167677,167678],{"class":124,"line":162},[78,167679,66734],{},[78,167681,167682],{"class":124,"line":168},[78,167683,66739],{},[78,167685,167686],{"class":124,"line":174},[78,167687,66744],{},[78,167689,167690],{"class":124,"line":180},[78,167691,66749],{},[78,167693,167694],{"class":124,"line":186},[78,167695,66754],{},[78,167697,167698],{"class":124,"line":192},[78,167699,66759],{},[10548,167701,66763],{"id":66762},[114,167703,167704],{"className":33693,"code":66766,"language":33695,"meta":119,"style":119},[17,167705,167706],{"__ignoreMap":119},[78,167707,167708],{"class":124,"line":125},[78,167709,66766],{},[10548,167711,66776],{"id":66775},[114,167713,167714],{"className":33693,"code":66779,"language":33695,"meta":119,"style":119},[17,167715,167716],{"__ignoreMap":119},[78,167717,167718],{"class":124,"line":125},[78,167719,66779],{},[10548,167721,66789],{"id":66788},[114,167723,167724],{"className":33693,"code":66792,"language":33695,"meta":119,"style":119},[17,167725,167726],{"__ignoreMap":119},[78,167727,167728],{"class":124,"line":125},[78,167729,66792],{},[10548,167731,66802],{"id":66801},[114,167733,167734],{"className":33693,"code":66805,"language":33695,"meta":119,"style":119},[17,167735,167736],{"__ignoreMap":119},[78,167737,167738],{"class":124,"line":125},[78,167739,66805],{},[10548,167741,66815],{"id":66814},[114,167743,167744],{"className":33693,"code":66818,"language":33695,"meta":119,"style":119},[17,167745,167746],{"__ignoreMap":119},[78,167747,167748],{"class":124,"line":125},[78,167749,66818],{},[10548,167751,66828],{"id":66827},[114,167753,167754],{"className":33693,"code":66831,"language":33695,"meta":119,"style":119},[17,167755,167756],{"__ignoreMap":119},[78,167757,167758],{"class":124,"line":125},[78,167759,66831],{},[10548,167761,66841],{"id":66840},[114,167763,167764],{"className":33693,"code":66844,"language":33695,"meta":119,"style":119},[17,167765,167766],{"__ignoreMap":119},[78,167767,167768],{"class":124,"line":125},[78,167769,66844],{},[10548,167771,66854],{"id":66853},[114,167773,167774],{"className":33693,"code":66857,"language":33695,"meta":119,"style":119},[17,167775,167776],{"__ignoreMap":119},[78,167777,167778],{"class":124,"line":125},[78,167779,66857],{},[10548,167781,66867],{"id":66866},[114,167783,167784],{"className":33693,"code":66870,"language":33695,"meta":119,"style":119},[17,167785,167786],{"__ignoreMap":119},[78,167787,167788],{"class":124,"line":125},[78,167789,66870],{},[10548,167791,66880],{"id":66879},[114,167793,167794],{"className":33693,"code":66883,"language":33695,"meta":119,"style":119},[17,167795,167796],{"__ignoreMap":119},[78,167797,167798],{"class":124,"line":125},[78,167799,66883],{},[10548,167801,66893],{"id":66892},[114,167803,167804],{"className":33693,"code":66896,"language":33695,"meta":119,"style":119},[17,167805,167806,167810,167814,167818],{"__ignoreMap":119},[78,167807,167808],{"class":124,"line":125},[78,167809,66903],{},[78,167811,167812],{"class":124,"line":132},[78,167813,66908],{},[78,167815,167816],{"class":124,"line":138},[78,167817,66913],{},[78,167819,167820],{"class":124,"line":144},[78,167821,66918],{},[10548,167823,66922],{"id":66921},[114,167825,167826],{"className":33693,"code":66925,"language":33695,"meta":119,"style":119},[17,167827,167828,167832],{"__ignoreMap":119},[78,167829,167830],{"class":124,"line":125},[78,167831,66932],{},[78,167833,167834],{"class":124,"line":132},[78,167835,66937],{},[10548,167837,66941],{"id":66940},[114,167839,167840],{"className":33693,"code":66944,"language":33695,"meta":119,"style":119},[17,167841,167842,167846],{"__ignoreMap":119},[78,167843,167844],{"class":124,"line":125},[78,167845,66932],{},[78,167847,167848],{"class":124,"line":132},[78,167849,66955],{},[10548,167851,66959],{"id":66958},[114,167853,167854],{"className":33693,"code":66962,"language":33695,"meta":119,"style":119},[17,167855,167856],{"__ignoreMap":119},[78,167857,167858],{"class":124,"line":125},[78,167859,66962],{},[10548,167861,66972],{"id":66971},[114,167863,167864],{"className":33693,"code":66975,"language":33695,"meta":119,"style":119},[17,167865,167866],{"__ignoreMap":119},[78,167867,167868],{"class":124,"line":125},[78,167869,66975],{},[10548,167871,66985],{"id":66984},[114,167873,167874],{"className":33693,"code":66988,"language":33695,"meta":119,"style":119},[17,167875,167876],{"__ignoreMap":119},[78,167877,167878],{"class":124,"line":125},[78,167879,66988],{},[10548,167881,66998],{"id":66997},[114,167883,167884],{"className":33693,"code":67001,"language":33695,"meta":119,"style":119},[17,167885,167886],{"__ignoreMap":119},[78,167887,167888],{"class":124,"line":125},[78,167889,67001],{},[10548,167891,67011],{"id":67010},[114,167893,167894],{"className":33693,"code":67014,"language":33695,"meta":119,"style":119},[17,167895,167896,167900],{"__ignoreMap":119},[78,167897,167898],{"class":124,"line":125},[78,167899,67021],{},[78,167901,167902],{"class":124,"line":132},[78,167903,67026],{},[10548,167905,67030],{"id":67029},[114,167907,167908],{"className":33693,"code":67033,"language":33695,"meta":119,"style":119},[17,167909,167910],{"__ignoreMap":119},[78,167911,167912],{"class":124,"line":125},[78,167913,67033],{},[10548,167915,67043],{"id":67042},[114,167917,167918],{"className":33693,"code":67046,"language":33695,"meta":119,"style":119},[17,167919,167920],{"__ignoreMap":119},[78,167921,167922],{"class":124,"line":125},[78,167923,67046],{},[10548,167925,67056],{"id":67055},[114,167927,167928],{"className":33693,"code":67059,"language":33695,"meta":119,"style":119},[17,167929,167930,167934],{"__ignoreMap":119},[78,167931,167932],{"class":124,"line":125},[78,167933,66932],{},[78,167935,167936],{"class":124,"line":132},[78,167937,67070],{},[10548,167939,67074],{"id":67073},[114,167941,167942],{"className":33693,"code":67077,"language":33695,"meta":119,"style":119},[17,167943,167944,167948,167952,167956,167960,167964,167968,167972,167976,167980,167984,167988,167992,167996,168000,168004,168008,168012,168016,168020,168024,168028,168032],{"__ignoreMap":119},[78,167945,167946],{"class":124,"line":125},[78,167947,67084],{},[78,167949,167950],{"class":124,"line":132},[78,167951,67089],{},[78,167953,167954],{"class":124,"line":138},[78,167955,67094],{},[78,167957,167958],{"class":124,"line":144},[78,167959,67099],{},[78,167961,167962],{"class":124,"line":150},[78,167963,67104],{},[78,167965,167966],{"class":124,"line":156},[78,167967,67109],{},[78,167969,167970],{"class":124,"line":162},[78,167971,67114],{},[78,167973,167974],{"class":124,"line":168},[78,167975,67119],{},[78,167977,167978],{"class":124,"line":174},[78,167979,67124],{},[78,167981,167982],{"class":124,"line":180},[78,167983,67129],{},[78,167985,167986],{"class":124,"line":186},[78,167987,67134],{},[78,167989,167990],{"class":124,"line":192},[78,167991,67139],{},[78,167993,167994],{"class":124,"line":198},[78,167995,67144],{},[78,167997,167998],{"class":124,"line":204},[78,167999,67149],{},[78,168001,168002],{"class":124,"line":210},[78,168003,67154],{},[78,168005,168006],{"class":124,"line":216},[78,168007,67159],{},[78,168009,168010],{"class":124,"line":222},[78,168011,67164],{},[78,168013,168014],{"class":124,"line":421},[78,168015,67169],{},[78,168017,168018],{"class":124,"line":427},[78,168019,67174],{},[78,168021,168022],{"class":124,"line":433},[78,168023,67179],{},[78,168025,168026],{"class":124,"line":2443},[78,168027,67184],{},[78,168029,168030],{"class":124,"line":2448},[78,168031,67189],{},[78,168033,168034],{"class":124,"line":2454},[78,168035,67194],{},[10548,168037,67198],{"id":67197},[114,168039,168040],{"className":33693,"code":67201,"language":33695,"meta":119,"style":119},[17,168041,168042,168046],{"__ignoreMap":119},[78,168043,168044],{"class":124,"line":125},[78,168045,66932],{},[78,168047,168048],{"class":124,"line":132},[78,168049,67212],{},[10548,168051,67216],{"id":67215},[114,168053,168054],{"className":33693,"code":67219,"language":33695,"meta":119,"style":119},[17,168055,168056,168060],{"__ignoreMap":119},[78,168057,168058],{"class":124,"line":125},[78,168059,67226],{},[78,168061,168062],{"class":124,"line":132},[78,168063,67212],{},[10548,168065,67234],{"id":67233},[114,168067,168068],{"className":33693,"code":67237,"language":33695,"meta":119,"style":119},[17,168069,168070,168074],{"__ignoreMap":119},[78,168071,168072],{"class":124,"line":125},[78,168073,66932],{},[78,168075,168076],{"class":124,"line":132},[78,168077,67248],{},[10548,168079,67252],{"id":67251},[114,168081,168082],{"className":33693,"code":67255,"language":33695,"meta":119,"style":119},[17,168083,168084,168088,168092],{"__ignoreMap":119},[78,168085,168086],{"class":124,"line":125},[78,168087,67262],{},[78,168089,168090],{"class":124,"line":132},[78,168091,67267],{},[78,168093,168094],{"class":124,"line":138},[78,168095,67272],{},[107,168097,67275],{"id":67275},[10548,168099,67279],{"id":67278},[114,168101,168102],{"className":33693,"code":67282,"language":33695,"meta":119,"style":119},[17,168103,168104,168108,168112,168116,168120,168124,168128],{"__ignoreMap":119},[78,168105,168106],{"class":124,"line":125},[78,168107,67289],{},[78,168109,168110],{"class":124,"line":132},[78,168111,67294],{},[78,168113,168114],{"class":124,"line":138},[78,168115,67299],{},[78,168117,168118],{"class":124,"line":144},[78,168119,67304],{},[78,168121,168122],{"class":124,"line":150},[78,168123,67309],{},[78,168125,168126],{"class":124,"line":156},[78,168127,67314],{},[78,168129,168130],{"class":124,"line":162},[78,168131,67319],{},[10548,168133,67323],{"id":67322},[114,168135,168136],{"className":33693,"code":67326,"language":33695,"meta":119,"style":119},[17,168137,168138,168142,168146],{"__ignoreMap":119},[78,168139,168140],{"class":124,"line":125},[78,168141,67333],{},[78,168143,168144],{"class":124,"line":132},[78,168145,67338],{},[78,168147,168148],{"class":124,"line":138},[78,168149,67343],{},[10548,168151,67347],{"id":67346},[114,168153,168154],{"className":33693,"code":67350,"language":33695,"meta":119,"style":119},[17,168155,168156,168160,168164,168168,168172,168176,168180,168184,168188],{"__ignoreMap":119},[78,168157,168158],{"class":124,"line":125},[78,168159,67357],{},[78,168161,168162],{"class":124,"line":132},[78,168163,67362],{},[78,168165,168166],{"class":124,"line":138},[78,168167,67367],{},[78,168169,168170],{"class":124,"line":144},[78,168171,67372],{},[78,168173,168174],{"class":124,"line":150},[78,168175,67377],{},[78,168177,168178],{"class":124,"line":156},[78,168179,67382],{},[78,168181,168182],{"class":124,"line":162},[78,168183,67387],{},[78,168185,168186],{"class":124,"line":168},[78,168187,67392],{},[78,168189,168190],{"class":124,"line":174},[78,168191,67397],{},[10548,168193,67401],{"id":67400},[114,168195,168196],{"className":33693,"code":67404,"language":33695,"meta":119,"style":119},[17,168197,168198,168202,168206,168210,168214,168218,168222,168226],{"__ignoreMap":119},[78,168199,168200],{"class":124,"line":125},[78,168201,67411],{},[78,168203,168204],{"class":124,"line":132},[78,168205,67416],{},[78,168207,168208],{"class":124,"line":138},[78,168209,67421],{},[78,168211,168212],{"class":124,"line":144},[78,168213,67426],{},[78,168215,168216],{"class":124,"line":150},[78,168217,67431],{},[78,168219,168220],{"class":124,"line":156},[78,168221,67416],{},[78,168223,168224],{"class":124,"line":162},[78,168225,67440],{},[78,168227,168228],{"class":124,"line":168},[78,168229,67445],{},[10548,168231,67449],{"id":67448},[114,168233,168234],{"className":33693,"code":67452,"language":33695,"meta":119,"style":119},[17,168235,168236,168240,168244],{"__ignoreMap":119},[78,168237,168238],{"class":124,"line":125},[78,168239,67459],{},[78,168241,168242],{"class":124,"line":132},[78,168243,67464],{},[78,168245,168246],{"class":124,"line":138},[78,168247,67469],{},[10548,168249,67473],{"id":67472},[114,168251,168252],{"className":33693,"code":67476,"language":33695,"meta":119,"style":119},[17,168253,168254,168258,168262,168266,168270,168274],{"__ignoreMap":119},[78,168255,168256],{"class":124,"line":125},[78,168257,67483],{},[78,168259,168260],{"class":124,"line":132},[78,168261,67488],{},[78,168263,168264],{"class":124,"line":138},[78,168265,67493],{},[78,168267,168268],{"class":124,"line":144},[78,168269,67498],{},[78,168271,168272],{"class":124,"line":150},[78,168273,67503],{},[78,168275,168276],{"class":124,"line":156},[78,168277,67508],{},[10548,168279,67512],{"id":67511},[114,168281,168282],{"className":33693,"code":67515,"language":33695,"meta":119,"style":119},[17,168283,168284,168288,168292,168296],{"__ignoreMap":119},[78,168285,168286],{"class":124,"line":125},[78,168287,67522],{},[78,168289,168290],{"class":124,"line":132},[78,168291,67527],{},[78,168293,168294],{"class":124,"line":138},[78,168295,67532],{},[78,168297,168298],{"class":124,"line":144},[78,168299,67537],{},[10548,168301,67541],{"id":67540},[114,168303,168304],{"className":33693,"code":67544,"language":33695,"meta":119,"style":119},[17,168305,168306,168310,168314,168318,168322],{"__ignoreMap":119},[78,168307,168308],{"class":124,"line":125},[78,168309,67551],{},[78,168311,168312],{"class":124,"line":132},[78,168313,67556],{},[78,168315,168316],{"class":124,"line":138},[78,168317,67561],{},[78,168319,168320],{"class":124,"line":144},[78,168321,67566],{},[78,168323,168324],{"class":124,"line":150},[78,168325,67571],{},[10548,168327,67575],{"id":67574},[114,168329,168330],{"className":33693,"code":67578,"language":33695,"meta":119,"style":119},[17,168331,168332,168336,168340,168344,168348,168352,168356,168360],{"__ignoreMap":119},[78,168333,168334],{"class":124,"line":125},[78,168335,67585],{},[78,168337,168338],{"class":124,"line":132},[78,168339,67590],{},[78,168341,168342],{"class":124,"line":138},[78,168343,67595],{},[78,168345,168346],{"class":124,"line":144},[78,168347,67600],{},[78,168349,168350],{"class":124,"line":150},[78,168351,67605],{},[78,168353,168354],{"class":124,"line":156},[78,168355,67610],{},[78,168357,168358],{"class":124,"line":162},[78,168359,67615],{},[78,168361,168362],{"class":124,"line":168},[78,168363,67620],{},[10548,168365,67624],{"id":67623},[114,168367,168368],{"className":33693,"code":67627,"language":33695,"meta":119,"style":119},[17,168369,168370,168374,168378,168382,168386,168390,168394],{"__ignoreMap":119},[78,168371,168372],{"class":124,"line":125},[78,168373,67634],{},[78,168375,168376],{"class":124,"line":132},[78,168377,67639],{},[78,168379,168380],{"class":124,"line":138},[78,168381,67644],{},[78,168383,168384],{"class":124,"line":144},[78,168385,67649],{},[78,168387,168388],{"class":124,"line":150},[78,168389,67654],{},[78,168391,168392],{"class":124,"line":156},[78,168393,67659],{},[78,168395,168396],{"class":124,"line":162},[78,168397,67664],{},[10548,168399,67668],{"id":67667},[114,168401,168402],{"className":33693,"code":67671,"language":33695,"meta":119,"style":119},[17,168403,168404,168408],{"__ignoreMap":119},[78,168405,168406],{"class":124,"line":125},[78,168407,67678],{},[78,168409,168410],{"class":124,"line":132},[78,168411,67683],{},[10548,168413,67687],{"id":67686},[114,168415,168416],{"className":33693,"code":67690,"language":33695,"meta":119,"style":119},[17,168417,168418,168422,168426,168430,168434,168438,168442,168446,168450,168454,168458,168462,168466],{"__ignoreMap":119},[78,168419,168420],{"class":124,"line":125},[78,168421,67697],{},[78,168423,168424],{"class":124,"line":132},[78,168425,67702],{},[78,168427,168428],{"class":124,"line":138},[78,168429,67707],{},[78,168431,168432],{"class":124,"line":144},[78,168433,67712],{},[78,168435,168436],{"class":124,"line":150},[78,168437,67717],{},[78,168439,168440],{"class":124,"line":156},[78,168441,67722],{},[78,168443,168444],{"class":124,"line":162},[78,168445,67727],{},[78,168447,168448],{"class":124,"line":168},[78,168449,67732],{},[78,168451,168452],{"class":124,"line":174},[78,168453,67737],{},[78,168455,168456],{"class":124,"line":180},[78,168457,67742],{},[78,168459,168460],{"class":124,"line":186},[78,168461,67747],{},[78,168463,168464],{"class":124,"line":192},[78,168465,67752],{},[78,168467,168468],{"class":124,"line":198},[78,168469,67757],{},[10548,168471,67761],{"id":67760},[114,168473,168474],{"className":33693,"code":67764,"language":33695,"meta":119,"style":119},[17,168475,168476,168480,168484,168488,168492,168496,168500,168504],{"__ignoreMap":119},[78,168477,168478],{"class":124,"line":125},[78,168479,67707],{},[78,168481,168482],{"class":124,"line":132},[78,168483,67775],{},[78,168485,168486],{"class":124,"line":138},[78,168487,67780],{},[78,168489,168490],{"class":124,"line":144},[78,168491,67785],{},[78,168493,168494],{"class":124,"line":150},[78,168495,67790],{},[78,168497,168498],{"class":124,"line":156},[78,168499,67795],{},[78,168501,168502],{"class":124,"line":162},[78,168503,67800],{},[78,168505,168506],{"class":124,"line":168},[78,168507,67805],{},[10548,168509,67809],{"id":67808},[114,168511,168512],{"className":33693,"code":67812,"language":33695,"meta":119,"style":119},[17,168513,168514,168518,168522,168526,168530,168534,168538,168542,168546,168550],{"__ignoreMap":119},[78,168515,168516],{"class":124,"line":125},[78,168517,67819],{},[78,168519,168520],{"class":124,"line":132},[78,168521,67824],{},[78,168523,168524],{"class":124,"line":138},[78,168525,67829],{},[78,168527,168528],{"class":124,"line":144},[78,168529,67834],{},[78,168531,168532],{"class":124,"line":150},[78,168533,67839],{},[78,168535,168536],{"class":124,"line":156},[78,168537,67844],{},[78,168539,168540],{"class":124,"line":162},[78,168541,67829],{},[78,168543,168544],{"class":124,"line":168},[78,168545,67834],{},[78,168547,168548],{"class":124,"line":174},[78,168549,67857],{},[78,168551,168552],{"class":124,"line":180},[78,168553,67862],{},[10548,168555,67866],{"id":67865},[114,168557,168558],{"className":33693,"code":67869,"language":33695,"meta":119,"style":119},[17,168559,168560,168564,168568,168572,168576,168580,168584,168588,168592,168596,168600,168604,168608,168612,168616,168620,168624,168628,168632,168636,168640,168644,168648,168652,168656,168660,168664,168668,168672,168676,168680,168684,168688,168692,168696,168700,168704,168708],{"__ignoreMap":119},[78,168561,168562],{"class":124,"line":125},[78,168563,67876],{},[78,168565,168566],{"class":124,"line":132},[78,168567,67881],{},[78,168569,168570],{"class":124,"line":138},[78,168571,67886],{},[78,168573,168574],{"class":124,"line":144},[78,168575,67891],{},[78,168577,168578],{"class":124,"line":150},[78,168579,67896],{},[78,168581,168582],{"class":124,"line":156},[78,168583,67901],{},[78,168585,168586],{"class":124,"line":162},[78,168587,67906],{},[78,168589,168590],{"class":124,"line":168},[78,168591,67911],{},[78,168593,168594],{"class":124,"line":174},[78,168595,67916],{},[78,168597,168598],{"class":124,"line":180},[78,168599,67921],{},[78,168601,168602],{"class":124,"line":186},[78,168603,67926],{},[78,168605,168606],{"class":124,"line":192},[78,168607,67931],{},[78,168609,168610],{"class":124,"line":198},[78,168611,67936],{},[78,168613,168614],{"class":124,"line":204},[78,168615,67941],{},[78,168617,168618],{"class":124,"line":210},[78,168619,67946],{},[78,168621,168622],{"class":124,"line":216},[78,168623,67951],{},[78,168625,168626],{"class":124,"line":222},[78,168627,67956],{},[78,168629,168630],{"class":124,"line":421},[78,168631,67961],{},[78,168633,168634],{"class":124,"line":427},[78,168635,67966],{},[78,168637,168638],{"class":124,"line":433},[78,168639,67971],{},[78,168641,168642],{"class":124,"line":2443},[78,168643,67976],{},[78,168645,168646],{"class":124,"line":2448},[78,168647,67981],{},[78,168649,168650],{"class":124,"line":2454},[78,168651,67986],{},[78,168653,168654],{"class":124,"line":2460},[78,168655,67991],{},[78,168657,168658],{"class":124,"line":2465},[78,168659,67996],{},[78,168661,168662],{"class":124,"line":2470},[78,168663,68001],{},[78,168665,168666],{"class":124,"line":2903},[78,168667,68006],{},[78,168669,168670],{"class":124,"line":2909},[78,168671,68011],{},[78,168673,168674],{"class":124,"line":11477},[78,168675,68016],{},[78,168677,168678],{"class":124,"line":13374},[78,168679,68021],{},[78,168681,168682],{"class":124,"line":13380},[78,168683,68026],{},[78,168685,168686],{"class":124,"line":13386},[78,168687,68031],{},[78,168689,168690],{"class":124,"line":13722},[78,168691,68036],{},[78,168693,168694],{"class":124,"line":13727},[78,168695,68041],{},[78,168697,168698],{"class":124,"line":13953},[78,168699,68046],{},[78,168701,168702],{"class":124,"line":13958},[78,168703,68051],{},[78,168705,168706],{"class":124,"line":13964},[78,168707,68056],{},[78,168709,168710],{"class":124,"line":13969},[78,168711,68061],{},[226,168713,228],{},{"title":119,"searchDepth":144,"depth":144,"links":168715},[168716,168717],{"id":66651,"depth":132,"text":66651},{"id":67275,"depth":132,"text":67275},{},{"title":66635,"description":119},[10715],{"id":68076,"title":68077,"assetBase":239,"author":8,"body":168722,"category":25506,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":169005,"navigation":128,"originalPath":68509,"path":68510,"seo":169006,"source":23330,"stem":68512,"tags":169007,"weight":250,"__hash__":68514},{"type":10,"value":168723,"toc":168968},[168724,168726,168728,168730,168732,168744,168746,168748,168750,168752,168754,168756,168758,168760,168762,168764,168766,168768,168770,168772,168776,168778,168782,168784,168788,168790,168792,168794,168798,168800,168802,168804,168806,168808,168810,168812,168814,168816,168820,168830,168832,168834,168838,168840,168842,168846,168848,168850,168852,168856,168858,168860,168862,168864,168866,168868,168870,168872,168874,168876,168878,168880,168882,168884,168886,168890,168892,168894,168896,168900,168902,168904,168906,168908,168910,168912,168914,168916,168918,168920,168922,168924,168926,168928,168930,168932,168934,168936,168938,168940,168942,168944,168946,168948,168950,168952,168954,168956,168958,168960,168962,168964,168966],[4517,168725,68082],{"id":68082},[7759,168727,68086],{"id":68085},[7759,168729,68090],{"id":68089},[7759,168731,68094],{"id":68093},[72,168733,168734,168738,168740,168742],{},[13,168735,168736],{},[22,168737,25537],{},[13,168739,68103],{},[13,168741,68106],{},[13,168743,68109],{},[7759,168745,68112],{"id":68112},[13,168747,68115],{},[13,168749,68118],{},[7759,168751,68122],{"id":68121},[13,168753,68125],{},[13,168755,68128],{},[39316,168757,68132],{"id":68131},[13,168759,68135],{},[13,168761,68138],{},[39316,168763,68142],{"id":68141},[13,168765,68145],{},[10548,168767,68149],{"id":68148},[13,168769,68152],{},[13,168771,68155],{},[13,168773,168774],{},[617,168775],{"alt":68160,"src":68161},[10548,168777,68165],{"id":68164},[13,168779,68168,168780,68171],{},[25921,168781,43673],{},[13,168783,68174],{},[13,168785,168786],{},[617,168787],{"alt":68179,"src":68180},[10548,168789,68184],{"id":68183},[13,168791,68187],{},[13,168793,68190],{},[13,168795,168796],{},[617,168797],{"alt":68195,"src":68196},[39316,168799,68200],{"id":68199},[13,168801,68203],{},[13,168803,68206],{},[39316,168805,68210],{"id":68209},[13,168807,68213],{},[7759,168809,68217],{"id":68216},[13,168811,68220],{},[13,168813,68223],{},[13,168815,68226],{},[13,168817,168818],{},[617,168819],{"alt":68231,"src":68232},[49,168821,168822,168824,168826,168828],{},[52,168823,68237],{},[52,168825,68240],{},[52,168827,68243],{},[52,168829,68246],{},[13,168831,68249],{},[13,168833,68252],{},[13,168835,168836],{},[617,168837],{"alt":68257,"src":68258},[7759,168839,68262],{"id":68261},[13,168841,68265],{},[13,168843,168844],{},[617,168845],{"alt":68270,"src":25765},[39316,168847,68274],{"id":68273},[13,168849,68277],{},[13,168851,68280],{},[13,168853,68283,168854,68286],{},[25921,168855,5535],{},[39316,168857,68290],{"id":68289},[13,168859,68293],{},[13,168861,68296],{},[39316,168863,68300],{"id":68299},[13,168865,68303],{},[13,168867,68306],{},[13,168869,68309],{},[39316,168871,68313],{"id":68312},[13,168873,68316],{},[13,168875,68319],{},[13,168877,68322],{},[7759,168879,68326],{"id":68325},[13,168881,68329],{},[39316,168883,68333],{"id":68332},[13,168885,68336],{},[13,168887,168888],{},[617,168889],{"alt":68341,"src":25773},[39316,168891,68345],{"id":68344},[13,168893,68348],{},[13,168895,68351],{},[13,168897,168898],{},[617,168899],{"alt":68356,"src":25788},[13,168901,68359],{},[7759,168903,68363],{"id":68362},[13,168905,68366],{},[39316,168907,68370],{"id":68369},[13,168909,68373],{},[13,168911,68376],{},[13,168913,68379],{},[13,168915,68382],{},[39316,168917,68386],{"id":68385},[13,168919,68389],{},[13,168921,68392],{},[13,168923,68395],{},[7759,168925,68399],{"id":68398},[13,168927,68402],{},[39316,168929,68406],{"id":68405},[13,168931,68409],{},[39316,168933,68413],{"id":68412},[13,168935,68416],{},[13,168937,68419],{},[39316,168939,68423],{"id":68422},[13,168941,68426],{},[39316,168943,68430],{"id":68429},[13,168945,68433],{},[39316,168947,68437],{"id":68436},[13,168949,68440],{},[39316,168951,68444],{"id":68443},[13,168953,68447],{},[39316,168955,68451],{"id":68450},[13,168957,68454],{},[7759,168959,68458],{"id":68457},[13,168961,68461],{},[13,168963,68464],{},[13,168965,68467],{},[13,168967,68470],{},{"title":119,"searchDepth":144,"depth":144,"links":168969},[168970,168971,168972,168973,168974,168980,168981,168987,168991,168995,169004],{"id":68085,"depth":144,"text":68086},{"id":68089,"depth":144,"text":68090},{"id":68093,"depth":144,"text":68094},{"id":68112,"depth":144,"text":68112},{"id":68121,"depth":144,"text":68122,"children":168975},[168976,168977,168978,168979],{"id":68131,"depth":150,"text":68132},{"id":68141,"depth":150,"text":68142},{"id":68199,"depth":150,"text":68200},{"id":68209,"depth":150,"text":68210},{"id":68216,"depth":144,"text":68217},{"id":68261,"depth":144,"text":68262,"children":168982},[168983,168984,168985,168986],{"id":68273,"depth":150,"text":68274},{"id":68289,"depth":150,"text":68290},{"id":68299,"depth":150,"text":68300},{"id":68312,"depth":150,"text":68313},{"id":68325,"depth":144,"text":68326,"children":168988},[168989,168990],{"id":68332,"depth":150,"text":68333},{"id":68344,"depth":150,"text":68345},{"id":68362,"depth":144,"text":68363,"children":168992},[168993,168994],{"id":68369,"depth":150,"text":68370},{"id":68385,"depth":150,"text":68386},{"id":68398,"depth":144,"text":68399,"children":168996},[168997,168998,168999,169000,169001,169002,169003],{"id":68405,"depth":150,"text":68406},{"id":68412,"depth":150,"text":68413},{"id":68422,"depth":150,"text":68423},{"id":68429,"depth":150,"text":68430},{"id":68436,"depth":150,"text":68437},{"id":68443,"depth":150,"text":68444},{"id":68450,"depth":150,"text":68451},{"id":68457,"depth":144,"text":68458},{},{"title":68077,"description":119},[14541,7744,246,6380,14542],{"id":68516,"title":68517,"assetBase":239,"author":8,"body":169009,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":170970,"navigation":128,"originalPath":71063,"path":71064,"seo":170971,"source":23330,"stem":71066,"tags":170972,"weight":250,"__hash__":71068},{"type":10,"value":169010,"toc":170946},[169011,169013,169023,169025,169027,169037,169041,169045,169047,169049,169061,169063,169073,169075,169089,169091,169093,169095,169097,169099,169103,169105,169107,169109,169111,169113,169115,169117,169119,169129,169131,169133,169137,169139,169143,169145,169147,169157,169159,169163,169165,169167,169173,169177,169179,169183,169185,169187,169189,169191,169193,169197,169207,169209,169211,169213,169215,169217,169241,169243,169247,169249,169251,169253,169259,169303,169305,169307,169317,169319,169321,169331,169333,169335,169339,169407,169411,169439,169443,169479,169483,169487,169527,169531,169537,169577,169581,169613,169615,169617,169621,169641,169645,169669,169673,169701,169705,169729,169731,169735,169739,169743,169745,169853,169855,169857,169863,169865,170009,170011,170016,170018,170022,170138,170140,170142,170144,170146,170152,170154,170158,170164,170168,170174,170176,170178,170180,170182,170184,170186,170188,170196,170198,170200,170202,170206,170208,170210,170224,170226,170230,170232,170250,170252,170254,170258,170260,170264,170266,170268,170286,170288,170290,170294,170296,170298,170300,170310,170312,170314,170446,170448,170452,170454,170506,170508,170510,170546,170548,170552,170556,170624,170626,170628,170630,170632,170634,170638,170640,170656,170658,170662,170668,170672,170682,170686,170696,170698,170702,170704,170708,170712,170716,170776,170780,170784,170786,170922,170924,170944],[4517,169012,68517],{"id":68522},[72,169014,169015,169019,169021],{},[13,169016,169017],{},[22,169018,23957],{},[13,169020,68531],{},[13,169022,68534],{},[107,169024,68538],{"id":68537},[7759,169026,68542],{"id":68541},[49,169028,169029,169031,169033,169035],{},[52,169030,68547],{},[52,169032,68550],{},[52,169034,68553],{},[52,169036,68556],{},[13,169038,169039],{},[22,169040,68561],{},[13,169042,169043],{},[22,169044,68566],{},[7759,169046,68570],{"id":68569},[10548,169048,68574],{"id":68573},[49,169050,169051,169053,169055,169059],{},[52,169052,68579],{},[52,169054,68582],{},[52,169056,68585,169057,67],{},[22,169058,68588],{},[52,169060,68591],{},[10548,169062,68595],{"id":68594},[49,169064,169065,169067,169069,169071],{},[52,169066,68600],{},[52,169068,68603],{},[52,169070,68606],{},[52,169072,68609],{},[10548,169074,68613],{"id":68612},[49,169076,169077,169081,169085],{},[52,169078,169079,68621],{},[22,169080,68620],{},[52,169082,169083,68627],{},[22,169084,68626],{},[52,169086,169087,68633],{},[22,169088,68632],{},[7759,169090,68637],{"id":68636},[10548,169092,68641],{"id":68640},[13,169094,68644],{},[10548,169096,68648],{"id":68647},[13,169098,68651],{},[72,169100,169101],{},[13,169102,68656],{},[10548,169104,68660],{"id":68659},[13,169106,68556],{},[10548,169108,68666],{"id":68665},[13,169110,68669],{},[10548,169112,68673],{"id":68672},[13,169114,68676],{},[7759,169116,68680],{"id":68679},[10548,169118,68684],{"id":68683},[49,169120,169121,169123,169125,169127],{},[52,169122,68689],{},[52,169124,68692],{},[52,169126,68695],{},[52,169128,68698],{},[10548,169130,68702],{"id":68701},[13,169132,68705],{},[13,169134,169135],{},[617,169136],{"alt":119,"src":29434},[10548,169138,68713],{"id":68712},[13,169140,169141],{},[22,169142,68718],{},[13,169144,68721],{},[13,169146,68724],{},[49,169148,169149,169151,169153,169155],{},[52,169150,68729],{},[52,169152,68732],{},[52,169154,68735],{},[52,169156,68738],{},[13,169158,68741],{},[13,169160,169161],{},[22,169162,68746],{},[13,169164,68749],{},[13,169166,68752],{},[49,169168,169169,169171],{},[52,169170,68757],{},[52,169172,68760],{},[13,169174,169175],{},[22,169176,68765],{},[13,169178,68768],{},[13,169180,169181],{},[22,169182,68773],{},[13,169184,68776],{},[10548,169186,68780],{"id":68779},[13,169188,68783],{},[13,169190,68786],{},[10548,169192,68790],{"id":68789},[13,169194,169195],{},[617,169196],{"alt":119,"src":33078},[49,169198,169199,169201,169203,169205],{},[52,169200,68799],{},[52,169202,68802],{},[52,169204,68805],{},[52,169206,68808],{},[23289,169208],{},[107,169210,68814],{"id":68813},[7759,169212,68818],{"id":68817},[10548,169214,68822],{"id":68821},[13,169216,68825],{},[49,169218,169219,169231,169233,169235,169237,169239],{},[52,169220,68830,169221],{},[49,169222,169223,169225,169227,169229],{},[52,169224,68835],{},[52,169226,68838],{},[52,169228,68841],{},[52,169230,68844],{},[52,169232,68847],{},[52,169234,68850],{},[52,169236,68853],{},[52,169238,68856],{},[52,169240,68859],{},[13,169242,68862],{},[13,169244,169245],{},[22,169246,68867],{},[10548,169248,68871],{"id":68870},[13,169250,68874],{},[13,169252,68877],{},[49,169254,169255],{},[52,169256,169257],{},[22,169258,68884],{},[8366,169260,169261,169269],{},[8369,169262,169263],{},[8372,169264,169265,169267],{},[8375,169266,68893],{"align":9247},[8375,169268,68896],{"align":9247},[8386,169270,169271,169279,169287,169295],{},[8372,169272,169273,169275],{},[8391,169274,68903],{"align":9247},[8391,169276,169277],{"align":9247},[617,169278],{"alt":119,"src":30426},[8372,169280,169281,169283],{},[8391,169282,68912],{"align":9247},[8391,169284,169285],{"align":9247},[617,169286],{"alt":119,"src":30562},[8372,169288,169289,169291],{},[8391,169290,68921],{"align":9247},[8391,169292,169293],{"align":9247},[617,169294],{"alt":119,"src":65400},[8372,169296,169297,169299],{},[8391,169298,68930],{"align":9247},[8391,169300,169301],{"align":9247},[617,169302],{"alt":119,"src":68935},[10548,169304,68939],{"id":68938},[13,169306,68942],{},[49,169308,169309,169311,169313,169315],{},[52,169310,68947],{},[52,169312,68950],{},[52,169314,68953],{},[52,169316,68956],{},[7759,169318,68960],{"id":68959},[10548,169320,68964],{"id":68963},[49,169322,169323,169329],{},[52,169324,68969,169325],{},[49,169326,169327],{},[52,169328,68974],{},[52,169330,68977],{},[10548,169332,68981],{"id":68980},[13,169334,68984],{},[49,169336,169337],{},[52,169338,68989],{},[114,169340,169341],{"className":23406,"code":68992,"language":23408,"meta":119,"style":119},[17,169342,169343,169347,169351,169355,169359,169363,169367,169371,169375,169379,169383,169387,169391,169395,169399,169403],{"__ignoreMap":119},[78,169344,169345],{"class":124,"line":125},[78,169346,68999],{},[78,169348,169349],{"class":124,"line":132},[78,169350,69004],{},[78,169352,169353],{"class":124,"line":138},[78,169354,69009],{},[78,169356,169357],{"class":124,"line":144},[78,169358,69014],{},[78,169360,169361],{"class":124,"line":150},[78,169362,69019],{},[78,169364,169365],{"class":124,"line":156},[78,169366,51353],{},[78,169368,169369],{"class":124,"line":162},[78,169370,69028],{},[78,169372,169373],{"class":124,"line":168},[78,169374,69033],{},[78,169376,169377],{"class":124,"line":174},[78,169378,69014],{},[78,169380,169381],{"class":124,"line":180},[78,169382,69042],{},[78,169384,169385],{"class":124,"line":186},[78,169386,51353],{},[78,169388,169389],{"class":124,"line":192},[78,169390,69051],{},[78,169392,169393],{"class":124,"line":198},[78,169394,129],{"emptyLinePlaceholder":128},[78,169396,169397],{"class":124,"line":204},[78,169398,23628],{},[78,169400,169401],{"class":124,"line":210},[78,169402,69064],{},[78,169404,169405],{"class":124,"line":216},[78,169406,69069],{},[49,169408,169409],{},[52,169410,69074],{},[114,169412,169413],{"className":23406,"code":69077,"language":23408,"meta":119,"style":119},[17,169414,169415,169419,169423,169427,169431,169435],{"__ignoreMap":119},[78,169416,169417],{"class":124,"line":125},[78,169418,69084],{},[78,169420,169421],{"class":124,"line":132},[78,169422,69089],{},[78,169424,169425],{"class":124,"line":138},[78,169426,69094],{},[78,169428,169429],{"class":124,"line":144},[78,169430,69099],{},[78,169432,169433],{"class":124,"line":150},[78,169434,69104],{},[78,169436,169437],{"class":124,"line":156},[78,169438,69109],{},[49,169440,169441],{},[52,169442,69114],{},[114,169444,169445],{"className":23406,"code":69117,"language":23408,"meta":119,"style":119},[17,169446,169447,169451,169455,169459,169463,169467,169471,169475],{"__ignoreMap":119},[78,169448,169449],{"class":124,"line":125},[78,169450,69124],{},[78,169452,169453],{"class":124,"line":132},[78,169454,69089],{},[78,169456,169457],{"class":124,"line":138},[78,169458,69133],{},[78,169460,169461],{"class":124,"line":144},[78,169462,69099],{},[78,169464,169465],{"class":124,"line":150},[78,169466,69142],{},[78,169468,169469],{"class":124,"line":156},[78,169470,69147],{},[78,169472,169473],{"class":124,"line":162},[78,169474,8041],{},[78,169476,169477],{"class":124,"line":168},[78,169478,69156],{},[72,169480,169481],{},[13,169482,69161],{},[49,169484,169485],{},[52,169486,69166],{},[114,169488,169489],{"className":23406,"code":69169,"language":23408,"meta":119,"style":119},[17,169490,169491,169495,169499,169503,169507,169511,169515,169519,169523],{"__ignoreMap":119},[78,169492,169493],{"class":124,"line":125},[78,169494,69176],{},[78,169496,169497],{"class":124,"line":132},[78,169498,69181],{},[78,169500,169501],{"class":124,"line":138},[78,169502,69186],{},[78,169504,169505],{"class":124,"line":144},[78,169506,69191],{},[78,169508,169509],{"class":124,"line":150},[78,169510,69196],{},[78,169512,169513],{"class":124,"line":156},[78,169514,69201],{},[78,169516,169517],{"class":124,"line":162},[78,169518,23628],{},[78,169520,169521],{"class":124,"line":168},[78,169522,69210],{},[78,169524,169525],{"class":124,"line":174},[78,169526,69215],{},[72,169528,169529],{},[13,169530,69220],{},[49,169532,169533],{},[52,169534,69225,169535,69228],{},[78,169536,5042],{},[114,169538,169539],{"className":23406,"code":69231,"language":23408,"meta":119,"style":119},[17,169540,169541,169545,169549,169553,169557,169561,169565,169569,169573],{"__ignoreMap":119},[78,169542,169543],{"class":124,"line":125},[78,169544,69238],{},[78,169546,169547],{"class":124,"line":132},[78,169548,69243],{},[78,169550,169551],{"class":124,"line":138},[78,169552,69248],{},[78,169554,169555],{"class":124,"line":144},[78,169556,69253],{},[78,169558,169559],{"class":124,"line":150},[78,169560,69258],{},[78,169562,169563],{"class":124,"line":156},[78,169564,69263],{},[78,169566,169567],{"class":124,"line":162},[78,169568,69268],{},[78,169570,169571],{"class":124,"line":168},[78,169572,69273],{},[78,169574,169575],{"class":124,"line":174},[78,169576,69278],{},[49,169578,169579],{},[52,169580,69283],{},[114,169582,169583],{"className":23406,"code":69286,"language":23408,"meta":119,"style":119},[17,169584,169585,169589,169593,169597,169601,169605,169609],{"__ignoreMap":119},[78,169586,169587],{"class":124,"line":125},[78,169588,69293],{},[78,169590,169591],{"class":124,"line":132},[78,169592,69243],{},[78,169594,169595],{"class":124,"line":138},[78,169596,69302],{},[78,169598,169599],{"class":124,"line":144},[78,169600,69307],{},[78,169602,169603],{"class":124,"line":150},[78,169604,69312],{},[78,169606,169607],{"class":124,"line":156},[78,169608,69317],{},[78,169610,169611],{"class":124,"line":162},[78,169612,69322],{},[10548,169614,69326],{"id":69325},[13,169616,69329],{},[49,169618,169619],{},[52,169620,69334],{},[114,169622,169623],{"className":23406,"code":69337,"language":23408,"meta":119,"style":119},[17,169624,169625,169629,169633,169637],{"__ignoreMap":119},[78,169626,169627],{"class":124,"line":125},[78,169628,69344],{},[78,169630,169631],{"class":124,"line":132},[78,169632,69349],{},[78,169634,169635],{"class":124,"line":138},[78,169636,69354],{},[78,169638,169639],{"class":124,"line":144},[78,169640,69359],{},[49,169642,169643],{},[52,169644,69364],{},[114,169646,169647],{"className":23406,"code":69367,"language":23408,"meta":119,"style":119},[17,169648,169649,169653,169657,169661,169665],{"__ignoreMap":119},[78,169650,169651],{"class":124,"line":125},[78,169652,69374],{},[78,169654,169655],{"class":124,"line":132},[78,169656,69349],{},[78,169658,169659],{"class":124,"line":138},[78,169660,69374],{},[78,169662,169663],{"class":124,"line":144},[78,169664,69387],{},[78,169666,169667],{"class":124,"line":150},[78,169668,69392],{},[49,169670,169671],{},[52,169672,69397],{},[114,169674,169675],{"className":23406,"code":69400,"language":23408,"meta":119,"style":119},[17,169676,169677,169681,169685,169689,169693,169697],{"__ignoreMap":119},[78,169678,169679],{"class":124,"line":125},[78,169680,69407],{},[78,169682,169683],{"class":124,"line":132},[78,169684,69349],{},[78,169686,169687],{"class":124,"line":138},[78,169688,69374],{},[78,169690,169691],{"class":124,"line":144},[78,169692,69420],{},[78,169694,169695],{"class":124,"line":150},[78,169696,69425],{},[78,169698,169699],{"class":124,"line":156},[78,169700,69430],{},[49,169702,169703],{},[52,169704,69435],{},[114,169706,169707],{"className":23406,"code":69438,"language":23408,"meta":119,"style":119},[17,169708,169709,169713,169717,169721,169725],{"__ignoreMap":119},[78,169710,169711],{"class":124,"line":125},[78,169712,69445],{},[78,169714,169715],{"class":124,"line":132},[78,169716,69349],{},[78,169718,169719],{"class":124,"line":138},[78,169720,69454],{},[78,169722,169723],{"class":124,"line":144},[78,169724,69459],{},[78,169726,169727],{"class":124,"line":150},[78,169728,69464],{},[10548,169730,69468],{"id":69467},[13,169732,169733,69474],{},[22,169734,69473],{},[13,169736,169737,69480],{},[22,169738,69479],{},[13,169740,169741],{},[22,169742,69485],{},[10548,169744,69489],{"id":69488},[114,169746,169747],{"className":23406,"code":69492,"language":23408,"meta":119,"style":119},[17,169748,169749,169753,169757,169761,169765,169769,169773,169777,169781,169785,169789,169793,169797,169801,169805,169809,169813,169817,169821,169825,169829,169833,169837,169841,169845,169849],{"__ignoreMap":119},[78,169750,169751],{"class":124,"line":125},[78,169752,69499],{},[78,169754,169755],{"class":124,"line":132},[78,169756,69504],{},[78,169758,169759],{"class":124,"line":138},[78,169760,129],{"emptyLinePlaceholder":128},[78,169762,169763],{"class":124,"line":144},[78,169764,69513],{},[78,169766,169767],{"class":124,"line":150},[78,169768,69518],{},[78,169770,169771],{"class":124,"line":156},[78,169772,69523],{},[78,169774,169775],{"class":124,"line":162},[78,169776,69528],{},[78,169778,169779],{"class":124,"line":168},[78,169780,69533],{},[78,169782,169783],{"class":124,"line":174},[78,169784,69538],{},[78,169786,169787],{"class":124,"line":180},[78,169788,69543],{},[78,169790,169791],{"class":124,"line":186},[78,169792,69548],{},[78,169794,169795],{"class":124,"line":192},[78,169796,69553],{},[78,169798,169799],{"class":124,"line":198},[78,169800,69558],{},[78,169802,169803],{"class":124,"line":204},[78,169804,69563],{},[78,169806,169807],{"class":124,"line":210},[78,169808,69568],{},[78,169810,169811],{"class":124,"line":216},[78,169812,69573],{},[78,169814,169815],{"class":124,"line":222},[78,169816,10054],{},[78,169818,169819],{"class":124,"line":421},[78,169820,69582],{},[78,169822,169823],{"class":124,"line":427},[78,169824,69587],{},[78,169826,169827],{"class":124,"line":433},[78,169828,69592],{},[78,169830,169831],{"class":124,"line":2443},[78,169832,69597],{},[78,169834,169835],{"class":124,"line":2448},[78,169836,69602],{},[78,169838,169839],{"class":124,"line":2454},[78,169840,69607],{},[78,169842,169843],{"class":124,"line":2460},[78,169844,69612],{},[78,169846,169847],{"class":124,"line":2465},[78,169848,15810],{},[78,169850,169851],{"class":124,"line":2470},[78,169852,23518],{},[7759,169854,69624],{"id":69623},[10548,169856,69628],{"id":69627},[13,169858,69631,169859],{},[22,169860,69634,169861,69638],{},[22,169862,69637],{},[10548,169864,69642],{"id":69641},[114,169866,169867],{"className":23406,"code":69645,"language":23408,"meta":119,"style":119},[17,169868,169869,169873,169877,169881,169885,169889,169893,169897,169901,169905,169909,169913,169917,169921,169925,169929,169933,169937,169941,169945,169949,169953,169957,169961,169965,169969,169973,169977,169981,169985,169989,169993,169997,170001,170005],{"__ignoreMap":119},[78,169870,169871],{"class":124,"line":125},[78,169872,69652],{},[78,169874,169875],{"class":124,"line":132},[78,169876,69518],{},[78,169878,169879],{"class":124,"line":138},[78,169880,69661],{},[78,169882,169883],{"class":124,"line":144},[78,169884,69666],{},[78,169886,169887],{"class":124,"line":150},[78,169888,69671],{},[78,169890,169891],{"class":124,"line":156},[78,169892,69676],{},[78,169894,169895],{"class":124,"line":162},[78,169896,69681],{},[78,169898,169899],{"class":124,"line":168},[78,169900,69686],{},[78,169902,169903],{"class":124,"line":174},[78,169904,69691],{},[78,169906,169907],{"class":124,"line":180},[78,169908,69696],{},[78,169910,169911],{"class":124,"line":186},[78,169912,69701],{},[78,169914,169915],{"class":124,"line":192},[78,169916,69706],{},[78,169918,169919],{"class":124,"line":198},[78,169920,69711],{},[78,169922,169923],{"class":124,"line":204},[78,169924,69716],{},[78,169926,169927],{"class":124,"line":210},[78,169928,69721],{},[78,169930,169931],{"class":124,"line":216},[78,169932,69612],{},[78,169934,169935],{"class":124,"line":222},[78,169936,15810],{},[78,169938,169939],{"class":124,"line":421},[78,169940,23518],{},[78,169942,169943],{"class":124,"line":427},[78,169944,69738],{},[78,169946,169947],{"class":124,"line":433},[78,169948,69743],{},[78,169950,169951],{"class":124,"line":2443},[78,169952,69748],{},[78,169954,169955],{"class":124,"line":2448},[78,169956,15810],{},[78,169958,169959],{"class":124,"line":2454},[78,169960,69757],{},[78,169962,169963],{"class":124,"line":2460},[78,169964,69762],{},[78,169966,169967],{"class":124,"line":2465},[78,169968,69767],{},[78,169970,169971],{"class":124,"line":2470},[78,169972,69772],{},[78,169974,169975],{"class":124,"line":2903},[78,169976,15810],{},[78,169978,169979],{"class":124,"line":2909},[78,169980,69781],{},[78,169982,169983],{"class":124,"line":11477},[78,169984,69786],{},[78,169986,169987],{"class":124,"line":13374},[78,169988,69791],{},[78,169990,169991],{"class":124,"line":13380},[78,169992,69796],{},[78,169994,169995],{"class":124,"line":13386},[78,169996,69801],{},[78,169998,169999],{"class":124,"line":13722},[78,170000,69806],{},[78,170002,170003],{"class":124,"line":13727},[78,170004,15810],{},[78,170006,170007],{"class":124,"line":13953},[78,170008,23518],{},[10548,170010,69818],{"id":69817},[13,170012,69821,170013],{},[5009,170014,69824],{"href":69824,"rel":170015},[23647],[13,170017,69828],{},[13,170019,170020],{},[22,170021,69833],{},[114,170023,170024],{"className":23406,"code":69836,"language":23408,"meta":119,"style":119},[17,170025,170026,170030,170034,170038,170042,170046,170050,170054,170058,170062,170066,170070,170074,170078,170082,170086,170090,170094,170098,170102,170106,170110,170114,170118,170122,170126,170130,170134],{"__ignoreMap":119},[78,170027,170028],{"class":124,"line":125},[78,170029,69843],{},[78,170031,170032],{"class":124,"line":132},[78,170033,69518],{},[78,170035,170036],{"class":124,"line":138},[78,170037,69852],{},[78,170039,170040],{"class":124,"line":144},[78,170041,69857],{},[78,170043,170044],{"class":124,"line":150},[78,170045,69862],{},[78,170047,170048],{"class":124,"line":156},[78,170049,69867],{},[78,170051,170052],{"class":124,"line":162},[78,170053,69872],{},[78,170055,170056],{"class":124,"line":168},[78,170057,69877],{},[78,170059,170060],{"class":124,"line":174},[78,170061,69882],{},[78,170063,170064],{"class":124,"line":180},[78,170065,69887],{},[78,170067,170068],{"class":124,"line":186},[78,170069,69892],{},[78,170071,170072],{"class":124,"line":192},[78,170073,69897],{},[78,170075,170076],{"class":124,"line":198},[78,170077,69902],{},[78,170079,170080],{"class":124,"line":204},[78,170081,69907],{},[78,170083,170084],{"class":124,"line":210},[78,170085,15810],{},[78,170087,170088],{"class":124,"line":216},[78,170089,23518],{},[78,170091,170092],{"class":124,"line":222},[78,170093,69920],{},[78,170095,170096],{"class":124,"line":421},[78,170097,69925],{},[78,170099,170100],{"class":124,"line":427},[78,170101,69748],{},[78,170103,170104],{"class":124,"line":433},[78,170105,15810],{},[78,170107,170108],{"class":124,"line":2443},[78,170109,69938],{},[78,170111,170112],{"class":124,"line":2448},[78,170113,69943],{},[78,170115,170116],{"class":124,"line":2454},[78,170117,15810],{},[78,170119,170120],{"class":124,"line":2460},[78,170121,69952],{},[78,170123,170124],{"class":124,"line":2465},[78,170125,69957],{},[78,170127,170128],{"class":124,"line":2470},[78,170129,69962],{},[78,170131,170132],{"class":124,"line":2903},[78,170133,69967],{},[78,170135,170136],{"class":124,"line":2909},[78,170137,23518],{},[7759,170139,69975],{"id":69974},[10548,170141,69979],{"id":69978},[13,170143,69982],{},[10548,170145,69986],{"id":69985},[72,170147,170148,170150],{},[13,170149,69991],{},[13,170151,69994],{},[10548,170153,69998],{"id":69997},[13,170155,170156],{},[22,170157,70003],{},[49,170159,170160,170162],{},[52,170161,70008],{},[52,170163,70011],{},[13,170165,170166],{},[22,170167,70016],{},[49,170169,170170,170172],{},[52,170171,70021],{},[52,170173,70024],{},[7759,170175,70028],{"id":70027},[10548,170177,70032],{"id":70031},[13,170179,70035],{},[13,170181,70038],{},[10548,170183,70042],{"id":70041},[13,170185,70045],{},[10548,170187,70049],{"id":70048},[49,170189,170190,170192,170194],{},[52,170191,70054],{},[52,170193,70057],{},[52,170195,70060],{},[23289,170197],{},[107,170199,70066],{"id":70065},[7759,170201,70070],{"id":70069},[13,170203,170204],{},[22,170205,70075],{},[13,170207,70078],{},[13,170209,70081],{},[49,170211,170212,170216,170220],{},[52,170213,170214,70089],{},[22,170215,70088],{},[52,170217,170218,70095],{},[22,170219,70094],{},[52,170221,170222,70101],{},[22,170223,70100],{},[13,170225,70104],{},[72,170227,170228],{},[13,170229,70109],{},[7759,170231,70113],{"id":70112},[49,170233,170234,170238,170242,170246],{},[52,170235,170236,70121],{},[22,170237,70120],{},[52,170239,170240,70127],{},[22,170241,70126],{},[52,170243,170244,70133],{},[22,170245,70132],{},[52,170247,170248,70139],{},[22,170249,70138],{},[7759,170251,70143],{"id":70142},[10548,170253,70147],{"id":70146},[13,170255,70150,170256,70154],{},[22,170257,70153],{},[13,170259,70157],{},[13,170261,170262],{},[617,170263],{"alt":119,"src":29839},[10548,170265,70165],{"id":70164},[13,170267,70168],{},[49,170269,170270,170272,170274,170276,170282],{},[52,170271,70173],{},[52,170273,70176],{},[52,170275,70179],{},[52,170277,70182,170278,70186,170280,67],{},[78,170279,70185],{},[78,170281,70189],{},[52,170283,70192,170284,70196],{},[78,170285,70195],{},[7759,170287,70200],{"id":70199},[13,170289,70203],{},[13,170291,170292,70209],{},[22,170293,70208],{},[10548,170295,70213],{"id":70212},[13,170297,70216],{},[13,170299,70219],{},[49,170301,170302,170304,170306,170308],{},[52,170303,70224],{},[52,170305,70227],{},[52,170307,70230],{},[52,170309,70233],{},[10548,170311,70237],{"id":70236},[13,170313,70240],{},[114,170315,170316],{"className":70243,"code":70244,"language":70245,"meta":119,"style":119},[17,170317,170318,170322,170326,170330,170334,170338,170342,170346,170350,170354,170358,170362,170366,170370,170374,170378,170382,170386,170390,170394,170398,170402,170406,170410,170414,170418,170422,170426,170430,170434,170438,170442],{"__ignoreMap":119},[78,170319,170320],{"class":124,"line":125},[78,170321,70252],{},[78,170323,170324],{"class":124,"line":132},[78,170325,70257],{},[78,170327,170328],{"class":124,"line":138},[78,170329,70262],{},[78,170331,170332],{"class":124,"line":144},[78,170333,129],{"emptyLinePlaceholder":128},[78,170335,170336],{"class":124,"line":150},[78,170337,70271],{},[78,170339,170340],{"class":124,"line":156},[78,170341,70276],{},[78,170343,170344],{"class":124,"line":162},[78,170345,70281],{},[78,170347,170348],{"class":124,"line":168},[78,170349,70286],{},[78,170351,170352],{"class":124,"line":174},[78,170353,70291],{},[78,170355,170356],{"class":124,"line":180},[78,170357,129],{"emptyLinePlaceholder":128},[78,170359,170360],{"class":124,"line":186},[78,170361,70300],{},[78,170363,170364],{"class":124,"line":192},[78,170365,70305],{},[78,170367,170368],{"class":124,"line":198},[78,170369,70310],{},[78,170371,170372],{"class":124,"line":204},[78,170373,70315],{},[78,170375,170376],{"class":124,"line":210},[78,170377,70310],{},[78,170379,170380],{"class":124,"line":216},[78,170381,70324],{},[78,170383,170384],{"class":124,"line":222},[78,170385,70329],{},[78,170387,170388],{"class":124,"line":421},[78,170389,70334],{},[78,170391,170392],{"class":124,"line":427},[78,170393,70310],{},[78,170395,170396],{"class":124,"line":433},[78,170397,129],{"emptyLinePlaceholder":128},[78,170399,170400],{"class":124,"line":2443},[78,170401,70347],{},[78,170403,170404],{"class":124,"line":2448},[78,170405,70352],{},[78,170407,170408],{"class":124,"line":2454},[78,170409,70357],{},[78,170411,170412],{"class":124,"line":2460},[78,170413,70362],{},[78,170415,170416],{"class":124,"line":2465},[78,170417,70367],{},[78,170419,170420],{"class":124,"line":2470},[78,170421,70372],{},[78,170423,170424],{"class":124,"line":2903},[78,170425,70377],{},[78,170427,170428],{"class":124,"line":2909},[78,170429,70372],{},[78,170431,170432],{"class":124,"line":11477},[78,170433,70386],{},[78,170435,170436],{"class":124,"line":13374},[78,170437,70391],{},[78,170439,170440],{"class":124,"line":13380},[78,170441,70396],{},[78,170443,170444],{"class":124,"line":13386},[78,170445,70372],{},[10548,170447,70404],{"id":70403},[13,170449,70407,170450],{},[22,170451,70410],{},[13,170453,70413],{},[114,170455,170456],{"className":70243,"code":70416,"language":70245,"meta":119,"style":119},[17,170457,170458,170462,170466,170470,170474,170478,170482,170486,170490,170494,170498,170502],{"__ignoreMap":119},[78,170459,170460],{"class":124,"line":125},[78,170461,70423],{},[78,170463,170464],{"class":124,"line":132},[78,170465,70428],{},[78,170467,170468],{"class":124,"line":138},[78,170469,70433],{},[78,170471,170472],{"class":124,"line":144},[78,170473,70438],{},[78,170475,170476],{"class":124,"line":150},[78,170477,70433],{},[78,170479,170480],{"class":124,"line":156},[78,170481,70447],{},[78,170483,170484],{"class":124,"line":162},[78,170485,70452],{},[78,170487,170488],{"class":124,"line":168},[78,170489,70457],{},[78,170491,170492],{"class":124,"line":174},[78,170493,70462],{},[78,170495,170496],{"class":124,"line":180},[78,170497,70433],{},[78,170499,170500],{"class":124,"line":186},[78,170501,70471],{},[78,170503,170504],{"class":124,"line":192},[78,170505,70476],{},[10548,170507,70480],{"id":70479},[13,170509,70483],{},[114,170511,170512],{"className":70243,"code":70486,"language":70245,"meta":119,"style":119},[17,170513,170514,170518,170522,170526,170530,170534,170538,170542],{"__ignoreMap":119},[78,170515,170516],{"class":124,"line":125},[78,170517,70493],{},[78,170519,170520],{"class":124,"line":132},[78,170521,70498],{},[78,170523,170524],{"class":124,"line":138},[78,170525,129],{"emptyLinePlaceholder":128},[78,170527,170528],{"class":124,"line":144},[78,170529,70507],{},[78,170531,170532],{"class":124,"line":150},[78,170533,70512],{},[78,170535,170536],{"class":124,"line":156},[78,170537,129],{"emptyLinePlaceholder":128},[78,170539,170540],{"class":124,"line":162},[78,170541,70521],{},[78,170543,170544],{"class":124,"line":168},[78,170545,70526],{},[10548,170547,70530],{"id":70529},[13,170549,170550],{},[22,170551,70535],{},[72,170553,170554],{},[13,170555,70540],{},[114,170557,170558],{"className":70243,"code":70543,"language":70245,"meta":119,"style":119},[17,170559,170560,170564,170568,170572,170576,170580,170584,170588,170592,170596,170600,170604,170608,170612,170616,170620],{"__ignoreMap":119},[78,170561,170562],{"class":124,"line":125},[78,170563,70550],{},[78,170565,170566],{"class":124,"line":132},[78,170567,70555],{},[78,170569,170570],{"class":124,"line":138},[78,170571,70560],{},[78,170573,170574],{"class":124,"line":144},[78,170575,70565],{},[78,170577,170578],{"class":124,"line":150},[78,170579,70570],{},[78,170581,170582],{"class":124,"line":156},[78,170583,70498],{},[78,170585,170586],{"class":124,"line":162},[78,170587,70579],{},[78,170589,170590],{"class":124,"line":168},[78,170591,70584],{},[78,170593,170594],{"class":124,"line":174},[78,170595,129],{"emptyLinePlaceholder":128},[78,170597,170598],{"class":124,"line":180},[78,170599,70593],{},[78,170601,170602],{"class":124,"line":186},[78,170603,70579],{},[78,170605,170606],{"class":124,"line":192},[78,170607,70584],{},[78,170609,170610],{"class":124,"line":198},[78,170611,70606],{},[78,170613,170614],{"class":124,"line":204},[78,170615,70498],{},[78,170617,170618],{"class":124,"line":210},[78,170619,129],{"emptyLinePlaceholder":128},[78,170621,170622],{"class":124,"line":216},[78,170623,70619],{},[7759,170625,70623],{"id":70622},[10548,170627,70627],{"id":70626},[13,170629,70630],{},[13,170631,70633],{},[13,170633,70636],{},[13,170635,70639,170636],{},[22,170637,70642],{},[10548,170639,70646],{"id":70645},[49,170641,170642,170644,170646,170648,170650,170652,170654],{},[52,170643,70651],{},[52,170645,70654],{},[52,170647,70657],{},[52,170649,70660],{},[52,170651,70663],{},[52,170653,70666],{},[52,170655,70669],{},[10548,170657,70673],{"id":70672},[13,170659,170660],{},[22,170661,70678],{},[49,170663,170664,170666],{},[52,170665,70683],{},[52,170667,70686],{},[13,170669,170670],{},[22,170671,70691],{},[49,170673,170674,170676,170678,170680],{},[52,170675,70696],{},[52,170677,70699],{},[52,170679,70702],{},[52,170681,70705],{},[13,170683,170684],{},[22,170685,70710],{},[49,170687,170688,170692],{},[52,170689,70715,170690],{},[78,170691,70195],{},[52,170693,70720,170694,70723],{},[78,170695,70195],{},[10548,170697,70727],{"id":70726},[13,170699,170700],{},[617,170701],{"alt":119,"src":62233},[7759,170703,70735],{"id":70734},[13,170705,70738,170706,70742],{},[22,170707,70741],{},[10548,170709,70746,170710],{"id":70745},[78,170711,70749],{},[72,170713,170714],{},[13,170715,70754],{},[114,170717,170718],{"className":70243,"code":70757,"language":70245,"meta":119,"style":119},[17,170719,170720,170724,170728,170732,170736,170740,170744,170748,170752,170756,170760,170764,170768,170772],{"__ignoreMap":119},[78,170721,170722],{"class":124,"line":125},[78,170723,70764],{},[78,170725,170726],{"class":124,"line":132},[78,170727,70257],{},[78,170729,170730],{"class":124,"line":138},[78,170731,70773],{},[78,170733,170734],{"class":124,"line":144},[78,170735,129],{"emptyLinePlaceholder":128},[78,170737,170738],{"class":124,"line":150},[78,170739,70782],{},[78,170741,170742],{"class":124,"line":156},[78,170743,70787],{},[78,170745,170746],{"class":124,"line":162},[78,170747,70792],{},[78,170749,170750],{"class":124,"line":168},[78,170751,70797],{},[78,170753,170754],{"class":124,"line":174},[78,170755,129],{"emptyLinePlaceholder":128},[78,170757,170758],{"class":124,"line":180},[78,170759,70806],{},[78,170761,170762],{"class":124,"line":186},[78,170763,70811],{},[78,170765,170766],{"class":124,"line":192},[78,170767,129],{"emptyLinePlaceholder":128},[78,170769,170770],{"class":124,"line":198},[78,170771,70820],{},[78,170773,170774],{"class":124,"line":204},[78,170775,70825],{},[10548,170777,70829,170778],{"id":70828},[78,170779,70832],{},[72,170781,170782],{},[13,170783,70837],{},[13,170785,70840],{},[114,170787,170788],{"className":23406,"code":70843,"language":23408,"meta":119,"style":119},[17,170789,170790,170794,170798,170802,170806,170810,170814,170818,170822,170826,170830,170834,170838,170842,170846,170850,170854,170858,170862,170866,170870,170874,170878,170882,170886,170890,170894,170898,170902,170906,170910,170914,170918],{"__ignoreMap":119},[78,170791,170792],{"class":124,"line":125},[78,170793,70850],{},[78,170795,170796],{"class":124,"line":132},[78,170797,70855],{},[78,170799,170800],{"class":124,"line":138},[78,170801,70860],{},[78,170803,170804],{"class":124,"line":144},[78,170805,70865],{},[78,170807,170808],{"class":124,"line":150},[78,170809,70870],{},[78,170811,170812],{"class":124,"line":156},[78,170813,70875],{},[78,170815,170816],{"class":124,"line":162},[78,170817,70880],{},[78,170819,170820],{"class":124,"line":168},[78,170821,70885],{},[78,170823,170824],{"class":124,"line":174},[78,170825,70890],{},[78,170827,170828],{"class":124,"line":180},[78,170829,70895],{},[78,170831,170832],{"class":124,"line":186},[78,170833,70900],{},[78,170835,170836],{"class":124,"line":192},[78,170837,70905],{},[78,170839,170840],{"class":124,"line":198},[78,170841,70910],{},[78,170843,170844],{"class":124,"line":204},[78,170845,6942],{},[78,170847,170848],{"class":124,"line":210},[78,170849,70919],{},[78,170851,170852],{"class":124,"line":216},[78,170853,70924],{},[78,170855,170856],{"class":124,"line":222},[78,170857,70929],{},[78,170859,170860],{"class":124,"line":421},[78,170861,70934],{},[78,170863,170864],{"class":124,"line":427},[78,170865,15810],{},[78,170867,170868],{"class":124,"line":433},[78,170869,6942],{},[78,170871,170872],{"class":124,"line":2443},[78,170873,70947],{},[78,170875,170876],{"class":124,"line":2448},[78,170877,70952],{},[78,170879,170880],{"class":124,"line":2454},[78,170881,70957],{},[78,170883,170884],{"class":124,"line":2460},[78,170885,70962],{},[78,170887,170888],{"class":124,"line":2465},[78,170889,15810],{},[78,170891,170892],{"class":124,"line":2470},[78,170893,6942],{},[78,170895,170896],{"class":124,"line":2903},[78,170897,70975],{},[78,170899,170900],{"class":124,"line":2909},[78,170901,70980],{},[78,170903,170904],{"class":124,"line":11477},[78,170905,15810],{},[78,170907,170908],{"class":124,"line":13374},[78,170909,6942],{},[78,170911,170912],{"class":124,"line":13380},[78,170913,70993],{},[78,170915,170916],{"class":124,"line":13386},[78,170917,70998],{},[78,170919,170920],{"class":124,"line":13722},[78,170921,23518],{},[7759,170923,71006],{"id":71005},[2285,170925,170926,170928,170930,170932,170934,170936,170938,170940,170942],{},[52,170927,71011],{},[52,170929,71014],{},[52,170931,71017],{},[52,170933,71020],{},[52,170935,71023],{},[52,170937,71026],{},[52,170939,71029],{},[52,170941,71032],{},[52,170943,71035],{},[226,170945,228],{},{"title":119,"searchDepth":144,"depth":144,"links":170947},[170948,170954,170961],{"id":68537,"depth":132,"text":68538,"children":170949},[170950,170951,170952,170953],{"id":68541,"depth":144,"text":68542},{"id":68569,"depth":144,"text":68570},{"id":68636,"depth":144,"text":68637},{"id":68679,"depth":144,"text":68680},{"id":68813,"depth":132,"text":68814,"children":170955},[170956,170957,170958,170959,170960],{"id":68817,"depth":144,"text":68818},{"id":68959,"depth":144,"text":68960},{"id":69623,"depth":144,"text":69624},{"id":69974,"depth":144,"text":69975},{"id":70027,"depth":144,"text":70028},{"id":70065,"depth":132,"text":70066,"children":170962},[170963,170964,170965,170966,170967,170968,170969],{"id":70069,"depth":144,"text":70070},{"id":70112,"depth":144,"text":70113},{"id":70142,"depth":144,"text":70143},{"id":70199,"depth":144,"text":70200},{"id":70622,"depth":144,"text":70623},{"id":70734,"depth":144,"text":70735},{"id":71005,"depth":144,"text":71006},{},{"title":68517,"description":119},[7744,246,23378,10715,6380,35725],{"id":71070,"title":71071,"assetBase":239,"author":8,"body":170974,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":171510,"navigation":128,"originalPath":71829,"path":71830,"seo":171511,"source":23330,"stem":71832,"tags":171512,"weight":250,"__hash__":71834},{"type":10,"value":170975,"toc":171503},[170976,170978,170990,170992,170996,171000,171004,171006,171008,171012,171014,171018,171020,171024,171026,171030,171032,171036,171038,171042,171044,171046,171050,171052,171056,171060,171064,171068,171070,171072,171074,171079,171084,171088,171090,171092,171096,171098,171100,171105,171110,171112,171114,171116,171120,171122,171126,171128,171132,171134,171136,171138,171140,171142,171144,171146,171148,171152,171154,171158,171160,171164,171166,171170,171172,171176,171178,171183,171185,171189,171194,171196,171200,171202,171204,171206,171211,171215,171217,171221,171226,171231,171235,171237,171239,171241,171245,171247,171251,171255,171257,171261,171263,171267,171269,171271,171275,171282,171284,171286,171290,171292,171296,171298,171302,171304,171308,171310,171314,171316,171320,171328,171336,171338,171340,171344,171346,171348,171355,171359,171361,171365,171367,171371,171375,171377,171381,171383,171387,171389,171391,171395,171397,171401,171403,171409,171411,171415,171417,171421,171423,171434,171438,171440,171444,171448,171450,171452,171456,171460,171462,171464,171468,171472,171476,171478,171482,171487,171491,171493,171497,171501],[4517,170977,71076],{"id":71076},[72,170979,170980,170984,170986,170988],{},[13,170981,170982],{},[22,170983,71083],{},[13,170985,71086],{},[13,170987,71089],{},[13,170989,71092],{},[107,170991,71096],{"id":71095},[13,170993,170994],{},[22,170995,71101],{},[13,170997,170998],{},[617,170999],{"alt":119,"src":29434},[13,171001,71108,171002,71112],{},[17,171003,71111],{},[13,171005,71115],{},[13,171007,71118],{},[13,171009,171010],{},[617,171011],{"alt":119,"src":33078},[13,171013,71125],{},[13,171015,171016],{},[617,171017],{"alt":119,"src":71130},[13,171019,71133],{},[13,171021,171022],{},[617,171023],{"alt":119,"src":71138},[13,171025,71141],{},[13,171027,171028],{},[617,171029],{"alt":119,"src":71146},[13,171031,71149],{},[13,171033,171034],{},[617,171035],{"alt":119,"src":71154},[13,171037,71157],{},[13,171039,171040],{},[617,171041],{"alt":119,"src":71162},[13,171043,71165],{},[13,171045,71168],{},[13,171047,171048],{},[617,171049],{"alt":119,"src":30426},[13,171051,71175],{},[13,171053,171054],{},[617,171055],{"alt":119,"src":71180},[13,171057,171058],{},[22,171059,71185],{},[13,171061,171062],{},[22,171063,71190],{},[13,171065,171066],{},[617,171067],{"alt":119,"src":71195},[13,171069,71198],{},[13,171071,71201],{},[13,171073,71204],{},[13,171075,71207,171076,71213],{},[5009,171077,71212],{"href":71210,"rel":171078},[23647],[13,171080,71216,171081,71222],{},[5009,171082,71221],{"href":71219,"rel":171083},[23647],[13,171085,171086],{},[617,171087],{"alt":119,"src":71227},[13,171089,71230],{},[107,171091,71234],{"id":71233},[13,171093,171094],{},[22,171095,71239],{},[13,171097,71242],{},[13,171099,71245],{},[13,171101,71248,171102,71254],{},[5009,171103,71253],{"href":71251,"rel":171104},[23647],[13,171106,71248,171107,71262],{},[5009,171108,71261],{"href":71259,"rel":171109},[23647],[13,171111,71265],{},[13,171113,71268],{},[13,171115,71271],{},[13,171117,171118],{},[617,171119],{"alt":119,"src":30562},[13,171121,71278],{},[13,171123,171124],{},[617,171125],{"alt":119,"src":65400},[13,171127,71285],{},[13,171129,171130],{},[617,171131],{"alt":119,"src":68935},[13,171133,71292],{},[13,171135,71295],{},[13,171137,71298],{},[13,171139,71301],{},[13,171141,71304],{},[13,171143,71307],{},[13,171145,71310],{},[13,171147,71313],{},[13,171149,171150],{},[617,171151],{"alt":119,"src":71318},[13,171153,71321],{},[13,171155,171156],{},[617,171157],{"alt":119,"src":71326},[13,171159,71329],{},[13,171161,171162],{},[617,171163],{"alt":119,"src":71334},[107,171165,71338],{"id":71337},[13,171167,171168],{},[22,171169,71343],{},[13,171171,71346],{},[13,171173,171174],{},[617,171175],{"alt":119,"src":29839},[13,171177,71353],{},[13,171179,71356,171180,71362],{},[5009,171181,71361],{"href":71359,"rel":171182},[23647],[13,171184,71365],{},[13,171186,171187],{},[617,171188],{"alt":119,"src":62233},[13,171190,71372,171191,71378],{},[5009,171192,71377],{"href":71375,"rel":171193},[23647],[13,171195,71381],{},[13,171197,171198],{},[22,171199,71386],{},[13,171201,71389],{},[13,171203,71392],{},[13,171205,71395],{},[13,171207,71398,171208,71404],{},[5009,171209,71403],{"href":71401,"rel":171210},[23647],[13,171212,171213],{},[617,171214],{"alt":119,"src":71409},[13,171216,71412],{},[13,171218,171219],{},[617,171220],{"alt":119,"src":71417},[13,171222,71420,171223,71426],{},[5009,171224,71425],{"href":71423,"rel":171225},[23647],[13,171227,71429,171228,71435],{},[5009,171229,71434],{"href":71432,"rel":171230},[23647],[13,171232,171233],{},[617,171234],{"alt":119,"src":71440},[13,171236,71443],{},[13,171238,71446],{},[13,171240,71449],{},[13,171242,171243],{},[22,171244,71454],{},[13,171246,71457],{},[13,171248,171249],{},[617,171250],{"alt":119,"src":71462},[13,171252,71465,171253,71469],{},[78,171254,71468],{},[13,171256,71472],{},[13,171258,171259],{},[617,171260],{"alt":119,"src":71477},[13,171262,71480],{},[13,171264,171265],{},[617,171266],{"alt":119,"src":71485},[13,171268,71488],{},[13,171270,71491],{},[13,171272,171273],{},[617,171274],{"alt":119,"src":71496},[13,171276,71499,171277,71505,171280,71508],{},[5009,171278,71504],{"href":71502,"rel":171279},[23647],[78,171281,71468],{},[13,171283,71511],{},[107,171285,71515],{"id":71514},[13,171287,171288],{},[22,171289,71520],{},[13,171291,71523],{},[13,171293,171294],{},[617,171295],{"alt":119,"src":30157},[13,171297,71530],{},[13,171299,171300],{},[617,171301],{"alt":119,"src":30871},[13,171303,71537],{},[13,171305,171306],{},[617,171307],{"alt":119,"src":30924},[13,171309,71544],{},[13,171311,171312],{},[617,171313],{"alt":119,"src":30959},[13,171315,71551],{},[13,171317,171318],{},[617,171319],{"alt":119,"src":66059},[13,171321,71558,171322,71564,171325,71570],{},[5009,171323,71563],{"href":71561,"rel":171324},[23647],[5009,171326,71569],{"href":71567,"rel":171327},[23647],[13,171329,71573,171330,71579,171333,71585],{},[5009,171331,71578],{"href":71576,"rel":171332},[23647],[5009,171334,71584],{"href":71582,"rel":171335},[23647],[13,171337,71588],{},[13,171339,71591],{},[13,171341,171342],{},[22,171343,71596],{},[13,171345,71599],{},[13,171347,71602],{},[13,171349,71605,171350,71609,171352,71615],{},[22,171351,71608],{},[5009,171353,71614],{"href":71612,"rel":171354},[23647],[13,171356,171357],{},[617,171358],{"alt":119,"src":71620},[13,171360,71623],{},[13,171362,171363],{},[617,171364],{"alt":119,"src":71628},[13,171366,71631],{},[13,171368,171369],{},[617,171370],{"alt":119,"src":71636},[13,171372,171373],{},[617,171374],{"alt":119,"src":71641},[13,171376,71644],{},[13,171378,171379],{},[617,171380],{"alt":119,"src":71649},[13,171382,71652],{},[13,171384,171385],{},[617,171386],{"alt":119,"src":71657},[13,171388,71660],{},[13,171390,71663],{},[13,171392,171393],{},[617,171394],{"alt":119,"src":71668},[13,171396,71671],{},[13,171398,171399],{},[617,171400],{"alt":119,"src":71676},[13,171402,71679],{},[49,171404,171405,171407],{},[52,171406,71684],{},[52,171408,71687],{},[13,171410,71690],{},[13,171412,171413],{},[617,171414],{"alt":119,"src":71695},[107,171416,71699],{"id":71698},[13,171418,171419],{},[22,171420,71704],{},[13,171422,71707],{},[13,171424,71710,171425,71716,171428,52204,171431,71727],{},[5009,171426,71715],{"href":71713,"rel":171427},[23647],[5009,171429,71721],{"href":71719,"rel":171430},[23647],[5009,171432,71726],{"href":71724,"rel":171433},[23647],[13,171435,171436],{},[617,171437],{"alt":119,"src":66141},[13,171439,71734],{},[13,171441,171442],{},[617,171443],{"alt":119,"src":71739},[13,171445,171446],{},[617,171447],{"alt":119,"src":71744},[13,171449,71747],{},[13,171451,71750],{},[13,171453,171454],{},[617,171455],{"alt":119,"src":71755},[13,171457,171458],{},[617,171459],{"alt":119,"src":71760},[13,171461,71763],{},[13,171463,71766],{},[13,171465,171466],{},[617,171467],{"alt":119,"src":71771},[13,171469,171470],{},[617,171471],{"alt":119,"src":71776},[13,171473,71779,171474,67],{},[22,171475,71782],{},[13,171477,71785],{},[13,171479,171480],{},[617,171481],{"alt":119,"src":71790},[13,171483,71793,171484,71799],{},[5009,171485,71798],{"href":71796,"rel":171486},[23647],[13,171488,171489],{},[617,171490],{"alt":119,"src":71804},[13,171492,71807],{},[13,171494,171495],{},[617,171496],{"alt":119,"src":71812},[13,171498,171499],{},[617,171500],{"alt":119,"src":71817},[13,171502,71820],{},{"title":119,"searchDepth":144,"depth":144,"links":171504},[171505,171506,171507,171508,171509],{"id":71095,"depth":132,"text":71096},{"id":71233,"depth":132,"text":71234},{"id":71337,"depth":132,"text":71338},{"id":71514,"depth":132,"text":71515},{"id":71698,"depth":132,"text":71699},{},{"title":71071,"description":119},[14541,7744,246,14542,23333],{"id":71836,"title":71837,"assetBase":239,"author":8,"body":171514,"category":23323,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":171530,"navigation":128,"originalPath":71861,"path":71862,"seo":171531,"source":23330,"stem":71864,"tags":171532,"weight":250,"__hash__":71866},{"type":10,"value":171515,"toc":171526},[171516,171518,171520,171522,171524],[4517,171517,71843],{"id":71842},[7759,171519,71846],{"id":71846},[13,171521,71849],{},[7759,171523,71852],{"id":71852},[13,171525,71855],{},{"title":119,"searchDepth":144,"depth":144,"links":171527},[171528,171529],{"id":71846,"depth":144,"text":71846},{"id":71852,"depth":144,"text":71852},{},{"title":71837,"description":119},[23333],{"id":71868,"title":71869,"assetBase":239,"author":8,"body":171534,"category":25506,"collection":23324,"date":23325,"description":71878,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":171824,"navigation":128,"originalPath":72316,"path":72317,"seo":171825,"source":23330,"stem":72319,"tags":171826,"weight":250,"__hash__":72321},{"type":10,"value":171535,"toc":171803},[171536,171538,171540,171542,171544,171546,171548,171550,171552,171554,171556,171558,171563,171565,171567,171569,171571,171573,171575,171577,171579,171581,171583,171587,171591,171595,171597,171601,171611,171613,171615,171617,171619,171621,171623,171625,171627,171633,171635,171637,171639,171651,171653,171655,171659,171661,171663,171665,171667,171671,171681,171683,171685,171693,171695,171703,171705,171707,171713,171715,171717,171719,171721,171723,171725,171733,171735,171737,171739,171741,171743,171745,171747,171759,171761,171763,171765,171767,171773,171775,171777,171779,171781,171783,171785,171799,171801],[4517,171537,71875],{"id":71874},[13,171539,71878],{},[13,171541,71881],{},[13,171543,71884],{},[13,171545,71887],{},[13,171547,71890],{},[13,171549,71893],{},[13,171551,71896],{},[13,171553,71899],{},[13,171555,71902],{},[13,171557,71905],{},[13,171559,71908,171560],{},[5009,171561,71911],{"href":71911,"rel":171562},[23647],[107,171564,71916],{"id":71915},[13,171566,71919],{},[13,171568,71922],{},[13,171570,71925],{},[7759,171572,71929],{"id":71928},[13,171574,71932],{},[7759,171576,71936],{"id":71935},[13,171578,71939],{},[107,171580,71943],{"id":71942},[7759,171582,71947],{"id":71946},[13,171584,71950,171585,71954],{},[78,171586,71953],{},[13,171588,171589],{},[617,171590],{"alt":71959,"src":71960},[13,171592,71963,171593,71967],{},[25921,171594,71966],{},[13,171596,71970],{},[13,171598,171599],{},[617,171600],{"alt":71975,"src":71976},[13,171602,71979,171603,71982,171605,71985,171607,71988,171609,71991],{},[25921,171604,469],{},[25921,171606,472],{},[25921,171608,469],{},[25921,171610,472],{},[13,171612,71994],{},[7759,171614,71998],{"id":71997},[13,171616,72001],{},[13,171618,72004],{},[13,171620,72007],{},[7759,171622,72011],{"id":72010},[13,171624,72014],{},[13,171626,72017],{},[13,171628,72020,171629,72024,171631,72027],{},[25921,171630,72023],{},[25921,171632,72023],{},[13,171634,72030],{},[7759,171636,72034],{"id":72033},[13,171638,72037],{},[49,171640,171641,171643,171645,171647,171649],{},[52,171642,72042],{},[52,171644,72045],{},[52,171646,72048],{},[52,171648,72051],{},[52,171650,72054],{},[107,171652,72058],{"id":72057},[13,171654,72061],{},[13,171656,171657],{},[617,171658],{"alt":72066,"src":72067},[7759,171660,72071],{"id":72070},[13,171662,72074],{},[10548,171664,72078],{"id":72077},[13,171666,72081],{},[13,171668,171669],{},[617,171670],{"alt":72086,"src":72087},[49,171672,171673,171675,171677,171679],{},[52,171674,72092],{},[52,171676,72095],{},[52,171678,72098],{},[52,171680,72101],{},[10548,171682,72105],{"id":72104},[13,171684,72108],{},[49,171686,171687,171689],{},[52,171688,72113],{},[52,171690,72116,171691,72119],{},[25921,171692,472],{},[13,171694,72122],{},[49,171696,171697,171699,171701],{},[52,171698,72127],{},[52,171700,72130],{},[52,171702,72133],{},[10548,171704,72137],{"id":72136},[13,171706,72140],{},[49,171708,171709,171711],{},[52,171710,72145],{},[52,171712,72148],{},[7759,171714,72152],{"id":72151},[13,171716,72155],{},[10548,171718,72159],{"id":72158},[13,171720,72162],{},[10548,171722,72166],{"id":72165},[13,171724,72169],{},[49,171726,171727,171731],{},[52,171728,171729,72177],{},[22,171730,72176],{},[52,171732,72180],{},[10548,171734,72184],{"id":72183},[13,171736,72187],{},[10548,171738,72191],{"id":72190},[13,171740,72194],{},[13,171742,72197],{},[10548,171744,72201],{"id":72200},[13,171746,72204],{},[49,171748,171749,171751,171753,171755,171757],{},[52,171750,72209],{},[52,171752,72212],{},[52,171754,72215],{},[52,171756,72218],{},[52,171758,72221],{},[107,171760,72225],{"id":72224},[13,171762,72228],{},[13,171764,72231],{},[13,171766,72234],{},[13,171768,72237,171769,72241,171771,72245],{},[25921,171770,72240],{},[25921,171772,72244],{},[107,171774,72249],{"id":72248},[13,171776,72252],{},[107,171778,72256],{"id":72255},[13,171780,72259],{},[107,171782,72263],{"id":72262},[13,171784,72266],{},[49,171786,171787,171789,171791,171793,171795,171797],{},[52,171788,72271],{},[52,171790,72274],{},[52,171792,72277],{},[52,171794,72280],{},[52,171796,72283],{},[52,171798,72286],{},[107,171800,72290],{"id":72289},[13,171802,72293],{},{"title":119,"searchDepth":144,"depth":144,"links":171804},[171805,171809,171815,171819,171820,171821,171822,171823],{"id":71915,"depth":132,"text":71916,"children":171806},[171807,171808],{"id":71928,"depth":144,"text":71929},{"id":71935,"depth":144,"text":71936},{"id":71942,"depth":132,"text":71943,"children":171810},[171811,171812,171813,171814],{"id":71946,"depth":144,"text":71947},{"id":71997,"depth":144,"text":71998},{"id":72010,"depth":144,"text":72011},{"id":72033,"depth":144,"text":72034},{"id":72057,"depth":132,"text":72058,"children":171816},[171817,171818],{"id":72070,"depth":144,"text":72071},{"id":72151,"depth":144,"text":72152},{"id":72224,"depth":132,"text":72225},{"id":72248,"depth":132,"text":72249},{"id":72255,"depth":132,"text":72256},{"id":72262,"depth":132,"text":72263},{"id":72289,"depth":132,"text":72290},{},{"title":71869,"description":71878},[794,7744,246,6380,14542],{"id":72323,"title":72324,"assetBase":239,"author":8,"body":171828,"category":72563,"collection":72564,"date":72565,"description":72566,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":171992,"navigation":128,"originalPath":72568,"path":72569,"seo":171993,"source":23330,"stem":72571,"tags":171994,"weight":25298,"__hash__":72574},{"type":10,"value":171829,"toc":171980},[171830,171836,171838,171840,171844,171846,171848,171850,171854,171856,171858,171860,171862,171864,171866,171868,171870,171928,171932,171934,171936,171938,171948,171950,171952,171954,171956,171978],[72,171831,171832],{},[13,171833,72331,171834,72335],{},[17,171835,72334],{},[107,171837,72338],{"id":72338},[13,171839,72341],{},[13,171841,72344,171842,72348],{},[22,171843,72347],{},[13,171845,72351],{},[107,171847,72355],{"id":72354},[13,171849,72358],{},[72,171851,171852],{},[13,171853,72363],{},[13,171855,72366],{},[23090,171857,72370],{"id":72369},[13,171859,72373],{},[23090,171861,72377],{"id":72376},[13,171863,72380],{},[23090,171865,72384],{"id":72383},[13,171867,72387],{},[107,171869,72390],{"id":72390},[8366,171871,171872,171882],{},[8369,171873,171874],{},[8372,171875,171876,171878,171880],{},[8375,171877,72399],{},[8375,171879,72402],{},[8375,171881,72405],{},[8386,171883,171884,171895,171906,171917],{},[8372,171885,171886,171891,171893],{},[8391,171887,171888],{},[5009,171889,72416],{"href":72414,"rel":171890},[23647],[8391,171892,72419],{},[8391,171894,72422],{},[8372,171896,171897,171902,171904],{},[8391,171898,171899],{},[5009,171900,72431],{"href":72429,"rel":171901},[23647],[8391,171903,72434],{},[8391,171905,72437],{},[8372,171907,171908,171913,171915],{},[8391,171909,171910],{},[5009,171911,72446],{"href":72444,"rel":171912},[23647],[8391,171914,72449],{},[8391,171916,72452],{},[8372,171918,171919,171924,171926],{},[8391,171920,171921],{},[5009,171922,72461],{"href":72459,"rel":171923},[23647],[8391,171925,72464],{},[8391,171927,72467],{},[13,171929,72470,171930],{},[22,171931,72473],{},[107,171933,72477],{"id":72476},[13,171935,72480],{},[13,171937,72483],{},[49,171939,171940,171942,171944,171946],{},[52,171941,72488],{},[52,171943,72491],{},[52,171945,72494],{},[52,171947,72497],{},[107,171949,72501],{"id":72500},[13,171951,72504],{},[13,171953,72507],{},[107,171955,72510],{"id":72510},[49,171957,171958,171962,171966,171970,171974],{},[52,171959,171960,72519],{},[5009,171961,72518],{"href":72517},[52,171963,171964,72526],{},[5009,171965,72525],{"href":72524},[52,171967,171968,72533],{},[5009,171969,72532],{"href":72531},[52,171971,171972,72540],{},[5009,171973,72539],{"href":72538},[52,171975,171976,72547],{},[5009,171977,72546],{"href":72545},[13,171979,72550],{},{"title":119,"searchDepth":144,"depth":144,"links":171981},[171982,171983,171988,171989,171990,171991],{"id":72338,"depth":132,"text":72338},{"id":72354,"depth":132,"text":72355,"children":171984},[171985,171986,171987],{"id":72369,"depth":138,"text":72370},{"id":72376,"depth":138,"text":72377},{"id":72383,"depth":138,"text":72384},{"id":72390,"depth":132,"text":72390},{"id":72476,"depth":132,"text":72477},{"id":72500,"depth":132,"text":72501},{"id":72510,"depth":132,"text":72510},{},{"title":72324,"description":72566},[14968,9133,72573,14541,246,6380],{"id":72576,"title":72577,"assetBase":239,"author":8,"body":171996,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":172998,"navigation":128,"originalPath":73929,"path":73930,"seo":172999,"source":23330,"stem":73932,"tags":173000,"weight":250,"__hash__":73934},{"type":10,"value":171997,"toc":172964},[171998,172000,172002,172004,172006,172008,172018,172020,172022,172050,172052,172054,172056,172058,172060,172064,172066,172068,172072,172074,172076,172078,172080,172084,172086,172088,172092,172094,172096,172100,172188,172190,172192,172196,172198,172200,172202,172204,172344,172346,172358,172360,172364,172366,172526,172528,172530,172534,172536,172538,172542,172546,172548,172552,172554,172558,172560,172562,172566,172568,172570,172574,172576,172578,172580,172582,172584,172586,172591,172593,172598,172600,172606,172608,172612,172614,172618,172620,172622,172624,172626,172628,172630,172632,172636,172638,172640,172642,172646,172650,172654,172656,172660,172666,172670,172678,172680,172682,172684,172686,172688,172692,172694,172696,172704,172706,172708,172712,172716,172718,172722,172728,172732,172740,172742,172744,172746,172748,172752,172754,172756,172758,172760,172762,172766,172768,172770,172774,172778,172782,172792,172796,172798,172800,172802,172804,172806,172808,172810,172812,172814,172816,172820,172830,172832,172834,172836,172838,172840,172842,172844,172846,172848,172850,172852,172854,172856,172858,172860,172864,172868,172870,172880,172882,172884,172886,172890,172892,172894,172896,172898,172900,172902,172904,172906,172908,172910,172914,172916,172920,172922,172924,172928,172932,172934,172936,172940,172942,172946,172950,172952,172962],[4517,171999,72577],{"id":72582},[107,172001,72586],{"id":72585},[7759,172003,27767],{"id":27706},[10548,172005,72592],{"id":72591},[13,172007,72595],{},[49,172009,172010,172012,172014,172016],{},[52,172011,72600],{},[52,172013,72603],{},[52,172015,72606],{},[52,172017,72609],{},[10548,172019,72613],{"id":72612},[13,172021,72616],{},[49,172023,172024,172040],{},[52,172025,72621,172026],{},[49,172027,172028,172038],{},[52,172029,72626,172030],{},[49,172031,172032,172034,172036],{},[52,172033,72631],{},[52,172035,72634],{},[52,172037,72637],{},[52,172039,72640],{},[52,172041,72643,172042],{},[49,172043,172044,172046,172048],{},[52,172045,72648],{},[52,172047,72651],{},[52,172049,72654],{},[10548,172051,72658],{"id":72657},[13,172053,72661],{},[13,172055,72664],{},[7759,172057,72668],{"id":72667},[10548,172059,61907],{"id":61906},[13,172061,172062],{},[617,172063],{"alt":119,"src":30157},[10548,172065,72678],{"id":72677},[13,172067,72681],{},[13,172069,72684,172070],{},[22,172071,72687],{},[13,172073,72690],{},[7759,172075,72694],{"id":72693},[13,172077,72697],{},[10548,172079,72701],{"id":72700},[13,172081,172082],{},[617,172083],{"alt":119,"src":30871},[13,172085,72708],{},[10548,172087,72711],{"id":72711},[13,172089,172090],{},[617,172091],{"alt":119,"src":30924},[13,172093,72718],{},[7759,172095,72722],{"id":72721},[72,172097,172098],{},[13,172099,72727],{},[114,172101,172102],{"className":23406,"code":72730,"language":23408,"meta":119,"style":119},[17,172103,172104,172108,172112,172116,172120,172124,172128,172132,172136,172140,172144,172148,172152,172156,172160,172164,172168,172172,172176,172180,172184],{"__ignoreMap":119},[78,172105,172106],{"class":124,"line":125},[78,172107,72737],{},[78,172109,172110],{"class":124,"line":132},[78,172111,72742],{},[78,172113,172114],{"class":124,"line":138},[78,172115,72747],{},[78,172117,172118],{"class":124,"line":144},[78,172119,72752],{},[78,172121,172122],{"class":124,"line":150},[78,172123,72757],{},[78,172125,172126],{"class":124,"line":156},[78,172127,72762],{},[78,172129,172130],{"class":124,"line":162},[78,172131,72767],{},[78,172133,172134],{"class":124,"line":168},[78,172135,72772],{},[78,172137,172138],{"class":124,"line":174},[78,172139,72777],{},[78,172141,172142],{"class":124,"line":180},[78,172143,72782],{},[78,172145,172146],{"class":124,"line":186},[78,172147,72787],{},[78,172149,172150],{"class":124,"line":192},[78,172151,72792],{},[78,172153,172154],{"class":124,"line":198},[78,172155,72797],{},[78,172157,172158],{"class":124,"line":204},[78,172159,72802],{},[78,172161,172162],{"class":124,"line":210},[78,172163,72807],{},[78,172165,172166],{"class":124,"line":216},[78,172167,72812],{},[78,172169,172170],{"class":124,"line":222},[78,172171,72817],{},[78,172173,172174],{"class":124,"line":421},[78,172175,72822],{},[78,172177,172178],{"class":124,"line":427},[78,172179,72827],{},[78,172181,172182],{"class":124,"line":433},[78,172183,15810],{},[78,172185,172186],{"class":124,"line":2443},[78,172187,23518],{},[10548,172189,72838],{"id":72838},[13,172191,72841],{},[72,172193,172194],{},[13,172195,72846],{},[7759,172197,72850],{"id":72849},[10548,172199,72854],{"id":72853},[13,172201,72857],{},[13,172203,72860],{},[114,172205,172206],{"className":23406,"code":72863,"language":23408,"meta":119,"style":119},[17,172207,172208,172212,172216,172220,172224,172228,172232,172236,172240,172244,172248,172252,172256,172260,172264,172268,172272,172276,172280,172284,172288,172292,172296,172300,172304,172308,172312,172316,172320,172324,172328,172332,172336,172340],{"__ignoreMap":119},[78,172209,172210],{"class":124,"line":125},[78,172211,72870],{},[78,172213,172214],{"class":124,"line":132},[78,172215,72875],{},[78,172217,172218],{"class":124,"line":138},[78,172219,72880],{},[78,172221,172222],{"class":124,"line":144},[78,172223,72885],{},[78,172225,172226],{"class":124,"line":150},[78,172227,72890],{},[78,172229,172230],{"class":124,"line":156},[78,172231,72895],{},[78,172233,172234],{"class":124,"line":162},[78,172235,9615],{},[78,172237,172238],{"class":124,"line":168},[78,172239,72904],{},[78,172241,172242],{"class":124,"line":174},[78,172243,15810],{},[78,172245,172246],{"class":124,"line":180},[78,172247,12089],{},[78,172249,172250],{"class":124,"line":186},[78,172251,72917],{},[78,172253,172254],{"class":124,"line":192},[78,172255,72922],{},[78,172257,172258],{"class":124,"line":198},[78,172259,72927],{},[78,172261,172262],{"class":124,"line":204},[78,172263,72932],{},[78,172265,172266],{"class":124,"line":210},[78,172267,72937],{},[78,172269,172270],{"class":124,"line":216},[78,172271,72942],{},[78,172273,172274],{"class":124,"line":222},[78,172275,72947],{},[78,172277,172278],{"class":124,"line":421},[78,172279,72952],{},[78,172281,172282],{"class":124,"line":427},[78,172283,72957],{},[78,172285,172286],{"class":124,"line":433},[78,172287,72962],{},[78,172289,172290],{"class":124,"line":2443},[78,172291,72967],{},[78,172293,172294],{"class":124,"line":2448},[78,172295,72972],{},[78,172297,172298],{"class":124,"line":2454},[78,172299,72977],{},[78,172301,172302],{"class":124,"line":2460},[78,172303,72982],{},[78,172305,172306],{"class":124,"line":2465},[78,172307,72987],{},[78,172309,172310],{"class":124,"line":2470},[78,172311,10054],{},[78,172313,172314],{"class":124,"line":2903},[78,172315,72996],{},[78,172317,172318],{"class":124,"line":2909},[78,172319,73001],{},[78,172321,172322],{"class":124,"line":11477},[78,172323,73006],{},[78,172325,172326],{"class":124,"line":13374},[78,172327,73011],{},[78,172329,172330],{"class":124,"line":13380},[78,172331,73016],{},[78,172333,172334],{"class":124,"line":13386},[78,172335,15810],{},[78,172337,172338],{"class":124,"line":13722},[78,172339,73025],{},[78,172341,172342],{"class":124,"line":13727},[78,172343,23518],{},[13,172345,73032],{},[114,172347,172348],{"className":23406,"code":73035,"language":23408,"meta":119,"style":119},[17,172349,172350,172354],{"__ignoreMap":119},[78,172351,172352],{"class":124,"line":125},[78,172353,73042],{},[78,172355,172356],{"class":124,"line":132},[78,172357,73047],{},[10548,172359,73051],{"id":73050},[13,172361,172362],{},[22,172363,73056],{},[13,172365,73059],{},[114,172367,172368],{"className":23406,"code":73062,"language":23408,"meta":119,"style":119},[17,172369,172370,172374,172378,172382,172386,172390,172394,172398,172402,172406,172410,172414,172418,172422,172426,172430,172434,172438,172442,172446,172450,172454,172458,172462,172466,172470,172474,172478,172482,172486,172490,172494,172498,172502,172506,172510,172514,172518,172522],{"__ignoreMap":119},[78,172371,172372],{"class":124,"line":125},[78,172373,73069],{},[78,172375,172376],{"class":124,"line":132},[78,172377,73074],{},[78,172379,172380],{"class":124,"line":138},[78,172381,73079],{},[78,172383,172384],{"class":124,"line":144},[78,172385,73084],{},[78,172387,172388],{"class":124,"line":150},[78,172389,73089],{},[78,172391,172392],{"class":124,"line":156},[78,172393,129],{"emptyLinePlaceholder":128},[78,172395,172396],{"class":124,"line":162},[78,172397,73098],{},[78,172399,172400],{"class":124,"line":168},[78,172401,72742],{},[78,172403,172404],{"class":124,"line":174},[78,172405,73107],{},[78,172407,172408],{"class":124,"line":180},[78,172409,73112],{},[78,172411,172412],{"class":124,"line":186},[78,172413,73117],{},[78,172415,172416],{"class":124,"line":192},[78,172417,72762],{},[78,172419,172420],{"class":124,"line":198},[78,172421,73126],{},[78,172423,172424],{"class":124,"line":204},[78,172425,73131],{},[78,172427,172428],{"class":124,"line":210},[78,172429,73136],{},[78,172431,172432],{"class":124,"line":216},[78,172433,73141],{},[78,172435,172436],{"class":124,"line":222},[78,172437,73146],{},[78,172439,172440],{"class":124,"line":421},[78,172441,73151],{},[78,172443,172444],{"class":124,"line":427},[78,172445,73156],{},[78,172447,172448],{"class":124,"line":433},[78,172449,73161],{},[78,172451,172452],{"class":124,"line":2443},[78,172453,73166],{},[78,172455,172456],{"class":124,"line":2448},[78,172457,73171],{},[78,172459,172460],{"class":124,"line":2454},[78,172461,73176],{},[78,172463,172464],{"class":124,"line":2460},[78,172465,73181],{},[78,172467,172468],{"class":124,"line":2465},[78,172469,73186],{},[78,172471,172472],{"class":124,"line":2470},[78,172473,73191],{},[78,172475,172476],{"class":124,"line":2903},[78,172477,73196],{},[78,172479,172480],{"class":124,"line":2909},[78,172481,73201],{},[78,172483,172484],{"class":124,"line":11477},[78,172485,73206],{},[78,172487,172488],{"class":124,"line":13374},[78,172489,73211],{},[78,172491,172492],{"class":124,"line":13380},[78,172493,73216],{},[78,172495,172496],{"class":124,"line":13386},[78,172497,73221],{},[78,172499,172500],{"class":124,"line":13722},[78,172501,73226],{},[78,172503,172504],{"class":124,"line":13727},[78,172505,73231],{},[78,172507,172508],{"class":124,"line":13953},[78,172509,73236],{},[78,172511,172512],{"class":124,"line":13958},[78,172513,72822],{},[78,172515,172516],{"class":124,"line":13964},[78,172517,72827],{},[78,172519,172520],{"class":124,"line":13969},[78,172521,15810],{},[78,172523,172524],{"class":124,"line":24170},[78,172525,23518],{},[7759,172527,73256],{"id":73255},[13,172529,73259],{},[72,172531,172532],{},[13,172533,73264],{},[13,172535,73267],{},[10548,172537,73271],{"id":73270},[13,172539,73274,172540],{},[22,172541,73277],{},[13,172543,172544],{},[617,172545],{"alt":119,"src":30959},[13,172547,73284],{},[13,172549,172550],{},[22,172551,73289],{},[13,172553,73292],{},[13,172555,172556],{},[22,172557,73297],{},[13,172559,73300],{},[10548,172561,73304],{"id":73303},[13,172563,172564],{},[22,172565,73309],{},[13,172567,73312],{},[13,172569,73315],{},[13,172571,172572],{},[22,172573,73320],{},[13,172575,73323],{},[10548,172577,73327],{"id":73326},[13,172579,73330],{},[23289,172581],{},[107,172583,73336],{"id":73335},[7759,172585,73340],{"id":73339},[13,172587,172588],{},[5009,172589,73347],{"href":73345,"rel":172590},[23647],[7759,172592,73351],{"id":73350},[13,172594,172595],{},[5009,172596,73358],{"href":73356,"rel":172597},[23647],[23289,172599],{},[72,172601,172602,172604],{},[13,172603,73365],{},[13,172605,73368],{},[107,172607,73372],{"id":73371},[13,172609,73375,172610,73379],{},[22,172611,73378],{},[7759,172613,73383],{"id":73382},[13,172615,172616],{},[617,172617],{"alt":119,"src":31273},[13,172619,73390],{},[13,172621,73393],{},[13,172623,73396],{},[7759,172625,73400],{"id":73399},[10548,172627,73404],{"id":73403},[13,172629,73407],{},[13,172631,73410],{},[13,172633,172634],{},[617,172635],{"alt":119,"src":31282},[10548,172637,73418],{"id":73417},[13,172639,73421],{},[13,172641,73424],{},[13,172643,172644],{},[617,172645],{"alt":119,"src":31302},[72,172647,172648],{},[13,172649,73433],{},[13,172651,172652],{},[22,172653,73438],{},[7759,172655,73442],{"id":73441},[13,172657,172658],{},[22,172659,20689],{},[49,172661,172662,172664],{},[52,172663,73451],{},[52,172665,73454],{},[13,172667,172668],{},[22,172669,20692],{},[49,172671,172672,172674,172676],{},[52,172673,73463],{},[52,172675,73466],{},[52,172677,73469],{},[7759,172679,73473],{"id":73472},[10548,172681,73477],{"id":73476},[13,172683,73480],{},[13,172685,73483],{},[13,172687,73486],{},[13,172689,172690],{},[617,172691],{"alt":119,"src":31317},[10548,172693,73494],{"id":73493},[13,172695,73497],{},[49,172697,172698,172702],{},[52,172699,73502,172700,73506],{},[22,172701,73505],{},[52,172703,73509],{},[13,172705,73512],{},[13,172707,73515],{},[13,172709,73518,172710,73522],{},[22,172711,73521],{},[13,172713,172714],{},[617,172715],{"alt":119,"src":31335},[7759,172717,73530],{"id":73529},[13,172719,172720],{},[22,172721,20689],{},[49,172723,172724,172726],{},[52,172725,73539],{},[52,172727,73542],{},[13,172729,172730],{},[22,172731,20692],{},[49,172733,172734,172736,172738],{},[52,172735,73551],{},[52,172737,73554],{},[52,172739,73557],{},[23289,172741],{},[107,172743,73563],{"id":73562},[7759,172745,73567],{"id":73566},[13,172747,73570],{},[13,172749,172750],{},[617,172751],{"alt":119,"src":31471},[7759,172753,73578],{"id":73577},[10548,172755,73582],{"id":73581},[13,172757,73585],{},[13,172759,73588],{},[13,172761,73591],{},[13,172763,172764],{},[617,172765],{"alt":119,"src":31499},[10548,172767,73599],{"id":73598},[13,172769,73602],{},[13,172771,172772],{},[617,172773],{"alt":119,"src":73607},[13,172775,172776],{},[617,172777],{"alt":119,"src":73612},[13,172779,172780],{},[22,172781,73617],{},[49,172783,172784,172786,172788,172790],{},[52,172785,73622],{},[52,172787,73625],{},[52,172789,73628],{},[52,172791,73631],{},[13,172793,172794],{},[617,172795],{"alt":119,"src":73636},[7759,172797,73640],{"id":73639},[10548,172799,73644],{"id":73643},[13,172801,73647],{},[13,172803,73650],{},[10548,172805,73654],{"id":73653},[13,172807,73657],{},[13,172809,73660],{},[13,172811,73663],{},[10548,172813,73667],{"id":73666},[13,172815,73670],{},[13,172817,172818],{},[22,172819,73675],{},[49,172821,172822,172824,172826,172828],{},[52,172823,73680],{},[52,172825,73683],{},[52,172827,73686],{},[52,172829,73689],{},[13,172831,73692],{},[7759,172833,73696],{"id":73695},[13,172835,73699],{},[10548,172837,73703],{"id":73702},[13,172839,73706],{},[13,172841,73709],{},[10548,172843,73713],{"id":73712},[13,172845,73716],{},[13,172847,73719],{},[13,172849,73722],{},[10548,172851,73726],{"id":73725},[13,172853,73729],{},[23289,172855],{},[107,172857,73735],{"id":73734},[13,172859,73738],{},[13,172861,172862],{},[22,172863,73743],{},[13,172865,73746,172866,73750],{},[22,172867,73749],{},[7759,172869,73754],{"id":73753},[49,172871,172872,172874,172876,172878],{},[52,172873,73759],{},[52,172875,73762],{},[52,172877,73765],{},[52,172879,73768],{},[7759,172881,73772],{"id":73771},[10548,172883,73776],{"id":73775},[13,172885,73779],{},[13,172887,73782,172888],{},[22,172889,73785],{},[10548,172891,73789],{"id":73788},[13,172893,73792],{},[13,172895,73795],{},[7759,172897,73799],{"id":73798},[10548,172899,73803],{"id":73802},[13,172901,73806],{},[10548,172903,73810],{"id":73809},[13,172905,73813],{},[13,172907,73816],{},[10548,172909,73820],{"id":73819},[13,172911,73823,172912],{},[22,172913,73826],{},[13,172915,73829],{},[13,172917,172918],{},[617,172919],{"alt":119,"src":62619},[7759,172921,73837],{"id":73836},[13,172923,73840],{},[13,172925,172926],{},[22,172927,73845],{},[13,172929,172930,73851],{},[22,172931,73850],{},[7759,172933,73855],{"id":73854},[13,172935,73858],{},[13,172937,172938],{},[617,172939],{"alt":119,"src":62640},[13,172941,73865],{},[13,172943,172944],{},[22,172945,73870],{},[72,172947,172948],{},[13,172949,73875],{},[23289,172951],{},[72,172953,172954,172956,172958,172960],{},[13,172955,73882],{},[13,172957,73885],{},[13,172959,73888],{},[13,172961,73891],{},[226,172963,228],{},{"title":119,"searchDepth":144,"depth":144,"links":172965},[172966,172974,172978,172985,172991],{"id":72585,"depth":132,"text":72586,"children":172967},[172968,172969,172970,172971,172972,172973],{"id":27706,"depth":144,"text":27767},{"id":72667,"depth":144,"text":72668},{"id":72693,"depth":144,"text":72694},{"id":72721,"depth":144,"text":72722},{"id":72849,"depth":144,"text":72850},{"id":73255,"depth":144,"text":73256},{"id":73335,"depth":132,"text":73336,"children":172975},[172976,172977],{"id":73339,"depth":144,"text":73340},{"id":73350,"depth":144,"text":73351},{"id":73371,"depth":132,"text":73372,"children":172979},[172980,172981,172982,172983,172984],{"id":73382,"depth":144,"text":73383},{"id":73399,"depth":144,"text":73400},{"id":73441,"depth":144,"text":73442},{"id":73472,"depth":144,"text":73473},{"id":73529,"depth":144,"text":73530},{"id":73562,"depth":132,"text":73563,"children":172986},[172987,172988,172989,172990],{"id":73566,"depth":144,"text":73567},{"id":73577,"depth":144,"text":73578},{"id":73639,"depth":144,"text":73640},{"id":73695,"depth":144,"text":73696},{"id":73734,"depth":132,"text":73735,"children":172992},[172993,172994,172995,172996,172997],{"id":73753,"depth":144,"text":73754},{"id":73771,"depth":144,"text":73772},{"id":73798,"depth":144,"text":73799},{"id":73836,"depth":144,"text":73837},{"id":73854,"depth":144,"text":73855},{},{"title":72577,"description":119},[14541,23378,10715,6380],{"id":73936,"title":73937,"assetBase":239,"author":8,"body":173002,"category":23936,"collection":23324,"date":23325,"description":74038,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":173066,"navigation":128,"originalPath":74040,"path":74041,"seo":173067,"source":23330,"stem":74043,"tags":173068,"weight":250,"__hash__":74045},{"type":10,"value":173003,"toc":173064},[173004,173006,173012,173014,173020,173022,173026,173028,173030,173038,173040,173042,173044,173050,173054,173060],[4517,173005,73937],{"id":73942},[13,173007,73945,173008,73951],{},[596,173009,173010],{},[22,173011,73950],{},[13,173013,73954],{},[13,173015,73957,173016,73961,173018,73965],{},[22,173017,73960],{},[22,173019,73964],{},[13,173021,73968],{},[13,173023,73971,173024,73975],{},[22,173025,73974],{},[13,173027,73978],{},[13,173029,73981],{},[72,173031,173032,173034],{},[13,173033,73986],{},[13,173035,73989,173036,73993],{},[22,173037,73992],{},[13,173039,73996],{},[13,173041,73999],{},[13,173043,74002],{},[13,173045,74005,173046,74009,173048,74013],{},[22,173047,74008],{},[22,173049,74012],{},[13,173051,173052],{},[617,173053],{"alt":119,"src":74018},[13,173055,74021,173056,74009,173058,74028],{},[22,173057,74024],{},[22,173059,74027],{},[13,173061,74031,173062,74035],{},[22,173063,74034],{},{"title":119,"searchDepth":144,"depth":144,"links":173065},[],{},{"title":73937,"description":74038},[794,7744,23378,10715,6380,14542,23333],{"id":74047,"title":74048,"assetBase":239,"author":8,"body":173070,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":173417,"navigation":128,"originalPath":74471,"path":74472,"seo":173418,"source":23330,"stem":74474,"tags":173419,"weight":250,"__hash__":74476},{"type":10,"value":173071,"toc":173413},[173072,173102,173104,173106,173108,173112,173128,173132,173148,173153,173158,173163,173165,173167,173169,173305,173307,173411],[72,173073,173074,173078,173080,173082,173084,173086,173088,173090,173092,173094,173096,173098,173100],{},[13,173075,173076],{},[22,173077,23957],{},[13,173079,33647],{},[13,173081,33650],{},[13,173083,74063],{},[13,173085,28654],{},[13,173087,28672],{},[13,173089,63809],{},[13,173091,74072],{},[13,173093,74075],{},[13,173095,74078],{},[13,173097,74081],{},[13,173099,74084],{},[13,173101,74087],{},[7759,173103,74091],{"id":74090},[13,173105,74094],{},[13,173107,34660],{},[2285,173109,173110],{},[52,173111,74101],{},[114,173113,173114],{"className":33693,"code":74104,"language":33695,"meta":119,"style":119},[17,173115,173116,173120,173124],{"__ignoreMap":119},[78,173117,173118],{"class":124,"line":125},[78,173119,74111],{},[78,173121,173122],{"class":124,"line":132},[78,173123,74116],{},[78,173125,173126],{"class":124,"line":138},[78,173127,74121],{},[2285,173129,173130],{"start":132},[52,173131,74126],{},[114,173133,173134],{"className":33693,"code":74129,"language":33695,"meta":119,"style":119},[17,173135,173136,173140,173144],{"__ignoreMap":119},[78,173137,173138],{"class":124,"line":125},[78,173139,74136],{},[78,173141,173142],{"class":124,"line":132},[78,173143,74141],{},[78,173145,173146],{"class":124,"line":138},[78,173147,74146],{},[13,173149,74149,173150],{},[5009,173151,74152],{"href":74152,"rel":173152},[23647],[13,173154,74156,173155],{},[5009,173156,74159],{"href":74159,"rel":173157},[23647],[13,173159,74163,173160],{},[5009,173161,74166],{"href":74166,"rel":173162},[23647],[23289,173164],{},[7759,173166,35045],{"id":35045},[10548,173168,74175],{"id":74174},[114,173170,173171],{"className":33693,"code":74178,"language":33695,"meta":119,"style":119},[17,173172,173173,173177,173181,173185,173189,173193,173197,173201,173205,173209,173213,173217,173221,173225,173229,173233,173237,173241,173245,173249,173253,173257,173261,173265,173269,173273,173277,173281,173285,173289,173293,173297,173301],{"__ignoreMap":119},[78,173174,173175],{"class":124,"line":125},[78,173176,35217],{},[78,173178,173179],{"class":124,"line":132},[78,173180,74189],{},[78,173182,173183],{"class":124,"line":138},[78,173184,74194],{},[78,173186,173187],{"class":124,"line":144},[78,173188,23108],{},[78,173190,173191],{"class":124,"line":150},[78,173192,74203],{},[78,173194,173195],{"class":124,"line":156},[78,173196,74208],{},[78,173198,173199],{"class":124,"line":162},[78,173200,74213],{},[78,173202,173203],{"class":124,"line":168},[78,173204,74218],{},[78,173206,173207],{"class":124,"line":174},[78,173208,35528],{},[78,173210,173211],{"class":124,"line":180},[78,173212,74227],{},[78,173214,173215],{"class":124,"line":186},[78,173216,129],{"emptyLinePlaceholder":128},[78,173218,173219],{"class":124,"line":192},[78,173220,74236],{},[78,173222,173223],{"class":124,"line":198},[78,173224,74241],{},[78,173226,173227],{"class":124,"line":204},[78,173228,74246],{},[78,173230,173231],{"class":124,"line":210},[78,173232,74251],{},[78,173234,173235],{"class":124,"line":216},[78,173236,74256],{},[78,173238,173239],{"class":124,"line":222},[78,173240,74261],{},[78,173242,173243],{"class":124,"line":421},[78,173244,129],{"emptyLinePlaceholder":128},[78,173246,173247],{"class":124,"line":427},[78,173248,35428],{},[78,173250,173251],{"class":124,"line":433},[78,173252,74274],{},[78,173254,173255],{"class":124,"line":2443},[78,173256,74279],{},[78,173258,173259],{"class":124,"line":2448},[78,173260,74284],{},[78,173262,173263],{"class":124,"line":2454},[78,173264,129],{"emptyLinePlaceholder":128},[78,173266,173267],{"class":124,"line":2460},[78,173268,74293],{},[78,173270,173271],{"class":124,"line":2465},[78,173272,74298],{},[78,173274,173275],{"class":124,"line":2470},[78,173276,74246],{},[78,173278,173279],{"class":124,"line":2903},[78,173280,74307],{},[78,173282,173283],{"class":124,"line":2909},[78,173284,74312],{},[78,173286,173287],{"class":124,"line":11477},[78,173288,129],{"emptyLinePlaceholder":128},[78,173290,173291],{"class":124,"line":13374},[78,173292,35428],{},[78,173294,173295],{"class":124,"line":13380},[78,173296,74325],{},[78,173298,173299],{"class":124,"line":13386},[78,173300,74330],{},[78,173302,173303],{"class":124,"line":13722},[78,173304,74335],{},[10548,173306,74339],{"id":74338},[114,173308,173309],{"className":33693,"code":74342,"language":33695,"meta":119,"style":119},[17,173310,173311,173315,173319,173323,173327,173331,173335,173339,173343,173347,173351,173355,173359,173363,173367,173371,173375,173379,173383,173387,173391,173395,173399,173403,173407],{"__ignoreMap":119},[78,173312,173313],{"class":124,"line":125},[78,173314,74349],{},[78,173316,173317],{"class":124,"line":132},[78,173318,74354],{},[78,173320,173321],{"class":124,"line":138},[78,173322,129],{"emptyLinePlaceholder":128},[78,173324,173325],{"class":124,"line":144},[78,173326,129],{"emptyLinePlaceholder":128},[78,173328,173329],{"class":124,"line":150},[78,173330,35528],{},[78,173332,173333],{"class":124,"line":156},[78,173334,74371],{},[78,173336,173337],{"class":124,"line":162},[78,173338,74246],{},[78,173340,173341],{"class":124,"line":168},[78,173342,74380],{},[78,173344,173345],{"class":124,"line":174},[78,173346,74385],{},[78,173348,173349],{"class":124,"line":180},[78,173350,74390],{},[78,173352,173353],{"class":124,"line":186},[78,173354,74395],{},[78,173356,173357],{"class":124,"line":192},[78,173358,74400],{},[78,173360,173361],{"class":124,"line":198},[78,173362,74405],{},[78,173364,173365],{"class":124,"line":204},[78,173366,74410],{},[78,173368,173369],{"class":124,"line":210},[78,173370,74415],{},[78,173372,173373],{"class":124,"line":216},[78,173374,74420],{},[78,173376,173377],{"class":124,"line":222},[78,173378,74425],{},[78,173380,173381],{"class":124,"line":421},[78,173382,74430],{},[78,173384,173385],{"class":124,"line":427},[78,173386,129],{"emptyLinePlaceholder":128},[78,173388,173389],{"class":124,"line":433},[78,173390,35428],{},[78,173392,173393],{"class":124,"line":2443},[78,173394,74443],{},[78,173396,173397],{"class":124,"line":2448},[78,173398,74448],{},[78,173400,173401],{"class":124,"line":2454},[78,173402,74453],{},[78,173404,173405],{"class":124,"line":2460},[78,173406,74458],{},[78,173408,173409],{"class":124,"line":2465},[78,173410,74463],{},[226,173412,228],{},{"title":119,"searchDepth":144,"depth":144,"links":173414},[173415,173416],{"id":74090,"depth":144,"text":74091},{"id":35045,"depth":144,"text":35045},{},{"title":74048,"description":119},[10715,35725],{"id":74478,"title":74479,"assetBase":239,"author":8,"body":173421,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":173996,"navigation":128,"originalPath":75312,"path":75313,"seo":173997,"source":23330,"stem":75315,"tags":173998,"weight":250,"__hash__":75317},{"type":10,"value":173422,"toc":173985},[173423,173425,173434,173436,173438,173440,173442,173446,173456,173466,173468,173470,173472,173474,173476,173478,173480,173482,173484,173486,173488,173490,173492,173494,173496,173498,173508,173510,173512,173516,173518,173520,173542,173544,173546,173548,173550,173552,173562,173598,173604,173606,173608,173610,173612,173614,173626,173628,173630,173636,173641,173643,173645,173647,173649,173651,173653,173655,173657,173659,173661,173707,173709,173711,173713,173715,173717,173727,173729,173731,173733,173735,173737,173739,173741,173743,173745,173747,173749,173751,173753,173755,173757,173759,173761,173763,173765,173775,173777,173779,173781,173817,173819,173821,173829,173831,173833,173835,173845,173861,173863,173865,173871,173873,173875,173881,173883,173885,173887,173889,173891,173893,173895,173897,173899,173921,173923,173925,173927,173929,173931,173939,173941,173943,173945,173947,173949,173951,173953,173955,173957,173959,173961,173963,173965,173967,173969,173973,173975,173979,173983],[4517,173424,74479],{"id":74484},[72,173426,173427,173432],{},[13,173428,74489,173429,74495],{},[5009,173430,74494],{"href":74492,"rel":173431},[23647],[13,173433,74498],{},[7759,173435,74502],{"id":74501},[10548,173437,74506],{"id":74505},[13,173439,74509],{},[13,173441,74512],{},[13,173443,28636,173444,74518],{},[22,173445,74517],{},[13,173447,74521,173448,74525,173450,74529,173452,74533,173454,74537],{},[22,173449,74524],{},[22,173451,74528],{},[22,173453,74532],{},[22,173455,74536],{},[13,173457,28672,173458,74543,173460,27386,173462,52816,173464,74553],{},[22,173459,74542],{},[22,173461,74546],{},[22,173463,74549],{},[22,173465,74552],{},[23289,173467],{},[10548,173469,74559],{"id":74558},[13,173471,74562],{},[13,173473,74565],{},[13,173475,74568],{},[13,173477,74571],{},[23289,173479],{},[10548,173481,74577],{"id":74576},[13,173483,74580],{},[13,173485,74583],{},[13,173487,74586],{},[13,173489,74589],{},[23289,173491],{},[7759,173493,74595],{"id":74594},[10548,173495,74599],{"id":74598},[13,173497,74602],{},[49,173499,173500,173502,173504,173506],{},[52,173501,74607],{},[52,173503,74610],{},[52,173505,74613],{},[52,173507,74616],{},[23289,173509],{},[10548,173511,74622],{"id":74621},[49,173513,173514],{},[52,173515,74627],{},[23289,173517],{},[10548,173519,74633],{"id":74632},[49,173521,173522,173524,173526,173528,173530,173532,173534,173536,173538,173540],{},[52,173523,74638],{},[52,173525,74641],{},[52,173527,74644],{},[52,173529,74647],{},[52,173531,74650],{},[52,173533,74653],{},[52,173535,74656],{},[52,173537,74659],{},[52,173539,74662],{},[52,173541,74665],{},[23289,173543],{},[10548,173545,74671],{"id":74670},[13,173547,74674],{},[23289,173549],{},[10548,173551,74680],{"id":74679},[49,173553,173554,173556,173558,173560],{},[52,173555,74685],{},[52,173557,74688],{},[52,173559,74691],{},[52,173561,74694],{},[114,173563,173564],{"className":41615,"code":74697,"language":41617,"meta":119,"style":119},[17,173565,173566,173570,173578,173590],{"__ignoreMap":119},[78,173567,173568],{"class":124,"line":125},[78,173569,74704],{"class":41624},[78,173571,173572,173574,173576],{"class":124,"line":132},[78,173573,41631],{"class":41630},[78,173575,226],{"class":41634},[78,173577,41653],{"class":41630},[78,173579,173580,173582,173584,173586,173588],{"class":124,"line":138},[78,173581,74717],{"class":41694},[78,173583,74720],{"class":41755},[78,173585,4594],{"class":41630},[78,173587,74725],{"class":41644},[78,173589,74728],{"class":41630},[78,173591,173592,173594,173596],{"class":124,"line":144},[78,173593,74733],{"class":41630},[78,173595,226],{"class":41634},[78,173597,41653],{"class":41630},[13,173599,74740,173600,74744,173602],{},[74742,173601],{},[226,173603,74748],{"type":74747},[23289,173605],{},[7759,173607,74754],{"id":74753},[10548,173609,74758],{"id":74757},[13,173611,74761],{},[13,173613,74764],{},[13,173615,74767,173616,1011,173618,1011,173620,1011,173622,1011,173624,74783],{},[22,173617,74770],{},[22,173619,74773],{},[22,173621,74776],{},[22,173623,74779],{},[22,173625,74782],{},[23289,173627],{},[10548,173629,74789],{"id":74788},[49,173631,173632,173634],{},[52,173633,74794],{},[52,173635,74797],{},[13,173637,74800,173638,74806],{},[5009,173639,74805],{"href":74803,"rel":173640},[23647],[23289,173642],{},[10548,173644,74812],{"id":74811},[13,173646,74815],{},[13,173648,74818],{},[23289,173650],{},[7759,173652,74824],{"id":74823},[10548,173654,74828],{"id":74827},[13,173656,74831],{},[23289,173658],{},[10548,173660,74837],{"id":74836},[49,173662,173663,173671,173677,173687,173695],{},[52,173664,74842,173665],{},[49,173666,173667,173669],{},[52,173668,74847],{},[52,173670,74850],{},[52,173672,74853,173673],{},[49,173674,173675],{},[52,173676,74858],{},[52,173678,74861,173679],{},[49,173680,173681,173683,173685],{},[52,173682,74866],{},[52,173684,74869],{},[52,173686,74872],{},[52,173688,74875,173689],{},[49,173690,173691,173693],{},[52,173692,74880],{},[52,173694,74883],{},[52,173696,74886,173697],{},[49,173698,173699,173701,173703,173705],{},[52,173700,74891],{},[52,173702,74894],{},[52,173704,74897],{},[52,173706,74900],{},[23289,173708],{},[10548,173710,74906],{"id":74905},[13,173712,74909],{},[23289,173714],{},[10548,173716,74915],{"id":74914},[49,173718,173719,173721,173723,173725],{},[52,173720,74920],{},[52,173722,74923],{},[52,173724,74926],{},[52,173726,74929],{},[13,173728,74932],{},[13,173730,74935],{},[13,173732,74938],{},[13,173734,74941],{},[13,173736,74944],{},[13,173738,74947],{},[13,173740,74950],{},[13,173742,74953],{},[13,173744,74956],{},[13,173746,74959],{},[13,173748,74962],{},[13,173750,74965],{},[13,173752,74968],{},[23289,173754],{},[7759,173756,74974],{"id":74973},[10548,173758,74978],{"id":74977},[13,173760,74981],{},[23289,173762],{},[10548,173764,74987],{"id":74986},[49,173766,173767,173769,173771,173773],{},[52,173768,74992],{},[52,173770,74995],{},[52,173772,74998],{},[52,173774,75001],{},[23289,173776],{},[10548,173778,75007],{"id":75006},[13,173780,75010],{},[114,173782,173783],{"className":23652,"code":75013,"language":23654,"meta":119,"style":119},[17,173784,173785,173789,173793,173797,173801,173805,173809,173813],{"__ignoreMap":119},[78,173786,173787],{"class":124,"line":125},[78,173788,75020],{},[78,173790,173791],{"class":124,"line":132},[78,173792,75025],{},[78,173794,173795],{"class":124,"line":138},[78,173796,75030],{},[78,173798,173799],{"class":124,"line":144},[78,173800,75035],{},[78,173802,173803],{"class":124,"line":150},[78,173804,75040],{},[78,173806,173807],{"class":124,"line":156},[78,173808,75045],{},[78,173810,173811],{"class":124,"line":162},[78,173812,75050],{},[78,173814,173815],{"class":124,"line":168},[78,173816,75055],{},[23289,173818],{},[10548,173820,75061],{"id":75060},[49,173822,173823,173825,173827],{},[52,173824,75066],{},[52,173826,75069],{},[52,173828,75072],{},[23289,173830],{},[7759,173832,75078],{"id":75077},[10548,173834,75082],{"id":75081},[49,173836,173837,173839,173841,173843],{},[52,173838,75087],{},[52,173840,75090],{},[52,173842,75093],{},[52,173844,75096],{},[114,173846,173847],{"className":23652,"code":75099,"language":23654,"meta":119,"style":119},[17,173848,173849,173853,173857],{"__ignoreMap":119},[78,173850,173851],{"class":124,"line":125},[78,173852,75106],{},[78,173854,173855],{"class":124,"line":132},[78,173856,75111],{},[78,173858,173859],{"class":124,"line":138},[78,173860,75116],{},[23289,173862],{},[10548,173864,75122],{"id":75121},[49,173866,173867,173869],{},[52,173868,75127],{},[52,173870,75130],{},[23289,173872],{},[10548,173874,75136],{"id":75135},[49,173876,173877,173879],{},[52,173878,75141],{},[52,173880,75144],{},[23289,173882],{},[7759,173884,75150],{"id":75149},[10548,173886,75154],{"id":75153},[13,173888,75157],{},[23289,173890],{},[10548,173892,75163],{"id":75162},[13,173894,75166],{},[23289,173896],{},[10548,173898,75172],{"id":75171},[49,173900,173901,173911],{},[52,173902,75177,173903],{},[49,173904,173905,173907,173909],{},[52,173906,75182],{},[52,173908,75185],{},[52,173910,75188],{},[52,173912,75191,173913],{},[49,173914,173915,173917,173919],{},[52,173916,75196],{},[52,173918,75199],{},[52,173920,75202],{},[23289,173922],{},[7759,173924,75208],{"id":75207},[10548,173926,75212],{"id":75211},[13,173928,75215],{},[13,173930,75218],{},[49,173932,173933,173935,173937],{},[52,173934,75223],{},[52,173936,75226],{},[52,173938,75229],{},[23289,173940],{},[10548,173942,75235],{"id":75234},[13,173944,75238],{},[23289,173946],{},[10548,173948,75244],{"id":75243},[13,173950,75247],{},[13,173952,75250],{},[13,173954,75253],{},[13,173956,75256],{},[13,173958,75259],{},[13,173960,75262],{},[23289,173962],{},[7759,173964,75268],{"id":75267},[10548,173966,75272],{"id":75271},[13,173968,75275],{},[13,173970,173971,75281],{},[22,173972,75280],{},[13,173974,75284],{},[13,173976,173977,75290],{},[22,173978,75289],{},[13,173980,173981,75296],{},[22,173982,75295],{},[226,173984,75299],{},{"title":119,"searchDepth":144,"depth":144,"links":173986},[173987,173988,173989,173990,173991,173992,173993,173994,173995],{"id":74501,"depth":144,"text":74502},{"id":74594,"depth":144,"text":74595},{"id":74753,"depth":144,"text":74754},{"id":74823,"depth":144,"text":74824},{"id":74973,"depth":144,"text":74974},{"id":75077,"depth":144,"text":75078},{"id":75149,"depth":144,"text":75150},{"id":75207,"depth":144,"text":75208},{"id":75267,"depth":144,"text":75268},{},{"title":74479,"description":119},[10715],{"id":75319,"title":75320,"assetBase":239,"author":8,"body":174000,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":176426,"navigation":128,"originalPath":78158,"path":78159,"seo":176427,"source":23330,"stem":78161,"tags":176428,"weight":250,"__hash__":78163},{"type":10,"value":174001,"toc":176408},[174002,174004,174014,174016,174018,174020,174022,174024,174026,174030,174042,174044,174050,174052,174056,174066,174068,174070,174072,174076,174080,174090,174092,174094,174118,174120,174122,174124,174126,174130,174160,174164,174336,174340,174504,174508,174516,174716,174718,174720,174744,174772,175032,175034,175048,175112,175116,175120,175124,175236,175250,175254,175284,175504,175508,175512,175568,175572,175804,175808,176220,176224,176396,176398,176400,176402,176404,176406],[4517,174003,75326],{"id":75325},[72,174005,174006,174008,174010,174012],{},[13,174007,23957],{},[13,174009,75333],{},[13,174011,75336],{},[13,174013,75339],{},[107,174015,75343],{"id":75342},[7759,174017,75347],{"id":75346},[13,174019,75350],{},[13,174021,75353],{},[13,174023,75356],{},[7759,174025,75360],{"id":75359},[13,174027,174028,75366],{},[22,174029,75365],{},[49,174031,174032,174034,174036,174038],{},[52,174033,75371],{},[52,174035,75374],{},[52,174037,75377],{},[52,174039,75380,174040,4604],{},[17,174041,75383],{},[13,174043,75386],{},[49,174045,174046,174048],{},[52,174047,75391],{},[52,174049,75394],{},[13,174051,75397],{},[13,174053,174054],{},[22,174055,75402],{},[49,174057,174058,174060,174062,174064],{},[52,174059,75407],{},[52,174061,75410],{},[52,174063,75413],{},[52,174065,75416],{},[13,174067,75419],{},[23289,174069],{},[107,174071,75425],{"id":75424},[13,174073,75428,174074],{},[17,174075,75431],{},[13,174077,75434,174078,8661],{},[22,174079,75437],{},[49,174081,174082,174084,174086,174088],{},[52,174083,75442],{},[52,174085,75445],{},[52,174087,75448],{},[52,174089,75451],{},[13,174091,75454],{},[13,174093,75457],{},[72,174095,174096,174098,174110,174114,174116],{},[13,174097,75462],{},[49,174099,174100,174102,174104,174106,174108],{},[52,174101,75467],{},[52,174103,75470],{},[52,174105,75473],{},[52,174107,75476],{},[52,174109,75479],{},[13,174111,174112],{},[22,174113,75484],{},[13,174115,75487],{},[13,174117,75490],{},[23289,174119],{},[13,174121,75495],{},[107,174123,75499],{"id":75498},[39316,174125,75503],{"id":75502},[13,174127,174128],{},[17,174129,75508],{},[72,174131,174132,174134,174150,174152],{},[13,174133,75513],{},[2285,174135,174136,174138,174142,174146],{"start":250},[52,174137,75518],{},[52,174139,75521,174140],{},[17,174141,75524],{},[52,174143,75527,174144],{},[17,174145,75530],{},[52,174147,75533,174148],{},[17,174149,75536],{},[13,174151,75539],{},[114,174153,174154],{"className":116,"code":75542,"language":118,"meta":119,"style":119},[17,174155,174156],{"__ignoreMap":119},[78,174157,174158],{"class":124,"line":125},[78,174159,75542],{},[13,174161,174162],{},[22,174163,75553],{},[114,174165,174166],{"className":116,"code":75556,"language":118,"meta":119,"style":119},[17,174167,174168,174172,174176,174180,174184,174188,174192,174196,174200,174204,174208,174212,174216,174220,174224,174228,174232,174236,174240,174244,174248,174252,174256,174260,174264,174268,174272,174276,174280,174284,174288,174292,174296,174300,174304,174308,174312,174316,174320,174324,174328,174332],{"__ignoreMap":119},[78,174169,174170],{"class":124,"line":125},[78,174171,46994],{},[78,174173,174174],{"class":124,"line":132},[78,174175,75567],{},[78,174177,174178],{"class":124,"line":138},[78,174179,129],{"emptyLinePlaceholder":128},[78,174181,174182],{"class":124,"line":144},[78,174183,75576],{},[78,174185,174186],{"class":124,"line":150},[78,174187,75581],{},[78,174189,174190],{"class":124,"line":156},[78,174191,75586],{},[78,174193,174194],{"class":124,"line":162},[78,174195,75591],{},[78,174197,174198],{"class":124,"line":168},[78,174199,129],{"emptyLinePlaceholder":128},[78,174201,174202],{"class":124,"line":174},[78,174203,75600],{},[78,174205,174206],{"class":124,"line":180},[78,174207,75605],{},[78,174209,174210],{"class":124,"line":186},[78,174211,75610],{},[78,174213,174214],{"class":124,"line":192},[78,174215,46994],{},[78,174217,174218],{"class":124,"line":198},[78,174219,75619],{},[78,174221,174222],{"class":124,"line":204},[78,174223,75624],{},[78,174225,174226],{"class":124,"line":210},[78,174227,129],{"emptyLinePlaceholder":128},[78,174229,174230],{"class":124,"line":216},[78,174231,75633],{},[78,174233,174234],{"class":124,"line":222},[78,174235,75638],{},[78,174237,174238],{"class":124,"line":421},[78,174239,75643],{},[78,174241,174242],{"class":124,"line":427},[78,174243,75648],{},[78,174245,174246],{"class":124,"line":433},[78,174247,75653],{},[78,174249,174250],{"class":124,"line":2443},[78,174251,75658],{},[78,174253,174254],{"class":124,"line":2448},[78,174255,75663],{},[78,174257,174258],{"class":124,"line":2454},[78,174259,129],{"emptyLinePlaceholder":128},[78,174261,174262],{"class":124,"line":2460},[78,174263,75672],{},[78,174265,174266],{"class":124,"line":2465},[78,174267,75677],{},[78,174269,174270],{"class":124,"line":2470},[78,174271,75682],{},[78,174273,174274],{"class":124,"line":2903},[78,174275,75687],{},[78,174277,174278],{"class":124,"line":2909},[78,174279,129],{"emptyLinePlaceholder":128},[78,174281,174282],{"class":124,"line":11477},[78,174283,75696],{},[78,174285,174286],{"class":124,"line":13374},[78,174287,46994],{},[78,174289,174290],{"class":124,"line":13380},[78,174291,75705],{},[78,174293,174294],{"class":124,"line":13386},[78,174295,75710],{},[78,174297,174298],{"class":124,"line":13722},[78,174299,75715],{},[78,174301,174302],{"class":124,"line":13727},[78,174303,75720],{},[78,174305,174306],{"class":124,"line":13953},[78,174307,75725],{},[78,174309,174310],{"class":124,"line":13958},[78,174311,75730],{},[78,174313,174314],{"class":124,"line":13964},[78,174315,46994],{},[78,174317,174318],{"class":124,"line":13969},[78,174319,75739],{},[78,174321,174322],{"class":124,"line":24170},[78,174323,75744],{},[78,174325,174326],{"class":124,"line":24175},[78,174327,75749],{},[78,174329,174330],{"class":124,"line":24180},[78,174331,75754],{},[78,174333,174334],{"class":124,"line":24186},[78,174335,75759],{},[13,174337,174338],{},[22,174339,75764],{},[114,174341,174342],{"className":116,"code":75767,"language":118,"meta":119,"style":119},[17,174343,174344,174348,174352,174356,174360,174364,174368,174372,174376,174380,174384,174388,174392,174396,174400,174404,174408,174412,174416,174420,174424,174428,174432,174436,174440,174444,174448,174452,174456,174460,174464,174468,174472,174476,174480,174484,174488,174492,174496,174500],{"__ignoreMap":119},[78,174345,174346],{"class":124,"line":125},[78,174347,46994],{},[78,174349,174350],{"class":124,"line":132},[78,174351,75576],{},[78,174353,174354],{"class":124,"line":138},[78,174355,75581],{},[78,174357,174358],{"class":124,"line":144},[78,174359,75586],{},[78,174361,174362],{"class":124,"line":150},[78,174363,75591],{},[78,174365,174366],{"class":124,"line":156},[78,174367,75794],{},[78,174369,174370],{"class":124,"line":162},[78,174371,75799],{},[78,174373,174374],{"class":124,"line":168},[78,174375,129],{"emptyLinePlaceholder":128},[78,174377,174378],{"class":124,"line":174},[78,174379,75600],{},[78,174381,174382],{"class":124,"line":180},[78,174383,75605],{},[78,174385,174386],{"class":124,"line":186},[78,174387,75610],{},[78,174389,174390],{"class":124,"line":192},[78,174391,46994],{},[78,174393,174394],{"class":124,"line":198},[78,174395,75824],{},[78,174397,174398],{"class":124,"line":204},[78,174399,75624],{},[78,174401,174402],{"class":124,"line":210},[78,174403,129],{"emptyLinePlaceholder":128},[78,174405,174406],{"class":124,"line":216},[78,174407,75837],{},[78,174409,174410],{"class":124,"line":222},[78,174411,75638],{},[78,174413,174414],{"class":124,"line":421},[78,174415,75643],{},[78,174417,174418],{"class":124,"line":427},[78,174419,129],{"emptyLinePlaceholder":128},[78,174421,174422],{"class":124,"line":433},[78,174423,75648],{},[78,174425,174426],{"class":124,"line":2443},[78,174427,75653],{},[78,174429,174430],{"class":124,"line":2448},[78,174431,129],{"emptyLinePlaceholder":128},[78,174433,174434],{"class":124,"line":2454},[78,174435,75658],{},[78,174437,174438],{"class":124,"line":2460},[78,174439,75663],{},[78,174441,174442],{"class":124,"line":2465},[78,174443,129],{"emptyLinePlaceholder":128},[78,174445,174446],{"class":124,"line":2470},[78,174447,75878],{},[78,174449,174450],{"class":124,"line":2903},[78,174451,75883],{},[78,174453,174454],{"class":124,"line":2909},[78,174455,129],{"emptyLinePlaceholder":128},[78,174457,174458],{"class":124,"line":11477},[78,174459,75892],{},[78,174461,174462],{"class":124,"line":13374},[78,174463,75897],{},[78,174465,174466],{"class":124,"line":13380},[78,174467,129],{"emptyLinePlaceholder":128},[78,174469,174470],{"class":124,"line":13386},[78,174471,75906],{},[78,174473,174474],{"class":124,"line":13722},[78,174475,75911],{},[78,174477,174478],{"class":124,"line":13727},[78,174479,75687],{},[78,174481,174482],{"class":124,"line":13953},[78,174483,75696],{},[78,174485,174486],{"class":124,"line":13958},[78,174487,75739],{},[78,174489,174490],{"class":124,"line":13964},[78,174491,75744],{},[78,174493,174494],{"class":124,"line":13969},[78,174495,75749],{},[78,174497,174498],{"class":124,"line":24170},[78,174499,75754],{},[78,174501,174502],{"class":124,"line":24175},[78,174503,75759],{},[13,174505,174506],{},[22,174507,75944],{},[72,174509,174510,174512,174514],{},[13,174511,75949],{},[13,174513,75952],{},[13,174515,75955],{},[114,174517,174518],{"className":116,"code":75958,"language":118,"meta":119,"style":119},[17,174519,174520,174524,174528,174532,174536,174540,174544,174548,174552,174556,174560,174564,174568,174572,174576,174580,174584,174588,174592,174596,174600,174604,174608,174612,174616,174620,174624,174628,174632,174636,174640,174644,174648,174652,174656,174660,174664,174668,174672,174676,174680,174684,174688,174692,174696,174700,174704,174708,174712],{"__ignoreMap":119},[78,174521,174522],{"class":124,"line":125},[78,174523,46994],{},[78,174525,174526],{"class":124,"line":132},[78,174527,75576],{},[78,174529,174530],{"class":124,"line":138},[78,174531,75581],{},[78,174533,174534],{"class":124,"line":144},[78,174535,75977],{},[78,174537,174538],{"class":124,"line":150},[78,174539,75591],{},[78,174541,174542],{"class":124,"line":156},[78,174543,75794],{},[78,174545,174546],{"class":124,"line":162},[78,174547,75799],{},[78,174549,174550],{"class":124,"line":168},[78,174551,129],{"emptyLinePlaceholder":128},[78,174553,174554],{"class":124,"line":174},[78,174555,75600],{},[78,174557,174558],{"class":124,"line":180},[78,174559,75605],{},[78,174561,174562],{"class":124,"line":186},[78,174563,75610],{},[78,174565,174566],{"class":124,"line":192},[78,174567,129],{"emptyLinePlaceholder":128},[78,174569,174570],{"class":124,"line":198},[78,174571,129],{"emptyLinePlaceholder":128},[78,174573,174574],{"class":124,"line":204},[78,174575,76018],{},[78,174577,174578],{"class":124,"line":210},[78,174579,76023],{},[78,174581,174582],{"class":124,"line":216},[78,174583,76028],{},[78,174585,174586],{"class":124,"line":222},[78,174587,46994],{},[78,174589,174590],{"class":124,"line":421},[78,174591,76037],{},[78,174593,174594],{"class":124,"line":427},[78,174595,75624],{},[78,174597,174598],{"class":124,"line":433},[78,174599,129],{"emptyLinePlaceholder":128},[78,174601,174602],{"class":124,"line":2443},[78,174603,76050],{},[78,174605,174606],{"class":124,"line":2448},[78,174607,75638],{},[78,174609,174610],{"class":124,"line":2454},[78,174611,75643],{},[78,174613,174614],{"class":124,"line":2460},[78,174615,129],{"emptyLinePlaceholder":128},[78,174617,174618],{"class":124,"line":2465},[78,174619,76067],{},[78,174621,174622],{"class":124,"line":2470},[78,174623,76072],{},[78,174625,174626],{"class":124,"line":2903},[78,174627,76077],{},[78,174629,174630],{"class":124,"line":2909},[78,174631,76082],{},[78,174633,174634],{"class":124,"line":11477},[78,174635,76087],{},[78,174637,174638],{"class":124,"line":13374},[78,174639,76092],{},[78,174641,174642],{"class":124,"line":13380},[78,174643,76097],{},[78,174645,174646],{"class":124,"line":13386},[78,174647,8041],{},[78,174649,174650],{"class":124,"line":13722},[78,174651,75658],{},[78,174653,174654],{"class":124,"line":13727},[78,174655,76110],{},[78,174657,174658],{"class":124,"line":13953},[78,174659,76115],{},[78,174661,174662],{"class":124,"line":13958},[78,174663,75883],{},[78,174665,174666],{"class":124,"line":13964},[78,174667,76124],{},[78,174669,174670],{"class":124,"line":13969},[78,174671,76129],{},[78,174673,174674],{"class":124,"line":24170},[78,174675,129],{"emptyLinePlaceholder":128},[78,174677,174678],{"class":124,"line":24175},[78,174679,129],{"emptyLinePlaceholder":128},[78,174681,174682],{"class":124,"line":24180},[78,174683,76142],{},[78,174685,174686],{"class":124,"line":24186},[78,174687,75911],{},[78,174689,174690],{"class":124,"line":24192},[78,174691,75687],{},[78,174693,174694],{"class":124,"line":24198},[78,174695,75696],{},[78,174697,174698],{"class":124,"line":24204},[78,174699,75739],{},[78,174701,174702],{"class":124,"line":24210},[78,174703,75744],{},[78,174705,174706],{"class":124,"line":24215},[78,174707,75749],{},[78,174709,174710],{"class":124,"line":24220},[78,174711,75754],{},[78,174713,174714],{"class":124,"line":24226},[78,174715,75759],{},[39316,174717,76178],{"id":76177},[13,174719,76181],{},[72,174721,174722,174726],{},[13,174723,174724],{},[22,174725,76188],{},[49,174727,174728,174730,174732,174734,174736,174738,174740,174742],{},[52,174729,76193],{},[52,174731,76196],{},[52,174733,76199],{},[52,174735,76202],{},[52,174737,76205],{},[52,174739,76208],{},[52,174741,76211],{},[52,174743,76214],{},[114,174745,174746],{"className":44613,"code":76217,"language":44615,"meta":119,"style":119},[17,174747,174748,174752,174756,174760,174764,174768],{"__ignoreMap":119},[78,174749,174750],{"class":124,"line":125},[78,174751,76224],{},[78,174753,174754],{"class":124,"line":132},[78,174755,76229],{},[78,174757,174758],{"class":124,"line":138},[78,174759,76234],{},[78,174761,174762],{"class":124,"line":144},[78,174763,76239],{},[78,174765,174766],{"class":124,"line":150},[78,174767,76244],{},[78,174769,174770],{"class":124,"line":156},[78,174771,76249],{},[114,174773,174774],{"className":116,"code":76252,"language":118,"meta":119,"style":119},[17,174775,174776,174780,174784,174788,174792,174796,174800,174804,174808,174812,174816,174820,174824,174828,174832,174836,174840,174844,174848,174852,174856,174860,174864,174868,174872,174876,174880,174884,174888,174892,174896,174900,174904,174908,174912,174916,174920,174924,174928,174932,174936,174940,174944,174948,174952,174956,174960,174964,174968,174972,174976,174980,174984,174988,174992,174996,175000,175004,175008,175012,175016,175020,175024,175028],{"__ignoreMap":119},[78,174777,174778],{"class":124,"line":125},[78,174779,46994],{},[78,174781,174782],{"class":124,"line":132},[78,174783,76263],{},[78,174785,174786],{"class":124,"line":138},[78,174787,129],{"emptyLinePlaceholder":128},[78,174789,174790],{"class":124,"line":144},[78,174791,76272],{},[78,174793,174794],{"class":124,"line":150},[78,174795,76277],{},[78,174797,174798],{"class":124,"line":156},[78,174799,76282],{},[78,174801,174802],{"class":124,"line":162},[78,174803,76287],{},[78,174805,174806],{"class":124,"line":168},[78,174807,76292],{},[78,174809,174810],{"class":124,"line":174},[78,174811,76297],{},[78,174813,174814],{"class":124,"line":180},[78,174815,76302],{},[78,174817,174818],{"class":124,"line":186},[78,174819,76307],{},[78,174821,174822],{"class":124,"line":192},[78,174823,46994],{},[78,174825,174826],{"class":124,"line":198},[78,174827,76316],{},[78,174829,174830],{"class":124,"line":204},[78,174831,76321],{},[78,174833,174834],{"class":124,"line":210},[78,174835,129],{"emptyLinePlaceholder":128},[78,174837,174838],{"class":124,"line":216},[78,174839,76330],{},[78,174841,174842],{"class":124,"line":222},[78,174843,76335],{},[78,174845,174846],{"class":124,"line":421},[78,174847,76340],{},[78,174849,174850],{"class":124,"line":427},[78,174851,76345],{},[78,174853,174854],{"class":124,"line":433},[78,174855,129],{"emptyLinePlaceholder":128},[78,174857,174858],{"class":124,"line":2443},[78,174859,76354],{},[78,174861,174862],{"class":124,"line":2448},[78,174863,76359],{},[78,174865,174866],{"class":124,"line":2454},[78,174867,76364],{},[78,174869,174870],{"class":124,"line":2460},[78,174871,129],{"emptyLinePlaceholder":128},[78,174873,174874],{"class":124,"line":2465},[78,174875,76373],{},[78,174877,174878],{"class":124,"line":2470},[78,174879,76378],{},[78,174881,174882],{"class":124,"line":2903},[78,174883,76383],{},[78,174885,174886],{"class":124,"line":2909},[78,174887,129],{"emptyLinePlaceholder":128},[78,174889,174890],{"class":124,"line":11477},[78,174891,76392],{},[78,174893,174894],{"class":124,"line":13374},[78,174895,76397],{},[78,174897,174898],{"class":124,"line":13380},[78,174899,76402],{},[78,174901,174902],{"class":124,"line":13386},[78,174903,76407],{},[78,174905,174906],{"class":124,"line":13722},[78,174907,76412],{},[78,174909,174910],{"class":124,"line":13727},[78,174911,76417],{},[78,174913,174914],{"class":124,"line":13953},[78,174915,74213],{},[78,174917,174918],{"class":124,"line":13958},[78,174919,129],{"emptyLinePlaceholder":128},[78,174921,174922],{"class":124,"line":13964},[78,174923,76430],{},[78,174925,174926],{"class":124,"line":13969},[78,174927,76435],{},[78,174929,174930],{"class":124,"line":24170},[78,174931,76440],{},[78,174933,174934],{"class":124,"line":24175},[78,174935,76445],{},[78,174937,174938],{"class":124,"line":24180},[78,174939,129],{"emptyLinePlaceholder":128},[78,174941,174942],{"class":124,"line":24186},[78,174943,76454],{},[78,174945,174946],{"class":124,"line":24192},[78,174947,76459],{},[78,174949,174950],{"class":124,"line":24198},[78,174951,76464],{},[78,174953,174954],{"class":124,"line":24204},[78,174955,76469],{},[78,174957,174958],{"class":124,"line":24210},[78,174959,129],{"emptyLinePlaceholder":128},[78,174961,174962],{"class":124,"line":24215},[78,174963,76478],{},[78,174965,174966],{"class":124,"line":24220},[78,174967,76483],{},[78,174969,174970],{"class":124,"line":24226},[78,174971,46994],{},[78,174973,174974],{"class":124,"line":24232},[78,174975,76224],{},[78,174977,174978],{"class":124,"line":24238},[78,174979,76229],{},[78,174981,174982],{"class":124,"line":24244},[78,174983,76234],{},[78,174985,174986],{"class":124,"line":24250},[78,174987,76239],{},[78,174989,174990],{"class":124,"line":24256},[78,174991,76244],{},[78,174993,174994],{"class":124,"line":24262},[78,174995,76249],{},[78,174997,174998],{"class":124,"line":24267},[78,174999,46994],{},[78,175001,175002],{"class":124,"line":24273},[78,175003,76520],{},[78,175005,175006],{"class":124,"line":24279},[78,175007,76525],{},[78,175009,175010],{"class":124,"line":24284},[78,175011,129],{"emptyLinePlaceholder":128},[78,175013,175014],{"class":124,"line":24290},[78,175015,76534],{},[78,175017,175018],{"class":124,"line":24296},[78,175019,76539],{},[78,175021,175022],{"class":124,"line":24302},[78,175023,76544],{},[78,175025,175026],{"class":124,"line":24308},[78,175027,76549],{},[78,175029,175030],{"class":124,"line":24314},[78,175031,76554],{},[39316,175033,76558],{"id":76557},[72,175035,175036,175040,175042,175046],{},[13,175037,175038],{},[22,175039,76565],{},[13,175041,76568],{},[13,175043,175044],{},[22,175045,76573],{},[13,175047,76576],{},[114,175049,175050],{"className":116,"code":76579,"language":118,"meta":119,"style":119},[17,175051,175052,175056,175060,175064,175068,175072,175076,175080,175084,175088,175092,175096,175100,175104,175108],{"__ignoreMap":119},[78,175053,175054],{"class":124,"line":125},[78,175055,76586],{},[78,175057,175058],{"class":124,"line":132},[78,175059,129],{"emptyLinePlaceholder":128},[78,175061,175062],{"class":124,"line":138},[78,175063,76595],{},[78,175065,175066],{"class":124,"line":144},[78,175067,76600],{},[78,175069,175070],{"class":124,"line":150},[78,175071,76605],{},[78,175073,175074],{"class":124,"line":156},[78,175075,76610],{},[78,175077,175078],{"class":124,"line":162},[78,175079,129],{"emptyLinePlaceholder":128},[78,175081,175082],{"class":124,"line":168},[78,175083,76619],{},[78,175085,175086],{"class":124,"line":174},[78,175087,76624],{},[78,175089,175090],{"class":124,"line":180},[78,175091,76610],{},[78,175093,175094],{"class":124,"line":186},[78,175095,129],{"emptyLinePlaceholder":128},[78,175097,175098],{"class":124,"line":192},[78,175099,76637],{},[78,175101,175102],{"class":124,"line":198},[78,175103,76610],{},[78,175105,175106],{"class":124,"line":204},[78,175107,129],{"emptyLinePlaceholder":128},[78,175109,175110],{"class":124,"line":210},[78,175111,8941],{},[13,175113,175114],{},[22,175115,76654],{},[13,175117,175118],{},[617,175119],{"alt":76659,"src":76660},[13,175121,175122],{},[22,175123,76665],{},[114,175125,175126],{"className":116,"code":76668,"language":118,"meta":119,"style":119},[17,175127,175128,175132,175136,175140,175144,175148,175152,175156,175160,175164,175168,175172,175176,175180,175184,175188,175192,175196,175200,175204,175208,175212,175216,175220,175224,175228,175232],{"__ignoreMap":119},[78,175129,175130],{"class":124,"line":125},[78,175131,46994],{},[78,175133,175134],{"class":124,"line":132},[78,175135,76679],{},[78,175137,175138],{"class":124,"line":138},[78,175139,129],{"emptyLinePlaceholder":128},[78,175141,175142],{"class":124,"line":144},[78,175143,76688],{},[78,175145,175146],{"class":124,"line":150},[78,175147,76693],{},[78,175149,175150],{"class":124,"line":156},[78,175151,76698],{},[78,175153,175154],{"class":124,"line":162},[78,175155,76703],{},[78,175157,175158],{"class":124,"line":168},[78,175159,46994],{},[78,175161,175162],{"class":124,"line":174},[78,175163,76712],{},[78,175165,175166],{"class":124,"line":180},[78,175167,76586],{},[78,175169,175170],{"class":124,"line":186},[78,175171,129],{"emptyLinePlaceholder":128},[78,175173,175174],{"class":124,"line":192},[78,175175,76725],{},[78,175177,175178],{"class":124,"line":198},[78,175179,129],{"emptyLinePlaceholder":128},[78,175181,175182],{"class":124,"line":204},[78,175183,76600],{},[78,175185,175186],{"class":124,"line":210},[78,175187,76738],{},[78,175189,175190],{"class":124,"line":216},[78,175191,76743],{},[78,175193,175194],{"class":124,"line":222},[78,175195,129],{"emptyLinePlaceholder":128},[78,175197,175198],{"class":124,"line":421},[78,175199,76752],{},[78,175201,175202],{"class":124,"line":427},[78,175203,76757],{},[78,175205,175206],{"class":124,"line":433},[78,175207,76762],{},[78,175209,175210],{"class":124,"line":2443},[78,175211,129],{"emptyLinePlaceholder":128},[78,175213,175214],{"class":124,"line":2448},[78,175215,76771],{},[78,175217,175218],{"class":124,"line":2454},[78,175219,76776],{},[78,175221,175222],{"class":124,"line":2460},[78,175223,76781],{},[78,175225,175226],{"class":124,"line":2465},[78,175227,129],{"emptyLinePlaceholder":128},[78,175229,175230],{"class":124,"line":2470},[78,175231,76790],{},[78,175233,175234],{"class":124,"line":2903},[78,175235,76795],{},[72,175237,175238,175240],{},[13,175239,76800],{},[2285,175241,175242,175244,175246,175248],{},[52,175243,76805],{},[52,175245,76808],{},[52,175247,76811],{},[52,175249,76814],{},[39316,175251,76818,175252,4604],{"id":76817},[22,175253,76821],{},[72,175255,175256,175260,175266,175270],{},[13,175257,175258],{},[22,175259,76828],{},[49,175261,175262,175264],{},[52,175263,76833],{},[52,175265,76836],{},[13,175267,175268],{},[22,175269,76841],{},[49,175271,175272,175274,175276,175278,175280,175282],{},[52,175273,76846],{},[52,175275,76849],{},[52,175277,76852],{},[52,175279,76855],{},[52,175281,76858],{},[52,175283,76861],{},[114,175285,175286],{"className":116,"code":76864,"language":118,"meta":119,"style":119},[17,175287,175288,175292,175296,175300,175304,175308,175312,175316,175320,175324,175328,175332,175336,175340,175344,175348,175352,175356,175360,175364,175368,175372,175376,175380,175384,175388,175392,175396,175400,175404,175408,175412,175416,175420,175424,175428,175432,175436,175440,175444,175448,175452,175456,175460,175464,175468,175472,175476,175480,175484,175488,175492,175496,175500],{"__ignoreMap":119},[78,175289,175290],{"class":124,"line":125},[78,175291,46994],{},[78,175293,175294],{"class":124,"line":132},[78,175295,76875],{},[78,175297,175298],{"class":124,"line":138},[78,175299,76880],{},[78,175301,175302],{"class":124,"line":144},[78,175303,76885],{},[78,175305,175306],{"class":124,"line":150},[78,175307,129],{"emptyLinePlaceholder":128},[78,175309,175310],{"class":124,"line":156},[78,175311,76894],{},[78,175313,175314],{"class":124,"line":162},[78,175315,129],{"emptyLinePlaceholder":128},[78,175317,175318],{"class":124,"line":168},[78,175319,76903],{},[78,175321,175322],{"class":124,"line":174},[78,175323,76908],{},[78,175325,175326],{"class":124,"line":180},[78,175327,76913],{},[78,175329,175330],{"class":124,"line":186},[78,175331,76918],{},[78,175333,175334],{"class":124,"line":192},[78,175335,76923],{},[78,175337,175338],{"class":124,"line":198},[78,175339,76928],{},[78,175341,175342],{"class":124,"line":204},[78,175343,46994],{},[78,175345,175346],{"class":124,"line":210},[78,175347,76937],{},[78,175349,175350],{"class":124,"line":216},[78,175351,76942],{},[78,175353,175354],{"class":124,"line":222},[78,175355,129],{"emptyLinePlaceholder":128},[78,175357,175358],{"class":124,"line":421},[78,175359,76951],{},[78,175361,175362],{"class":124,"line":427},[78,175363,7771],{},[78,175365,175366],{"class":124,"line":433},[78,175367,129],{"emptyLinePlaceholder":128},[78,175369,175370],{"class":124,"line":2443},[78,175371,76964],{},[78,175373,175374],{"class":124,"line":2448},[78,175375,76969],{},[78,175377,175378],{"class":124,"line":2454},[78,175379,129],{"emptyLinePlaceholder":128},[78,175381,175382],{"class":124,"line":2460},[78,175383,76978],{},[78,175385,175386],{"class":124,"line":2465},[78,175387,76983],{},[78,175389,175390],{"class":124,"line":2470},[78,175391,76988],{},[78,175393,175394],{"class":124,"line":2903},[78,175395,76993],{},[78,175397,175398],{"class":124,"line":2909},[78,175399,76998],{},[78,175401,175402],{"class":124,"line":11477},[78,175403,77003],{},[78,175405,175406],{"class":124,"line":13374},[78,175407,77008],{},[78,175409,175410],{"class":124,"line":13380},[78,175411,129],{"emptyLinePlaceholder":128},[78,175413,175414],{"class":124,"line":13386},[78,175415,77017],{},[78,175417,175418],{"class":124,"line":13722},[78,175419,77022],{},[78,175421,175422],{"class":124,"line":13727},[78,175423,129],{"emptyLinePlaceholder":128},[78,175425,175426],{"class":124,"line":13953},[78,175427,77031],{},[78,175429,175430],{"class":124,"line":13958},[78,175431,77036],{},[78,175433,175434],{"class":124,"line":13964},[78,175435,77041],{},[78,175437,175438],{"class":124,"line":13969},[78,175439,77046],{},[78,175441,175442],{"class":124,"line":24170},[78,175443,77051],{},[78,175445,175446],{"class":124,"line":24175},[78,175447,129],{"emptyLinePlaceholder":128},[78,175449,175450],{"class":124,"line":24180},[78,175451,77060],{},[78,175453,175454],{"class":124,"line":24186},[78,175455,77065],{},[78,175457,175458],{"class":124,"line":24192},[78,175459,77070],{},[78,175461,175462],{"class":124,"line":24198},[78,175463,77075],{},[78,175465,175466],{"class":124,"line":24204},[78,175467,77080],{},[78,175469,175470],{"class":124,"line":24210},[78,175471,129],{"emptyLinePlaceholder":128},[78,175473,175474],{"class":124,"line":24215},[78,175475,77089],{},[78,175477,175478],{"class":124,"line":24220},[78,175479,77094],{},[78,175481,175482],{"class":124,"line":24226},[78,175483,77099],{},[78,175485,175486],{"class":124,"line":24232},[78,175487,129],{"emptyLinePlaceholder":128},[78,175489,175490],{"class":124,"line":24238},[78,175491,77108],{},[78,175493,175494],{"class":124,"line":24244},[78,175495,77113],{},[78,175497,175498],{"class":124,"line":24250},[78,175499,77118],{},[78,175501,175502],{"class":124,"line":24256},[78,175503,77123],{},[39316,175505,77127,175506,4604],{"id":77126},[22,175507,76821],{},[13,175509,175510],{},[617,175511],{"alt":77134,"src":77135},[72,175513,175514,175518,175520,175522,175526,175540,175544,175548,175552,175556,175560,175564],{},[13,175515,175516],{},[22,175517,77142],{},[13,175519,77145],{},[13,175521,77148],{},[13,175523,175524],{},[22,175525,77153],{},[2285,175527,175528,175530,175532,175534,175536,175538],{},[52,175529,77158],{},[52,175531,77161],{},[52,175533,77164],{},[52,175535,77167],{},[52,175537,77170],{},[52,175539,77173],{},[13,175541,175542],{},[22,175543,77178],{},[2285,175545,175546],{},[52,175547,77183],{},[49,175549,175550],{},[52,175551,77188],{},[2285,175553,175554],{"start":132},[52,175555,77193],{},[49,175557,175558],{},[52,175559,77198],{},[2285,175561,175562],{"start":138},[52,175563,77203],{},[49,175565,175566],{},[52,175567,77208],{},[13,175569,175570],{},[22,175571,77213],{},[114,175573,175574],{"className":116,"code":77216,"language":118,"meta":119,"style":119},[17,175575,175576,175580,175584,175588,175592,175596,175600,175604,175608,175612,175616,175620,175624,175628,175632,175636,175640,175644,175648,175652,175656,175660,175664,175668,175672,175676,175680,175684,175688,175692,175696,175700,175704,175708,175712,175716,175720,175724,175728,175732,175736,175740,175744,175748,175752,175756,175760,175764,175768,175772,175776,175780,175784,175788,175792,175796,175800],{"__ignoreMap":119},[78,175577,175578],{"class":124,"line":125},[78,175579,46994],{},[78,175581,175582],{"class":124,"line":132},[78,175583,77227],{},[78,175585,175586],{"class":124,"line":138},[78,175587,129],{"emptyLinePlaceholder":128},[78,175589,175590],{"class":124,"line":144},[78,175591,77236],{},[78,175593,175594],{"class":124,"line":150},[78,175595,77241],{},[78,175597,175598],{"class":124,"line":156},[78,175599,77246],{},[78,175601,175602],{"class":124,"line":162},[78,175603,77251],{},[78,175605,175606],{"class":124,"line":168},[78,175607,77256],{},[78,175609,175610],{"class":124,"line":174},[78,175611,77261],{},[78,175613,175614],{"class":124,"line":180},[78,175615,46994],{},[78,175617,175618],{"class":124,"line":186},[78,175619,77270],{},[78,175621,175622],{"class":124,"line":192},[78,175623,77275],{},[78,175625,175626],{"class":124,"line":198},[78,175627,77280],{},[78,175629,175630],{"class":124,"line":204},[78,175631,77285],{},[78,175633,175634],{"class":124,"line":210},[78,175635,77290],{},[78,175637,175638],{"class":124,"line":216},[78,175639,77295],{},[78,175641,175642],{"class":124,"line":222},[78,175643,77300],{},[78,175645,175646],{"class":124,"line":421},[78,175647,77305],{},[78,175649,175650],{"class":124,"line":427},[78,175651,77310],{},[78,175653,175654],{"class":124,"line":433},[78,175655,77315],{},[78,175657,175658],{"class":124,"line":2443},[78,175659,77320],{},[78,175661,175662],{"class":124,"line":2448},[78,175663,77325],{},[78,175665,175666],{"class":124,"line":2454},[78,175667,77330],{},[78,175669,175670],{"class":124,"line":2460},[78,175671,77335],{},[78,175673,175674],{"class":124,"line":2465},[78,175675,77340],{},[78,175677,175678],{"class":124,"line":2470},[78,175679,77345],{},[78,175681,175682],{"class":124,"line":2903},[78,175683,77350],{},[78,175685,175686],{"class":124,"line":2909},[78,175687,77355],{},[78,175689,175690],{"class":124,"line":11477},[78,175691,77360],{},[78,175693,175694],{"class":124,"line":13374},[78,175695,77365],{},[78,175697,175698],{"class":124,"line":13380},[78,175699,77370],{},[78,175701,175702],{"class":124,"line":13386},[78,175703,77375],{},[78,175705,175706],{"class":124,"line":13722},[78,175707,77380],{},[78,175709,175710],{"class":124,"line":13727},[78,175711,129],{"emptyLinePlaceholder":128},[78,175713,175714],{"class":124,"line":13953},[78,175715,77389],{},[78,175717,175718],{"class":124,"line":13958},[78,175719,77394],{},[78,175721,175722],{"class":124,"line":13964},[78,175723,77399],{},[78,175725,175726],{"class":124,"line":13969},[78,175727,77404],{},[78,175729,175730],{"class":124,"line":24170},[78,175731,77409],{},[78,175733,175734],{"class":124,"line":24175},[78,175735,77414],{},[78,175737,175738],{"class":124,"line":24180},[78,175739,77419],{},[78,175741,175742],{"class":124,"line":24186},[78,175743,77424],{},[78,175745,175746],{"class":124,"line":24192},[78,175747,77429],{},[78,175749,175750],{"class":124,"line":24198},[78,175751,77434],{},[78,175753,175754],{"class":124,"line":24204},[78,175755,77439],{},[78,175757,175758],{"class":124,"line":24210},[78,175759,8041],{},[78,175761,175762],{"class":124,"line":24215},[78,175763,77448],{},[78,175765,175766],{"class":124,"line":24220},[78,175767,77453],{},[78,175769,175770],{"class":124,"line":24226},[78,175771,77458],{},[78,175773,175774],{"class":124,"line":24232},[78,175775,77463],{},[78,175777,175778],{"class":124,"line":24238},[78,175779,77468],{},[78,175781,175782],{"class":124,"line":24244},[78,175783,77473],{},[78,175785,175786],{"class":124,"line":24250},[78,175787,77478],{},[78,175789,175790],{"class":124,"line":24256},[78,175791,77483],{},[78,175793,175794],{"class":124,"line":24262},[78,175795,77488],{},[78,175797,175798],{"class":124,"line":24267},[78,175799,77493],{},[78,175801,175802],{"class":124,"line":24273},[78,175803,77498],{},[13,175805,175806],{},[22,175807,77503],{},[114,175809,175810],{"className":116,"code":77506,"language":118,"meta":119,"style":119},[17,175811,175812,175816,175820,175824,175828,175832,175836,175840,175844,175848,175852,175856,175860,175864,175868,175872,175876,175880,175884,175888,175892,175896,175900,175904,175908,175912,175916,175920,175924,175928,175932,175936,175940,175944,175948,175952,175956,175960,175964,175968,175972,175976,175980,175984,175988,175992,175996,176000,176004,176008,176012,176016,176020,176024,176028,176032,176036,176040,176044,176048,176052,176056,176060,176064,176068,176072,176076,176080,176084,176088,176092,176096,176100,176104,176108,176112,176116,176120,176124,176128,176132,176136,176140,176144,176148,176152,176156,176160,176164,176168,176172,176176,176180,176184,176188,176192,176196,176200,176204,176208,176212,176216],{"__ignoreMap":119},[78,175813,175814],{"class":124,"line":125},[78,175815,46994],{},[78,175817,175818],{"class":124,"line":132},[78,175819,77227],{},[78,175821,175822],{"class":124,"line":138},[78,175823,129],{"emptyLinePlaceholder":128},[78,175825,175826],{"class":124,"line":144},[78,175827,77236],{},[78,175829,175830],{"class":124,"line":150},[78,175831,77241],{},[78,175833,175834],{"class":124,"line":156},[78,175835,77246],{},[78,175837,175838],{"class":124,"line":162},[78,175839,77251],{},[78,175841,175842],{"class":124,"line":168},[78,175843,77541],{},[78,175845,175846],{"class":124,"line":174},[78,175847,77256],{},[78,175849,175850],{"class":124,"line":180},[78,175851,77261],{},[78,175853,175854],{"class":124,"line":186},[78,175855,46994],{},[78,175857,175858],{"class":124,"line":192},[78,175859,77558],{},[78,175861,175862],{"class":124,"line":198},[78,175863,77394],{},[78,175865,175866],{"class":124,"line":204},[78,175867,77399],{},[78,175869,175870],{"class":124,"line":210},[78,175871,129],{"emptyLinePlaceholder":128},[78,175873,175874],{"class":124,"line":216},[78,175875,77404],{},[78,175877,175878],{"class":124,"line":222},[78,175879,77409],{},[78,175881,175882],{"class":124,"line":421},[78,175883,77414],{},[78,175885,175886],{"class":124,"line":427},[78,175887,77419],{},[78,175889,175890],{"class":124,"line":433},[78,175891,77424],{},[78,175893,175894],{"class":124,"line":2443},[78,175895,77429],{},[78,175897,175898],{"class":124,"line":2448},[78,175899,77434],{},[78,175901,175902],{"class":124,"line":2454},[78,175903,77439],{},[78,175905,175906],{"class":124,"line":2460},[78,175907,8041],{},[78,175909,175910],{"class":124,"line":2465},[78,175911,77448],{},[78,175913,175914],{"class":124,"line":2470},[78,175915,77453],{},[78,175917,175918],{"class":124,"line":2903},[78,175919,77458],{},[78,175921,175922],{"class":124,"line":2909},[78,175923,77623],{},[78,175925,175926],{"class":124,"line":11477},[78,175927,77628],{},[78,175929,175930],{"class":124,"line":13374},[78,175931,77468],{},[78,175933,175934],{"class":124,"line":13380},[78,175935,77473],{},[78,175937,175938],{"class":124,"line":13386},[78,175939,77641],{},[78,175941,175942],{"class":124,"line":13722},[78,175943,129],{"emptyLinePlaceholder":128},[78,175945,175946],{"class":124,"line":13727},[78,175947,77650],{},[78,175949,175950],{"class":124,"line":13953},[78,175951,77655],{},[78,175953,175954],{"class":124,"line":13958},[78,175955,129],{"emptyLinePlaceholder":128},[78,175957,175958],{"class":124,"line":13964},[78,175959,77483],{},[78,175961,175962],{"class":124,"line":13969},[78,175963,77488],{},[78,175965,175966],{"class":124,"line":24170},[78,175967,77493],{},[78,175969,175970],{"class":124,"line":24175},[78,175971,77498],{},[78,175973,175974],{"class":124,"line":24180},[78,175975,129],{"emptyLinePlaceholder":128},[78,175977,175978],{"class":124,"line":24186},[78,175979,77684],{},[78,175981,175982],{"class":124,"line":24192},[78,175983,77394],{},[78,175985,175986],{"class":124,"line":24198},[78,175987,77399],{},[78,175989,175990],{"class":124,"line":24204},[78,175991,129],{"emptyLinePlaceholder":128},[78,175993,175994],{"class":124,"line":24210},[78,175995,77404],{},[78,175997,175998],{"class":124,"line":24215},[78,175999,77409],{},[78,176001,176002],{"class":124,"line":24220},[78,176003,77414],{},[78,176005,176006],{"class":124,"line":24226},[78,176007,77419],{},[78,176009,176010],{"class":124,"line":24232},[78,176011,77424],{},[78,176013,176014],{"class":124,"line":24238},[78,176015,77429],{},[78,176017,176018],{"class":124,"line":24244},[78,176019,77434],{},[78,176021,176022],{"class":124,"line":24250},[78,176023,77439],{},[78,176025,176026],{"class":124,"line":24256},[78,176027,8041],{},[78,176029,176030],{"class":124,"line":24262},[78,176031,77448],{},[78,176033,176034],{"class":124,"line":24267},[78,176035,77453],{},[78,176037,176038],{"class":124,"line":24273},[78,176039,77458],{},[78,176041,176042],{"class":124,"line":24279},[78,176043,77749],{},[78,176045,176046],{"class":124,"line":24284},[78,176047,77628],{},[78,176049,176050],{"class":124,"line":24290},[78,176051,77468],{},[78,176053,176054],{"class":124,"line":24296},[78,176055,77473],{},[78,176057,176058],{"class":124,"line":24302},[78,176059,77766],{},[78,176061,176062],{"class":124,"line":24308},[78,176063,129],{"emptyLinePlaceholder":128},[78,176065,176066],{"class":124,"line":24314},[78,176067,77650],{},[78,176069,176070],{"class":124,"line":24320},[78,176071,77655],{},[78,176073,176074],{"class":124,"line":24325},[78,176075,129],{"emptyLinePlaceholder":128},[78,176077,176078],{"class":124,"line":24331},[78,176079,77483],{},[78,176081,176082],{"class":124,"line":25115},[78,176083,77488],{},[78,176085,176086],{"class":124,"line":25121},[78,176087,77493],{},[78,176089,176090],{"class":124,"line":25127},[78,176091,77498],{},[78,176093,176094],{"class":124,"line":25132},[78,176095,129],{"emptyLinePlaceholder":128},[78,176097,176098],{"class":124,"line":25137},[78,176099,129],{"emptyLinePlaceholder":128},[78,176101,176102],{"class":124,"line":25143},[78,176103,77811],{},[78,176105,176106],{"class":124,"line":25149},[78,176107,77394],{},[78,176109,176110],{"class":124,"line":25155},[78,176111,77399],{},[78,176113,176114],{"class":124,"line":25161},[78,176115,129],{"emptyLinePlaceholder":128},[78,176117,176118],{"class":124,"line":25166},[78,176119,77404],{},[78,176121,176122],{"class":124,"line":25172},[78,176123,77409],{},[78,176125,176126],{"class":124,"line":25178},[78,176127,77414],{},[78,176129,176130],{"class":124,"line":25184},[78,176131,77419],{},[78,176133,176134],{"class":124,"line":25190},[78,176135,77424],{},[78,176137,176138],{"class":124,"line":25196},[78,176139,77429],{},[78,176141,176142],{"class":124,"line":25202},[78,176143,77434],{},[78,176145,176146],{"class":124,"line":25207},[78,176147,77439],{},[78,176149,176150],{"class":124,"line":25212},[78,176151,8041],{},[78,176153,176154],{"class":124,"line":25218},[78,176155,77448],{},[78,176157,176158],{"class":124,"line":25224},[78,176159,77453],{},[78,176161,176162],{"class":124,"line":25230},[78,176163,77458],{},[78,176165,176166],{"class":124,"line":25236},[78,176167,77876],{},[78,176169,176170],{"class":124,"line":25241},[78,176171,77628],{},[78,176173,176174],{"class":124,"line":25246},[78,176175,77468],{},[78,176177,176178],{"class":124,"line":25252},[78,176179,77473],{},[78,176181,176182],{"class":124,"line":25258},[78,176183,77893],{},[78,176185,176186],{"class":124,"line":25264},[78,176187,129],{"emptyLinePlaceholder":128},[78,176189,176190],{"class":124,"line":25269},[78,176191,77650],{},[78,176193,176194],{"class":124,"line":25274},[78,176195,77655],{},[78,176197,176198],{"class":124,"line":25280},[78,176199,129],{"emptyLinePlaceholder":128},[78,176201,176202],{"class":124,"line":25286},[78,176203,77483],{},[78,176205,176206],{"class":124,"line":25292},[78,176207,77488],{},[78,176209,176210],{"class":124,"line":25298},[78,176211,129],{"emptyLinePlaceholder":128},[78,176213,176214],{"class":124,"line":51654},[78,176215,77493],{},[78,176217,176218],{"class":124,"line":51659},[78,176219,77498],{},[13,176221,176222],{},[22,176223,77934],{},[114,176225,176226],{"className":116,"code":77937,"language":118,"meta":119,"style":119},[17,176227,176228,176232,176236,176240,176244,176248,176252,176256,176260,176264,176268,176272,176276,176280,176284,176288,176292,176296,176300,176304,176308,176312,176316,176320,176324,176328,176332,176336,176340,176344,176348,176352,176356,176360,176364,176368,176372,176376,176380,176384,176388,176392],{"__ignoreMap":119},[78,176229,176230],{"class":124,"line":125},[78,176231,46994],{},[78,176233,176234],{"class":124,"line":132},[78,176235,77227],{},[78,176237,176238],{"class":124,"line":138},[78,176239,129],{"emptyLinePlaceholder":128},[78,176241,176242],{"class":124,"line":144},[78,176243,77236],{},[78,176245,176246],{"class":124,"line":150},[78,176247,77241],{},[78,176249,176250],{"class":124,"line":156},[78,176251,77246],{},[78,176253,176254],{"class":124,"line":162},[78,176255,77251],{},[78,176257,176258],{"class":124,"line":168},[78,176259,77972],{},[78,176261,176262],{"class":124,"line":174},[78,176263,77256],{},[78,176265,176266],{"class":124,"line":180},[78,176267,77261],{},[78,176269,176270],{"class":124,"line":186},[78,176271,46994],{},[78,176273,176274],{"class":124,"line":192},[78,176275,129],{"emptyLinePlaceholder":128},[78,176277,176278],{"class":124,"line":198},[78,176279,77394],{},[78,176281,176282],{"class":124,"line":204},[78,176283,77399],{},[78,176285,176286],{"class":124,"line":210},[78,176287,129],{"emptyLinePlaceholder":128},[78,176289,176290],{"class":124,"line":216},[78,176291,77404],{},[78,176293,176294],{"class":124,"line":222},[78,176295,77409],{},[78,176297,176298],{"class":124,"line":421},[78,176299,77414],{},[78,176301,176302],{"class":124,"line":427},[78,176303,77419],{},[78,176305,176306],{"class":124,"line":433},[78,176307,77424],{},[78,176309,176310],{"class":124,"line":2443},[78,176311,77429],{},[78,176313,176314],{"class":124,"line":2448},[78,176315,77434],{},[78,176317,176318],{"class":124,"line":2454},[78,176319,77439],{},[78,176321,176322],{"class":124,"line":2460},[78,176323,8041],{},[78,176325,176326],{"class":124,"line":2465},[78,176327,129],{"emptyLinePlaceholder":128},[78,176329,176330],{"class":124,"line":2470},[78,176331,77448],{},[78,176333,176334],{"class":124,"line":2903},[78,176335,77453],{},[78,176337,176338],{"class":124,"line":2909},[78,176339,129],{"emptyLinePlaceholder":128},[78,176341,176342],{"class":124,"line":11477},[78,176343,78057],{},[78,176345,176346],{"class":124,"line":13374},[78,176347,78062],{},[78,176349,176350],{"class":124,"line":13380},[78,176351,78067],{},[78,176353,176354],{"class":124,"line":13386},[78,176355,78072],{},[78,176357,176358],{"class":124,"line":13722},[78,176359,78077],{},[78,176361,176362],{"class":124,"line":13727},[78,176363,78082],{},[78,176365,176366],{"class":124,"line":13953},[78,176367,78087],{},[78,176369,176370],{"class":124,"line":13958},[78,176371,78092],{},[78,176373,176374],{"class":124,"line":13964},[78,176375,129],{"emptyLinePlaceholder":128},[78,176377,176378],{"class":124,"line":13969},[78,176379,77483],{},[78,176381,176382],{"class":124,"line":24170},[78,176383,77488],{},[78,176385,176386],{"class":124,"line":24175},[78,176387,129],{"emptyLinePlaceholder":128},[78,176389,176390],{"class":124,"line":24180},[78,176391,77493],{},[78,176393,176394],{"class":124,"line":24186},[78,176395,77498],{},[23289,176397],{},[107,176399,78122],{"id":78121},[107,176401,78126],{"id":78125},[107,176403,78130],{"id":78129},[107,176405,78134],{"id":78133},[226,176407,228],{},{"title":119,"searchDepth":144,"depth":144,"links":176409},[176410,176414,176415,176422,176423,176424,176425],{"id":75342,"depth":132,"text":75343,"children":176411},[176412,176413],{"id":75346,"depth":144,"text":75347},{"id":75359,"depth":144,"text":75360},{"id":75424,"depth":132,"text":75425},{"id":75498,"depth":132,"text":75499,"children":176416},[176417,176418,176419,176420,176421],{"id":75502,"depth":150,"text":75503},{"id":76177,"depth":150,"text":76178},{"id":76557,"depth":150,"text":76558},{"id":76817,"depth":150,"text":78150},{"id":77126,"depth":150,"text":78152},{"id":78121,"depth":132,"text":78122},{"id":78125,"depth":132,"text":78126},{"id":78129,"depth":132,"text":78130},{"id":78133,"depth":132,"text":78134},{},{"title":75320,"description":119},[23378,10715,35725],{"id":78165,"title":78166,"assetBase":78167,"author":8,"body":176430,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":190736,"navigation":128,"originalPath":92948,"path":92949,"seo":190737,"source":23330,"stem":92951,"tags":190738,"weight":250,"__hash__":92953},{"type":10,"value":176431,"toc":190700},[176432,176434,176444,176446,176448,176450,176454,176456,176458,176460,176462,176464,176466,176468,176470,176472,176476,176478,176480,176482,176484,176486,176490,176494,176496,176498,176502,176506,176510,176514,176518,176520,176522,176524,176526,176528,176532,176538,176544,176550,176552,176556,176560,176562,176566,176570,176574,176576,176578,176580,176584,176588,176592,176594,176596,176598,176600,176602,176604,176606,176608,176610,176612,176614,176616,176964,176966,176968,176970,176972,176974,176976,176978,176980,176982,177067,177069,177071,177073,177540,177542,177544,177546,177548,177550,177552,177558,177560,179797,179799,181577,181579,181581,181585,181724,181726,181728,181730,181897,181899,181901,181903,181907,181911,181913,181915,182357,182359,182361,182363,182365,182367,182869,182871,182873,183374,183376,183378,183380,183382,183384,183386,183388,183390,183392,183394,183396,183398,183488,183494,183496,183711,183723,183725,183850,183852,183854,183856,183858,184057,184059,184061,184278,184280,184282,184284,184479,184481,184681,184683,184736,184738,185071,185073,185247,185249,185541,185543,185738,185740,185742,185750,185752,185754,185758,186190,186192,186194,186196,186198,186200,186202,186204,186502,186504,186674,186676,186820,186822,186970,186972,186974,186976,186978,186982,186984,186986,187546,187548,187995,187997,188759,188761,188763,188765,189124,189126,189128,189550,189554,189556,189562,189564,189568,189570,189574,189576,189580,189582,189584,189586,189588,189590,189592,189594,189596,189598,189602,189930,189932,189934,189936,190353,190355,190357,190652,190654,190656,190658,190660,190662,190664,190666,190668,190674,190676,190678,190680,190684,190688,190692,190694,190696,190698],[4517,176433,78166],{"id":78166},[72,176435,176436,176440,176442],{},[13,176437,176438],{},[22,176439,23957],{},[13,176441,78180],{},[13,176443,78183],{},[23289,176445],{},[107,176447,78189],{"id":78188},[7759,176449,78193],{"id":78192},[13,176451,78196,176452,78200],{},[22,176453,78199],{},[23289,176455],{},[7759,176457,78206],{"id":78205},[13,176459,78209],{},[13,176461,78212],{},[13,176463,78215],{},[13,176465,78218],{},[23289,176467],{},[107,176469,78224],{"id":78223},[7759,176471,78228],{"id":78227},[13,176473,176474],{},[617,176475],{"alt":78233,"src":78234},[23289,176477],{},[7759,176479,78240],{"id":78239},[13,176481,78243],{},[13,176483,78246],{},[13,176485,78249],{},[13,176487,63809,176488,78255],{},[22,176489,78254],{},[13,176491,74072,176492],{},[22,176493,78260],{},[23289,176495],{},[7759,176497,78266],{"id":78265},[13,176499,78269,176500,67],{},[22,176501,78272],{},[13,176503,78275,176504,67],{},[22,176505,78278],{},[13,176507,78281,176508,67],{},[22,176509,78284],{},[13,176511,78287,176512,67],{},[22,176513,78290],{},[13,176515,78293,176516,67],{},[22,176517,78296],{},[23289,176519],{},[7759,176521,78302],{"id":78301},[10548,176523,78305],{"id":78305},[13,176525,78308],{},[10548,176527,78312],{"id":78311},[13,176529,78315,176530,29665],{},[22,176531,78318],{},[13,176533,78321,176534,52204,176536,67],{},[22,176535,78324],{},[22,176537,78327],{},[13,176539,78330,176540,52204,176542,67],{},[22,176541,78333],{},[22,176543,78336],{},[13,176545,78339,176546,52204,176548,21291],{},[22,176547,78342],{},[22,176549,78345],{},[10548,176551,78349],{"id":78348},[13,176553,78352,176554,78356],{},[22,176555,78355],{},[13,176557,176558],{},[617,176559],{"alt":78361,"src":78362},[10548,176561,78366],{"id":78365},[13,176563,28636,176564,78372],{},[22,176565,78371],{},[13,176567,28654,176568,78378],{},[22,176569,78377],{},[13,176571,28672,176572,78384],{},[22,176573,78383],{},[10548,176575,78388],{"id":78387},[13,176577,78391],{},[13,176579,78394],{},[13,176581,28636,176582,78400],{},[22,176583,78399],{},[13,176585,28654,176586,78406],{},[22,176587,78405],{},[13,176589,28672,176590,78412],{},[22,176591,78411],{},[23289,176593],{},[7759,176595,78418],{"id":78417},[13,176597,78421],{},[13,176599,78424],{},[23289,176601],{},[107,176603,78430],{"id":78429},[7759,176605,78434],{"id":78433},[10548,176607,78437],{"id":78437},[13,176609,78440],{},[13,176611,78443],{},[13,176613,78446],{},[10548,176615,78449],{"id":78449},[78,176617,176619],{"className":176618},[4566],[78,176620,176622,176703],{"className":176621},[4570],[78,176623,176625],{"className":176624},[4574],[4576,176626,176627],{"xmlns":4578,"display":4579},[4581,176628,176629,176701],{},[4584,176630,176631,176633,176635,176637,176639,176641,176647,176649,176651,176653,176655,176657,176659,176661,176667,176669,176671,176673,176675,176677,176679,176681,176683,176685,176687,176689,176695,176697,176699],{},[4587,176632,78467],{},[7077,176634,469],{},[4587,176636,78472],{},[4596,176638,17143],{},[4591,176640,63356],{},[4614,176642,176643,176645],{},[4596,176644,17143],{},[4596,176646,43678],{},[4591,176648,4609],{},[4596,176650,78487],{"mathvariant":7101},[4591,176652,2066],{"separator":1419},[4596,176654,7062],{},[4591,176656,4594],{"stretchy":4593},[4596,176658,17143],{},[4591,176660,63356],{},[4614,176662,176663,176665],{},[4596,176664,17143],{},[4596,176666,43678],{},[4591,176668,4604],{"stretchy":4593},[4591,176670,4609],{},[4596,176672,7062],{},[4591,176674,4594],{"stretchy":4593},[4596,176676,78487],{"mathvariant":7101},[4591,176678,4604],{"stretchy":4593},[4591,176680,4609],{},[7077,176682,2949],{},[4587,176684,78522],{},[4596,176686,17143],{},[4591,176688,63356],{},[4614,176690,176691,176693],{},[4596,176692,17143],{},[4596,176694,43678],{},[4591,176696,4609],{},[4596,176698,78487],{"mathvariant":7101},[4587,176700,78539],{},[4647,176702,78542],{"encoding":4649},[78,176704,176706,176733,176777,176810,176857,176884,176908,176952],{"className":176705,"ariaHidden":1419},[4654],[78,176707,176709,176712,176715,176718,176721,176724,176727,176730],{"className":176708},[4658],[78,176710],{"className":176711,"style":18224},[4662],[78,176713,78467],{"className":176714},[4667,6184],[78,176716,469],{"className":176717},[4667],[78,176719,78472],{"className":176720},[4667,6184],[78,176722,17143],{"className":176723},[4667,4678],[78,176725],{"className":176726,"style":5143},[4739],[78,176728,63356],{"className":176729},[7450],[78,176731],{"className":176732,"style":5143},[4739],[78,176734,176736,176739,176768,176771,176774],{"className":176735},[4658],[78,176737],{"className":176738,"style":5206},[4662],[78,176740,176742,176745],{"className":176741},[4667],[78,176743,17143],{"className":176744},[4667,4678],[78,176746,176748],{"className":176747},[4689],[78,176749,176751],{"className":176750},[4693],[78,176752,176754],{"className":176753},[4698],[78,176755,176757],{"className":176756,"style":5206},[4702],[78,176758,176759,176762],{"style":5209},[78,176760],{"className":176761,"style":4711},[4710],[78,176763,176765],{"className":176764},[4715,4716,4717,4718],[78,176766,43678],{"className":176767,"style":5133},[4667,4678,4718],[78,176769],{"className":176770,"style":4740},[4739],[78,176772,4609],{"className":176773},[4744],[78,176775],{"className":176776,"style":4740},[4739],[78,176778,176780,176783,176786,176789,176792,176795,176798,176801,176804,176807],{"className":176779},[4658],[78,176781],{"className":176782,"style":4663},[4662],[78,176784,78487],{"className":176785},[4667,78626],[78,176787,2066],{"className":176788},[5126],[78,176790],{"className":176791,"style":4839},[4739],[78,176793,7062],{"className":176794,"style":5219},[4667,4678],[78,176796,4594],{"className":176797},[4674],[78,176799,17143],{"className":176800},[4667,4678],[78,176802],{"className":176803,"style":5143},[4739],[78,176805,63356],{"className":176806},[7450],[78,176808],{"className":176809,"style":5143},[4739],[78,176811,176813,176816,176845,176848,176851,176854],{"className":176812},[4658],[78,176814],{"className":176815,"style":5162},[4662],[78,176817,176819,176822],{"className":176818},[4667],[78,176820,17143],{"className":176821},[4667,4678],[78,176823,176825],{"className":176824},[4689],[78,176826,176828],{"className":176827},[4693],[78,176829,176831],{"className":176830},[4698],[78,176832,176834],{"className":176833,"style":5206},[4702],[78,176835,176836,176839],{"style":5209},[78,176837],{"className":176838,"style":4711},[4710],[78,176840,176842],{"className":176841},[4715,4716,4717,4718],[78,176843,43678],{"className":176844,"style":5133},[4667,4678,4718],[78,176846,4604],{"className":176847},[4682],[78,176849],{"className":176850,"style":4740},[4739],[78,176852,4609],{"className":176853},[4744],[78,176855],{"className":176856,"style":4740},[4739],[78,176858,176860,176863,176866,176869,176872,176875,176878,176881],{"className":176859},[4658],[78,176861],{"className":176862,"style":4663},[4662],[78,176864,7062],{"className":176865,"style":5219},[4667,4678],[78,176867,4594],{"className":176868},[4674],[78,176870,78487],{"className":176871},[4667,78626],[78,176873,4604],{"className":176874},[4682],[78,176876],{"className":176877,"style":4740},[4739],[78,176879,4609],{"className":176880},[4744],[78,176882],{"className":176883,"style":4740},[4739],[78,176885,176887,176890,176893,176896,176899,176902,176905],{"className":176886},[4658],[78,176888],{"className":176889,"style":18224},[4662],[78,176891,2949],{"className":176892},[4667],[78,176894,78522],{"className":176895},[4667,6184],[78,176897,17143],{"className":176898},[4667,4678],[78,176900],{"className":176901,"style":5143},[4739],[78,176903,63356],{"className":176904},[7450],[78,176906],{"className":176907,"style":5143},[4739],[78,176909,176911,176914,176943,176946,176949],{"className":176910},[4658],[78,176912],{"className":176913,"style":5206},[4662],[78,176915,176917,176920],{"className":176916},[4667],[78,176918,17143],{"className":176919},[4667,4678],[78,176921,176923],{"className":176922},[4689],[78,176924,176926],{"className":176925},[4693],[78,176927,176929],{"className":176928},[4698],[78,176930,176932],{"className":176931,"style":5206},[4702],[78,176933,176934,176937],{"style":5209},[78,176935],{"className":176936,"style":4711},[4710],[78,176938,176940],{"className":176939},[4715,4716,4717,4718],[78,176941,43678],{"className":176942,"style":5133},[4667,4678,4718],[78,176944],{"className":176945,"style":4740},[4739],[78,176947,4609],{"className":176948},[4744],[78,176950],{"className":176951,"style":4740},[4739],[78,176953,176955,176958,176961],{"className":176954},[4658],[78,176956],{"className":176957,"style":78799},[4662],[78,176959,78487],{"className":176960},[4667,78626],[78,176962,78539],{"className":176963},[4667,6184],[13,176965,78808],{},[13,176967,78811],{},[23289,176969],{},[7759,176971,78817],{"id":78816},[10548,176973,78820],{"id":78820},[13,176975,78823],{},[13,176977,78826],{},[10548,176979,78829],{"id":78829},[13,176981,78832],{},[78,176983,176985],{"className":176984},[4566],[78,176986,176988,177019],{"className":176987},[4570],[78,176989,176991],{"className":176990},[4574],[4576,176992,176993],{"xmlns":4578,"display":4579},[4581,176994,176995,177017],{},[4584,176996,176997,176999,177001,177003,177005,177007,177009,177011,177013,177015],{},[4596,176998,17143],{},[4591,177000,4609],{},[4591,177002,55608],{"stretchy":4593},[4596,177004,4598],{},[4596,177006,63346],{"mathvariant":7101},[4596,177008,7062],{},[4591,177010,4594],{"stretchy":4593},[4596,177012,4598],{},[4591,177014,4604],{"stretchy":4593},[4591,177016,63381],{"stretchy":4593},[4647,177018,78870],{"encoding":4649},[78,177020,177022,177040],{"className":177021,"ariaHidden":1419},[4654],[78,177023,177025,177028,177031,177034,177037],{"className":177024},[4658],[78,177026],{"className":177027,"style":18224},[4662],[78,177029,17143],{"className":177030},[4667,4678],[78,177032],{"className":177033,"style":4740},[4739],[78,177035,4609],{"className":177036},[4744],[78,177038],{"className":177039,"style":4740},[4739],[78,177041,177043,177046,177049,177052,177055,177058,177061,177064],{"className":177042},[4658],[78,177044],{"className":177045,"style":4663},[4662],[78,177047,55608],{"className":177048},[4674],[78,177050,4598],{"className":177051},[4667,4678],[78,177053,63346],{"className":177054},[4667],[78,177056,7062],{"className":177057,"style":5219},[4667,4678],[78,177059,4594],{"className":177060},[4674],[78,177062,4598],{"className":177063},[4667,4678],[78,177065,78919],{"className":177066},[4682],[13,177068,78922],{},[10548,177070,78926],{"id":78925},[13,177072,78929],{},[78,177074,177076],{"className":177075},[4566],[78,177077,177079,177186],{"className":177078},[4570],[78,177080,177082],{"className":177081},[4574],[4576,177083,177084],{"xmlns":4578,"display":4579},[4581,177085,177086,177184],{},[4584,177087,177088,177090,177092,177094,177096,177098],{},[4596,177089,78947],{},[4591,177091,4594],{"stretchy":4593},[4596,177093,4598],{},[4591,177095,4604],{"stretchy":4593},[4591,177097,4609],{},[4584,177099,177100,177102],{},[4591,177101,55608],{"fence":1419},[37085,177103,177104,177124,177164],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,177105,177106],{},[37094,177107,177108],{},[37101,177109,177110],{"scriptlevel":2949,"displaystyle":4593},[4584,177111,177112,177114,177116,177118,177120,177122],{},[7077,177113,469],{},[4591,177115,2066],{"separator":1419},[4587,177117,55499],{},[4596,177119,4598],{},[4591,177121,63351],{},[4596,177123,17143],{},[37091,177125,177126],{},[37094,177127,177128],{},[37101,177129,177130],{"scriptlevel":2949,"displaystyle":4593},[4584,177131,177132,177134,177136,177142,177144,177146,177148,177150,177152,177154,177156,177158,177160,177162],{},[7077,177133,2949],{},[4591,177135,41631],{},[4600,177137,177138,177140],{},[4596,177139,78947],{},[4596,177141,17143],{},[4591,177143,4594],{"stretchy":4593},[4596,177145,4598],{},[4591,177147,4604],{"stretchy":4593},[4591,177149,41631],{},[7077,177151,469],{},[4591,177153,2066],{"separator":1419},[4587,177155,55499],{},[4596,177157,17143],{},[4587,177159,79018],{},[4596,177161,17143],{},[4587,177163,79023],{},[37091,177165,177166],{},[37094,177167,177168],{},[37101,177169,177170],{"scriptlevel":2949,"displaystyle":4593},[4584,177171,177172,177174,177176,177178,177180,177182],{},[7077,177173,2949],{},[4591,177175,2066],{"separator":1419},[4587,177177,55499],{},[4596,177179,4598],{},[4591,177181,79042],{"mathvariant":7101},[4596,177183,17143],{},[4647,177185,79047],{"encoding":4649},[78,177187,177189,177216],{"className":177188,"ariaHidden":1419},[4654],[78,177190,177192,177195,177198,177201,177204,177207,177210,177213],{"className":177191},[4658],[78,177193],{"className":177194,"style":4663},[4662],[78,177196,78947],{"className":177197},[4667,4678],[78,177199,4594],{"className":177200},[4674],[78,177202,4598],{"className":177203},[4667,4678],[78,177205,4604],{"className":177206},[4682],[78,177208],{"className":177209,"style":4740},[4739],[78,177211,4609],{"className":177212},[4744],[78,177214],{"className":177215,"style":4740},[4739],[78,177217,177219,177222],{"className":177218},[4658],[78,177220],{"className":177221,"style":56016},[4662],[78,177223,177225,177303,177537],{"className":177224},[18342],[78,177226,177228],{"className":177227},[4674],[78,177229,177231],{"className":177230},[56026,56027],[78,177232,177234,177295],{"className":177233},[4693,4694],[78,177235,177237,177292],{"className":177236},[4698],[78,177238,177240,177250,177261,177271,177282],{"className":177239,"style":56037},[4702],[78,177241,177242,177245],{"style":56040},[78,177243],{"className":177244,"style":56044},[4710],[78,177246,177248],{"className":177247},[56048,56049],[78,177249,56052],{},[78,177251,177252,177255],{"style":56055},[78,177253],{"className":177254,"style":56044},[4710],[78,177256,177257],{"style":56061},[5884,177258,177259],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,177260],{"d":56071},[78,177262,177263,177266],{"style":56074},[78,177264],{"className":177265,"style":56044},[4710],[78,177267,177269],{"className":177268},[56048,56049],[78,177270,56083],{},[78,177272,177273,177276],{"style":56086},[78,177274],{"className":177275,"style":56044},[4710],[78,177277,177278],{"style":56061},[5884,177279,177280],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,177281],{"d":56071},[78,177283,177284,177287],{"style":56098},[78,177285],{"className":177286,"style":56044},[4710],[78,177288,177290],{"className":177289},[56048,56049],[78,177291,56107],{},[78,177293,4726],{"className":177294},[4725],[78,177296,177298],{"className":177297},[4698],[78,177299,177301],{"className":177300,"style":56117},[4702],[78,177302],{},[78,177304,177306],{"className":177305},[4667],[78,177307,177309],{"className":177308},[37085],[78,177310,177312],{"className":177311},[38098],[78,177313,177315,177529],{"className":177314},[4693,4694],[78,177316,177318,177526],{"className":177317},[4698],[78,177319,177321,177356,177458],{"className":177320,"style":56138},[4702],[78,177322,177323,177326],{"style":56141},[78,177324],{"className":177325,"style":56145},[4710],[78,177327,177329,177332,177335,177338,177341,177344,177347,177350,177353],{"className":177328},[4667],[78,177330,469],{"className":177331},[4667],[78,177333,2066],{"className":177334},[5126],[78,177336],{"className":177337,"style":4839},[4739],[78,177339,55499],{"className":177340},[4667,6184],[78,177342,4598],{"className":177343},[4667,4678],[78,177345],{"className":177346,"style":4740},[4739],[78,177348,63351],{"className":177349},[4744],[78,177351],{"className":177352,"style":4740},[4739],[78,177354,17143],{"className":177355},[4667,4678],[78,177357,177358,177361],{"style":56318},[78,177359],{"className":177360,"style":56145},[4710],[78,177362,177364,177367,177370,177373,177376,177416,177419,177422,177425,177428,177431,177434,177437,177440,177443,177446,177449,177452,177455],{"className":177363},[4667],[78,177365,2949],{"className":177366},[4667],[78,177368],{"className":177369,"style":4740},[4739],[78,177371,41631],{"className":177372},[4744],[78,177374],{"className":177375,"style":4740},[4739],[78,177377,177379,177382],{"className":177378},[4667],[78,177380,78947],{"className":177381},[4667,4678],[78,177383,177385],{"className":177384},[4689],[78,177386,177388,177408],{"className":177387},[4693,4694],[78,177389,177391,177405],{"className":177390},[4698],[78,177392,177394],{"className":177393,"style":63412},[4702],[78,177395,177396,177399],{"style":4706},[78,177397],{"className":177398,"style":4711},[4710],[78,177400,177402],{"className":177401},[4715,4716,4717,4718],[78,177403,17143],{"className":177404},[4667,4678,4718],[78,177406,4726],{"className":177407},[4725],[78,177409,177411],{"className":177410},[4698],[78,177412,177414],{"className":177413,"style":4733},[4702],[78,177415],{},[78,177417,4594],{"className":177418},[4674],[78,177420,4598],{"className":177421},[4667,4678],[78,177423,4604],{"className":177424},[4682],[78,177426],{"className":177427,"style":4740},[4739],[78,177429,41631],{"className":177430},[4744],[78,177432],{"className":177433,"style":4740},[4739],[78,177435,469],{"className":177436},[4667],[78,177438,2066],{"className":177439},[5126],[78,177441],{"className":177442,"style":4839},[4739],[78,177444,55499],{"className":177445},[4667,6184],[78,177447,17143],{"className":177448},[4667,4678],[78,177450,79018],{"className":177451},[4667,6184],[78,177453,17143],{"className":177454},[4667,4678],[78,177456,79023],{"className":177457},[4667,6184],[78,177459,177460,177463],{"style":56444},[78,177461],{"className":177462,"style":56145},[4710],[78,177464,177466,177469,177472,177475,177478,177481,177484,177520,177523],{"className":177465},[4667],[78,177467,2949],{"className":177468},[4667],[78,177470,2066],{"className":177471},[5126],[78,177473],{"className":177474,"style":4839},[4739],[78,177476,55499],{"className":177477},[4667,6184],[78,177479,4598],{"className":177480},[4667,4678],[78,177482],{"className":177483,"style":4740},[4739],[78,177485,177487,177493],{"className":177486},[4744],[78,177488,177490],{"className":177489},[4667],[78,177491,63351],{"className":177492},[4744],[78,177494,177496],{"className":177495},[4667,79358],[78,177497,177499],{"className":177498},[79362],[78,177500,177502,177505,177517],{"className":177501},[79366],[78,177503],{"className":177504,"style":4663},[4662],[78,177506,177508],{"className":177507},[79373],[78,177509,177511,177514],{"className":177510},[4667],[78,177512,7102],{"className":177513},[4667],[78,177515],{"className":177516,"style":79383},[4739],[78,177518],{"className":177519},[79387],[78,177521],{"className":177522,"style":4740},[4739],[78,177524,17143],{"className":177525},[4667,4678],[78,177527,4726],{"className":177528},[4725],[78,177530,177532],{"className":177531},[4698],[78,177533,177535],{"className":177534,"style":56564},[4702],[78,177536],{},[78,177538],{"className":177539},[4682,4761],[23289,177541],{},[7759,177543,79413],{"id":79412},[13,177545,79416],{},[23289,177547],{},[7759,177549,79422],{"id":79421},[10548,177551,79426],{"id":79425},[78,177553,177555],{"className":177554,"title":79430,"style":26001},[25999],[78,177556,79434],{"className":177557},[6184],[10548,177559,79438],{"id":79437},[78,177561,177563],{"className":177562},[4566],[78,177564,177566,177977],{"className":177565},[4570],[78,177567,177569],{"className":177568},[4574],[4576,177570,177571],{"xmlns":4578,"display":4579},[4581,177572,177573,177975],{},[4584,177574,177575,177577,177579,177581,177583,177585,177587,177589,177591,177593,177595,177597,177599,177601,177603,177605,177607,177609,177611,177613,177615,177617,177619,177621,177623,177625,177627,177629,177631,177633,177635,177637,177639,177641,177643,177645,177647,177649,177651,177653,177655,177657,177659,177661,177663,177665,177667,177669,177671,177673,177675,177677,177679,177681,177683,177685,177687,177689,177691,177693,177695,177697,177699,177701,177703,177705,177707,177709,177711,177713,177715,177717,177719,177721,177723,177725,177727,177729,177731,177733,177735,177737,177739,177741,177743,177745,177747,177749,177751,177753,177755,177757,177759,177761,177763,177765,177767,177769,177771,177773,177775,177777,177779,177781,177783,177785,177787,177789,177791,177793,177795,177797,177799,177801,177803,177805,177807,177809,177811,177813,177815,177817,177819,177821,177823,177825,177827,177829,177831,177833,177835,177837,177839,177841,177843,177845,177847,177849,177851,177853,177855,177857,177859,177861,177863,177865,177867,177869,177871,177873,177875,177877,177879,177881,177883,177885,177887,177889,177891,177893,177895,177897,177909,177911,177917,177919,177925,177927,177929,177941,177943,177949,177951,177957,177959,177961,177971,177973],{},[4587,177576,79456],{},[4596,177578,17143],{},[4591,177580,63356],{},[4596,177582,17143],{},[4591,177584,4609],{},[4596,177586,17143],{},[4739,177588],{"linebreak":52940},[4587,177590,79471],{},[4596,177592,17143],{},[4591,177594,79476],{},[4596,177596,17143],{},[4591,177598,4609],{},[4596,177600,17143],{},[4739,177602],{"linebreak":52940},[4587,177604,79487],{},[4596,177606,17143],{},[4591,177608,63356],{},[4591,177610,4594],{"stretchy":4593},[4596,177612,17148],{},[4591,177614,63356],{},[4596,177616,43678],{},[4591,177618,4604],{"stretchy":4593},[4591,177620,4609],{},[4591,177622,4594],{"stretchy":4593},[4596,177624,17143],{},[4591,177626,63356],{},[4596,177628,17148],{},[4591,177630,4604],{"stretchy":4593},[4591,177632,63356],{},[4596,177634,43678],{},[4739,177636],{"linebreak":52940},[4587,177638,79471],{},[4596,177640,17143],{},[4591,177642,79476],{},[4591,177644,4594],{"stretchy":4593},[4596,177646,17148],{},[4591,177648,79476],{},[4596,177650,43678],{},[4591,177652,4604],{"stretchy":4593},[4591,177654,4609],{},[4591,177656,4594],{"stretchy":4593},[4596,177658,17143],{},[4591,177660,79476],{},[4596,177662,17148],{},[4591,177664,4604],{"stretchy":4593},[4591,177666,79476],{},[4596,177668,43678],{},[4739,177670],{"linebreak":52940},[4587,177672,79556],{},[4596,177674,17143],{},[4591,177676,63356],{},[4596,177678,17148],{},[4591,177680,4609],{},[4596,177682,17148],{},[4591,177684,63356],{},[4596,177686,17143],{},[4739,177688],{"linebreak":52940},[4587,177690,79471],{},[4596,177692,17143],{},[4591,177694,79476],{},[4596,177696,17148],{},[4591,177698,4609],{},[4596,177700,17148],{},[4591,177702,79476],{},[4596,177704,17143],{},[4739,177706],{"linebreak":52940},[4587,177708,79593],{},[4596,177710,17143],{},[4591,177712,63356],{},[4591,177714,4594],{"stretchy":4593},[4596,177716,17148],{},[4591,177718,79476],{},[4596,177720,43678],{},[4591,177722,4604],{"stretchy":4593},[4591,177724,4609],{},[4591,177726,4594],{"stretchy":4593},[4596,177728,17143],{},[4591,177730,63356],{},[4596,177732,17148],{},[4591,177734,4604],{"stretchy":4593},[4591,177736,79476],{},[4591,177738,4594],{"stretchy":4593},[4596,177740,17143],{},[4591,177742,63356],{},[4596,177744,43678],{},[4591,177746,4604],{"stretchy":4593},[4739,177748],{"linebreak":52940},[4587,177750,79471],{},[4596,177752,17143],{},[4591,177754,79476],{},[4591,177756,4594],{"stretchy":4593},[4596,177758,17148],{},[4591,177760,63356],{},[4596,177762,43678],{},[4591,177764,4604],{"stretchy":4593},[4591,177766,4609],{},[4591,177768,4594],{"stretchy":4593},[4596,177770,17143],{},[4591,177772,79476],{},[4596,177774,17148],{},[4591,177776,4604],{"stretchy":4593},[4591,177778,63356],{},[4591,177780,4594],{"stretchy":4593},[4596,177782,17143],{},[4591,177784,79476],{},[4596,177786,43678],{},[4591,177788,4604],{"stretchy":4593},[4739,177790],{"linebreak":52940},[4587,177792,79678],{},[4596,177794,17143],{},[4591,177796,63356],{},[4596,177798,79685],{},[4591,177800,4609],{},[4596,177802,17143],{},[4739,177804],{"linebreak":52940},[4587,177806,79471],{},[4596,177808,17143],{},[4591,177810,79476],{},[4596,177812,78487],{"mathvariant":7101},[4591,177814,4609],{},[4596,177816,17143],{},[4739,177818],{"linebreak":52940},[4587,177820,79708],{},[4596,177822,17143],{},[4591,177824,79476],{},[4596,177826,79685],{},[4591,177828,4609],{},[4596,177830,79685],{},[4739,177832],{"linebreak":52940},[4587,177834,79471],{},[4596,177836,17143],{},[4591,177838,63356],{},[4596,177840,78487],{"mathvariant":7101},[4591,177842,4609],{},[4596,177844,78487],{"mathvariant":7101},[4739,177846],{"linebreak":52940},[4587,177848,79737],{},[4596,177850,17143],{},[4591,177852,63356],{},[4591,177854,4594],{"stretchy":4593},[4596,177856,17143],{},[4591,177858,79476],{},[4596,177860,17148],{},[4591,177862,4604],{"stretchy":4593},[4591,177864,4609],{},[4596,177866,17143],{},[4739,177868],{"linebreak":52940},[4587,177870,79471],{},[4596,177872,17143],{},[4591,177874,79476],{},[4591,177876,4594],{"stretchy":4593},[4596,177878,17143],{},[4591,177880,63356],{},[4596,177882,17148],{},[4591,177884,4604],{"stretchy":4593},[4591,177886,4609],{},[4596,177888,17143],{},[4739,177890],{"linebreak":52940},[4587,177892,79782],{},[4591,177894,17848],{},[4587,177896,79787],{},[79789,177898,177899,177907],{"accent":1419},[4584,177900,177901,177903,177905],{},[4596,177902,17143],{},[4591,177904,63356],{},[4596,177906,17148],{},[4591,177908,79801],{"stretchy":1419},[4591,177910,4609],{},[79789,177912,177913,177915],{"accent":1419},[4596,177914,17143],{},[4591,177916,79801],{"stretchy":1419},[4591,177918,79476],{},[79789,177920,177921,177923],{"accent":1419},[4596,177922,17148],{},[4591,177924,79801],{"stretchy":1419},[4739,177926],{"linebreak":52940},[4587,177928,79822],{},[79789,177930,177931,177939],{"accent":1419},[4584,177932,177933,177935,177937],{},[4596,177934,17143],{},[4591,177936,79476],{},[4596,177938,17148],{},[4591,177940,79801],{"stretchy":1419},[4591,177942,4609],{},[79789,177944,177945,177947],{"accent":1419},[4596,177946,17143],{},[4591,177948,79801],{"stretchy":1419},[4591,177950,63356],{},[79789,177952,177953,177955],{"accent":1419},[4596,177954,17148],{},[4591,177956,79801],{"stretchy":1419},[4739,177958],{"linebreak":52940},[4587,177960,79855],{},[79789,177962,177963,177969],{"accent":1419},[79789,177964,177965,177967],{"accent":1419},[4596,177966,17143],{},[4591,177968,79801],{"stretchy":1419},[4591,177970,79801],{"stretchy":1419},[4591,177972,4609],{},[4596,177974,17143],{},[4647,177976,79872],{"encoding":4649},[78,177978,177980,178001,178019,178028,178031,178088,178106,178115,178118,178139,178160,178181,178202,178223,178232,178235,178292,178313,178334,178355,178376,178385,178388,178409,178427,178445,178454,178457,178514,178532,178550,178559,178562,178583,178604,178625,178646,178667,178688,178700,178703,178760,178781,178802,178823,178844,178865,178877,178880,178901,178919,178928,178931,178988,179006,179015,179018,179039,179057,179066,179069,179126,179144,179153,179156,179177,179198,179219,179228,179231,179288,179309,179330,179339,179342,179360,179421,179467,179504,179507,179625,179671,179708,179711,179788],{"className":177979,"ariaHidden":1419},[4654],[78,177981,177983,177986,177989,177992,177995,177998],{"className":177982},[4658],[78,177984],{"className":177985,"style":18224},[4662],[78,177987,79456],{"className":177988},[4667,6184],[78,177990,17143],{"className":177991},[4667,4678],[78,177993],{"className":177994,"style":5143},[4739],[78,177996,63356],{"className":177997},[7450],[78,177999],{"className":178000,"style":5143},[4739],[78,178002,178004,178007,178010,178013,178016],{"className":178003},[4658],[78,178005],{"className":178006,"style":18224},[4662],[78,178008,17143],{"className":178009},[4667,4678],[78,178011],{"className":178012,"style":4740},[4739],[78,178014,4609],{"className":178015},[4744],[78,178017],{"className":178018,"style":4740},[4739],[78,178020,178022,178025],{"className":178021},[4658],[78,178023],{"className":178024,"style":18224},[4662],[78,178026,17143],{"className":178027},[4667,4678],[78,178029],{"className":178030},[4739,52940],[78,178032,178034,178037,178040,178043,178046,178049,178052,178055,178058,178061,178064,178067,178070,178073,178076,178079,178082,178085],{"className":178033},[4658],[78,178035],{"className":178036,"style":18224},[4662],[78,178038,79936],{"className":178039},[4739],[78,178041,79936],{"className":178042},[4739],[78,178044,79936],{"className":178045},[4739],[78,178047,79936],{"className":178048},[4739],[78,178050,79936],{"className":178051},[4739],[78,178053,79936],{"className":178054},[4739],[78,178056,79936],{"className":178057},[4739],[78,178059,79936],{"className":178060},[4739],[78,178062,79936],{"className":178063},[4739],[78,178065,79936],{"className":178066},[4739],[78,178068,79936],{"className":178069},[4739],[78,178071,79936],{"className":178072},[4739],[78,178074,79936],{"className":178075},[4739],[78,178077,17143],{"className":178078},[4667,4678],[78,178080],{"className":178081,"style":5143},[4739],[78,178083,79476],{"className":178084},[7450],[78,178086],{"className":178087,"style":5143},[4739],[78,178089,178091,178094,178097,178100,178103],{"className":178090},[4658],[78,178092],{"className":178093,"style":18224},[4662],[78,178095,17143],{"className":178096},[4667,4678],[78,178098],{"className":178099,"style":4740},[4739],[78,178101,4609],{"className":178102},[4744],[78,178104],{"className":178105,"style":4740},[4739],[78,178107,178109,178112],{"className":178108},[4658],[78,178110],{"className":178111,"style":18224},[4662],[78,178113,17143],{"className":178114},[4667,4678],[78,178116],{"className":178117},[4739,52940],[78,178119,178121,178124,178127,178130,178133,178136],{"className":178120},[4658],[78,178122],{"className":178123,"style":18224},[4662],[78,178125,79487],{"className":178126},[4667,6184],[78,178128,17143],{"className":178129},[4667,4678],[78,178131],{"className":178132,"style":5143},[4739],[78,178134,63356],{"className":178135},[7450],[78,178137],{"className":178138,"style":5143},[4739],[78,178140,178142,178145,178148,178151,178154,178157],{"className":178141},[4658],[78,178143],{"className":178144,"style":4663},[4662],[78,178146,4594],{"className":178147},[4674],[78,178149,17148],{"className":178150,"style":17276},[4667,4678],[78,178152],{"className":178153,"style":5143},[4739],[78,178155,63356],{"className":178156},[7450],[78,178158],{"className":178159,"style":5143},[4739],[78,178161,178163,178166,178169,178172,178175,178178],{"className":178162},[4658],[78,178164],{"className":178165,"style":4663},[4662],[78,178167,43678],{"className":178168,"style":5133},[4667,4678],[78,178170,4604],{"className":178171},[4682],[78,178173],{"className":178174,"style":4740},[4739],[78,178176,4609],{"className":178177},[4744],[78,178179],{"className":178180,"style":4740},[4739],[78,178182,178184,178187,178190,178193,178196,178199],{"className":178183},[4658],[78,178185],{"className":178186,"style":4663},[4662],[78,178188,4594],{"className":178189},[4674],[78,178191,17143],{"className":178192},[4667,4678],[78,178194],{"className":178195,"style":5143},[4739],[78,178197,63356],{"className":178198},[7450],[78,178200],{"className":178201,"style":5143},[4739],[78,178203,178205,178208,178211,178214,178217,178220],{"className":178204},[4658],[78,178206],{"className":178207,"style":4663},[4662],[78,178209,17148],{"className":178210,"style":17276},[4667,4678],[78,178212,4604],{"className":178213},[4682],[78,178215],{"className":178216,"style":5143},[4739],[78,178218,63356],{"className":178219},[7450],[78,178221],{"className":178222,"style":5143},[4739],[78,178224,178226,178229],{"className":178225},[4658],[78,178227],{"className":178228,"style":18224},[4662],[78,178230,43678],{"className":178231,"style":5133},[4667,4678],[78,178233],{"className":178234},[4739,52940],[78,178236,178238,178241,178244,178247,178250,178253,178256,178259,178262,178265,178268,178271,178274,178277,178280,178283,178286,178289],{"className":178237},[4658],[78,178239],{"className":178240,"style":18224},[4662],[78,178242,79936],{"className":178243},[4739],[78,178245,79936],{"className":178246},[4739],[78,178248,79936],{"className":178249},[4739],[78,178251,79936],{"className":178252},[4739],[78,178254,79936],{"className":178255},[4739],[78,178257,79936],{"className":178258},[4739],[78,178260,79936],{"className":178261},[4739],[78,178263,79936],{"className":178264},[4739],[78,178266,79936],{"className":178267},[4739],[78,178269,79936],{"className":178270},[4739],[78,178272,79936],{"className":178273},[4739],[78,178275,79936],{"className":178276},[4739],[78,178278,79936],{"className":178279},[4739],[78,178281,17143],{"className":178282},[4667,4678],[78,178284],{"className":178285,"style":5143},[4739],[78,178287,79476],{"className":178288},[7450],[78,178290],{"className":178291,"style":5143},[4739],[78,178293,178295,178298,178301,178304,178307,178310],{"className":178294},[4658],[78,178296],{"className":178297,"style":4663},[4662],[78,178299,4594],{"className":178300},[4674],[78,178302,17148],{"className":178303,"style":17276},[4667,4678],[78,178305],{"className":178306,"style":5143},[4739],[78,178308,79476],{"className":178309},[7450],[78,178311],{"className":178312,"style":5143},[4739],[78,178314,178316,178319,178322,178325,178328,178331],{"className":178315},[4658],[78,178317],{"className":178318,"style":4663},[4662],[78,178320,43678],{"className":178321,"style":5133},[4667,4678],[78,178323,4604],{"className":178324},[4682],[78,178326],{"className":178327,"style":4740},[4739],[78,178329,4609],{"className":178330},[4744],[78,178332],{"className":178333,"style":4740},[4739],[78,178335,178337,178340,178343,178346,178349,178352],{"className":178336},[4658],[78,178338],{"className":178339,"style":4663},[4662],[78,178341,4594],{"className":178342},[4674],[78,178344,17143],{"className":178345},[4667,4678],[78,178347],{"className":178348,"style":5143},[4739],[78,178350,79476],{"className":178351},[7450],[78,178353],{"className":178354,"style":5143},[4739],[78,178356,178358,178361,178364,178367,178370,178373],{"className":178357},[4658],[78,178359],{"className":178360,"style":4663},[4662],[78,178362,17148],{"className":178363,"style":17276},[4667,4678],[78,178365,4604],{"className":178366},[4682],[78,178368],{"className":178369,"style":5143},[4739],[78,178371,79476],{"className":178372},[7450],[78,178374],{"className":178375,"style":5143},[4739],[78,178377,178379,178382],{"className":178378},[4658],[78,178380],{"className":178381,"style":18224},[4662],[78,178383,43678],{"className":178384,"style":5133},[4667,4678],[78,178386],{"className":178387},[4739,52940],[78,178389,178391,178394,178397,178400,178403,178406],{"className":178390},[4658],[78,178392],{"className":178393,"style":18224},[4662],[78,178395,79556],{"className":178396},[4667,6184],[78,178398,17143],{"className":178399},[4667,4678],[78,178401],{"className":178402,"style":5143},[4739],[78,178404,63356],{"className":178405},[7450],[78,178407],{"className":178408,"style":5143},[4739],[78,178410,178412,178415,178418,178421,178424],{"className":178411},[4658],[78,178413],{"className":178414,"style":18224},[4662],[78,178416,17148],{"className":178417,"style":17276},[4667,4678],[78,178419],{"className":178420,"style":4740},[4739],[78,178422,4609],{"className":178423},[4744],[78,178425],{"className":178426,"style":4740},[4739],[78,178428,178430,178433,178436,178439,178442],{"className":178429},[4658],[78,178431],{"className":178432,"style":18224},[4662],[78,178434,17148],{"className":178435,"style":17276},[4667,4678],[78,178437],{"className":178438,"style":5143},[4739],[78,178440,63356],{"className":178441},[7450],[78,178443],{"className":178444,"style":5143},[4739],[78,178446,178448,178451],{"className":178447},[4658],[78,178449],{"className":178450,"style":18224},[4662],[78,178452,17143],{"className":178453},[4667,4678],[78,178455],{"className":178456},[4739,52940],[78,178458,178460,178463,178466,178469,178472,178475,178478,178481,178484,178487,178490,178493,178496,178499,178502,178505,178508,178511],{"className":178459},[4658],[78,178461],{"className":178462,"style":18224},[4662],[78,178464,79936],{"className":178465},[4739],[78,178467,79936],{"className":178468},[4739],[78,178470,79936],{"className":178471},[4739],[78,178473,79936],{"className":178474},[4739],[78,178476,79936],{"className":178477},[4739],[78,178479,79936],{"className":178480},[4739],[78,178482,79936],{"className":178483},[4739],[78,178485,79936],{"className":178486},[4739],[78,178488,79936],{"className":178489},[4739],[78,178491,79936],{"className":178492},[4739],[78,178494,79936],{"className":178495},[4739],[78,178497,79936],{"className":178498},[4739],[78,178500,79936],{"className":178501},[4739],[78,178503,17143],{"className":178504},[4667,4678],[78,178506],{"className":178507,"style":5143},[4739],[78,178509,79476],{"className":178510},[7450],[78,178512],{"className":178513,"style":5143},[4739],[78,178515,178517,178520,178523,178526,178529],{"className":178516},[4658],[78,178518],{"className":178519,"style":18224},[4662],[78,178521,17148],{"className":178522,"style":17276},[4667,4678],[78,178524],{"className":178525,"style":4740},[4739],[78,178527,4609],{"className":178528},[4744],[78,178530],{"className":178531,"style":4740},[4739],[78,178533,178535,178538,178541,178544,178547],{"className":178534},[4658],[78,178536],{"className":178537,"style":18224},[4662],[78,178539,17148],{"className":178540,"style":17276},[4667,4678],[78,178542],{"className":178543,"style":5143},[4739],[78,178545,79476],{"className":178546},[7450],[78,178548],{"className":178549,"style":5143},[4739],[78,178551,178553,178556],{"className":178552},[4658],[78,178554],{"className":178555,"style":18224},[4662],[78,178557,17143],{"className":178558},[4667,4678],[78,178560],{"className":178561},[4739,52940],[78,178563,178565,178568,178571,178574,178577,178580],{"className":178564},[4658],[78,178566],{"className":178567,"style":18224},[4662],[78,178569,79593],{"className":178570},[4667,6184],[78,178572,17143],{"className":178573},[4667,4678],[78,178575],{"className":178576,"style":5143},[4739],[78,178578,63356],{"className":178579},[7450],[78,178581],{"className":178582,"style":5143},[4739],[78,178584,178586,178589,178592,178595,178598,178601],{"className":178585},[4658],[78,178587],{"className":178588,"style":4663},[4662],[78,178590,4594],{"className":178591},[4674],[78,178593,17148],{"className":178594,"style":17276},[4667,4678],[78,178596],{"className":178597,"style":5143},[4739],[78,178599,79476],{"className":178600},[7450],[78,178602],{"className":178603,"style":5143},[4739],[78,178605,178607,178610,178613,178616,178619,178622],{"className":178606},[4658],[78,178608],{"className":178609,"style":4663},[4662],[78,178611,43678],{"className":178612,"style":5133},[4667,4678],[78,178614,4604],{"className":178615},[4682],[78,178617],{"className":178618,"style":4740},[4739],[78,178620,4609],{"className":178621},[4744],[78,178623],{"className":178624,"style":4740},[4739],[78,178626,178628,178631,178634,178637,178640,178643],{"className":178627},[4658],[78,178629],{"className":178630,"style":4663},[4662],[78,178632,4594],{"className":178633},[4674],[78,178635,17143],{"className":178636},[4667,4678],[78,178638],{"className":178639,"style":5143},[4739],[78,178641,63356],{"className":178642},[7450],[78,178644],{"className":178645,"style":5143},[4739],[78,178647,178649,178652,178655,178658,178661,178664],{"className":178648},[4658],[78,178650],{"className":178651,"style":4663},[4662],[78,178653,17148],{"className":178654,"style":17276},[4667,4678],[78,178656,4604],{"className":178657},[4682],[78,178659],{"className":178660,"style":5143},[4739],[78,178662,79476],{"className":178663},[7450],[78,178665],{"className":178666,"style":5143},[4739],[78,178668,178670,178673,178676,178679,178682,178685],{"className":178669},[4658],[78,178671],{"className":178672,"style":4663},[4662],[78,178674,4594],{"className":178675},[4674],[78,178677,17143],{"className":178678},[4667,4678],[78,178680],{"className":178681,"style":5143},[4739],[78,178683,63356],{"className":178684},[7450],[78,178686],{"className":178687,"style":5143},[4739],[78,178689,178691,178694,178697],{"className":178690},[4658],[78,178692],{"className":178693,"style":4663},[4662],[78,178695,43678],{"className":178696,"style":5133},[4667,4678],[78,178698,4604],{"className":178699},[4682],[78,178701],{"className":178702},[4739,52940],[78,178704,178706,178709,178712,178715,178718,178721,178724,178727,178730,178733,178736,178739,178742,178745,178748,178751,178754,178757],{"className":178705},[4658],[78,178707],{"className":178708,"style":18224},[4662],[78,178710,79936],{"className":178711},[4739],[78,178713,79936],{"className":178714},[4739],[78,178716,79936],{"className":178717},[4739],[78,178719,79936],{"className":178720},[4739],[78,178722,79936],{"className":178723},[4739],[78,178725,79936],{"className":178726},[4739],[78,178728,79936],{"className":178729},[4739],[78,178731,79936],{"className":178732},[4739],[78,178734,79936],{"className":178735},[4739],[78,178737,79936],{"className":178738},[4739],[78,178740,79936],{"className":178741},[4739],[78,178743,79936],{"className":178744},[4739],[78,178746,79936],{"className":178747},[4739],[78,178749,17143],{"className":178750},[4667,4678],[78,178752],{"className":178753,"style":5143},[4739],[78,178755,79476],{"className":178756},[7450],[78,178758],{"className":178759,"style":5143},[4739],[78,178761,178763,178766,178769,178772,178775,178778],{"className":178762},[4658],[78,178764],{"className":178765,"style":4663},[4662],[78,178767,4594],{"className":178768},[4674],[78,178770,17148],{"className":178771,"style":17276},[4667,4678],[78,178773],{"className":178774,"style":5143},[4739],[78,178776,63356],{"className":178777},[7450],[78,178779],{"className":178780,"style":5143},[4739],[78,178782,178784,178787,178790,178793,178796,178799],{"className":178783},[4658],[78,178785],{"className":178786,"style":4663},[4662],[78,178788,43678],{"className":178789,"style":5133},[4667,4678],[78,178791,4604],{"className":178792},[4682],[78,178794],{"className":178795,"style":4740},[4739],[78,178797,4609],{"className":178798},[4744],[78,178800],{"className":178801,"style":4740},[4739],[78,178803,178805,178808,178811,178814,178817,178820],{"className":178804},[4658],[78,178806],{"className":178807,"style":4663},[4662],[78,178809,4594],{"className":178810},[4674],[78,178812,17143],{"className":178813},[4667,4678],[78,178815],{"className":178816,"style":5143},[4739],[78,178818,79476],{"className":178819},[7450],[78,178821],{"className":178822,"style":5143},[4739],[78,178824,178826,178829,178832,178835,178838,178841],{"className":178825},[4658],[78,178827],{"className":178828,"style":4663},[4662],[78,178830,17148],{"className":178831,"style":17276},[4667,4678],[78,178833,4604],{"className":178834},[4682],[78,178836],{"className":178837,"style":5143},[4739],[78,178839,63356],{"className":178840},[7450],[78,178842],{"className":178843,"style":5143},[4739],[78,178845,178847,178850,178853,178856,178859,178862],{"className":178846},[4658],[78,178848],{"className":178849,"style":4663},[4662],[78,178851,4594],{"className":178852},[4674],[78,178854,17143],{"className":178855},[4667,4678],[78,178857],{"className":178858,"style":5143},[4739],[78,178860,79476],{"className":178861},[7450],[78,178863],{"className":178864,"style":5143},[4739],[78,178866,178868,178871,178874],{"className":178867},[4658],[78,178869],{"className":178870,"style":4663},[4662],[78,178872,43678],{"className":178873,"style":5133},[4667,4678],[78,178875,4604],{"className":178876},[4682],[78,178878],{"className":178879},[4739,52940],[78,178881,178883,178886,178889,178892,178895,178898],{"className":178882},[4658],[78,178884],{"className":178885,"style":18224},[4662],[78,178887,79678],{"className":178888},[4667,6184],[78,178890,17143],{"className":178891},[4667,4678],[78,178893],{"className":178894,"style":5143},[4739],[78,178896,63356],{"className":178897},[7450],[78,178899],{"className":178900,"style":5143},[4739],[78,178902,178904,178907,178910,178913,178916],{"className":178903},[4658],[78,178905],{"className":178906,"style":18224},[4662],[78,178908,79685],{"className":178909,"style":80807},[4667,4678],[78,178911],{"className":178912,"style":4740},[4739],[78,178914,4609],{"className":178915},[4744],[78,178917],{"className":178918,"style":4740},[4739],[78,178920,178922,178925],{"className":178921},[4658],[78,178923],{"className":178924,"style":18224},[4662],[78,178926,17143],{"className":178927},[4667,4678],[78,178929],{"className":178930},[4739,52940],[78,178932,178934,178937,178940,178943,178946,178949,178952,178955,178958,178961,178964,178967,178970,178973,178976,178979,178982,178985],{"className":178933},[4658],[78,178935],{"className":178936,"style":18224},[4662],[78,178938,79936],{"className":178939},[4739],[78,178941,79936],{"className":178942},[4739],[78,178944,79936],{"className":178945},[4739],[78,178947,79936],{"className":178948},[4739],[78,178950,79936],{"className":178951},[4739],[78,178953,79936],{"className":178954},[4739],[78,178956,79936],{"className":178957},[4739],[78,178959,79936],{"className":178960},[4739],[78,178962,79936],{"className":178963},[4739],[78,178965,79936],{"className":178966},[4739],[78,178968,79936],{"className":178969},[4739],[78,178971,79936],{"className":178972},[4739],[78,178974,79936],{"className":178975},[4739],[78,178977,17143],{"className":178978},[4667,4678],[78,178980],{"className":178981,"style":5143},[4739],[78,178983,79476],{"className":178984},[7450],[78,178986],{"className":178987,"style":5143},[4739],[78,178989,178991,178994,178997,179000,179003],{"className":178990},[4658],[78,178992],{"className":178993,"style":80892},[4662],[78,178995,78487],{"className":178996},[4667,78626],[78,178998],{"className":178999,"style":4740},[4739],[78,179001,4609],{"className":179002},[4744],[78,179004],{"className":179005,"style":4740},[4739],[78,179007,179009,179012],{"className":179008},[4658],[78,179010],{"className":179011,"style":18224},[4662],[78,179013,17143],{"className":179014},[4667,4678],[78,179016],{"className":179017},[4739,52940],[78,179019,179021,179024,179027,179030,179033,179036],{"className":179020},[4658],[78,179022],{"className":179023,"style":18224},[4662],[78,179025,79708],{"className":179026},[4667,6184],[78,179028,17143],{"className":179029},[4667,4678],[78,179031],{"className":179032,"style":5143},[4739],[78,179034,79476],{"className":179035},[7450],[78,179037],{"className":179038,"style":5143},[4739],[78,179040,179042,179045,179048,179051,179054],{"className":179041},[4658],[78,179043],{"className":179044,"style":18224},[4662],[78,179046,79685],{"className":179047,"style":80807},[4667,4678],[78,179049],{"className":179050,"style":4740},[4739],[78,179052,4609],{"className":179053},[4744],[78,179055],{"className":179056,"style":4740},[4739],[78,179058,179060,179063],{"className":179059},[4658],[78,179061],{"className":179062,"style":18224},[4662],[78,179064,79685],{"className":179065,"style":80807},[4667,4678],[78,179067],{"className":179068},[4739,52940],[78,179070,179072,179075,179078,179081,179084,179087,179090,179093,179096,179099,179102,179105,179108,179111,179114,179117,179120,179123],{"className":179071},[4658],[78,179073],{"className":179074,"style":18224},[4662],[78,179076,79936],{"className":179077},[4739],[78,179079,79936],{"className":179080},[4739],[78,179082,79936],{"className":179083},[4739],[78,179085,79936],{"className":179086},[4739],[78,179088,79936],{"className":179089},[4739],[78,179091,79936],{"className":179092},[4739],[78,179094,79936],{"className":179095},[4739],[78,179097,79936],{"className":179098},[4739],[78,179100,79936],{"className":179101},[4739],[78,179103,79936],{"className":179104},[4739],[78,179106,79936],{"className":179107},[4739],[78,179109,79936],{"className":179110},[4739],[78,179112,79936],{"className":179113},[4739],[78,179115,17143],{"className":179116},[4667,4678],[78,179118],{"className":179119,"style":5143},[4739],[78,179121,63356],{"className":179122},[7450],[78,179124],{"className":179125,"style":5143},[4739],[78,179127,179129,179132,179135,179138,179141],{"className":179128},[4658],[78,179130],{"className":179131,"style":80892},[4662],[78,179133,78487],{"className":179134},[4667,78626],[78,179136],{"className":179137,"style":4740},[4739],[78,179139,4609],{"className":179140},[4744],[78,179142],{"className":179143,"style":4740},[4739],[78,179145,179147,179150],{"className":179146},[4658],[78,179148],{"className":179149,"style":80892},[4662],[78,179151,78487],{"className":179152},[4667,78626],[78,179154],{"className":179155},[4739,52940],[78,179157,179159,179162,179165,179168,179171,179174],{"className":179158},[4658],[78,179160],{"className":179161,"style":18224},[4662],[78,179163,79737],{"className":179164},[4667,6184],[78,179166,17143],{"className":179167},[4667,4678],[78,179169],{"className":179170,"style":5143},[4739],[78,179172,63356],{"className":179173},[7450],[78,179175],{"className":179176,"style":5143},[4739],[78,179178,179180,179183,179186,179189,179192,179195],{"className":179179},[4658],[78,179181],{"className":179182,"style":4663},[4662],[78,179184,4594],{"className":179185},[4674],[78,179187,17143],{"className":179188},[4667,4678],[78,179190],{"className":179191,"style":5143},[4739],[78,179193,79476],{"className":179194},[7450],[78,179196],{"className":179197,"style":5143},[4739],[78,179199,179201,179204,179207,179210,179213,179216],{"className":179200},[4658],[78,179202],{"className":179203,"style":4663},[4662],[78,179205,17148],{"className":179206,"style":17276},[4667,4678],[78,179208,4604],{"className":179209},[4682],[78,179211],{"className":179212,"style":4740},[4739],[78,179214,4609],{"className":179215},[4744],[78,179217],{"className":179218,"style":4740},[4739],[78,179220,179222,179225],{"className":179221},[4658],[78,179223],{"className":179224,"style":18224},[4662],[78,179226,17143],{"className":179227},[4667,4678],[78,179229],{"className":179230},[4739,52940],[78,179232,179234,179237,179240,179243,179246,179249,179252,179255,179258,179261,179264,179267,179270,179273,179276,179279,179282,179285],{"className":179233},[4658],[78,179235],{"className":179236,"style":18224},[4662],[78,179238,79936],{"className":179239},[4739],[78,179241,79936],{"className":179242},[4739],[78,179244,79936],{"className":179245},[4739],[78,179247,79936],{"className":179248},[4739],[78,179250,79936],{"className":179251},[4739],[78,179253,79936],{"className":179254},[4739],[78,179256,79936],{"className":179257},[4739],[78,179259,79936],{"className":179260},[4739],[78,179262,79936],{"className":179263},[4739],[78,179265,79936],{"className":179266},[4739],[78,179268,79936],{"className":179269},[4739],[78,179271,79936],{"className":179272},[4739],[78,179274,79936],{"className":179275},[4739],[78,179277,17143],{"className":179278},[4667,4678],[78,179280],{"className":179281,"style":5143},[4739],[78,179283,79476],{"className":179284},[7450],[78,179286],{"className":179287,"style":5143},[4739],[78,179289,179291,179294,179297,179300,179303,179306],{"className":179290},[4658],[78,179292],{"className":179293,"style":4663},[4662],[78,179295,4594],{"className":179296},[4674],[78,179298,17143],{"className":179299},[4667,4678],[78,179301],{"className":179302,"style":5143},[4739],[78,179304,63356],{"className":179305},[7450],[78,179307],{"className":179308,"style":5143},[4739],[78,179310,179312,179315,179318,179321,179324,179327],{"className":179311},[4658],[78,179313],{"className":179314,"style":4663},[4662],[78,179316,17148],{"className":179317,"style":17276},[4667,4678],[78,179319,4604],{"className":179320},[4682],[78,179322],{"className":179323,"style":4740},[4739],[78,179325,4609],{"className":179326},[4744],[78,179328],{"className":179329,"style":4740},[4739],[78,179331,179333,179336],{"className":179332},[4658],[78,179334],{"className":179335,"style":18224},[4662],[78,179337,17143],{"className":179338},[4667,4678],[78,179340],{"className":179341},[4739,52940],[78,179343,179345,179348,179351,179354,179357],{"className":179344},[4658],[78,179346],{"className":179347,"style":63901},[4662],[78,179349,79782],{"className":179350},[4667,6184],[78,179352],{"className":179353,"style":5143},[4739],[78,179355,17848],{"className":179356},[7450],[78,179358],{"className":179359,"style":5143},[4739],[78,179361,179363,179366,179369,179412,179415,179418],{"className":179362},[4658],[78,179364],{"className":179365,"style":81265},[4662],[78,179367,79787],{"className":179368},[4667,6184],[78,179370,179372],{"className":179371},[4667,81272],[78,179373,179375],{"className":179374},[4693],[78,179376,179378],{"className":179377},[4698],[78,179379,179381,179404],{"className":179380,"style":81265},[4702],[78,179382,179383,179386],{"style":5824},[78,179384],{"className":179385,"style":4781},[4710],[78,179387,179389,179392,179395,179398,179401],{"className":179388},[4667],[78,179390,17143],{"className":179391},[4667,4678],[78,179393],{"className":179394,"style":5143},[4739],[78,179396,63356],{"className":179397},[7450],[78,179399],{"className":179400,"style":5143},[4739],[78,179402,17148],{"className":179403,"style":17276},[4667,4678],[78,179405,179406,179409],{"style":81307},[78,179407],{"className":179408,"style":4781},[4710],[78,179410],{"className":179411,"style":4927},[81314],[78,179413],{"className":179414,"style":4740},[4739],[78,179416,4609],{"className":179417},[4744],[78,179419],{"className":179420,"style":4740},[4739],[78,179422,179424,179427,179458,179461,179464],{"className":179423},[4658],[78,179425],{"className":179426,"style":81265},[4662],[78,179428,179430],{"className":179429},[4667,81272],[78,179431,179433],{"className":179432},[4693],[78,179434,179436],{"className":179435},[4698],[78,179437,179439,179450],{"className":179438,"style":81265},[4702],[78,179440,179441,179444],{"style":5824},[78,179442],{"className":179443,"style":4781},[4710],[78,179445,179447],{"className":179446},[4667],[78,179448,17143],{"className":179449},[4667,4678],[78,179451,179452,179455],{"style":81307},[78,179453],{"className":179454,"style":4781},[4710],[78,179456],{"className":179457,"style":4927},[81314],[78,179459],{"className":179460,"style":5143},[4739],[78,179462,79476],{"className":179463},[7450],[78,179465],{"className":179466,"style":5143},[4739],[78,179468,179470,179473],{"className":179469},[4658],[78,179471],{"className":179472,"style":81265},[4662],[78,179474,179476],{"className":179475},[4667,81272],[78,179477,179479],{"className":179478},[4693],[78,179480,179482],{"className":179481},[4698],[78,179483,179485,179496],{"className":179484,"style":81265},[4702],[78,179486,179487,179490],{"style":5824},[78,179488],{"className":179489,"style":4781},[4710],[78,179491,179493],{"className":179492},[4667],[78,179494,17148],{"className":179495,"style":17276},[4667,4678],[78,179497,179498,179501],{"style":81307},[78,179499],{"className":179500,"style":4781},[4710],[78,179502],{"className":179503,"style":4927},[81314],[78,179505],{"className":179506},[4739,52940],[78,179508,179510,179513,179516,179519,179522,179525,179528,179531,179534,179537,179540,179543,179546,179549,179552,179555,179558,179561,179564,179567,179570,179573,179616,179619,179622],{"className":179509},[4658],[78,179511],{"className":179512,"style":81265},[4662],[78,179514,79936],{"className":179515},[4739],[78,179517,79936],{"className":179518},[4739],[78,179520,79936],{"className":179521},[4739],[78,179523,79936],{"className":179524},[4739],[78,179526,79936],{"className":179527},[4739],[78,179529,79936],{"className":179530},[4739],[78,179532,79936],{"className":179533},[4739],[78,179535,79936],{"className":179536},[4739],[78,179538,79936],{"className":179539},[4739],[78,179541,79936],{"className":179542},[4739],[78,179544,79936],{"className":179545},[4739],[78,179547,79936],{"className":179548},[4739],[78,179550,79936],{"className":179551},[4739],[78,179553,79936],{"className":179554},[4739],[78,179556,79936],{"className":179557},[4739],[78,179559,79936],{"className":179560},[4739],[78,179562,79936],{"className":179563},[4739],[78,179565,79936],{"className":179566},[4739],[78,179568,79936],{"className":179569},[4739],[78,179571,79936],{"className":179572},[4739],[78,179574,179576],{"className":179575},[4667,81272],[78,179577,179579],{"className":179578},[4693],[78,179580,179582],{"className":179581},[4698],[78,179583,179585,179608],{"className":179584,"style":81265},[4702],[78,179586,179587,179590],{"style":5824},[78,179588],{"className":179589,"style":4781},[4710],[78,179591,179593,179596,179599,179602,179605],{"className":179592},[4667],[78,179594,17143],{"className":179595},[4667,4678],[78,179597],{"className":179598,"style":5143},[4739],[78,179600,79476],{"className":179601},[7450],[78,179603],{"className":179604,"style":5143},[4739],[78,179606,17148],{"className":179607,"style":17276},[4667,4678],[78,179609,179610,179613],{"style":81307},[78,179611],{"className":179612,"style":4781},[4710],[78,179614],{"className":179615,"style":4927},[81314],[78,179617],{"className":179618,"style":4740},[4739],[78,179620,4609],{"className":179621},[4744],[78,179623],{"className":179624,"style":4740},[4739],[78,179626,179628,179631,179662,179665,179668],{"className":179627},[4658],[78,179629],{"className":179630,"style":81265},[4662],[78,179632,179634],{"className":179633},[4667,81272],[78,179635,179637],{"className":179636},[4693],[78,179638,179640],{"className":179639},[4698],[78,179641,179643,179654],{"className":179642,"style":81265},[4702],[78,179644,179645,179648],{"style":5824},[78,179646],{"className":179647,"style":4781},[4710],[78,179649,179651],{"className":179650},[4667],[78,179652,17143],{"className":179653},[4667,4678],[78,179655,179656,179659],{"style":81307},[78,179657],{"className":179658,"style":4781},[4710],[78,179660],{"className":179661,"style":4927},[81314],[78,179663],{"className":179664,"style":5143},[4739],[78,179666,63356],{"className":179667},[7450],[78,179669],{"className":179670,"style":5143},[4739],[78,179672,179674,179677],{"className":179673},[4658],[78,179675],{"className":179676,"style":81265},[4662],[78,179678,179680],{"className":179679},[4667,81272],[78,179681,179683],{"className":179682},[4693],[78,179684,179686],{"className":179685},[4698],[78,179687,179689,179700],{"className":179688,"style":81265},[4702],[78,179690,179691,179694],{"style":5824},[78,179692],{"className":179693,"style":4781},[4710],[78,179695,179697],{"className":179696},[4667],[78,179698,17148],{"className":179699,"style":17276},[4667,4678],[78,179701,179702,179705],{"style":81307},[78,179703],{"className":179704,"style":4781},[4710],[78,179706],{"className":179707,"style":4927},[81314],[78,179709],{"className":179710},[4739,52940],[78,179712,179714,179717,179720,179779,179782,179785],{"className":179713},[4658],[78,179715],{"className":179716,"style":81620},[4662],[78,179718,79855],{"className":179719},[4667,6184],[78,179721,179723],{"className":179722},[4667,81272],[78,179724,179726],{"className":179725},[4693],[78,179727,179729],{"className":179728},[4698],[78,179730,179732,179771],{"className":179731,"style":81620},[4702],[78,179733,179734,179737],{"style":5824},[78,179735],{"className":179736,"style":4781},[4710],[78,179738,179740],{"className":179739},[4667],[78,179741,179743],{"className":179742},[4667,81272],[78,179744,179746],{"className":179745},[4693],[78,179747,179749],{"className":179748},[4698],[78,179750,179752,179763],{"className":179751,"style":81265},[4702],[78,179753,179754,179757],{"style":5824},[78,179755],{"className":179756,"style":4781},[4710],[78,179758,179760],{"className":179759},[4667],[78,179761,17143],{"className":179762},[4667,4678],[78,179764,179765,179768],{"style":81307},[78,179766],{"className":179767,"style":4781},[4710],[78,179769],{"className":179770,"style":4927},[81314],[78,179772,179773,179776],{"style":81677},[78,179774],{"className":179775,"style":4781},[4710],[78,179777],{"className":179778,"style":4927},[81314],[78,179780],{"className":179781,"style":4740},[4739],[78,179783,4609],{"className":179784},[4744],[78,179786],{"className":179787,"style":4740},[4739],[78,179789,179791,179794],{"className":179790},[4658],[78,179792],{"className":179793,"style":18224},[4662],[78,179795,17143],{"className":179796},[4667,4678],[10548,179798,81705],{"id":81704},[78,179800,179802],{"className":179801},[4566],[78,179803,179805,180364],{"className":179804},[4570],[78,179806,179808],{"className":179807},[4574],[4576,179809,179810],{"xmlns":4578,"display":4579},[4581,179811,179812,180362],{},[37085,179813,179814,179874,179914,179964,179992,180028,180056,180104,180144,180192,180220,180300],{"rowspacing":37087,"columnalign":37088,"columnspacing":37089},[37091,179815,179816,179842],{},[37094,179817,179818],{},[37101,179819,179820],{"scriptlevel":2949,"displaystyle":1419},[4584,179821,179822,179824,179826,179828,179830,179832,179834,179836,179838,179840],{},[4596,179823,81731],{},[4596,179825,5009],{},[4596,179827,5245],{},[4596,179829,4618],{},[4596,179831,26052],{},[4587,179833,81742],{},[4591,179835,37170],{},[4587,179837,52816],{},[4591,179839,37210],{},[4587,179841,81751],{},[37094,179843,179844],{},[37101,179845,179846],{"scriptlevel":2949,"displaystyle":1419},[4584,179847,179848,179850,179852,179854,179856,179858,179860,179862,179864,179866,179868,179870,179872],{},[4584,179849],{},[4596,179851,5009],{},[4591,179853,37210],{},[4596,179855,12172],{},[4591,179857,4609],{},[4596,179859,5058],{},[4596,179861,5009],{},[4596,179863,4598],{},[4591,179865,55608],{"stretchy":4593},[4596,179867,5009],{},[4591,179869,2066],{"separator":1419},[4596,179871,12172],{},[4591,179873,63381],{"stretchy":4593},[37091,179875,179876,179882],{},[37094,179877,179878],{},[37101,179879,179880],{"scriptlevel":2949,"displaystyle":1419},[4584,179881],{},[37094,179883,179884],{},[37101,179885,179886],{"scriptlevel":2949,"displaystyle":1419},[4584,179887,179888,179890,179892,179894,179896,179898,179900,179902,179904,179906,179908,179910,179912],{},[4584,179889],{},[4596,179891,5009],{},[4591,179893,37170],{},[4596,179895,12172],{},[4591,179897,4609],{},[4596,179899,5058],{},[4596,179901,39],{},[4596,179903,19],{},[4591,179905,55608],{"stretchy":4593},[4596,179907,5009],{},[4591,179909,2066],{"separator":1419},[4596,179911,12172],{},[4591,179913,63381],{"stretchy":4593},[37091,179915,179916,179932],{},[37094,179917,179918],{},[37101,179919,179920],{"scriptlevel":2949,"displaystyle":1419},[4584,179921,179922,179924,179926,179928,179930],{},[4587,179923,81834],{},[4591,179925,37210],{},[4587,179927,52816],{},[4591,179929,17162],{},[4587,179931,81751],{},[37094,179933,179934],{},[37101,179935,179936],{"scriptlevel":2949,"displaystyle":1419},[4584,179937,179938,179940,179942,179944,179946,179948,179950,179952,179954,179956,179958,179960,179962],{},[4584,179939],{},[4596,179941,5009],{},[4591,179943,37210],{},[4596,179945,12172],{},[4591,179947,4609],{},[4596,179949,5058],{},[4596,179951,5009],{},[4596,179953,4598],{},[4591,179955,55608],{"stretchy":4593},[4596,179957,5009],{},[4591,179959,2066],{"separator":1419},[4596,179961,12172],{},[4591,179963,63381],{"stretchy":4593},[37091,179965,179966,179972],{},[37094,179967,179968],{},[37101,179969,179970],{"scriptlevel":2949,"displaystyle":1419},[4584,179971],{},[37094,179973,179974],{},[37101,179975,179976],{"scriptlevel":2949,"displaystyle":1419},[4584,179977,179978,179980,179982,179984,179986,179988,179990],{},[4584,179979],{},[4596,179981,5009],{},[4591,179983,17162],{},[4596,179985,12172],{},[4591,179987,4609],{},[4596,179989,5009],{},[4596,179991,12172],{},[37091,179993,179994,180000],{},[37094,179995,179996],{},[37101,179997,179998],{"scriptlevel":2949,"displaystyle":1419},[4587,179999,81911],{},[37094,180001,180002],{},[37101,180003,180004],{"scriptlevel":2949,"displaystyle":1419},[4584,180005,180006,180008,180010,180012,180014,180016,180018,180020,180022,180024,180026],{},[4584,180007],{},[4596,180009,5009],{},[4587,180011,81924],{},[4596,180013,12172],{},[4591,180015,4609],{},[4596,180017,5009],{},[4591,180019,7351],{},[4596,180021,12172],{},[4591,180023,17848],{},[4596,180025,5009],{},[4596,180027,12172],{},[37091,180029,180030,180036],{},[37094,180031,180032],{},[37101,180033,180034],{"scriptlevel":2949,"displaystyle":1419},[4584,180035],{},[37094,180037,180038],{},[37101,180039,180040],{"scriptlevel":2949,"displaystyle":1419},[4584,180041,180042,180044,180046,180048,180050,180052,180054],{},[4584,180043],{},[4596,180045,5009],{},[4591,180047,17162],{},[4596,180049,12172],{},[4591,180051,4609],{},[4596,180053,5009],{},[4596,180055,12172],{},[37091,180057,180058,180074],{},[37094,180059,180060],{},[37101,180061,180062],{"scriptlevel":2949,"displaystyle":1419},[4584,180063,180064,180066,180068,180070,180072],{},[4587,180065,81979],{},[4591,180067,81982],{},[4587,180069,52816],{},[4591,180071,37170],{},[4587,180073,81751],{},[37094,180075,180076],{},[37101,180077,180078],{"scriptlevel":2949,"displaystyle":1419},[4584,180079,180080,180082,180084,180086,180088,180090,180092,180094,180096,180098,180100,180102],{},[4584,180081],{},[4596,180083,5009],{},[4591,180085,81982],{},[4596,180087,12172],{},[4591,180089,4609],{},[7077,180091,469],{},[4591,180093,37170],{},[4591,180095,4594],{"stretchy":4593},[4596,180097,5009],{},[4591,180099,7351],{},[4596,180101,12172],{},[4591,180103,4604],{"stretchy":4593},[37091,180105,180106,180112],{},[37094,180107,180108],{},[37101,180109,180110],{"scriptlevel":2949,"displaystyle":1419},[4584,180111],{},[37094,180113,180114],{},[37101,180115,180116],{"scriptlevel":2949,"displaystyle":1419},[4584,180117,180118,180120,180122,180124,180126,180128,180130,180132,180134,180136,180138,180140,180142],{},[4584,180119],{},[4596,180121,5009],{},[4591,180123,37170],{},[4596,180125,12172],{},[4591,180127,4609],{},[4596,180129,5058],{},[4596,180131,39],{},[4596,180133,19],{},[4591,180135,55608],{"stretchy":4593},[4596,180137,5009],{},[4591,180139,2066],{"separator":1419},[4596,180141,12172],{},[4591,180143,63381],{"stretchy":4593},[37091,180145,180146,180162],{},[37094,180147,180148],{},[37101,180149,180150],{"scriptlevel":2949,"displaystyle":1419},[4584,180151,180152,180154,180156,180158,180160],{},[4587,180153,82069],{},[4591,180155,81982],{},[4587,180157,52816],{},[4591,180159,17162],{},[4587,180161,81751],{},[37094,180163,180164],{},[37101,180165,180166],{"scriptlevel":2949,"displaystyle":1419},[4584,180167,180168,180170,180172,180174,180176,180178,180180,180182,180184,180186,180188,180190],{},[4584,180169],{},[4596,180171,5009],{},[4591,180173,81982],{},[4596,180175,12172],{},[4591,180177,4609],{},[7077,180179,469],{},[4591,180181,37170],{},[4591,180183,4594],{"stretchy":4593},[4596,180185,5009],{},[4591,180187,7351],{},[4596,180189,12172],{},[4591,180191,4604],{"stretchy":4593},[37091,180193,180194,180200],{},[37094,180195,180196],{},[37101,180197,180198],{"scriptlevel":2949,"displaystyle":1419},[4584,180199],{},[37094,180201,180202],{},[37101,180203,180204],{"scriptlevel":2949,"displaystyle":1419},[4584,180205,180206,180208,180210,180212,180214,180216,180218],{},[4584,180207],{},[4596,180209,5009],{},[4591,180211,17162],{},[4596,180213,12172],{},[4591,180215,4609],{},[4596,180217,5009],{},[4596,180219,12172],{},[37091,180221,180222,180260],{},[37094,180223,180224],{},[37101,180225,180226],{"scriptlevel":2949,"displaystyle":1419},[4584,180227,180228,180230,180232,180234,180236,180238,180240,180242,180244,180250,180252,180258],{},[4596,180229,7065],{},[4596,180231,39],{},[4596,180233,19],{},[4596,180235,262],{},[4596,180237,5009],{},[4596,180239,39],{},[4596,180241,19],{},[4587,180243,81742],{},[4614,180245,180246,180248],{},[4596,180247,52813],{},[4591,180249,7351],{},[4587,180251,52816],{},[4614,180253,180254,180256],{},[4596,180255,52813],{},[4591,180257,17848],{},[4587,180259,81751],{},[37094,180261,180262],{},[37101,180263,180264],{"scriptlevel":2949,"displaystyle":1419},[4584,180265,180266,180268,180270,180276,180278,180280],{},[4584,180267],{},[4596,180269,5009],{},[4614,180271,180272,180274],{},[4596,180273,52813],{},[4591,180275,7351],{},[4596,180277,12172],{},[4591,180279,4609],{},[4611,180281,180282,180290],{},[4584,180283,180284,180286,180288],{},[4596,180285,5009],{},[4591,180287,7351],{},[4596,180289,12172],{},[4584,180291,180292,180294,180296,180298],{},[7077,180293,469],{},[4591,180295,7351],{},[4596,180297,5009],{},[4596,180299,12172],{},[37091,180301,180302,180308],{},[37094,180303,180304],{},[37101,180305,180306],{"scriptlevel":2949,"displaystyle":1419},[4584,180307],{},[37094,180309,180310],{},[37101,180311,180312],{"scriptlevel":2949,"displaystyle":1419},[4584,180313,180314,180316,180318,180324,180326,180328],{},[4584,180315],{},[4596,180317,5009],{},[4614,180319,180320,180322],{},[4596,180321,52813],{},[4591,180323,17848],{},[4596,180325,12172],{},[4591,180327,4609],{},[4611,180329,180330,180336],{},[4584,180331,180332,180334],{},[4596,180333,5009],{},[4596,180335,12172],{},[4584,180337,180338,180340,180342,180344,180346,180348,180350,180352,180354,180356,180358,180360],{},[7077,180339,469],{},[4591,180341,7351],{},[4591,180343,4594],{"stretchy":4593},[7077,180345,469],{},[4591,180347,17848],{},[4596,180349,5009],{},[4591,180351,4604],{"stretchy":4593},[4591,180353,4594],{"stretchy":4593},[7077,180355,469],{},[4591,180357,17848],{},[4596,180359,12172],{},[4591,180361,4604],{"stretchy":4593},[4647,180363,82280],{"encoding":4649},[78,180365,180367],{"className":180366,"ariaHidden":1419},[4654],[78,180368,180370,180373],{"className":180369},[4658],[78,180371],{"className":180372,"style":82290},[4662],[78,180374,180376],{"className":180375},[4667],[78,180377,180379,180709],{"className":180378},[37085],[78,180380,180382],{"className":180381},[37883],[78,180383,180385,180701],{"className":180384},[4693,4694],[78,180386,180388,180698],{"className":180387},[4698],[78,180389,180391,180441,180449,180484,180492,180509,180517,180552,180560,180595,180603,180690],{"className":180390,"style":82309},[4702],[78,180392,180393,180396],{"style":82312},[78,180394],{"className":180395,"style":82316},[4710],[78,180397,180399,180402,180405,180408,180411,180414,180417,180420,180423,180426,180429,180432,180435,180438],{"className":180398},[4667],[78,180400,81731],{"className":180401,"style":5133},[4667,4678],[78,180403,5009],{"className":180404},[4667,4678],[78,180406,5245],{"className":180407},[4667,4678],[78,180409,4618],{"className":180410},[4667,4678],[78,180412,26052],{"className":180413},[4667,4678],[78,180415,81742],{"className":180416},[4667,6184],[78,180418],{"className":180419,"style":5143},[4739],[78,180421,37170],{"className":180422},[7450],[78,180424],{"className":180425,"style":5143},[4739],[78,180427,52816],{"className":180428},[4667,6184],[78,180430],{"className":180431,"style":5143},[4739],[78,180433,37210],{"className":180434},[7450],[78,180436],{"className":180437,"style":5143},[4739],[78,180439,81751],{"className":180440},[4667,6184],[78,180442,180443,180446],{"style":82364},[78,180444],{"className":180445,"style":82316},[4710],[78,180447],{"className":180448},[4667],[78,180450,180451,180454],{"style":82373},[78,180452],{"className":180453,"style":82316},[4710],[78,180455,180457,180460,180463,180466,180469,180472,180475,180478,180481],{"className":180456},[4667],[78,180458,81834],{"className":180459},[4667,6184],[78,180461],{"className":180462,"style":5143},[4739],[78,180464,37210],{"className":180465},[7450],[78,180467],{"className":180468,"style":5143},[4739],[78,180470,52816],{"className":180471},[4667,6184],[78,180473],{"className":180474,"style":5143},[4739],[78,180476,17162],{"className":180477},[7450],[78,180479],{"className":180480,"style":5143},[4739],[78,180482,81751],{"className":180483},[4667,6184],[78,180485,180486,180489],{"style":82409},[78,180487],{"className":180488,"style":82316},[4710],[78,180490],{"className":180491},[4667],[78,180493,180494,180497],{"style":82418},[78,180495],{"className":180496,"style":82316},[4710],[78,180498,180500,180503,180506],{"className":180499},[4667],[78,180501,82428],{"className":180502},[4667,6184],[78,180504,81924],{"className":180505},[4667],[78,180507,82435],{"className":180508},[4667,6184],[78,180510,180511,180514],{"style":82438},[78,180512],{"className":180513,"style":82316},[4710],[78,180515],{"className":180516},[4667],[78,180518,180519,180522],{"style":82447},[78,180520],{"className":180521,"style":82316},[4710],[78,180523,180525,180528,180531,180534,180537,180540,180543,180546,180549],{"className":180524},[4667],[78,180526,81979],{"className":180527},[4667,6184],[78,180529],{"className":180530,"style":5143},[4739],[78,180532,81982],{"className":180533},[7450],[78,180535],{"className":180536,"style":5143},[4739],[78,180538,52816],{"className":180539},[4667,6184],[78,180541],{"className":180542,"style":5143},[4739],[78,180544,37170],{"className":180545},[7450],[78,180547],{"className":180548,"style":5143},[4739],[78,180550,81751],{"className":180551},[4667,6184],[78,180553,180554,180557],{"style":82483},[78,180555],{"className":180556,"style":82316},[4710],[78,180558],{"className":180559},[4667],[78,180561,180562,180565],{"style":82492},[78,180563],{"className":180564,"style":82316},[4710],[78,180566,180568,180571,180574,180577,180580,180583,180586,180589,180592],{"className":180567},[4667],[78,180569,82069],{"className":180570},[4667,6184],[78,180572],{"className":180573,"style":5143},[4739],[78,180575,81982],{"className":180576},[7450],[78,180578],{"className":180579,"style":5143},[4739],[78,180581,52816],{"className":180582},[4667,6184],[78,180584],{"className":180585,"style":5143},[4739],[78,180587,17162],{"className":180588},[7450],[78,180590],{"className":180591,"style":5143},[4739],[78,180593,81751],{"className":180594},[4667,6184],[78,180596,180597,180600],{"style":82528},[78,180598],{"className":180599,"style":82316},[4710],[78,180601],{"className":180602},[4667],[78,180604,180605,180608],{"style":82537},[78,180606],{"className":180607,"style":82316},[4710],[78,180609,180611,180614,180617,180620,180623,180626,180655,180658,180687],{"className":180610},[4667],[78,180612,7065],{"className":180613,"style":7153},[4667,4678],[78,180615,7201],{"className":180616},[4667,4678],[78,180618,262],{"className":180619},[4667,4678],[78,180621,82556],{"className":180622},[4667,4678],[78,180624,81742],{"className":180625},[4667,6184],[78,180627,180629,180632],{"className":180628},[4667],[78,180630,52813],{"className":180631},[4667,4678],[78,180633,180635],{"className":180634},[4689],[78,180636,180638],{"className":180637},[4693],[78,180639,180641],{"className":180640},[4698],[78,180642,180644],{"className":180643,"style":53493},[4702],[78,180645,180646,180649],{"style":5209},[78,180647],{"className":180648,"style":4711},[4710],[78,180650,180652],{"className":180651},[4715,4716,4717,4718],[78,180653,7351],{"className":180654},[7450,4718],[78,180656,52816],{"className":180657},[4667,6184],[78,180659,180661,180664],{"className":180660},[4667],[78,180662,52813],{"className":180663},[4667,4678],[78,180665,180667],{"className":180666},[4689],[78,180668,180670],{"className":180669},[4693],[78,180671,180673],{"className":180672},[4698],[78,180674,180676],{"className":180675,"style":53493},[4702],[78,180677,180678,180681],{"style":5209},[78,180679],{"className":180680,"style":4711},[4710],[78,180682,180684],{"className":180683},[4715,4716,4717,4718],[78,180685,17848],{"className":180686},[7450,4718],[78,180688,81751],{"className":180689},[4667,6184],[78,180691,180692,180695],{"style":82626},[78,180693],{"className":180694,"style":82316},[4710],[78,180696],{"className":180697},[4667],[78,180699,4726],{"className":180700},[4725],[78,180702,180704],{"className":180703},[4698],[78,180705,180707],{"className":180706,"style":82642},[4702],[78,180708],{},[78,180710,180712],{"className":180711},[38098],[78,180713,180715,181569],{"className":180714},[4693,4694],[78,180716,180718,181566],{"className":180717},[4698],[78,180719,180721,180780,180836,180895,180933,180989,181027,181095,181151,181219,181257,181398],{"className":180720,"style":82309},[4702],[78,180722,180723,180726],{"style":82312},[78,180724],{"className":180725,"style":82316},[4710],[78,180727,180729,180732,180735,180738,180741,180744,180747,180750,180753,180756,180759,180762,180765,180768,180771,180774,180777],{"className":180728},[4667],[78,180730],{"className":180731},[4667],[78,180733,5009],{"className":180734},[4667,4678],[78,180736],{"className":180737,"style":5143},[4739],[78,180739,37210],{"className":180740},[7450],[78,180742],{"className":180743,"style":5143},[4739],[78,180745,12172],{"className":180746},[4667,4678],[78,180748],{"className":180749,"style":4740},[4739],[78,180751,4609],{"className":180752},[4744],[78,180754],{"className":180755,"style":4740},[4739],[78,180757,5177],{"className":180758},[4667,4678],[78,180760,4598],{"className":180761},[4667,4678],[78,180763,55608],{"className":180764},[4674],[78,180766,5009],{"className":180767},[4667,4678],[78,180769,2066],{"className":180770},[5126],[78,180772],{"className":180773,"style":4839},[4739],[78,180775,12172],{"className":180776},[4667,4678],[78,180778,63381],{"className":180779},[4682],[78,180781,180782,180785],{"style":82364},[78,180783],{"className":180784,"style":82316},[4710],[78,180786,180788,180791,180794,180797,180800,180803,180806,180809,180812,180815,180818,180821,180824,180827,180830,180833],{"className":180787},[4667],[78,180789],{"className":180790},[4667],[78,180792,5009],{"className":180793},[4667,4678],[78,180795],{"className":180796,"style":5143},[4739],[78,180798,37170],{"className":180799},[7450],[78,180801],{"className":180802,"style":5143},[4739],[78,180804,12172],{"className":180805},[4667,4678],[78,180807],{"className":180808,"style":4740},[4739],[78,180810,4609],{"className":180811},[4744],[78,180813],{"className":180814,"style":4740},[4739],[78,180816,82754],{"className":180817},[4667,4678],[78,180819,55608],{"className":180820},[4674],[78,180822,5009],{"className":180823},[4667,4678],[78,180825,2066],{"className":180826},[5126],[78,180828],{"className":180829,"style":4839},[4739],[78,180831,12172],{"className":180832},[4667,4678],[78,180834,63381],{"className":180835},[4682],[78,180837,180838,180841],{"style":82373},[78,180839],{"className":180840,"style":82316},[4710],[78,180842,180844,180847,180850,180853,180856,180859,180862,180865,180868,180871,180874,180877,180880,180883,180886,180889,180892],{"className":180843},[4667],[78,180845],{"className":180846},[4667],[78,180848,5009],{"className":180849},[4667,4678],[78,180851],{"className":180852,"style":5143},[4739],[78,180854,37210],{"className":180855},[7450],[78,180857],{"className":180858,"style":5143},[4739],[78,180860,12172],{"className":180861},[4667,4678],[78,180863],{"className":180864,"style":4740},[4739],[78,180866,4609],{"className":180867},[4744],[78,180869],{"className":180870,"style":4740},[4739],[78,180872,5177],{"className":180873},[4667,4678],[78,180875,4598],{"className":180876},[4667,4678],[78,180878,55608],{"className":180879},[4674],[78,180881,5009],{"className":180882},[4667,4678],[78,180884,2066],{"className":180885},[5126],[78,180887],{"className":180888,"style":4839},[4739],[78,180890,12172],{"className":180891},[4667,4678],[78,180893,63381],{"className":180894},[4682],[78,180896,180897,180900],{"style":82409},[78,180898],{"className":180899,"style":82316},[4710],[78,180901,180903,180906,180909,180912,180915,180918,180921,180924,180927,180930],{"className":180902},[4667],[78,180904],{"className":180905},[4667],[78,180907,5009],{"className":180908},[4667,4678],[78,180910],{"className":180911,"style":5143},[4739],[78,180913,17162],{"className":180914},[7450],[78,180916],{"className":180917,"style":5143},[4739],[78,180919,12172],{"className":180920},[4667,4678],[78,180922],{"className":180923,"style":4740},[4739],[78,180925,4609],{"className":180926},[4744],[78,180928],{"className":180929,"style":4740},[4739],[78,180931,82870],{"className":180932},[4667,4678],[78,180934,180935,180938],{"style":82418},[78,180936],{"className":180937,"style":82316},[4710],[78,180939,180941,180944,180947,180950,180953,180956,180959,180962,180965,180968,180971,180974,180977,180980,180983,180986],{"className":180940},[4667],[78,180942],{"className":180943},[4667],[78,180945,5009],{"className":180946},[4667,4678],[78,180948,81924],{"className":180949},[4667],[78,180951,12172],{"className":180952},[4667,4678],[78,180954],{"className":180955,"style":4740},[4739],[78,180957,4609],{"className":180958},[4744],[78,180960],{"className":180961,"style":4740},[4739],[78,180963,5009],{"className":180964},[4667,4678],[78,180966],{"className":180967,"style":5143},[4739],[78,180969,7351],{"className":180970},[7450],[78,180972],{"className":180973,"style":5143},[4739],[78,180975,12172],{"className":180976},[4667,4678],[78,180978],{"className":180979,"style":5143},[4739],[78,180981,17848],{"className":180982},[7450],[78,180984],{"className":180985,"style":5143},[4739],[78,180987,82870],{"className":180988},[4667,4678],[78,180990,180991,180994],{"style":82438},[78,180992],{"className":180993,"style":82316},[4710],[78,180995,180997,181000,181003,181006,181009,181012,181015,181018,181021,181024],{"className":180996},[4667],[78,180998],{"className":180999},[4667],[78,181001,5009],{"className":181002},[4667,4678],[78,181004],{"className":181005,"style":5143},[4739],[78,181007,17162],{"className":181008},[7450],[78,181010],{"className":181011,"style":5143},[4739],[78,181013,12172],{"className":181014},[4667,4678],[78,181016],{"className":181017,"style":4740},[4739],[78,181019,4609],{"className":181020},[4744],[78,181022],{"className":181023,"style":4740},[4739],[78,181025,82870],{"className":181026},[4667,4678],[78,181028,181029,181032],{"style":82447},[78,181030],{"className":181031,"style":82316},[4710],[78,181033,181035,181038,181041,181044,181047,181050,181053,181056,181059,181062,181065,181068,181071,181074,181077,181080,181083,181086,181089,181092],{"className":181034},[4667],[78,181036],{"className":181037},[4667],[78,181039,5009],{"className":181040},[4667,4678],[78,181042],{"className":181043,"style":5143},[4739],[78,181045,81982],{"className":181046},[7450],[78,181048],{"className":181049,"style":5143},[4739],[78,181051,12172],{"className":181052},[4667,4678],[78,181054],{"className":181055,"style":4740},[4739],[78,181057,4609],{"className":181058},[4744],[78,181060],{"className":181061,"style":4740},[4739],[78,181063,469],{"className":181064},[4667],[78,181066],{"className":181067,"style":5143},[4739],[78,181069,37170],{"className":181070},[7450],[78,181072],{"className":181073,"style":5143},[4739],[78,181075,4594],{"className":181076},[4674],[78,181078,5009],{"className":181079},[4667,4678],[78,181081],{"className":181082,"style":5143},[4739],[78,181084,7351],{"className":181085},[7450],[78,181087],{"className":181088,"style":5143},[4739],[78,181090,12172],{"className":181091},[4667,4678],[78,181093,4604],{"className":181094},[4682],[78,181096,181097,181100],{"style":82483},[78,181098],{"className":181099,"style":82316},[4710],[78,181101,181103,181106,181109,181112,181115,181118,181121,181124,181127,181130,181133,181136,181139,181142,181145,181148],{"className":181102},[4667],[78,181104],{"className":181105},[4667],[78,181107,5009],{"className":181108},[4667,4678],[78,181110],{"className":181111,"style":5143},[4739],[78,181113,37170],{"className":181114},[7450],[78,181116],{"className":181117,"style":5143},[4739],[78,181119,12172],{"className":181120},[4667,4678],[78,181122],{"className":181123,"style":4740},[4739],[78,181125,4609],{"className":181126},[4744],[78,181128],{"className":181129,"style":4740},[4739],[78,181131,82754],{"className":181132},[4667,4678],[78,181134,55608],{"className":181135},[4674],[78,181137,5009],{"className":181138},[4667,4678],[78,181140,2066],{"className":181141},[5126],[78,181143],{"className":181144,"style":4839},[4739],[78,181146,12172],{"className":181147},[4667,4678],[78,181149,63381],{"className":181150},[4682],[78,181152,181153,181156],{"style":82492},[78,181154],{"className":181155,"style":82316},[4710],[78,181157,181159,181162,181165,181168,181171,181174,181177,181180,181183,181186,181189,181192,181195,181198,181201,181204,181207,181210,181213,181216],{"className":181158},[4667],[78,181160],{"className":181161},[4667],[78,181163,5009],{"className":181164},[4667,4678],[78,181166],{"className":181167,"style":5143},[4739],[78,181169,81982],{"className":181170},[7450],[78,181172],{"className":181173,"style":5143},[4739],[78,181175,12172],{"className":181176},[4667,4678],[78,181178],{"className":181179,"style":4740},[4739],[78,181181,4609],{"className":181182},[4744],[78,181184],{"className":181185,"style":4740},[4739],[78,181187,469],{"className":181188},[4667],[78,181190],{"className":181191,"style":5143},[4739],[78,181193,37170],{"className":181194},[7450],[78,181196],{"className":181197,"style":5143},[4739],[78,181199,4594],{"className":181200},[4674],[78,181202,5009],{"className":181203},[4667,4678],[78,181205],{"className":181206,"style":5143},[4739],[78,181208,7351],{"className":181209},[7450],[78,181211],{"className":181212,"style":5143},[4739],[78,181214,12172],{"className":181215},[4667,4678],[78,181217,4604],{"className":181218},[4682],[78,181220,181221,181224],{"style":82528},[78,181222],{"className":181223,"style":82316},[4710],[78,181225,181227,181230,181233,181236,181239,181242,181245,181248,181251,181254],{"className":181226},[4667],[78,181228],{"className":181229},[4667],[78,181231,5009],{"className":181232},[4667,4678],[78,181234],{"className":181235,"style":5143},[4739],[78,181237,17162],{"className":181238},[7450],[78,181240],{"className":181241,"style":5143},[4739],[78,181243,12172],{"className":181244},[4667,4678],[78,181246],{"className":181247,"style":4740},[4739],[78,181249,4609],{"className":181250},[4744],[78,181252],{"className":181253,"style":4740},[4739],[78,181255,82870],{"className":181256},[4667,4678],[78,181258,181259,181262],{"style":82537},[78,181260],{"className":181261,"style":82316},[4710],[78,181263,181265,181268,181271,181300,181303,181306,181309,181312],{"className":181264},[4667],[78,181266],{"className":181267},[4667],[78,181269,5009],{"className":181270},[4667,4678],[78,181272,181274,181277],{"className":181273},[4667],[78,181275,52813],{"className":181276},[4667,4678],[78,181278,181280],{"className":181279},[4689],[78,181281,181283],{"className":181282},[4693],[78,181284,181286],{"className":181285},[4698],[78,181287,181289],{"className":181288,"style":53493},[4702],[78,181290,181291,181294],{"style":5209},[78,181292],{"className":181293,"style":4711},[4710],[78,181295,181297],{"className":181296},[4715,4716,4717,4718],[78,181298,7351],{"className":181299},[7450,4718],[78,181301,12172],{"className":181302},[4667,4678],[78,181304],{"className":181305,"style":4740},[4739],[78,181307,4609],{"className":181308},[4744],[78,181310],{"className":181311,"style":4740},[4739],[78,181313,181315,181318,181395],{"className":181314},[4667],[78,181316],{"className":181317},[4674,4761],[78,181319,181321],{"className":181320},[4611],[78,181322,181324,181387],{"className":181323},[4693,4694],[78,181325,181327,181384],{"className":181326},[4698],[78,181328,181330,181353,181361],{"className":181329,"style":83268},[4702],[78,181331,181332,181335],{"style":4777},[78,181333],{"className":181334,"style":4781},[4710],[78,181336,181338,181341,181344,181347,181350],{"className":181337},[4667],[78,181339,469],{"className":181340},[4667],[78,181342],{"className":181343,"style":5143},[4739],[78,181345,7351],{"className":181346},[7450],[78,181348],{"className":181349,"style":5143},[4739],[78,181351,82870],{"className":181352},[4667,4678],[78,181354,181355,181358],{"style":4919},[78,181356],{"className":181357,"style":4781},[4710],[78,181359],{"className":181360,"style":4927},[4926],[78,181362,181363,181366],{"style":4930},[78,181364],{"className":181365,"style":4781},[4710],[78,181367,181369,181372,181375,181378,181381],{"className":181368},[4667],[78,181370,5009],{"className":181371},[4667,4678],[78,181373],{"className":181374,"style":5143},[4739],[78,181376,7351],{"className":181377},[7450],[78,181379],{"className":181380,"style":5143},[4739],[78,181382,12172],{"className":181383},[4667,4678],[78,181385,4726],{"className":181386},[4725],[78,181388,181390],{"className":181389},[4698],[78,181391,181393],{"className":181392,"style":83332},[4702],[78,181394],{},[78,181396],{"className":181397},[4682,4761],[78,181399,181400,181403],{"style":82626},[78,181401],{"className":181402,"style":82316},[4710],[78,181404,181406,181409,181412,181441,181444,181447,181450,181453],{"className":181405},[4667],[78,181407],{"className":181408},[4667],[78,181410,5009],{"className":181411},[4667,4678],[78,181413,181415,181418],{"className":181414},[4667],[78,181416,52813],{"className":181417},[4667,4678],[78,181419,181421],{"className":181420},[4689],[78,181422,181424],{"className":181423},[4693],[78,181425,181427],{"className":181426},[4698],[78,181428,181430],{"className":181429,"style":53493},[4702],[78,181431,181432,181435],{"style":5209},[78,181433],{"className":181434,"style":4711},[4710],[78,181436,181438],{"className":181437},[4715,4716,4717,4718],[78,181439,17848],{"className":181440},[7450,4718],[78,181442,12172],{"className":181443},[4667,4678],[78,181445],{"className":181446,"style":4740},[4739],[78,181448,4609],{"className":181449},[4744],[78,181451],{"className":181452,"style":4740},[4739],[78,181454,181456,181459,181563],{"className":181455},[4667],[78,181457],{"className":181458},[4674,4761],[78,181460,181462],{"className":181461},[4611],[78,181463,181465,181555],{"className":181464},[4693,4694],[78,181466,181468,181552],{"className":181467},[4698],[78,181469,181471,181533,181541],{"className":181470,"style":83268},[4702],[78,181472,181473,181476],{"style":4777},[78,181474],{"className":181475,"style":4781},[4710],[78,181477,181479,181482,181485,181488,181491,181494,181497,181500,181503,181506,181509,181512,181515,181518,181521,181524,181527,181530],{"className":181478},[4667],[78,181480,469],{"className":181481},[4667],[78,181483],{"className":181484,"style":5143},[4739],[78,181486,7351],{"className":181487},[7450],[78,181489],{"className":181490,"style":5143},[4739],[78,181492,4594],{"className":181493},[4674],[78,181495,469],{"className":181496},[4667],[78,181498],{"className":181499,"style":5143},[4739],[78,181501,17848],{"className":181502},[7450],[78,181504],{"className":181505,"style":5143},[4739],[78,181507,5009],{"className":181508},[4667,4678],[78,181510,4604],{"className":181511},[4682],[78,181513,4594],{"className":181514},[4674],[78,181516,469],{"className":181517},[4667],[78,181519],{"className":181520,"style":5143},[4739],[78,181522,17848],{"className":181523},[7450],[78,181525],{"className":181526,"style":5143},[4739],[78,181528,12172],{"className":181529},[4667,4678],[78,181531,4604],{"className":181532},[4682],[78,181534,181535,181538],{"style":4919},[78,181536],{"className":181537,"style":4781},[4710],[78,181539],{"className":181540,"style":4927},[4926],[78,181542,181543,181546],{"style":4930},[78,181544],{"className":181545,"style":4781},[4710],[78,181547,181549],{"className":181548},[4667],[78,181550,82870],{"className":181551},[4667,4678],[78,181553,4726],{"className":181554},[4725],[78,181556,181558],{"className":181557},[4698],[78,181559,181561],{"className":181560,"style":17380},[4702],[78,181562],{},[78,181564],{"className":181565},[4682,4761],[78,181567,4726],{"className":181568},[4725],[78,181570,181572],{"className":181571},[4698],[78,181573,181575],{"className":181574,"style":82642},[4702],[78,181576],{},[23289,181578],{},[7759,181580,83522],{"id":83521},[13,181582,83525,181583,83528],{},[596,181584,78947],{},[78,181586,181588],{"className":181587},[4566],[78,181589,181591,181624],{"className":181590},[4570],[78,181592,181594],{"className":181593},[4574],[4576,181595,181596],{"xmlns":4578,"display":4579},[4581,181597,181598,181622],{},[4584,181599,181600,181606,181608,181610,181612,181614,181616,181618,181620],{},[4600,181601,181602,181604],{},[4596,181603,78947],{},[4596,181605,17143],{},[4591,181607,8661],{},[4596,181609,79685],{},[4591,181611,37501],{},[4591,181613,17845],{"stretchy":4593},[7077,181615,2949],{},[4591,181617,2066],{"separator":1419},[7077,181619,469],{},[4591,181621,17857],{"stretchy":4593},[4647,181623,83568],{"encoding":4649},[78,181625,181627,181682,181700],{"className":181626,"ariaHidden":1419},[4654],[78,181628,181630,181633,181673,181676,181679],{"className":181629},[4658],[78,181631],{"className":181632,"style":16971},[4662],[78,181634,181636,181639],{"className":181635},[4667],[78,181637,78947],{"className":181638},[4667,4678],[78,181640,181642],{"className":181641},[4689],[78,181643,181645,181665],{"className":181644},[4693,4694],[78,181646,181648,181662],{"className":181647},[4698],[78,181649,181651],{"className":181650,"style":63412},[4702],[78,181652,181653,181656],{"style":4706},[78,181654],{"className":181655,"style":4711},[4710],[78,181657,181659],{"className":181658},[4715,4716,4717,4718],[78,181660,17143],{"className":181661},[4667,4678,4718],[78,181663,4726],{"className":181664},[4725],[78,181666,181668],{"className":181667},[4698],[78,181669,181671],{"className":181670,"style":4733},[4702],[78,181672],{},[78,181674],{"className":181675,"style":4740},[4739],[78,181677,8661],{"className":181678},[4744],[78,181680],{"className":181681,"style":4740},[4739],[78,181683,181685,181688,181691,181694,181697],{"className":181684},[4658],[78,181686],{"className":181687,"style":83633},[4662],[78,181689,79685],{"className":181690,"style":80807},[4667,4678],[78,181692],{"className":181693,"style":4740},[4739],[78,181695,37501],{"className":181696},[4744],[78,181698],{"className":181699,"style":4740},[4739],[78,181701,181703,181706,181709,181712,181715,181718,181721],{"className":181702},[4658],[78,181704],{"className":181705,"style":4663},[4662],[78,181707,17845],{"className":181708},[4674],[78,181710,2949],{"className":181711},[4667],[78,181713,2066],{"className":181714},[5126],[78,181716],{"className":181717,"style":4839},[4739],[78,181719,469],{"className":181720},[4667],[78,181722,17857],{"className":181723},[4682],[23289,181725],{},[7759,181727,83675],{"id":83674},[13,181729,83678],{},[78,181731,181733],{"className":181732},[4566],[78,181734,181736,181775],{"className":181735},[4570],[78,181737,181739],{"className":181738},[4574],[4576,181740,181741],{"xmlns":4578,"display":4579},[4581,181742,181743,181773],{},[4584,181744,181745,181751,181753,181755,181757,181759,181765,181767,181769,181771],{},[4600,181746,181747,181749],{},[4596,181748,17143],{},[4596,181750,55518],{},[4591,181752,4609],{},[4591,181754,55608],{"stretchy":4593},[4596,181756,4598],{},[4596,181758,63346],{"mathvariant":7101},[4600,181760,181761,181763],{},[4596,181762,78947],{},[4596,181764,17143],{},[4591,181766,4594],{"stretchy":4593},[4596,181768,4598],{},[4591,181770,4604],{"stretchy":4593},[4591,181772,63381],{"stretchy":4593},[4647,181774,83724],{"encoding":4649},[78,181776,181778,181833],{"className":181777,"ariaHidden":1419},[4654],[78,181779,181781,181784,181824,181827,181830],{"className":181780},[4658],[78,181782],{"className":181783,"style":20406},[4662],[78,181785,181787,181790],{"className":181786},[4667],[78,181788,17143],{"className":181789},[4667,4678],[78,181791,181793],{"className":181792},[4689],[78,181794,181796,181816],{"className":181795},[4693,4694],[78,181797,181799,181813],{"className":181798},[4698],[78,181800,181802],{"className":181801,"style":5279},[4702],[78,181803,181804,181807],{"style":4706},[78,181805],{"className":181806,"style":4711},[4710],[78,181808,181810],{"className":181809},[4715,4716,4717,4718],[78,181811,55518],{"className":181812,"style":55822},[4667,4678,4718],[78,181814,4726],{"className":181815},[4725],[78,181817,181819],{"className":181818},[4698],[78,181820,181822],{"className":181821,"style":4733},[4702],[78,181823],{},[78,181825],{"className":181826,"style":4740},[4739],[78,181828,4609],{"className":181829},[4744],[78,181831],{"className":181832,"style":4740},[4739],[78,181834,181836,181839,181842,181845,181848,181888,181891,181894],{"className":181835},[4658],[78,181837],{"className":181838,"style":4663},[4662],[78,181840,55608],{"className":181841},[4674],[78,181843,4598],{"className":181844},[4667,4678],[78,181846,63346],{"className":181847},[4667],[78,181849,181851,181854],{"className":181850},[4667],[78,181852,78947],{"className":181853},[4667,4678],[78,181855,181857],{"className":181856},[4689],[78,181858,181860,181880],{"className":181859},[4693,4694],[78,181861,181863,181877],{"className":181862},[4698],[78,181864,181866],{"className":181865,"style":63412},[4702],[78,181867,181868,181871],{"style":4706},[78,181869],{"className":181870,"style":4711},[4710],[78,181872,181874],{"className":181873},[4715,4716,4717,4718],[78,181875,17143],{"className":181876},[4667,4678,4718],[78,181878,4726],{"className":181879},[4725],[78,181881,181883],{"className":181882},[4698],[78,181884,181886],{"className":181885,"style":4733},[4702],[78,181887],{},[78,181889,4594],{"className":181890},[4674],[78,181892,4598],{"className":181893},[4667,4678],[78,181895,78919],{"className":181896},[4682],[13,181898,83849],{},[23289,181900],{},[7759,181902,83855],{"id":83854},[13,181904,83858,181905,83861],{},[596,181906,78947],{},[13,181908,83864,181909,83867],{},[596,181910,78947],{},[13,181912,83870],{},[13,181914,83873],{},[78,181916,181918],{"className":181917},[4566],[78,181919,181921,182002],{"className":181920},[4570],[78,181922,181924],{"className":181923},[4574],[4576,181925,181926],{"xmlns":4578,"display":4579},[4581,181927,181928,182000],{},[4584,181929,181930,181936,181938,181940,181950,181962,181964,181974,181976,181982,181984,181990,181992,181998],{},[4600,181931,181932,181934],{},[4596,181933,83893],{},[4596,181935,27152],{},[4591,181937,4609],{},[4591,181939,17845],{"stretchy":4593},[4600,181941,181942,181944],{},[4596,181943,17132],{},[4584,181945,181946,181948],{},[4596,181947,39],{},[4596,181949,4635],{},[4600,181951,181952,181954],{},[4591,181953,17857],{"stretchy":4593},[4584,181955,181956,181958,181960],{},[4596,181957,5058],{},[4591,181959,43664],{},[4596,181961,19],{},[4591,181963,2066],{"separator":1419},[4600,181965,181966,181968],{},[4596,181967,17132],{},[4584,181969,181970,181972],{},[4596,181971,39],{},[4596,181973,4635],{},[4591,181975,4609],{},[4600,181977,181978,181980],{},[4596,181979,78947],{},[4596,181981,27152],{},[4591,181983,4594],{"stretchy":4593},[4600,181985,181986,181988],{},[4596,181987,4598],{},[4596,181989,39],{},[4591,181991,2066],{"separator":1419},[4600,181993,181994,181996],{},[4596,181995,16867],{},[4596,181997,39],{},[4591,181999,4604],{"stretchy":4593},[4647,182001,83962],{"encoding":4649},[78,182003,182005,182060,182219],{"className":182004,"ariaHidden":1419},[4654],[78,182006,182008,182011,182051,182054,182057],{"className":182007},[4658],[78,182009],{"className":182010,"style":20406},[4662],[78,182012,182014,182017],{"className":182013},[4667],[78,182015,83893],{"className":182016,"style":80807},[4667,4678],[78,182018,182020],{"className":182019},[4689],[78,182021,182023,182043],{"className":182022},[4693,4694],[78,182024,182026,182040],{"className":182025},[4698],[78,182027,182029],{"className":182028,"style":63412},[4702],[78,182030,182031,182034],{"style":83992},[78,182032],{"className":182033,"style":4711},[4710],[78,182035,182037],{"className":182036},[4715,4716,4717,4718],[78,182038,27152],{"className":182039,"style":38285},[4667,4678,4718],[78,182041,4726],{"className":182042},[4725],[78,182044,182046],{"className":182045},[4698],[78,182047,182049],{"className":182048,"style":4733},[4702],[78,182050],{},[78,182052],{"className":182053,"style":4740},[4739],[78,182055,4609],{"className":182056},[4744],[78,182058],{"className":182059,"style":4740},[4739],[78,182061,182063,182066,182069,182112,182161,182164,182167,182210,182213,182216],{"className":182062},[4658],[78,182064],{"className":182065,"style":84028},[4662],[78,182067,17845],{"className":182068},[4674],[78,182070,182072,182075],{"className":182071},[4667],[78,182073,17132],{"className":182074,"style":17251},[4667,4678],[78,182076,182078],{"className":182077},[4689],[78,182079,182081,182104],{"className":182080},[4693,4694],[78,182082,182084,182101],{"className":182083},[4698],[78,182085,182087],{"className":182086,"style":4703},[4702],[78,182088,182089,182092],{"style":84052},[78,182090],{"className":182091,"style":4711},[4710],[78,182093,182095],{"className":182094},[4715,4716,4717,4718],[78,182096,182098],{"className":182097},[4667,4718],[78,182099,84065],{"className":182100,"style":4823},[4667,4678,4718],[78,182102,4726],{"className":182103},[4725],[78,182105,182107],{"className":182106},[4698],[78,182108,182110],{"className":182109,"style":6178},[4702],[78,182111],{},[78,182113,182115,182118],{"className":182114},[4682],[78,182116,17857],{"className":182117},[4682],[78,182119,182121],{"className":182120},[4689],[78,182122,182124,182153],{"className":182123},[4693,4694],[78,182125,182127,182150],{"className":182126},[4698],[78,182128,182130],{"className":182129,"style":84095},[4702],[78,182131,182132,182135],{"style":4706},[78,182133],{"className":182134,"style":4711},[4710],[78,182136,182138],{"className":182137},[4715,4716,4717,4718],[78,182139,182141,182144,182147],{"className":182140},[4667,4718],[78,182142,5058],{"className":182143},[4667,4678,4718],[78,182145,43664],{"className":182146},[7450,4718],[78,182148,19],{"className":182149},[4667,4678,4718],[78,182151,4726],{"className":182152},[4725],[78,182154,182156],{"className":182155},[4698],[78,182157,182159],{"className":182158,"style":84125},[4702],[78,182160],{},[78,182162,2066],{"className":182163},[5126],[78,182165],{"className":182166,"style":4839},[4739],[78,182168,182170,182173],{"className":182169},[4667],[78,182171,17132],{"className":182172,"style":17251},[4667,4678],[78,182174,182176],{"className":182175},[4689],[78,182177,182179,182202],{"className":182178},[4693,4694],[78,182180,182182,182199],{"className":182181},[4698],[78,182183,182185],{"className":182184,"style":4703},[4702],[78,182186,182187,182190],{"style":84052},[78,182188],{"className":182189,"style":4711},[4710],[78,182191,182193],{"className":182192},[4715,4716,4717,4718],[78,182194,182196],{"className":182195},[4667,4718],[78,182197,84065],{"className":182198,"style":4823},[4667,4678,4718],[78,182200,4726],{"className":182201},[4725],[78,182203,182205],{"className":182204},[4698],[78,182206,182208],{"className":182207,"style":6178},[4702],[78,182209],{},[78,182211],{"className":182212,"style":4740},[4739],[78,182214,4609],{"className":182215},[4744],[78,182217],{"className":182218,"style":4740},[4739],[78,182220,182222,182225,182265,182268,182308,182311,182314,182354],{"className":182221},[4658],[78,182223],{"className":182224,"style":4663},[4662],[78,182226,182228,182231],{"className":182227},[4667],[78,182229,78947],{"className":182230},[4667,4678],[78,182232,182234],{"className":182233},[4689],[78,182235,182237,182257],{"className":182236},[4693,4694],[78,182238,182240,182254],{"className":182239},[4698],[78,182241,182243],{"className":182242,"style":63412},[4702],[78,182244,182245,182248],{"style":4706},[78,182246],{"className":182247,"style":4711},[4710],[78,182249,182251],{"className":182250},[4715,4716,4717,4718],[78,182252,27152],{"className":182253,"style":38285},[4667,4678,4718],[78,182255,4726],{"className":182256},[4725],[78,182258,182260],{"className":182259},[4698],[78,182261,182263],{"className":182262,"style":4733},[4702],[78,182264],{},[78,182266,4594],{"className":182267},[4674],[78,182269,182271,182274],{"className":182270},[4667],[78,182272,4598],{"className":182273},[4667,4678],[78,182275,182277],{"className":182276},[4689],[78,182278,182280,182300],{"className":182279},[4693,4694],[78,182281,182283,182297],{"className":182282},[4698],[78,182284,182286],{"className":182285,"style":4703},[4702],[78,182287,182288,182291],{"style":4706},[78,182289],{"className":182290,"style":4711},[4710],[78,182292,182294],{"className":182293},[4715,4716,4717,4718],[78,182295,39],{"className":182296},[4667,4678,4718],[78,182298,4726],{"className":182299},[4725],[78,182301,182303],{"className":182302},[4698],[78,182304,182306],{"className":182305,"style":4733},[4702],[78,182307],{},[78,182309,2066],{"className":182310},[5126],[78,182312],{"className":182313,"style":4839},[4739],[78,182315,182317,182320],{"className":182316},[4667],[78,182318,16867],{"className":182319,"style":5187},[4667,4678],[78,182321,182323],{"className":182322},[4689],[78,182324,182326,182346],{"className":182325},[4693,4694],[78,182327,182329,182343],{"className":182328},[4698],[78,182330,182332],{"className":182331,"style":4703},[4702],[78,182333,182334,182337],{"style":63415},[78,182335],{"className":182336,"style":4711},[4710],[78,182338,182340],{"className":182339},[4715,4716,4717,4718],[78,182341,39],{"className":182342},[4667,4678,4718],[78,182344,4726],{"className":182345},[4725],[78,182347,182349],{"className":182348},[4698],[78,182350,182352],{"className":182351,"style":4733},[4702],[78,182353],{},[78,182355,4604],{"className":182356},[4682],[13,182358,84326],{},[23289,182360],{},[7759,182362,84332],{"id":84331},[10548,182364,84336],{"id":84335},[13,182366,84339],{},[78,182368,182370],{"className":182369},[4566],[78,182371,182373,182480],{"className":182372},[4570],[78,182374,182376],{"className":182375},[4574],[4576,182377,182378],{"xmlns":4578,"display":4579},[4581,182379,182380,182478],{},[4584,182381,182382,182388,182390,182396,182398,182400,182402,182404,182406,182408,182410,182412,182414,182424,182426,182428,182430,182440,182442,182444,182446,182448,182450,182452,182462,182464,182466,182468,182470,182472,182474,182476],{},[4600,182383,182384,182386],{},[4596,182385,27152],{},[7077,182387,469],{},[4587,182389,84363],{},[4600,182391,182392,182394],{},[4596,182393,27152],{},[7077,182395,472],{},[4591,182397,4609],{},[4591,182399,55608],{"stretchy":4593},[4591,182401,17845],{"stretchy":4593},[4591,182403,4594],{"stretchy":4593},[4596,182405,4598],{},[4591,182407,2066],{"separator":1419},[4596,182409,25949],{},[4591,182411,4604],{"stretchy":4593},[4591,182413,2066],{"separator":1419},[4628,182415,182416,182422],{},[4584,182417,182418,182420],{},[4596,182419,84394],{},[4591,182421,17553],{},[4596,182423,16867],{},[4596,182425,82754],{},[4591,182427,17553],{},[4591,182429,17845],{"stretchy":4593},[4600,182431,182432,182434],{},[4596,182433,78947],{},[4600,182435,182436,182438],{},[4596,182437,27152],{},[7077,182439,469],{},[4591,182441,4594],{"stretchy":4593},[4596,182443,4598],{},[4591,182445,2066],{"separator":1419},[4596,182447,16867],{},[4591,182449,4604],{"stretchy":4593},[4591,182451,2066],{"separator":1419},[4600,182453,182454,182456],{},[4596,182455,78947],{},[4600,182457,182458,182460],{},[4596,182459,27152],{},[7077,182461,472],{},[4591,182463,4594],{"stretchy":4593},[4596,182465,16867],{},[4591,182467,2066],{"separator":1419},[4596,182469,25949],{},[4591,182471,4604],{"stretchy":4593},[4591,182473,17857],{"stretchy":4593},[4591,182475,17857],{"stretchy":4593},[4591,182477,63381],{"stretchy":4593},[4647,182479,84455],{"encoding":4649},[78,182481,182483,182581],{"className":182482,"ariaHidden":1419},[4654],[78,182484,182486,182489,182529,182532,182572,182575,182578],{"className":182485},[4658],[78,182487],{"className":182488,"style":20406},[4662],[78,182490,182492,182495],{"className":182491},[4667],[78,182493,27152],{"className":182494,"style":38285},[4667,4678],[78,182496,182498],{"className":182497},[4689],[78,182499,182501,182521],{"className":182500},[4693,4694],[78,182502,182504,182518],{"className":182503},[4698],[78,182505,182507],{"className":182506,"style":18264},[4702],[78,182508,182509,182512],{"style":84485},[78,182510],{"className":182511,"style":4711},[4710],[78,182513,182515],{"className":182514},[4715,4716,4717,4718],[78,182516,469],{"className":182517},[4667,4718],[78,182519,4726],{"className":182520},[4725],[78,182522,182524],{"className":182523},[4698],[78,182525,182527],{"className":182526,"style":4733},[4702],[78,182528],{},[78,182530,84363],{"className":182531},[4667],[78,182533,182535,182538],{"className":182534},[4667],[78,182536,27152],{"className":182537,"style":38285},[4667,4678],[78,182539,182541],{"className":182540},[4689],[78,182542,182544,182564],{"className":182543},[4693,4694],[78,182545,182547,182561],{"className":182546},[4698],[78,182548,182550],{"className":182549,"style":18264},[4702],[78,182551,182552,182555],{"style":84485},[78,182553],{"className":182554,"style":4711},[4710],[78,182556,182558],{"className":182557},[4715,4716,4717,4718],[78,182559,472],{"className":182560},[4667,4718],[78,182562,4726],{"className":182563},[4725],[78,182565,182567],{"className":182566},[4698],[78,182568,182570],{"className":182569,"style":4733},[4702],[78,182571],{},[78,182573],{"className":182574,"style":4740},[4739],[78,182576,4609],{"className":182577},[4744],[78,182579],{"className":182580,"style":4740},[4739],[78,182582,182584,182587,182590,182593,182596,182599,182602,182605,182608,182611,182658,182661,182664,182667,182747,182750,182753,182756,182759,182762,182765,182768,182771,182851,182854,182857,182860,182863,182866],{"className":182583},[4658],[78,182585],{"className":182586,"style":84564},[4662],[78,182588,84568],{"className":182589},[4674],[78,182591,4598],{"className":182592},[4667,4678],[78,182594,2066],{"className":182595},[5126],[78,182597],{"className":182598,"style":4839},[4739],[78,182600,25949],{"className":182601,"style":43903},[4667,4678],[78,182603,4604],{"className":182604},[4682],[78,182606,2066],{"className":182607},[5126],[78,182609],{"className":182610,"style":4839},[4739],[78,182612,182614],{"className":182613},[4788,52401],[78,182615,182617,182650],{"className":182616},[4693,4694],[78,182618,182620,182647],{"className":182619},[4698],[78,182621,182623,182637],{"className":182622,"style":16838},[4702],[78,182624,182625,182628],{"style":52413},[78,182626],{"className":182627,"style":4781},[4710],[78,182629,182631],{"className":182630},[4715,4716,4717,4718],[78,182632,182634],{"className":182633},[4667,4718],[78,182635,16867],{"className":182636,"style":5187},[4667,4678,4718],[78,182638,182639,182642],{"style":5824},[78,182640],{"className":182641,"style":4781},[4710],[78,182643,182644],{},[78,182645,84394],{"className":182646},[4788],[78,182648,4726],{"className":182649},[4725],[78,182651,182653],{"className":182652},[4698],[78,182654,182656],{"className":182655,"style":84635},[4702],[78,182657],{},[78,182659],{"className":182660,"style":4839},[4739],[78,182662,82754],{"className":182663},[4788],[78,182665,17845],{"className":182666},[4674],[78,182668,182670,182673],{"className":182669},[4667],[78,182671,78947],{"className":182672},[4667,4678],[78,182674,182676],{"className":182675},[4689],[78,182677,182679,182739],{"className":182678},[4693,4694],[78,182680,182682,182736],{"className":182681},[4698],[78,182683,182685],{"className":182684,"style":63412},[4702],[78,182686,182687,182690],{"style":4706},[78,182688],{"className":182689,"style":4711},[4710],[78,182691,182693],{"className":182692},[4715,4716,4717,4718],[78,182694,182696],{"className":182695},[4667,4718],[78,182697,182699,182702],{"className":182698},[4667,4718],[78,182700,27152],{"className":182701,"style":38285},[4667,4678,4718],[78,182703,182705],{"className":182704},[4689],[78,182706,182708,182728],{"className":182707},[4693,4694],[78,182709,182711,182725],{"className":182710},[4698],[78,182712,182714],{"className":182713,"style":84694},[4702],[78,182715,182716,182719],{"style":84697},[78,182717],{"className":182718,"style":4896},[4710],[78,182720,182722],{"className":182721},[4715,4900,4901,4718],[78,182723,469],{"className":182724},[4667,4718],[78,182726,4726],{"className":182727},[4725],[78,182729,182731],{"className":182730},[4698],[78,182732,182734],{"className":182733,"style":84716},[4702],[78,182735],{},[78,182737,4726],{"className":182738},[4725],[78,182740,182742],{"className":182741},[4698],[78,182743,182745],{"className":182744,"style":84728},[4702],[78,182746],{},[78,182748,4594],{"className":182749},[4674],[78,182751,4598],{"className":182752},[4667,4678],[78,182754,2066],{"className":182755},[5126],[78,182757],{"className":182758,"style":4839},[4739],[78,182760,16867],{"className":182761,"style":5187},[4667,4678],[78,182763,4604],{"className":182764},[4682],[78,182766,2066],{"className":182767},[5126],[78,182769],{"className":182770,"style":4839},[4739],[78,182772,182774,182777],{"className":182773},[4667],[78,182775,78947],{"className":182776},[4667,4678],[78,182778,182780],{"className":182779},[4689],[78,182781,182783,182843],{"className":182782},[4693,4694],[78,182784,182786,182840],{"className":182785},[4698],[78,182787,182789],{"className":182788,"style":63412},[4702],[78,182790,182791,182794],{"style":4706},[78,182792],{"className":182793,"style":4711},[4710],[78,182795,182797],{"className":182796},[4715,4716,4717,4718],[78,182798,182800],{"className":182799},[4667,4718],[78,182801,182803,182806],{"className":182802},[4667,4718],[78,182804,27152],{"className":182805,"style":38285},[4667,4678,4718],[78,182807,182809],{"className":182808},[4689],[78,182810,182812,182832],{"className":182811},[4693,4694],[78,182813,182815,182829],{"className":182814},[4698],[78,182816,182818],{"className":182817,"style":84694},[4702],[78,182819,182820,182823],{"style":84697},[78,182821],{"className":182822,"style":4896},[4710],[78,182824,182826],{"className":182825},[4715,4900,4901,4718],[78,182827,472],{"className":182828},[4667,4718],[78,182830,4726],{"className":182831},[4725],[78,182833,182835],{"className":182834},[4698],[78,182836,182838],{"className":182837,"style":84716},[4702],[78,182839],{},[78,182841,4726],{"className":182842},[4725],[78,182844,182846],{"className":182845},[4698],[78,182847,182849],{"className":182848,"style":84728},[4702],[78,182850],{},[78,182852,4594],{"className":182853},[4674],[78,182855,16867],{"className":182856,"style":5187},[4667,4678],[78,182858,2066],{"className":182859},[5126],[78,182861],{"className":182862,"style":4839},[4739],[78,182864,25949],{"className":182865,"style":43903},[4667,4678],[78,182867,84853],{"className":182868},[4682],[10548,182870,84857],{"id":84856},[13,182872,84860],{},[78,182874,182876],{"className":182875},[4566],[78,182877,182879,182982],{"className":182878},[4570],[78,182880,182882],{"className":182881},[4574],[4576,182883,182884],{"xmlns":4578,"display":4579},[4581,182885,182886,182980],{},[4584,182887,182888,182894,182896,182902,182904,182906,182908,182910,182912,182914,182916,182918,182920,182930,182932,182942,182944,182946,182948,182950,182952,182954,182964,182966,182968,182970,182972,182974,182976,182978],{},[4600,182889,182890,182892],{},[4596,182891,27152],{},[7077,182893,469],{},[4587,182895,84363],{},[4600,182897,182898,182900],{},[4596,182899,27152],{},[7077,182901,472],{},[4591,182903,4609],{},[4591,182905,55608],{"stretchy":4593},[4591,182907,17845],{"stretchy":4593},[4591,182909,4594],{"stretchy":4593},[4596,182911,4598],{},[4591,182913,2066],{"separator":1419},[4596,182915,25949],{},[4591,182917,4604],{"stretchy":4593},[4591,182919,2066],{"separator":1419},[4628,182921,182922,182928],{},[4584,182923,182924,182926],{},[4596,182925,84394],{},[4591,182927,17553],{},[4596,182929,16867],{},[4591,182931,17845],{"stretchy":4593},[4600,182933,182934,182936],{},[4596,182935,78947],{},[4600,182937,182938,182940],{},[4596,182939,27152],{},[7077,182941,469],{},[4591,182943,4594],{"stretchy":4593},[4596,182945,4598],{},[4591,182947,2066],{"separator":1419},[4596,182949,16867],{},[4591,182951,4604],{"stretchy":4593},[4591,182953,43664],{},[4600,182955,182956,182958],{},[4596,182957,78947],{},[4600,182959,182960,182962],{},[4596,182961,27152],{},[7077,182963,472],{},[4591,182965,4594],{"stretchy":4593},[4596,182967,16867],{},[4591,182969,2066],{"separator":1419},[4596,182971,25949],{},[4591,182973,4604],{"stretchy":4593},[4591,182975,17857],{"stretchy":4593},[4591,182977,17857],{"stretchy":4593},[4591,182979,63381],{"stretchy":4593},[4647,182981,84970],{"encoding":4649},[78,182983,182985,183083,183270],{"className":182984,"ariaHidden":1419},[4654],[78,182986,182988,182991,183031,183034,183074,183077,183080],{"className":182987},[4658],[78,182989],{"className":182990,"style":20406},[4662],[78,182992,182994,182997],{"className":182993},[4667],[78,182995,27152],{"className":182996,"style":38285},[4667,4678],[78,182998,183000],{"className":182999},[4689],[78,183001,183003,183023],{"className":183002},[4693,4694],[78,183004,183006,183020],{"className":183005},[4698],[78,183007,183009],{"className":183008,"style":18264},[4702],[78,183010,183011,183014],{"style":84485},[78,183012],{"className":183013,"style":4711},[4710],[78,183015,183017],{"className":183016},[4715,4716,4717,4718],[78,183018,469],{"className":183019},[4667,4718],[78,183021,4726],{"className":183022},[4725],[78,183024,183026],{"className":183025},[4698],[78,183027,183029],{"className":183028,"style":4733},[4702],[78,183030],{},[78,183032,84363],{"className":183033},[4667],[78,183035,183037,183040],{"className":183036},[4667],[78,183038,27152],{"className":183039,"style":38285},[4667,4678],[78,183041,183043],{"className":183042},[4689],[78,183044,183046,183066],{"className":183045},[4693,4694],[78,183047,183049,183063],{"className":183048},[4698],[78,183050,183052],{"className":183051,"style":18264},[4702],[78,183053,183054,183057],{"style":84485},[78,183055],{"className":183056,"style":4711},[4710],[78,183058,183060],{"className":183059},[4715,4716,4717,4718],[78,183061,472],{"className":183062},[4667,4718],[78,183064,4726],{"className":183065},[4725],[78,183067,183069],{"className":183068},[4698],[78,183070,183072],{"className":183071,"style":4733},[4702],[78,183073],{},[78,183075],{"className":183076,"style":4740},[4739],[78,183078,4609],{"className":183079},[4744],[78,183081],{"className":183082,"style":4740},[4739],[78,183084,183086,183089,183092,183095,183098,183101,183104,183107,183110,183113,183160,183163,183243,183246,183249,183252,183255,183258,183261,183264,183267],{"className":183085},[4658],[78,183087],{"className":183088,"style":84564},[4662],[78,183090,84568],{"className":183091},[4674],[78,183093,4598],{"className":183094},[4667,4678],[78,183096,2066],{"className":183097},[5126],[78,183099],{"className":183100,"style":4839},[4739],[78,183102,25949],{"className":183103,"style":43903},[4667,4678],[78,183105,4604],{"className":183106},[4682],[78,183108,2066],{"className":183109},[5126],[78,183111],{"className":183112,"style":4839},[4739],[78,183114,183116],{"className":183115},[4788,52401],[78,183117,183119,183152],{"className":183118},[4693,4694],[78,183120,183122,183149],{"className":183121},[4698],[78,183123,183125,183139],{"className":183124,"style":16838},[4702],[78,183126,183127,183130],{"style":52413},[78,183128],{"className":183129,"style":4781},[4710],[78,183131,183133],{"className":183132},[4715,4716,4717,4718],[78,183134,183136],{"className":183135},[4667,4718],[78,183137,16867],{"className":183138,"style":5187},[4667,4678,4718],[78,183140,183141,183144],{"style":5824},[78,183142],{"className":183143,"style":4781},[4710],[78,183145,183146],{},[78,183147,84394],{"className":183148},[4788],[78,183150,4726],{"className":183151},[4725],[78,183153,183155],{"className":183154},[4698],[78,183156,183158],{"className":183157,"style":84635},[4702],[78,183159],{},[78,183161,17845],{"className":183162},[4674],[78,183164,183166,183169],{"className":183165},[4667],[78,183167,78947],{"className":183168},[4667,4678],[78,183170,183172],{"className":183171},[4689],[78,183173,183175,183235],{"className":183174},[4693,4694],[78,183176,183178,183232],{"className":183177},[4698],[78,183179,183181],{"className":183180,"style":63412},[4702],[78,183182,183183,183186],{"style":4706},[78,183184],{"className":183185,"style":4711},[4710],[78,183187,183189],{"className":183188},[4715,4716,4717,4718],[78,183190,183192],{"className":183191},[4667,4718],[78,183193,183195,183198],{"className":183194},[4667,4718],[78,183196,27152],{"className":183197,"style":38285},[4667,4678,4718],[78,183199,183201],{"className":183200},[4689],[78,183202,183204,183224],{"className":183203},[4693,4694],[78,183205,183207,183221],{"className":183206},[4698],[78,183208,183210],{"className":183209,"style":84694},[4702],[78,183211,183212,183215],{"style":84697},[78,183213],{"className":183214,"style":4896},[4710],[78,183216,183218],{"className":183217},[4715,4900,4901,4718],[78,183219,469],{"className":183220},[4667,4718],[78,183222,4726],{"className":183223},[4725],[78,183225,183227],{"className":183226},[4698],[78,183228,183230],{"className":183229,"style":84716},[4702],[78,183231],{},[78,183233,4726],{"className":183234},[4725],[78,183236,183238],{"className":183237},[4698],[78,183239,183241],{"className":183240,"style":84728},[4702],[78,183242],{},[78,183244,4594],{"className":183245},[4674],[78,183247,4598],{"className":183248},[4667,4678],[78,183250,2066],{"className":183251},[5126],[78,183253],{"className":183254,"style":4839},[4739],[78,183256,16867],{"className":183257,"style":5187},[4667,4678],[78,183259,4604],{"className":183260},[4682],[78,183262],{"className":183263,"style":5143},[4739],[78,183265,43664],{"className":183266},[7450],[78,183268],{"className":183269,"style":5143},[4739],[78,183271,183273,183276,183356,183359,183362,183365,183368,183371],{"className":183272},[4658],[78,183274],{"className":183275,"style":85265},[4662],[78,183277,183279,183282],{"className":183278},[4667],[78,183280,78947],{"className":183281},[4667,4678],[78,183283,183285],{"className":183284},[4689],[78,183286,183288,183348],{"className":183287},[4693,4694],[78,183289,183291,183345],{"className":183290},[4698],[78,183292,183294],{"className":183293,"style":63412},[4702],[78,183295,183296,183299],{"style":4706},[78,183297],{"className":183298,"style":4711},[4710],[78,183300,183302],{"className":183301},[4715,4716,4717,4718],[78,183303,183305],{"className":183304},[4667,4718],[78,183306,183308,183311],{"className":183307},[4667,4718],[78,183309,27152],{"className":183310,"style":38285},[4667,4678,4718],[78,183312,183314],{"className":183313},[4689],[78,183315,183317,183337],{"className":183316},[4693,4694],[78,183318,183320,183334],{"className":183319},[4698],[78,183321,183323],{"className":183322,"style":84694},[4702],[78,183324,183325,183328],{"style":84697},[78,183326],{"className":183327,"style":4896},[4710],[78,183329,183331],{"className":183330},[4715,4900,4901,4718],[78,183332,472],{"className":183333},[4667,4718],[78,183335,4726],{"className":183336},[4725],[78,183338,183340],{"className":183339},[4698],[78,183341,183343],{"className":183342,"style":84716},[4702],[78,183344],{},[78,183346,4726],{"className":183347},[4725],[78,183349,183351],{"className":183350},[4698],[78,183352,183354],{"className":183353,"style":84728},[4702],[78,183355],{},[78,183357,4594],{"className":183358},[4674],[78,183360,16867],{"className":183361,"style":5187},[4667,4678],[78,183363,2066],{"className":183364},[5126],[78,183366],{"className":183367,"style":4839},[4739],[78,183369,25949],{"className":183370,"style":43903},[4667,4678],[78,183372,84853],{"className":183373},[4682],[13,183375,85366],{},[23289,183377],{},[107,183379,85372],{"id":85371},[7759,183381,85376],{"id":85375},[13,183383,85379],{},[13,183385,85382],{},[13,183387,85385],{},[13,183389,85388],{},[13,183391,85391],{},[23289,183393],{},[7759,183395,85397],{"id":85396},[13,183397,85400],{},[78,183399,183401],{"className":183400},[4566],[78,183402,183404,183431],{"className":183403},[4570],[78,183405,183407],{"className":183406},[4574],[4576,183408,183409],{"xmlns":4578,"display":4579},[4581,183410,183411,183429],{},[4584,183412,183413,183415,183417,183419,183421,183423,183425,183427],{},[4596,183414,16867],{},[4591,183416,4609],{},[4596,183418,25923],{},[4591,183420,4594],{"stretchy":4593},[4596,183422,18038],{},[4591,183424,7351],{},[4596,183426,12172],{},[4591,183428,4604],{"stretchy":4593},[4647,183430,85434],{"encoding":4649},[78,183432,183434,183452,183476],{"className":183433,"ariaHidden":1419},[4654],[78,183435,183437,183440,183443,183446,183449],{"className":183436},[4658],[78,183438],{"className":183439,"style":16971},[4662],[78,183441,16867],{"className":183442,"style":5187},[4667,4678],[78,183444],{"className":183445,"style":4740},[4739],[78,183447,4609],{"className":183448},[4744],[78,183450],{"className":183451,"style":4740},[4739],[78,183453,183455,183458,183461,183464,183467,183470,183473],{"className":183454},[4658],[78,183456],{"className":183457,"style":4663},[4662],[78,183459,25923],{"className":183460},[4667,4678],[78,183462,4594],{"className":183463},[4674],[78,183465,18038],{"className":183466},[4667,4678],[78,183468],{"className":183469,"style":5143},[4739],[78,183471,7351],{"className":183472},[7450],[78,183474],{"className":183475,"style":5143},[4739],[78,183477,183479,183482,183485],{"className":183478},[4658],[78,183480],{"className":183481,"style":4663},[4662],[78,183483,12172],{"className":183484},[4667,4678],[78,183486,4604],{"className":183487},[4682],[13,183489,25995,183490,85496,183492,85500],{},[596,183491,25923],{},[22,183493,85499],{},[10548,183495,85504],{"id":85503},[78,183497,183499],{"className":183498},[4566],[78,183500,183502,183567],{"className":183501},[4570],[78,183503,183505],{"className":183504},[4574],[4576,183506,183507],{"xmlns":4578,"display":4579},[4581,183508,183509,183565],{},[4584,183510,183511,183513,183515,183517,183519,183521],{},[4596,183512,5053],{},[4591,183514,4594],{"stretchy":4593},[4596,183516,19],{},[4591,183518,4604],{"stretchy":4593},[4591,183520,4609],{},[4584,183522,183523,183525],{},[4591,183524,55608],{"fence":1419},[37085,183526,183527,183545],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,183528,183529],{},[37094,183530,183531],{},[37101,183532,183533],{"scriptlevel":2949,"displaystyle":4593},[4584,183534,183535,183537,183539,183541,183543],{},[4596,183536,85546],{},[4591,183538,2066],{"separator":1419},[4596,183540,19],{},[4591,183542,85553],{},[4596,183544,17463],{},[37091,183546,183547],{},[37094,183548,183549],{},[37101,183550,183551],{"scriptlevel":2949,"displaystyle":4593},[4584,183552,183553,183555,183557,183559,183561,183563],{},[4591,183554,17848],{},[4596,183556,85568],{},[4591,183558,2066],{"separator":1419},[4596,183560,19],{},[4591,183562,41631],{},[4596,183564,17463],{},[4647,183566,85579],{"encoding":4649},[78,183568,183570,183597],{"className":183569,"ariaHidden":1419},[4654],[78,183571,183573,183576,183579,183582,183585,183588,183591,183594],{"className":183572},[4658],[78,183574],{"className":183575,"style":4663},[4662],[78,183577,5053],{"className":183578,"style":5170},[4667,4678],[78,183580,4594],{"className":183581},[4674],[78,183583,19],{"className":183584},[4667,4678],[78,183586,4604],{"className":183587},[4682],[78,183589],{"className":183590,"style":4740},[4739],[78,183592,4609],{"className":183593},[4744],[78,183595],{"className":183596,"style":4740},[4739],[78,183598,183600,183603],{"className":183599},[4658],[78,183601],{"className":183602,"style":85616},[4662],[78,183604,183606,183612,183708],{"className":183605},[18342],[78,183607,183609],{"className":183608,"style":85624},[4674,85623],[78,183610,55608],{"className":183611},[56026,85628],[78,183613,183615],{"className":183614},[4667],[78,183616,183618],{"className":183617},[37085],[78,183619,183621],{"className":183620},[38098],[78,183622,183624,183700],{"className":183623},[4693,4694],[78,183625,183627,183697],{"className":183626},[4698],[78,183628,183630,183662],{"className":183629,"style":85647},[4702],[78,183631,183632,183635],{"style":85650},[78,183633],{"className":183634,"style":56145},[4710],[78,183636,183638,183641,183644,183647,183650,183653,183656,183659],{"className":183637},[4667],[78,183639,85546],{"className":183640,"style":85660},[4667,4678],[78,183642,2066],{"className":183643},[5126],[78,183645],{"className":183646,"style":4839},[4739],[78,183648,19],{"className":183649},[4667,4678],[78,183651],{"className":183652,"style":4740},[4739],[78,183654,85553],{"className":183655},[4744],[78,183657],{"className":183658,"style":4740},[4739],[78,183660,17463],{"className":183661,"style":17251},[4667,4678],[78,183663,183664,183667],{"style":85684},[78,183665],{"className":183666,"style":56145},[4710],[78,183668,183670,183673,183676,183679,183682,183685,183688,183691,183694],{"className":183669},[4667],[78,183671,17848],{"className":183672},[4667],[78,183674,85568],{"className":183675,"style":79383},[4667,4678],[78,183677,2066],{"className":183678},[5126],[78,183680],{"className":183681,"style":4839},[4739],[78,183683,19],{"className":183684},[4667,4678],[78,183686],{"className":183687,"style":4740},[4739],[78,183689,41631],{"className":183690},[4744],[78,183692],{"className":183693,"style":4740},[4739],[78,183695,17463],{"className":183696,"style":17251},[4667,4678],[78,183698,4726],{"className":183699},[4725],[78,183701,183703],{"className":183702},[4698],[78,183704,183706],{"className":183705,"style":85727},[4702],[78,183707],{},[78,183709],{"className":183710},[4682,4761],[13,183712,85735,183713,1011,183715,85740,183717,85743,183719,85746,183721,85749],{},[596,183714,85568],{},[596,183716,17463],{},[596,183718,17463],{},[596,183720,85568],{},[596,183722,85568],{},[10548,183724,85753],{"id":85752},[78,183726,183728],{"className":183727},[4566],[78,183729,183731,183764],{"className":183730},[4570],[78,183732,183734],{"className":183733},[4574],[4576,183735,183736],{"xmlns":4578,"display":4579},[4581,183737,183738,183762],{},[4584,183739,183740,183742,183744,183746,183748,183750,183756,183758,183760],{},[4596,183741,5053],{},[4591,183743,4594],{"stretchy":4593},[4596,183745,19],{},[4591,183747,4604],{"stretchy":4593},[4591,183749,4609],{},[4614,183751,183752,183754],{},[4596,183753,85783],{},[4596,183755,5074],{},[4596,183757,13],{},[4591,183759,7351],{},[4596,183761,12172],{},[4647,183763,85794],{"encoding":4649},[78,183765,183767,183794,183841],{"className":183766,"ariaHidden":1419},[4654],[78,183768,183770,183773,183776,183779,183782,183785,183788,183791],{"className":183769},[4658],[78,183771],{"className":183772,"style":4663},[4662],[78,183774,5053],{"className":183775,"style":5170},[4667,4678],[78,183777,4594],{"className":183778},[4674],[78,183780,19],{"className":183781},[4667,4678],[78,183783,4604],{"className":183784},[4682],[78,183786],{"className":183787,"style":4740},[4739],[78,183789,4609],{"className":183790},[4744],[78,183792],{"className":183793,"style":4740},[4739],[78,183795,183797,183800,183829,183832,183835,183838],{"className":183796},[4658],[78,183798],{"className":183799,"style":85831},[4662],[78,183801,183803,183806],{"className":183802},[4667],[78,183804,85783],{"className":183805,"style":85838},[4667,4678],[78,183807,183809],{"className":183808},[4689],[78,183810,183812],{"className":183811},[4693],[78,183813,183815],{"className":183814},[4698],[78,183816,183818],{"className":183817,"style":5206},[4702],[78,183819,183820,183823],{"style":5209},[78,183821],{"className":183822,"style":4711},[4710],[78,183824,183826],{"className":183825},[4715,4716,4717,4718],[78,183827,5074],{"className":183828,"style":5219},[4667,4678,4718],[78,183830,13],{"className":183831},[4667,4678],[78,183833],{"className":183834,"style":5143},[4739],[78,183836,7351],{"className":183837},[7450],[78,183839],{"className":183840,"style":5143},[4739],[78,183842,183844,183847],{"className":183843},[4658],[78,183845],{"className":183846,"style":16794},[4662],[78,183848,12172],{"className":183849},[4667,4678],[13,183851,85885],{},[10548,183853,85889],{"id":85888},[13,183855,85892],{},[13,183857,85895],{},[78,183859,183861],{"className":183860},[4566],[78,183862,183864,183909],{"className":183863},[4570],[78,183865,183867],{"className":183866},[4574],[4576,183868,183869],{"xmlns":4578,"display":4579},[4581,183870,183871,183907],{},[4584,183872,183873,183875,183877,183879,183881,183883],{},[4596,183874,5053],{},[4591,183876,4594],{"stretchy":4593},[4596,183878,19],{},[4591,183880,4604],{"stretchy":4593},[4591,183882,4609],{},[4611,183884,183885,183887],{},[7077,183886,469],{},[4584,183888,183889,183891,183893],{},[7077,183890,469],{},[4591,183892,7351],{},[4614,183894,183895,183897],{},[4596,183896,4618],{},[4584,183898,183899,183901,183903,183905],{},[4591,183900,17848],{},[4596,183902,5245],{},[4591,183904,43664],{},[4596,183906,19],{},[4647,183908,85947],{"encoding":4649},[78,183910,183912,183939],{"className":183911,"ariaHidden":1419},[4654],[78,183913,183915,183918,183921,183924,183927,183930,183933,183936],{"className":183914},[4658],[78,183916],{"className":183917,"style":4663},[4662],[78,183919,5053],{"className":183920,"style":5170},[4667,4678],[78,183922,4594],{"className":183923},[4674],[78,183925,19],{"className":183926},[4667,4678],[78,183928,4604],{"className":183929},[4682],[78,183931],{"className":183932,"style":4740},[4739],[78,183934,4609],{"className":183935},[4744],[78,183937],{"className":183938,"style":4740},[4739],[78,183940,183942,183945],{"className":183941},[4658],[78,183943],{"className":183944,"style":85984},[4662],[78,183946,183948,183951,184054],{"className":183947},[4667],[78,183949],{"className":183950},[4674,4761],[78,183952,183954],{"className":183953},[4611],[78,183955,183957,184046],{"className":183956},[4693,4694],[78,183958,183960,184043],{"className":183959},[4698],[78,183961,183963,184024,184032],{"className":183962,"style":86003},[4702],[78,183964,183965,183968],{"style":4777},[78,183966],{"className":183967,"style":4781},[4710],[78,183969,183971,183974,183977,183980,183983],{"className":183970},[4667],[78,183972,469],{"className":183973},[4667],[78,183975],{"className":183976,"style":5143},[4739],[78,183978,7351],{"className":183979},[7450],[78,183981],{"className":183982,"style":5143},[4739],[78,183984,183986,183989],{"className":183985},[4667],[78,183987,4618],{"className":183988},[4667,4678],[78,183990,183992],{"className":183991},[4689],[78,183993,183995],{"className":183994},[4693],[78,183996,183998],{"className":183997},[4698],[78,183999,184001],{"className":184000,"style":86042},[4702],[78,184002,184003,184006],{"style":19600},[78,184004],{"className":184005,"style":4711},[4710],[78,184007,184009],{"className":184008},[4715,4716,4717,4718],[78,184010,184012,184015,184018,184021],{"className":184011},[4667,4718],[78,184013,17848],{"className":184014},[4667,4718],[78,184016,5245],{"className":184017},[4667,4678,4718],[78,184019,43664],{"className":184020},[7450,4718],[78,184022,19],{"className":184023},[4667,4678,4718],[78,184025,184026,184029],{"style":4919},[78,184027],{"className":184028,"style":4781},[4710],[78,184030],{"className":184031,"style":4927},[4926],[78,184033,184034,184037],{"style":4930},[78,184035],{"className":184036,"style":4781},[4710],[78,184038,184040],{"className":184039},[4667],[78,184041,469],{"className":184042},[4667],[78,184044,4726],{"className":184045},[4725],[78,184047,184049],{"className":184048},[4698],[78,184050,184052],{"className":184051,"style":83332},[4702],[78,184053],{},[78,184055],{"className":184056},[4682,4761],[13,184058,86101],{},[13,184060,86104],{},[78,184062,184064],{"className":184063},[4566],[78,184065,184067,184118],{"className":184066},[4570],[78,184068,184070],{"className":184069},[4574],[4576,184071,184072],{"xmlns":4578,"display":4579},[4581,184073,184074,184116],{},[4584,184075,184076,184078,184080,184082,184084,184086],{},[4596,184077,5053],{},[4591,184079,4594],{"stretchy":4593},[4596,184081,19],{},[4591,184083,4604],{"stretchy":4593},[4591,184085,4609],{},[4611,184087,184088,184096],{},[4584,184089,184090,184092,184094],{},[4596,184091,43673],{},[4591,184093,7351],{},[4596,184095,26052],{},[4584,184097,184098,184100,184102],{},[7077,184099,469],{},[4591,184101,7351],{},[4614,184103,184104,184106],{},[4596,184105,4618],{},[4584,184107,184108,184110,184112,184114],{},[4591,184109,17848],{},[4596,184111,5245],{},[4591,184113,43664],{},[4596,184115,19],{},[4647,184117,86162],{"encoding":4649},[78,184119,184121,184148],{"className":184120,"ariaHidden":1419},[4654],[78,184122,184124,184127,184130,184133,184136,184139,184142,184145],{"className":184123},[4658],[78,184125],{"className":184126,"style":4663},[4662],[78,184128,5053],{"className":184129,"style":5170},[4667,4678],[78,184131,4594],{"className":184132},[4674],[78,184134,19],{"className":184135},[4667,4678],[78,184137,4604],{"className":184138},[4682],[78,184140],{"className":184141,"style":4740},[4739],[78,184143,4609],{"className":184144},[4744],[78,184146],{"className":184147,"style":4740},[4739],[78,184149,184151,184154],{"className":184150},[4658],[78,184152],{"className":184153,"style":86199},[4662],[78,184155,184157,184160,184275],{"className":184156},[4667],[78,184158],{"className":184159},[4674,4761],[78,184161,184163],{"className":184162},[4611],[78,184164,184166,184267],{"className":184165},[4693,4694],[78,184167,184169,184264],{"className":184168},[4698],[78,184170,184172,184233,184241],{"className":184171,"style":83268},[4702],[78,184173,184174,184177],{"style":4777},[78,184175],{"className":184176,"style":4781},[4710],[78,184178,184180,184183,184186,184189,184192],{"className":184179},[4667],[78,184181,469],{"className":184182},[4667],[78,184184],{"className":184185,"style":5143},[4739],[78,184187,7351],{"className":184188},[7450],[78,184190],{"className":184191,"style":5143},[4739],[78,184193,184195,184198],{"className":184194},[4667],[78,184196,4618],{"className":184197},[4667,4678],[78,184199,184201],{"className":184200},[4689],[78,184202,184204],{"className":184203},[4693],[78,184205,184207],{"className":184206},[4698],[78,184208,184210],{"className":184209,"style":86042},[4702],[78,184211,184212,184215],{"style":19600},[78,184213],{"className":184214,"style":4711},[4710],[78,184216,184218],{"className":184217},[4715,4716,4717,4718],[78,184219,184221,184224,184227,184230],{"className":184220},[4667,4718],[78,184222,17848],{"className":184223},[4667,4718],[78,184225,5245],{"className":184226},[4667,4678,4718],[78,184228,43664],{"className":184229},[7450,4718],[78,184231,19],{"className":184232},[4667,4678,4718],[78,184234,184235,184238],{"style":4919},[78,184236],{"className":184237,"style":4781},[4710],[78,184239],{"className":184240,"style":4927},[4926],[78,184242,184243,184246],{"style":4930},[78,184244],{"className":184245,"style":4781},[4710],[78,184247,184249,184252,184255,184258,184261],{"className":184248},[4667],[78,184250,43673],{"className":184251,"style":5187},[4667,4678],[78,184253],{"className":184254,"style":5143},[4739],[78,184256,7351],{"className":184257},[7450],[78,184259],{"className":184260,"style":5143},[4739],[78,184262,26052],{"className":184263},[4667,4678],[78,184265,4726],{"className":184266},[4725],[78,184268,184270],{"className":184269},[4698],[78,184271,184273],{"className":184272,"style":83332},[4702],[78,184274],{},[78,184276],{"className":184277},[4682,4761],[13,184279,86326],{},[10548,184281,86330],{"id":86329},[13,184283,86333],{},[78,184285,184287],{"className":184286},[4566],[78,184288,184290,184347],{"className":184289},[4570],[78,184291,184293],{"className":184292},[4574],[4576,184294,184295],{"xmlns":4578,"display":4579},[4581,184296,184297,184345],{},[4584,184298,184299,184301,184303],{},[4596,184300,5053],{},[4591,184302,4609],{},[4584,184304,184305,184307],{},[4591,184306,55608],{"fence":1419},[37085,184308,184309,184327],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,184310,184311],{},[37094,184312,184313],{},[37101,184314,184315],{"scriptlevel":2949,"displaystyle":4593},[4584,184316,184317,184319,184321,184323,184325],{},[7077,184318,2949],{},[4591,184320,2066],{"separator":1419},[4596,184322,19],{},[4591,184324,41631],{},[7077,184326,2949],{},[37091,184328,184329],{},[37094,184330,184331],{},[37101,184332,184333],{"scriptlevel":2949,"displaystyle":4593},[4584,184334,184335,184337,184339,184341,184343],{},[7077,184336,469],{},[4591,184338,2066],{"separator":1419},[4596,184340,19],{},[4591,184342,85553],{},[7077,184344,2949],{},[4647,184346,86397],{"encoding":4649},[78,184348,184350,184368],{"className":184349,"ariaHidden":1419},[4654],[78,184351,184353,184356,184359,184362,184365],{"className":184352},[4658],[78,184354],{"className":184355,"style":43725},[4662],[78,184357,5053],{"className":184358,"style":5170},[4667,4678],[78,184360],{"className":184361,"style":4740},[4739],[78,184363,4609],{"className":184364},[4744],[78,184366],{"className":184367,"style":4740},[4739],[78,184369,184371,184374],{"className":184370},[4658],[78,184372],{"className":184373,"style":85616},[4662],[78,184375,184377,184383,184476],{"className":184376},[18342],[78,184378,184380],{"className":184379,"style":85624},[4674,85623],[78,184381,55608],{"className":184382},[56026,85628],[78,184384,184386],{"className":184385},[4667],[78,184387,184389],{"className":184388},[37085],[78,184390,184392],{"className":184391},[38098],[78,184393,184395,184468],{"className":184394},[4693,4694],[78,184396,184398,184465],{"className":184397},[4698],[78,184399,184401,184433],{"className":184400,"style":85647},[4702],[78,184402,184403,184406],{"style":85650},[78,184404],{"className":184405,"style":56145},[4710],[78,184407,184409,184412,184415,184418,184421,184424,184427,184430],{"className":184408},[4667],[78,184410,2949],{"className":184411},[4667],[78,184413,2066],{"className":184414},[5126],[78,184416],{"className":184417,"style":4839},[4739],[78,184419,19],{"className":184420},[4667,4678],[78,184422],{"className":184423,"style":4740},[4739],[78,184425,41631],{"className":184426},[4744],[78,184428],{"className":184429,"style":4740},[4739],[78,184431,2949],{"className":184432},[4667],[78,184434,184435,184438],{"style":85684},[78,184436],{"className":184437,"style":56145},[4710],[78,184439,184441,184444,184447,184450,184453,184456,184459,184462],{"className":184440},[4667],[78,184442,469],{"className":184443},[4667],[78,184445,2066],{"className":184446},[5126],[78,184448],{"className":184449,"style":4839},[4739],[78,184451,19],{"className":184452},[4667,4678],[78,184454],{"className":184455,"style":4740},[4739],[78,184457,85553],{"className":184458},[4744],[78,184460],{"className":184461,"style":4740},[4739],[78,184463,2949],{"className":184464},[4667],[78,184466,4726],{"className":184467},[4725],[78,184469,184471],{"className":184470},[4698],[78,184472,184474],{"className":184473,"style":85727},[4702],[78,184475],{},[78,184477],{"className":184478},[4682,4761],[13,184480,86532],{},[78,184482,184484],{"className":184483},[4566],[78,184485,184487,184546],{"className":184486},[4570],[78,184488,184490],{"className":184489},[4574],[4576,184491,184492],{"xmlns":4578,"display":4579},[4581,184493,184494,184544],{},[4584,184495,184496,184498,184500],{},[4596,184497,5053],{},[4591,184499,4609],{},[4584,184501,184502,184504],{},[4591,184503,55608],{"fence":1419},[37085,184505,184506,184526],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,184507,184508],{},[37094,184509,184510],{},[37101,184511,184512],{"scriptlevel":2949,"displaystyle":4593},[4584,184513,184514,184516,184518,184520,184522,184524],{},[4591,184515,17848],{},[7077,184517,469],{},[4591,184519,2066],{"separator":1419},[4596,184521,19],{},[4591,184523,41631],{},[7077,184525,2949],{},[37091,184527,184528],{},[37094,184529,184530],{},[37101,184531,184532],{"scriptlevel":2949,"displaystyle":4593},[4584,184533,184534,184536,184538,184540,184542],{},[7077,184535,469],{},[4591,184537,2066],{"separator":1419},[4596,184539,19],{},[4591,184541,85553],{},[7077,184543,2949],{},[4647,184545,86598],{"encoding":4649},[78,184547,184549,184567],{"className":184548,"ariaHidden":1419},[4654],[78,184550,184552,184555,184558,184561,184564],{"className":184551},[4658],[78,184553],{"className":184554,"style":43725},[4662],[78,184556,5053],{"className":184557,"style":5170},[4667,4678],[78,184559],{"className":184560,"style":4740},[4739],[78,184562,4609],{"className":184563},[4744],[78,184565],{"className":184566,"style":4740},[4739],[78,184568,184570,184573],{"className":184569},[4658],[78,184571],{"className":184572,"style":85616},[4662],[78,184574,184576,184582,184678],{"className":184575},[18342],[78,184577,184579],{"className":184578,"style":85624},[4674,85623],[78,184580,55608],{"className":184581},[56026,85628],[78,184583,184585],{"className":184584},[4667],[78,184586,184588],{"className":184587},[37085],[78,184589,184591],{"className":184590},[38098],[78,184592,184594,184670],{"className":184593},[4693,4694],[78,184595,184597,184667],{"className":184596},[4698],[78,184598,184600,184635],{"className":184599,"style":85647},[4702],[78,184601,184602,184605],{"style":85650},[78,184603],{"className":184604,"style":56145},[4710],[78,184606,184608,184611,184614,184617,184620,184623,184626,184629,184632],{"className":184607},[4667],[78,184609,17848],{"className":184610},[4667],[78,184612,469],{"className":184613},[4667],[78,184615,2066],{"className":184616},[5126],[78,184618],{"className":184619,"style":4839},[4739],[78,184621,19],{"className":184622},[4667,4678],[78,184624],{"className":184625,"style":4740},[4739],[78,184627,41631],{"className":184628},[4744],[78,184630],{"className":184631,"style":4740},[4739],[78,184633,2949],{"className":184634},[4667],[78,184636,184637,184640],{"style":85684},[78,184638],{"className":184639,"style":56145},[4710],[78,184641,184643,184646,184649,184652,184655,184658,184661,184664],{"className":184642},[4667],[78,184644,469],{"className":184645},[4667],[78,184647,2066],{"className":184648},[5126],[78,184650],{"className":184651,"style":4839},[4739],[78,184653,19],{"className":184654},[4667,4678],[78,184656],{"className":184657,"style":4740},[4739],[78,184659,85553],{"className":184660},[4744],[78,184662],{"className":184663,"style":4740},[4739],[78,184665,2949],{"className":184666},[4667],[78,184668,4726],{"className":184669},[4725],[78,184671,184673],{"className":184672},[4698],[78,184674,184676],{"className":184675,"style":85727},[4702],[78,184677],{},[78,184679],{"className":184680},[4682,4761],[13,184682,86736],{},[78,184684,184686],{"className":184685},[4566],[78,184687,184689,184706],{"className":184688},[4570],[78,184690,184692],{"className":184691},[4574],[4576,184693,184694],{"xmlns":4578,"display":4579},[4581,184695,184696,184704],{},[4584,184697,184698,184700,184702],{},[4596,184699,5053],{},[4591,184701,4609],{},[4596,184703,19],{},[4647,184705,86760],{"encoding":4649},[78,184707,184709,184727],{"className":184708,"ariaHidden":1419},[4654],[78,184710,184712,184715,184718,184721,184724],{"className":184711},[4658],[78,184713],{"className":184714,"style":43725},[4662],[78,184716,5053],{"className":184717,"style":5170},[4667,4678],[78,184719],{"className":184720,"style":4740},[4739],[78,184722,4609],{"className":184723},[4744],[78,184725],{"className":184726,"style":4740},[4739],[78,184728,184730,184733],{"className":184729},[4658],[78,184731],{"className":184732,"style":16838},[4662],[78,184734,19],{"className":184735},[4667,4678],[13,184737,86793],{},[78,184739,184741],{"className":184740},[4566],[78,184742,184744,184823],{"className":184743},[4570],[78,184745,184747],{"className":184746},[4574],[4576,184748,184749],{"xmlns":4578,"display":4579},[4581,184750,184751,184821],{},[4584,184752,184753,184755,184757],{},[4596,184754,5053],{},[4591,184756,4609],{},[4584,184758,184759,184761],{},[4591,184760,55608],{"fence":1419},[37085,184762,184763,184781,184803],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,184764,184765],{},[37094,184766,184767],{},[37101,184768,184769],{"scriptlevel":2949,"displaystyle":4593},[4584,184770,184771,184773,184775,184777,184779],{},[7077,184772,2949],{},[4591,184774,2066],{"separator":1419},[4596,184776,19],{},[4591,184778,41631],{},[7077,184780,2949],{},[37091,184782,184783],{},[37094,184784,184785],{},[37101,184786,184787],{"scriptlevel":2949,"displaystyle":4593},[4584,184788,184789,184791,184793,184795,184797,184799,184801],{},[4596,184790,19],{},[4591,184792,2066],{"separator":1419},[7077,184794,2949],{},[4591,184796,52344],{},[4596,184798,19],{},[4591,184800,52344],{},[7077,184802,469],{},[37091,184804,184805],{},[37094,184806,184807],{},[37101,184808,184809],{"scriptlevel":2949,"displaystyle":4593},[4584,184810,184811,184813,184815,184817,184819],{},[7077,184812,469],{},[4591,184814,2066],{"separator":1419},[4596,184816,19],{},[4591,184818,52294],{},[7077,184820,469],{},[4647,184822,86879],{"encoding":4649},[78,184824,184826,184844],{"className":184825,"ariaHidden":1419},[4654],[78,184827,184829,184832,184835,184838,184841],{"className":184828},[4658],[78,184830],{"className":184831,"style":43725},[4662],[78,184833,5053],{"className":184834,"style":5170},[4667,4678],[78,184836],{"className":184837,"style":4740},[4739],[78,184839,4609],{"className":184840},[4744],[78,184842],{"className":184843,"style":4740},[4739],[78,184845,184847,184850],{"className":184846},[4658],[78,184848],{"className":184849,"style":56016},[4662],[78,184851,184853,184931,185068],{"className":184852},[18342],[78,184854,184856],{"className":184855},[4674],[78,184857,184859],{"className":184858},[56026,56027],[78,184860,184862,184923],{"className":184861},[4693,4694],[78,184863,184865,184920],{"className":184864},[4698],[78,184866,184868,184878,184889,184899,184910],{"className":184867,"style":56037},[4702],[78,184869,184870,184873],{"style":56040},[78,184871],{"className":184872,"style":56044},[4710],[78,184874,184876],{"className":184875},[56048,56049],[78,184877,56052],{},[78,184879,184880,184883],{"style":56055},[78,184881],{"className":184882,"style":56044},[4710],[78,184884,184885],{"style":56061},[5884,184886,184887],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,184888],{"d":56071},[78,184890,184891,184894],{"style":56074},[78,184892],{"className":184893,"style":56044},[4710],[78,184895,184897],{"className":184896},[56048,56049],[78,184898,56083],{},[78,184900,184901,184904],{"style":56086},[78,184902],{"className":184903,"style":56044},[4710],[78,184905,184906],{"style":56061},[5884,184907,184908],{"xmlns":5886,"width":56064,"height":56065,"style":56066,"viewBox":56067,"preserveAspectRatio":56068},[5892,184909],{"d":56071},[78,184911,184912,184915],{"style":56098},[78,184913],{"className":184914,"style":56044},[4710],[78,184916,184918],{"className":184917},[56048,56049],[78,184919,56107],{},[78,184921,4726],{"className":184922},[4725],[78,184924,184926],{"className":184925},[4698],[78,184927,184929],{"className":184928,"style":56117},[4702],[78,184930],{},[78,184932,184934],{"className":184933},[4667],[78,184935,184937],{"className":184936},[37085],[78,184938,184940],{"className":184939},[38098],[78,184941,184943,185060],{"className":184942},[4693,4694],[78,184944,184946,185057],{"className":184945},[4698],[78,184947,184949,184981,185025],{"className":184948,"style":56138},[4702],[78,184950,184951,184954],{"style":56141},[78,184952],{"className":184953,"style":56145},[4710],[78,184955,184957,184960,184963,184966,184969,184972,184975,184978],{"className":184956},[4667],[78,184958,2949],{"className":184959},[4667],[78,184961,2066],{"className":184962},[5126],[78,184964],{"className":184965,"style":4839},[4739],[78,184967,19],{"className":184968},[4667,4678],[78,184970],{"className":184971,"style":4740},[4739],[78,184973,41631],{"className":184974},[4744],[78,184976],{"className":184977,"style":4740},[4739],[78,184979,2949],{"className":184980},[4667],[78,184982,184983,184986],{"style":56318},[78,184984],{"className":184985,"style":56145},[4710],[78,184987,184989,184992,184995,184998,185001,185004,185007,185010,185013,185016,185019,185022],{"className":184988},[4667],[78,184990,19],{"className":184991},[4667,4678],[78,184993,2066],{"className":184994},[5126],[78,184996],{"className":184997,"style":4839},[4739],[78,184999,2949],{"className":185000},[4667],[78,185002],{"className":185003,"style":4740},[4739],[78,185005,52344],{"className":185006},[4744],[78,185008],{"className":185009,"style":4740},[4739],[78,185011,19],{"className":185012},[4667,4678],[78,185014],{"className":185015,"style":4740},[4739],[78,185017,52344],{"className":185018},[4744],[78,185020],{"className":185021,"style":4740},[4739],[78,185023,469],{"className":185024},[4667],[78,185026,185027,185030],{"style":56444},[78,185028],{"className":185029,"style":56145},[4710],[78,185031,185033,185036,185039,185042,185045,185048,185051,185054],{"className":185032},[4667],[78,185034,469],{"className":185035},[4667],[78,185037,2066],{"className":185038},[5126],[78,185040],{"className":185041,"style":4839},[4739],[78,185043,19],{"className":185044},[4667,4678],[78,185046],{"className":185047,"style":4740},[4739],[78,185049,52294],{"className":185050},[4744],[78,185052],{"className":185053,"style":4740},[4739],[78,185055,469],{"className":185056},[4667],[78,185058,4726],{"className":185059},[4725],[78,185061,185063],{"className":185062},[4698],[78,185064,185066],{"className":185065,"style":56564},[4702],[78,185067],{},[78,185069],{"className":185070},[4682,4761],[13,185072,87130],{},[78,185074,185076],{"className":185075},[4566],[78,185077,185079,185114],{"className":185078},[4570],[78,185080,185082],{"className":185081},[4574],[4576,185083,185084],{"xmlns":4578,"display":4579},[4581,185085,185086,185112],{},[4584,185087,185088,185090,185092],{},[4596,185089,5053],{},[4591,185091,4609],{},[4611,185093,185094,185096],{},[7077,185095,469],{},[4584,185097,185098,185100,185102],{},[7077,185099,469],{},[4591,185101,7351],{},[4614,185103,185104,185106],{},[4596,185105,4618],{},[4584,185107,185108,185110],{},[4591,185109,17848],{},[4596,185111,19],{},[4647,185113,87172],{"encoding":4649},[78,185115,185117,185135],{"className":185116,"ariaHidden":1419},[4654],[78,185118,185120,185123,185126,185129,185132],{"className":185119},[4658],[78,185121],{"className":185122,"style":43725},[4662],[78,185124,5053],{"className":185125,"style":5170},[4667,4678],[78,185127],{"className":185128,"style":4740},[4739],[78,185130,4609],{"className":185131},[4744],[78,185133],{"className":185134,"style":4740},[4739],[78,185136,185138,185141],{"className":185137},[4658],[78,185139],{"className":185140,"style":85984},[4662],[78,185142,185144,185147,185244],{"className":185143},[4667],[78,185145],{"className":185146},[4674,4761],[78,185148,185150],{"className":185149},[4611],[78,185151,185153,185236],{"className":185152},[4693,4694],[78,185154,185156,185233],{"className":185155},[4698],[78,185157,185159,185214,185222],{"className":185158,"style":86003},[4702],[78,185160,185161,185164],{"style":4777},[78,185162],{"className":185163,"style":4781},[4710],[78,185165,185167,185170,185173,185176,185179],{"className":185166},[4667],[78,185168,469],{"className":185169},[4667],[78,185171],{"className":185172,"style":5143},[4739],[78,185174,7351],{"className":185175},[7450],[78,185177],{"className":185178,"style":5143},[4739],[78,185180,185182,185185],{"className":185181},[4667],[78,185183,4618],{"className":185184},[4667,4678],[78,185186,185188],{"className":185187},[4689],[78,185189,185191],{"className":185190},[4693],[78,185192,185194],{"className":185193},[4698],[78,185195,185197],{"className":185196,"style":87256},[4702],[78,185198,185199,185202],{"style":19600},[78,185200],{"className":185201,"style":4711},[4710],[78,185203,185205],{"className":185204},[4715,4716,4717,4718],[78,185206,185208,185211],{"className":185207},[4667,4718],[78,185209,17848],{"className":185210},[4667,4718],[78,185212,19],{"className":185213},[4667,4678,4718],[78,185215,185216,185219],{"style":4919},[78,185217],{"className":185218,"style":4781},[4710],[78,185220],{"className":185221,"style":4927},[4926],[78,185223,185224,185227],{"style":4930},[78,185225],{"className":185226,"style":4781},[4710],[78,185228,185230],{"className":185229},[4667],[78,185231,469],{"className":185232},[4667],[78,185234,4726],{"className":185235},[4725],[78,185237,185239],{"className":185238},[4698],[78,185240,185242],{"className":185241,"style":83332},[4702],[78,185243],{},[78,185245],{"className":185246},[4682,4761],[13,185248,87309],{},[78,185250,185252],{"className":185251},[4566],[78,185253,185255,185312],{"className":185254},[4570],[78,185256,185258],{"className":185257},[4574],[4576,185259,185260],{"xmlns":4578,"display":4579},[4581,185261,185262,185310],{},[4584,185263,185264,185266,185268],{},[4596,185265,5053],{},[4591,185267,4609],{},[4611,185269,185270,185290],{},[4584,185271,185272,185278,185280],{},[4614,185273,185274,185276],{},[4596,185275,4618],{},[4596,185277,19],{},[4591,185279,17848],{},[4614,185281,185282,185284],{},[4596,185283,4618],{},[4584,185285,185286,185288],{},[4591,185287,17848],{},[4596,185289,19],{},[4584,185291,185292,185298,185300],{},[4614,185293,185294,185296],{},[4596,185295,4618],{},[4596,185297,19],{},[4591,185299,7351],{},[4614,185301,185302,185304],{},[4596,185303,4618],{},[4584,185305,185306,185308],{},[4591,185307,17848],{},[4596,185309,19],{},[4647,185311,87373],{"encoding":4649},[78,185313,185315,185333],{"className":185314,"ariaHidden":1419},[4654],[78,185316,185318,185321,185324,185327,185330],{"className":185317},[4658],[78,185319],{"className":185320,"style":43725},[4662],[78,185322,5053],{"className":185323,"style":5170},[4667,4678],[78,185325],{"className":185326,"style":4740},[4739],[78,185328,4609],{"className":185329},[4744],[78,185331],{"className":185332,"style":4740},[4739],[78,185334,185336,185339],{"className":185335},[4658],[78,185337],{"className":185338,"style":87401},[4662],[78,185340,185342,185345,185538],{"className":185341},[4667],[78,185343],{"className":185344},[4674,4761],[78,185346,185348],{"className":185347},[4611],[78,185349,185351,185530],{"className":185350},[4693,4694],[78,185352,185354,185527],{"className":185353},[4698],[78,185355,185357,185438,185446],{"className":185356,"style":87420},[4702],[78,185358,185359,185362],{"style":4777},[78,185360],{"className":185361,"style":4781},[4710],[78,185363,185365,185394,185397,185400,185403],{"className":185364},[4667],[78,185366,185368,185371],{"className":185367},[4667],[78,185369,4618],{"className":185370},[4667,4678],[78,185372,185374],{"className":185373},[4689],[78,185375,185377],{"className":185376},[4693],[78,185378,185380],{"className":185379},[4698],[78,185381,185383],{"className":185382,"style":87447},[4702],[78,185384,185385,185388],{"style":19600},[78,185386],{"className":185387,"style":4711},[4710],[78,185389,185391],{"className":185390},[4715,4716,4717,4718],[78,185392,19],{"className":185393},[4667,4678,4718],[78,185395],{"className":185396,"style":5143},[4739],[78,185398,7351],{"className":185399},[7450],[78,185401],{"className":185402,"style":5143},[4739],[78,185404,185406,185409],{"className":185405},[4667],[78,185407,4618],{"className":185408},[4667,4678],[78,185410,185412],{"className":185411},[4689],[78,185413,185415],{"className":185414},[4693],[78,185416,185418],{"className":185417},[4698],[78,185419,185421],{"className":185420,"style":87256},[4702],[78,185422,185423,185426],{"style":19600},[78,185424],{"className":185425,"style":4711},[4710],[78,185427,185429],{"className":185428},[4715,4716,4717,4718],[78,185430,185432,185435],{"className":185431},[4667,4718],[78,185433,17848],{"className":185434},[4667,4718],[78,185436,19],{"className":185437},[4667,4678,4718],[78,185439,185440,185443],{"style":4919},[78,185441],{"className":185442,"style":4781},[4710],[78,185444],{"className":185445,"style":4927},[4926],[78,185447,185448,185451],{"style":4930},[78,185449],{"className":185450,"style":4781},[4710],[78,185452,185454,185483,185486,185489,185492],{"className":185453},[4667],[78,185455,185457,185460],{"className":185456},[4667],[78,185458,4618],{"className":185459},[4667,4678],[78,185461,185463],{"className":185462},[4689],[78,185464,185466],{"className":185465},[4693],[78,185467,185469],{"className":185468},[4698],[78,185470,185472],{"className":185471,"style":56349},[4702],[78,185473,185474,185477],{"style":4958},[78,185475],{"className":185476,"style":4711},[4710],[78,185478,185480],{"className":185479},[4715,4716,4717,4718],[78,185481,19],{"className":185482},[4667,4678,4718],[78,185484],{"className":185485,"style":5143},[4739],[78,185487,17848],{"className":185488},[7450],[78,185490],{"className":185491,"style":5143},[4739],[78,185493,185495,185498],{"className":185494},[4667],[78,185496,4618],{"className":185497},[4667,4678],[78,185499,185501],{"className":185500},[4689],[78,185502,185504],{"className":185503},[4693],[78,185505,185507],{"className":185506},[4698],[78,185508,185510],{"className":185509,"style":87575},[4702],[78,185511,185512,185515],{"style":4958},[78,185513],{"className":185514,"style":4711},[4710],[78,185516,185518],{"className":185517},[4715,4716,4717,4718],[78,185519,185521,185524],{"className":185520},[4667,4718],[78,185522,17848],{"className":185523},[4667,4718],[78,185525,19],{"className":185526},[4667,4678,4718],[78,185528,4726],{"className":185529},[4725],[78,185531,185533],{"className":185532},[4698],[78,185534,185536],{"className":185535,"style":83332},[4702],[78,185537],{},[78,185539],{"className":185540},[4682,4761],[13,185542,87609],{},[78,185544,185546],{"className":185545},[4566],[78,185547,185549,185606],{"className":185548},[4570],[78,185550,185552],{"className":185551},[4574],[4576,185553,185554],{"xmlns":4578,"display":4579},[4581,185555,185556,185604],{},[4584,185557,185558,185560,185562],{},[4596,185559,5053],{},[4591,185561,4609],{},[4584,185563,185564,185566],{},[4591,185565,55608],{"fence":1419},[37085,185567,185568,185586],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,185569,185570],{},[37094,185571,185572],{},[37101,185573,185574],{"scriptlevel":2949,"displaystyle":4593},[4584,185575,185576,185578,185580,185582,185584],{},[7077,185577,2949],{},[4591,185579,2066],{"separator":1419},[4596,185581,19],{},[4591,185583,41631],{},[7077,185585,2949],{},[37091,185587,185588],{},[37094,185589,185590],{},[37101,185591,185592],{"scriptlevel":2949,"displaystyle":4593},[4584,185593,185594,185596,185598,185600,185602],{},[4596,185595,19],{},[4591,185597,2066],{"separator":1419},[4596,185599,19],{},[4591,185601,85553],{},[7077,185603,2949],{},[4647,185605,87673],{"encoding":4649},[78,185607,185609,185627],{"className":185608,"ariaHidden":1419},[4654],[78,185610,185612,185615,185618,185621,185624],{"className":185611},[4658],[78,185613],{"className":185614,"style":43725},[4662],[78,185616,5053],{"className":185617,"style":5170},[4667,4678],[78,185619],{"className":185620,"style":4740},[4739],[78,185622,4609],{"className":185623},[4744],[78,185625],{"className":185626,"style":4740},[4739],[78,185628,185630,185633],{"className":185629},[4658],[78,185631],{"className":185632,"style":85616},[4662],[78,185634,185636,185642,185735],{"className":185635},[18342],[78,185637,185639],{"className":185638,"style":85624},[4674,85623],[78,185640,55608],{"className":185641},[56026,85628],[78,185643,185645],{"className":185644},[4667],[78,185646,185648],{"className":185647},[37085],[78,185649,185651],{"className":185650},[38098],[78,185652,185654,185727],{"className":185653},[4693,4694],[78,185655,185657,185724],{"className":185656},[4698],[78,185658,185660,185692],{"className":185659,"style":85647},[4702],[78,185661,185662,185665],{"style":85650},[78,185663],{"className":185664,"style":56145},[4710],[78,185666,185668,185671,185674,185677,185680,185683,185686,185689],{"className":185667},[4667],[78,185669,2949],{"className":185670},[4667],[78,185672,2066],{"className":185673},[5126],[78,185675],{"className":185676,"style":4839},[4739],[78,185678,19],{"className":185679},[4667,4678],[78,185681],{"className":185682,"style":4740},[4739],[78,185684,41631],{"className":185685},[4744],[78,185687],{"className":185688,"style":4740},[4739],[78,185690,2949],{"className":185691},[4667],[78,185693,185694,185697],{"style":85684},[78,185695],{"className":185696,"style":56145},[4710],[78,185698,185700,185703,185706,185709,185712,185715,185718,185721],{"className":185699},[4667],[78,185701,19],{"className":185702},[4667,4678],[78,185704,2066],{"className":185705},[5126],[78,185707],{"className":185708,"style":4839},[4739],[78,185710,19],{"className":185711},[4667,4678],[78,185713],{"className":185714,"style":4740},[4739],[78,185716,85553],{"className":185717},[4744],[78,185719],{"className":185720,"style":4740},[4739],[78,185722,2949],{"className":185723},[4667],[78,185725,4726],{"className":185726},[4725],[78,185728,185730],{"className":185729},[4698],[78,185731,185733],{"className":185732,"style":85727},[4702],[78,185734],{},[78,185736],{"className":185737},[4682,4761],[23289,185739],{},[7759,185741,87811],{"id":87810},[13,185743,87814,185744,87818,185746,87821,185748,87824],{},[596,185745,87817],{},[596,185747,87817],{},[596,185749,87817],{},[10548,185751,87827],{"id":87827},[13,185753,87830],{},[13,185755,87833,185756,87837],{},[78,185757,87836],{},[78,185759,185761],{"className":185760},[4566],[78,185762,185764,185849],{"className":185763},[4570],[78,185765,185767],{"className":185766},[4574],[4576,185768,185769],{"xmlns":4578,"display":4579},[4581,185770,185771,185847],{},[4584,185772,185773,185779,185781],{},[4600,185774,185775,185777],{},[4596,185776,6107],{},[4596,185778,39],{},[4591,185780,4609],{},[4584,185782,185783,185785],{},[4591,185784,55608],{"fence":1419},[37085,185786,185787,185817],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,185788,185789],{},[37094,185790,185791],{},[37101,185792,185793],{"scriptlevel":2949,"displaystyle":4593},[4584,185794,185795,185801,185803,185809,185811,185813,185815],{},[4600,185796,185797,185799],{},[4596,185798,6107],{},[4596,185800,39],{},[4591,185802,7351],{},[4600,185804,185805,185807],{},[4596,185806,55556],{},[4596,185808,39],{},[4591,185810,2066],{"separator":1419},[4596,185812,52274],{},[4591,185814,41631],{},[4596,185816,63871],{},[37091,185818,185819],{},[37094,185820,185821],{},[37101,185822,185823],{"scriptlevel":2949,"displaystyle":4593},[4584,185824,185825,185831,185833,185839,185841,185843,185845],{},[4600,185826,185827,185829],{},[4596,185828,6107],{},[4596,185830,39],{},[4591,185832,17848],{},[4600,185834,185835,185837],{},[4596,185836,55556],{},[4596,185838,39],{},[4591,185840,2066],{"separator":1419},[4596,185842,52274],{},[4591,185844,52294],{},[4596,185846,63871],{},[4647,185848,87929],{"encoding":4649},[78,185850,185852,185907],{"className":185851,"ariaHidden":1419},[4654],[78,185853,185855,185858,185898,185901,185904],{"className":185854},[4658],[78,185856],{"className":185857,"style":20406},[4662],[78,185859,185861,185864],{"className":185860},[4667],[78,185862,6107],{"className":185863,"style":5219},[4667,4678],[78,185865,185867],{"className":185866},[4689],[78,185868,185870,185890],{"className":185869},[4693,4694],[78,185871,185873,185887],{"className":185872},[4698],[78,185874,185876],{"className":185875,"style":4703},[4702],[78,185877,185878,185881],{"style":6159},[78,185879],{"className":185880,"style":4711},[4710],[78,185882,185884],{"className":185883},[4715,4716,4717,4718],[78,185885,39],{"className":185886},[4667,4678,4718],[78,185888,4726],{"className":185889},[4725],[78,185891,185893],{"className":185892},[4698],[78,185894,185896],{"className":185895,"style":4733},[4702],[78,185897],{},[78,185899],{"className":185900,"style":4740},[4739],[78,185902,4609],{"className":185903},[4744],[78,185905],{"className":185906,"style":4740},[4739],[78,185908,185910,185913],{"className":185909},[4658],[78,185911],{"className":185912,"style":85616},[4662],[78,185914,185916,185922,186187],{"className":185915},[18342],[78,185917,185919],{"className":185918,"style":85624},[4674,85623],[78,185920,55608],{"className":185921},[56026,85628],[78,185923,185925],{"className":185924},[4667],[78,185926,185928],{"className":185927},[37085],[78,185929,185931],{"className":185930},[38098],[78,185932,185934,186179],{"className":185933},[4693,4694],[78,185935,185937,186176],{"className":185936},[4698],[78,185938,185940,186058],{"className":185939,"style":85647},[4702],[78,185941,185942,185945],{"style":85650},[78,185943],{"className":185944,"style":56145},[4710],[78,185946,185948,185988,185991,185994,185997,186037,186040,186043,186046,186049,186052,186055],{"className":185947},[4667],[78,185949,185951,185954],{"className":185950},[4667],[78,185952,6107],{"className":185953,"style":5219},[4667,4678],[78,185955,185957],{"className":185956},[4689],[78,185958,185960,185980],{"className":185959},[4693,4694],[78,185961,185963,185977],{"className":185962},[4698],[78,185964,185966],{"className":185965,"style":4703},[4702],[78,185967,185968,185971],{"style":6159},[78,185969],{"className":185970,"style":4711},[4710],[78,185972,185974],{"className":185973},[4715,4716,4717,4718],[78,185975,39],{"className":185976},[4667,4678,4718],[78,185978,4726],{"className":185979},[4725],[78,185981,185983],{"className":185982},[4698],[78,185984,185986],{"className":185985,"style":4733},[4702],[78,185987],{},[78,185989],{"className":185990,"style":5143},[4739],[78,185992,7351],{"className":185993},[7450],[78,185995],{"className":185996,"style":5143},[4739],[78,185998,186000,186003],{"className":185999},[4667],[78,186001,55556],{"className":186002,"style":55911},[4667,4678],[78,186004,186006],{"className":186005},[4689],[78,186007,186009,186029],{"className":186008},[4693,4694],[78,186010,186012,186026],{"className":186011},[4698],[78,186013,186015],{"className":186014,"style":4703},[4702],[78,186016,186017,186020],{"style":88098},[78,186018],{"className":186019,"style":4711},[4710],[78,186021,186023],{"className":186022},[4715,4716,4717,4718],[78,186024,39],{"className":186025},[4667,4678,4718],[78,186027,4726],{"className":186028},[4725],[78,186030,186032],{"className":186031},[4698],[78,186033,186035],{"className":186034,"style":4733},[4702],[78,186036],{},[78,186038,2066],{"className":186039},[5126],[78,186041],{"className":186042,"style":4839},[4739],[78,186044,52274],{"className":186045,"style":17251},[4667,4678],[78,186047],{"className":186048,"style":4740},[4739],[78,186050,41631],{"className":186051},[4744],[78,186053],{"className":186054,"style":4740},[4739],[78,186056,63871],{"className":186057,"style":5143},[4667,4678],[78,186059,186060,186063],{"style":85684},[78,186061],{"className":186062,"style":56145},[4710],[78,186064,186066,186106,186109,186112,186115,186155,186158,186161,186164,186167,186170,186173],{"className":186065},[4667],[78,186067,186069,186072],{"className":186068},[4667],[78,186070,6107],{"className":186071,"style":5219},[4667,4678],[78,186073,186075],{"className":186074},[4689],[78,186076,186078,186098],{"className":186077},[4693,4694],[78,186079,186081,186095],{"className":186080},[4698],[78,186082,186084],{"className":186083,"style":4703},[4702],[78,186085,186086,186089],{"style":6159},[78,186087],{"className":186088,"style":4711},[4710],[78,186090,186092],{"className":186091},[4715,4716,4717,4718],[78,186093,39],{"className":186094},[4667,4678,4718],[78,186096,4726],{"className":186097},[4725],[78,186099,186101],{"className":186100},[4698],[78,186102,186104],{"className":186103,"style":4733},[4702],[78,186105],{},[78,186107],{"className":186108,"style":5143},[4739],[78,186110,17848],{"className":186111},[7450],[78,186113],{"className":186114,"style":5143},[4739],[78,186116,186118,186121],{"className":186117},[4667],[78,186119,55556],{"className":186120,"style":55911},[4667,4678],[78,186122,186124],{"className":186123},[4689],[78,186125,186127,186147],{"className":186126},[4693,4694],[78,186128,186130,186144],{"className":186129},[4698],[78,186131,186133],{"className":186132,"style":4703},[4702],[78,186134,186135,186138],{"style":88098},[78,186136],{"className":186137,"style":4711},[4710],[78,186139,186141],{"className":186140},[4715,4716,4717,4718],[78,186142,39],{"className":186143},[4667,4678,4718],[78,186145,4726],{"className":186146},[4725],[78,186148,186150],{"className":186149},[4698],[78,186151,186153],{"className":186152,"style":4733},[4702],[78,186154],{},[78,186156,2066],{"className":186157},[5126],[78,186159],{"className":186160,"style":4839},[4739],[78,186162,52274],{"className":186163,"style":17251},[4667,4678],[78,186165],{"className":186166,"style":4740},[4739],[78,186168,52294],{"className":186169},[4744],[78,186171],{"className":186172,"style":4740},[4739],[78,186174,63871],{"className":186175,"style":5143},[4667,4678],[78,186177,4726],{"className":186178},[4725],[78,186180,186182],{"className":186181},[4698],[78,186183,186185],{"className":186184,"style":85727},[4702],[78,186186],{},[78,186188],{"className":186189},[4682,4761],[13,186191,88274],{},[23289,186193],{},[7759,186195,88280],{"id":88279},[13,186197,88283],{},[10548,186199,88287],{"id":88286},[13,186201,88290],{},[13,186203,88293],{},[78,186205,186207],{"className":186206},[4566],[78,186208,186210,186295],{"className":186209},[4570],[78,186211,186213],{"className":186212},[4574],[4576,186214,186215],{"xmlns":4578,"display":4579},[4581,186216,186217,186293],{},[4584,186218,186219,186221,186223,186225,186227,186229,186231,186233,186235,186237,186239],{},[4596,186220,88311],{},[4591,186222,4594],{"stretchy":4593},[4596,186224,63871],{},[4591,186226,2066],{"separator":1419},[4596,186228,5053],{},[4591,186230,4594],{"stretchy":4593},[4596,186232,4598],{},[4591,186234,4604],{"stretchy":4593},[4591,186236,4604],{"stretchy":4593},[4591,186238,4609],{},[4584,186240,186241,186243],{},[4591,186242,55608],{"fence":1419},[37085,186244,186245,186269],{"rowspacing":55611,"columnalign":55612,"columnspacing":55613},[37091,186246,186247],{},[37094,186248,186249],{},[37101,186250,186251],{"scriptlevel":2949,"displaystyle":4593},[4584,186252,186253,186255,186257,186259,186261,186263,186265,186267],{},[7077,186254,469],{},[4591,186256,2066],{"separator":1419},[4596,186258,63871],{},[4591,186260,88352],{"mathvariant":7101},[4596,186262,5053],{},[4591,186264,4594],{"stretchy":4593},[4596,186266,4598],{},[4591,186268,4604],{"stretchy":4593},[37091,186270,186271],{},[37094,186272,186273],{},[37101,186274,186275],{"scriptlevel":2949,"displaystyle":4593},[4584,186276,186277,186279,186281,186283,186285,186287,186289,186291],{},[7077,186278,2949],{},[4591,186280,2066],{"separator":1419},[4596,186282,63871],{},[4591,186284,4609],{},[4596,186286,5053],{},[4591,186288,4594],{"stretchy":4593},[4596,186290,4598],{},[4591,186292,4604],{"stretchy":4593},[4647,186294,88387],{"encoding":4649},[78,186296,186298,186340],{"className":186297,"ariaHidden":1419},[4654],[78,186299,186301,186304,186307,186310,186313,186316,186319,186322,186325,186328,186331,186334,186337],{"className":186300},[4658],[78,186302],{"className":186303,"style":4663},[4662],[78,186305,88311],{"className":186306},[4667,4678],[78,186308,4594],{"className":186309},[4674],[78,186311,63871],{"className":186312,"style":5143},[4667,4678],[78,186314,2066],{"className":186315},[5126],[78,186317],{"className":186318,"style":4839},[4739],[78,186320,5053],{"className":186321,"style":5170},[4667,4678],[78,186323,4594],{"className":186324},[4674],[78,186326,4598],{"className":186327},[4667,4678],[78,186329,38757],{"className":186330},[4682],[78,186332],{"className":186333,"style":4740},[4739],[78,186335,4609],{"className":186336},[4744],[78,186338],{"className":186339,"style":4740},[4739],[78,186341,186343,186346],{"className":186342},[4658],[78,186344],{"className":186345,"style":85616},[4662],[78,186347,186349,186355,186499],{"className":186348},[18342],[78,186350,186352],{"className":186351,"style":85624},[4674,85623],[78,186353,55608],{"className":186354},[56026,85628],[78,186356,186358],{"className":186357},[4667],[78,186359,186361],{"className":186360},[37085],[78,186362,186364],{"className":186363},[38098],[78,186365,186367,186491],{"className":186366},[4693,4694],[78,186368,186370,186488],{"className":186369},[4698],[78,186371,186373,186447],{"className":186372,"style":85647},[4702],[78,186374,186375,186378],{"style":85650},[78,186376],{"className":186377,"style":56145},[4710],[78,186379,186381,186384,186387,186390,186393,186396,186432,186435,186438,186441,186444],{"className":186380},[4667],[78,186382,469],{"className":186383},[4667],[78,186385,2066],{"className":186386},[5126],[78,186388],{"className":186389,"style":4839},[4739],[78,186391,63871],{"className":186392,"style":5143},[4667,4678],[78,186394],{"className":186395,"style":4740},[4739],[78,186397,186399,186426,186429],{"className":186398},[4744],[78,186400,186402],{"className":186401},[4744],[78,186403,186405],{"className":186404},[4667,79358],[78,186406,186408],{"className":186407},[79362],[78,186409,186411,186414,186423],{"className":186410},[88504],[78,186412],{"className":186413,"style":43725},[4662],[78,186415,186417],{"className":186416},[79373],[78,186418,186420],{"className":186419},[4667],[78,186421,88517],{"className":186422},[4744],[78,186424],{"className":186425},[79387],[78,186427],{"className":186428},[4739,88524],[78,186430,4609],{"className":186431},[4744],[78,186433],{"className":186434,"style":4740},[4739],[78,186436,5053],{"className":186437,"style":5170},[4667,4678],[78,186439,4594],{"className":186440},[4674],[78,186442,4598],{"className":186443},[4667,4678],[78,186445,4604],{"className":186446},[4682],[78,186448,186449,186452],{"style":85684},[78,186450],{"className":186451,"style":56145},[4710],[78,186453,186455,186458,186461,186464,186467,186470,186473,186476,186479,186482,186485],{"className":186454},[4667],[78,186456,2949],{"className":186457},[4667],[78,186459,2066],{"className":186460},[5126],[78,186462],{"className":186463,"style":4839},[4739],[78,186465,63871],{"className":186466,"style":5143},[4667,4678],[78,186468],{"className":186469,"style":4740},[4739],[78,186471,4609],{"className":186472},[4744],[78,186474],{"className":186475,"style":4740},[4739],[78,186477,5053],{"className":186478,"style":5170},[4667,4678],[78,186480,4594],{"className":186481},[4674],[78,186483,4598],{"className":186484},[4667,4678],[78,186486,4604],{"className":186487},[4682],[78,186489,4726],{"className":186490},[4725],[78,186492,186494],{"className":186493},[4698],[78,186495,186497],{"className":186496,"style":85727},[4702],[78,186498],{},[78,186500],{"className":186501},[4682,4761],[13,186503,88600],{},[78,186505,186507],{"className":186506},[4566],[78,186508,186510,186561],{"className":186509},[4570],[78,186511,186513],{"className":186512},[4574],[4576,186514,186515],{"xmlns":4578,"display":4579},[4581,186516,186517,186559],{},[4584,186518,186519,186521,186523,186525,186527,186529,186531,186533,186535,186537,186539,186541,186543,186545,186547,186549,186551,186553],{},[4596,186520,88311],{},[4591,186522,4594],{"stretchy":4593},[4596,186524,63871],{},[4591,186526,2066],{"separator":1419},[4596,186528,5053],{},[4591,186530,4594],{"stretchy":4593},[4596,186532,4598],{},[4591,186534,4604],{"stretchy":4593},[4591,186536,4604],{"stretchy":4593},[4591,186538,4609],{},[4591,186540,4594],{"stretchy":4593},[4596,186542,63871],{},[4591,186544,17848],{},[4596,186546,5053],{},[4591,186548,4594],{"stretchy":4593},[4596,186550,4598],{},[4591,186552,4604],{"stretchy":4593},[4614,186554,186555,186557],{},[4591,186556,4604],{"stretchy":4593},[7077,186558,472],{},[4647,186560,88658],{"encoding":4649},[78,186562,186564,186606,186627],{"className":186563,"ariaHidden":1419},[4654],[78,186565,186567,186570,186573,186576,186579,186582,186585,186588,186591,186594,186597,186600,186603],{"className":186566},[4658],[78,186568],{"className":186569,"style":4663},[4662],[78,186571,88311],{"className":186572},[4667,4678],[78,186574,4594],{"className":186575},[4674],[78,186577,63871],{"className":186578,"style":5143},[4667,4678],[78,186580,2066],{"className":186581},[5126],[78,186583],{"className":186584,"style":4839},[4739],[78,186586,5053],{"className":186587,"style":5170},[4667,4678],[78,186589,4594],{"className":186590},[4674],[78,186592,4598],{"className":186593},[4667,4678],[78,186595,38757],{"className":186596},[4682],[78,186598],{"className":186599,"style":4740},[4739],[78,186601,4609],{"className":186602},[4744],[78,186604],{"className":186605,"style":4740},[4739],[78,186607,186609,186612,186615,186618,186621,186624],{"className":186608},[4658],[78,186610],{"className":186611,"style":4663},[4662],[78,186613,4594],{"className":186614},[4674],[78,186616,63871],{"className":186617,"style":5143},[4667,4678],[78,186619],{"className":186620,"style":5143},[4739],[78,186622,17848],{"className":186623},[7450],[78,186625],{"className":186626,"style":5143},[4739],[78,186628,186630,186633,186636,186639,186642,186645],{"className":186629},[4658],[78,186631],{"className":186632,"style":53782},[4662],[78,186634,5053],{"className":186635,"style":5170},[4667,4678],[78,186637,4594],{"className":186638},[4674],[78,186640,4598],{"className":186641},[4667,4678],[78,186643,4604],{"className":186644},[4682],[78,186646,186648,186651],{"className":186647},[4682],[78,186649,4604],{"className":186650},[4682],[78,186652,186654],{"className":186653},[4689],[78,186655,186657],{"className":186656},[4693],[78,186658,186660],{"className":186659},[4698],[78,186661,186663],{"className":186662,"style":53807},[4702],[78,186664,186665,186668],{"style":5209},[78,186666],{"className":186667,"style":4711},[4710],[78,186669,186671],{"className":186670},[4715,4716,4717,4718],[78,186672,472],{"className":186673},[4667,4718],[13,186675,88774],{},[78,186677,186679],{"className":186678},[4566],[78,186680,186682,186733],{"className":186681},[4570],[78,186683,186685],{"className":186684},[4574],[4576,186686,186687],{"xmlns":4578,"display":4579},[4581,186688,186689,186731],{},[4584,186690,186691,186693,186695,186697,186699,186701,186703,186705,186707,186709,186711,186713,186715,186717,186719,186721,186723,186725,186727,186729],{},[4596,186692,88311],{},[4591,186694,4594],{"stretchy":4593},[4596,186696,63871],{},[4591,186698,2066],{"separator":1419},[4596,186700,5053],{},[4591,186702,4594],{"stretchy":4593},[4596,186704,4598],{},[4591,186706,4604],{"stretchy":4593},[4591,186708,4604],{"stretchy":4593},[4591,186710,4609],{},[4596,186712,63346],{"mathvariant":7101},[4596,186714,63346],{"mathvariant":7101},[4596,186716,63871],{},[4591,186718,17848],{},[4596,186720,5053],{},[4591,186722,4594],{"stretchy":4593},[4596,186724,4598],{},[4591,186726,4604],{"stretchy":4593},[4596,186728,63346],{"mathvariant":7101},[4596,186730,63346],{"mathvariant":7101},[4647,186732,88832],{"encoding":4649},[78,186734,186736,186778,186799],{"className":186735,"ariaHidden":1419},[4654],[78,186737,186739,186742,186745,186748,186751,186754,186757,186760,186763,186766,186769,186772,186775],{"className":186738},[4658],[78,186740],{"className":186741,"style":4663},[4662],[78,186743,88311],{"className":186744},[4667,4678],[78,186746,4594],{"className":186747},[4674],[78,186749,63871],{"className":186750,"style":5143},[4667,4678],[78,186752,2066],{"className":186753},[5126],[78,186755],{"className":186756,"style":4839},[4739],[78,186758,5053],{"className":186759,"style":5170},[4667,4678],[78,186761,4594],{"className":186762},[4674],[78,186764,4598],{"className":186765},[4667,4678],[78,186767,38757],{"className":186768},[4682],[78,186770],{"className":186771,"style":4740},[4739],[78,186773,4609],{"className":186774},[4744],[78,186776],{"className":186777,"style":4740},[4739],[78,186779,186781,186784,186787,186790,186793,186796],{"className":186780},[4658],[78,186782],{"className":186783,"style":4663},[4662],[78,186785,88887],{"className":186786},[4667],[78,186788,63871],{"className":186789,"style":5143},[4667,4678],[78,186791],{"className":186792,"style":5143},[4739],[78,186794,17848],{"className":186795},[7450],[78,186797],{"className":186798,"style":5143},[4739],[78,186800,186802,186805,186808,186811,186814,186817],{"className":186801},[4658],[78,186803],{"className":186804,"style":4663},[4662],[78,186806,5053],{"className":186807,"style":5170},[4667,4678],[78,186809,4594],{"className":186810},[4674],[78,186812,4598],{"className":186813},[4667,4678],[78,186815,4604],{"className":186816},[4682],[78,186818,88887],{"className":186819},[4667],[13,186821,88923],{},[78,186823,186825],{"className":186824},[4566],[78,186826,186828,186881],{"className":186827},[4570],[78,186829,186831],{"className":186830},[4574],[4576,186832,186833],{"xmlns":4578,"display":4579},[4581,186834,186835,186879],{},[4584,186836,186837,186839,186841,186843,186845,186847,186849,186851,186853,186855,186857,186859,186861,186863,186865,186867,186869,186871,186873,186875,186877],{},[4596,186838,88311],{},[4591,186840,4594],{"stretchy":4593},[4596,186842,63871],{},[4591,186844,2066],{"separator":1419},[4596,186846,7062],{},[4591,186848,4594],{"stretchy":4593},[4596,186850,63871],{},[4596,186852,63346],{"mathvariant":7101},[4596,186854,55556],{},[4591,186856,4604],{"stretchy":4593},[4591,186858,4604],{"stretchy":4593},[4591,186860,4609],{},[4591,186862,17848],{},[4596,186864,88967],{},[4591,186866,17553],{},[4596,186868,7062],{},[4591,186870,4594],{"stretchy":4593},[4596,186872,63871],{},[4596,186874,63346],{"mathvariant":7101},[4596,186876,55556],{},[4591,186878,4604],{"stretchy":4593},[4647,186880,88984],{"encoding":4649},[78,186882,186884,186932],{"className":186883,"ariaHidden":1419},[4654],[78,186885,186887,186890,186893,186896,186899,186902,186905,186908,186911,186914,186917,186920,186923,186926,186929],{"className":186886},[4658],[78,186888],{"className":186889,"style":4663},[4662],[78,186891,88311],{"className":186892},[4667,4678],[78,186894,4594],{"className":186895},[4674],[78,186897,63871],{"className":186898,"style":5143},[4667,4678],[78,186900,2066],{"className":186901},[5126],[78,186903],{"className":186904,"style":4839},[4739],[78,186906,7062],{"className":186907,"style":5219},[4667,4678],[78,186909,4594],{"className":186910},[4674],[78,186912,63871],{"className":186913,"style":5143},[4667,4678],[78,186915,63346],{"className":186916},[4667],[78,186918,55556],{"className":186919,"style":55911},[4667,4678],[78,186921,38757],{"className":186922},[4682],[78,186924],{"className":186925,"style":4740},[4739],[78,186927,4609],{"className":186928},[4744],[78,186930],{"className":186931,"style":4740},[4739],[78,186933,186935,186938,186941,186944,186949,186952,186955,186958,186961,186964,186967],{"className":186934},[4658],[78,186936],{"className":186937,"style":4663},[4662],[78,186939,17848],{"className":186940},[4667],[78,186942],{"className":186943,"style":4839},[4739],[78,186945,7132,186947],{"className":186946},[4788],[78,186948,43673],{"style":53053},[78,186950],{"className":186951,"style":4839},[4739],[78,186953,7062],{"className":186954,"style":5219},[4667,4678],[78,186956,4594],{"className":186957},[4674],[78,186959,63871],{"className":186960,"style":5143},[4667,4678],[78,186962,63346],{"className":186963},[4667],[78,186965,55556],{"className":186966,"style":55911},[4667,4678],[78,186968,4604],{"className":186969},[4682],[10548,186971,89077],{"id":89076},[13,186973,89080],{},[13,186975,89083],{},[10548,186977,89087],{"id":89086},[13,186979,186980],{},[22,186981,89092],{},[10548,186983,89096],{"id":89095},[13,186985,89099],{},[78,186987,186989],{"className":186988},[4566],[78,186990,186992,187081],{"className":186991},[4570],[78,186993,186995],{"className":186994},[4574],[4576,186996,186997],{"xmlns":4578,"display":4579},[4581,186998,186999,187079],{},[4584,187000,187001,187007,187009,187015,187017,187023,187025,187027,187029,187031,187037,187039,187041,187047,187049,187055,187061,187063,187065,187067,187073],{},[4600,187002,187003,187005],{},[4596,187004,26052],{},[4596,187006,17463],{},[4591,187008,4594],{"stretchy":4593},[4600,187010,187011,187013],{},[4596,187012,4598],{},[7077,187014,469],{},[4591,187016,2066],{"separator":1419},[4600,187018,187019,187021],{},[4596,187020,4598],{},[7077,187022,472],{},[4591,187024,2066],{"separator":1419},[4591,187026,18198],{},[4587,187028,18201],{},[4591,187030,2066],{"separator":1419},[4600,187032,187033,187035],{},[4596,187034,4598],{},[4596,187036,19],{},[4591,187038,4604],{"stretchy":4593},[4591,187040,4609],{},[4600,187042,187043,187045],{},[4596,187044,17463],{},[7077,187046,2949],{},[4591,187048,7351],{},[4600,187050,187051,187053],{},[4596,187052,17463],{},[7077,187054,469],{},[4600,187056,187057,187059],{},[4596,187058,4598],{},[7077,187060,469],{},[4591,187062,7351],{},[4591,187064,18198],{},[4591,187066,7351],{},[4600,187068,187069,187071],{},[4596,187070,17463],{},[4596,187072,4598],{},[4600,187074,187075,187077],{},[4596,187076,4598],{},[4596,187078,19],{},[4647,187080,89195],{"encoding":4649},[78,187082,187084,187292,187347,187442,187460],{"className":187083,"ariaHidden":1419},[4654],[78,187085,187087,187090,187130,187133,187173,187176,187179,187219,187222,187225,187228,187231,187234,187237,187240,187280,187283,187286,187289],{"className":187086},[4658],[78,187088],{"className":187089,"style":4663},[4662],[78,187091,187093,187096],{"className":187092},[4667],[78,187094,26052],{"className":187095},[4667,4678],[78,187097,187099],{"className":187098},[4689],[78,187100,187102,187122],{"className":187101},[4693,4694],[78,187103,187105,187119],{"className":187104},[4698],[78,187106,187108],{"className":187107,"style":5566},[4702],[78,187109,187110,187113],{"style":4706},[78,187111],{"className":187112,"style":4711},[4710],[78,187114,187116],{"className":187115},[4715,4716,4717,4718],[78,187117,17463],{"className":187118,"style":17251},[4667,4678,4718],[78,187120,4726],{"className":187121},[4725],[78,187123,187125],{"className":187124},[4698],[78,187126,187128],{"className":187127,"style":4733},[4702],[78,187129],{},[78,187131,4594],{"className":187132},[4674],[78,187134,187136,187139],{"className":187135},[4667],[78,187137,4598],{"className":187138},[4667,4678],[78,187140,187142],{"className":187141},[4689],[78,187143,187145,187165],{"className":187144},[4693,4694],[78,187146,187148,187162],{"className":187147},[4698],[78,187149,187151],{"className":187150,"style":18264},[4702],[78,187152,187153,187156],{"style":4706},[78,187154],{"className":187155,"style":4711},[4710],[78,187157,187159],{"className":187158},[4715,4716,4717,4718],[78,187160,469],{"className":187161},[4667,4718],[78,187163,4726],{"className":187164},[4725],[78,187166,187168],{"className":187167},[4698],[78,187169,187171],{"className":187170,"style":4733},[4702],[78,187172],{},[78,187174,2066],{"className":187175},[5126],[78,187177],{"className":187178,"style":4839},[4739],[78,187180,187182,187185],{"className":187181},[4667],[78,187183,4598],{"className":187184},[4667,4678],[78,187186,187188],{"className":187187},[4689],[78,187189,187191,187211],{"className":187190},[4693,4694],[78,187192,187194,187208],{"className":187193},[4698],[78,187195,187197],{"className":187196,"style":18264},[4702],[78,187198,187199,187202],{"style":4706},[78,187200],{"className":187201,"style":4711},[4710],[78,187203,187205],{"className":187204},[4715,4716,4717,4718],[78,187206,472],{"className":187207},[4667,4718],[78,187209,4726],{"className":187210},[4725],[78,187212,187214],{"className":187213},[4698],[78,187215,187217],{"className":187216,"style":4733},[4702],[78,187218],{},[78,187220,2066],{"className":187221},[5126],[78,187223],{"className":187224,"style":4839},[4739],[78,187226,18198],{"className":187227},[18342],[78,187229],{"className":187230,"style":4839},[4739],[78,187232],{"className":187233,"style":4839},[4739],[78,187235,2066],{"className":187236},[5126],[78,187238],{"className":187239,"style":4839},[4739],[78,187241,187243,187246],{"className":187242},[4667],[78,187244,4598],{"className":187245},[4667,4678],[78,187247,187249],{"className":187248},[4689],[78,187250,187252,187272],{"className":187251},[4693,4694],[78,187253,187255,187269],{"className":187254},[4698],[78,187256,187258],{"className":187257,"style":5279},[4702],[78,187259,187260,187263],{"style":4706},[78,187261],{"className":187262,"style":4711},[4710],[78,187264,187266],{"className":187265},[4715,4716,4717,4718],[78,187267,19],{"className":187268},[4667,4678,4718],[78,187270,4726],{"className":187271},[4725],[78,187273,187275],{"className":187274},[4698],[78,187276,187278],{"className":187277,"style":4733},[4702],[78,187279],{},[78,187281,4604],{"className":187282},[4682],[78,187284],{"className":187285,"style":4740},[4739],[78,187287,4609],{"className":187288},[4744],[78,187290],{"className":187291,"style":4740},[4739],[78,187293,187295,187298,187338,187341,187344],{"className":187294},[4658],[78,187296],{"className":187297,"style":5260},[4662],[78,187299,187301,187304],{"className":187300},[4667],[78,187302,17463],{"className":187303,"style":17251},[4667,4678],[78,187305,187307],{"className":187306},[4689],[78,187308,187310,187330],{"className":187309},[4693,4694],[78,187311,187313,187327],{"className":187312},[4698],[78,187314,187316],{"className":187315,"style":18264},[4702],[78,187317,187318,187321],{"style":84052},[78,187319],{"className":187320,"style":4711},[4710],[78,187322,187324],{"className":187323},[4715,4716,4717,4718],[78,187325,2949],{"className":187326},[4667,4718],[78,187328,4726],{"className":187329},[4725],[78,187331,187333],{"className":187332},[4698],[78,187334,187336],{"className":187335,"style":4733},[4702],[78,187337],{},[78,187339],{"className":187340,"style":5143},[4739],[78,187342,7351],{"className":187343},[7450],[78,187345],{"className":187346,"style":5143},[4739],[78,187348,187350,187353,187393,187433,187436,187439],{"className":187349},[4658],[78,187351],{"className":187352,"style":5260},[4662],[78,187354,187356,187359],{"className":187355},[4667],[78,187357,17463],{"className":187358,"style":17251},[4667,4678],[78,187360,187362],{"className":187361},[4689],[78,187363,187365,187385],{"className":187364},[4693,4694],[78,187366,187368,187382],{"className":187367},[4698],[78,187369,187371],{"className":187370,"style":18264},[4702],[78,187372,187373,187376],{"style":84052},[78,187374],{"className":187375,"style":4711},[4710],[78,187377,187379],{"className":187378},[4715,4716,4717,4718],[78,187380,469],{"className":187381},[4667,4718],[78,187383,4726],{"className":187384},[4725],[78,187386,187388],{"className":187387},[4698],[78,187389,187391],{"className":187390,"style":4733},[4702],[78,187392],{},[78,187394,187396,187399],{"className":187395},[4667],[78,187397,4598],{"className":187398},[4667,4678],[78,187400,187402],{"className":187401},[4689],[78,187403,187405,187425],{"className":187404},[4693,4694],[78,187406,187408,187422],{"className":187407},[4698],[78,187409,187411],{"className":187410,"style":18264},[4702],[78,187412,187413,187416],{"style":4706},[78,187414],{"className":187415,"style":4711},[4710],[78,187417,187419],{"className":187418},[4715,4716,4717,4718],[78,187420,469],{"className":187421},[4667,4718],[78,187423,4726],{"className":187424},[4725],[78,187426,187428],{"className":187427},[4698],[78,187429,187431],{"className":187430,"style":4733},[4702],[78,187432],{},[78,187434],{"className":187435,"style":5143},[4739],[78,187437,7351],{"className":187438},[7450],[78,187440],{"className":187441,"style":5143},[4739],[78,187443,187445,187448,187451,187454,187457],{"className":187444},[4658],[78,187446],{"className":187447,"style":18992},[4662],[78,187449,18198],{"className":187450},[18342],[78,187452],{"className":187453,"style":5143},[4739],[78,187455,7351],{"className":187456},[7450],[78,187458],{"className":187459,"style":5143},[4739],[78,187461,187463,187466,187506],{"className":187462},[4658],[78,187464],{"className":187465,"style":5260},[4662],[78,187467,187469,187472],{"className":187468},[4667],[78,187470,17463],{"className":187471,"style":17251},[4667,4678],[78,187473,187475],{"className":187474},[4689],[78,187476,187478,187498],{"className":187477},[4693,4694],[78,187479,187481,187495],{"className":187480},[4698],[78,187482,187484],{"className":187483,"style":5279},[4702],[78,187485,187486,187489],{"style":84052},[78,187487],{"className":187488,"style":4711},[4710],[78,187490,187492],{"className":187491},[4715,4716,4717,4718],[78,187493,4598],{"className":187494},[4667,4678,4718],[78,187496,4726],{"className":187497},[4725],[78,187499,187501],{"className":187500},[4698],[78,187502,187504],{"className":187503,"style":4733},[4702],[78,187505],{},[78,187507,187509,187512],{"className":187508},[4667],[78,187510,4598],{"className":187511},[4667,4678],[78,187513,187515],{"className":187514},[4689],[78,187516,187518,187538],{"className":187517},[4693,4694],[78,187519,187521,187535],{"className":187520},[4698],[78,187522,187524],{"className":187523,"style":5279},[4702],[78,187525,187526,187529],{"style":4706},[78,187527],{"className":187528,"style":4711},[4710],[78,187530,187532],{"className":187531},[4715,4716,4717,4718],[78,187533,19],{"className":187534},[4667,4678,4718],[78,187536,4726],{"className":187537},[4725],[78,187539,187541],{"className":187540},[4698],[78,187542,187544],{"className":187543,"style":4733},[4702],[78,187545],{},[13,187547,89663],{},[78,187549,187551],{"className":187550},[4566],[78,187552,187554,187631],{"className":187553},[4570],[78,187555,187557],{"className":187556},[4574],[4576,187558,187559],{"xmlns":4578,"display":4579},[4581,187560,187561,187629],{},[4584,187562,187563,187569,187571,187577,187579,187585,187587,187589,187591,187593,187599,187601,187603,187617,187623],{},[4600,187564,187565,187567],{},[4596,187566,26052],{},[4596,187568,17463],{},[4591,187570,4594],{"stretchy":4593},[4600,187572,187573,187575],{},[4596,187574,4598],{},[7077,187576,469],{},[4591,187578,2066],{"separator":1419},[4600,187580,187581,187583],{},[4596,187582,4598],{},[7077,187584,472],{},[4591,187586,2066],{"separator":1419},[4591,187588,18198],{},[4587,187590,18201],{},[4591,187592,2066],{"separator":1419},[4600,187594,187595,187597],{},[4596,187596,4598],{},[4596,187598,19],{},[4591,187600,4604],{"stretchy":4593},[4591,187602,4609],{},[89720,187604,187605,187607,187615],{},[4591,187606,4632],{},[4584,187608,187609,187611,187613],{},[4596,187610,39],{},[4591,187612,4609],{},[7077,187614,2949],{},[4596,187616,19],{},[4600,187618,187619,187621],{},[4596,187620,17463],{},[4596,187622,39],{},[4600,187624,187625,187627],{},[4596,187626,4598],{},[4596,187628,39],{},[4647,187630,89748],{"encoding":4649},[78,187632,187634,187842],{"className":187633,"ariaHidden":1419},[4654],[78,187635,187637,187640,187680,187683,187723,187726,187729,187769,187772,187775,187778,187781,187784,187787,187790,187830,187833,187836,187839],{"className":187636},[4658],[78,187638],{"className":187639,"style":4663},[4662],[78,187641,187643,187646],{"className":187642},[4667],[78,187644,26052],{"className":187645},[4667,4678],[78,187647,187649],{"className":187648},[4689],[78,187650,187652,187672],{"className":187651},[4693,4694],[78,187653,187655,187669],{"className":187654},[4698],[78,187656,187658],{"className":187657,"style":5566},[4702],[78,187659,187660,187663],{"style":4706},[78,187661],{"className":187662,"style":4711},[4710],[78,187664,187666],{"className":187665},[4715,4716,4717,4718],[78,187667,17463],{"className":187668,"style":17251},[4667,4678,4718],[78,187670,4726],{"className":187671},[4725],[78,187673,187675],{"className":187674},[4698],[78,187676,187678],{"className":187677,"style":4733},[4702],[78,187679],{},[78,187681,4594],{"className":187682},[4674],[78,187684,187686,187689],{"className":187685},[4667],[78,187687,4598],{"className":187688},[4667,4678],[78,187690,187692],{"className":187691},[4689],[78,187693,187695,187715],{"className":187694},[4693,4694],[78,187696,187698,187712],{"className":187697},[4698],[78,187699,187701],{"className":187700,"style":18264},[4702],[78,187702,187703,187706],{"style":4706},[78,187704],{"className":187705,"style":4711},[4710],[78,187707,187709],{"className":187708},[4715,4716,4717,4718],[78,187710,469],{"className":187711},[4667,4718],[78,187713,4726],{"className":187714},[4725],[78,187716,187718],{"className":187717},[4698],[78,187719,187721],{"className":187720,"style":4733},[4702],[78,187722],{},[78,187724,2066],{"className":187725},[5126],[78,187727],{"className":187728,"style":4839},[4739],[78,187730,187732,187735],{"className":187731},[4667],[78,187733,4598],{"className":187734},[4667,4678],[78,187736,187738],{"className":187737},[4689],[78,187739,187741,187761],{"className":187740},[4693,4694],[78,187742,187744,187758],{"className":187743},[4698],[78,187745,187747],{"className":187746,"style":18264},[4702],[78,187748,187749,187752],{"style":4706},[78,187750],{"className":187751,"style":4711},[4710],[78,187753,187755],{"className":187754},[4715,4716,4717,4718],[78,187756,472],{"className":187757},[4667,4718],[78,187759,4726],{"className":187760},[4725],[78,187762,187764],{"className":187763},[4698],[78,187765,187767],{"className":187766,"style":4733},[4702],[78,187768],{},[78,187770,2066],{"className":187771},[5126],[78,187773],{"className":187774,"style":4839},[4739],[78,187776,18198],{"className":187777},[18342],[78,187779],{"className":187780,"style":4839},[4739],[78,187782],{"className":187783,"style":4839},[4739],[78,187785,2066],{"className":187786},[5126],[78,187788],{"className":187789,"style":4839},[4739],[78,187791,187793,187796],{"className":187792},[4667],[78,187794,4598],{"className":187795},[4667,4678],[78,187797,187799],{"className":187798},[4689],[78,187800,187802,187822],{"className":187801},[4693,4694],[78,187803,187805,187819],{"className":187804},[4698],[78,187806,187808],{"className":187807,"style":5279},[4702],[78,187809,187810,187813],{"style":4706},[78,187811],{"className":187812,"style":4711},[4710],[78,187814,187816],{"className":187815},[4715,4716,4717,4718],[78,187817,19],{"className":187818},[4667,4678,4718],[78,187820,4726],{"className":187821},[4725],[78,187823,187825],{"className":187824},[4698],[78,187826,187828],{"className":187827,"style":4733},[4702],[78,187829],{},[78,187831,4604],{"className":187832},[4682],[78,187834],{"className":187835,"style":4740},[4739],[78,187837,4609],{"className":187838},[4744],[78,187840],{"className":187841,"style":4740},[4739],[78,187843,187845,187848,187912,187915,187955],{"className":187844},[4658],[78,187846],{"className":187847,"style":89966},[4662],[78,187849,187851],{"className":187850},[4788,52401],[78,187852,187854,187904],{"className":187853},[4693,4694],[78,187855,187857,187901],{"className":187856},[4698],[78,187858,187860,187880,187890],{"className":187859,"style":89979},[4702],[78,187861,187862,187865],{"style":89982},[78,187863],{"className":187864,"style":89986},[4710],[78,187866,187868],{"className":187867},[4715,4716,4717,4718],[78,187869,187871,187874,187877],{"className":187870},[4667,4718],[78,187872,39],{"className":187873},[4667,4678,4718],[78,187875,4609],{"className":187876},[4744,4718],[78,187878,2949],{"className":187879},[4667,4718],[78,187881,187882,187885],{"style":90004},[78,187883],{"className":187884,"style":89986},[4710],[78,187886,187887],{},[78,187888,4632],{"className":187889},[4788,4792,90013],[78,187891,187892,187895],{"style":90016},[78,187893],{"className":187894,"style":89986},[4710],[78,187896,187898],{"className":187897},[4715,4716,4717,4718],[78,187899,19],{"className":187900},[4667,4678,4718],[78,187902,4726],{"className":187903},[4725],[78,187905,187907],{"className":187906},[4698],[78,187908,187910],{"className":187909,"style":90035},[4702],[78,187911],{},[78,187913],{"className":187914,"style":4839},[4739],[78,187916,187918,187921],{"className":187917},[4667],[78,187919,17463],{"className":187920,"style":17251},[4667,4678],[78,187922,187924],{"className":187923},[4689],[78,187925,187927,187947],{"className":187926},[4693,4694],[78,187928,187930,187944],{"className":187929},[4698],[78,187931,187933],{"className":187932,"style":4703},[4702],[78,187934,187935,187938],{"style":84052},[78,187936],{"className":187937,"style":4711},[4710],[78,187939,187941],{"className":187940},[4715,4716,4717,4718],[78,187942,39],{"className":187943},[4667,4678,4718],[78,187945,4726],{"className":187946},[4725],[78,187948,187950],{"className":187949},[4698],[78,187951,187953],{"className":187952,"style":4733},[4702],[78,187954],{},[78,187956,187958,187961],{"className":187957},[4667],[78,187959,4598],{"className":187960},[4667,4678],[78,187962,187964],{"className":187963},[4689],[78,187965,187967,187987],{"className":187966},[4693,4694],[78,187968,187970,187984],{"className":187969},[4698],[78,187971,187973],{"className":187972,"style":4703},[4702],[78,187974,187975,187978],{"style":4706},[78,187976],{"className":187977,"style":4711},[4710],[78,187979,187981],{"className":187980},[4715,4716,4717,4718],[78,187982,39],{"className":187983},[4667,4678,4718],[78,187985,4726],{"className":187986},[4725],[78,187988,187990],{"className":187989},[4698],[78,187991,187993],{"className":187992,"style":4733},[4702],[78,187994],{},[13,187996,90123],{},[78,187998,188000],{"className":187999},[4566],[78,188001,188003,188134],{"className":188002},[4570],[78,188004,188006],{"className":188005},[4574],[4576,188007,188008],{"xmlns":4578,"display":4579},[4581,188009,188010,188132],{},[4584,188011,188012,188014,188016,188022,188024,188030,188032,188034,188036,188038,188044,188046,188048,188058,188072,188074,188080,188082,188090,188092,188100,188102,188104,188106,188108,188116,188118,188120,188126],{},[4596,188013,90141],{},[4591,188015,4594],{"stretchy":4593},[4600,188017,188018,188020],{},[4596,188019,4598],{},[7077,188021,469],{},[4591,188023,2066],{"separator":1419},[4600,188025,188026,188028],{},[4596,188027,4598],{},[7077,188029,472],{},[4591,188031,2066],{"separator":1419},[4591,188033,18198],{},[4587,188035,18201],{},[4591,188037,2066],{"separator":1419},[4600,188039,188040,188042],{},[4596,188041,4598],{},[4596,188043,19],{},[4591,188045,4604],{"stretchy":4593},[4591,188047,4609],{},[4611,188049,188050,188052],{},[7077,188051,469],{},[4584,188053,188054,188056],{},[7077,188055,472],{},[4596,188057,5058],{},[89720,188059,188060,188062,188070],{},[4591,188061,4632],{},[4584,188063,188064,188066,188068],{},[4596,188065,4635],{},[4591,188067,4609],{},[7077,188069,2949],{},[4596,188071,5058],{},[4591,188073,4594],{"stretchy":4593},[4600,188075,188076,188078],{},[4596,188077,26052],{},[4596,188079,17463],{},[4591,188081,4594],{"stretchy":4593},[26080,188083,188084,188086,188088],{},[4596,188085,4598],{},[7077,188087,2949],{},[4596,188089,4635],{},[4591,188091,2066],{"separator":1419},[26080,188093,188094,188096,188098],{},[4596,188095,4598],{},[7077,188097,469],{},[4596,188099,4635],{},[4591,188101,2066],{"separator":1419},[4591,188103,18198],{},[4587,188105,18201],{},[4591,188107,2066],{"separator":1419},[26080,188109,188110,188112,188114],{},[4596,188111,4598],{},[4596,188113,19],{},[4596,188115,4635],{},[4591,188117,4604],{"stretchy":4593},[4591,188119,17848],{},[4600,188121,188122,188124],{},[4596,188123,16867],{},[4596,188125,4635],{},[4614,188127,188128,188130],{},[4591,188129,4604],{"stretchy":4593},[7077,188131,472],{},[4647,188133,90262],{"encoding":4649},[78,188135,188137,188308,188684],{"className":188136,"ariaHidden":1419},[4654],[78,188138,188140,188143,188146,188149,188189,188192,188195,188235,188238,188241,188244,188247,188250,188253,188256,188296,188299,188302,188305],{"className":188139},[4658],[78,188141],{"className":188142,"style":4663},[4662],[78,188144,90141],{"className":188145,"style":90275},[4667,4678],[78,188147,4594],{"className":188148},[4674],[78,188150,188152,188155],{"className":188151},[4667],[78,188153,4598],{"className":188154},[4667,4678],[78,188156,188158],{"className":188157},[4689],[78,188159,188161,188181],{"className":188160},[4693,4694],[78,188162,188164,188178],{"className":188163},[4698],[78,188165,188167],{"className":188166,"style":18264},[4702],[78,188168,188169,188172],{"style":4706},[78,188170],{"className":188171,"style":4711},[4710],[78,188173,188175],{"className":188174},[4715,4716,4717,4718],[78,188176,469],{"className":188177},[4667,4718],[78,188179,4726],{"className":188180},[4725],[78,188182,188184],{"className":188183},[4698],[78,188185,188187],{"className":188186,"style":4733},[4702],[78,188188],{},[78,188190,2066],{"className":188191},[5126],[78,188193],{"className":188194,"style":4839},[4739],[78,188196,188198,188201],{"className":188197},[4667],[78,188199,4598],{"className":188200},[4667,4678],[78,188202,188204],{"className":188203},[4689],[78,188205,188207,188227],{"className":188206},[4693,4694],[78,188208,188210,188224],{"className":188209},[4698],[78,188211,188213],{"className":188212,"style":18264},[4702],[78,188214,188215,188218],{"style":4706},[78,188216],{"className":188217,"style":4711},[4710],[78,188219,188221],{"className":188220},[4715,4716,4717,4718],[78,188222,472],{"className":188223},[4667,4718],[78,188225,4726],{"className":188226},[4725],[78,188228,188230],{"className":188229},[4698],[78,188231,188233],{"className":188232,"style":4733},[4702],[78,188234],{},[78,188236,2066],{"className":188237},[5126],[78,188239],{"className":188240,"style":4839},[4739],[78,188242,18198],{"className":188243},[18342],[78,188245],{"className":188246,"style":4839},[4739],[78,188248],{"className":188249,"style":4839},[4739],[78,188251,2066],{"className":188252},[5126],[78,188254],{"className":188255,"style":4839},[4739],[78,188257,188259,188262],{"className":188258},[4667],[78,188260,4598],{"className":188261},[4667,4678],[78,188263,188265],{"className":188264},[4689],[78,188266,188268,188288],{"className":188267},[4693,4694],[78,188269,188271,188285],{"className":188270},[4698],[78,188272,188274],{"className":188273,"style":5279},[4702],[78,188275,188276,188279],{"style":4706},[78,188277],{"className":188278,"style":4711},[4710],[78,188280,188282],{"className":188281},[4715,4716,4717,4718],[78,188283,19],{"className":188284},[4667,4678,4718],[78,188286,4726],{"className":188287},[4725],[78,188289,188291],{"className":188290},[4698],[78,188292,188294],{"className":188293,"style":4733},[4702],[78,188295],{},[78,188297,4604],{"className":188298},[4682],[78,188300],{"className":188301,"style":4740},[4739],[78,188303,4609],{"className":188304},[4744],[78,188306],{"className":188307,"style":4740},[4739],[78,188309,188311,188314,188379,188382,188446,188449,188489,188492,188543,188546,188549,188600,188603,188606,188609,188612,188615,188618,188621,188672,188675,188678,188681],{"className":188310},[4658],[78,188312],{"className":188313,"style":90444},[4662],[78,188315,188317,188320,188376],{"className":188316},[4667],[78,188318],{"className":188319},[4674,4761],[78,188321,188323],{"className":188322},[4611],[78,188324,188326,188368],{"className":188325},[4693,4694],[78,188327,188329,188365],{"className":188328},[4698],[78,188330,188332,188346,188354],{"className":188331,"style":86003},[4702],[78,188333,188334,188337],{"style":4777},[78,188335],{"className":188336,"style":4781},[4710],[78,188338,188340,188343],{"className":188339},[4667],[78,188341,472],{"className":188342},[4667],[78,188344,5058],{"className":188345},[4667,4678],[78,188347,188348,188351],{"style":4919},[78,188349],{"className":188350,"style":4781},[4710],[78,188352],{"className":188353,"style":4927},[4926],[78,188355,188356,188359],{"style":4930},[78,188357],{"className":188358,"style":4781},[4710],[78,188360,188362],{"className":188361},[4667],[78,188363,469],{"className":188364},[4667],[78,188366,4726],{"className":188367},[4725],[78,188369,188371],{"className":188370},[4698],[78,188372,188374],{"className":188373,"style":90505},[4702],[78,188375],{},[78,188377],{"className":188378},[4682,4761],[78,188380],{"className":188381,"style":4839},[4739],[78,188383,188385],{"className":188384},[4788,52401],[78,188386,188388,188438],{"className":188387},[4693,4694],[78,188389,188391,188435],{"className":188390},[4698],[78,188392,188394,188414,188424],{"className":188393,"style":89979},[4702],[78,188395,188396,188399],{"style":89982},[78,188397],{"className":188398,"style":89986},[4710],[78,188400,188402],{"className":188401},[4715,4716,4717,4718],[78,188403,188405,188408,188411],{"className":188404},[4667,4718],[78,188406,4635],{"className":188407,"style":4823},[4667,4678,4718],[78,188409,4609],{"className":188410},[4744,4718],[78,188412,2949],{"className":188413},[4667,4718],[78,188415,188416,188419],{"style":90004},[78,188417],{"className":188418,"style":89986},[4710],[78,188420,188421],{},[78,188422,4632],{"className":188423},[4788,4792,90013],[78,188425,188426,188429],{"style":90016},[78,188427],{"className":188428,"style":89986},[4710],[78,188430,188432],{"className":188431},[4715,4716,4717,4718],[78,188433,5058],{"className":188434},[4667,4678,4718],[78,188436,4726],{"className":188437},[4725],[78,188439,188441],{"className":188440},[4698],[78,188442,188444],{"className":188443,"style":90576},[4702],[78,188445],{},[78,188447,4594],{"className":188448},[4674],[78,188450,188452,188455],{"className":188451},[4667],[78,188453,26052],{"className":188454},[4667,4678],[78,188456,188458],{"className":188457},[4689],[78,188459,188461,188481],{"className":188460},[4693,4694],[78,188462,188464,188478],{"className":188463},[4698],[78,188465,188467],{"className":188466,"style":5566},[4702],[78,188468,188469,188472],{"style":4706},[78,188470],{"className":188471,"style":4711},[4710],[78,188473,188475],{"className":188474},[4715,4716,4717,4718],[78,188476,17463],{"className":188477,"style":17251},[4667,4678,4718],[78,188479,4726],{"className":188480},[4725],[78,188482,188484],{"className":188483},[4698],[78,188485,188487],{"className":188486,"style":4733},[4702],[78,188488],{},[78,188490,4594],{"className":188491},[4674],[78,188493,188495,188498],{"className":188494},[4667],[78,188496,4598],{"className":188497},[4667,4678],[78,188499,188501],{"className":188500},[4689],[78,188502,188504,188535],{"className":188503},[4693,4694],[78,188505,188507,188532],{"className":188506},[4698],[78,188508,188510,188521],{"className":188509,"style":90643},[4702],[78,188511,188512,188515],{"style":90646},[78,188513],{"className":188514,"style":4711},[4710],[78,188516,188518],{"className":188517},[4715,4716,4717,4718],[78,188519,2949],{"className":188520},[4667,4718],[78,188522,188523,188526],{"style":26245},[78,188524],{"className":188525,"style":4711},[4710],[78,188527,188529],{"className":188528},[4715,4716,4717,4718],[78,188530,4635],{"className":188531,"style":4823},[4667,4678,4718],[78,188533,4726],{"className":188534},[4725],[78,188536,188538],{"className":188537},[4698],[78,188539,188541],{"className":188540,"style":90676},[4702],[78,188542],{},[78,188544,2066],{"className":188545},[5126],[78,188547],{"className":188548,"style":4839},[4739],[78,188550,188552,188555],{"className":188551},[4667],[78,188553,4598],{"className":188554},[4667,4678],[78,188556,188558],{"className":188557},[4689],[78,188559,188561,188592],{"className":188560},[4693,4694],[78,188562,188564,188589],{"className":188563},[4698],[78,188565,188567,188578],{"className":188566,"style":90643},[4702],[78,188568,188569,188572],{"style":90646},[78,188570],{"className":188571,"style":4711},[4710],[78,188573,188575],{"className":188574},[4715,4716,4717,4718],[78,188576,469],{"className":188577},[4667,4718],[78,188579,188580,188583],{"style":26245},[78,188581],{"className":188582,"style":4711},[4710],[78,188584,188586],{"className":188585},[4715,4716,4717,4718],[78,188587,4635],{"className":188588,"style":4823},[4667,4678,4718],[78,188590,4726],{"className":188591},[4725],[78,188593,188595],{"className":188594},[4698],[78,188596,188598],{"className":188597,"style":90676},[4702],[78,188599],{},[78,188601,2066],{"className":188602},[5126],[78,188604],{"className":188605,"style":4839},[4739],[78,188607,18198],{"className":188608},[18342],[78,188610],{"className":188611,"style":4839},[4739],[78,188613],{"className":188614,"style":4839},[4739],[78,188616,2066],{"className":188617},[5126],[78,188619],{"className":188620,"style":4839},[4739],[78,188622,188624,188627],{"className":188623},[4667],[78,188625,4598],{"className":188626},[4667,4678],[78,188628,188630],{"className":188629},[4689],[78,188631,188633,188664],{"className":188632},[4693,4694],[78,188634,188636,188661],{"className":188635},[4698],[78,188637,188639,188650],{"className":188638,"style":90775},[4702],[78,188640,188641,188644],{"style":90778},[78,188642],{"className":188643,"style":4711},[4710],[78,188645,188647],{"className":188646},[4715,4716,4717,4718],[78,188648,19],{"className":188649},[4667,4678,4718],[78,188651,188652,188655],{"style":5209},[78,188653],{"className":188654,"style":4711},[4710],[78,188656,188658],{"className":188657},[4715,4716,4717,4718],[78,188659,4635],{"className":188660,"style":4823},[4667,4678,4718],[78,188662,4726],{"className":188663},[4725],[78,188665,188667],{"className":188666},[4698],[78,188668,188670],{"className":188669,"style":26326},[4702],[78,188671],{},[78,188673,4604],{"className":188674},[4682],[78,188676],{"className":188677,"style":5143},[4739],[78,188679,17848],{"className":188680},[7450],[78,188682],{"className":188683,"style":5143},[4739],[78,188685,188687,188690,188730],{"className":188686},[4658],[78,188688],{"className":188689,"style":90828},[4662],[78,188691,188693,188696],{"className":188692},[4667],[78,188694,16867],{"className":188695,"style":5187},[4667,4678],[78,188697,188699],{"className":188698},[4689],[78,188700,188702,188722],{"className":188701},[4693,4694],[78,188703,188705,188719],{"className":188704},[4698],[78,188706,188708],{"className":188707,"style":4703},[4702],[78,188709,188710,188713],{"style":63415},[78,188711],{"className":188712,"style":4711},[4710],[78,188714,188716],{"className":188715},[4715,4716,4717,4718],[78,188717,4635],{"className":188718,"style":4823},[4667,4678,4718],[78,188720,4726],{"className":188721},[4725],[78,188723,188725],{"className":188724},[4698],[78,188726,188728],{"className":188727,"style":6178},[4702],[78,188729],{},[78,188731,188733,188736],{"className":188732},[4682],[78,188734,4604],{"className":188735},[4682],[78,188737,188739],{"className":188738},[4689],[78,188740,188742],{"className":188741},[4693],[78,188743,188745],{"className":188744},[4698],[78,188746,188748],{"className":188747,"style":53807},[4702],[78,188749,188750,188753],{"style":5209},[78,188751],{"className":188752,"style":4711},[4710],[78,188754,188756],{"className":188755},[4715,4716,4717,4718],[78,188757,472],{"className":188758},[4667,4718],[13,188760,90900],{},[13,188762,90903],{},[13,188764,90906],{},[78,188766,188768],{"className":188767},[4566],[78,188769,188771,188836],{"className":188770},[4570],[78,188772,188774],{"className":188773},[4574],[4576,188775,188776],{"xmlns":4578,"display":4579},[4581,188777,188778,188834],{},[4584,188779,188780,188786,188788,188790,188800,188802,188804,188810,188812,188818,188820,188822,188824,188826,188832],{},[4600,188781,188782,188784],{},[4596,188783,90926],{"mathvariant":7101},[4596,188785,39],{},[4591,188787,4609],{},[4596,188789,55518],{},[4611,188791,188792,188794],{},[4596,188793,90937],{"mathvariant":7101},[4584,188795,188796,188798],{},[4596,188797,90937],{"mathvariant":7101},[4596,188799,17463],{},[4596,188801,90141],{},[4591,188803,4594],{"stretchy":4593},[4600,188805,188806,188808],{},[4596,188807,17463],{},[7077,188809,2949],{},[4591,188811,2066],{"separator":1419},[4600,188813,188814,188816],{},[4596,188815,17463],{},[7077,188817,469],{},[4591,188819,2066],{"separator":1419},[4591,188821,18198],{},[4587,188823,18201],{},[4591,188825,2066],{"separator":1419},[4600,188827,188828,188830],{},[4596,188829,17463],{},[4596,188831,19],{},[4591,188833,4604],{"stretchy":4593},[4647,188835,90980],{"encoding":4649},[78,188837,188839,188894],{"className":188838,"ariaHidden":1419},[4654],[78,188840,188842,188845,188885,188888,188891],{"className":188841},[4658],[78,188843],{"className":188844,"style":20406},[4662],[78,188846,188848,188851],{"className":188847},[4667],[78,188849,90926],{"className":188850},[4667],[78,188852,188854],{"className":188853},[4689],[78,188855,188857,188877],{"className":188856},[4693,4694],[78,188858,188860,188874],{"className":188859},[4698],[78,188861,188863],{"className":188862,"style":4703},[4702],[78,188864,188865,188868],{"style":4706},[78,188866],{"className":188867,"style":4711},[4710],[78,188869,188871],{"className":188870},[4715,4716,4717,4718],[78,188872,39],{"className":188873},[4667,4678,4718],[78,188875,4726],{"className":188876},[4725],[78,188878,188880],{"className":188879},[4698],[78,188881,188883],{"className":188882,"style":4733},[4702],[78,188884],{},[78,188886],{"className":188887,"style":4740},[4739],[78,188889,4609],{"className":188890},[4744],[78,188892],{"className":188893,"style":4740},[4739],[78,188895,188897,188900,188903,188968,188971,188974,189014,189017,189020,189060,189063,189066,189069,189072,189075,189078,189081,189121],{"className":188896},[4658],[78,188898],{"className":188899,"style":91045},[4662],[78,188901,55518],{"className":188902,"style":55822},[4667,4678],[78,188904,188906,188909,188965],{"className":188905},[4667],[78,188907],{"className":188908},[4674,4761],[78,188910,188912],{"className":188911},[4611],[78,188913,188915,188957],{"className":188914},[4693,4694],[78,188916,188918,188954],{"className":188917},[4698],[78,188919,188921,188935,188943],{"className":188920,"style":83268},[4702],[78,188922,188923,188926],{"style":4777},[78,188924],{"className":188925,"style":4781},[4710],[78,188927,188929,188932],{"className":188928},[4667],[78,188930,90937],{"className":188931,"style":79383},[4667],[78,188933,17463],{"className":188934,"style":17251},[4667,4678],[78,188936,188937,188940],{"style":4919},[78,188938],{"className":188939,"style":4781},[4710],[78,188941],{"className":188942,"style":4927},[4926],[78,188944,188945,188948],{"style":4930},[78,188946],{"className":188947,"style":4781},[4710],[78,188949,188951],{"className":188950},[4667],[78,188952,90937],{"className":188953,"style":79383},[4667],[78,188955,4726],{"className":188956},[4725],[78,188958,188960],{"className":188959},[4698],[78,188961,188963],{"className":188962,"style":90505},[4702],[78,188964],{},[78,188966],{"className":188967},[4682,4761],[78,188969,90141],{"className":188970,"style":90275},[4667,4678],[78,188972,4594],{"className":188973},[4674],[78,188975,188977,188980],{"className":188976},[4667],[78,188978,17463],{"className":188979,"style":17251},[4667,4678],[78,188981,188983],{"className":188982},[4689],[78,188984,188986,189006],{"className":188985},[4693,4694],[78,188987,188989,189003],{"className":188988},[4698],[78,188990,188992],{"className":188991,"style":18264},[4702],[78,188993,188994,188997],{"style":84052},[78,188995],{"className":188996,"style":4711},[4710],[78,188998,189000],{"className":188999},[4715,4716,4717,4718],[78,189001,2949],{"className":189002},[4667,4718],[78,189004,4726],{"className":189005},[4725],[78,189007,189009],{"className":189008},[4698],[78,189010,189012],{"className":189011,"style":4733},[4702],[78,189013],{},[78,189015,2066],{"className":189016},[5126],[78,189018],{"className":189019,"style":4839},[4739],[78,189021,189023,189026],{"className":189022},[4667],[78,189024,17463],{"className":189025,"style":17251},[4667,4678],[78,189027,189029],{"className":189028},[4689],[78,189030,189032,189052],{"className":189031},[4693,4694],[78,189033,189035,189049],{"className":189034},[4698],[78,189036,189038],{"className":189037,"style":18264},[4702],[78,189039,189040,189043],{"style":84052},[78,189041],{"className":189042,"style":4711},[4710],[78,189044,189046],{"className":189045},[4715,4716,4717,4718],[78,189047,469],{"className":189048},[4667,4718],[78,189050,4726],{"className":189051},[4725],[78,189053,189055],{"className":189054},[4698],[78,189056,189058],{"className":189057,"style":4733},[4702],[78,189059],{},[78,189061,2066],{"className":189062},[5126],[78,189064],{"className":189065,"style":4839},[4739],[78,189067,18198],{"className":189068},[18342],[78,189070],{"className":189071,"style":4839},[4739],[78,189073],{"className":189074,"style":4839},[4739],[78,189076,2066],{"className":189077},[5126],[78,189079],{"className":189080,"style":4839},[4739],[78,189082,189084,189087],{"className":189083},[4667],[78,189085,17463],{"className":189086,"style":17251},[4667,4678],[78,189088,189090],{"className":189089},[4689],[78,189091,189093,189113],{"className":189092},[4693,4694],[78,189094,189096,189110],{"className":189095},[4698],[78,189097,189099],{"className":189098,"style":5279},[4702],[78,189100,189101,189104],{"style":84052},[78,189102],{"className":189103,"style":4711},[4710],[78,189105,189107],{"className":189106},[4715,4716,4717,4718],[78,189108,19],{"className":189109},[4667,4678,4718],[78,189111,4726],{"className":189112},[4725],[78,189114,189116],{"className":189115},[4698],[78,189117,189119],{"className":189118,"style":4733},[4702],[78,189120],{},[78,189122,4604],{"className":189123},[4682],[13,189125,91272],{},[13,189127,91275],{},[78,189129,189131],{"className":189130},[4566],[78,189132,189134,189207],{"className":189133},[4570],[78,189135,189137],{"className":189136},[4574],[4576,189138,189139],{"xmlns":4578,"display":4579},[4581,189140,189141,189205],{},[4584,189142,189143,189149,189151,189157,189159,189161,189171,189173,189175,189181,189183,189189,189191,189193,189195,189197,189203],{},[4600,189144,189145,189147],{},[4596,189146,17463],{},[4596,189148,39],{},[4591,189150,4609],{},[4600,189152,189153,189155],{},[4596,189154,17463],{},[4596,189156,39],{},[4591,189158,17848],{},[4596,189160,55518],{},[4611,189162,189163,189165],{},[4596,189164,90937],{"mathvariant":7101},[4584,189166,189167,189169],{},[4596,189168,90937],{"mathvariant":7101},[4596,189170,17463],{},[4596,189172,90141],{},[4591,189174,4594],{"stretchy":4593},[4600,189176,189177,189179],{},[4596,189178,17463],{},[7077,189180,2949],{},[4591,189182,2066],{"separator":1419},[4600,189184,189185,189187],{},[4596,189186,17463],{},[7077,189188,469],{},[4591,189190,2066],{"separator":1419},[4591,189192,18198],{},[4587,189194,18201],{},[4591,189196,2066],{"separator":1419},[4600,189198,189199,189201],{},[4596,189200,17463],{},[4596,189202,19],{},[4591,189204,4604],{"stretchy":4593},[4647,189206,91355],{"encoding":4649},[78,189208,189210,189265,189320],{"className":189209,"ariaHidden":1419},[4654],[78,189211,189213,189216,189256,189259,189262],{"className":189212},[4658],[78,189214],{"className":189215,"style":5260},[4662],[78,189217,189219,189222],{"className":189218},[4667],[78,189220,17463],{"className":189221,"style":17251},[4667,4678],[78,189223,189225],{"className":189224},[4689],[78,189226,189228,189248],{"className":189227},[4693,4694],[78,189229,189231,189245],{"className":189230},[4698],[78,189232,189234],{"className":189233,"style":4703},[4702],[78,189235,189236,189239],{"style":84052},[78,189237],{"className":189238,"style":4711},[4710],[78,189240,189242],{"className":189241},[4715,4716,4717,4718],[78,189243,39],{"className":189244},[4667,4678,4718],[78,189246,4726],{"className":189247},[4725],[78,189249,189251],{"className":189250},[4698],[78,189252,189254],{"className":189253,"style":4733},[4702],[78,189255],{},[78,189257],{"className":189258,"style":4740},[4739],[78,189260,4609],{"className":189261},[4744],[78,189263],{"className":189264,"style":4740},[4739],[78,189266,189268,189271,189311,189314,189317],{"className":189267},[4658],[78,189269],{"className":189270,"style":5260},[4662],[78,189272,189274,189277],{"className":189273},[4667],[78,189275,17463],{"className":189276,"style":17251},[4667,4678],[78,189278,189280],{"className":189279},[4689],[78,189281,189283,189303],{"className":189282},[4693,4694],[78,189284,189286,189300],{"className":189285},[4698],[78,189287,189289],{"className":189288,"style":4703},[4702],[78,189290,189291,189294],{"style":84052},[78,189292],{"className":189293,"style":4711},[4710],[78,189295,189297],{"className":189296},[4715,4716,4717,4718],[78,189298,39],{"className":189299},[4667,4678,4718],[78,189301,4726],{"className":189302},[4725],[78,189304,189306],{"className":189305},[4698],[78,189307,189309],{"className":189308,"style":4733},[4702],[78,189310],{},[78,189312],{"className":189313,"style":5143},[4739],[78,189315,17848],{"className":189316},[7450],[78,189318],{"className":189319,"style":5143},[4739],[78,189321,189323,189326,189329,189394,189397,189400,189440,189443,189446,189486,189489,189492,189495,189498,189501,189504,189507,189547],{"className":189322},[4658],[78,189324],{"className":189325,"style":91045},[4662],[78,189327,55518],{"className":189328,"style":55822},[4667,4678],[78,189330,189332,189335,189391],{"className":189331},[4667],[78,189333],{"className":189334},[4674,4761],[78,189336,189338],{"className":189337},[4611],[78,189339,189341,189383],{"className":189340},[4693,4694],[78,189342,189344,189380],{"className":189343},[4698],[78,189345,189347,189361,189369],{"className":189346,"style":83268},[4702],[78,189348,189349,189352],{"style":4777},[78,189350],{"className":189351,"style":4781},[4710],[78,189353,189355,189358],{"className":189354},[4667],[78,189356,90937],{"className":189357,"style":79383},[4667],[78,189359,17463],{"className":189360,"style":17251},[4667,4678],[78,189362,189363,189366],{"style":4919},[78,189364],{"className":189365,"style":4781},[4710],[78,189367],{"className":189368,"style":4927},[4926],[78,189370,189371,189374],{"style":4930},[78,189372],{"className":189373,"style":4781},[4710],[78,189375,189377],{"className":189376},[4667],[78,189378,90937],{"className":189379,"style":79383},[4667],[78,189381,4726],{"className":189382},[4725],[78,189384,189386],{"className":189385},[4698],[78,189387,189389],{"className":189388,"style":90505},[4702],[78,189390],{},[78,189392],{"className":189393},[4682,4761],[78,189395,90141],{"className":189396,"style":90275},[4667,4678],[78,189398,4594],{"className":189399},[4674],[78,189401,189403,189406],{"className":189402},[4667],[78,189404,17463],{"className":189405,"style":17251},[4667,4678],[78,189407,189409],{"className":189408},[4689],[78,189410,189412,189432],{"className":189411},[4693,4694],[78,189413,189415,189429],{"className":189414},[4698],[78,189416,189418],{"className":189417,"style":18264},[4702],[78,189419,189420,189423],{"style":84052},[78,189421],{"className":189422,"style":4711},[4710],[78,189424,189426],{"className":189425},[4715,4716,4717,4718],[78,189427,2949],{"className":189428},[4667,4718],[78,189430,4726],{"className":189431},[4725],[78,189433,189435],{"className":189434},[4698],[78,189436,189438],{"className":189437,"style":4733},[4702],[78,189439],{},[78,189441,2066],{"className":189442},[5126],[78,189444],{"className":189445,"style":4839},[4739],[78,189447,189449,189452],{"className":189448},[4667],[78,189450,17463],{"className":189451,"style":17251},[4667,4678],[78,189453,189455],{"className":189454},[4689],[78,189456,189458,189478],{"className":189457},[4693,4694],[78,189459,189461,189475],{"className":189460},[4698],[78,189462,189464],{"className":189463,"style":18264},[4702],[78,189465,189466,189469],{"style":84052},[78,189467],{"className":189468,"style":4711},[4710],[78,189470,189472],{"className":189471},[4715,4716,4717,4718],[78,189473,469],{"className":189474},[4667,4718],[78,189476,4726],{"className":189477},[4725],[78,189479,189481],{"className":189480},[4698],[78,189482,189484],{"className":189483,"style":4733},[4702],[78,189485],{},[78,189487,2066],{"className":189488},[5126],[78,189490],{"className":189491,"style":4839},[4739],[78,189493,18198],{"className":189494},[18342],[78,189496],{"className":189497,"style":4839},[4739],[78,189499],{"className":189500,"style":4839},[4739],[78,189502,2066],{"className":189503},[5126],[78,189505],{"className":189506,"style":4839},[4739],[78,189508,189510,189513],{"className":189509},[4667],[78,189511,17463],{"className":189512,"style":17251},[4667,4678],[78,189514,189516],{"className":189515},[4689],[78,189517,189519,189539],{"className":189518},[4693,4694],[78,189520,189522,189536],{"className":189521},[4698],[78,189523,189525],{"className":189524,"style":5279},[4702],[78,189526,189527,189530],{"style":84052},[78,189528],{"className":189529,"style":4711},[4710],[78,189531,189533],{"className":189532},[4715,4716,4717,4718],[78,189534,19],{"className":189535},[4667,4678,4718],[78,189537,4726],{"className":189538},[4725],[78,189540,189542],{"className":189541},[4698],[78,189543,189545],{"className":189544,"style":4733},[4702],[78,189546],{},[78,189548,4604],{"className":189549},[4682],[13,189551,91701,189552],{},[22,189553,91704],{},[13,189555,91707],{},[49,189557,189558,189560],{},[52,189559,91712],{},[52,189561,91715],{},[13,189563,91718],{},[49,189565,189566],{},[52,189567,91723],{},[13,189569,91726],{},[49,189571,189572],{},[52,189573,91731],{},[13,189575,91734],{},[49,189577,189578],{},[52,189579,91739],{},[13,189581,91742],{},[23289,189583],{},[7759,189585,91748],{"id":91747},[10548,189587,91752],{"id":91751},[13,189589,91755],{},[10548,189591,25480],{"id":25480},[13,189593,91760],{},[10548,189595,91763],{"id":91763},[13,189597,91766],{},[13,189599,189600],{},[22,189601,91771],{},[78,189603,189605],{"className":189604},[4566],[78,189606,189608,189675],{"className":189607},[4570],[78,189609,189611],{"className":189610},[4574],[4576,189612,189613],{"xmlns":4578,"display":4579},[4581,189614,189615,189673],{},[4584,189616,189617,189623,189625,189631,189643,189645,189651,189653,189659,189661,189663,189665,189671],{},[4614,189618,189619,189621],{},[4596,189620,25949],{},[4596,189622,7132],{},[4591,189624,4609],{},[4614,189626,189627,189629],{},[4596,189628,6107],{},[4596,189630,7132],{},[4614,189632,189633,189635],{},[4596,189634,5009],{},[4584,189636,189637,189639,189641],{},[4596,189638,7132],{},[4591,189640,17848],{},[7077,189642,469],{},[4591,189644,7351],{},[4614,189646,189647,189649],{},[4596,189648,12172],{},[4596,189650,7132],{},[4739,189652],{"linebreak":52940},[4614,189654,189655,189657],{},[4596,189656,5009],{},[4596,189658,7132],{},[4591,189660,4609],{},[4596,189662,5053],{},[4591,189664,4594],{"stretchy":4593},[4614,189666,189667,189669],{},[4596,189668,25949],{},[4596,189670,7132],{},[4591,189672,4604],{"stretchy":4593},[4647,189674,91845],{"encoding":4649},[78,189676,189678,189722,189804,189839,189842,189886],{"className":189677,"ariaHidden":1419},[4654],[78,189679,189681,189684,189713,189716,189719],{"className":189680},[4658],[78,189682],{"className":189683,"style":91855},[4662],[78,189685,189687,189690],{"className":189686},[4667],[78,189688,25949],{"className":189689,"style":43903},[4667,4678],[78,189691,189693],{"className":189692},[4689],[78,189694,189696],{"className":189695},[4693],[78,189697,189699],{"className":189698},[4698],[78,189700,189702],{"className":189701,"style":91855},[4702],[78,189703,189704,189707],{"style":5209},[78,189705],{"className":189706,"style":4711},[4710],[78,189708,189710],{"className":189709},[4715,4716,4717,4718],[78,189711,7132],{"className":189712,"style":7300},[4667,4678,4718],[78,189714],{"className":189715,"style":4740},[4739],[78,189717,4609],{"className":189718},[4744],[78,189720],{"className":189721,"style":4740},[4739],[78,189723,189725,189728,189757,189795,189798,189801],{"className":189724},[4658],[78,189726],{"className":189727,"style":91900},[4662],[78,189729,189731,189734],{"className":189730},[4667],[78,189732,6107],{"className":189733,"style":5219},[4667,4678],[78,189735,189737],{"className":189736},[4689],[78,189738,189740],{"className":189739},[4693],[78,189741,189743],{"className":189742},[4698],[78,189744,189746],{"className":189745,"style":91855},[4702],[78,189747,189748,189751],{"style":5209},[78,189749],{"className":189750,"style":4711},[4710],[78,189752,189754],{"className":189753},[4715,4716,4717,4718],[78,189755,7132],{"className":189756,"style":7300},[4667,4678,4718],[78,189758,189760,189763],{"className":189759},[4667],[78,189761,5009],{"className":189762},[4667,4678],[78,189764,189766],{"className":189765},[4689],[78,189767,189769],{"className":189768},[4693],[78,189770,189772],{"className":189771},[4698],[78,189773,189775],{"className":189774,"style":91855},[4702],[78,189776,189777,189780],{"style":5209},[78,189778],{"className":189779,"style":4711},[4710],[78,189781,189783],{"className":189782},[4715,4716,4717,4718],[78,189784,189786,189789,189792],{"className":189785},[4667,4718],[78,189787,7132],{"className":189788,"style":7300},[4667,4678,4718],[78,189790,17848],{"className":189791},[7450,4718],[78,189793,469],{"className":189794},[4667,4718],[78,189796],{"className":189797,"style":5143},[4739],[78,189799,7351],{"className":189800},[7450],[78,189802],{"className":189803,"style":5143},[4739],[78,189805,189807,189810],{"className":189806},[4658],[78,189808],{"className":189809,"style":91855},[4662],[78,189811,189813,189816],{"className":189812},[4667],[78,189814,12172],{"className":189815},[4667,4678],[78,189817,189819],{"className":189818},[4689],[78,189820,189822],{"className":189821},[4693],[78,189823,189825],{"className":189824},[4698],[78,189826,189828],{"className":189827,"style":91855},[4702],[78,189829,189830,189833],{"style":5209},[78,189831],{"className":189832,"style":4711},[4710],[78,189834,189836],{"className":189835},[4715,4716,4717,4718],[78,189837,7132],{"className":189838,"style":7300},[4667,4678,4718],[78,189840],{"className":189841},[4739,52940],[78,189843,189845,189848,189877,189880,189883],{"className":189844},[4658],[78,189846],{"className":189847,"style":91855},[4662],[78,189849,189851,189854],{"className":189850},[4667],[78,189852,5009],{"className":189853},[4667,4678],[78,189855,189857],{"className":189856},[4689],[78,189858,189860],{"className":189859},[4693],[78,189861,189863],{"className":189862},[4698],[78,189864,189866],{"className":189865,"style":91855},[4702],[78,189867,189868,189871],{"style":5209},[78,189869],{"className":189870,"style":4711},[4710],[78,189872,189874],{"className":189873},[4715,4716,4717,4718],[78,189875,7132],{"className":189876,"style":7300},[4667,4678,4718],[78,189878],{"className":189879,"style":4740},[4739],[78,189881,4609],{"className":189882},[4744],[78,189884],{"className":189885,"style":4740},[4739],[78,189887,189889,189892,189895,189898,189927],{"className":189888},[4658],[78,189890],{"className":189891,"style":92065},[4662],[78,189893,5053],{"className":189894,"style":5170},[4667,4678],[78,189896,4594],{"className":189897},[4674],[78,189899,189901,189904],{"className":189900},[4667],[78,189902,25949],{"className":189903,"style":43903},[4667,4678],[78,189905,189907],{"className":189906},[4689],[78,189908,189910],{"className":189909},[4693],[78,189911,189913],{"className":189912},[4698],[78,189914,189916],{"className":189915,"style":91855},[4702],[78,189917,189918,189921],{"style":5209},[78,189919],{"className":189920,"style":4711},[4710],[78,189922,189924],{"className":189923},[4715,4716,4717,4718],[78,189925,7132],{"className":189926,"style":7300},[4667,4678,4718],[78,189928,4604],{"className":189929},[4682],[10548,189931,92106],{"id":92106},[13,189933,92109],{},[13,189935,92112],{},[78,189937,189939],{"className":189938},[4566],[78,189940,189942,190013],{"className":189941},[4570],[78,189943,189945],{"className":189944},[4574],[4576,189946,189947],{"xmlns":4578,"display":4579},[4581,189948,189949,190011],{},[4584,189950,189951,189953,189955,189957,189959,189961,189963,189965,189971,189985,189987,189997,189999,190005],{},[4596,189952,90141],{},[4591,189954,4594],{"stretchy":4593},[4596,189956,6107],{},[4591,189958,2066],{"separator":1419},[4596,189960,12172],{},[4591,189962,4604],{"stretchy":4593},[4591,189964,4609],{},[4611,189966,189967,189969],{},[7077,189968,469],{},[7077,189970,472],{},[89720,189972,189973,189975,189983],{},[4591,189974,4632],{},[4584,189976,189977,189979,189981],{},[4596,189978,4635],{},[4591,189980,4609],{},[7077,189982,469],{},[4596,189984,7132],{},[4591,189986,4594],{"stretchy":4593},[4600,189988,189989,189995],{},[79789,189990,189991,189993],{"accent":1419},[4596,189992,16867],{},[4591,189994,92172],{},[4596,189996,39],{},[4591,189998,17848],{},[4600,190000,190001,190003],{},[4596,190002,16867],{},[4596,190004,39],{},[4614,190006,190007,190009],{},[4591,190008,4604],{"stretchy":4593},[7077,190010,472],{},[4647,190012,92191],{"encoding":4649},[78,190014,190016,190052,190278],{"className":190015,"ariaHidden":1419},[4654],[78,190017,190019,190022,190025,190028,190031,190034,190037,190040,190043,190046,190049],{"className":190018},[4658],[78,190020],{"className":190021,"style":4663},[4662],[78,190023,90141],{"className":190024,"style":90275},[4667,4678],[78,190026,4594],{"className":190027},[4674],[78,190029,6107],{"className":190030,"style":5219},[4667,4678],[78,190032,2066],{"className":190033},[5126],[78,190035],{"className":190036,"style":4839},[4739],[78,190038,12172],{"className":190039},[4667,4678],[78,190041,4604],{"className":190042},[4682],[78,190044],{"className":190045,"style":4740},[4739],[78,190047,4609],{"className":190048},[4744],[78,190050],{"className":190051,"style":4740},[4739],[78,190053,190055,190058,190120,190123,190187,190190,190269,190272,190275],{"className":190054},[4658],[78,190056],{"className":190057,"style":92237},[4662],[78,190059,190061,190064,190117],{"className":190060},[4667],[78,190062],{"className":190063},[4674,4761],[78,190065,190067],{"className":190066},[4611],[78,190068,190070,190109],{"className":190069},[4693,4694],[78,190071,190073,190106],{"className":190072},[4698],[78,190074,190076,190087,190095],{"className":190075,"style":86003},[4702],[78,190077,190078,190081],{"style":4777},[78,190079],{"className":190080,"style":4781},[4710],[78,190082,190084],{"className":190083},[4667],[78,190085,472],{"className":190086},[4667],[78,190088,190089,190092],{"style":4919},[78,190090],{"className":190091,"style":4781},[4710],[78,190093],{"className":190094,"style":4927},[4926],[78,190096,190097,190100],{"style":4930},[78,190098],{"className":190099,"style":4781},[4710],[78,190101,190103],{"className":190102},[4667],[78,190104,469],{"className":190105},[4667],[78,190107,4726],{"className":190108},[4725],[78,190110,190112],{"className":190111},[4698],[78,190113,190115],{"className":190114,"style":90505},[4702],[78,190116],{},[78,190118],{"className":190119},[4682,4761],[78,190121],{"className":190122,"style":4839},[4739],[78,190124,190126],{"className":190125},[4788,52401],[78,190127,190129,190179],{"className":190128},[4693,4694],[78,190130,190132,190176],{"className":190131},[4698],[78,190133,190135,190155,190165],{"className":190134,"style":92315},[4702],[78,190136,190137,190140],{"style":89982},[78,190138],{"className":190139,"style":89986},[4710],[78,190141,190143],{"className":190142},[4715,4716,4717,4718],[78,190144,190146,190149,190152],{"className":190145},[4667,4718],[78,190147,4635],{"className":190148,"style":4823},[4667,4678,4718],[78,190150,4609],{"className":190151},[4744,4718],[78,190153,469],{"className":190154},[4667,4718],[78,190156,190157,190160],{"style":90004},[78,190158],{"className":190159,"style":89986},[4710],[78,190161,190162],{},[78,190163,4632],{"className":190164},[4788,4792,90013],[78,190166,190167,190170],{"style":90016},[78,190168],{"className":190169,"style":89986},[4710],[78,190171,190173],{"className":190172},[4715,4716,4717,4718],[78,190174,7132],{"className":190175,"style":7300},[4667,4678,4718],[78,190177,4726],{"className":190178},[4725],[78,190180,190182],{"className":190181},[4698],[78,190183,190185],{"className":190184,"style":90576},[4702],[78,190186],{},[78,190188,4594],{"className":190189},[4674],[78,190191,190193,190235],{"className":190192},[4667],[78,190194,190196],{"className":190195},[4667,92377],[78,190197,190199,190227],{"className":190198},[4693,4694],[78,190200,190202,190224],{"className":190201},[4698],[78,190203,190205,190213],{"className":190204,"style":16794},[4702],[78,190206,190207,190210],{"style":5824},[78,190208],{"className":190209,"style":4781},[4710],[78,190211,16867],{"className":190212,"style":5187},[4667,4678],[78,190214,190215,190218],{"style":5824},[78,190216],{"className":190217,"style":4781},[4710],[78,190219,190221],{"className":190220,"style":92404},[92403],[78,190222,92172],{"className":190223},[4667],[78,190225,4726],{"className":190226},[4725],[78,190228,190230],{"className":190229},[4698],[78,190231,190233],{"className":190232,"style":92417},[4702],[78,190234],{},[78,190236,190238],{"className":190237},[4689],[78,190239,190241,190261],{"className":190240},[4693,4694],[78,190242,190244,190258],{"className":190243},[4698],[78,190245,190247],{"className":190246,"style":4703},[4702],[78,190248,190249,190252],{"style":63415},[78,190250],{"className":190251,"style":4711},[4710],[78,190253,190255],{"className":190254},[4715,4716,4717,4718],[78,190256,39],{"className":190257},[4667,4678,4718],[78,190259,4726],{"className":190260},[4725],[78,190262,190264],{"className":190263},[4698],[78,190265,190267],{"className":190266,"style":4733},[4702],[78,190268],{},[78,190270],{"className":190271,"style":5143},[4739],[78,190273,17848],{"className":190274},[7450],[78,190276],{"className":190277,"style":5143},[4739],[78,190279,190281,190284,190324],{"className":190280},[4658],[78,190282],{"className":190283,"style":53782},[4662],[78,190285,190287,190290],{"className":190286},[4667],[78,190288,16867],{"className":190289,"style":5187},[4667,4678],[78,190291,190293],{"className":190292},[4689],[78,190294,190296,190316],{"className":190295},[4693,4694],[78,190297,190299,190313],{"className":190298},[4698],[78,190300,190302],{"className":190301,"style":4703},[4702],[78,190303,190304,190307],{"style":63415},[78,190305],{"className":190306,"style":4711},[4710],[78,190308,190310],{"className":190309},[4715,4716,4717,4718],[78,190311,39],{"className":190312},[4667,4678,4718],[78,190314,4726],{"className":190315},[4725],[78,190317,190319],{"className":190318},[4698],[78,190320,190322],{"className":190321,"style":4733},[4702],[78,190323],{},[78,190325,190327,190330],{"className":190326},[4682],[78,190328,4604],{"className":190329},[4682],[78,190331,190333],{"className":190332},[4689],[78,190334,190336],{"className":190335},[4693],[78,190337,190339],{"className":190338},[4698],[78,190340,190342],{"className":190341,"style":53807},[4702],[78,190343,190344,190347],{"style":5209},[78,190345],{"className":190346,"style":4711},[4710],[78,190348,190350],{"className":190349},[4715,4716,4717,4718],[78,190351,472],{"className":190352},[4667,4718],[13,190354,92540],{},[13,190356,92543],{},[78,190358,190360],{"className":190359},[4566],[78,190361,190363,190422],{"className":190362},[4570],[78,190364,190366],{"className":190365},[4574],[4576,190367,190368],{"xmlns":4578,"display":4579},[4581,190369,190370,190420],{},[4584,190371,190372,190378,190380,190386,190388,190390,190418],{},[4614,190373,190374,190376],{},[4596,190375,6107],{},[4596,190377,7132],{},[4591,190379,4609],{},[4614,190381,190382,190384],{},[4596,190383,6107],{},[4596,190385,7132],{},[4591,190387,17848],{},[4596,190389,55518],{},[4611,190391,190392,190408],{},[4584,190393,190394,190396,190398,190400,190402,190404,190406],{},[4596,190395,90937],{"mathvariant":7101},[4596,190397,90141],{},[4591,190399,4594],{"stretchy":4593},[4596,190401,6107],{},[4591,190403,2066],{"separator":1419},[4596,190405,12172],{},[4591,190407,4604],{"stretchy":4593},[4584,190409,190410,190412],{},[4596,190411,90937],{"mathvariant":7101},[4614,190413,190414,190416],{},[4596,190415,6107],{},[4596,190417,7132],{},[4587,190419,92607],{},[4647,190421,92610],{"encoding":4649},[78,190423,190425,190469,190513],{"className":190424,"ariaHidden":1419},[4654],[78,190426,190428,190431,190460,190463,190466],{"className":190427},[4658],[78,190429],{"className":190430,"style":91855},[4662],[78,190432,190434,190437],{"className":190433},[4667],[78,190435,6107],{"className":190436,"style":5219},[4667,4678],[78,190438,190440],{"className":190439},[4689],[78,190441,190443],{"className":190442},[4693],[78,190444,190446],{"className":190445},[4698],[78,190447,190449],{"className":190448,"style":91855},[4702],[78,190450,190451,190454],{"style":5209},[78,190452],{"className":190453,"style":4711},[4710],[78,190455,190457],{"className":190456},[4715,4716,4717,4718],[78,190458,7132],{"className":190459,"style":7300},[4667,4678,4718],[78,190461],{"className":190462,"style":4740},[4739],[78,190464,4609],{"className":190465},[4744],[78,190467],{"className":190468,"style":4740},[4739],[78,190470,190472,190475,190504,190507,190510],{"className":190471},[4658],[78,190473],{"className":190474,"style":91900},[4662],[78,190476,190478,190481],{"className":190477},[4667],[78,190479,6107],{"className":190480,"style":5219},[4667,4678],[78,190482,190484],{"className":190483},[4689],[78,190485,190487],{"className":190486},[4693],[78,190488,190490],{"className":190489},[4698],[78,190491,190493],{"className":190492,"style":91855},[4702],[78,190494,190495,190498],{"style":5209},[78,190496],{"className":190497,"style":4711},[4710],[78,190499,190501],{"className":190500},[4715,4716,4717,4718],[78,190502,7132],{"className":190503,"style":7300},[4667,4678,4718],[78,190505],{"className":190506,"style":5143},[4739],[78,190508,17848],{"className":190509},[7450],[78,190511],{"className":190512,"style":5143},[4739],[78,190514,190516,190519,190522,190634,190637,190640,190643,190646,190649],{"className":190515},[4658],[78,190517],{"className":190518,"style":92708},[4662],[78,190520,55518],{"className":190521,"style":55822},[4667,4678],[78,190523,190525,190528,190631],{"className":190524},[4667],[78,190526],{"className":190527},[4674,4761],[78,190529,190531],{"className":190530},[4611],[78,190532,190534,190623],{"className":190533},[4693,4694],[78,190535,190537,190620],{"className":190536},[4698],[78,190538,190540,190580,190588],{"className":190539,"style":52478},[4702],[78,190541,190542,190545],{"style":4777},[78,190543],{"className":190544,"style":4781},[4710],[78,190546,190548,190551],{"className":190547},[4667],[78,190549,90937],{"className":190550,"style":79383},[4667],[78,190552,190554,190557],{"className":190553},[4667],[78,190555,6107],{"className":190556,"style":5219},[4667,4678],[78,190558,190560],{"className":190559},[4689],[78,190561,190563],{"className":190562},[4693],[78,190564,190566],{"className":190565},[4698],[78,190567,190569],{"className":190568,"style":86042},[4702],[78,190570,190571,190574],{"style":19600},[78,190572],{"className":190573,"style":4711},[4710],[78,190575,190577],{"className":190576},[4715,4716,4717,4718],[78,190578,7132],{"className":190579,"style":7300},[4667,4678,4718],[78,190581,190582,190585],{"style":4919},[78,190583],{"className":190584,"style":4781},[4710],[78,190586],{"className":190587,"style":4927},[4926],[78,190589,190590,190593],{"style":4930},[78,190591],{"className":190592,"style":4781},[4710],[78,190594,190596,190599,190602,190605,190608,190611,190614,190617],{"className":190595},[4667],[78,190597,90937],{"className":190598,"style":79383},[4667],[78,190600,90141],{"className":190601,"style":90275},[4667,4678],[78,190603,4594],{"className":190604},[4674],[78,190606,6107],{"className":190607,"style":5219},[4667,4678],[78,190609,2066],{"className":190610},[5126],[78,190612],{"className":190613,"style":4839},[4739],[78,190615,12172],{"className":190616},[4667,4678],[78,190618,4604],{"className":190619},[4682],[78,190621,4726],{"className":190622},[4725],[78,190624,190626],{"className":190625},[4698],[78,190627,190629],{"className":190628,"style":90505},[4702],[78,190630],{},[78,190632],{"className":190633},[4682,4761],[78,190635,79936],{"className":190636},[4739],[78,190638,79936],{"className":190639},[4739],[78,190641,79936],{"className":190642},[4739],[78,190644,79936],{"className":190645},[4739],[78,190647,79936],{"className":190648},[4739],[78,190650,92842],{"className":190651},[4667,6184],[23289,190653],{},[107,190655,92848],{"id":92847},[13,190657,92851],{},[7759,190659,92854],{"id":92854},[13,190661,92857],{},[23289,190663],{},[7759,190665,92862],{"id":92862},[13,190667,92865],{},[49,190669,190670,190672],{},[52,190671,92870],{},[52,190673,92873],{},[23289,190675],{},[7759,190677,92878],{"id":92878},[13,190679,92881],{},[13,190681,190682],{},[617,190683],{"alt":37000,"src":92886},[13,190685,190686],{},[617,190687],{"alt":92891,"src":92892},[13,190689,190690],{},[617,190691],{"alt":92897,"src":92898},[107,190693,25480],{"id":92901},[13,190695,92904],{},[13,190697,92907],{},[13,190699,92910],{},{"title":119,"searchDepth":144,"depth":144,"links":190701},[190702,190706,190713,190723,190730,190735],{"id":78188,"depth":132,"text":78189,"children":190703},[190704,190705],{"id":78192,"depth":144,"text":78193},{"id":78205,"depth":144,"text":78206},{"id":78223,"depth":132,"text":78224,"children":190707},[190708,190709,190710,190711,190712],{"id":78227,"depth":144,"text":78228},{"id":78239,"depth":144,"text":78240},{"id":78265,"depth":144,"text":78266},{"id":78301,"depth":144,"text":78302},{"id":78417,"depth":144,"text":78418},{"id":78429,"depth":132,"text":78430,"children":190714},[190715,190716,190717,190718,190719,190720,190721,190722],{"id":78433,"depth":144,"text":78434},{"id":78816,"depth":144,"text":78817},{"id":79412,"depth":144,"text":79413},{"id":79421,"depth":144,"text":79422},{"id":83521,"depth":144,"text":83522},{"id":83674,"depth":144,"text":83675},{"id":83854,"depth":144,"text":83855},{"id":84331,"depth":144,"text":84332},{"id":85371,"depth":132,"text":85372,"children":190724},[190725,190726,190727,190728,190729],{"id":85375,"depth":144,"text":85376},{"id":85396,"depth":144,"text":85397},{"id":87810,"depth":144,"text":87811},{"id":88279,"depth":144,"text":88280},{"id":91747,"depth":144,"text":91748},{"id":92847,"depth":132,"text":92848,"children":190731},[190732,190733,190734],{"id":92854,"depth":144,"text":92854},{"id":92862,"depth":144,"text":92862},{"id":92878,"depth":144,"text":92878},{"id":92901,"depth":132,"text":25480},{},{"title":78166,"description":119},[7744,246,14542],{"id":92955,"title":92956,"assetBase":239,"author":8,"body":190740,"category":23936,"collection":23324,"date":23325,"description":92961,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":191324,"navigation":128,"originalPath":93644,"path":93645,"seo":191325,"source":23330,"stem":93647,"tags":191326,"weight":250,"__hash__":93649},{"type":10,"value":190741,"toc":191321},[190742,190744,190746,190748,190750,190764,190766,190768,190770,190775,190777,190779,190939,190941,191093,191095,191319],[13,190743,92961],{},[13,190745,92964],{},[13,190747,92967],{},[13,190749,92970],{},[49,190751,190752,190754],{},[52,190753,92975],{},[52,190755,92978,190756],{},[49,190757,190758,190760,190762],{},[52,190759,92983],{},[52,190761,92986],{},[52,190763,92989],{},[13,190765,92992],{},[7759,190767,246],{"id":246},[13,190769,92997],{},[114,190771,190773],{"className":190772,"code":93001,"language":299},[297],[17,190774,93001],{"__ignoreMap":119},[13,190776,93006],{},[13,190778,93009],{},[114,190780,190781],{"className":23652,"code":93012,"language":23654,"meta":119,"style":119},[17,190782,190783,190787,190791,190795,190799,190803,190807,190811,190815,190819,190823,190827,190831,190835,190839,190843,190847,190851,190855,190859,190863,190867,190871,190875,190879,190883,190887,190891,190895,190899,190903,190907,190911,190915,190919,190923,190927,190931,190935],{"__ignoreMap":119},[78,190784,190785],{"class":124,"line":125},[78,190786,23544],{},[78,190788,190789],{"class":124,"line":132},[78,190790,129],{"emptyLinePlaceholder":128},[78,190792,190793],{"class":124,"line":138},[78,190794,36328],{},[78,190796,190797],{"class":124,"line":144},[78,190798,23558],{},[78,190800,190801],{"class":124,"line":150},[78,190802,93035],{},[78,190804,190805],{"class":124,"line":156},[78,190806,93040],{},[78,190808,190809],{"class":124,"line":162},[78,190810,93045],{},[78,190812,190813],{"class":124,"line":168},[78,190814,93050],{},[78,190816,190817],{"class":124,"line":174},[78,190818,93055],{},[78,190820,190821],{"class":124,"line":180},[78,190822,93060],{},[78,190824,190825],{"class":124,"line":186},[78,190826,10054],{},[78,190828,190829],{"class":124,"line":192},[78,190830,129],{"emptyLinePlaceholder":128},[78,190832,190833],{"class":124,"line":198},[78,190834,15810],{},[78,190836,190837],{"class":124,"line":204},[78,190838,23518],{},[78,190840,190841],{"class":124,"line":210},[78,190842,129],{"emptyLinePlaceholder":128},[78,190844,190845],{"class":124,"line":216},[78,190846,93085],{},[78,190848,190849],{"class":124,"line":222},[78,190850,93090],{},[78,190852,190853],{"class":124,"line":421},[78,190854,93095],{},[78,190856,190857],{"class":124,"line":427},[78,190858,93100],{},[78,190860,190861],{"class":124,"line":433},[78,190862,93105],{},[78,190864,190865],{"class":124,"line":2443},[78,190866,93110],{},[78,190868,190869],{"class":124,"line":2448},[78,190870,93115],{},[78,190872,190873],{"class":124,"line":2454},[78,190874,93120],{},[78,190876,190877],{"class":124,"line":2460},[78,190878,93125],{},[78,190880,190881],{"class":124,"line":2465},[78,190882,15810],{},[78,190884,190885],{"class":124,"line":2470},[78,190886,129],{"emptyLinePlaceholder":128},[78,190888,190889],{"class":124,"line":2903},[78,190890,93138],{},[78,190892,190893],{"class":124,"line":2909},[78,190894,93143],{},[78,190896,190897],{"class":124,"line":11477},[78,190898,93148],{},[78,190900,190901],{"class":124,"line":13374},[78,190902,93153],{},[78,190904,190905],{"class":124,"line":13380},[78,190906,93158],{},[78,190908,190909],{"class":124,"line":13386},[78,190910,93163],{},[78,190912,190913],{"class":124,"line":13722},[78,190914,93168],{},[78,190916,190917],{"class":124,"line":13727},[78,190918,93173],{},[78,190920,190921],{"class":124,"line":13953},[78,190922,9912],{},[78,190924,190925],{"class":124,"line":13958},[78,190926,9615],{},[78,190928,190929],{"class":124,"line":13964},[78,190930,10054],{},[78,190932,190933],{"class":124,"line":13969},[78,190934,15810],{},[78,190936,190937],{"class":124,"line":24170},[78,190938,23518],{},[13,190940,93196],{},[114,190942,190943],{"className":23406,"code":93199,"language":23408,"meta":119,"style":119},[17,190944,190945,190949,190953,190957,190961,190965,190969,190973,190977,190981,190985,190989,190993,190997,191001,191005,191009,191013,191017,191021,191025,191029,191033,191037,191041,191045,191049,191053,191057,191061,191065,191069,191073,191077,191081,191085,191089],{"__ignoreMap":119},[78,190946,190947],{"class":124,"line":125},[78,190948,93206],{},[78,190950,190951],{"class":124,"line":132},[78,190952,129],{"emptyLinePlaceholder":128},[78,190954,190955],{"class":124,"line":138},[78,190956,93215],{},[78,190958,190959],{"class":124,"line":144},[78,190960,93220],{},[78,190962,190963],{"class":124,"line":150},[78,190964,93225],{},[78,190966,190967],{"class":124,"line":156},[78,190968,93230],{},[78,190970,190971],{"class":124,"line":162},[78,190972,93235],{},[78,190974,190975],{"class":124,"line":168},[78,190976,93240],{},[78,190978,190979],{"class":124,"line":174},[78,190980,93245],{},[78,190982,190983],{"class":124,"line":180},[78,190984,93250],{},[78,190986,190987],{"class":124,"line":186},[78,190988,15810],{},[78,190990,190991],{"class":124,"line":192},[78,190992,23513],{},[78,190994,190995],{"class":124,"line":198},[78,190996,23518],{},[78,190998,190999],{"class":124,"line":204},[78,191000,129],{"emptyLinePlaceholder":128},[78,191002,191003],{"class":124,"line":210},[78,191004,93085],{},[78,191006,191007],{"class":124,"line":216},[78,191008,93275],{},[78,191010,191011],{"class":124,"line":222},[78,191012,93280],{},[78,191014,191015],{"class":124,"line":421},[78,191016,93285],{},[78,191018,191019],{"class":124,"line":427},[78,191020,129],{"emptyLinePlaceholder":128},[78,191022,191023],{"class":124,"line":433},[78,191024,93294],{},[78,191026,191027],{"class":124,"line":2443},[78,191028,93299],{},[78,191030,191031],{"class":124,"line":2448},[78,191032,93304],{},[78,191034,191035],{"class":124,"line":2454},[78,191036,93309],{},[78,191038,191039],{"class":124,"line":2460},[78,191040,93314],{},[78,191042,191043],{"class":124,"line":2465},[78,191044,23513],{},[78,191046,191047],{"class":124,"line":2470},[78,191048,129],{"emptyLinePlaceholder":128},[78,191050,191051],{"class":124,"line":2903},[78,191052,93327],{},[78,191054,191055],{"class":124,"line":2909},[78,191056,93332],{},[78,191058,191059],{"class":124,"line":11477},[78,191060,93337],{},[78,191062,191063],{"class":124,"line":13374},[78,191064,93342],{},[78,191066,191067],{"class":124,"line":13380},[78,191068,93347],{},[78,191070,191071],{"class":124,"line":13386},[78,191072,93352],{},[78,191074,191075],{"class":124,"line":13722},[78,191076,93357],{},[78,191078,191079],{"class":124,"line":13727},[78,191080,23499],{},[78,191082,191083],{"class":124,"line":13953},[78,191084,15810],{},[78,191086,191087],{"class":124,"line":13958},[78,191088,23513],{},[78,191090,191091],{"class":124,"line":13964},[78,191092,23518],{},[13,191094,93376],{},[114,191096,191097],{"className":51126,"code":93379,"language":51128,"meta":119,"style":119},[17,191098,191099,191103,191107,191111,191115,191119,191123,191127,191131,191135,191139,191143,191147,191151,191155,191159,191163,191167,191171,191175,191179,191183,191187,191191,191195,191199,191203,191207,191211,191215,191219,191223,191227,191231,191235,191239,191243,191247,191251,191255,191259,191263,191267,191271,191275,191279,191283,191287,191291,191295,191299,191303,191307,191311,191315],{"__ignoreMap":119},[78,191100,191101],{"class":124,"line":125},[78,191102,93386],{},[78,191104,191105],{"class":124,"line":132},[78,191106,60187],{},[78,191108,191109],{"class":124,"line":138},[78,191110,129],{"emptyLinePlaceholder":128},[78,191112,191113],{"class":124,"line":144},[78,191114,51205],{},[78,191116,191117],{"class":124,"line":150},[78,191118,129],{"emptyLinePlaceholder":128},[78,191120,191121],{"class":124,"line":156},[78,191122,93407],{},[78,191124,191125],{"class":124,"line":162},[78,191126,93412],{},[78,191128,191129],{"class":124,"line":168},[78,191130,93417],{},[78,191132,191133],{"class":124,"line":174},[78,191134,93422],{},[78,191136,191137],{"class":124,"line":180},[78,191138,93427],{},[78,191140,191141],{"class":124,"line":186},[78,191142,93432],{},[78,191144,191145],{"class":124,"line":192},[78,191146,129],{"emptyLinePlaceholder":128},[78,191148,191149],{"class":124,"line":198},[78,191150,93441],{},[78,191152,191153],{"class":124,"line":204},[78,191154,93446],{},[78,191156,191157],{"class":124,"line":210},[78,191158,93451],{},[78,191160,191161],{"class":124,"line":216},[78,191162,93456],{},[78,191164,191165],{"class":124,"line":222},[78,191166,15810],{},[78,191168,191169],{"class":124,"line":421},[78,191170,93465],{},[78,191172,191173],{"class":124,"line":427},[78,191174,23518],{},[78,191176,191177],{"class":124,"line":433},[78,191178,129],{"emptyLinePlaceholder":128},[78,191180,191181],{"class":124,"line":2443},[78,191182,93478],{},[78,191184,191185],{"class":124,"line":2448},[78,191186,93483],{},[78,191188,191189],{"class":124,"line":2454},[78,191190,93488],{},[78,191192,191193],{"class":124,"line":2460},[78,191194,93493],{},[78,191196,191197],{"class":124,"line":2465},[78,191198,15810],{},[78,191200,191201],{"class":124,"line":2470},[78,191202,93502],{},[78,191204,191205],{"class":124,"line":2903},[78,191206,93507],{},[78,191208,191209],{"class":124,"line":2909},[78,191210,93512],{},[78,191212,191213],{"class":124,"line":11477},[78,191214,93517],{},[78,191216,191217],{"class":124,"line":13374},[78,191218,93522],{},[78,191220,191221],{"class":124,"line":13380},[78,191222,93527],{},[78,191224,191225],{"class":124,"line":13386},[78,191226,10054],{},[78,191228,191229],{"class":124,"line":13722},[78,191230,93536],{},[78,191232,191233],{"class":124,"line":13727},[78,191234,93541],{},[78,191236,191237],{"class":124,"line":13953},[78,191238,93546],{},[78,191240,191241],{"class":124,"line":13958},[78,191242,93551],{},[78,191244,191245],{"class":124,"line":13964},[78,191246,10054],{},[78,191248,191249],{"class":124,"line":13969},[78,191250,15810],{},[78,191252,191253],{"class":124,"line":24170},[78,191254,23518],{},[78,191256,191257],{"class":124,"line":24175},[78,191258,129],{"emptyLinePlaceholder":128},[78,191260,191261],{"class":124,"line":24180},[78,191262,93572],{},[78,191264,191265],{"class":124,"line":24186},[78,191266,93577],{},[78,191268,191269],{"class":124,"line":24192},[78,191270,93582],{},[78,191272,191273],{"class":124,"line":24198},[78,191274,93587],{},[78,191276,191277],{"class":124,"line":24204},[78,191278,93502],{},[78,191280,191281],{"class":124,"line":24210},[78,191282,93596],{},[78,191284,191285],{"class":124,"line":24215},[78,191286,15810],{},[78,191288,191289],{"class":124,"line":24220},[78,191290,93605],{},[78,191292,191293],{"class":124,"line":24226},[78,191294,93610],{},[78,191296,191297],{"class":124,"line":24232},[78,191298,93615],{},[78,191300,191301],{"class":124,"line":24238},[78,191302,93620],{},[78,191304,191305],{"class":124,"line":24244},[78,191306,10054],{},[78,191308,191309],{"class":124,"line":24250},[78,191310,93629],{},[78,191312,191313],{"class":124,"line":24256},[78,191314,15810],{},[78,191316,191317],{"class":124,"line":24262},[78,191318,23518],{},[226,191320,228],{},{"title":119,"searchDepth":144,"depth":144,"links":191322},[191323],{"id":246,"depth":144,"text":246},{},{"title":92956,"description":92961},[246,10715],{"id":93651,"title":93652,"assetBase":239,"author":8,"body":191328,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":193053,"navigation":128,"originalPath":96207,"path":96208,"seo":193054,"source":23330,"stem":96210,"tags":193055,"weight":250,"__hash__":96212},{"type":10,"value":191329,"toc":193037},[191330,191332,191344,191346,191348,191362,191364,191366,191370,191374,191378,191380,191386,191390,191392,191394,191398,191400,191404,191406,191416,191420,191422,191424,191434,191440,191442,191444,191452,191454,191456,191460,191462,191466,191468,191472,191474,191478,191480,191482,191484,191486,191488,191492,191494,191496,191540,191542,191544,191548,191550,191554,191556,191560,191568,191570,191572,191576,191580,191584,191588,191592,191594,191598,191600,191604,191606,191610,191612,191614,191616,191620,191624,191626,191630,191634,191636,191638,191640,191644,191648,191650,191652,191654,191662,191664,191666,191668,191670,191674,191676,191680,191682,191684,191686,191688,191693,191701,191703,191705,191707,191709,191713,191715,191717,191719,191721,191723,191727,191729,191731,191733,191737,191767,191769,191775,191779,191781,191787,191789,191793,191799,191803,191809,191811,191815,191817,191819,191821,191823,191825,191829,191833,191835,191841,191845,191847,191853,191857,191859,191861,191865,191870,191872,191874,191876,191888,191892,191896,191898,191906,191910,191912,191920,191924,191926,191938,191942,191944,191958,191962,191966,191968,191990,191992,191994,191996,192000,192002,192024,192026,192032,192034,192042,192046,192052,192056,192062,192066,192076,192078,192080,192088,192090,192092,192096,192098,192102,192104,192122,192126,192128,192146,192150,192152,192198,192200,192226,192230,192232,192234,192236,192404,192408,192410,192412,192416,192418,192420,192422,192424,192520,192522,192524,192528,192534,192536,192550,192554,192558,192562,192566,192570,192572,192574,192578,192580,192584,192586,192588,192592,192594,192600,192604,192606,192608,192610,192612,192614,192618,192622,192644,192646,192652,192672,192674,192678,192686,192688,192698,192700,192706,192708,192712,192714,192720,192724,192728,192736,192740,192746,192748,192750,192752,192758,192760,192764,192766,192768,192772,192778,192782,192786,192790,192794,192798,192802,192806,192810,192812,192816,192818,192820,192824,192828,192832,192834,192838,192840,192844,192846,192852,192862,192872,192874,192876,192880,192882,192884,192920,192922,192924,192929,192931,192933,192937,192941,192943,192947,192949,192951,192955,192957,192959,192961,192963,192985,192987,192991,192993,192995,192997,193001,193007,193011,193013,193017,193021,193023,193025,193027,193029,193033,193035],[4517,191331,30123],{"id":93657},[72,191333,191334,191338,191340,191342],{},[13,191335,191336],{},[22,191337,23957],{},[13,191339,93666],{},[13,191341,93669],{},[13,191343,93672],{},[7759,191345,93676],{"id":93675},[10548,191347,93679],{"id":93679},[49,191349,191350,191354,191358],{},[52,191351,93684,191352,93688],{},[22,191353,93687],{},[52,191355,93691,191356,93695],{},[22,191357,93694],{},[52,191359,93698,191360,93702],{},[22,191361,93701],{},[13,191363,93705],{},[10548,191365,93709],{"id":93708},[13,191367,93712,191368,67],{},[22,191369,93715],{},[13,191371,93718,191372,29665],{},[22,191373,93721],{},[13,191375,191376],{},[617,191377],{"alt":93726,"src":93727},[10548,191379,93731],{"id":93730},[13,191381,93734,191382,93738,191384,93742],{},[22,191383,93737],{},[22,191385,93741],{},[13,191387,191388],{},[617,191389],{"alt":93747,"src":93748},[10548,191391,93752],{"id":93751},[13,191393,93755],{},[13,191395,191396],{},[617,191397],{"alt":93760,"src":93761},[13,191399,93764],{},[13,191401,93767,191402,93771],{},[22,191403,93770],{},[10548,191405,93775],{"id":93774},[49,191407,191408,191412,191414],{},[52,191409,93780,191410,93784],{},[22,191411,93783],{},[52,191413,93787],{},[52,191415,93790],{},[13,191417,191418],{},[22,191419,93795],{},[23289,191421],{},[7759,191423,93801],{"id":93800},[13,191425,93804,191426,93808,191428,93812,191430,93815,191432,93819],{},[22,191427,93807],{},[22,191429,93811],{},[22,191431,74779],{},[22,191433,93818],{},[13,191435,93822,191436,93825,191438,67],{},[22,191437,31793],{},[22,191439,93828],{},[10548,191441,93832],{"id":93831},[13,191443,93835],{},[49,191445,191446,191448,191450],{},[52,191447,93840],{},[52,191449,93843],{},[52,191451,93846],{},[13,191453,93849],{},[13,191455,93852],{},[13,191457,191458],{},[617,191459],{"alt":93857,"src":93858},[13,191461,93861],{},[13,191463,191464],{},[617,191465],{"alt":93866,"src":93867},[13,191467,93870],{},[13,191469,191470],{},[617,191471],{"alt":93875,"src":93876},[13,191473,93879],{},[13,191475,191476],{},[22,191477,93884],{},[23289,191479],{},[7759,191481,93890],{"id":93889},[10548,191483,93893],{"id":93893},[13,191485,93896],{},[13,191487,93899],{},[13,191489,191490],{},[617,191491],{"alt":93904,"src":93905},[13,191493,93908],{},[10548,191495,93912],{"id":93911},[49,191497,191498,191510,191520,191530],{},[52,191499,191500,93920,191502,93924,191504,93927,191506,93931,191508,93935],{},[22,191501,93919],{},[22,191503,93923],{},[22,191505,39464],{},[22,191507,93930],{},[22,191509,93934],{},[52,191511,191512,93941,191514,93945,191516,93949,191518,28447],{},[22,191513,93940],{},[22,191515,93944],{},[22,191517,93948],{},[22,191519,93952],{},[52,191521,191522,93958,191524,93962,191526,93966,191528,28447],{},[22,191523,93957],{},[22,191525,93961],{},[22,191527,93965],{},[22,191529,93969],{},[52,191531,191532,93975,191534,93979,191536,93983,191538,28447],{},[22,191533,93974],{},[22,191535,93978],{},[22,191537,93982],{},[22,191539,93986],{},[23289,191541],{},[7759,191543,93992],{"id":93991},[13,191545,93995,191546,93999],{},[22,191547,93998],{},[13,191549,94002],{},[13,191551,191552],{},[617,191553],{"alt":94007,"src":94008},[13,191555,94011],{},[13,191557,191558],{},[617,191559],{"alt":94016,"src":94017},[13,191561,94020,191562,94023,191564,94027,191566,94031],{},[22,191563,20689],{},[18038,191565,94026],{},[22,191567,94030],{},[10548,191569,94034],{"id":94034},[13,191571,94037],{},[13,191573,191574],{},[617,191575],{"alt":94042,"src":94043},[49,191577,191578],{},[52,191579,94048],{},[13,191581,94051,191582,67],{},[22,191583,94054],{},[13,191585,191586],{},[617,191587],{"alt":94059,"src":94060},[49,191589,191590],{},[52,191591,94065],{},[13,191593,94068],{},[13,191595,191596],{},[617,191597],{"alt":94073,"src":94074},[10548,191599,94078],{"id":94077},[49,191601,191602],{},[52,191603,94083],{},[13,191605,94086],{},[49,191607,191608],{},[52,191609,94091],{},[13,191611,94094],{},[13,191613,94097],{},[10548,191615,94101],{"id":94100},[13,191617,94104,191618,94108],{},[22,191619,94107],{},[13,191621,191622],{},[617,191623],{"alt":94113,"src":94114},[13,191625,94117],{},[13,191627,94120,191628,94123],{},[22,191629,94030],{},[13,191631,191632],{},[617,191633],{"alt":94128,"src":94129},[13,191635,94132],{},[23289,191637],{},[7759,191639,94138],{"id":94137},[13,191641,94141,191642,94145],{},[22,191643,94144],{},[13,191645,94148,191646,67],{},[22,191647,94151],{},[13,191649,94154],{},[10548,191651,94158],{"id":94157},[13,191653,94161],{},[49,191655,191656,191658,191660],{},[52,191657,94166],{},[52,191659,94169],{},[52,191661,94172],{},[13,191663,94175],{},[13,191665,94178],{},[10548,191667,94182],{"id":94181},[13,191669,94185],{},[13,191671,191672],{},[617,191673],{"alt":94190,"src":94191},[13,191675,94194],{},[13,191677,191678],{},[617,191679],{"alt":94199,"src":94200},[13,191681,94203],{},[13,191683,94206],{},[13,191685,94209],{},[10548,191687,94213],{"id":94212},[13,191689,94216,191690,8661],{},[5009,191691,94221],{"href":94219,"rel":191692},[23647],[49,191694,191695,191697,191699],{},[52,191696,94226],{},[52,191698,94229],{},[52,191700,94232],{},[13,191702,94235],{},[13,191704,94238],{},[10548,191706,94242],{"id":94241},[13,191708,94245],{},[13,191710,191711],{},[617,191712],{"alt":94250,"src":94251},[13,191714,94254],{},[13,191716,94257],{},[23289,191718],{},[7759,191720,94263],{"id":94262},[13,191722,94266],{},[13,191724,191725],{},[617,191726],{"alt":94271,"src":94272},[13,191728,94275],{},[10548,191730,94279],{"id":94278},[13,191732,94282],{},[13,191734,191735],{},[617,191736],{"alt":94287,"src":94288},[49,191738,191739,191743,191747,191751,191755,191759,191763],{},[52,191740,191741,94296],{},[22,191742,94295],{},[52,191744,191745,94302],{},[22,191746,94301],{},[52,191748,191749,94308],{},[22,191750,94307],{},[52,191752,191753,94314],{},[22,191754,94313],{},[52,191756,191757,94320],{},[22,191758,94319],{},[52,191760,191761,94326],{},[22,191762,94325],{},[52,191764,191765,94332],{},[22,191766,94331],{},[10548,191768,94336],{"id":94335},[49,191770,191771],{},[52,191772,191773],{},[22,191774,94343],{},[13,191776,191777],{},[617,191778],{"alt":94348,"src":94349},[13,191780,94352],{},[49,191782,191783],{},[52,191784,191785],{},[22,191786,94359],{},[13,191788,94362],{},[13,191790,191791],{},[617,191792],{"alt":94367,"src":94368},[13,191794,94371,191795,94375,191797,94379],{},[22,191796,94374],{},[22,191798,94378],{},[13,191800,94382,191801,94386],{},[22,191802,94385],{},[49,191804,191805],{},[52,191806,191807],{},[22,191808,94393],{},[13,191810,94396],{},[13,191812,191813],{},[22,191814,94401],{},[13,191816,94404],{},[13,191818,94407],{},[13,191820,94410],{},[13,191822,94413],{},[13,191824,94416],{},[13,191826,191827],{},[22,191828,94421],{},[13,191830,191831,94427],{},[22,191832,94426],{},[13,191834,94430],{},[49,191836,191837],{},[52,191838,191839],{},[22,191840,94437],{},[13,191842,94440,191843,67],{},[22,191844,94443],{},[13,191846,94446],{},[49,191848,191849],{},[52,191850,191851],{},[22,191852,94453],{},[13,191854,94456,191855,94460],{},[22,191856,94459],{},[13,191858,94463],{},[10548,191860,94466],{"id":94466},[13,191862,94469,191863,94473],{},[22,191864,94472],{},[13,191866,94476,191867,94482],{},[5009,191868,94481],{"href":94479,"rel":191869},[23647],[23289,191871],{},[7759,191873,94488],{"id":94487},[10548,191875,94492],{"id":94491},[49,191877,191878,191884],{},[52,191879,94497,191880,52816,191882,67],{},[22,191881,94500],{},[22,191883,94503],{},[52,191885,94506,191886,94510],{},[22,191887,94509],{},[13,191889,191890],{},[617,191891],{"alt":94515,"src":94516},[13,191893,191894],{},[22,191895,94521],{},[10548,191897,94525],{"id":94524},[13,191899,94528,191900,94532,191902,94536,191904,67],{},[22,191901,94531],{},[22,191903,94535],{},[22,191905,94539],{},[49,191907,191908],{},[52,191909,94544],{},[10548,191911,94548],{"id":94547},[49,191913,191914,191916],{},[52,191915,94553],{},[52,191917,94556,191918,94560],{},[22,191919,94559],{},[13,191921,191922],{},[617,191923],{"alt":94565,"src":94566},[10548,191925,94570],{"id":94569},[49,191927,191928,191934],{},[52,191929,191930,94578,191932],{},[22,191931,94577],{},[22,191933,94581],{},[52,191935,191936,94587],{},[22,191937,94586],{},[13,191939,191940],{},[617,191941],{"alt":94592,"src":94593},[10548,191943,94597],{"id":94596},[49,191945,191946,191956],{},[52,191947,191948,94605,191950,94609,191952,94613,191954,67],{},[22,191949,94604],{},[22,191951,94608],{},[22,191953,94612],{},[22,191955,94616],{},[52,191957,94619],{},[13,191959,191960],{},[617,191961],{"alt":94624,"src":94625},[13,191963,191964],{},[617,191965],{"alt":94630,"src":94631},[10548,191967,94635],{"id":94634},[49,191969,191970,191974,191978],{},[52,191971,191972,94643],{},[22,191973,94642],{},[52,191975,191976,94649],{},[22,191977,94648],{},[52,191979,191980,94654,191982],{},[22,191981,94535],{},[49,191983,191984,191986],{},[52,191985,94659],{},[52,191987,191988,94665],{},[22,191989,94664],{},[23289,191991],{},[7759,191993,94671],{"id":94670},[13,191995,94674],{},[13,191997,191998],{},[617,191999],{"alt":94679,"src":94680},[10548,192001,94684],{"id":94683},[49,192003,192004,192006,192008,192010,192012,192014,192022],{},[52,192005,94689],{},[52,192007,94692],{},[52,192009,94695],{},[52,192011,94698],{},[52,192013,94701],{},[52,192015,94704,192016],{},[49,192017,192018,192020],{},[52,192019,94709],{},[52,192021,94712],{},[52,192023,94715],{},[10548,192025,94719],{"id":94718},[49,192027,192028,192030],{},[52,192029,94724],{},[52,192031,94727],{},[13,192033,94730],{},[49,192035,192036],{},[52,192037,192038,94738,192040,94741],{},[22,192039,94737],{},[2996,192041],{},[13,192043,192044],{},[617,192045],{"alt":94746,"src":94747},[49,192047,192048],{},[52,192049,192050,94755],{},[22,192051,94754],{},[13,192053,192054],{},[617,192055],{"alt":94760,"src":94761},[49,192057,192058],{},[52,192059,192060,94769],{},[22,192061,94768],{},[13,192063,192064],{},[617,192065],{"alt":94774,"src":94775},[49,192067,192068,192072],{},[52,192069,192070,94783],{},[22,192071,94782],{},[52,192073,192074,94789],{},[22,192075,94788],{},[23289,192077],{},[7759,192079,94795],{"id":94794},[13,192081,94798,192082,94802,192084,94806,192086,67],{},[22,192083,94801],{},[22,192085,94805],{},[22,192087,94809],{},[10548,192089,94813],{"id":94812},[13,192091,94816],{},[13,192093,192094],{},[617,192095],{"alt":94821,"src":94822},[13,192097,94825],{},[13,192099,192100],{},[617,192101],{"alt":94830,"src":94831},[10548,192103,94835],{"id":94834},[49,192105,192106,192110,192114,192118],{},[52,192107,192108,94843],{},[22,192109,94842],{},[52,192111,192112,94849],{},[22,192113,94848],{},[52,192115,192116,94855],{},[22,192117,94854],{},[52,192119,192120,94861],{},[22,192121,94860],{},[13,192123,192124],{},[617,192125],{"alt":94866,"src":94867},[10548,192127,94871],{"id":94870},[49,192129,192130,192134,192138,192142],{},[52,192131,192132,94879],{},[22,192133,94878],{},[52,192135,192136,94885],{},[22,192137,94884],{},[52,192139,192140,94891],{},[22,192141,94890],{},[52,192143,192144,94897],{},[22,192145,94896],{},[13,192147,192148],{},[617,192149],{"alt":94902,"src":94903},[10548,192151,94907],{"id":94906},[49,192153,192154,192160,192170,192188],{},[52,192155,94912,192156],{},[49,192157,192158],{},[52,192159,94917],{},[52,192161,94920,192162],{},[49,192163,192164,192166,192168],{},[52,192165,94925],{},[52,192167,94928],{},[52,192169,94931],{},[52,192171,192172,192174],{},[22,192173,94936],{},[49,192175,192176,192180,192184],{},[52,192177,192178],{},[22,192179,94943],{},[52,192181,192182],{},[22,192183,94948],{},[52,192185,192186],{},[22,192187,94953],{},[52,192189,94956,192190],{},[49,192191,192192,192194,192196],{},[52,192193,94961],{},[52,192195,94964],{},[52,192197,94967],{},[10548,192199,94971],{"id":94970},[49,192201,192202,192212,192220],{},[52,192203,94976,192204],{},[49,192205,192206,192208,192210],{},[52,192207,94981],{},[52,192209,94984],{},[52,192211,94987],{},[52,192213,94990,192214],{},[49,192215,192216,192218],{},[52,192217,94995],{},[52,192219,94998],{},[52,192221,95001,192222],{},[49,192223,192224],{},[52,192225,95006],{},[13,192227,192228],{},[22,192229,95011],{},[23289,192231],{},[7759,192233,95017],{"id":95016},[10548,192235,95021],{"id":95020},[8366,192237,192238,192250],{},[8369,192239,192240],{},[8372,192241,192242,192244,192246,192248],{},[8375,192243,95030],{"align":9247},[8375,192245,95033],{"align":9247},[8375,192247,95036],{"align":9247},[8375,192249,95039],{},[8386,192251,192252,192266,192280,192296,192312,192326,192340,192352,192364,192380,192392],{},[8372,192253,192254,192256,192258,192260],{},[8391,192255,95046],{"align":9247},[8391,192257,95049],{"align":9247},[8391,192259,95052],{"align":9247},[8391,192261,95033,192262,27386,192264,95060],{},[22,192263,95057],{},[2996,192265],{},[8372,192267,192268,192270,192272,192274],{},[8391,192269,95065],{"align":9247},[8391,192271,95068],{"align":9247},[8391,192273,95071],{"align":9247},[8391,192275,95074,192276,95078,192278,95081],{},[22,192277,95077],{},[2996,192279],{},[8372,192281,192282,192284,192286,192288],{},[8391,192283,64327],{"align":9247},[8391,192285,95088],{"align":9247},[8391,192287,95091],{"align":9247},[8391,192289,95094,192290,95097,192292,27386,192294,95103],{},[22,192291,64327],{},[22,192293,95100],{},[2996,192295],{},[8372,192297,192298,192300,192302,192304],{},[8391,192299,95108],{"align":9247},[8391,192301,14476],{"align":9247},[8391,192303,95113],{"align":9247},[8391,192305,95116,192306,95120,192308,95123,192310,95127],{},[22,192307,95119],{},[2996,192309],{},[22,192311,95126],{},[8372,192313,192314,192316,192318,192320],{},[8391,192315,31793],{"align":9247},[8391,192317,95134],{"align":9247},[8391,192319,95137],{"align":9247},[8391,192321,95140,192322,95143,192324,95147],{},[2996,192323],{},[22,192325,95146],{},[8372,192327,192328,192330,192332,192334],{},[8391,192329,95152],{"align":9247},[8391,192331,95155],{"align":9247},[8391,192333,95158],{"align":9247},[8391,192335,95161,192336,95164,192338],{},[2996,192337],{},[22,192339,95167],{},[8372,192341,192342,192344,192346,192348],{},[8391,192343,95172],{"align":9247},[8391,192345,95175],{"align":9247},[8391,192347,95178],{"align":9247},[8391,192349,95181,192350,95184],{},[2996,192351],{},[8372,192353,192354,192356,192358,192360],{},[8391,192355,95189],{"align":9247},[8391,192357,95178],{"align":9247},[8391,192359,95194],{"align":9247},[8391,192361,95197,192362,95200],{},[2996,192363],{},[8372,192365,192366,192368,192370,192372],{},[8391,192367,95205],{"align":9247},[8391,192369,95208],{"align":9247},[8391,192371,95211],{"align":9247},[8391,192373,95214,192374,192376,95220,192378,95223],{},[2996,192375],{},[22,192377,95219],{},[2996,192379],{},[8372,192381,192382,192384,192386,192388],{},[8391,192383,95228],{"align":9247},[8391,192385,14470],{"align":9247},[8391,192387,14473],{"align":9247},[8391,192389,95235,192390,95238],{},[2996,192391],{},[8372,192393,192394,192396,192398,192400],{},[8391,192395,95243],{"align":9247},[8391,192397,95246],{"align":9247},[8391,192399,95246],{"align":9247},[8391,192401,95251,192402,95254],{},[2996,192403],{},[49,192405,192406],{},[52,192407,95259],{},[13,192409,95262],{},[13,192411,95265],{},[49,192413,192414],{},[52,192415,95270],{},[13,192417,95273],{},[13,192419,95276],{},[10548,192421,95280],{"id":95279},[13,192423,95283],{},[8366,192425,192426,192438],{},[8369,192427,192428],{},[8372,192429,192430,192432,192434,192436],{},[8375,192431,95292],{"align":9247},[8375,192433,95295],{},[8375,192435,20689],{},[8375,192437,20692],{},[8386,192439,192440,192484],{},[8372,192441,192442,192446,192458,192474],{},[8391,192443,95306,192444,95309],{"align":9247},[2996,192445],{},[8391,192447,95312,192448,95316,192450,95319,192452,27386,192454,95325,192456,95329],{},[22,192449,95315],{},[2996,192451],{},[22,192453,95322],{},[2996,192455],{},[22,192457,95328],{},[8391,192459,95332,192460,95336,192462,95339,192464,95343,192466,95346,192468,95350,192470,95353,192472,67],{},[22,192461,95335],{},[2996,192463],{},[22,192465,95342],{},[2996,192467],{},[22,192469,95349],{},[2996,192471],{},[22,192473,95356],{},[8391,192475,95359,192476,27386,192478,95365,192480,95368,192482,95371],{},[22,192477,95362],{},[2996,192479],{},[2996,192481],{},[2996,192483],{},[8372,192485,192486,192488,192504,192516],{},[8391,192487,95376],{"align":9247},[8391,192489,95379,192490,95383,192492,95339,192494,27386,192496,95391,192498,27386,192500,95397,192502,67],{},[22,192491,95382],{},[2996,192493],{},[22,192495,95388],{},[2996,192497],{},[22,192499,95394],{},[2996,192501],{},[22,192503,95400],{},[8391,192505,95332,192506,27386,192508,95408,192510,27386,192512,95414,192514,95418],{},[22,192507,95405],{},[2996,192509],{},[22,192511,95411],{},[2996,192513],{},[22,192515,95417],{},[8391,192517,95421,192518,95424],{},[2996,192519],{},[23289,192521],{},[7759,192523,95430],{"id":95429},[13,192525,95433,192526,95437],{},[22,192527,95436],{},[13,192529,95440,192530,95444,192532,67],{},[22,192531,95443],{},[22,192533,95447],{},[10548,192535,95451],{"id":95450},[49,192537,192538,192542,192546],{},[52,192539,192540,95459],{},[22,192541,95458],{},[52,192543,192544,95465],{},[22,192545,95464],{},[52,192547,192548,95471],{},[22,192549,95470],{},[13,192551,192552],{},[617,192553],{"alt":95476,"src":95477},[13,192555,192556],{},[617,192557],{"alt":95482,"src":95483},[13,192559,95486,192560,95490],{},[22,192561,95489],{},[13,192563,95493,192564,67],{},[22,192565,95496],{},[13,192567,95499,192568,67],{},[22,192569,95502],{},[10548,192571,95506],{"id":95505},[13,192573,95509],{},[13,192575,95512,192576,67],{},[22,192577,95515],{},[13,192579,95518],{},[13,192581,95521,192582,95525],{},[22,192583,95524],{},[10548,192585,95529],{"id":95528},[13,192587,95532],{},[13,192589,95535,192590,95539],{},[22,192591,95538],{},[13,192593,95542],{},[49,192595,192596,192598],{},[52,192597,95547],{},[52,192599,95550],{},[13,192601,192602],{},[617,192603],{"alt":95555,"src":95556},[10548,192605,95560],{"id":95559},[13,192607,95563],{},[13,192609,95566],{},[13,192611,95569],{},[13,192613,95572],{},[13,192615,192616],{},[617,192617],{"alt":95577,"src":95578},[13,192619,192620],{},[22,192621,95583],{},[49,192623,192624,192626],{},[52,192625,95588],{},[52,192627,95591,192628],{},[49,192629,192630,192632,192636],{},[52,192631,95596],{},[52,192633,192634,95602],{},[22,192635,95601],{},[52,192637,192638,95608,192640,95612,192642,95616],{},[22,192639,95607],{},[22,192641,95611],{},[22,192643,95615],{},[10548,192645,95620],{"id":95619},[13,192647,95623,192648,95627,192650,95631],{},[22,192649,95626],{},[22,192651,95630],{},[49,192653,192654,192662],{},[52,192655,95636,192656],{},[49,192657,192658,192660],{},[52,192659,95641],{},[52,192661,95644],{},[52,192663,95647,192664],{},[49,192665,192666,192668,192670],{},[52,192667,95652],{},[52,192669,95655],{},[52,192671,95658],{},[10548,192673,95662],{"id":95661},[13,192675,192676],{},[22,192677,95667],{},[13,192679,95670,192680,95674,192682,95678,192684,95682],{},[22,192681,95673],{},[22,192683,95677],{},[22,192685,95681],{},[13,192687,95685],{},[49,192689,192690,192696],{},[52,192691,95690,192692,95694,192694,67],{},[22,192693,95693],{},[22,192695,95697],{},[52,192697,95700],{},[13,192699,95703],{},[49,192701,192702,192704],{},[52,192703,95708],{},[52,192705,95711],{},[10548,192707,95715],{"id":95714},[13,192709,95718,192710,95722],{},[22,192711,95721],{},[13,192713,95725],{},[13,192715,95728,192716,95732,192718,67],{},[22,192717,95731],{},[22,192719,95735],{},[13,192721,192722],{},[617,192723],{"alt":95740,"src":95741},[13,192725,192726,819],{},[22,192727,20689],{},[49,192729,192730,192732,192734],{},[52,192731,95750],{},[52,192733,95753],{},[52,192735,95756],{},[13,192737,192738,819],{},[22,192739,20692],{},[49,192741,192742,192744],{},[52,192743,95765],{},[52,192745,95768],{},[23289,192747],{},[7759,192749,95774],{"id":95773},[13,192751,95777],{},[13,192753,95780,192754,52204,192756,67],{},[22,192755,95783],{},[22,192757,95786],{},[10548,192759,95789],{"id":95789},[49,192761,192762],{},[52,192763,95794],{},[13,192765,95797],{},[13,192767,95800],{},[13,192769,192770],{},[617,192771],{"alt":95805,"src":95806},[49,192773,192774],{},[52,192775,95811,192776,28447],{},[22,192777,95814],{},[13,192779,95817,192780,95821],{},[22,192781,95820],{},[13,192783,192784,819],{},[22,192785,20689],{},[13,192787,95828,192788],{},[22,192789,95831],{},[13,192791,95834,192792],{},[22,192793,95837],{},[13,192795,95840,192796,95844],{},[22,192797,95843],{},[13,192799,192800,819],{},[22,192801,95849],{},[13,192803,95852,192804,95856],{},[22,192805,95855],{},[13,192807,95859,192808,95863],{},[22,192809,95862],{},[13,192811,95866],{},[13,192813,192814,819],{},[22,192815,95871],{},[13,192817,95874],{},[13,192819,95877],{},[13,192821,95880,192822,67],{},[22,192823,95883],{},[13,192825,192826],{},[22,192827,95888],{},[13,192829,95891,192830,67],{},[22,192831,95894],{},[10548,192833,95897],{"id":95897},[49,192835,192836],{},[52,192837,95794],{},[13,192839,95904],{},[13,192841,192842],{},[617,192843],{"alt":95909,"src":95910},[13,192845,95913],{},[49,192847,192848],{},[52,192849,95811,192850,28447],{},[22,192851,95920],{},[13,192853,95923,192854,95927,192856,95931,192858,95935,192860,67],{},[22,192855,95926],{},[22,192857,95930],{},[22,192859,95934],{},[22,192861,95938],{},[13,192863,95941,192864,95945,192866,95949,192868,95953,192870,95957],{},[22,192865,95944],{},[22,192867,95948],{},[22,192869,95952],{},[22,192871,95956],{},[13,192873,95960],{},[13,192875,95963],{},[13,192877,95966,192878],{},[22,192879,95969],{},[13,192881,95972],{},[10548,192883,95976],{"id":95975},[8366,192885,192886,192894],{},[8369,192887,192888],{},[8372,192889,192890,192892],{},[8375,192891,95985],{},[8375,192893,95988],{},[8386,192895,192896,192902,192908,192914],{},[8372,192897,192898,192900],{},[8391,192899,95995],{},[8391,192901,95998],{},[8372,192903,192904,192906],{},[8391,192905,96003],{},[8391,192907,96006],{},[8372,192909,192910,192912],{},[8391,192911,96011],{},[8391,192913,96014],{},[8372,192915,192916,192918],{},[8391,192917,96019],{},[8391,192919,96022],{},[23289,192921],{},[7759,192923,96028],{"id":96027},[13,192925,71248,192926],{},[5009,192927,96035],{"href":96033,"rel":192928},[23647],[10548,192930,96039],{"id":96038},[13,192932,96042],{},[13,192934,96045,192935,67],{},[22,192936,96048],{},[49,192938,192939],{},[52,192940,96053],{},[13,192942,96056],{},[13,192944,192945],{},[617,192946],{"alt":96061,"src":96062},[13,192948,96065],{},[13,192950,96068],{},[49,192952,192953],{},[52,192954,96073],{},[13,192956,96076],{},[10548,192958,96080],{"id":96079},[13,192960,96083],{},[13,192962,96086],{},[49,192964,192965,192973,192975,192983],{},[52,192966,96091,192967],{},[49,192968,192969,192971],{},[52,192970,96096],{},[52,192972,96099],{},[52,192974,96102],{},[52,192976,96105,192977],{},[49,192978,192979,192981],{},[52,192980,96110],{},[52,192982,96113],{},[52,192984,96116],{},[13,192986,96119],{},[49,192988,192989],{},[52,192990,96073],{},[13,192992,96126],{},[10548,192994,96130],{"id":96129},[13,192996,96133],{},[49,192998,192999],{},[52,193000,96138],{},[13,193002,96141,193003,18027,193005,96147],{},[596,193004,96144],{},[2700,193006],{},[49,193008,193009],{},[52,193010,96152],{},[13,193012,96155],{},[13,193014,193015],{},[617,193016],{"alt":96160,"src":96161},[49,193018,193019],{},[52,193020,96073],{},[13,193022,96168],{},[10548,193024,96172],{"id":96171},[13,193026,96175],{},[13,193028,96178],{},[13,193030,193031],{},[22,193032,96183],{},[23289,193034],{},[7759,193036,96189],{"id":96188},{"title":119,"searchDepth":144,"depth":144,"links":193038},[193039,193040,193041,193042,193043,193044,193045,193046,193047,193048,193049,193050,193051,193052],{"id":93675,"depth":144,"text":93676},{"id":93800,"depth":144,"text":93801},{"id":93889,"depth":144,"text":93890},{"id":93991,"depth":144,"text":93992},{"id":94137,"depth":144,"text":94138},{"id":94262,"depth":144,"text":94263},{"id":94487,"depth":144,"text":94488},{"id":94670,"depth":144,"text":94671},{"id":94794,"depth":144,"text":94795},{"id":95016,"depth":144,"text":95017},{"id":95429,"depth":144,"text":95430},{"id":95773,"depth":144,"text":95774},{"id":96027,"depth":144,"text":96028},{"id":96188,"depth":144,"text":96189},{},{"title":93652,"description":119},[14968,246,23378,10715],{"id":96214,"title":96215,"assetBase":239,"author":8,"body":193057,"category":23936,"collection":23324,"date":23325,"description":96220,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":193873,"navigation":128,"originalPath":97294,"path":97295,"seo":193874,"source":23330,"stem":97297,"tags":193875,"weight":250,"__hash__":97299},{"type":10,"value":193058,"toc":193862},[193059,193061,193063,193131,193133,193135,193137,193142,193226,193228,193230,193235,193237,193239,193245,193252,193254,193256,193258,193262,193264,193268,193270,193272,193274,193278,193280,193282,193292,193324,193326,193328,193332,193334,193336,193338,193340,193344,193346,193348,193354,193358,193360,193380,193382,193384,193388,193390,193392,193394,193396,193398,193400,193402,193404,193406,193408,193410,193412,193414,193416,193418,193420,193422,193424,193426,193430,193432,193434,193436,193438,193440,193444,193450,193454,193456,193460,193462,193464,193466,193468,193470,193794,193796,193800,193802,193804,193806,193808,193810,193812,193814,193816,193818,193824,193833,193842,193851,193860],[13,193060,96220],{},[13,193062,96223],{},[114,193064,193065],{"className":46802,"code":96226,"language":46804,"meta":119,"style":119},[17,193066,193067,193071,193075,193079,193083,193087,193091,193095,193099,193103,193107,193111,193115,193119,193123,193127],{"__ignoreMap":119},[78,193068,193069],{"class":124,"line":125},[78,193070,96233],{},[78,193072,193073],{"class":124,"line":132},[78,193074,96238],{},[78,193076,193077],{"class":124,"line":138},[78,193078,96243],{},[78,193080,193081],{"class":124,"line":144},[78,193082,96248],{},[78,193084,193085],{"class":124,"line":150},[78,193086,96253],{},[78,193088,193089],{"class":124,"line":156},[78,193090,96258],{},[78,193092,193093],{"class":124,"line":162},[78,193094,96263],{},[78,193096,193097],{"class":124,"line":168},[78,193098,96268],{},[78,193100,193101],{"class":124,"line":174},[78,193102,96273],{},[78,193104,193105],{"class":124,"line":180},[78,193106,96278],{},[78,193108,193109],{"class":124,"line":186},[78,193110,96283],{},[78,193112,193113],{"class":124,"line":192},[78,193114,96288],{},[78,193116,193117],{"class":124,"line":198},[78,193118,96293],{},[78,193120,193121],{"class":124,"line":204},[78,193122,96298],{},[78,193124,193125],{"class":124,"line":210},[78,193126,96303],{},[78,193128,193129],{"class":124,"line":216},[78,193130,96308],{},[13,193132,96311],{},[13,193134,96314],{},[13,193136,96317],{},[13,193138,96320,193139,96326],{},[5009,193140,96325],{"href":96323,"rel":193141},[23647],[114,193143,193144],{"className":46802,"code":96329,"language":46804,"meta":119,"style":119},[17,193145,193146,193150,193154,193158,193162,193166,193170,193174,193178,193182,193186,193190,193194,193198,193202,193206,193210,193214,193218,193222],{"__ignoreMap":119},[78,193147,193148],{"class":124,"line":125},[78,193149,96336],{},[78,193151,193152],{"class":124,"line":132},[78,193153,96341],{},[78,193155,193156],{"class":124,"line":138},[78,193157,96346],{},[78,193159,193160],{"class":124,"line":144},[78,193161,96351],{},[78,193163,193164],{"class":124,"line":150},[78,193165,96356],{},[78,193167,193168],{"class":124,"line":156},[78,193169,96361],{},[78,193171,193172],{"class":124,"line":162},[78,193173,96366],{},[78,193175,193176],{"class":124,"line":168},[78,193177,96371],{},[78,193179,193180],{"class":124,"line":174},[78,193181,96376],{},[78,193183,193184],{"class":124,"line":180},[78,193185,96381],{},[78,193187,193188],{"class":124,"line":186},[78,193189,96386],{},[78,193191,193192],{"class":124,"line":192},[78,193193,96391],{},[78,193195,193196],{"class":124,"line":198},[78,193197,96396],{},[78,193199,193200],{"class":124,"line":204},[78,193201,96401],{},[78,193203,193204],{"class":124,"line":210},[78,193205,96406],{},[78,193207,193208],{"class":124,"line":216},[78,193209,96411],{},[78,193211,193212],{"class":124,"line":222},[78,193213,96416],{},[78,193215,193216],{"class":124,"line":421},[78,193217,96421],{},[78,193219,193220],{"class":124,"line":427},[78,193221,96426],{},[78,193223,193224],{"class":124,"line":433},[78,193225,96431],{},[13,193227,96434],{},[13,193229,96437],{},[13,193231,96440,193232,96446],{},[5009,193233,96445],{"href":96443,"rel":193234},[23647],[7759,193236,96449],{"id":96449},[10548,193238,96453],{"id":96452},[49,193240,193241,193243],{},[52,193242,96458],{},[52,193244,96461],{},[72,193246,193247],{},[13,193248,96466,193249,96472],{},[5009,193250,96471],{"href":96469,"rel":193251},[23647],[10548,193253,96476],{"id":96475},[13,193255,96479],{},[13,193257,96482],{},[72,193259,193260],{},[13,193261,96487],{},[13,193263,96490],{},[13,193265,193266],{},[617,193267],{"alt":119,"src":96495},[13,193269,96498],{},[13,193271,96501],{},[13,193273,96504],{},[72,193275,193276],{},[13,193277,96509],{},[10548,193279,96513],{"id":96512},[13,193281,96516],{},[72,193283,193284,193286,193288,193290],{},[13,193285,96521],{},[13,193287,96524],{},[13,193289,96527],{},[13,193291,96530],{},[72,193293,193294,193296,193298,193300,193308,193310,193320,193322],{},[13,193295,96535],{},[13,193297,96538],{},[13,193299,96541],{},[13,193301,96544,193302,96547,193304,43673,193306],{},[78,193303,19],{},[78,193305,5535],{},[78,193307,96552],{},[13,193309,96555],{},[13,193311,43693,193312,96561,193314,96564,193316,5037,193318],{},[78,193313,96560],{},[78,193315,96560],{},[78,193317,96567],{},[78,193319,96570],{},[13,193321,96573],{},[13,193323,96576],{},[13,193325,96579],{},[13,193327,96582],{},[13,193329,193330],{},[617,193331],{"alt":119,"src":96587},[13,193333,96590],{},[10548,193335,96594],{"id":96593},[13,193337,96597],{},[13,193339,96600],{},[72,193341,193342],{},[13,193343,96605],{},[10548,193345,96609],{"id":96608},[13,193347,96612],{},[49,193349,193350,193352],{},[52,193351,96617],{},[52,193353,96620],{},[13,193355,193356],{},[617,193357],{"alt":119,"src":96625},[10548,193359,96629],{"id":96628},[49,193361,193362,193364,193366,193368,193370,193372,193374,193376,193378],{},[52,193363,96634],{},[52,193365,96637],{},[52,193367,96640],{},[52,193369,96643],{},[52,193371,96646],{},[52,193373,96649],{},[52,193375,96652],{},[52,193377,96655],{},[52,193379,96658],{},[23289,193381],{},[107,193383,96663],{"id":96663},[72,193385,193386],{},[13,193387,96668],{},[7759,193389,96672],{"id":96671},[13,193391,96675],{},[13,193393,96678],{},[13,193395,96681],{},[13,193397,96684],{},[13,193399,96687],{},[13,193401,96690],{},[13,193403,96693],{},[13,193405,96696],{},[7759,193407,96700],{"id":96699},[10548,193409,96704],{"id":96703},[13,193411,96707],{},[13,193413,96710],{},[10548,193415,96714],{"id":96713},[13,193417,96717],{},[13,193419,96720],{},[13,193421,96723],{},[7759,193423,96727],{"id":96726},[10548,193425,96731],{"id":96730},[13,193427,193428],{},[617,193429],{"alt":96736,"src":96737},[13,193431,96740],{},[13,193433,96743],{},[13,193435,96746],{},[10548,193437,96750],{"id":96749},[13,193439,96753],{},[13,193441,193442],{},[617,193443],{"alt":617,"src":96758},[13,193445,96761,193446,96765,193448,96769],{},[617,193447],{"alt":617,"src":96764},[617,193449],{"alt":617,"src":96768},[13,193451,193452],{},[617,193453],{"alt":96774,"src":96775},[13,193455,96778],{},[13,193457,193458],{},[617,193459],{"alt":96783,"src":96784},[13,193461,96787],{},[10548,193463,96791],{"id":96790},[13,193465,96794],{},[13,193467,96797],{},[7759,193469,96801],{"id":96800},[114,193471,193472],{"className":116,"code":96804,"language":118,"meta":119,"style":119},[17,193473,193474,193478,193482,193486,193490,193494,193498,193502,193506,193510,193514,193518,193522,193526,193530,193534,193538,193542,193546,193550,193554,193558,193562,193566,193570,193574,193578,193582,193586,193590,193594,193598,193602,193606,193610,193614,193618,193622,193626,193630,193634,193638,193642,193646,193650,193654,193658,193662,193666,193670,193674,193678,193682,193686,193690,193694,193698,193702,193706,193710,193714,193718,193722,193726,193730,193734,193738,193742,193746,193750,193754,193758,193762,193766,193770,193774,193778,193782,193786,193790],{"__ignoreMap":119},[78,193475,193476],{"class":124,"line":125},[78,193477,46260],{},[78,193479,193480],{"class":124,"line":132},[78,193481,96815],{},[78,193483,193484],{"class":124,"line":138},[78,193485,129],{"emptyLinePlaceholder":128},[78,193487,193488],{"class":124,"line":144},[78,193489,96824],{},[78,193491,193492],{"class":124,"line":150},[78,193493,96829],{},[78,193495,193496],{"class":124,"line":156},[78,193497,96834],{},[78,193499,193500],{"class":124,"line":162},[78,193501,96839],{},[78,193503,193504],{"class":124,"line":168},[78,193505,96844],{},[78,193507,193508],{"class":124,"line":174},[78,193509,96849],{},[78,193511,193512],{"class":124,"line":180},[78,193513,96854],{},[78,193515,193516],{"class":124,"line":186},[78,193517,96859],{},[78,193519,193520],{"class":124,"line":192},[78,193521,96864],{},[78,193523,193524],{"class":124,"line":198},[78,193525,96869],{},[78,193527,193528],{"class":124,"line":204},[78,193529,96874],{},[78,193531,193532],{"class":124,"line":210},[78,193533,96879],{},[78,193535,193536],{"class":124,"line":216},[78,193537,96884],{},[78,193539,193540],{"class":124,"line":222},[78,193541,96889],{},[78,193543,193544],{"class":124,"line":421},[78,193545,96894],{},[78,193547,193548],{"class":124,"line":427},[78,193549,96899],{},[78,193551,193552],{"class":124,"line":433},[78,193553,96904],{},[78,193555,193556],{"class":124,"line":2443},[78,193557,7680],{},[78,193559,193560],{"class":124,"line":2448},[78,193561,129],{"emptyLinePlaceholder":128},[78,193563,193564],{"class":124,"line":2454},[78,193565,6472],{},[78,193567,193568],{"class":124,"line":2460},[78,193569,96921],{},[78,193571,193572],{"class":124,"line":2465},[78,193573,96926],{},[78,193575,193576],{"class":124,"line":2470},[78,193577,96931],{},[78,193579,193580],{"class":124,"line":2903},[78,193581,96936],{},[78,193583,193584],{"class":124,"line":2909},[78,193585,96941],{},[78,193587,193588],{"class":124,"line":11477},[78,193589,96946],{},[78,193591,193592],{"class":124,"line":13374},[78,193593,96951],{},[78,193595,193596],{"class":124,"line":13380},[78,193597,96936],{},[78,193599,193600],{"class":124,"line":13386},[78,193601,6507],{},[78,193603,193604],{"class":124,"line":13722},[78,193605,129],{"emptyLinePlaceholder":128},[78,193607,193608],{"class":124,"line":13727},[78,193609,96968],{},[78,193611,193612],{"class":124,"line":13953},[78,193613,96973],{},[78,193615,193616],{"class":124,"line":13958},[78,193617,96978],{},[78,193619,193620],{"class":124,"line":13964},[78,193621,96983],{},[78,193623,193624],{"class":124,"line":13969},[78,193625,96988],{},[78,193627,193628],{"class":124,"line":24170},[78,193629,96993],{},[78,193631,193632],{"class":124,"line":24175},[78,193633,96998],{},[78,193635,193636],{"class":124,"line":24180},[78,193637,97003],{},[78,193639,193640],{"class":124,"line":24186},[78,193641,96859],{},[78,193643,193644],{"class":124,"line":24192},[78,193645,97012],{},[78,193647,193648],{"class":124,"line":24198},[78,193649,97017],{},[78,193651,193652],{"class":124,"line":24204},[78,193653,97022],{},[78,193655,193656],{"class":124,"line":24210},[78,193657,97027],{},[78,193659,193660],{"class":124,"line":24215},[78,193661,97032],{},[78,193663,193664],{"class":124,"line":24220},[78,193665,97037],{},[78,193667,193668],{"class":124,"line":24226},[78,193669,97042],{},[78,193671,193672],{"class":124,"line":24232},[78,193673,129],{"emptyLinePlaceholder":128},[78,193675,193676],{"class":124,"line":24238},[78,193677,97051],{},[78,193679,193680],{"class":124,"line":24244},[78,193681,97056],{},[78,193683,193684],{"class":124,"line":24250},[78,193685,97061],{},[78,193687,193688],{"class":124,"line":24256},[78,193689,97066],{},[78,193691,193692],{"class":124,"line":24262},[78,193693,97071],{},[78,193695,193696],{"class":124,"line":24267},[78,193697,97076],{},[78,193699,193700],{"class":124,"line":24273},[78,193701,97081],{},[78,193703,193704],{"class":124,"line":24279},[78,193705,129],{"emptyLinePlaceholder":128},[78,193707,193708],{"class":124,"line":24284},[78,193709,6472],{},[78,193711,193712],{"class":124,"line":24290},[78,193713,96926],{},[78,193715,193716],{"class":124,"line":24296},[78,193717,96931],{},[78,193719,193720],{"class":124,"line":24302},[78,193721,96936],{},[78,193723,193724],{"class":124,"line":24308},[78,193725,97106],{},[78,193727,193728],{"class":124,"line":24314},[78,193729,97111],{},[78,193731,193732],{"class":124,"line":24320},[78,193733,97116],{},[78,193735,193736],{"class":124,"line":24325},[78,193737,97121],{},[78,193739,193740],{"class":124,"line":24331},[78,193741,97126],{},[78,193743,193744],{"class":124,"line":25115},[78,193745,97131],{},[78,193747,193748],{"class":124,"line":25121},[78,193749,6507],{},[78,193751,193752],{"class":124,"line":25127},[78,193753,129],{"emptyLinePlaceholder":128},[78,193755,193756],{"class":124,"line":25132},[78,193757,97144],{},[78,193759,193760],{"class":124,"line":25137},[78,193761,97149],{},[78,193763,193764],{"class":124,"line":25143},[78,193765,97154],{},[78,193767,193768],{"class":124,"line":25149},[78,193769,129],{"emptyLinePlaceholder":128},[78,193771,193772],{"class":124,"line":25155},[78,193773,97163],{},[78,193775,193776],{"class":124,"line":25161},[78,193777,97168],{},[78,193779,193780],{"class":124,"line":25166},[78,193781,97173],{},[78,193783,193784],{"class":124,"line":25172},[78,193785,97178],{},[78,193787,193788],{"class":124,"line":25178},[78,193789,97183],{},[78,193791,193792],{"class":124,"line":25184},[78,193793,97188],{},[13,193795,97191],{},[13,193797,97194,193798,97198],{},[17,193799,97197],{},[13,193801,97201],{},[13,193803,97204],{},[7759,193805,97208],{"id":97207},[13,193807,97211],{},[13,193809,97214],{},[13,193811,97217],{},[13,193813,97220],{},[13,193815,97223],{},[7759,193817,97226],{"id":97226},[13,193819,193820,97231,193822,97234],{},[78,193821,469],{},[78,193823,83893],{},[13,193825,193826,97239,193828,21291,193830,21291],{},[78,193827,472],{},[78,193829,97242],{},[5009,193831,97245],{"href":97245,"rel":193832},[23647],[13,193834,193835,97251,193837,21291,193839],{},[78,193836,1025],{},[78,193838,97242],{},[5009,193840,97256],{"href":97256,"rel":193841},[23647],[13,193843,193844,97262,193846,21291,193848],{},[78,193845,1014],{},[78,193847,97242],{},[5009,193849,97267],{"href":97267,"rel":193850},[23647],[13,193852,193853,97273,193855,21291,193857],{},[78,193854,11047],{},[78,193856,97242],{},[5009,193858,97278],{"href":97278,"rel":193859},[23647],[226,193861,228],{},{"title":119,"searchDepth":144,"depth":144,"links":193863},[193864,193865],{"id":96449,"depth":144,"text":96449},{"id":96663,"depth":132,"text":96663,"children":193866},[193867,193868,193869,193870,193871,193872],{"id":96671,"depth":144,"text":96672},{"id":96699,"depth":144,"text":96700},{"id":96726,"depth":144,"text":96727},{"id":96800,"depth":144,"text":96801},{"id":97207,"depth":144,"text":97208},{"id":97226,"depth":144,"text":97226},{},{"title":96215,"description":96220},[14968,7744,246,23378,6380,14542],{"id":97301,"title":97302,"assetBase":239,"author":8,"body":193877,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":194973,"navigation":128,"originalPath":99002,"path":99003,"seo":194974,"source":23330,"stem":99005,"tags":194975,"weight":250,"__hash__":99007},{"type":10,"value":193878,"toc":194924},[193879,193881,193891,193893,193895,193907,193909,193911,193913,193915,193917,193919,193921,193923,193925,193927,193935,193937,193941,193943,193951,193953,193955,193959,193961,193963,193965,193967,193969,193971,193973,193975,193977,193979,193981,193983,193985,193989,193993,193995,193999,194001,194003,194005,194007,194011,194015,194019,194021,194023,194025,194027,194029,194031,194033,194035,194037,194039,194041,194043,194045,194047,194049,194051,194053,194055,194057,194059,194061,194063,194065,194067,194069,194071,194073,194075,194077,194079,194081,194083,194087,194089,194093,194095,194099,194101,194105,194107,194111,194113,194115,194117,194119,194123,194125,194127,194129,194131,194133,194135,194137,194139,194141,194143,194145,194147,194151,194153,194155,194157,194167,194171,194173,194175,194177,194179,194181,194183,194185,194187,194189,194193,194195,194197,194201,194203,194205,194207,194209,194211,194213,194215,194217,194219,194221,194223,194227,194229,194231,194233,194235,194237,194239,194241,194243,194245,194247,194249,194251,194253,194267,194269,194271,194275,194285,194287,194289,194297,194299,194301,194313,194315,194317,194319,194325,194327,194345,194347,194349,194351,194353,194357,194359,194363,194365,194367,194369,194373,194375,194377,194379,194381,194383,194385,194445,194447,194449,194453,194455,194457,194459,194461,194463,194465,194469,194471,194473,194475,194477,194479,194481,194483,194485,194487,194489,194491,194493,194495,194497,194499,194501,194503,194505,194507,194509,194511,194513,194515,194517,194547,194549,194551,194553,194555,194557,194559,194561,194563,194565,194567,194569,194571,194573,194575,194577,194579,194587,194589,194591,194597,194599,194601,194613,194615,194617,194619,194621,194623,194625,194629,194631,194635,194637,194639,194641,194643,194645,194647,194651,194653,194655,194657,194659,194685,194687,194689,194691,194693,194705,194707,194709,194711,194713,194715,194717,194719,194721,194723,194725,194727,194729,194731,194733,194735,194737,194741,194743,194745,194747,194749,194751,194753,194755,194759,194761,194763,194767,194769,194771,194773,194775,194783,194785,194787,194799,194801,194803,194813,194815,194817,194819,194823,194827,194829,194831,194833,194835,194837,194839,194841,194843,194845,194847,194849,194851,194853,194855,194857,194859,194861,194863,194865,194867,194869,194871,194875,194877,194879,194881,194883,194885,194887,194889,194891,194893,194895,194897,194899,194901,194903,194905,194907,194909,194911,194913,194918,194920,194922],[4517,193880,97308],{"id":97307},[72,193882,193883,193887,193889],{},[13,193884,193885],{},[22,193886,23957],{},[13,193888,97317],{},[13,193890,97320],{},[107,193892,97324],{"id":97323},[7759,193894,97328],{"id":97327},[13,193896,97331,193897,97335,193899,97339,193901,1011,193903,1011,193905,97349],{},[22,193898,97334],{},[22,193900,97338],{},[22,193902,97342],{},[22,193904,97345],{},[22,193906,97348],{},[10548,193908,97353],{"id":97352},[10548,193910,97357],{"id":97356},[10548,193912,97361],{"id":97360},[10548,193914,97365],{"id":97364},[10548,193916,97369],{"id":97368},[7759,193918,97373],{"id":97372},[13,193920,97376],{},[10548,193922,97380],{"id":97379},[13,193924,97383],{},[10548,193926,97387],{"id":97386},[13,193928,97390,193929,1011,193931,52204,193933,97400],{},[22,193930,97393],{},[22,193932,97396],{},[22,193934,97399],{},[10548,193936,97404],{"id":97403},[13,193938,97407,193939,97411],{},[22,193940,97410],{},[10548,193942,97415],{"id":97414},[13,193944,97418,193945,1011,193947,52204,193949,97428],{},[22,193946,97421],{},[22,193948,97424],{},[22,193950,97427],{},[7759,193952,97432],{"id":97431},[13,193954,97435],{},[13,193956,193957],{},[22,193958,97440],{},[10548,193960,97444],{"id":97443},[13,193962,97447],{},[10548,193964,97451],{"id":97450},[13,193966,97454],{},[10548,193968,97458],{"id":97457},[13,193970,97461],{},[10548,193972,97465],{"id":97464},[13,193974,97468],{},[13,193976,97471],{},[10548,193978,97475],{"id":97474},[13,193980,97478],{},[7759,193982,97482],{"id":97481},[13,193984,97485],{},[13,193986,193987],{},[617,193988],{"alt":97490,"src":97491},[13,193990,97494,193991,97498],{},[22,193992,97497],{},[13,193994,97501],{},[13,193996,193997],{},[22,193998,97506],{},[23289,194000],{},[107,194002,97512],{"id":97511},[7759,194004,97516],{"id":97515},[13,194006,97519],{},[13,194008,194009],{},[617,194010],{"alt":97524,"src":97525},[13,194012,194013],{},[22,194014,97530],{},[13,194016,194017],{},[617,194018],{"alt":97535,"src":97536},[10548,194020,97540],{"id":97539},[13,194022,97543],{},[10548,194024,97547],{"id":97546},[13,194026,97550],{},[10548,194028,97554],{"id":97553},[13,194030,97557],{},[10548,194032,97561],{"id":97560},[13,194034,97564],{},[10548,194036,97568],{"id":97567},[13,194038,97571],{},[10548,194040,97575],{"id":97574},[13,194042,97578],{},[10548,194044,97582],{"id":97581},[13,194046,97585],{},[10548,194048,97588],{"id":44924},[13,194050,97591],{},[10548,194052,97595],{"id":97594},[13,194054,97598],{},[10548,194056,97602],{"id":97601},[13,194058,97605],{},[10548,194060,97609],{"id":97608},[13,194062,97612],{},[10548,194064,97616],{"id":97615},[13,194066,97619],{},[10548,194068,97623],{"id":97622},[13,194070,97626],{},[10548,194072,97630],{"id":97629},[13,194074,97633],{},[10548,194076,97637],{"id":97636},[13,194078,97640],{},[7759,194080,97644],{"id":97643},[13,194082,97647],{},[13,194084,194085],{},[617,194086],{"alt":97652,"src":97653},[7759,194088,97657],{"id":97656},[13,194090,194091],{},[22,194092,97662],{},[10548,194094,97666],{"id":97665},[13,194096,97669,194097],{},[22,194098,97672],{},[10548,194100,97676],{"id":97675},[13,194102,97679,194103],{},[22,194104,97682],{},[10548,194106,97686],{"id":97685},[13,194108,97689,194109],{},[22,194110,97692],{},[23289,194112],{},[107,194114,97698],{"id":97697},[7759,194116,97702],{"id":97701},[13,194118,97705],{},[13,194120,97708,194121,97712],{},[22,194122,97711],{},[10548,194124,97716],{"id":97715},[13,194126,97719],{},[10548,194128,97723],{"id":97722},[13,194130,97726],{},[10548,194132,97730],{"id":97729},[13,194134,97733],{},[10548,194136,97737],{"id":97736},[13,194138,97740],{},[10548,194140,97744],{"id":97743},[13,194142,97747],{},[13,194144,97750],{},[13,194146,97753],{},[13,194148,194149],{},[617,194150],{"alt":97758,"src":97759},[7759,194152,97763],{"id":97762},[13,194154,97766],{},[10548,194156,97769],{"id":97769},[13,194158,97772,194159,97776,194161,97780,194163,97784,194165,97788],{},[22,194160,97775],{},[22,194162,97779],{},[22,194164,97783],{},[22,194166,97787],{},[13,194168,194169],{},[617,194170],{"alt":97793,"src":97794},[10548,194172,97797],{"id":97797},[13,194174,97800],{},[13,194176,97803],{},[13,194178,97806],{},[13,194180,97809],{},[13,194182,97812],{},[13,194184,97815],{},[13,194186,97818],{},[7759,194188,97822],{"id":97821},[13,194190,97825,194191,97829],{},[22,194192,97828],{},[10548,194194,97769],{"id":97832},[13,194196,97835],{},[13,194198,194199],{},[617,194200],{"alt":97840,"src":97841},[10548,194202,97797],{"id":97844},[13,194204,97847],{},[13,194206,97850],{},[13,194208,97853],{},[13,194210,97856],{},[13,194212,97859],{},[13,194214,97862],{},[13,194216,97865],{},[7759,194218,97869],{"id":97868},[13,194220,97872],{},[13,194222,97875],{},[13,194224,97878,194225,97882],{},[22,194226,97881],{},[13,194228,97885],{},[10548,194230,97889],{"id":97888},[13,194232,97892],{},[10548,194234,97896],{"id":97895},[13,194236,97899],{},[10548,194238,97903],{"id":97902},[13,194240,97906],{},[10548,194242,97910],{"id":97909},[13,194244,97913],{},[13,194246,97916],{},[10548,194248,97920],{"id":97919},[13,194250,97923],{},[13,194252,97926],{},[49,194254,194255,194259,194263],{},[52,194256,194257,97934],{},[22,194258,97933],{},[52,194260,194261,97940],{},[22,194262,97939],{},[52,194264,194265,97946],{},[22,194266,97945],{},[10548,194268,97950],{"id":97949},[13,194270,97953],{},[13,194272,97956,194273],{},[22,194274,97959],{},[49,194276,194277,194279,194281,194283],{},[52,194278,97964],{},[52,194280,97967],{},[52,194282,97970],{},[52,194284,97973],{},[10548,194286,97977],{"id":97976},[13,194288,97980],{},[49,194290,194291,194293,194295],{},[52,194292,97985],{},[52,194294,97988],{},[52,194296,97991],{},[13,194298,97994],{},[10548,194300,97797],{"id":97997},[49,194302,194303,194305,194307,194309,194311],{},[52,194304,98002],{},[52,194306,98005],{},[52,194308,98008],{},[52,194310,98011],{},[52,194312,98014],{},[13,194314,98017],{},[7759,194316,98021],{"id":98020},[10548,194318,20689],{"id":20689},[49,194320,194321,194323],{},[52,194322,98028],{},[52,194324,98031],{},[10548,194326,20692],{"id":20692},[49,194328,194329,194333,194337,194341],{},[52,194330,194331,98041],{},[22,194332,98040],{},[52,194334,194335,98047],{},[22,194336,98046],{},[52,194338,194339,98053],{},[22,194340,98052],{},[52,194342,194343,98059],{},[22,194344,98058],{},[23289,194346],{},[107,194348,98065],{"id":98064},[7759,194350,98069],{"id":98068},[13,194352,98072],{},[13,194354,194355],{},[617,194356],{"alt":98077,"src":98078},[10548,194358,98082],{"id":98081},[13,194360,98085,194361,98089],{},[22,194362,98088],{},[10548,194364,98093],{"id":98092},[13,194366,98096],{},[10548,194368,98100],{"id":98099},[13,194370,98103,194371,98107],{},[22,194372,98106],{},[10548,194374,98111],{"id":98110},[13,194376,98114],{},[10548,194378,98118],{"id":98117},[13,194380,98121],{},[7759,194382,98125],{"id":98124},[10548,194384,98129],{"id":98128},[8366,194386,194387,194395],{},[8369,194388,194389],{},[8372,194390,194391,194393],{},[8375,194392,98138],{"align":9247},[8375,194394,42815],{"align":9247},[8386,194396,194397,194403,194409,194415,194421,194427,194433,194439],{},[8372,194398,194399,194401],{},[8391,194400,98147],{"align":9247},[8391,194402,98150],{"align":9247},[8372,194404,194405,194407],{},[8391,194406,98155],{"align":9247},[8391,194408,98158],{"align":9247},[8372,194410,194411,194413],{},[8391,194412,98163],{"align":9247},[8391,194414,98166],{"align":9247},[8372,194416,194417,194419],{},[8391,194418,98171],{"align":9247},[8391,194420,98174],{"align":9247},[8372,194422,194423,194425],{},[8391,194424,98179],{"align":9247},[8391,194426,98182],{"align":9247},[8372,194428,194429,194431],{},[8391,194430,98187],{"align":9247},[8391,194432,98190],{"align":9247},[8372,194434,194435,194437],{},[8391,194436,98195],{"align":9247},[8391,194438,98198],{"align":9247},[8372,194440,194441,194443],{},[8391,194442,98203],{"align":9247},[8391,194444,98206],{"align":9247},[13,194446,98209],{},[13,194448,98212],{},[13,194450,194451],{},[22,194452,98217],{},[7759,194454,98221],{"id":98220},[10548,194456,98225],{"id":98224},[13,194458,98228],{},[13,194460,98231],{},[13,194462,98234],{},[13,194464,98237],{},[13,194466,194467],{},[22,194468,98242],{},[10548,194470,98246],{"id":98245},[13,194472,98249],{},[10548,194474,98253],{"id":98252},[13,194476,98256],{},[10548,194478,98260],{"id":98259},[13,194480,98263],{},[10548,194482,98267],{"id":98266},[13,194484,98270],{},[10548,194486,98274],{"id":98273},[13,194488,98277],{},[10548,194490,98281],{"id":98280},[13,194492,98284],{},[23289,194494],{},[107,194496,98290],{"id":98289},[7759,194498,98294],{"id":98293},[10548,194500,98298],{"id":98297},[13,194502,98301],{},[13,194504,98304],{},[13,194506,98307],{},[13,194508,98310],{},[13,194510,98313],{},[10548,194512,98317],{"id":98316},[13,194514,98320],{},[10548,194516,98324],{"id":98323},[8366,194518,194519,194527],{},[8369,194520,194521],{},[8372,194522,194523,194525],{},[8375,194524,98333],{"align":9247},[8375,194526,98317],{"align":9247},[8386,194528,194529,194535,194541],{},[8372,194530,194531,194533],{},[8391,194532,98342],{"align":9247},[8391,194534,98345],{"align":9247},[8372,194536,194537,194539],{},[8391,194538,98350],{"align":9247},[8391,194540,43024],{"align":9247},[8372,194542,194543,194545],{},[8391,194544,98357],{"align":9247},[8391,194546,98360],{"align":9247},[13,194548,98363],{},[39316,194550,98366],{"id":98366},[10548,194552,98370],{"id":98369},[13,194554,98373],{},[10548,194556,98377],{"id":98376},[13,194558,98380],{},[13,194560,98383],{},[10548,194562,98387],{"id":98386},[13,194564,98390],{},[13,194566,98393],{},[10548,194568,98397],{"id":98396},[13,194570,98400],{},[7759,194572,98404],{"id":98403},[13,194574,98407],{},[10548,194576,98411],{"id":98410},[13,194578,98414],{},[49,194580,194581,194583,194585],{},[52,194582,98419],{},[52,194584,98422],{},[52,194586,98425],{},[10548,194588,98429],{"id":98428},[13,194590,98432],{},[49,194592,194593,194595],{},[52,194594,98437],{},[52,194596,98440],{},[10548,194598,98444],{"id":98443},[13,194600,98447],{},[49,194602,194603,194605,194607,194609,194611],{},[52,194604,98452],{},[52,194606,98455],{},[52,194608,98458],{},[52,194610,98461],{},[52,194612,98464],{},[7759,194614,98468],{"id":98467},[13,194616,98471],{},[13,194618,98474],{},[23289,194620],{},[107,194622,98480],{"id":98479},[13,194624,98483],{},[13,194626,194627],{},[22,194628,98488],{},[7759,194630,98492],{"id":98491},[13,194632,98495,194633,98498],{},[22,194634,42812],{},[10548,194636,98502],{"id":98501},[13,194638,98505],{},[10548,194640,98509],{"id":98508},[13,194642,98512],{},[10548,194644,98516],{"id":98515},[13,194646,98519],{},[13,194648,98522,194649,98526],{},[22,194650,98525],{},[7759,194652,98530],{"id":98529},[13,194654,98533],{},[10548,194656,98537],{"id":98536},[13,194658,98540],{},[49,194660,194661,194667,194673,194679],{},[52,194662,98545,194663],{},[49,194664,194665],{},[52,194666,98550],{},[52,194668,98553,194669],{},[49,194670,194671],{},[52,194672,98558],{},[52,194674,98561,194675],{},[49,194676,194677],{},[52,194678,98566],{},[52,194680,98569,194681],{},[49,194682,194683],{},[52,194684,98574],{},[10548,194686,98578],{"id":98577},[13,194688,98581],{},[10548,194690,98585],{"id":98584},[13,194692,98588],{},[49,194694,194695,194697,194699,194701,194703],{},[52,194696,98593],{},[52,194698,98596],{},[52,194700,98599],{},[52,194702,98602],{},[52,194704,98605],{},[7759,194706,98609],{"id":98608},[13,194708,98612],{},[13,194710,98615],{},[13,194712,98618],{},[10548,194714,98621],{"id":98621},[13,194716,98624],{},[13,194718,98627],{},[13,194720,98630],{},[13,194722,98633],{},[13,194724,98636],{},[23289,194726],{},[107,194728,98642],{"id":98641},[7759,194730,98646],{"id":98645},[13,194732,98649],{},[10548,194734,98652],{"id":98652},[13,194736,98655],{},[13,194738,194739],{},[617,194740],{"alt":98660,"src":98661},[10548,194742,98664],{"id":98664},[13,194744,98667],{},[13,194746,98670],{},[13,194748,98673],{},[10548,194750,98676],{"id":98676},[13,194752,98679],{},[13,194754,98682],{},[13,194756,194757],{},[617,194758],{"alt":98676,"src":98687},[7759,194760,98691],{"id":98690},[13,194762,98694],{},[13,194764,194765],{},[617,194766],{"alt":98699,"src":98700},[10548,194768,98704],{"id":98703},[13,194770,98707],{},[10548,194772,98710],{"id":43941},[13,194774,98713],{},[49,194776,194777,194779,194781],{},[52,194778,98718],{},[52,194780,98721],{},[52,194782,98724],{},[10548,194784,98728],{"id":98727},[13,194786,98731],{},[49,194788,194789,194791,194793,194795,194797],{},[52,194790,98736],{},[52,194792,98739],{},[52,194794,98742],{},[52,194796,98745],{},[52,194798,98748],{},[10548,194800,98752],{"id":98751},[13,194802,98755],{},[49,194804,194805,194807,194809,194811],{},[52,194806,98760],{},[52,194808,98763],{},[52,194810,98766],{},[52,194812,98769],{},[23289,194814],{},[107,194816,98775],{"id":98774},[7759,194818,98779],{"id":98778},[13,194820,98782,194821,98786],{},[22,194822,98785],{},[13,194824,194825],{},[617,194826],{"alt":98791,"src":98792},[13,194828,98795],{},[10548,194830,98799],{"id":98798},[13,194832,98802],{},[10548,194834,98806],{"id":98805},[13,194836,98809],{},[10548,194838,98813],{"id":98812},[13,194840,98816],{},[10548,194842,98820],{"id":98819},[13,194844,98823],{},[10548,194846,98827],{"id":98826},[13,194848,98830],{},[10548,194850,98834],{"id":98833},[13,194852,98837],{},[10548,194854,98841],{"id":98840},[13,194856,98844],{},[10548,194858,98848],{"id":98847},[13,194860,98851],{},[10548,194862,98855],{"id":98854},[13,194864,98858],{},[7759,194866,98862],{"id":98861},[13,194868,98865],{},[13,194870,98868],{},[13,194872,194873],{},[617,194874],{"alt":98873,"src":98874},[39316,194876,98877],{"id":98877},[10548,194878,98881],{"id":98880},[13,194880,98884],{},[10548,194882,98888],{"id":98887},[13,194884,98891],{},[10548,194886,98895],{"id":98894},[13,194888,98898],{},[39316,194890,98901],{"id":98901},[10548,194892,98905],{"id":98904},[13,194894,98908],{},[10548,194896,98912],{"id":98911},[13,194898,98915],{},[10548,194900,98919],{"id":98918},[13,194902,98922],{},[23289,194904],{},[107,194906,25480],{"id":25480},[13,194908,98929],{},[13,194910,98932],{},[13,194912,98935],{},[13,194914,194915],{},[5009,194916,98942],{"href":98940,"rel":194917},[23647],[13,194919,98945],{},[13,194921,98948],{},[13,194923,98951],{},{"title":119,"searchDepth":144,"depth":144,"links":194925},[194926,194932,194937,194944,194949,194956,194961,194965,194972],{"id":97323,"depth":132,"text":97324,"children":194927},[194928,194929,194930,194931],{"id":97327,"depth":144,"text":97328},{"id":97372,"depth":144,"text":97373},{"id":97431,"depth":144,"text":97432},{"id":97481,"depth":144,"text":97482},{"id":97511,"depth":132,"text":97512,"children":194933},[194934,194935,194936],{"id":97515,"depth":144,"text":97516},{"id":97643,"depth":144,"text":97644},{"id":97656,"depth":144,"text":97657},{"id":97697,"depth":132,"text":97698,"children":194938},[194939,194940,194941,194942,194943],{"id":97701,"depth":144,"text":97702},{"id":97762,"depth":144,"text":97763},{"id":97821,"depth":144,"text":97822},{"id":97868,"depth":144,"text":97869},{"id":98020,"depth":144,"text":98021},{"id":98064,"depth":132,"text":98065,"children":194945},[194946,194947,194948],{"id":98068,"depth":144,"text":98069},{"id":98124,"depth":144,"text":98125},{"id":98220,"depth":144,"text":98221},{"id":98289,"depth":132,"text":98290,"children":194950},[194951,194954,194955],{"id":98293,"depth":144,"text":98294,"children":194952},[194953],{"id":98366,"depth":150,"text":98366},{"id":98403,"depth":144,"text":98404},{"id":98467,"depth":144,"text":98468},{"id":98479,"depth":132,"text":98480,"children":194957},[194958,194959,194960],{"id":98491,"depth":144,"text":98492},{"id":98529,"depth":144,"text":98530},{"id":98608,"depth":144,"text":98609},{"id":98641,"depth":132,"text":98642,"children":194962},[194963,194964],{"id":98645,"depth":144,"text":98646},{"id":98690,"depth":144,"text":98691},{"id":98774,"depth":132,"text":98775,"children":194966},[194967,194968],{"id":98778,"depth":144,"text":98779},{"id":98861,"depth":144,"text":98862,"children":194969},[194970,194971],{"id":98877,"depth":150,"text":98877},{"id":98901,"depth":150,"text":98901},{"id":25480,"depth":132,"text":25480},{},{"title":97302,"description":119},[14968,7744,246,23378,10715,6380,14542],{"id":99009,"title":99010,"assetBase":239,"author":8,"body":194977,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":195352,"navigation":128,"originalPath":99472,"path":99473,"seo":195353,"source":23330,"stem":99475,"tags":195354,"weight":250,"__hash__":99477},{"type":10,"value":194978,"toc":195341},[194979,194981,194983,194985,194987,194989,194991,194993,194995,194997,195005,195007,195009,195011,195013,195015,195017,195019,195021,195249,195251,195253,195255,195335,195337,195339],[107,194980,99016],{"id":99015},[7759,194982,99019],{"id":99019},[13,194984,99022],{},[13,194986,99025],{},[7759,194988,99028],{"id":99028},[13,194990,99031],{},[13,194992,99034],{},[13,194994,99037],{},[13,194996,99040],{},[114,194998,194999],{"className":33693,"code":119,"language":33695,"meta":119,"style":119},[17,195000,195001],{"__ignoreMap":119},[78,195002,195003],{"class":124,"line":125},[78,195004,119],{},[23289,195006],{},[107,195008,99054],{"id":99053},[7759,195010,99019],{"id":99057},[13,195012,99060],{},[13,195014,99063],{},[7759,195016,99028],{"id":99066},[13,195018,99069],{},[13,195020,99072],{},[114,195022,195023],{"className":99075,"code":99076,"language":99077,"meta":119,"style":119},[17,195024,195025,195029,195033,195037,195041,195045,195049,195053,195057,195061,195065,195069,195073,195077,195081,195085,195089,195093,195097,195101,195105,195109,195113,195117,195121,195125,195129,195133,195137,195141,195145,195149,195153,195157,195161,195165,195169,195173,195177,195181,195185,195189,195193,195197,195201,195205,195209,195213,195217,195221,195225,195229,195233,195237,195241,195245],{"__ignoreMap":119},[78,195026,195027],{"class":124,"line":125},[78,195028,99084],{},[78,195030,195031],{"class":124,"line":132},[78,195032,99089],{},[78,195034,195035],{"class":124,"line":138},[78,195036,99094],{},[78,195038,195039],{"class":124,"line":144},[78,195040,99099],{},[78,195042,195043],{"class":124,"line":150},[78,195044,99104],{},[78,195046,195047],{"class":124,"line":156},[78,195048,67099],{},[78,195050,195051],{"class":124,"line":162},[78,195052,99113],{},[78,195054,195055],{"class":124,"line":168},[78,195056,99118],{},[78,195058,195059],{"class":124,"line":174},[78,195060,99123],{},[78,195062,195063],{"class":124,"line":180},[78,195064,99094],{},[78,195066,195067],{"class":124,"line":186},[78,195068,99132],{},[78,195070,195071],{"class":124,"line":192},[78,195072,99137],{},[78,195074,195075],{"class":124,"line":198},[78,195076,99142],{},[78,195078,195079],{"class":124,"line":204},[78,195080,99147],{},[78,195082,195083],{"class":124,"line":210},[78,195084,99152],{},[78,195086,195087],{"class":124,"line":216},[78,195088,99157],{},[78,195090,195091],{"class":124,"line":222},[78,195092,99162],{},[78,195094,195095],{"class":124,"line":421},[78,195096,99167],{},[78,195098,195099],{"class":124,"line":427},[78,195100,99172],{},[78,195102,195103],{"class":124,"line":433},[78,195104,99177],{},[78,195106,195107],{"class":124,"line":2443},[78,195108,99182],{},[78,195110,195111],{"class":124,"line":2448},[78,195112,99187],{},[78,195114,195115],{"class":124,"line":2454},[78,195116,99192],{},[78,195118,195119],{"class":124,"line":2460},[78,195120,99197],{},[78,195122,195123],{"class":124,"line":2465},[78,195124,8041],{},[78,195126,195127],{"class":124,"line":2470},[78,195128,67084],{},[78,195130,195131],{"class":124,"line":2903},[78,195132,99210],{},[78,195134,195135],{"class":124,"line":2909},[78,195136,99215],{},[78,195138,195139],{"class":124,"line":11477},[78,195140,67099],{},[78,195142,195143],{"class":124,"line":13374},[78,195144,99224],{},[78,195146,195147],{"class":124,"line":13380},[78,195148,99229],{},[78,195150,195151],{"class":124,"line":13386},[78,195152,99234],{},[78,195154,195155],{"class":124,"line":13722},[78,195156,67109],{},[78,195158,195159],{"class":124,"line":13727},[78,195160,99243],{},[78,195162,195163],{"class":124,"line":13953},[78,195164,99123],{},[78,195166,195167],{"class":124,"line":13958},[78,195168,99252],{},[78,195170,195171],{"class":124,"line":13964},[78,195172,99257],{},[78,195174,195175],{"class":124,"line":13969},[78,195176,99262],{},[78,195178,195179],{"class":124,"line":24170},[78,195180,6942],{},[78,195182,195183],{"class":124,"line":24175},[78,195184,99271],{},[78,195186,195187],{"class":124,"line":24180},[78,195188,99276],{},[78,195190,195191],{"class":124,"line":24186},[78,195192,99281],{},[78,195194,195195],{"class":124,"line":24192},[78,195196,99286],{},[78,195198,195199],{"class":124,"line":24198},[78,195200,99291],{},[78,195202,195203],{"class":124,"line":24204},[78,195204,99296],{},[78,195206,195207],{"class":124,"line":24210},[78,195208,129],{"emptyLinePlaceholder":128},[78,195210,195211],{"class":124,"line":24215},[78,195212,99305],{},[78,195214,195215],{"class":124,"line":24220},[78,195216,99310],{},[78,195218,195219],{"class":124,"line":24226},[78,195220,99315],{},[78,195222,195223],{"class":124,"line":24232},[78,195224,99320],{},[78,195226,195227],{"class":124,"line":24238},[78,195228,99325],{},[78,195230,195231],{"class":124,"line":24244},[78,195232,99330],{},[78,195234,195235],{"class":124,"line":24250},[78,195236,129],{"emptyLinePlaceholder":128},[78,195238,195239],{"class":124,"line":24256},[78,195240,99339],{},[78,195242,195243],{"class":124,"line":24262},[78,195244,99344],{},[78,195246,195247],{"class":124,"line":24267},[78,195248,99349],{},[7759,195250,99028],{"id":99352},[13,195252,99355],{},[13,195254,99358],{},[114,195256,195257],{"className":99075,"code":99361,"language":99077,"meta":119,"style":119},[17,195258,195259,195263,195267,195271,195275,195279,195283,195287,195291,195295,195299,195303,195307,195311,195315,195319,195323,195327,195331],{"__ignoreMap":119},[78,195260,195261],{"class":124,"line":125},[78,195262,99368],{},[78,195264,195265],{"class":124,"line":132},[78,195266,67084],{},[78,195268,195269],{"class":124,"line":138},[78,195270,99377],{},[78,195272,195273],{"class":124,"line":144},[78,195274,99382],{},[78,195276,195277],{"class":124,"line":150},[78,195278,67099],{},[78,195280,195281],{"class":124,"line":156},[78,195282,99224],{},[78,195284,195285],{"class":124,"line":162},[78,195286,99229],{},[78,195288,195289],{"class":124,"line":168},[78,195290,99234],{},[78,195292,195293],{"class":124,"line":174},[78,195294,67109],{},[78,195296,195297],{"class":124,"line":180},[78,195298,99407],{},[78,195300,195301],{"class":124,"line":186},[78,195302,99305],{},[78,195304,195305],{"class":124,"line":192},[78,195306,99416],{},[78,195308,195309],{"class":124,"line":198},[78,195310,99421],{},[78,195312,195313],{"class":124,"line":204},[78,195314,99426],{},[78,195316,195317],{"class":124,"line":210},[78,195318,99431],{},[78,195320,195321],{"class":124,"line":216},[78,195322,99436],{},[78,195324,195325],{"class":124,"line":222},[78,195326,99441],{},[78,195328,195329],{"class":124,"line":421},[78,195330,99446],{},[78,195332,195333],{"class":124,"line":427},[78,195334,99451],{},[13,195336,99454],{},[13,195338,99457],{},[226,195340,228],{},{"title":119,"searchDepth":144,"depth":144,"links":195342},[195343,195347],{"id":99015,"depth":132,"text":99016,"children":195344},[195345,195346],{"id":99019,"depth":144,"text":99019},{"id":99028,"depth":144,"text":99028},{"id":99053,"depth":132,"text":99054,"children":195348},[195349,195350,195351],{"id":99057,"depth":144,"text":99019},{"id":99066,"depth":144,"text":99028},{"id":99352,"depth":144,"text":99028},{},{"title":99010,"description":119},[246,10715,35725],{"id":99479,"title":99480,"assetBase":239,"author":8,"body":195356,"category":25506,"collection":23324,"date":23325,"description":99491,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":197038,"navigation":128,"originalPath":101231,"path":101232,"seo":197039,"source":23330,"stem":101234,"tags":197040,"weight":250,"__hash__":101236},{"type":10,"value":195357,"toc":197028},[195358,195360,195364,195370,195372,195374,195376,195378,195380,195384,195386,195388,195390,195398,195400,195402,195404,195406,195408,195412,195524,195526,195528,195530,196000,196004,196010,196012,196014,196018,196391,196393,196397,196633,196635,196637,197022,197024,197026],[4517,195359,99486],{"id":99485},[13,195361,195362],{},[22,195363,99491],{},[72,195365,195366],{},[13,195367,195368],{},[22,195369,25537],{},[7759,195371,68112],{"id":68112},[13,195373,99502],{},[7759,195375,99505],{"id":68121},[13,195377,99508],{},[13,195379,99511],{},[13,195381,195382],{},[617,195383],{"alt":99516,"src":25603},[13,195385,99519],{},[13,195387,99522],{},[13,195389,99525],{},[49,195391,195392,195394,195396],{},[52,195393,99530],{},[52,195395,99533],{},[52,195397,99536],{},[7759,195399,99540],{"id":99539},[13,195401,99543],{},[13,195403,99546],{},[13,195405,99549],{},[7759,195407,99553],{"id":99552},[13,195409,99556,195410,99559],{},[25921,195411,262],{},[78,195413,195415],{"className":195414},[4566],[78,195416,195418,195443],{"className":195417},[4570],[78,195419,195421],{"className":195420},[4574],[4576,195422,195423],{"xmlns":4578,"display":4579},[4581,195424,195425,195441],{},[4584,195426,195427],{},[4614,195428,195429,195431],{},[4596,195430,27152],{},[4584,195432,195433,195439],{},[4600,195434,195435,195437],{},[4596,195436,5053],{},[4596,195438,262],{},[4596,195440,5074],{},[4647,195442,99591],{"encoding":4649},[78,195444,195446],{"className":195445,"ariaHidden":1419},[4654],[78,195447,195449,195452],{"className":195448},[4658],[78,195450],{"className":195451,"style":91855},[4662],[78,195453,195455,195458],{"className":195454},[4667],[78,195456,27152],{"className":195457,"style":38285},[4667,4678],[78,195459,195461],{"className":195460},[4689],[78,195462,195464],{"className":195463},[4693],[78,195465,195467],{"className":195466},[4698],[78,195468,195470],{"className":195469,"style":91855},[4702],[78,195471,195472,195475],{"style":5209},[78,195473],{"className":195474,"style":4711},[4710],[78,195476,195478],{"className":195477},[4715,4716,4717,4718],[78,195479,195481,195521],{"className":195480},[4667,4718],[78,195482,195484,195487],{"className":195483},[4667,4718],[78,195485,5053],{"className":195486,"style":5170},[4667,4678,4718],[78,195488,195490],{"className":195489},[4689],[78,195491,195493,195513],{"className":195492},[4693,4694],[78,195494,195496,195510],{"className":195495},[4698],[78,195497,195499],{"className":195498,"style":99648},[4702],[78,195500,195501,195504],{"style":99651},[78,195502],{"className":195503,"style":4896},[4710],[78,195505,195507],{"className":195506},[4715,4900,4901,4718],[78,195508,262],{"className":195509},[4667,4678,4718],[78,195511,4726],{"className":195512},[4725],[78,195514,195516],{"className":195515},[4698],[78,195517,195519],{"className":195518,"style":84716},[4702],[78,195520],{},[78,195522,5074],{"className":195523,"style":5219},[4667,4678,4718],[13,195525,99677],{},[39316,195527,99681],{"id":99680},[13,195529,99684],{},[78,195531,195533],{"className":195532},[4566],[78,195534,195536,195625],{"className":195535},[4570],[78,195537,195539],{"className":195538},[4574],[4576,195540,195541],{"xmlns":4578,"display":4579},[4581,195542,195543,195623],{},[4584,195544,195545,195547,195549,195551,195553,195567,195569,195583,195585,195587,195589,195591,195593,195607,195609],{},[4596,195546,7065],{},[4596,195548,19],{},[4596,195550,7360],{},[4591,195552,8661],{},[4614,195554,195555,195557],{},[4596,195556,27152],{},[4584,195558,195559,195565],{},[4600,195560,195561,195563],{},[4596,195562,5053],{},[4596,195564,262],{},[4596,195566,5074],{},[4591,195568,52231],{},[4614,195570,195571,195573],{},[4596,195572,5042],{},[4584,195574,195575,195581],{},[4600,195576,195577,195579],{},[4596,195578,5053],{},[4596,195580,5535],{},[4596,195582,5074],{},[4587,195584,52204],{},[4596,195586,27107],{},[4596,195588,4618],{},[4596,195590,7360],{},[4591,195592,8661],{},[4614,195594,195595,195597],{},[4596,195596,5042],{},[4584,195598,195599,195605],{},[4600,195600,195601,195603],{},[4596,195602,5053],{},[4596,195604,5535],{},[4596,195606,5074],{},[4591,195608,52231],{},[4614,195610,195611,195613],{},[4596,195612,27152],{},[4584,195614,195615,195621],{},[4600,195616,195617,195619],{},[4596,195618,5053],{},[4596,195620,262],{},[4596,195622,5074],{},[4647,195624,99780],{"encoding":4649},[78,195626,195628,195652,195739,195835,195922],{"className":195627,"ariaHidden":1419},[4654],[78,195629,195631,195634,195637,195640,195643,195646,195649],{"className":195630},[4658],[78,195632],{"className":195633,"style":18224},[4662],[78,195635,7065],{"className":195636,"style":7153},[4667,4678],[78,195638,19],{"className":195639},[4667,4678],[78,195641,7360],{"className":195642},[4667,4678],[78,195644],{"className":195645,"style":4740},[4739],[78,195647,8661],{"className":195648},[4744],[78,195650],{"className":195651,"style":4740},[4739],[78,195653,195655,195658,195730,195733,195736],{"className":195654},[4658],[78,195656],{"className":195657,"style":91855},[4662],[78,195659,195661,195664],{"className":195660},[4667],[78,195662,27152],{"className":195663,"style":38285},[4667,4678],[78,195665,195667],{"className":195666},[4689],[78,195668,195670],{"className":195669},[4693],[78,195671,195673],{"className":195672},[4698],[78,195674,195676],{"className":195675,"style":91855},[4702],[78,195677,195678,195681],{"style":5209},[78,195679],{"className":195680,"style":4711},[4710],[78,195682,195684],{"className":195683},[4715,4716,4717,4718],[78,195685,195687,195727],{"className":195686},[4667,4718],[78,195688,195690,195693],{"className":195689},[4667,4718],[78,195691,5053],{"className":195692,"style":5170},[4667,4678,4718],[78,195694,195696],{"className":195695},[4689],[78,195697,195699,195719],{"className":195698},[4693,4694],[78,195700,195702,195716],{"className":195701},[4698],[78,195703,195705],{"className":195704,"style":99648},[4702],[78,195706,195707,195710],{"style":99651},[78,195708],{"className":195709,"style":4896},[4710],[78,195711,195713],{"className":195712},[4715,4900,4901,4718],[78,195714,262],{"className":195715},[4667,4678,4718],[78,195717,4726],{"className":195718},[4725],[78,195720,195722],{"className":195721},[4698],[78,195723,195725],{"className":195724,"style":84716},[4702],[78,195726],{},[78,195728,5074],{"className":195729,"style":5219},[4667,4678,4718],[78,195731],{"className":195732,"style":4740},[4739],[78,195734,52231],{"className":195735},[4744],[78,195737],{"className":195738,"style":4740},[4739],[78,195740,195742,195745,195817,195820,195823,195826,195829,195832],{"className":195741},[4658],[78,195743],{"className":195744,"style":91855},[4662],[78,195746,195748,195751],{"className":195747},[4667],[78,195749,5042],{"className":195750,"style":5143},[4667,4678],[78,195752,195754],{"className":195753},[4689],[78,195755,195757],{"className":195756},[4693],[78,195758,195760],{"className":195759},[4698],[78,195761,195763],{"className":195762,"style":91855},[4702],[78,195764,195765,195768],{"style":5209},[78,195766],{"className":195767,"style":4711},[4710],[78,195769,195771],{"className":195770},[4715,4716,4717,4718],[78,195772,195774,195814],{"className":195773},[4667,4718],[78,195775,195777,195780],{"className":195776},[4667,4718],[78,195778,5053],{"className":195779,"style":5170},[4667,4678,4718],[78,195781,195783],{"className":195782},[4689],[78,195784,195786,195806],{"className":195785},[4693,4694],[78,195787,195789,195803],{"className":195788},[4698],[78,195790,195792],{"className":195791,"style":7272},[4702],[78,195793,195794,195797],{"style":99950},[78,195795],{"className":195796,"style":4896},[4710],[78,195798,195800],{"className":195799},[4715,4900,4901,4718],[78,195801,5535],{"className":195802,"style":5578},[4667,4678,4718],[78,195804,4726],{"className":195805},[4725],[78,195807,195809],{"className":195808},[4698],[78,195810,195812],{"className":195811,"style":7310},[4702],[78,195813],{},[78,195815,5074],{"className":195816,"style":5219},[4667,4678,4718],[78,195818,52204],{"className":195819},[4667,6184],[78,195821,27107],{"className":195822,"style":17251},[4667,4678],[78,195824,99983],{"className":195825},[4667,4678],[78,195827],{"className":195828,"style":4740},[4739],[78,195830,8661],{"className":195831},[4744],[78,195833],{"className":195834,"style":4740},[4739],[78,195836,195838,195841,195913,195916,195919],{"className":195837},[4658],[78,195839],{"className":195840,"style":91855},[4662],[78,195842,195844,195847],{"className":195843},[4667],[78,195845,5042],{"className":195846,"style":5143},[4667,4678],[78,195848,195850],{"className":195849},[4689],[78,195851,195853],{"className":195852},[4693],[78,195854,195856],{"className":195855},[4698],[78,195857,195859],{"className":195858,"style":91855},[4702],[78,195860,195861,195864],{"style":5209},[78,195862],{"className":195863,"style":4711},[4710],[78,195865,195867],{"className":195866},[4715,4716,4717,4718],[78,195868,195870,195910],{"className":195869},[4667,4718],[78,195871,195873,195876],{"className":195872},[4667,4718],[78,195874,5053],{"className":195875,"style":5170},[4667,4678,4718],[78,195877,195879],{"className":195878},[4689],[78,195880,195882,195902],{"className":195881},[4693,4694],[78,195883,195885,195899],{"className":195884},[4698],[78,195886,195888],{"className":195887,"style":7272},[4702],[78,195889,195890,195893],{"style":99950},[78,195891],{"className":195892,"style":4896},[4710],[78,195894,195896],{"className":195895},[4715,4900,4901,4718],[78,195897,5535],{"className":195898,"style":5578},[4667,4678,4718],[78,195900,4726],{"className":195901},[4725],[78,195903,195905],{"className":195904},[4698],[78,195906,195908],{"className":195907,"style":7310},[4702],[78,195909],{},[78,195911,5074],{"className":195912,"style":5219},[4667,4678,4718],[78,195914],{"className":195915,"style":4740},[4739],[78,195917,52231],{"className":195918},[4744],[78,195920],{"className":195921,"style":4740},[4739],[78,195923,195925,195928],{"className":195924},[4658],[78,195926],{"className":195927,"style":91855},[4662],[78,195929,195931,195934],{"className":195930},[4667],[78,195932,27152],{"className":195933,"style":38285},[4667,4678],[78,195935,195937],{"className":195936},[4689],[78,195938,195940],{"className":195939},[4693],[78,195941,195943],{"className":195942},[4698],[78,195944,195946],{"className":195945,"style":91855},[4702],[78,195947,195948,195951],{"style":5209},[78,195949],{"className":195950,"style":4711},[4710],[78,195952,195954],{"className":195953},[4715,4716,4717,4718],[78,195955,195957,195997],{"className":195956},[4667,4718],[78,195958,195960,195963],{"className":195959},[4667,4718],[78,195961,5053],{"className":195962,"style":5170},[4667,4678,4718],[78,195964,195966],{"className":195965},[4689],[78,195967,195969,195989],{"className":195968},[4693,4694],[78,195970,195972,195986],{"className":195971},[4698],[78,195973,195975],{"className":195974,"style":99648},[4702],[78,195976,195977,195980],{"style":99651},[78,195978],{"className":195979,"style":4896},[4710],[78,195981,195983],{"className":195982},[4715,4900,4901,4718],[78,195984,262],{"className":195985},[4667,4678,4718],[78,195987,4726],{"className":195988},[4725],[78,195990,195992],{"className":195991},[4698],[78,195993,195995],{"className":195994,"style":84716},[4702],[78,195996],{},[78,195998,5074],{"className":195999,"style":5219},[4667,4678,4718],[13,196001,100160,196002,100163],{},[25921,196003,5535],{},[13,196005,100166,196006,100169,196008,100172],{},[25921,196007,5535],{},[25921,196009,262],{},[39316,196011,100176],{"id":100175},[13,196013,100179],{},[13,196015,196016,100185],{},[22,196017,100184],{},[78,196019,196021],{"className":196020},[4566],[78,196022,196024,196115],{"className":196023},[4570],[78,196025,196027],{"className":196026},[4574],[4576,196028,196029],{"xmlns":4578,"display":4579},[4581,196030,196031,196113],{},[4584,196032,196033,196035,196037,196039,196041,196043,196057,196059,196073,196075,196077,196079,196081,196083,196089,196091,196093,196095,196097,196099,196101,196103,196105,196107,196109,196111],{},[4587,196034,100203],{},[4596,196036,7065],{},[4596,196038,19],{},[4596,196040,7360],{},[4591,196042,8661],{},[4614,196044,196045,196047],{},[4596,196046,27152],{},[4584,196048,196049,196055],{},[4600,196050,196051,196053],{},[4596,196052,5053],{},[4596,196054,262],{},[4596,196056,5074],{},[4591,196058,52231],{},[4614,196060,196061,196063],{},[4596,196062,5042],{},[4584,196064,196065,196067,196069,196071],{},[7077,196066,100236],{},[4596,196068,5074],{},[4591,196070,43664],{},[7077,196072,1044],{},[4587,196074,100245],{},[4596,196076,27107],{},[4596,196078,4618],{},[4596,196080,7360],{},[4587,196082,100254],{},[4600,196084,196085,196087],{},[4596,196086,5053],{},[4596,196088,262],{},[4591,196090,4609],{},[7077,196092,1021],{},[4596,196094,5535],{},[4596,196096,100269],{},[4596,196098,25949],{},[4587,196100,100274],{},[4596,196102,63346],{"mathvariant":7101},[4596,196104,5042],{},[4596,196106,63346],{"mathvariant":7101},[4591,196108,4609],{},[7077,196110,100285],{},[4587,196112,67],{},[4647,196114,100290],{"encoding":4649},[78,196116,196118,196145,196232,196340,196379],{"className":196117,"ariaHidden":1419},[4654],[78,196119,196121,196124,196127,196130,196133,196136,196139,196142],{"className":196120},[4658],[78,196122],{"className":196123,"style":18224},[4662],[78,196125,100203],{"className":196126},[4667,6184],[78,196128,7065],{"className":196129,"style":7153},[4667,4678],[78,196131,19],{"className":196132},[4667,4678],[78,196134,7360],{"className":196135},[4667,4678],[78,196137],{"className":196138,"style":4740},[4739],[78,196140,8661],{"className":196141},[4744],[78,196143],{"className":196144,"style":4740},[4739],[78,196146,196148,196151,196223,196226,196229],{"className":196147},[4658],[78,196149],{"className":196150,"style":91855},[4662],[78,196152,196154,196157],{"className":196153},[4667],[78,196155,27152],{"className":196156,"style":38285},[4667,4678],[78,196158,196160],{"className":196159},[4689],[78,196161,196163],{"className":196162},[4693],[78,196164,196166],{"className":196165},[4698],[78,196167,196169],{"className":196168,"style":91855},[4702],[78,196170,196171,196174],{"style":5209},[78,196172],{"className":196173,"style":4711},[4710],[78,196175,196177],{"className":196176},[4715,4716,4717,4718],[78,196178,196180,196220],{"className":196179},[4667,4718],[78,196181,196183,196186],{"className":196182},[4667,4718],[78,196184,5053],{"className":196185,"style":5170},[4667,4678,4718],[78,196187,196189],{"className":196188},[4689],[78,196190,196192,196212],{"className":196191},[4693,4694],[78,196193,196195,196209],{"className":196194},[4698],[78,196196,196198],{"className":196197,"style":99648},[4702],[78,196199,196200,196203],{"style":99651},[78,196201],{"className":196202,"style":4896},[4710],[78,196204,196206],{"className":196205},[4715,4900,4901,4718],[78,196207,262],{"className":196208},[4667,4678,4718],[78,196210,4726],{"className":196211},[4725],[78,196213,196215],{"className":196214},[4698],[78,196216,196218],{"className":196217,"style":84716},[4702],[78,196219],{},[78,196221,5074],{"className":196222,"style":5219},[4667,4678,4718],[78,196224],{"className":196225,"style":4740},[4739],[78,196227,52231],{"className":196228},[4744],[78,196230],{"className":196231,"style":4740},[4739],[78,196233,196235,196238,196279,196282,196285,196288,196291,196331,196334,196337],{"className":196234},[4658],[78,196236],{"className":196237,"style":85831},[4662],[78,196239,196241,196244],{"className":196240},[4667],[78,196242,5042],{"className":196243,"style":5143},[4667,4678],[78,196245,196247],{"className":196246},[4689],[78,196248,196250],{"className":196249},[4693],[78,196251,196253],{"className":196252},[4698],[78,196254,196256],{"className":196255,"style":5206},[4702],[78,196257,196258,196261],{"style":5209},[78,196259],{"className":196260,"style":4711},[4710],[78,196262,196264],{"className":196263},[4715,4716,4717,4718],[78,196265,196267,196270,196273,196276],{"className":196266},[4667,4718],[78,196268,100236],{"className":196269},[4667,4718],[78,196271,5074],{"className":196272,"style":5219},[4667,4678,4718],[78,196274,43664],{"className":196275},[7450,4718],[78,196277,1044],{"className":196278},[4667,4718],[78,196280,100245],{"className":196281},[4667,6184],[78,196283,27107],{"className":196284,"style":17251},[4667,4678],[78,196286,99983],{"className":196287},[4667,4678],[78,196289,100254],{"className":196290},[4667,6184],[78,196292,196294,196297],{"className":196293},[4667],[78,196295,5053],{"className":196296,"style":5170},[4667,4678],[78,196298,196300],{"className":196299},[4689],[78,196301,196303,196323],{"className":196302},[4693,4694],[78,196304,196306,196320],{"className":196305},[4698],[78,196307,196309],{"className":196308,"style":5279},[4702],[78,196310,196311,196314],{"style":100487},[78,196312],{"className":196313,"style":4711},[4710],[78,196315,196317],{"className":196316},[4715,4716,4717,4718],[78,196318,262],{"className":196319},[4667,4678,4718],[78,196321,4726],{"className":196322},[4725],[78,196324,196326],{"className":196325},[4698],[78,196327,196329],{"className":196328,"style":4733},[4702],[78,196330],{},[78,196332],{"className":196333,"style":4740},[4739],[78,196335,4609],{"className":196336},[4744],[78,196338],{"className":196339,"style":4740},[4739],[78,196341,196343,196346,196349,196352,196355,196358,196361,196364,196367,196370,196373,196376],{"className":196342},[4658],[78,196344],{"className":196345,"style":4663},[4662],[78,196347,1021],{"className":196348},[4667],[78,196350,5535],{"className":196351,"style":5578},[4667,4678],[78,196353,100269],{"className":196354,"style":100532},[4667,4678],[78,196356,25949],{"className":196357,"style":43903},[4667,4678],[78,196359,100274],{"className":196360},[4667,6184],[78,196362,63346],{"className":196363},[4667],[78,196365,5042],{"className":196366,"style":5143},[4667,4678],[78,196368,63346],{"className":196369},[4667],[78,196371],{"className":196372,"style":4740},[4739],[78,196374,4609],{"className":196375},[4744],[78,196377],{"className":196378,"style":4740},[4739],[78,196380,196382,196385,196388],{"className":196381},[4658],[78,196383],{"className":196384,"style":18224},[4662],[78,196386,100285],{"className":196387},[4667],[78,196389,67],{"className":196390},[4667,6184],[13,196392,100571],{},[13,196394,196395,100577],{},[22,196396,100576],{},[78,196398,196400],{"className":196399},[4566],[78,196401,196403,196460],{"className":196402},[4570],[78,196404,196406],{"className":196405},[4574],[4576,196407,196408],{"xmlns":4578,"display":4579},[4581,196409,196410,196458],{},[4584,196411,196412,196414,196416,196418,196420,196422,196436,196438,196448,196450,196452,196454,196456],{},[4587,196413,100595],{},[4596,196415,43693],{},[4596,196417,4618],{},[4596,196419,5058],{},[4591,196421,8661],{},[4614,196423,196424,196426],{},[4596,196425,27152],{},[4584,196427,196428,196434],{},[4600,196429,196430,196432],{},[4596,196431,5053],{},[4596,196433,262],{},[4596,196435,5074],{},[4591,196437,52231],{},[4614,196439,196440,196442],{},[4596,196441,43693],{},[4584,196443,196444,196446],{},[7077,196445,22827],{},[4596,196447,5074],{},[4587,196449,94528],{},[7077,196451,22827],{},[4596,196453,100269],{},[4596,196455,25949],{},[4587,196457,100640],{},[4647,196459,100643],{"encoding":4649},[78,196461,196463,196490,196577],{"className":196462,"ariaHidden":1419},[4654],[78,196464,196466,196469,196472,196475,196478,196481,196484,196487],{"className":196465},[4658],[78,196467],{"className":196468,"style":18224},[4662],[78,196470,100595],{"className":196471},[4667,6184],[78,196473,43693],{"className":196474,"style":7153},[4667,4678],[78,196476,4618],{"className":196477},[4667,4678],[78,196479,5058],{"className":196480},[4667,4678],[78,196482],{"className":196483,"style":4740},[4739],[78,196485,8661],{"className":196486},[4744],[78,196488],{"className":196489,"style":4740},[4739],[78,196491,196493,196496,196568,196571,196574],{"className":196492},[4658],[78,196494],{"className":196495,"style":91855},[4662],[78,196497,196499,196502],{"className":196498},[4667],[78,196500,27152],{"className":196501,"style":38285},[4667,4678],[78,196503,196505],{"className":196504},[4689],[78,196506,196508],{"className":196507},[4693],[78,196509,196511],{"className":196510},[4698],[78,196512,196514],{"className":196513,"style":91855},[4702],[78,196515,196516,196519],{"style":5209},[78,196517],{"className":196518,"style":4711},[4710],[78,196520,196522],{"className":196521},[4715,4716,4717,4718],[78,196523,196525,196565],{"className":196524},[4667,4718],[78,196526,196528,196531],{"className":196527},[4667,4718],[78,196529,5053],{"className":196530,"style":5170},[4667,4678,4718],[78,196532,196534],{"className":196533},[4689],[78,196535,196537,196557],{"className":196536},[4693,4694],[78,196538,196540,196554],{"className":196539},[4698],[78,196541,196543],{"className":196542,"style":99648},[4702],[78,196544,196545,196548],{"style":99651},[78,196546],{"className":196547,"style":4896},[4710],[78,196549,196551],{"className":196550},[4715,4900,4901,4718],[78,196552,262],{"className":196553},[4667,4678,4718],[78,196555,4726],{"className":196556},[4725],[78,196558,196560],{"className":196559},[4698],[78,196561,196563],{"className":196562,"style":84716},[4702],[78,196564],{},[78,196566,5074],{"className":196567,"style":5219},[4667,4678,4718],[78,196569],{"className":196570,"style":4740},[4739],[78,196572,52231],{"className":196573},[4744],[78,196575],{"className":196576,"style":4740},[4739],[78,196578,196580,196583,196618,196621,196624,196627,196630],{"className":196579},[4658],[78,196581],{"className":196582,"style":5206},[4662],[78,196584,196586,196589],{"className":196585},[4667],[78,196587,43693],{"className":196588,"style":7153},[4667,4678],[78,196590,196592],{"className":196591},[4689],[78,196593,196595],{"className":196594},[4693],[78,196596,196598],{"className":196597},[4698],[78,196599,196601],{"className":196600,"style":5206},[4702],[78,196602,196603,196606],{"style":5209},[78,196604],{"className":196605,"style":4711},[4710],[78,196607,196609],{"className":196608},[4715,4716,4717,4718],[78,196610,196612,196615],{"className":196611},[4667,4718],[78,196613,22827],{"className":196614},[4667,4718],[78,196616,5074],{"className":196617,"style":5219},[4667,4678,4718],[78,196619,94528],{"className":196620},[4667,6184],[78,196622,22827],{"className":196623},[4667],[78,196625,100269],{"className":196626,"style":100532},[4667,4678],[78,196628,25949],{"className":196629,"style":43903},[4667,4678],[78,196631,100640],{"className":196632},[4667,6184],[13,196634,100819],{},[13,196636,100822],{},[78,196638,196640],{"className":196639},[4566],[78,196641,196643,196794],{"className":196642},[4570],[78,196644,196646],{"className":196645},[4574],[4576,196647,196648],{"xmlns":4578,"display":4579},[4581,196649,196650,196792],{},[4584,196651,196652,196654,196656,196658,196660,196662,196664,196666,196668,196670,196672,196674,196676,196678,196680,196682,196684,196686,196688,196690,196692,196694,196696,196698,196700,196702,196704,196706,196708,196710,196712,196714,196716,196718,196720,196722,196724,196726,196728,196730,196732,196734,196736,196738,196740,196742,196744,196746,196748,196750,196752,196754,196756,196758,196760,196762,196764,196766,196768,196770,196772,196774,196776,196778,196780,196782,196784,196786,196788,196790],{},[4596,196653,7062],{},[4591,196655,4594],{"stretchy":4593},[4596,196657,43693],{},[4596,196659,4618],{},[4596,196661,5058],{},[4591,196663,4594],{"stretchy":4593},[4596,196665,85783],{},[4591,196667,4604],{"stretchy":4593},[4591,196669,2066],{"separator":1419},[4596,196671,7065],{},[4596,196673,19],{},[4596,196675,7360],{},[4591,196677,4594],{"stretchy":4593},[4596,196679,85783],{},[4591,196681,4604],{"stretchy":4593},[4591,196683,4604],{"stretchy":4593},[4591,196685,4609],{},[4739,196687],{"linebreak":52940},[4596,196689,7062],{},[4591,196691,4594],{"stretchy":4593},[4596,196693,63331],{},[4596,196695,39],{},[4596,196697,19],{},[4596,196699,4618],{},[4591,196701,4594],{"stretchy":4593},[4596,196703,85783],{},[4591,196705,4604],{"stretchy":4593},[4596,196707,63346],{"mathvariant":7101},[4596,196709,43678],{},[4596,196711,5025],{},[4596,196713,5009],{},[4596,196715,17132],{},[4596,196717,262],{},[4596,196719,4618],{},[4591,196721,4594],{"stretchy":4593},[4596,196723,85783],{},[4591,196725,4604],{"stretchy":4593},[4591,196727,4604],{"stretchy":4593},[4739,196729],{"linebreak":52940},[4591,196731,17162],{"separator":1419},[4596,196733,7062],{},[4591,196735,4594],{"stretchy":4593},[4596,196737,43678],{},[4596,196739,5025],{},[4596,196741,5009],{},[4596,196743,17132],{},[4596,196745,262],{},[4596,196747,4618],{},[4591,196749,4594],{"stretchy":4593},[4596,196751,85783],{},[4591,196753,4604],{"stretchy":4593},[4596,196755,63346],{"mathvariant":7101},[4596,196757,43693],{},[4596,196759,4618],{},[4596,196761,5058],{},[4591,196763,4594],{"stretchy":4593},[4596,196765,85783],{},[4591,196767,4604],{"stretchy":4593},[4591,196769,4604],{"stretchy":4593},[4739,196771],{"linebreak":52940},[4591,196773,17162],{"separator":1419},[4596,196775,7062],{},[4591,196777,4594],{"stretchy":4593},[4596,196779,43693],{},[4596,196781,4618],{},[4596,196783,5058],{},[4591,196785,4594],{"stretchy":4593},[4596,196787,85783],{},[4591,196789,4604],{"stretchy":4593},[4591,196791,4604],{"stretchy":4593},[4647,196793,100980],{"encoding":4649},[78,196795,196797,196857,196860,196917,196920,196983,196986],{"className":196796,"ariaHidden":1419},[4654],[78,196798,196800,196803,196806,196809,196812,196815,196818,196821,196824,196827,196830,196833,196836,196839,196842,196845,196848,196851,196854],{"className":196799},[4658],[78,196801],{"className":196802,"style":4663},[4662],[78,196804,7062],{"className":196805,"style":5219},[4667,4678],[78,196807,4594],{"className":196808},[4674],[78,196810,43693],{"className":196811,"style":7153},[4667,4678],[78,196813,4618],{"className":196814},[4667,4678],[78,196816,5058],{"className":196817},[4667,4678],[78,196819,4594],{"className":196820},[4674],[78,196822,85783],{"className":196823,"style":85838},[4667,4678],[78,196825,4604],{"className":196826},[4682],[78,196828,2066],{"className":196829},[5126],[78,196831],{"className":196832,"style":4839},[4739],[78,196834,7065],{"className":196835,"style":7153},[4667,4678],[78,196837,19],{"className":196838},[4667,4678],[78,196840,7360],{"className":196841},[4667,4678],[78,196843,4594],{"className":196844},[4674],[78,196846,85783],{"className":196847,"style":85838},[4667,4678],[78,196849,38757],{"className":196850},[4682],[78,196852],{"className":196853,"style":4740},[4739],[78,196855,4609],{"className":196856},[4744],[78,196858],{"className":196859},[4739,52940],[78,196861,196863,196866,196869,196872,196875,196878,196881,196884,196887,196890,196893,196896,196899,196902,196905,196908,196911,196914],{"className":196862},[4658],[78,196864],{"className":196865,"style":4663},[4662],[78,196867,7062],{"className":196868,"style":5219},[4667,4678],[78,196870,4594],{"className":196871},[4674],[78,196873,63331],{"className":196874,"style":5219},[4667,4678],[78,196876,7201],{"className":196877},[4667,4678],[78,196879,4618],{"className":196880},[4667,4678],[78,196882,4594],{"className":196883},[4674],[78,196885,85783],{"className":196886,"style":85838},[4667,4678],[78,196888,4604],{"className":196889},[4682],[78,196891,63346],{"className":196892},[4667],[78,196894,43678],{"className":196895,"style":5133},[4667,4678],[78,196897,5025],{"className":196898},[4667,4678],[78,196900,5009],{"className":196901},[4667,4678],[78,196903,17132],{"className":196904,"style":17251},[4667,4678],[78,196906,101095],{"className":196907},[4667,4678],[78,196909,4594],{"className":196910},[4674],[78,196912,85783],{"className":196913,"style":85838},[4667,4678],[78,196915,38757],{"className":196916},[4682],[78,196918],{"className":196919},[4739,52940],[78,196921,196923,196926,196929,196932,196935,196938,196941,196944,196947,196950,196953,196956,196959,196962,196965,196968,196971,196974,196977,196980],{"className":196922},[4658],[78,196924],{"className":196925,"style":4663},[4662],[78,196927,17162],{"className":196928},[5126],[78,196930],{"className":196931,"style":4839},[4739],[78,196933,7062],{"className":196934,"style":5219},[4667,4678],[78,196936,4594],{"className":196937},[4674],[78,196939,43678],{"className":196940,"style":5133},[4667,4678],[78,196942,5025],{"className":196943},[4667,4678],[78,196945,5009],{"className":196946},[4667,4678],[78,196948,17132],{"className":196949,"style":17251},[4667,4678],[78,196951,101095],{"className":196952},[4667,4678],[78,196954,4594],{"className":196955},[4674],[78,196957,85783],{"className":196958,"style":85838},[4667,4678],[78,196960,4604],{"className":196961},[4682],[78,196963,63346],{"className":196964},[4667],[78,196966,43693],{"className":196967,"style":7153},[4667,4678],[78,196969,4618],{"className":196970},[4667,4678],[78,196972,5058],{"className":196973},[4667,4678],[78,196975,4594],{"className":196976},[4674],[78,196978,85783],{"className":196979,"style":85838},[4667,4678],[78,196981,38757],{"className":196982},[4682],[78,196984],{"className":196985},[4739,52940],[78,196987,196989,196992,196995,196998,197001,197004,197007,197010,197013,197016,197019],{"className":196988},[4658],[78,196990],{"className":196991,"style":4663},[4662],[78,196993,17162],{"className":196994},[5126],[78,196996],{"className":196997,"style":4839},[4739],[78,196999,7062],{"className":197000,"style":5219},[4667,4678],[78,197002,4594],{"className":197003},[4674],[78,197005,43693],{"className":197006,"style":7153},[4667,4678],[78,197008,4618],{"className":197009},[4667,4678],[78,197011,5058],{"className":197012},[4667,4678],[78,197014,4594],{"className":197015},[4674],[78,197017,85783],{"className":197018,"style":85838},[4667,4678],[78,197020,38757],{"className":197021},[4682],[13,197023,101212],{},[13,197025,101215],{},[39316,197027,101219],{"id":101218},{"title":119,"searchDepth":144,"depth":144,"links":197029},[197030,197031,197032,197033],{"id":68112,"depth":144,"text":68112},{"id":68121,"depth":144,"text":99505},{"id":99539,"depth":144,"text":99540},{"id":99552,"depth":144,"text":99553,"children":197034},[197035,197036,197037],{"id":99680,"depth":150,"text":99681},{"id":100175,"depth":150,"text":100176},{"id":101218,"depth":150,"text":101219},{},{"title":99480,"description":99491},[794,246,14542],{"id":101238,"title":101239,"assetBase":239,"author":8,"body":197042,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":197046,"navigation":128,"originalPath":101245,"path":101246,"seo":197047,"source":23330,"stem":101248,"tags":197048,"weight":250,"__hash__":101250},{"type":10,"value":197043,"toc":197044},[],{"title":119,"searchDepth":144,"depth":144,"links":197045},[],{},{"title":101239,"description":119},[2708],{"id":101252,"title":101253,"assetBase":239,"author":8,"body":197050,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":199131,"navigation":128,"originalPath":103849,"path":103850,"seo":199132,"source":23330,"stem":103852,"tags":199133,"weight":250,"__hash__":103854},{"type":10,"value":197051,"toc":199104},[197052,197054,197056,197058,197060,197062,197064,197066,197070,197074,197078,197080,197082,197084,197088,197090,197094,197096,197098,197132,197134,197136,197138,197140,197174,197176,197178,197192,197194,197196,197202,197204,197206,197208,197210,197212,197216,197218,197220,197222,197226,197228,197232,197234,197236,197278,197282,197284,197286,197288,197292,197294,197296,197300,197302,197304,197306,197308,197350,197352,197356,197360,197362,197364,197366,197436,197438,197466,197468,197470,197472,197476,197478,197532,197534,197536,197538,197542,197544,197546,197572,197574,197576,197578,197580,197582,197602,197604,197606,197608,197610,197618,197622,197624,197716,197718,197730,197732,197736,197738,197746,197748,197872,197874,198302,198304,198308,198310,198318,198320,198400,198402,198558,198560,198562,198564,198572,198574,198576,198684,198686,198902,198904,198970,198972,199036,199038,199102],[107,197053,101259],{"id":101258},[7759,197055,48732],{"id":48731},[13,197057,48282],{},[13,197059,48285],{},[13,197061,48288],{},[13,197063,48291],{},[7759,197065,101273],{"id":101272},[13,197067,197068,101279],{},[22,197069,101278],{},[13,197071,197072,101285],{},[22,197073,101284],{},[72,197075,197076],{},[13,197077,101290],{},[13,197079,101293],{},[13,197081,101296],{},[7759,197083,101300],{"id":101299},[13,197085,197086],{},[617,197087],{"alt":119,"src":101305},[7759,197089,101309],{"id":101308},[13,197091,197092],{},[617,197093],{"alt":119,"src":101314},[23289,197095],{},[107,197097,101320],{"id":101319},[8366,197099,197100,197110],{},[8369,197101,197102],{},[8372,197103,197104,197106,197108],{},[8375,197105,101329],{},[8375,197107,20689],{},[8375,197109,20692],{},[8386,197111,197112,197122],{},[8372,197113,197114,197118,197120],{},[8391,197115,197116],{},[22,197117,101342],{},[8391,197119,101345],{},[8391,197121,101348],{},[8372,197123,197124,197128,197130],{},[8391,197125,197126],{},[22,197127,101355],{},[8391,197129,101358],{},[8391,197131,101361],{},[13,197133,101364],{},[7759,197135,101368],{"id":101367},[13,197137,101371],{},[13,197139,101374],{},[8366,197141,197142,197152],{},[8369,197143,197144],{},[8372,197145,197146,197148,197150],{},[8375,197147,101383],{},[8375,197149,101386],{},[8375,197151,101389],{},[8386,197153,197154,197164],{},[8372,197155,197156,197160,197162],{},[8391,197157,197158],{},[22,197159,101398],{},[8391,197161,101401],{},[8391,197163,101404],{},[8372,197165,197166,197170,197172],{},[8391,197167,197168],{},[22,197169,101411],{},[8391,197171,101414],{},[8391,197173,101417],{},[7759,197175,101421],{"id":101420},[13,197177,101424],{},[72,197179,197180,197182,197188,197190],{},[13,197181,101429],{},[49,197183,197184,197186],{},[52,197185,101434],{},[52,197187,101437],{},[13,197189,101440],{},[13,197191,101443],{},[7759,197193,101447],{"id":101446},[13,197195,101450],{},[72,197197,197198,197200],{},[13,197199,101455],{},[13,197201,101458],{},[23289,197203],{},[107,197205,101464],{"id":101463},[7759,197207,101467],{"id":62488},[13,197209,101470],{},[7759,197211,101474],{"id":101473},[13,197213,197214],{},[617,197215],{"alt":119,"src":101479},[7759,197217,101483],{"id":101482},[10548,197219,101487],{"id":101486},[13,197221,101490],{},[49,197223,197224],{},[52,197225,101495],{},[13,197227,101498],{},[49,197229,197230],{},[52,197231,101503],{},[13,197233,101506],{},[13,197235,101509],{},[49,197237,197238],{},[52,197239,101514,197240],{},[49,197241,197242,197252,197260,197268],{},[52,197243,101519,197244],{},[49,197245,197246,197248,197250],{},[52,197247,101524],{},[52,197249,101527],{},[52,197251,101530],{},[52,197253,101533,197254],{},[49,197255,197256,197258],{},[52,197257,101538],{},[52,197259,101541],{},[52,197261,101544,197262],{},[49,197263,197264,197266],{},[52,197265,101549],{},[52,197267,101552],{},[52,197269,101555,197270],{},[49,197271,197272,197274,197276],{},[52,197273,101560],{},[52,197275,101563],{},[52,197277,101566],{},[13,197279,197280],{},[22,197281,101571],{},[10548,197283,31684],{"id":31683},[13,197285,101576],{},[13,197287,101579],{},[13,197289,197290],{},[22,197291,101584],{},[13,197293,101587],{},[107,197295,101591],{"id":101590},[72,197297,197298],{},[13,197299,101596],{},[7759,197301,101600],{"id":101599},[10548,197303,27707],{"id":27706},[13,197305,101605],{},[10548,197307,101609],{"id":101608},[49,197309,197310,197328,197336],{},[52,197311,101614,197312],{},[72,197313,197314],{},[49,197315,197316],{},[52,197317,101621,197318],{},[49,197319,197320,197322,197324],{},[52,197321,101626],{},[52,197323,101629],{},[52,197325,101632,197326],{},[22,197327,101635],{},[52,197329,101638,197330],{},[49,197331,197332],{},[52,197333,101643,197334,101647],{},[22,197335,101646],{},[52,197337,101650,197338],{},[49,197339,197340],{},[52,197341,101655,197342],{},[49,197343,197344,197346,197348],{},[52,197345,101660],{},[52,197347,101663],{},[52,197349,101666],{},[10548,197351,31907],{"id":31906},[13,197353,197354,101673],{},[22,197355,29763],{},[13,197357,197358,101678],{},[22,197359,31924],{},[13,197361,101681],{},[10548,197363,101685],{"id":101684},[13,197365,101688],{},[49,197367,197368,197380],{},[52,197369,101693,197370],{},[49,197371,197372,197376],{},[52,197373,197374,101700],{},[22,197375,20689],{},[52,197377,197378,101705],{},[22,197379,20692],{},[52,197381,101708,197382],{},[49,197383,197384,197434],{},[52,197385,101713,197386,101716,197388,197424],{},[2996,197387],{},[8366,197389,197390,197402],{},[8369,197391,197392],{},[8372,197393,197394,197396,197398,197400],{},[8375,197395,101725],{},[8375,197397,101728],{},[8375,197399,101731],{},[8375,197401,101734],{},[8386,197403,197404,197414],{},[8372,197405,197406,197408,197410,197412],{},[8391,197407,469],{},[8391,197409,101743],{},[8391,197411,101746],{},[8391,197413,101749],{},[8372,197415,197416,197418,197420,197422],{},[8391,197417,469],{},[8391,197419,101756],{},[8391,197421,101749],{},[8391,197423,101761],{},[72,197425,197426,197428],{},[13,197427,101766],{},[49,197429,197430,197432],{},[52,197431,101771],{},[52,197433,101774],{},[52,197435,101777],{},[10548,197437,101781],{"id":101780},[49,197439,197440,197454],{},[52,197441,101786,197442],{},[49,197443,197444],{},[52,197445,101791,197446],{},[49,197447,197448,197452],{},[52,197449,101796,197450],{},[22,197451,101799],{},[52,197453,101802],{},[52,197455,101805,197456],{},[49,197457,197458],{},[52,197459,101810,197460],{},[49,197461,197462,197464],{},[52,197463,101815],{},[52,197465,101818],{},[7759,197467,101822],{"id":101821},[10548,197469,27707],{"id":27766},[13,197471,101827],{},[49,197473,197474],{},[52,197475,101832],{},[10548,197477,101836],{"id":101835},[49,197479,197480,197498,197524],{},[52,197481,101841,197482],{},[49,197483,197484,197488,197490],{},[52,197485,101846,197486,101849],{},[2996,197487],{},[52,197489,101852],{},[52,197491,101855,197492],{},[49,197493,197494,197496],{},[52,197495,101860],{},[52,197497,101863],{},[52,197499,101866,197500],{},[49,197501,197502,197504,197514],{},[52,197503,101871],{},[52,197505,197506,197508],{},[22,197507,101876],{},[49,197509,197510,197512],{},[52,197511,32344],{},[52,197513,32350],{},[52,197515,101885,197516],{},[49,197517,197518,197520,197522],{},[52,197519,101890],{},[52,197521,101893],{},[52,197523,101896],{},[52,197525,101899,197526],{},[49,197527,197528,197530],{},[52,197529,101904],{},[52,197531,101852],{},[23289,197533],{},[107,197535,101912],{"id":101911},[7759,197537,101916],{"id":101915},[13,197539,197540],{},[617,197541],{"alt":119,"src":101921},[7759,197543,101925],{"id":101924},[10548,197545,101929],{"id":101928},[49,197547,197548,197556,197564],{},[52,197549,101934,197550,101937,197552,101941,197554,101945],{},[22,197551,32221],{},[22,197553,101940],{},[22,197555,101944],{},[52,197557,101948,197558],{},[49,197559,197560],{},[52,197561,197562],{},[617,197563],{"alt":119,"src":101955},[52,197565,101958,197566],{},[49,197567,197568],{},[52,197569,197570],{},[617,197571],{"alt":119,"src":101965},[10548,197573,101969],{"id":101968},[13,197575,101972],{},[13,197577,101975],{},[13,197579,101978],{},[7759,197581,101982],{"id":101981},[72,197583,197584,197586,197590],{},[13,197585,101987],{},[13,197587,197588],{},[617,197589],{"alt":119,"src":101992},[49,197591,197592,197594,197596,197598,197600],{},[52,197593,101997],{},[52,197595,102000],{},[52,197597,102003],{},[52,197599,102006],{},[52,197601,102009],{},[13,197603,102012],{},[10548,197605,102016],{"id":102015},[13,197607,102019],{},[13,197609,102022],{},[49,197611,197612,197614,197616],{},[52,197613,102027],{},[52,197615,102030],{},[52,197617,102033],{},[72,197619,197620],{},[13,197621,102038],{},[13,197623,102041],{},[114,197625,197626],{"className":33693,"code":102044,"language":33695,"meta":119,"style":119},[17,197627,197628,197632,197636,197640,197644,197648,197652,197656,197660,197664,197668,197672,197676,197680,197684,197688,197692,197696,197700,197704,197708,197712],{"__ignoreMap":119},[78,197629,197630],{"class":124,"line":125},[78,197631,102051],{},[78,197633,197634],{"class":124,"line":132},[78,197635,102056],{},[78,197637,197638],{"class":124,"line":138},[78,197639,102061],{},[78,197641,197642],{"class":124,"line":144},[78,197643,35394],{},[78,197645,197646],{"class":124,"line":150},[78,197647,102070],{},[78,197649,197650],{"class":124,"line":156},[78,197651,102075],{},[78,197653,197654],{"class":124,"line":162},[78,197655,102080],{},[78,197657,197658],{"class":124,"line":168},[78,197659,102085],{},[78,197661,197662],{"class":124,"line":174},[78,197663,102090],{},[78,197665,197666],{"class":124,"line":180},[78,197667,102095],{},[78,197669,197670],{"class":124,"line":186},[78,197671,102100],{},[78,197673,197674],{"class":124,"line":192},[78,197675,102105],{},[78,197677,197678],{"class":124,"line":198},[78,197679,102110],{},[78,197681,197682],{"class":124,"line":204},[78,197683,102115],{},[78,197685,197686],{"class":124,"line":210},[78,197687,102120],{},[78,197689,197690],{"class":124,"line":216},[78,197691,102125],{},[78,197693,197694],{"class":124,"line":222},[78,197695,6942],{},[78,197697,197698],{"class":124,"line":421},[78,197699,102134],{},[78,197701,197702],{"class":124,"line":427},[78,197703,102139],{},[78,197705,197706],{"class":124,"line":433},[78,197707,102144],{},[78,197709,197710],{"class":124,"line":2443},[78,197711,102149],{},[78,197713,197714],{"class":124,"line":2448},[78,197715,102154],{},[13,197717,102157],{},[114,197719,197720],{"className":33693,"code":102160,"language":33695,"meta":119,"style":119},[17,197721,197722,197726],{"__ignoreMap":119},[78,197723,197724],{"class":124,"line":125},[78,197725,102167],{},[78,197727,197728],{"class":124,"line":132},[78,197729,102172],{},[10548,197731,102176],{"id":102175},[13,197733,102179,197734,102183],{},[22,197735,102182],{},[13,197737,102186],{},[49,197739,197740,197742,197744],{},[52,197741,102191],{},[52,197743,102194],{},[52,197745,102197],{},[13,197747,102041],{},[114,197749,197750],{"className":33693,"code":102202,"language":33695,"meta":119,"style":119},[17,197751,197752,197756,197760,197764,197768,197772,197776,197780,197784,197788,197792,197796,197800,197804,197808,197812,197816,197820,197824,197828,197832,197836,197840,197844,197848,197852,197856,197860,197864,197868],{"__ignoreMap":119},[78,197753,197754],{"class":124,"line":125},[78,197755,102209],{},[78,197757,197758],{"class":124,"line":132},[78,197759,102214],{},[78,197761,197762],{"class":124,"line":138},[78,197763,102219],{},[78,197765,197766],{"class":124,"line":144},[78,197767,35394],{},[78,197769,197770],{"class":124,"line":150},[78,197771,102228],{},[78,197773,197774],{"class":124,"line":156},[78,197775,102233],{},[78,197777,197778],{"class":124,"line":162},[78,197779,102238],{},[78,197781,197782],{"class":124,"line":168},[78,197783,102243],{},[78,197785,197786],{"class":124,"line":174},[78,197787,102248],{},[78,197789,197790],{"class":124,"line":180},[78,197791,102253],{},[78,197793,197794],{"class":124,"line":186},[78,197795,102258],{},[78,197797,197798],{"class":124,"line":192},[78,197799,102263],{},[78,197801,197802],{"class":124,"line":198},[78,197803,102268],{},[78,197805,197806],{"class":124,"line":204},[78,197807,102273],{},[78,197809,197810],{"class":124,"line":210},[78,197811,102278],{},[78,197813,197814],{"class":124,"line":216},[78,197815,102283],{},[78,197817,197818],{"class":124,"line":222},[78,197819,102288],{},[78,197821,197822],{"class":124,"line":421},[78,197823,102293],{},[78,197825,197826],{"class":124,"line":427},[78,197827,102298],{},[78,197829,197830],{"class":124,"line":433},[78,197831,102303],{},[78,197833,197834],{"class":124,"line":2443},[78,197835,102308],{},[78,197837,197838],{"class":124,"line":2448},[78,197839,102313],{},[78,197841,197842],{"class":124,"line":2454},[78,197843,102318],{},[78,197845,197846],{"class":124,"line":2460},[78,197847,102323],{},[78,197849,197850],{"class":124,"line":2465},[78,197851,102110],{},[78,197853,197854],{"class":124,"line":2470},[78,197855,102332],{},[78,197857,197858],{"class":124,"line":2903},[78,197859,102337],{},[78,197861,197862],{"class":124,"line":2909},[78,197863,102342],{},[78,197865,197866],{"class":124,"line":11477},[78,197867,6942],{},[78,197869,197870],{"class":124,"line":13374},[78,197871,102351],{},[13,197873,102157],{},[114,197875,197876],{"className":33693,"code":102356,"language":33695,"meta":119,"style":119},[17,197877,197878,197882,197886,197890,197894,197898,197902,197906,197910,197914,197918,197922,197926,197930,197934,197938,197942,197946,197950,197954,197958,197962,197966,197970,197974,197978,197982,197986,197990,197994,197998,198002,198006,198010,198014,198018,198022,198026,198030,198034,198038,198042,198046,198050,198054,198058,198062,198066,198070,198074,198078,198082,198086,198090,198094,198098,198102,198106,198110,198114,198118,198122,198126,198130,198134,198138,198142,198146,198150,198154,198158,198162,198166,198170,198174,198178,198182,198186,198190,198194,198198,198202,198206,198210,198214,198218,198222,198226,198230,198234,198238,198242,198246,198250,198254,198258,198262,198266,198270,198274,198278,198282,198286,198290,198294,198298],{"__ignoreMap":119},[78,197879,197880],{"class":124,"line":125},[78,197881,102363],{},[78,197883,197884],{"class":124,"line":132},[78,197885,102368],{},[78,197887,197888],{"class":124,"line":138},[78,197889,35394],{},[78,197891,197892],{"class":124,"line":144},[78,197893,66734],{},[78,197895,197896],{"class":124,"line":150},[78,197897,102381],{},[78,197899,197900],{"class":124,"line":156},[78,197901,102386],{},[78,197903,197904],{"class":124,"line":162},[78,197905,102391],{},[78,197907,197908],{"class":124,"line":168},[78,197909,102396],{},[78,197911,197912],{"class":124,"line":174},[78,197913,102401],{},[78,197915,197916],{"class":124,"line":180},[78,197917,102406],{},[78,197919,197920],{"class":124,"line":186},[78,197921,102411],{},[78,197923,197924],{"class":124,"line":192},[78,197925,102416],{},[78,197927,197928],{"class":124,"line":198},[78,197929,102421],{},[78,197931,197932],{"class":124,"line":204},[78,197933,102426],{},[78,197935,197936],{"class":124,"line":210},[78,197937,102431],{},[78,197939,197940],{"class":124,"line":216},[78,197941,102436],{},[78,197943,197944],{"class":124,"line":222},[78,197945,99137],{},[78,197947,197948],{"class":124,"line":421},[78,197949,102445],{},[78,197951,197952],{"class":124,"line":427},[78,197953,35394],{},[78,197955,197956],{"class":124,"line":433},[78,197957,66734],{},[78,197959,197960],{"class":124,"line":2443},[78,197961,102381],{},[78,197963,197964],{"class":124,"line":2448},[78,197965,102462],{},[78,197967,197968],{"class":124,"line":2454},[78,197969,102467],{},[78,197971,197972],{"class":124,"line":2460},[78,197973,102436],{},[78,197975,197976],{"class":124,"line":2465},[78,197977,99137],{},[78,197979,197980],{"class":124,"line":2470},[78,197981,102480],{},[78,197983,197984],{"class":124,"line":2903},[78,197985,35394],{},[78,197987,197988],{"class":124,"line":2909},[78,197989,66734],{},[78,197991,197992],{"class":124,"line":11477},[78,197993,102381],{},[78,197995,197996],{"class":124,"line":13374},[78,197997,102497],{},[78,197999,198000],{"class":124,"line":13380},[78,198001,102502],{},[78,198003,198004],{"class":124,"line":13386},[78,198005,102507],{},[78,198007,198008],{"class":124,"line":13722},[78,198009,102436],{},[78,198011,198012],{"class":124,"line":13727},[78,198013,99137],{},[78,198015,198016],{"class":124,"line":13953},[78,198017,102520],{},[78,198019,198020],{"class":124,"line":13958},[78,198021,35394],{},[78,198023,198024],{"class":124,"line":13964},[78,198025,66734],{},[78,198027,198028],{"class":124,"line":13969},[78,198029,102381],{},[78,198031,198032],{"class":124,"line":24170},[78,198033,102497],{},[78,198035,198036],{"class":124,"line":24175},[78,198037,102541],{},[78,198039,198040],{"class":124,"line":24180},[78,198041,102546],{},[78,198043,198044],{"class":124,"line":24186},[78,198045,102436],{},[78,198047,198048],{"class":124,"line":24192},[78,198049,99137],{},[78,198051,198052],{"class":124,"line":24198},[78,198053,102559],{},[78,198055,198056],{"class":124,"line":24204},[78,198057,35394],{},[78,198059,198060],{"class":124,"line":24210},[78,198061,66734],{},[78,198063,198064],{"class":124,"line":24215},[78,198065,102381],{},[78,198067,198068],{"class":124,"line":24220},[78,198069,102576],{},[78,198071,198072],{"class":124,"line":24226},[78,198073,102581],{},[78,198075,198076],{"class":124,"line":24232},[78,198077,102436],{},[78,198079,198080],{"class":124,"line":24238},[78,198081,99137],{},[78,198083,198084],{"class":124,"line":24244},[78,198085,102594],{},[78,198087,198088],{"class":124,"line":24250},[78,198089,35394],{},[78,198091,198092],{"class":124,"line":24256},[78,198093,66734],{},[78,198095,198096],{"class":124,"line":24262},[78,198097,102381],{},[78,198099,198100],{"class":124,"line":24267},[78,198101,102611],{},[78,198103,198104],{"class":124,"line":24273},[78,198105,102616],{},[78,198107,198108],{"class":124,"line":24279},[78,198109,102436],{},[78,198111,198112],{"class":124,"line":24284},[78,198113,99137],{},[78,198115,198116],{"class":124,"line":24290},[78,198117,102629],{},[78,198119,198120],{"class":124,"line":24296},[78,198121,35394],{},[78,198123,198124],{"class":124,"line":24302},[78,198125,66734],{},[78,198127,198128],{"class":124,"line":24308},[78,198129,102642],{},[78,198131,198132],{"class":124,"line":24314},[78,198133,102647],{},[78,198135,198136],{"class":124,"line":24320},[78,198137,102652],{},[78,198139,198140],{"class":124,"line":24325},[78,198141,102436],{},[78,198143,198144],{"class":124,"line":24331},[78,198145,102661],{},[78,198147,198148],{"class":124,"line":25115},[78,198149,99137],{},[78,198151,198152],{"class":124,"line":25121},[78,198153,102670],{},[78,198155,198156],{"class":124,"line":25127},[78,198157,35394],{},[78,198159,198160],{"class":124,"line":25132},[78,198161,66734],{},[78,198163,198164],{"class":124,"line":25137},[78,198165,102642],{},[78,198167,198168],{"class":124,"line":25143},[78,198169,102687],{},[78,198171,198172],{"class":124,"line":25149},[78,198173,102692],{},[78,198175,198176],{"class":124,"line":25155},[78,198177,102436],{},[78,198179,198180],{"class":124,"line":25161},[78,198181,102661],{},[78,198183,198184],{"class":124,"line":25166},[78,198185,8041],{},[78,198187,198188],{"class":124,"line":25172},[78,198189,102709],{},[78,198191,198192],{"class":124,"line":25178},[78,198193,66704],{},[78,198195,198196],{"class":124,"line":25184},[78,198197,102718],{},[78,198199,198200],{"class":124,"line":25190},[78,198201,102723],{},[78,198203,198204],{"class":124,"line":25196},[78,198205,102728],{},[78,198207,198208],{"class":124,"line":25202},[78,198209,102733],{},[78,198211,198212],{"class":124,"line":25207},[78,198213,102738],{},[78,198215,198216],{"class":124,"line":25212},[78,198217,102743],{},[78,198219,198220],{"class":124,"line":25218},[78,198221,102748],{},[78,198223,198224],{"class":124,"line":25224},[78,198225,102753],{},[78,198227,198228],{"class":124,"line":25230},[78,198229,102758],{},[78,198231,198232],{"class":124,"line":25236},[78,198233,102763],{},[78,198235,198236],{"class":124,"line":25241},[78,198237,102768],{},[78,198239,198240],{"class":124,"line":25246},[78,198241,102773],{},[78,198243,198244],{"class":124,"line":25252},[78,198245,102778],{},[78,198247,198248],{"class":124,"line":25258},[78,198249,102783],{},[78,198251,198252],{"class":124,"line":25264},[78,198253,102788],{},[78,198255,198256],{"class":124,"line":25269},[78,198257,102793],{},[78,198259,198260],{"class":124,"line":25274},[78,198261,102798],{},[78,198263,198264],{"class":124,"line":25280},[78,198265,102803],{},[78,198267,198268],{"class":124,"line":25286},[78,198269,102808],{},[78,198271,198272],{"class":124,"line":25292},[78,198273,102813],{},[78,198275,198276],{"class":124,"line":25298},[78,198277,102818],{},[78,198279,198280],{"class":124,"line":51654},[78,198281,102823],{},[78,198283,198284],{"class":124,"line":51659},[78,198285,102828],{},[78,198287,198288],{"class":124,"line":51664},[78,198289,102833],{},[78,198291,198292],{"class":124,"line":51669},[78,198293,102838],{},[78,198295,198296],{"class":124,"line":51675},[78,198297,102843],{},[78,198299,198300],{"class":124,"line":51681},[78,198301,102848],{},[10548,198303,102852],{"id":102851},[13,198305,102179,198306,102858],{},[22,198307,102857],{},[13,198309,102861],{},[49,198311,198312,198314,198316],{},[52,198313,102866],{},[52,198315,102869],{},[52,198317,102872],{},[13,198319,102041],{},[114,198321,198322],{"className":33693,"code":102877,"language":33695,"meta":119,"style":119},[17,198323,198324,198328,198332,198336,198340,198344,198348,198352,198356,198360,198364,198368,198372,198376,198380,198384,198388,198392,198396],{"__ignoreMap":119},[78,198325,198326],{"class":124,"line":125},[78,198327,102884],{},[78,198329,198330],{"class":124,"line":132},[78,198331,102889],{},[78,198333,198334],{"class":124,"line":138},[78,198335,102894],{},[78,198337,198338],{"class":124,"line":144},[78,198339,35394],{},[78,198341,198342],{"class":124,"line":150},[78,198343,102903],{},[78,198345,198346],{"class":124,"line":156},[78,198347,102908],{},[78,198349,198350],{"class":124,"line":162},[78,198351,102913],{},[78,198353,198354],{"class":124,"line":168},[78,198355,102918],{},[78,198357,198358],{"class":124,"line":174},[78,198359,102923],{},[78,198361,198362],{"class":124,"line":180},[78,198363,102928],{},[78,198365,198366],{"class":124,"line":186},[78,198367,102933],{},[78,198369,198370],{"class":124,"line":192},[78,198371,102938],{},[78,198373,198374],{"class":124,"line":198},[78,198375,102943],{},[78,198377,198378],{"class":124,"line":204},[78,198379,102948],{},[78,198381,198382],{"class":124,"line":210},[78,198383,102110],{},[78,198385,198386],{"class":124,"line":216},[78,198387,102115],{},[78,198389,198390],{"class":124,"line":222},[78,198391,102332],{},[78,198393,198394],{"class":124,"line":421},[78,198395,102965],{},[78,198397,198398],{"class":124,"line":427},[78,198399,102342],{},[13,198401,102157],{},[114,198403,198404],{"className":33693,"code":102974,"language":33695,"meta":119,"style":119},[17,198405,198406,198410,198414,198418,198422,198426,198430,198434,198438,198442,198446,198450,198454,198458,198462,198466,198470,198474,198478,198482,198486,198490,198494,198498,198502,198506,198510,198514,198518,198522,198526,198530,198534,198538,198542,198546,198550,198554],{"__ignoreMap":119},[78,198407,198408],{"class":124,"line":125},[78,198409,102981],{},[78,198411,198412],{"class":124,"line":132},[78,198413,102986],{},[78,198415,198416],{"class":124,"line":138},[78,198417,102991],{},[78,198419,198420],{"class":124,"line":144},[78,198421,66704],{},[78,198423,198424],{"class":124,"line":150},[78,198425,103000],{},[78,198427,198428],{"class":124,"line":156},[78,198429,103005],{},[78,198431,198432],{"class":124,"line":162},[78,198433,103010],{},[78,198435,198436],{"class":124,"line":168},[78,198437,103015],{},[78,198439,198440],{"class":124,"line":174},[78,198441,103020],{},[78,198443,198444],{"class":124,"line":180},[78,198445,103025],{},[78,198447,198448],{"class":124,"line":186},[78,198449,103030],{},[78,198451,198452],{"class":124,"line":192},[78,198453,103035],{},[78,198455,198456],{"class":124,"line":198},[78,198457,103040],{},[78,198459,198460],{"class":124,"line":204},[78,198461,103045],{},[78,198463,198464],{"class":124,"line":210},[78,198465,35389],{},[78,198467,198468],{"class":124,"line":216},[78,198469,35394],{},[78,198471,198472],{"class":124,"line":222},[78,198473,66734],{},[78,198475,198476],{"class":124,"line":421},[78,198477,103062],{},[78,198479,198480],{"class":124,"line":427},[78,198481,103067],{},[78,198483,198484],{"class":124,"line":433},[78,198485,103072],{},[78,198487,198488],{"class":124,"line":2443},[78,198489,103077],{},[78,198491,198492],{"class":124,"line":2448},[78,198493,103082],{},[78,198495,198496],{"class":124,"line":2454},[78,198497,103087],{},[78,198499,198500],{"class":124,"line":2460},[78,198501,103092],{},[78,198503,198504],{"class":124,"line":2465},[78,198505,103097],{},[78,198507,198508],{"class":124,"line":2470},[78,198509,103102],{},[78,198511,198512],{"class":124,"line":2903},[78,198513,103107],{},[78,198515,198516],{"class":124,"line":2909},[78,198517,103112],{},[78,198519,198520],{"class":124,"line":11477},[78,198521,103117],{},[78,198523,198524],{"class":124,"line":13374},[78,198525,35394],{},[78,198527,198528],{"class":124,"line":13380},[78,198529,66734],{},[78,198531,198532],{"class":124,"line":13386},[78,198533,103130],{},[78,198535,198536],{"class":124,"line":13722},[78,198537,103135],{},[78,198539,198540],{"class":124,"line":13727},[78,198541,103140],{},[78,198543,198544],{"class":124,"line":13953},[78,198545,102436],{},[78,198547,198548],{"class":124,"line":13958},[78,198549,103149],{},[78,198551,198552],{"class":124,"line":13964},[78,198553,103154],{},[78,198555,198556],{"class":124,"line":13969},[78,198557,103159],{},[10548,198559,103163],{"id":103162},[13,198561,103166],{},[13,198563,103169],{},[49,198565,198566,198568,198570],{},[52,198567,103174],{},[52,198569,103177],{},[52,198571,103180],{},[13,198573,103183],{},[13,198575,102041],{},[114,198577,198578],{"className":33693,"code":103188,"language":33695,"meta":119,"style":119},[17,198579,198580,198584,198588,198592,198596,198600,198604,198608,198612,198616,198620,198624,198628,198632,198636,198640,198644,198648,198652,198656,198660,198664,198668,198672,198676,198680],{"__ignoreMap":119},[78,198581,198582],{"class":124,"line":125},[78,198583,103195],{},[78,198585,198586],{"class":124,"line":132},[78,198587,103200],{},[78,198589,198590],{"class":124,"line":138},[78,198591,103205],{},[78,198593,198594],{"class":124,"line":144},[78,198595,35394],{},[78,198597,198598],{"class":124,"line":150},[78,198599,103214],{},[78,198601,198602],{"class":124,"line":156},[78,198603,103219],{},[78,198605,198606],{"class":124,"line":162},[78,198607,103224],{},[78,198609,198610],{"class":124,"line":168},[78,198611,103229],{},[78,198613,198614],{"class":124,"line":174},[78,198615,103234],{},[78,198617,198618],{"class":124,"line":180},[78,198619,103239],{},[78,198621,198622],{"class":124,"line":186},[78,198623,103244],{},[78,198625,198626],{"class":124,"line":192},[78,198627,103249],{},[78,198629,198630],{"class":124,"line":198},[78,198631,103254],{},[78,198633,198634],{"class":124,"line":204},[78,198635,103259],{},[78,198637,198638],{"class":124,"line":210},[78,198639,103264],{},[78,198641,198642],{"class":124,"line":216},[78,198643,103269],{},[78,198645,198646],{"class":124,"line":222},[78,198647,103274],{},[78,198649,198650],{"class":124,"line":421},[78,198651,103279],{},[78,198653,198654],{"class":124,"line":427},[78,198655,103284],{},[78,198657,198658],{"class":124,"line":433},[78,198659,103289],{},[78,198661,198662],{"class":124,"line":2443},[78,198663,103294],{},[78,198665,198666],{"class":124,"line":2448},[78,198667,103299],{},[78,198669,198670],{"class":124,"line":2454},[78,198671,102110],{},[78,198673,198674],{"class":124,"line":2460},[78,198675,102332],{},[78,198677,198678],{"class":124,"line":2465},[78,198679,103312],{},[78,198681,198682],{"class":124,"line":2470},[78,198683,102342],{},[13,198685,102157],{},[114,198687,198688],{"className":33693,"code":103321,"language":33695,"meta":119,"style":119},[17,198689,198690,198694,198698,198702,198706,198710,198714,198718,198722,198726,198730,198734,198738,198742,198746,198750,198754,198758,198762,198766,198770,198774,198778,198782,198786,198790,198794,198798,198802,198806,198810,198814,198818,198822,198826,198830,198834,198838,198842,198846,198850,198854,198858,198862,198866,198870,198874,198878,198882,198886,198890,198894,198898],{"__ignoreMap":119},[78,198691,198692],{"class":124,"line":125},[78,198693,102986],{},[78,198695,198696],{"class":124,"line":132},[78,198697,103332],{},[78,198699,198700],{"class":124,"line":138},[78,198701,66704],{},[78,198703,198704],{"class":124,"line":144},[78,198705,103005],{},[78,198707,198708],{"class":124,"line":150},[78,198709,103000],{},[78,198711,198712],{"class":124,"line":156},[78,198713,103349],{},[78,198715,198716],{"class":124,"line":162},[78,198717,103354],{},[78,198719,198720],{"class":124,"line":168},[78,198721,103359],{},[78,198723,198724],{"class":124,"line":174},[78,198725,103364],{},[78,198727,198728],{"class":124,"line":180},[78,198729,103369],{},[78,198731,198732],{"class":124,"line":186},[78,198733,103374],{},[78,198735,198736],{"class":124,"line":192},[78,198737,103379],{},[78,198739,198740],{"class":124,"line":198},[78,198741,103384],{},[78,198743,198744],{"class":124,"line":204},[78,198745,103389],{},[78,198747,198748],{"class":124,"line":210},[78,198749,103394],{},[78,198751,198752],{"class":124,"line":216},[78,198753,103399],{},[78,198755,198756],{"class":124,"line":222},[78,198757,103404],{},[78,198759,198760],{"class":124,"line":421},[78,198761,103409],{},[78,198763,198764],{"class":124,"line":427},[78,198765,103414],{},[78,198767,198768],{"class":124,"line":433},[78,198769,103419],{},[78,198771,198772],{"class":124,"line":2443},[78,198773,103424],{},[78,198775,198776],{"class":124,"line":2448},[78,198777,35389],{},[78,198779,198780],{"class":124,"line":2454},[78,198781,35394],{},[78,198783,198784],{"class":124,"line":2460},[78,198785,66734],{},[78,198787,198788],{"class":124,"line":2465},[78,198789,103441],{},[78,198791,198792],{"class":124,"line":2470},[78,198793,103446],{},[78,198795,198796],{"class":124,"line":2903},[78,198797,102642],{},[78,198799,198800],{"class":124,"line":2909},[78,198801,103455],{},[78,198803,198804],{"class":124,"line":11477},[78,198805,103460],{},[78,198807,198808],{"class":124,"line":13374},[78,198809,103465],{},[78,198811,198812],{"class":124,"line":13380},[78,198813,103470],{},[78,198815,198816],{"class":124,"line":13386},[78,198817,103475],{},[78,198819,198820],{"class":124,"line":13722},[78,198821,103480],{},[78,198823,198824],{"class":124,"line":13727},[78,198825,103485],{},[78,198827,198828],{"class":124,"line":13953},[78,198829,103490],{},[78,198831,198832],{"class":124,"line":13958},[78,198833,103495],{},[78,198835,198836],{"class":124,"line":13964},[78,198837,103117],{},[78,198839,198840],{"class":124,"line":13969},[78,198841,35394],{},[78,198843,198844],{"class":124,"line":24170},[78,198845,66734],{},[78,198847,198848],{"class":124,"line":24175},[78,198849,102381],{},[78,198851,198852],{"class":124,"line":24180},[78,198853,102391],{},[78,198855,198856],{"class":124,"line":24186},[78,198857,103520],{},[78,198859,198860],{"class":124,"line":24192},[78,198861,103525],{},[78,198863,198864],{"class":124,"line":24198},[78,198865,103530],{},[78,198867,198868],{"class":124,"line":24204},[78,198869,103535],{},[78,198871,198872],{"class":124,"line":24210},[78,198873,102416],{},[78,198875,198876],{"class":124,"line":24215},[78,198877,103544],{},[78,198879,198880],{"class":124,"line":24220},[78,198881,102421],{},[78,198883,198884],{"class":124,"line":24226},[78,198885,102611],{},[78,198887,198888],{"class":124,"line":24232},[78,198889,103557],{},[78,198891,198892],{"class":124,"line":24238},[78,198893,103562],{},[78,198895,198896],{"class":124,"line":24244},[78,198897,103567],{},[78,198899,198900],{"class":124,"line":24250},[78,198901,103572],{},[10548,198903,103576],{"id":103575},[8366,198905,198906,198918],{},[8369,198907,198908],{},[8372,198909,198910,198912,198914,198916],{},[8375,198911,103585],{},[8375,198913,103588],{},[8375,198915,103591],{},[8375,198917,42815],{},[8386,198919,198920,198930,198940,198950,198960],{},[8372,198921,198922,198924,198926,198928],{},[8391,198923,103600],{},[8391,198925,103603],{},[8391,198927,103606],{},[8391,198929,103609],{},[8372,198931,198932,198934,198936,198938],{},[8391,198933,103600],{},[8391,198935,103603],{},[8391,198937,103618],{},[8391,198939,103621],{},[8372,198941,198942,198944,198946,198948],{},[8391,198943,103600],{},[8391,198945,103603],{},[8391,198947,103630],{},[8391,198949,103633],{},[8372,198951,198952,198954,198956,198958],{},[8391,198953,103600],{},[8391,198955,103603],{},[8391,198957,103642],{},[8391,198959,103645],{},[8372,198961,198962,198964,198966,198968],{},[8391,198963,103600],{},[8391,198965,103603],{},[8391,198967,103654],{},[8391,198969,103657],{},[13,198971,102041],{},[114,198973,198974],{"className":33693,"code":103662,"language":33695,"meta":119,"style":119},[17,198975,198976,198980,198984,198988,198992,198996,199000,199004,199008,199012,199016,199020,199024,199028,199032],{"__ignoreMap":119},[78,198977,198978],{"class":124,"line":125},[78,198979,103669],{},[78,198981,198982],{"class":124,"line":132},[78,198983,103674],{},[78,198985,198986],{"class":124,"line":138},[78,198987,103679],{},[78,198989,198990],{"class":124,"line":144},[78,198991,35394],{},[78,198993,198994],{"class":124,"line":150},[78,198995,103688],{},[78,198997,198998],{"class":124,"line":156},[78,198999,103693],{},[78,199001,199002],{"class":124,"line":162},[78,199003,103698],{},[78,199005,199006],{"class":124,"line":168},[78,199007,103703],{},[78,199009,199010],{"class":124,"line":174},[78,199011,103708],{},[78,199013,199014],{"class":124,"line":180},[78,199015,103713],{},[78,199017,199018],{"class":124,"line":186},[78,199019,103718],{},[78,199021,199022],{"class":124,"line":192},[78,199023,103723],{},[78,199025,199026],{"class":124,"line":198},[78,199027,103728],{},[78,199029,199030],{"class":124,"line":204},[78,199031,102115],{},[78,199033,199034],{"class":124,"line":210},[78,199035,103737],{},[13,199037,102157],{},[114,199039,199040],{"className":33693,"code":103742,"language":33695,"meta":119,"style":119},[17,199041,199042,199046,199050,199054,199058,199062,199066,199070,199074,199078,199082,199086,199090,199094,199098],{"__ignoreMap":119},[78,199043,199044],{"class":124,"line":125},[78,199045,103749],{},[78,199047,199048],{"class":124,"line":132},[78,199049,103754],{},[78,199051,199052],{"class":124,"line":138},[78,199053,103759],{},[78,199055,199056],{"class":124,"line":144},[78,199057,66704],{},[78,199059,199060],{"class":124,"line":150},[78,199061,103768],{},[78,199063,199064],{"class":124,"line":156},[78,199065,103773],{},[78,199067,199068],{"class":124,"line":162},[78,199069,103778],{},[78,199071,199072],{"class":124,"line":168},[78,199073,103783],{},[78,199075,199076],{"class":124,"line":174},[78,199077,103788],{},[78,199079,199080],{"class":124,"line":180},[78,199081,103793],{},[78,199083,199084],{"class":124,"line":186},[78,199085,103798],{},[78,199087,199088],{"class":124,"line":192},[78,199089,103803],{},[78,199091,199092],{"class":124,"line":198},[78,199093,103808],{},[78,199095,199096],{"class":124,"line":204},[78,199097,103813],{},[78,199099,199100],{"class":124,"line":210},[78,199101,103818],{},[226,199103,228],{},{"title":119,"searchDepth":144,"depth":144,"links":199105},[199106,199112,199117,199122,199126],{"id":101258,"depth":132,"text":101259,"children":199107},[199108,199109,199110,199111],{"id":48731,"depth":144,"text":48732},{"id":101272,"depth":144,"text":101273},{"id":101299,"depth":144,"text":101300},{"id":101308,"depth":144,"text":101309},{"id":101319,"depth":132,"text":101320,"children":199113},[199114,199115,199116],{"id":101367,"depth":144,"text":101368},{"id":101420,"depth":144,"text":101421},{"id":101446,"depth":144,"text":101447},{"id":101463,"depth":132,"text":101464,"children":199118},[199119,199120,199121],{"id":62488,"depth":144,"text":101467},{"id":101473,"depth":144,"text":101474},{"id":101482,"depth":144,"text":101483},{"id":101590,"depth":132,"text":101591,"children":199123},[199124,199125],{"id":101599,"depth":144,"text":101600},{"id":101821,"depth":144,"text":101822},{"id":101911,"depth":132,"text":101912,"children":199127},[199128,199129,199130],{"id":101915,"depth":144,"text":101916},{"id":101924,"depth":144,"text":101925},{"id":101981,"depth":144,"text":101982},{},{"title":101253,"description":119},[14968,7744,246,23378,10715,6380],{"id":103856,"title":7744,"assetBase":239,"author":8,"body":199135,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":199647,"navigation":128,"originalPath":104559,"path":104560,"seo":199648,"source":23330,"stem":104562,"tags":199649,"weight":250,"__hash__":104564},{"type":10,"value":199136,"toc":199609},[199137,199147,199149,199151,199183,199185,199187,199189,199191,199193,199195,199197,199199,199217,199219,199251,199253,199255,199259,199263,199275,199277,199279,199283,199287,199289,199293,199297,199301,199303,199315,199317,199339,199341,199385,199387,199389,199391,199401,199405,199407,199409,199421,199423,199471,199473,199475,199479,199483,199487,199489,199491,199493,199495,199499,199501,199505,199509,199511,199515,199519,199521,199523,199525,199527,199531,199535,199539,199543,199545,199549,199553,199555,199559,199563,199565,199567,199569,199577,199581,199583,199607],[72,199138,199139,199143,199145],{},[13,199140,199141],{},[22,199142,23957],{},[13,199144,103867],{},[13,199146,103870],{},[107,199148,63031],{"id":63030},[7759,199150,103876],{"id":103875},[49,199152,199153,199155,199161,199165,199169,199171,199173,199175,199177,199179,199181],{},[52,199154,103881],{},[52,199156,199157,103891],{},[22,199158,103886,199159,103890],{},[22,199160,103889],{},[52,199162,103894,199163,27386],{},[22,199164,103897],{},[52,199166,199167,103903],{},[22,199168,103902],{},[52,199170,103906],{},[52,199172,103909],{},[52,199174,103912],{},[52,199176,103915],{},[52,199178,103918],{},[52,199180,103921],{},[52,199182,103924],{},[7759,199184,103928],{"id":103927},[13,199186,103931],{},[7759,199188,103935],{"id":103934},[13,199190,103938],{},[13,199192,103941],{},[23289,199194],{},[107,199196,103947],{"id":103946},[7759,199198,103951],{"id":103950},[49,199200,199201,199209],{},[52,199202,103956,199203],{},[49,199204,199205,199207],{},[52,199206,103961],{},[52,199208,103964],{},[52,199210,103967,199211],{},[49,199212,199213,199215],{},[52,199214,103972],{},[52,199216,103975],{},[7759,199218,103979],{"id":103978},[49,199220,199221,199233,199239],{},[52,199222,103984,199223],{},[49,199224,199225,199227,199229,199231],{},[52,199226,103989],{},[52,199228,103992],{},[52,199230,103995],{},[52,199232,103998],{},[52,199234,104001,199235],{},[49,199236,199237],{},[52,199238,104006],{},[52,199240,104009,199241],{},[49,199242,199243,199245,199247,199249],{},[52,199244,104014],{},[52,199246,104017],{},[52,199248,104020],{},[52,199250,104023],{},[7759,199252,104027],{"id":104026},[13,199254,104030],{},[49,199256,199257],{},[52,199258,104035],{},[13,199260,199261],{},[617,199262],{"alt":104040,"src":30426},[49,199264,199265,199273],{},[52,199266,104045,199267],{},[49,199268,199269,199271],{},[52,199270,104050],{},[52,199272,104053],{},[52,199274,104056],{},[23289,199276],{},[107,199278,104062],{"id":104061},[49,199280,199281],{},[52,199282,104067],{},[13,199284,199285],{},[617,199286],{"alt":104072,"src":29839},[13,199288,104075],{},[49,199290,199291],{},[52,199292,104080],{},[13,199294,199295],{},[617,199296],{"alt":104085,"src":62233},[13,199298,25995,199299],{},[617,199300],{"alt":104090,"src":71409},[7759,199302,104094],{"id":104093},[49,199304,199305,199307,199309],{},[52,199306,104099],{},[52,199308,104102],{},[52,199310,104105,199311],{},[49,199312,199313],{},[52,199314,104110],{},[7759,199316,104114],{"id":104113},[49,199318,199319,199329],{},[52,199320,104119,199321],{},[49,199322,199323,199325,199327],{},[52,199324,104124],{},[52,199326,104127],{},[52,199328,104130],{},[52,199330,104133,199331],{},[49,199332,199333,199335,199337],{},[52,199334,104138],{},[52,199336,104141],{},[52,199338,104144],{},[7759,199340,104147],{"id":73725},[49,199342,199343,199349,199365,199379],{},[52,199344,104152,199345],{},[49,199346,199347],{},[52,199348,104157],{},[52,199350,104160,199351],{},[49,199352,199353,199359],{},[52,199354,104165,199355],{},[49,199356,199357],{},[52,199358,104170],{},[52,199360,104173,199361],{},[49,199362,199363],{},[52,199364,104178],{},[52,199366,104181,199367],{},[49,199368,199369,199371,199373],{},[52,199370,104186],{},[52,199372,104189],{},[52,199374,104192,199375],{},[49,199376,199377],{},[52,199378,104197],{},[52,199380,104200,199381],{},[49,199382,199383],{},[52,199384,104205],{},[23289,199386],{},[107,199388,104211],{"id":104210},[7759,199390,104215],{"id":104214},[49,199392,199393,199395,199397,199399],{},[52,199394,104220],{},[52,199396,104223],{},[52,199398,104226],{},[52,199400,104229],{},[72,199402,199403],{},[13,199404,104234],{},[7759,199406,104238],{"id":104237},[13,199408,104241],{},[49,199410,199411],{},[52,199412,104246,199413],{},[49,199414,199415,199417,199419],{},[52,199416,104251],{},[52,199418,104254],{},[52,199420,104257],{},[7759,199422,104261],{"id":104260},[49,199424,199425,199433,199435,199451,199465],{},[52,199426,104266,199427],{},[49,199428,199429,199431],{},[52,199430,104271],{},[52,199432,104274],{},[52,199434,104277],{},[52,199436,104280,199437,20689,199439,199445,20692,199447],{},[2996,199438],{},[49,199440,199441,199443],{},[52,199442,104287],{},[52,199444,104290],{},[2996,199446],{},[49,199448,199449],{},[52,199450,104297],{},[52,199452,104300,199453,20689,199455,199459,20692,199461],{},[2996,199454],{},[49,199456,199457],{},[52,199458,104307],{},[2996,199460],{},[49,199462,199463],{},[52,199464,104314],{},[52,199466,104317,199467],{},[49,199468,199469],{},[52,199470,104322],{},[7759,199472,104326],{"id":104325},[10548,199474,104330],{"id":104329},[13,199476,199477],{},[617,199478],{"alt":104335,"src":30157},[13,199480,199481],{},[617,199482],{"alt":104340,"src":30871},[72,199484,199485],{},[13,199486,104345],{},[23289,199488],{},[107,199490,104351],{"id":104350},[107,199492,104355],{"id":104354},[7759,199494,104359],{"id":104358},[13,199496,199497],{},[617,199498],{"alt":104364,"src":31273},[7759,199500,104368],{"id":104367},[13,199502,199503],{},[617,199504],{"alt":104373,"src":31282},[13,199506,199507],{},[617,199508],{"alt":104378,"src":31302},[7759,199510,104382],{"id":104381},[13,199512,199513],{},[617,199514],{"alt":104387,"src":31317},[13,199516,199517],{},[617,199518],{"alt":104392,"src":31335},[23289,199520],{},[107,199522,104398],{"id":104397},[7759,199524,104402],{"id":104401},[13,199526,104405],{},[49,199528,199529],{},[52,199530,104410],{},[13,199532,199533],{},[617,199534],{"alt":104415,"src":31471},[13,199536,199537],{},[617,199538],{"alt":104420,"src":31499},[13,199540,199541],{},[617,199542],{"alt":104425,"src":73607},[7759,199544,104429],{"id":104428},[13,199546,199547],{},[617,199548],{"alt":104434,"src":73612},[13,199550,199551],{},[617,199552],{"alt":104439,"src":73636},[7759,199554,104443],{"id":104442},[13,199556,199557],{},[617,199558],{"alt":104448,"src":104449},[13,199560,199561],{},[617,199562],{"alt":104454,"src":104455},[23289,199564],{},[107,199566,104461],{"id":104460},[7759,199568,104465],{"id":104464},[49,199570,199571,199573,199575],{},[52,199572,104470],{},[52,199574,104473],{},[52,199576,104476],{},[13,199578,199579],{},[617,199580],{"alt":104481,"src":62619},[7759,199582,104485],{"id":104484},[49,199584,199585,199587,199589,199591],{},[52,199586,104490],{},[52,199588,104493],{},[52,199590,104496],{},[52,199592,20689,199593],{},[49,199594,199595,199605],{},[52,199596,104503,199597],{},[49,199598,199599,199601,199603],{},[52,199600,104508],{},[52,199602,104511],{},[52,199604,104514],{},[52,199606,104517],{},[23289,199608],{},{"title":119,"searchDepth":144,"depth":144,"links":199610},[199611,199616,199621,199626,199632,199633,199638,199643],{"id":63030,"depth":132,"text":63031,"children":199612},[199613,199614,199615],{"id":103875,"depth":144,"text":103876},{"id":103927,"depth":144,"text":103928},{"id":103934,"depth":144,"text":103935},{"id":103946,"depth":132,"text":103947,"children":199617},[199618,199619,199620],{"id":103950,"depth":144,"text":103951},{"id":103978,"depth":144,"text":103979},{"id":104026,"depth":144,"text":104027},{"id":104061,"depth":132,"text":104062,"children":199622},[199623,199624,199625],{"id":104093,"depth":144,"text":104094},{"id":104113,"depth":144,"text":104114},{"id":73725,"depth":144,"text":104147},{"id":104210,"depth":132,"text":104211,"children":199627},[199628,199629,199630,199631],{"id":104214,"depth":144,"text":104215},{"id":104237,"depth":144,"text":104238},{"id":104260,"depth":144,"text":104261},{"id":104325,"depth":144,"text":104326},{"id":104350,"depth":132,"text":104351},{"id":104354,"depth":132,"text":104355,"children":199634},[199635,199636,199637],{"id":104358,"depth":144,"text":104359},{"id":104367,"depth":144,"text":104368},{"id":104381,"depth":144,"text":104382},{"id":104397,"depth":132,"text":104398,"children":199639},[199640,199641,199642],{"id":104401,"depth":144,"text":104402},{"id":104428,"depth":144,"text":104429},{"id":104442,"depth":144,"text":104443},{"id":104460,"depth":132,"text":104461,"children":199644},[199645,199646],{"id":104464,"depth":144,"text":104465},{"id":104484,"depth":144,"text":104485},{},{"title":7744,"description":119},[14968,7744,246,14542],{"id":104566,"title":104567,"assetBase":239,"author":8,"body":199651,"category":29019,"collection":23324,"date":23325,"description":104572,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":200215,"navigation":128,"originalPath":105322,"path":105323,"seo":200216,"source":23330,"stem":105325,"tags":200217,"weight":250,"__hash__":105327},{"type":10,"value":199652,"toc":200211},[199653,199655,199657,199659,199661,199663,199665,199667,199669,199671,199673,199675,199677,199679,199681,199683,199685,199687,199689,199697,199699,199701,199703,199705,199729,199731,199739,199741,199743,199745,199747,199749,199765,199767,199769,199775,199799,199801,199821,199825,199853,199857,199869,199871,199873,199881,199883,199885,199887,199889,199901,199905,199925,199927,199939,199941,199943,200005,200007,200009,200095,200097,200099,200181,200183,200185,200187,200199,200209],[13,199654,104572],{},[13,199656,104575],{},[13,199658,104578],{},[13,199660,104581],{},[13,199662,104584],{},[13,199664,104587],{},[13,199666,104590],{},[13,199668,104593],{},[13,199670,104596],{},[13,199672,104599],{},[13,199674,104602],{},[13,199676,104605],{},[13,199678,104608],{},[13,199680,104611],{},[13,199682,104614],{},[13,199684,104617],{},[13,199686,104620],{},[107,199688,104624],{"id":104623},[13,199690,104627,199691,104630,199693,104633,199695],{},[78,199692,27433],{},[78,199694,22817],{},[78,199696,11237],{},[13,199698,104638],{},[13,199700,104641],{},[13,199702,104644],{},[13,199704,104647],{},[114,199706,199707],{"className":104650,"code":104651,"language":7360,"meta":119,"style":119},[17,199708,199709,199713,199717,199721,199725],{"__ignoreMap":119},[78,199710,199711],{"class":124,"line":125},[78,199712,104658],{},[78,199714,199715],{"class":124,"line":132},[78,199716,104663],{},[78,199718,199719],{"class":124,"line":138},[78,199720,104668],{},[78,199722,199723],{"class":124,"line":144},[78,199724,104673],{},[78,199726,199727],{"class":124,"line":150},[78,199728,104678],{},[13,199730,104681],{},[114,199732,199733],{"className":104650,"code":104684,"language":7360,"meta":119,"style":119},[17,199734,199735],{"__ignoreMap":119},[78,199736,199737],{"class":124,"line":125},[78,199738,104684],{},[13,199740,104693],{},[13,199742,104696],{},[13,199744,104699],{},[13,199746,104702],{},[13,199748,104705],{},[114,199750,199751],{"className":104650,"code":104708,"language":7360,"meta":119,"style":119},[17,199752,199753,199757,199761],{"__ignoreMap":119},[78,199754,199755],{"class":124,"line":125},[78,199756,104715],{},[78,199758,199759],{"class":124,"line":132},[78,199760,104720],{},[78,199762,199763],{"class":124,"line":138},[78,199764,104725],{},[13,199766,104728],{},[13,199768,104731],{},[13,199770,104734,199771,64610,199773,104740],{},[17,199772,21291],{},[17,199774,104739],{},[114,199776,199777],{"className":104650,"code":104743,"language":7360,"meta":119,"style":119},[17,199778,199779,199783,199787,199791,199795],{"__ignoreMap":119},[78,199780,199781],{"class":124,"line":125},[78,199782,104750],{},[78,199784,199785],{"class":124,"line":132},[78,199786,104755],{},[78,199788,199789],{"class":124,"line":138},[78,199790,104760],{},[78,199792,199793],{"class":124,"line":144},[78,199794,104765],{},[78,199796,199797],{"class":124,"line":150},[78,199798,104770],{},[13,199800,104773],{},[2285,199802,199803,199809,199819],{},[52,199804,199805,104781,199807,104785],{},[17,199806,104780],{},[17,199808,104784],{},[52,199810,104788,199811,104791,199813,104794,199815,104797,199817,104800],{},[17,199812,104780],{},[17,199814,21291],{},[17,199816,104784],{},[17,199818,104739],{},[52,199820,104803],{},[13,199822,104806,199823,104809],{},[17,199824,104780],{},[114,199826,199827],{"className":104650,"code":104812,"language":7360,"meta":119,"style":119},[17,199828,199829,199833,199837,199841,199845,199849],{"__ignoreMap":119},[78,199830,199831],{"class":124,"line":125},[78,199832,104819],{},[78,199834,199835],{"class":124,"line":132},[78,199836,104824],{},[78,199838,199839],{"class":124,"line":138},[78,199840,104829],{},[78,199842,199843],{"class":124,"line":144},[78,199844,104834],{},[78,199846,199847],{"class":124,"line":150},[78,199848,104839],{},[78,199850,199851],{"class":124,"line":156},[78,199852,104844],{},[13,199854,104847,199855,104809],{},[17,199856,104784],{},[114,199858,199859],{"className":104650,"code":104852,"language":7360,"meta":119,"style":119},[17,199860,199861,199865],{"__ignoreMap":119},[78,199862,199863],{"class":124,"line":125},[78,199864,104859],{},[78,199866,199867],{"class":124,"line":132},[78,199868,104864],{},[13,199870,104867],{},[13,199872,104870],{},[49,199874,199875,199877,199879],{},[52,199876,104875],{},[52,199878,104878],{},[52,199880,104881],{},[13,199882,104884],{},[13,199884,104887],{},[13,199886,104890],{},[13,199888,104893],{},[114,199890,199891],{"className":104650,"code":104896,"language":7360,"meta":119,"style":119},[17,199892,199893,199897],{"__ignoreMap":119},[78,199894,199895],{"class":124,"line":125},[78,199896,104903],{},[78,199898,199899],{"class":124,"line":132},[78,199900,104908],{},[13,199902,104911,199903,104915],{},[22,199904,104914],{},[114,199906,199907],{"className":104650,"code":104918,"language":7360,"meta":119,"style":119},[17,199908,199909,199913,199917,199921],{"__ignoreMap":119},[78,199910,199911],{"class":124,"line":125},[78,199912,104925],{},[78,199914,199915],{"class":124,"line":132},[78,199916,104930],{},[78,199918,199919],{"class":124,"line":138},[78,199920,104935],{},[78,199922,199923],{"class":124,"line":144},[78,199924,104940],{},[13,199926,104943],{},[114,199928,199929],{"className":104650,"code":104946,"language":7360,"meta":119,"style":119},[17,199930,199931,199935],{"__ignoreMap":119},[78,199932,199933],{"class":124,"line":125},[78,199934,104953],{},[78,199936,199937],{"class":124,"line":132},[78,199938,104958],{},[13,199940,104961],{},[13,199942,104964],{},[8366,199944,199945,199957],{},[8369,199946,199947],{},[8372,199948,199949,199951,199953,199955],{},[8375,199950,104973],{},[8375,199952,104976],{},[8375,199954,104979],{},[8375,199956,104982],{},[8386,199958,199959,199971,199981,199993],{},[8372,199960,199961,199963,199965,199967],{},[8391,199962,104989],{},[8391,199964,104992],{},[8391,199966,104995],{},[8391,199968,104998,199969,105001],{},[2996,199970],{},[8372,199972,199973,199975,199977,199979],{},[8391,199974,105006],{},[8391,199976,105009],{},[8391,199978,105012],{},[8391,199980],{},[8372,199982,199983,199985,199987,199989],{},[8391,199984,105019],{},[8391,199986,105022],{},[8391,199988,105025],{},[8391,199990,105028,199991,105031],{},[2996,199992],{},[8372,199994,199995,199997,199999,200001],{},[8391,199996,105036],{},[8391,199998,105039],{},[8391,200000,105042],{},[8391,200002,105045,200003,105048],{},[2996,200004],{},[13,200006,105051],{},[13,200008,105054],{},[8366,200010,200011,200023],{},[8369,200012,200013],{},[8372,200014,200015,200017,200019,200021],{},[8375,200016,105063],{},[8375,200018,105066],{},[8375,200020,105069],{},[8375,200022,105072],{},[8386,200024,200025,200035,200045,200055,200065,200075,200085],{},[8372,200026,200027,200029,200031,200033],{},[8391,200028,105079],{},[8391,200030,105082],{},[8391,200032,105079],{},[8391,200034,105082],{},[8372,200036,200037,200039,200041,200043],{},[8391,200038,17132],{},[8391,200040,105093],{},[8391,200042,105096],{},[8391,200044,105093],{},[8372,200046,200047,200049,200051,200053],{},[8391,200048,85783],{},[8391,200050,105105],{},[8391,200052,105108],{},[8391,200054,105105],{},[8372,200056,200057,200059,200061,200063],{},[8391,200058,5009],{},[8391,200060,105117],{},[8391,200062,82870],{},[8391,200064,105117],{},[8372,200066,200067,200069,200071,200073],{},[8391,200068,105126],{},[8391,200070,105129],{},[8391,200072,105132],{},[8391,200074,105129],{},[8372,200076,200077,200079,200081,200083],{},[8391,200078,105139],{},[8391,200080,105142],{},[8391,200082,105145],{},[8391,200084,105142],{},[8372,200086,200087,200089,200091,200093],{},[8391,200088,105152],{},[8391,200090,105155],{},[8391,200092,105158],{},[8391,200094,105155],{},[13,200096,105163],{},[13,200098,105166],{},[8366,200100,200101,200113],{},[8369,200102,200103],{},[8372,200104,200105,200107,200109,200111],{},[8375,200106,104973],{},[8375,200108,104976],{},[8375,200110,104979],{},[8375,200112,104982],{},[8386,200114,200115,200125,200137,200147,200157,200169],{},[8372,200116,200117,200119,200121,200123],{},[8391,200118,105187],{},[8391,200120,105190],{},[8391,200122,105193],{},[8391,200124,105196],{},[8372,200126,200127,200129,200131,200133],{},[8391,200128,105201],{},[8391,200130,105204],{},[8391,200132,105207],{},[8391,200134,105210,200135,105213],{},[2996,200136],{},[8372,200138,200139,200141,200143,200145],{},[8391,200140,105218],{},[8391,200142,105221],{},[8391,200144,105224],{},[8391,200146,105196],{},[8372,200148,200149,200151,200153,200155],{},[8391,200150,105231],{},[8391,200152,105234],{},[8391,200154,105237],{},[8391,200156,105240],{},[8372,200158,200159,200161,200163,200165],{},[8391,200160,105245],{},[8391,200162,105248],{},[8391,200164,105251],{},[8391,200166,105254,200167,105257],{},[2996,200168],{},[8372,200170,200171,200173,200175,200177],{},[8391,200172,105262],{},[8391,200174,105265],{},[8391,200176,105268],{},[8391,200178,105254,200179,105257],{},[2996,200180],{},[13,200182,105275],{},[107,200184,105279],{"id":105278},[13,200186,105282],{},[13,200188,105285,200189,3784,200191,105292,200193,3784,200195,105298,200197],{},[22,200190,105288],{},[22,200192,105291],{},[22,200194,105295],{},[22,200196,826],{},[22,200198,832],{},[13,200200,105303,200201,105292,200203,105292,200205,105292,200207],{},[22,200202,64533],{},[22,200204,105308],{},[22,200206,105311],{},[22,200208,105314],{},[226,200210,228],{},{"title":119,"searchDepth":144,"depth":144,"links":200212},[200213,200214],{"id":104623,"depth":132,"text":104624},{"id":105278,"depth":132,"text":105279},{},{"title":104567,"description":104572},[246],{"id":105329,"title":105330,"assetBase":239,"author":8,"body":200219,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":202144,"navigation":128,"originalPath":108077,"path":108078,"seo":202145,"source":23330,"stem":108080,"tags":202146,"weight":250,"__hash__":108082},{"type":10,"value":200220,"toc":202066},[200221,200223,200235,200237,200239,200241,200243,200245,200253,200255,200257,200273,200275,200277,200279,200281,200297,200299,200301,200311,200313,200329,200331,200333,200335,200337,200339,200345,200347,200353,200355,200361,200363,200369,200371,200497,200499,200501,200503,200505,200507,200509,200655,200657,200659,200661,200663,200665,200667,200669,200671,200673,200675,200677,200679,200745,200747,200749,200751,200753,200755,200757,200759,200761,200763,200765,200767,200769,200775,200777,200781,200783,200785,200787,200789,200791,200793,200795,200797,200799,200801,200803,200805,200807,200809,200811,200813,200815,200817,200819,200821,200823,200825,200827,200829,200831,200833,200835,200837,200839,200841,200843,200845,200847,200849,200851,200853,200855,200857,200859,200861,200863,200865,200867,200871,200873,200877,200879,200881,200883,200885,200887,200903,200905,200907,200909,200911,200913,200915,200917,200919,200921,200923,200925,200927,200929,200931,200933,200935,200937,200939,200941,200943,200945,200947,200949,200951,200953,200955,200957,200969,200971,200973,200997,200999,201001,201003,201005,201017,201019,201021,201029,201031,201033,201035,201037,201039,201041,201043,201045,201047,201049,201051,201053,201069,201071,201073,201075,201077,201087,201089,201091,201095,201097,201099,201105,201107,201109,201113,201115,201117,201121,201123,201125,201127,201139,201141,201143,201147,201149,201151,201153,201157,201159,201161,201163,201165,201167,201177,201179,201181,201183,201187,201197,201199,201201,201203,201211,201213,201215,201223,201225,201227,201229,201231,201233,201235,201237,201241,201243,201245,201247,201249,201251,201253,201255,201257,201259,201261,201263,201265,201273,201275,201277,201279,201281,201283,201285,201287,201289,201291,201293,201295,201297,201299,201301,201303,201305,201307,201309,201311,201313,201315,201325,201329,201331,201335,201337,201339,201341,201363,201365,201367,201389,201391,201393,201395,201399,201401,201403,201405,201409,201411,201413,201415,201417,201425,201427,201429,201437,201439,201441,201445,201447,201449,201459,201461,201463,201471,201473,201475,201531,201533,201545,201547,201549,201571,201573,201575,201577,201579,201581,201583,201585,201587,201589,201591,201593,201601,201603,201605,201607,201609,201611,201613,201615,201617,201619,201621,201623,201625,201627,201629,201631,201633,201635,201637,201639,201641,201643,201645,201647,201649,201657,201659,201661,201669,201671,201673,201681,201683,201685,201687,201689,201691,201693,201695,201697,201699,201701,201703,201705,201707,201709,201711,201753,201755,201757,201759,201761,201765,201777,201779,201781,201795,201797,201809,201811,201819,201821,201823,201827,201845,201847,201849,201851,201861,201863,201867,201879,201881,201883,201888,201896,201902,201906,201908,201912,201914,201916,201918,201920,201924,201926,201928,201932,201934,201936,201938,201940,201942,201944,201948,201950,201952,201956,201958,201960,201964,201966,201968,201970,201974,201976,201978,201980,201984,201986,201988,201992,201994,201996,202000,202002,202004,202006,202010,202012,202014,202016,202020,202022,202024,202026,202030,202032,202034,202038,202040,202042,202044,202046,202050,202052,202054,202056,202058,202060,202062],[4517,200222,6380],{"id":6380},[72,200224,200225,200229,200231,200233],{},[13,200226,200227],{},[22,200228,23957],{},[13,200230,105343],{},[13,200232,105346],{},[13,200234,105349],{},[107,200236,105352],{"id":105352},[7759,200238,105356],{"id":105355},[13,200240,105359],{},[13,200242,105362],{},[13,200244,105365],{},[49,200246,200247,200249,200251],{},[52,200248,105370],{},[52,200250,105373],{},[52,200252,105376],{},[7759,200254,105379],{"id":105379},[13,200256,105382],{},[49,200258,200259,200261,200263,200265,200267,200269,200271],{},[52,200260,105387],{},[52,200262,105390],{},[52,200264,105393],{},[52,200266,105396],{},[52,200268,105399],{},[52,200270,105402],{},[52,200272,105405],{},[7759,200274,105408],{"id":105408},[10548,200276,105411],{"id":105411},[13,200278,105414],{},[10548,200280,105417],{"id":105417},[49,200282,200283,200285,200287,200289,200291,200293,200295],{},[52,200284,105422],{},[52,200286,105425],{},[52,200288,105428],{},[52,200290,105431],{},[52,200292,105434],{},[52,200294,105437],{},[52,200296,105440],{},[7759,200298,105443],{"id":105443},[10548,200300,105446],{"id":105446},[49,200302,200303,200305,200307,200309],{},[52,200304,105451],{},[52,200306,105454],{},[52,200308,105457],{},[52,200310,105460],{},[10548,200312,105463],{"id":105463},[49,200314,200315,200317,200319,200321,200323,200325,200327],{},[52,200316,105468],{},[52,200318,105471],{},[52,200320,105474],{},[52,200322,105477],{},[52,200324,105480],{},[52,200326,105483],{},[52,200328,105486],{},[23289,200330],{},[107,200332,105492],{"id":105491},[13,200334,105495],{},[13,200336,105498],{},[13,200338,105501],{},[49,200340,200341],{},[52,200342,200343],{},[617,200344],{"alt":119,"src":30426},[13,200346,105510],{},[49,200348,200349],{},[52,200350,200351],{},[617,200352],{"alt":119,"src":30562},[13,200354,105519],{},[49,200356,200357],{},[52,200358,200359],{},[617,200360],{"alt":119,"src":65400},[13,200362,105528],{},[49,200364,200365],{},[52,200366,200367],{},[617,200368],{"alt":119,"src":68935},[7759,200370,105538],{"id":105537},[8366,200372,200373,200387],{},[8369,200374,200375],{},[8372,200376,200377,200379,200381,200383,200385],{},[8375,200378,9947],{"align":9247},[8375,200380,9145],{},[8375,200382,105551],{"align":9247},[8375,200384,20689],{"align":9247},[8375,200386,20692],{"align":9247},[8386,200388,200389,200413,200443,200469],{},[8372,200390,200391,200393,200397,200401,200407],{},[8391,200392,105562],{"align":9247},[8391,200394,105565,200395,105568],{},[2996,200396],{},[8391,200398,200399],{"align":9247},[617,200400],{"alt":119,"src":71334},[8391,200402,105575,200403,105578,200405,105581],{"align":9247},[2996,200404],{},[2996,200406],{},[8391,200408,105584,200409,105587,200411,105590],{"align":9247},[2996,200410],{},[2996,200412],{},[8372,200414,200415,200417,200423,200427,200435],{},[8391,200416,105595],{"align":9247},[8391,200418,105598,200419,105601,200421,105604],{},[2996,200420],{},[2996,200422],{},[8391,200424,200425],{"align":9247},[617,200426],{"alt":119,"src":71318},[8391,200428,105611,200429,105614,200431,105617,200433,105620],{"align":9247},[2996,200430],{},[2996,200432],{},[2996,200434],{},[8391,200436,105623,200437,105626,200439,105629,200441,105632],{"align":9247},[2996,200438],{},[2996,200440],{},[2996,200442],{},[8372,200444,200445,200447,200451,200455,200463],{},[8391,200446,105637],{"align":9247},[8391,200448,105640,200449,105643],{},[2996,200450],{},[8391,200452,200453],{"align":9247},[617,200454],{"alt":119,"src":71326},[8391,200456,105650,200457,105653,200459,105656,200461,105659],{"align":9247},[2996,200458],{},[2996,200460],{},[2996,200462],{},[8391,200464,105662,200465,105665,200467,105668],{"align":9247},[2996,200466],{},[2996,200468],{},[8372,200470,200471,200473,200477,200481,200489],{},[8391,200472,105673],{"align":9247},[8391,200474,105676,200475,105679],{},[2996,200476],{},[8391,200478,200479],{"align":9247},[617,200480],{"alt":119,"src":105684},[8391,200482,105687,200483,105650,200485,105692,200487,105695],{"align":9247},[2996,200484],{},[2996,200486],{},[2996,200488],{},[8391,200490,105698,200491,105701,200493,105704,200495,105668],{"align":9247},[2996,200492],{},[2996,200494],{},[2996,200496],{},[23289,200498],{},[107,200500,105712],{"id":105711},[13,200502,105715],{},[13,200504,105718],{},[13,200506,105721],{},[13,200508,105724],{},[8366,200510,200511,200525],{},[8369,200512,200513],{},[8372,200514,200515,200517,200519,200521,200523],{},[8375,200516,105733],{"align":9247},[8375,200518,9145],{"align":8377},[8375,200520,105551],{},[8375,200522,20689],{"align":9247},[8375,200524,20692],{"align":9247},[8386,200526,200527,200555,200589,200621],{},[8372,200528,200529,200531,200537,200541,200549],{},[8391,200530,105748],{"align":9247},[8391,200532,105751,200533,105754,200535,105757],{"align":8377},[2996,200534],{},[2996,200536],{},[8391,200538,200539],{},[617,200540],{"alt":119,"src":29839},[8391,200542,105764,200543,105767,200545,105770,200547,105773],{"align":9247},[2996,200544],{},[2996,200546],{},[2996,200548],{},[8391,200550,105776,200551,105779,200553,105782],{"align":9247},[2996,200552],{},[2996,200554],{},[8372,200556,200557,200559,200569,200573,200581],{},[8391,200558,105787],{"align":9247},[8391,200560,105790,200561,105793,200563,105796,200565,105799,200567,105802],{"align":8377},[2996,200562],{},[2996,200564],{},[2996,200566],{},[2996,200568],{},[8391,200570,200571],{},[617,200572],{"alt":119,"src":62233},[8391,200574,105809,200575,105812,200577,105815,200579,105818],{"align":9247},[2996,200576],{},[2996,200578],{},[2996,200580],{},[8391,200582,105821,200583,105824,200585,105827,200587,105830],{"align":9247},[2996,200584],{},[2996,200586],{},[2996,200588],{},[8372,200590,200591,200593,200601,200605,200613],{},[8391,200592,105835],{"align":9247},[8391,200594,105838,200595,105841,200597,105844,200599,105847],{"align":8377},[2996,200596],{},[2996,200598],{},[2996,200600],{},[8391,200602,200603],{},[617,200604],{"alt":119,"src":71409},[8391,200606,105854,200607,105857,200609,105860,200611,105863],{"align":9247},[2996,200608],{},[2996,200610],{},[2996,200612],{},[8391,200614,105866,200615,105869,200617,105872,200619,105875],{"align":9247},[2996,200616],{},[2996,200618],{},[2996,200620],{},[8372,200622,200623,200625,200635,200639,200647],{},[8391,200624,105880],{"align":9247},[8391,200626,105883,200627,105886,200629,105889,200631,105892,200633,105895],{"align":8377},[2996,200628],{},[2996,200630],{},[2996,200632],{},[2996,200634],{},[8391,200636,200637],{},[617,200638],{"alt":119,"src":71417},[8391,200640,105902,200641,105905,200643,105908,200645,105911],{"align":9247},[2996,200642],{},[2996,200644],{},[2996,200646],{},[8391,200648,105914,200649,105917,200651,105920,200653,105668],{"align":9247},[2996,200650],{},[2996,200652],{},[2996,200654],{},[23289,200656],{},[107,200658,105928],{"id":105927},[13,200660,105931],{},[7759,200662,105934],{"id":105934},[13,200664,105937],{},[13,200666,105940],{},[13,200668,105943],{},[13,200670,105946],{},[13,200672,105949],{},[13,200674,105952],{},[13,200676,105955],{},[7759,200678,105958],{"id":105958},[8366,200680,200681,200689],{},[8369,200682,200683],{},[8372,200684,200685,200687],{},[8375,200686,105967],{"align":9247},[8375,200688,105637],{"align":9247},[8386,200690,200691,200697,200703,200709,200715,200721,200727,200733,200739],{},[8372,200692,200693,200695],{},[8391,200694,105976],{"align":9247},[8391,200696,105979],{"align":9247},[8372,200698,200699,200701],{},[8391,200700,105984],{"align":9247},[8391,200702,105987],{"align":9247},[8372,200704,200705,200707],{},[8391,200706,105992],{"align":9247},[8391,200708,105995],{"align":9247},[8372,200710,200711,200713],{},[8391,200712,106000],{"align":9247},[8391,200714,106003],{"align":9247},[8372,200716,200717,200719],{},[8391,200718,106008],{"align":9247},[8391,200720,106011],{"align":9247},[8372,200722,200723,200725],{},[8391,200724,106016],{"align":9247},[8391,200726,106019],{"align":9247},[8372,200728,200729,200731],{},[8391,200730,106024],{"align":9247},[8391,200732,106027],{"align":9247},[8372,200734,200735,200737],{},[8391,200736,106032],{"align":9247},[8391,200738,106035],{"align":9247},[8372,200740,200741,200743],{},[8391,200742,106040],{"align":9247},[8391,200744,106043],{"align":9247},[7759,200746,106046],{"id":106046},[13,200748,106049],{},[13,200750,106052],{},[13,200752,106055],{},[13,200754,106058],{},[13,200756,106061],{},[13,200758,106064],{},[13,200760,106067],{},[13,200762,106070],{},[13,200764,106073],{},[13,200766,106076],{},[13,200768,106079],{},[49,200770,200771,200773],{},[52,200772,106084],{},[52,200774,106087],{},[7759,200776,106090],{"id":106090},[13,200778,200779],{},[617,200780],{"alt":119,"src":30157},[13,200782,106097],{},[13,200784,106100],{},[13,200786,106103],{},[13,200788,106106],{},[7759,200790,106109],{"id":106109},[10548,200792,106113],{"id":106112},[13,200794,106116],{},[10548,200796,106120],{"id":106119},[13,200798,106123],{},[10548,200800,106127],{"id":106126},[13,200802,106130],{},[10548,200804,106134],{"id":106133},[13,200806,106137],{},[10548,200808,106141],{"id":106140},[13,200810,106144],{},[10548,200812,106148],{"id":106147},[13,200814,106151],{},[10548,200816,106155],{"id":106154},[13,200818,106158],{},[7759,200820,106161],{"id":106161},[10548,200822,106165],{"id":106164},[13,200824,106168],{},[10548,200826,106172],{"id":106171},[13,200828,106175],{},[10548,200830,106179],{"id":106178},[13,200832,106182],{},[10548,200834,106186],{"id":106185},[13,200836,106189],{},[10548,200838,106193],{"id":106192},[13,200840,106196],{},[10548,200842,106200],{"id":106199},[13,200844,106203],{},[7759,200846,106206],{"id":106206},[13,200848,106209],{},[10548,200850,106213],{"id":106212},[13,200852,106216],{},[10548,200854,106220],{"id":106219},[13,200856,106223],{},[10548,200858,106227],{"id":106226},[13,200860,106230],{},[10548,200862,106234],{"id":106233},[13,200864,106237],{},[13,200866,106240],{},[13,200868,200869],{},[617,200870],{"alt":119,"src":30871},[7759,200872,106247],{"id":106247},[13,200874,200875],{},[617,200876],{"alt":119,"src":30924},[23289,200878],{},[107,200880,106257],{"id":106256},[7759,200882,106260],{"id":106260},[13,200884,106263],{},[13,200886,106266],{},[49,200888,200889,200891,200893,200895,200897,200899,200901],{},[52,200890,106271],{},[52,200892,106274],{},[52,200894,106277],{},[52,200896,106280],{},[52,200898,106283],{},[52,200900,106286],{},[52,200902,106289],{},[7759,200904,106292],{"id":106292},[13,200906,106295],{},[23289,200908],{},[107,200910,106301],{"id":106300},[13,200912,106304],{},[7759,200914,106307],{"id":106307},[13,200916,106310],{},[13,200918,106313],{},[13,200920,106316],{},[10548,200922,106320],{"id":106319},[13,200924,106323],{},[10548,200926,106327],{"id":106326},[13,200928,106330],{},[10548,200930,106334],{"id":106333},[13,200932,106337],{},[10548,200934,106341],{"id":106340},[13,200936,106344],{},[10548,200938,106348],{"id":106347},[13,200940,106351],{},[10548,200942,106355],{"id":106354},[13,200944,106358],{},[10548,200946,106362],{"id":106361},[13,200948,106365],{},[7759,200950,106368],{"id":106368},[13,200952,106371],{},[7759,200954,106374],{"id":106374},[13,200956,106377],{},[49,200958,200959,200961,200963,200965,200967],{},[52,200960,106382],{},[52,200962,106385],{},[52,200964,106388],{},[52,200966,106391],{},[52,200968,106394],{},[7759,200970,106397],{"id":106397},[13,200972,106400],{},[49,200974,200975,200977,200979,200981,200983,200985,200987,200989,200991,200993,200995],{},[52,200976,106405],{},[52,200978,106408],{},[52,200980,106411],{},[52,200982,106414],{},[52,200984,106417],{},[52,200986,106420],{},[52,200988,106423],{},[52,200990,106426],{},[52,200992,106429],{},[52,200994,106432],{},[52,200996,106435],{},[23289,200998],{},[107,201000,106441],{"id":106440},[7759,201002,106445],{"id":106444},[13,201004,106448],{},[49,201006,201007,201009,201011,201013,201015],{},[52,201008,106453],{},[52,201010,106456],{},[52,201012,106459],{},[52,201014,106462],{},[52,201016,106465],{},[13,201018,106468],{},[10548,201020,106471],{"id":106471},[49,201022,201023,201025,201027],{},[52,201024,106476],{},[52,201026,106479],{},[52,201028,106482],{},[13,201030,106485],{},[7759,201032,106488],{"id":106488},[10548,201034,106492],{"id":106491},[13,201036,106495],{},[10548,201038,106499],{"id":106498},[13,201040,106502],{},[10548,201042,106506],{"id":106505},[13,201044,106509],{},[10548,201046,106513],{"id":106512},[10548,201048,106517],{"id":106516},[7759,201050,106520],{"id":106520},[10548,201052,106523],{"id":106523},[49,201054,201055,201057,201059,201061,201063,201065,201067],{},[52,201056,106528],{},[52,201058,106531],{},[52,201060,106534],{},[52,201062,106537],{},[52,201064,106540],{},[52,201066,106543],{},[52,201068,106546],{},[10548,201070,106549],{"id":106549},[13,201072,106552],{},[13,201074,106555],{},[13,201076,106558],{},[49,201078,201079,201081,201083,201085],{},[52,201080,106563],{},[52,201082,106566],{},[52,201084,106569],{},[52,201086,106572],{},[10548,201088,106576],{"id":106575},[13,201090,106579],{},[13,201092,201093],{},[617,201094],{"alt":119,"src":31471},[7759,201096,106586],{"id":106586},[13,201098,106589],{},[49,201100,201101,201103],{},[52,201102,106594],{},[52,201104,106597],{},[10548,201106,106600],{"id":106600},[13,201108,106603],{},[13,201110,201111],{},[617,201112],{"alt":119,"src":31499},[10548,201114,106611],{"id":106610},[13,201116,106614],{},[13,201118,201119],{},[617,201120],{"alt":119,"src":73607},[7759,201122,106621],{"id":106621},[13,201124,106624],{},[13,201126,106627],{},[49,201128,201129,201131,201133,201135,201137],{},[52,201130,106632],{},[52,201132,106635],{},[52,201134,106638],{},[52,201136,106641],{},[52,201138,106644],{},[10548,201140,106648],{"id":106647},[13,201142,106651],{},[13,201144,201145],{},[617,201146],{"alt":119,"src":73612},[10548,201148,106659],{"id":106658},[13,201150,106662],{},[13,201152,106665],{},[13,201154,201155],{},[617,201156],{"alt":119,"src":73636},[23289,201158],{},[107,201160,106675],{"id":106674},[13,201162,106678],{},[13,201164,106681],{},[13,201166,106684],{},[49,201168,201169,201171,201173,201175],{},[52,201170,106689],{},[52,201172,106692],{},[52,201174,106695],{},[52,201176,106698],{},[13,201178,106701],{},[7759,201180,106704],{"id":106704},[13,201182,106707],{},[13,201184,201185],{},[617,201186],{"alt":119,"src":62619},[49,201188,201189,201191,201193,201195],{},[52,201190,106716],{},[52,201192,106719],{},[52,201194,106722],{},[52,201196,106725],{},[13,201198,106728],{},[7759,201200,106731],{"id":106731},[10548,201202,106734],{"id":106734},[49,201204,201205,201207,201209],{},[52,201206,106739],{},[52,201208,106742],{},[52,201210,106745],{},[10548,201212,106748],{"id":106748},[13,201214,106751],{},[49,201216,201217,201219,201221],{},[52,201218,106756],{},[52,201220,106759],{},[52,201222,106762],{},[13,201224,106765],{},[13,201226,106768],{},[13,201228,106771],{},[13,201230,106774],{},[13,201232,106777],{},[13,201234,106780],{},[13,201236,106783],{},[13,201238,201239],{},[617,201240],{"alt":119,"src":62640},[7759,201242,106790],{"id":106790},[10548,201244,106794],{"id":106793},[13,201246,106797],{},[13,201248,106800],{},[10548,201250,106804],{"id":106803},[13,201252,106807],{},[13,201254,106810],{},[13,201256,106813],{},[13,201258,106816],{},[10548,201260,106820],{"id":106819},[13,201262,106823],{},[13,201264,106826],{},[49,201266,201267,201269,201271],{},[52,201268,106831],{},[52,201270,106834],{},[52,201272,106837],{},[10548,201274,106841],{"id":106840},[13,201276,106844],{},[10548,201278,106848],{"id":106847},[13,201280,106851],{},[13,201282,106854],{},[10548,201284,106858],{"id":106857},[13,201286,106861],{},[13,201288,106864],{},[10548,201290,106868],{"id":106867},[13,201292,106871],{},[13,201294,106874],{},[13,201296,106877],{},[10548,201298,106881],{"id":106880},[13,201300,106884],{},[13,201302,106887],{},[10548,201304,106891],{"id":106890},[13,201306,106894],{},[10548,201308,106898],{"id":106897},[13,201310,106901],{},[13,201312,106904],{},[13,201314,106907],{},[49,201316,201317,201319,201321,201323],{},[52,201318,106912],{},[52,201320,106915],{},[52,201322,106918],{},[52,201324,106921],{},[13,201326,201327],{},[617,201328],{"alt":119,"src":62679},[7759,201330,106928],{"id":106928},[13,201332,201333],{},[617,201334],{"alt":119,"src":106933},[13,201336,106936],{},[10548,201338,106940],{"id":106939},[13,201340,106943],{},[49,201342,201343,201345,201347,201349,201351,201353,201355,201357,201359,201361],{},[52,201344,106948],{},[52,201346,106951],{},[52,201348,106954],{},[52,201350,106957],{},[52,201352,106960],{},[52,201354,106963],{},[52,201356,106966],{},[52,201358,106969],{},[52,201360,106972],{},[52,201362,106975],{},[10548,201364,106979],{"id":106978},[13,201366,106982],{},[49,201368,201369,201377,201383],{},[52,201370,106987,201371],{},[49,201372,201373,201375],{},[52,201374,106992],{},[52,201376,106995],{},[52,201378,106998,201379],{},[49,201380,201381],{},[52,201382,107003],{},[52,201384,107006,201385],{},[49,201386,201387],{},[52,201388,107011],{},[13,201390,107014],{},[10548,201392,107018],{"id":107017},[13,201394,107021],{},[13,201396,201397,107027],{},[617,201398],{"alt":119,"src":107026},[13,201400,107030],{},[10548,201402,107034],{"id":107033},[13,201404,107037],{},[13,201406,201407],{},[617,201408],{"alt":119,"src":107042},[23289,201410],{},[107,201412,107048],{"id":107047},[7759,201414,62674],{"id":62674},[13,201416,107053],{},[49,201418,201419,201421,201423],{},[52,201420,107058],{},[52,201422,107061],{},[52,201424,107064],{},[13,201426,107067],{},[10548,201428,107070],{"id":107070},[49,201430,201431,201433,201435],{},[52,201432,107075],{},[52,201434,107078],{},[52,201436,107081],{},[13,201438,107084],{},[13,201440,107087],{},[13,201442,201443],{},[617,201444],{"alt":119,"src":31760},[7759,201446,107094],{"id":107094},[13,201448,107097],{},[49,201450,201451,201453,201455,201457],{},[52,201452,107102],{},[52,201454,107105],{},[52,201456,107108],{},[52,201458,107111],{},[13,201460,107114],{},[13,201462,107117],{},[49,201464,201465,201467,201469],{},[52,201466,107122],{},[52,201468,107125],{},[52,201470,107128],{},[13,201472,107131],{},[10548,201474,107134],{"id":107134},[49,201476,201477,201485,201493,201507,201515,201523],{},[52,201478,107139,201479],{},[49,201480,201481],{},[52,201482,201483],{},[617,201484],{"alt":119,"src":31862},[52,201486,107148,201487],{},[49,201488,201489],{},[52,201490,201491],{},[617,201492],{"alt":119,"src":107155},[52,201494,107158,201495],{},[49,201496,201497,201505],{},[52,201498,107163,201499],{},[49,201500,201501],{},[52,201502,201503],{},[617,201504],{"alt":119,"src":107170},[52,201506,107173],{},[52,201508,107176,201509],{},[49,201510,201511],{},[52,201512,201513],{},[617,201514],{"alt":119,"src":107183},[52,201516,107186,201517],{},[49,201518,201519],{},[52,201520,201521],{},[617,201522],{"alt":119,"src":107193},[52,201524,107196,201525],{},[49,201526,201527],{},[52,201528,201529],{},[617,201530],{"alt":119,"src":107203},[7759,201532,107206],{"id":107206},[49,201534,201535,201537,201539,201541,201543],{},[52,201536,107211],{},[52,201538,107214],{},[52,201540,107217],{},[52,201542,107220],{},[52,201544,107223],{},[7759,201546,107226],{"id":107226},[13,201548,107229],{},[49,201550,201551,201553,201555,201565,201567,201569],{},[52,201552,107234],{},[52,201554,107237],{},[52,201556,107240,201557],{},[49,201558,201559,201561,201563],{},[52,201560,107245],{},[52,201562,107248],{},[52,201564,107251],{},[52,201566,107254],{},[52,201568,107257],{},[52,201570,107260],{},[13,201572,107263],{},[23289,201574],{},[107,201576,107269],{"id":107268},[13,201578,107272],{},[7759,201580,107276],{"id":107275},[13,201582,107279],{},[10548,201584,107282],{"id":107282},[13,201586,107285],{},[10548,201588,107288],{"id":107288},[13,201590,107291],{},[13,201592,107294],{},[49,201594,201595,201597,201599],{},[52,201596,107299],{},[52,201598,107302],{},[52,201600,107305],{},[7759,201602,107309],{"id":107308},[10548,201604,107313],{"id":107312},[13,201606,107316],{},[13,201608,107319],{},[10548,201610,107323],{"id":107322},[13,201612,107326],{},[13,201614,107329],{},[10548,201616,107333],{"id":107332},[13,201618,107336],{},[13,201620,107339],{},[10548,201622,107343],{"id":107342},[13,201624,107346],{},[13,201626,107349],{},[13,201628,107352],{},[10548,201630,107356],{"id":107355},[13,201632,107359],{},[13,201634,107362],{},[10548,201636,107366],{"id":107365},[13,201638,107369],{},[13,201640,107372],{},[10548,201642,107376],{"id":107375},[13,201644,107379],{},[13,201646,107382],{},[7759,201648,107385],{"id":107385},[49,201650,201651,201653,201655],{},[52,201652,107390],{},[52,201654,107393],{},[52,201656,107396],{},[7759,201658,107400],{"id":107399},[13,201660,107403],{},[49,201662,201663,201665,201667],{},[52,201664,107408],{},[52,201666,107411],{},[52,201668,107414],{},[7759,201670,107418],{"id":107417},[13,201672,107421],{},[49,201674,201675,201677,201679],{},[52,201676,107426],{},[52,201678,107429],{},[52,201680,107432],{},[13,201682,107435],{},[7759,201684,107438],{"id":107438},[13,201686,107441],{},[10548,201688,107445],{"id":107444},[10548,201690,107449],{"id":107448},[10548,201692,107453],{"id":107452},[13,201694,107456],{},[13,201696,107459],{},[13,201698,107462],{},[13,201700,107465],{},[10548,201702,107469],{"id":107468},[10548,201704,107473],{"id":107472},[10548,201706,107477],{"id":107476},[10548,201708,107481],{"id":107480},[7759,201710,107484],{"id":107484},[8366,201712,201713,201721],{},[8369,201714,201715],{},[8372,201716,201717,201719],{},[8375,201718,98366],{},[8375,201720,107495],{},[8386,201722,201723,201729,201735,201741,201747],{},[8372,201724,201725,201727],{},[8391,201726,107502],{},[8391,201728,107505],{},[8372,201730,201731,201733],{},[8391,201732,107510],{},[8391,201734,107513],{},[8372,201736,201737,201739],{},[8391,201738,107518],{},[8391,201740,107521],{},[8372,201742,201743,201745],{},[8391,201744,107526],{},[8391,201746,107529],{},[8372,201748,201749,201751],{},[8391,201750,107534],{},[8391,201752,107537],{},[23289,201754],{},[107,201756,107543],{"id":107542},[13,201758,107546],{},[7759,201760,107549],{"id":107549},[13,201762,201763],{},[617,201764],{"alt":119,"src":32278},[49,201766,201767,201769,201771,201773,201775],{},[52,201768,107558],{},[52,201770,107561],{},[52,201772,107564],{},[52,201774,107567],{},[52,201776,107570],{},[7759,201778,107573],{"id":107573},[10548,201780,107577],{"id":107576},[49,201782,201783,201785,201787,201789,201791,201793],{},[52,201784,107582],{},[52,201786,107585],{},[52,201788,107588],{},[52,201790,107591],{},[52,201792,107594],{},[52,201794,107597],{},[10548,201796,107601],{"id":107600},[49,201798,201799,201801,201803,201805,201807],{},[52,201800,107606],{},[52,201802,107609],{},[52,201804,107612],{},[52,201806,107615],{},[52,201808,107618],{},[10548,201810,107622],{"id":107621},[49,201812,201813,201815,201817],{},[52,201814,107627],{},[52,201816,107630],{},[52,201818,107633],{},[10548,201820,107636],{"id":107636},[13,201822,107639],{},[13,201824,201825],{},[617,201826],{"alt":119,"src":32374},[49,201828,201829,201831,201833,201835],{},[52,201830,107648],{},[52,201832,107651],{},[52,201834,107654],{},[52,201836,107657,201837],{},[49,201838,201839,201841,201843],{},[52,201840,107662],{},[52,201842,107665],{},[52,201844,107668],{},[7759,201846,107671],{"id":107671},[13,201848,107674],{},[13,201850,107677],{},[49,201852,201853,201855,201857,201859],{},[52,201854,107682],{},[52,201856,107685],{},[52,201858,107688],{},[52,201860,107691],{},[7759,201862,107694],{"id":107694},[13,201864,201865],{},[617,201866],{"alt":119,"src":107699},[49,201868,201869,201871,201873,201875,201877],{},[52,201870,107704],{},[52,201872,107707],{},[52,201874,107710],{},[52,201876,107713],{},[52,201878,107716],{},[23289,201880],{},[107,201882,107722],{"id":107721},[13,201884,107725,201885,28447],{},[5009,201886,107730],{"href":107728,"rel":201887},[23647],[13,201889,107733,201890,107737,201892,107741,201894,107745],{},[22,201891,107736],{},[22,201893,107740],{},[22,201895,107744],{},[13,201897,107748,201898,107752,201900,107756],{},[22,201899,107751],{},[22,201901,107755],{},[13,201903,201904],{},[22,201905,107761],{},[13,201907,107764],{},[13,201909,201910],{},[22,201911,107769],{},[13,201913,107772],{},[13,201915,107775],{},[13,201917,107778],{},[23090,201919,107782],{"id":107781},[13,201921,201922],{},[617,201923],{"alt":617,"src":32454},[23090,201925,107790],{"id":107789},[13,201927,107793],{},[13,201929,201930],{},[617,201931],{"alt":617,"src":107798},[23090,201933,107802],{"id":107801},[13,201935,107805],{},[13,201937,107808],{},[13,201939,107811],{},[13,201941,107814],{},[13,201943,107817],{},[13,201945,107820,201946],{},[617,201947],{"alt":617,"src":107823},[13,201949,107826],{},[13,201951,107829],{},[13,201953,107832,201954],{},[617,201955],{"alt":617,"src":107835},[13,201957,107838],{},[13,201959,107841],{},[13,201961,107832,201962],{},[617,201963],{"alt":617,"src":107846},[13,201965,107849],{},[13,201967,107852],{},[13,201969,107855],{},[13,201971,107858,201972],{},[617,201973],{"alt":617,"src":107861},[13,201975,107864],{},[13,201977,107867],{},[13,201979,107870],{},[13,201981,107832,201982],{},[617,201983],{"alt":617,"src":107875},[13,201985,107878],{},[13,201987,107881],{},[13,201989,107820,201990],{},[617,201991],{"alt":617,"src":107886},[23090,201993,107890],{"id":107889},[13,201995,107893],{},[13,201997,201998],{},[617,201999],{"alt":617,"src":107898},[23090,202001,107902],{"id":107901},[13,202003,107905],{},[13,202005,107908],{},[13,202007,202008],{},[617,202009],{"alt":617,"src":107913},[23090,202011,107917],{"id":107916},[13,202013,107920],{},[13,202015,107923],{},[13,202017,202018],{},[617,202019],{"alt":617,"src":107928},[23090,202021,107932],{"id":107931},[13,202023,107935],{},[13,202025,107938],{},[13,202027,202028],{},[617,202029],{"alt":617,"src":107943},[23090,202031,107947],{"id":107946},[13,202033,107950],{},[13,202035,202036],{},[617,202037],{"alt":617,"src":107955},[23090,202039,107959],{"id":107958},[13,202041,107962],{},[13,202043,107965],{},[13,202045,107968],{},[13,202047,202048],{},[617,202049],{"alt":617,"src":107973},[23090,202051,107977],{"id":107976},[13,202053,107980],{},[13,202055,107983],{},[13,202057,107986],{},[13,202059,107989],{},[13,202061,107992],{},[13,202063,202064],{},[617,202065],{"alt":617,"src":107997},{"title":119,"searchDepth":144,"depth":144,"links":202067},[202068,202074,202077,202078,202088,202092,202098,202105,202111,202117,202126,202132],{"id":105352,"depth":132,"text":105352,"children":202069},[202070,202071,202072,202073],{"id":105355,"depth":144,"text":105356},{"id":105379,"depth":144,"text":105379},{"id":105408,"depth":144,"text":105408},{"id":105443,"depth":144,"text":105443},{"id":105491,"depth":132,"text":105492,"children":202075},[202076],{"id":105537,"depth":144,"text":105538},{"id":105711,"depth":132,"text":105712},{"id":105927,"depth":132,"text":105928,"children":202079},[202080,202081,202082,202083,202084,202085,202086,202087],{"id":105934,"depth":144,"text":105934},{"id":105958,"depth":144,"text":105958},{"id":106046,"depth":144,"text":106046},{"id":106090,"depth":144,"text":106090},{"id":106109,"depth":144,"text":106109},{"id":106161,"depth":144,"text":106161},{"id":106206,"depth":144,"text":106206},{"id":106247,"depth":144,"text":106247},{"id":106256,"depth":132,"text":106257,"children":202089},[202090,202091],{"id":106260,"depth":144,"text":106260},{"id":106292,"depth":144,"text":106292},{"id":106300,"depth":132,"text":106301,"children":202093},[202094,202095,202096,202097],{"id":106307,"depth":144,"text":106307},{"id":106368,"depth":144,"text":106368},{"id":106374,"depth":144,"text":106374},{"id":106397,"depth":144,"text":106397},{"id":106440,"depth":132,"text":106441,"children":202099},[202100,202101,202102,202103,202104],{"id":106444,"depth":144,"text":106445},{"id":106488,"depth":144,"text":106488},{"id":106520,"depth":144,"text":106520},{"id":106586,"depth":144,"text":106586},{"id":106621,"depth":144,"text":106621},{"id":106674,"depth":132,"text":106675,"children":202106},[202107,202108,202109,202110],{"id":106704,"depth":144,"text":106704},{"id":106731,"depth":144,"text":106731},{"id":106790,"depth":144,"text":106790},{"id":106928,"depth":144,"text":106928},{"id":107047,"depth":132,"text":107048,"children":202112},[202113,202114,202115,202116],{"id":62674,"depth":144,"text":62674},{"id":107094,"depth":144,"text":107094},{"id":107206,"depth":144,"text":107206},{"id":107226,"depth":144,"text":107226},{"id":107268,"depth":132,"text":107269,"children":202118},[202119,202120,202121,202122,202123,202124,202125],{"id":107275,"depth":144,"text":107276},{"id":107308,"depth":144,"text":107309},{"id":107385,"depth":144,"text":107385},{"id":107399,"depth":144,"text":107400},{"id":107417,"depth":144,"text":107418},{"id":107438,"depth":144,"text":107438},{"id":107484,"depth":144,"text":107484},{"id":107542,"depth":132,"text":107543,"children":202127},[202128,202129,202130,202131],{"id":107549,"depth":144,"text":107549},{"id":107573,"depth":144,"text":107573},{"id":107671,"depth":144,"text":107671},{"id":107694,"depth":144,"text":107694},{"id":107721,"depth":132,"text":107722,"children":202133},[202134,202135,202136,202137,202138,202139,202140,202141,202142,202143],{"id":107781,"depth":138,"text":107782},{"id":107789,"depth":138,"text":107790},{"id":107801,"depth":138,"text":107802},{"id":107889,"depth":138,"text":107890},{"id":107901,"depth":138,"text":107902},{"id":107916,"depth":138,"text":107917},{"id":107931,"depth":138,"text":107932},{"id":107946,"depth":138,"text":107947},{"id":107958,"depth":138,"text":107959},{"id":107976,"depth":138,"text":107977},{},{"title":105330,"description":119},[246,6380,14542,23333],{"id":108084,"title":108085,"assetBase":239,"author":8,"body":202148,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":202956,"navigation":128,"originalPath":109255,"path":109256,"seo":202957,"source":23330,"stem":109258,"tags":202958,"weight":250,"__hash__":109260},{"type":10,"value":202149,"toc":202926},[202150,202152,202154,202158,202160,202162,202164,202168,202172,202182,202184,202188,202190,202192,202196,202198,202200,202204,202208,202212,202216,202220,202224,202228,202230,202232,202236,202238,202260,202262,202264,202266,202268,202286,202288,202290,202304,202306,202308,202310,202314,202316,202318,202320,202322,202324,202328,202330,202334,202336,202340,202344,202346,202350,202354,202358,202362,202364,202368,202372,202376,202380,202384,202388,202390,202394,202400,202402,202408,202412,202414,202432,202434,202438,202440,202442,202444,202464,202466,202468,202470,202472,202474,202476,202478,202480,202484,202490,202494,202498,202500,202502,202504,202510,202512,202514,202518,202520,202522,202530,202532,202534,202542,202544,202554,202556,202562,202572,202574,202576,202578,202580,202582,202584,202586,202588,202590,202592,202594,202596,202602,202604,202606,202608,202610,202612,202614,202618,202620,202624,202626,202628,202630,202632,202634,202636,202638,202640,202642,202644,202646,202648,202650,202652,202654,202656,202660,202662,202688,202690,202692,202702,202706,202710,202714,202718,202722,202726,202730,202734,202738,202742,202746,202750,202752,202754,202764,202768,202770,202772,202788,202790,202800,202802,202810,202814,202828,202830,202834,202836,202838,202844,202846,202848,202854,202856,202858,202862,202866,202868,202870,202872,202876,202878,202880,202882,202886,202888,202900,202902,202910,202912,202920,202922,202924],[4517,202151,108085],{"id":108090},[107,202153,108094],{"id":108093},[13,202155,108097,202156,108101],{},[22,202157,108100],{},[7759,202159,108105],{"id":108104},[10548,202161,62489],{"id":62488},[13,202163,108110],{},[13,202165,108113,202166],{},[22,202167,108116],{},[13,202169,108119,202170],{},[22,202171,108122],{},[49,202173,202174,202176,202178,202180],{},[52,202175,108127],{},[52,202177,108130],{},[52,202179,108133],{},[52,202181,108136],{},[10548,202183,108140],{"id":108139},[13,202185,202186],{},[617,202187],{"alt":119,"src":66141},[10548,202189,108148],{"id":108147},[13,202191,108151],{},[13,202193,202194],{},[617,202195],{"alt":119,"src":71739},[10548,202197,108159],{"id":108158},[13,202199,108162],{},[72,202201,202202],{},[13,202203,108167],{},[13,202205,202206],{},[617,202207],{"alt":119,"src":71744},[13,202209,202210],{},[617,202211],{"alt":119,"src":71755},[13,202213,202214],{},[617,202215],{"alt":119,"src":71760},[13,202217,202218],{},[617,202219],{"alt":119,"src":71771},[13,202221,202222],{},[617,202223],{"alt":119,"src":71776},[13,202225,202226],{},[617,202227],{"alt":119,"src":71790},[7759,202229,29537],{"id":29536},[13,202231,108196],{},[13,202233,108199,202234,108203],{},[22,202235,108202],{},[10548,202237,108207],{"id":108206},[49,202239,202240],{},[52,202241,108212,202242],{},[49,202243,202244,202246],{},[52,202245,108217],{},[52,202247,108220,202248],{},[49,202249,202250,202252,202254,202256,202258],{},[52,202251,108225],{},[52,202253,108228],{},[52,202255,108231],{},[52,202257,108234],{},[52,202259,108237],{},[10548,202261,108240],{"id":61953},[13,202263,108243],{},[10548,202265,108247],{"id":108246},[13,202267,108250],{},[49,202269,202270,202276,202282,202284],{},[52,202271,108255,202272],{},[49,202273,202274],{},[52,202275,108260],{},[52,202277,108263,202278],{},[49,202279,202280],{},[52,202281,108268],{},[52,202283,108271],{},[52,202285,108274],{},[10548,202287,108278],{"id":108277},[13,202289,108281],{},[49,202291,202292,202298],{},[52,202293,108286,202294],{},[49,202295,202296],{},[52,202297,108291],{},[52,202299,108294,202300],{},[49,202301,202302],{},[52,202303,108299],{},[7759,202305,108303],{"id":108302},[13,202307,108306],{},[13,202309,108309],{},[72,202311,202312],{},[13,202313,108314],{},[13,202315,108317],{},[23289,202317],{},[107,202319,108323],{"id":108322},[7759,202321,108327],{"id":108326},[13,202323,108330],{},[13,202325,108333,202326,67],{},[22,202327,108336],{},[7759,202329,108340],{"id":108339},[13,202331,202332],{},[617,202333],{"alt":119,"src":31273},[13,202335,108347],{},[13,202337,108350,202338,67],{},[22,202339,108353],{},[13,202341,202342],{},[617,202343],{"alt":119,"src":31282},[13,202345,108360],{},[13,202347,108363,202348,67],{},[22,202349,108366],{},[13,202351,202352,108372],{},[22,202353,108371],{},[13,202355,202356],{},[617,202357],{"alt":119,"src":31302},[13,202359,202360,108382],{},[22,202361,108381],{},[10548,202363,108385],{"id":108385},[13,202365,202366],{},[617,202367],{"alt":119,"src":31317},[13,202369,202370],{},[617,202371],{"alt":119,"src":31335},[13,202373,202374,108399],{},[22,202375,108398],{},[13,202377,202378],{},[22,202379,108404],{},[13,202381,202382],{},[617,202383],{"alt":119,"src":31411},[13,202385,202386],{},[617,202387],{"alt":119,"src":108413},[7759,202389,108417],{"id":108416},[13,202391,108420,202392,108424],{},[22,202393,108423],{},[49,202395,202396,202398],{},[52,202397,108429],{},[52,202399,108432],{},[10548,202401,108436],{"id":108435},[2285,202403,202404,202406],{},[52,202405,108441],{},[52,202407,108444],{},[13,202409,202410],{},[22,202411,108449],{},[10548,202413,108453],{"id":108452},[2285,202415,202416,202418,202428],{},[52,202417,108458],{},[52,202419,108461,202420],{},[49,202421,202422,202424,202426],{},[52,202423,108466],{},[52,202425,108469],{},[52,202427,108472],{},[52,202429,108475,202430,108479],{},[22,202431,108478],{},[10548,202433,108483],{"id":108482},[13,202435,108486,202436,108490],{},[22,202437,108489],{},[7759,202439,108494],{"id":108493},[13,202441,108497],{},[10548,202443,108501],{"id":108500},[2285,202445,202446,202448,202462],{},[52,202447,108506],{},[52,202449,108509,202450],{},[49,202451,202452,202454,202458],{},[52,202453,108514],{},[52,202455,108517,202456,67],{},[22,202457,108520],{},[52,202459,108523,202460,67],{},[22,202461,108526],{},[52,202463,108529],{},[13,202465,108532],{},[10548,202467,108536],{"id":108535},[13,202469,108539],{},[13,202471,108542],{},[23289,202473],{},[107,202475,108548],{"id":108547},[7759,202477,108552],{"id":108551},[10548,202479,30037],{"id":30036},[13,202481,202482,108560],{},[22,202483,108559],{},[13,202485,108563,202486,108567,202488,67],{},[22,202487,108566],{},[22,202489,108570],{},[13,202491,202492,108575],{},[22,202493,108217],{},[13,202495,108578,202496,108582],{},[22,202497,108581],{},[13,202499,108585],{},[10548,202501,108589],{"id":108588},[13,202503,108592],{},[49,202505,202506,202508],{},[52,202507,108597],{},[52,202509,108600],{},[13,202511,108603],{},[7759,202513,108607],{"id":108606},[13,202515,202516],{},[617,202517],{"alt":119,"src":31471},[10548,202519,108614],{"id":108614},[13,202521,108617],{},[2285,202523,202524,202526],{},[52,202525,108622],{},[52,202527,108625,202528,108629],{},[78,202529,108628],{},[7759,202531,108633],{"id":108632},[10548,202533,108637],{"id":108636},[13,202535,108640,202536,108644,202538,108648,202540,67],{},[22,202537,108643],{},[22,202539,108647],{},[22,202541,108651],{},[10548,202543,108655],{"id":108654},[49,202545,202546,202548,202550,202552],{},[52,202547,108660],{},[52,202549,108647],{},[52,202551,108665],{},[52,202553,108668],{},[10548,202555,108672],{"id":108671},[13,202557,108675,202558,108679,202560,108683],{},[22,202559,108678],{},[22,202561,108682],{},[49,202563,202564,202568],{},[52,202565,202566],{},[22,202567,108690],{},[52,202569,202570],{},[22,202571,108695],{},[13,202573,108698],{},[7759,202575,108702],{"id":108701},[13,202577,108705],{},[10548,202579,108708],{"id":108708},[13,202581,108711],{},[13,202583,108714],{},[13,202585,108717],{},[13,202587,108720],{},[13,202589,108723],{},[13,202591,108726],{},[13,202593,108729],{},[7759,202595,108733],{"id":108732},[13,202597,108736,202598,108740,202600],{},[22,202599,108739],{},[22,202601,108743],{},[10548,202603,108708],{"id":108746},[13,202605,108749],{},[13,202607,108752],{},[13,202609,108755],{},[13,202611,108758],{},[7759,202613,108762],{"id":108761},[13,202615,108765,202616,108769],{},[22,202617,108768],{},[7759,202619,108773],{"id":108772},[13,202621,108776,202622,67],{},[22,202623,108779],{},[10548,202625,108782],{"id":108782},[13,202627,108785],{},[10548,202629,78305],{"id":78305},[13,202631,108790],{},[13,202633,108793],{},[13,202635,108796],{},[13,202637,108799],{},[13,202639,108802],{},[10548,202641,108708],{"id":108805},[13,202643,108808],{},[13,202645,108811],{},[13,202647,108814],{},[23289,202649],{},[107,202651,108820],{"id":108819},[7759,202653,108824],{"id":108823},[10548,202655,62489],{"id":62606},[13,202657,202658],{},[22,202659,108831],{},[10548,202661,108835],{"id":108834},[2285,202663,202664,202676],{},[52,202665,108840,202666,108843,202668],{},[2996,202667],{},[49,202669,202670,202672,202674],{},[52,202671,108848],{},[52,202673,108851],{},[52,202675,108854],{},[52,202677,108857,202678,108860,202680],{},[2996,202679],{},[49,202681,202682,202684,202686],{},[52,202683,108865],{},[52,202685,108868],{},[52,202687,108871],{},[10548,202689,108875],{"id":108874},[13,202691,108878],{},[2285,202693,202694,202696,202698,202700],{},[52,202695,108883],{},[52,202697,108886],{},[52,202699,108889],{},[52,202701,108892],{},[49,202703,202704],{},[52,202705,108897],{},[13,202707,108900,202708,108904],{},[22,202709,108903],{},[49,202711,202712],{},[52,202713,108909],{},[13,202715,108912,202716,108916],{},[22,202717,108915],{},[49,202719,202720],{},[52,202721,108921],{},[13,202723,108924,202724,108928],{},[22,202725,108927],{},[49,202727,202728],{},[52,202729,108933],{},[13,202731,108936,202732,108940],{},[22,202733,108939],{},[49,202735,202736],{},[52,202737,108945],{},[13,202739,108948,202740,108952],{},[22,202741,108951],{},[49,202743,202744],{},[52,202745,108957],{},[13,202747,108960,202748,108964],{},[22,202749,108963],{},[7759,202751,108968],{"id":108967},[10548,202753,108972],{"id":108971},[49,202755,202756,202758,202760,202762],{},[52,202757,108977],{},[52,202759,108980],{},[52,202761,108983],{},[52,202763,108986],{},[13,202765,202766],{},[617,202767],{"alt":119,"src":62619},[13,202769,108993],{},[10548,202771,108997],{"id":108996},[49,202773,202774,202782],{},[52,202775,109002,202776],{},[49,202777,202778,202780],{},[52,202779,109007],{},[52,202781,109010],{},[52,202783,109013,202784],{},[49,202785,202786],{},[52,202787,109018],{},[10548,202789,109022],{"id":109021},[2285,202791,202792,202794,202796,202798],{},[52,202793,109027],{},[52,202795,109030],{},[52,202797,109033],{},[52,202799,109036],{},[7759,202801,109040],{"id":109039},[13,202803,109043,202804,109047,202806,109051,202808],{},[22,202805,109046],{},[22,202807,109050],{},[22,202809,109054],{},[13,202811,109057,202812,109060],{},[22,202813,104251],{},[2285,202815,202816,202820,202822,202824,202826],{},[52,202817,202818,109068],{},[22,202819,109067],{},[52,202821,109071],{},[52,202823,109074],{},[52,202825,109077],{},[52,202827,109080],{},[10548,202829,109083],{"id":109083},[13,202831,202832],{},[617,202833],{"alt":119,"src":62640},[10548,202835,104251],{"id":104251},[13,202837,104251],{},[49,202839,202840,202842],{},[52,202841,109096],{},[52,202843,109099],{},[13,202845,109102],{},[10548,202847,109105],{"id":109105},[2285,202849,202850,202852],{},[52,202851,109110],{},[52,202853,109113],{},[7759,202855,109117],{"id":109116},[10548,202857,109121],{"id":109120},[13,202859,109124,202860,109128],{},[22,202861,109127],{},[13,202863,109131,202864,109135],{},[22,202865,109134],{},[10548,202867,109139],{"id":109138},[13,202869,109142],{},[10548,202871,109146],{"id":109145},[13,202873,202874],{},[617,202875],{"alt":119,"src":62679},[7759,202877,109154],{"id":109153},[10548,202879,109158],{"id":109157},[13,202881,109161],{},[13,202883,202884],{},[617,202885],{"alt":119,"src":106933},[10548,202887,108453],{"id":109168},[2285,202889,202890,202892,202894,202896,202898],{},[52,202891,109173],{},[52,202893,109176],{},[52,202895,109179],{},[52,202897,109182],{},[52,202899,109185],{},[10548,202901,109189],{"id":109188},[2285,202903,202904,202906,202908],{},[52,202905,109194],{},[52,202907,109197],{},[52,202909,109200],{},[10548,202911,109204],{"id":109203},[2285,202913,202914,202916,202918],{},[52,202915,109209],{},[52,202917,109212],{},[52,202919,109215],{},[107,202921,25480],{"id":25480},[13,202923,109220],{},[13,202925,109223],{},{"title":119,"searchDepth":144,"depth":144,"links":202927},[202928,202933,202939,202948,202955],{"id":108093,"depth":132,"text":108094,"children":202929},[202930,202931,202932],{"id":108104,"depth":144,"text":108105},{"id":29536,"depth":144,"text":29537},{"id":108302,"depth":144,"text":108303},{"id":108322,"depth":132,"text":108323,"children":202934},[202935,202936,202937,202938],{"id":108326,"depth":144,"text":108327},{"id":108339,"depth":144,"text":108340},{"id":108416,"depth":144,"text":108417},{"id":108493,"depth":144,"text":108494},{"id":108547,"depth":132,"text":108548,"children":202940},[202941,202942,202943,202944,202945,202946,202947],{"id":108551,"depth":144,"text":108552},{"id":108606,"depth":144,"text":108607},{"id":108632,"depth":144,"text":108633},{"id":108701,"depth":144,"text":108702},{"id":108732,"depth":144,"text":108733},{"id":108761,"depth":144,"text":108762},{"id":108772,"depth":144,"text":108773},{"id":108819,"depth":132,"text":108820,"children":202949},[202950,202951,202952,202953,202954],{"id":108823,"depth":144,"text":108824},{"id":108967,"depth":144,"text":108968},{"id":109039,"depth":144,"text":109040},{"id":109116,"depth":144,"text":109117},{"id":109153,"depth":144,"text":109154},{"id":25480,"depth":132,"text":25480},{},{"title":108085,"description":119},[14968,7744,246,10715,14542],{"id":109262,"title":109263,"assetBase":239,"author":8,"body":202960,"category":29019,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":203985,"navigation":128,"originalPath":110359,"path":110360,"seo":203986,"source":23330,"stem":110362,"tags":203987,"weight":250,"__hash__":110364},{"type":10,"value":202961,"toc":203969},[202962,202964,202966,202970,202984,202986,202988,202990,202992,203164,203166,203491,203493,203610,203612,203774,203776,203903,203905,203909,203911,203913,203915,203917,203919,203921,203927,203929,203933,203935,203941,203943,203945,203947,203953,203955,203961,203963,203967],[4517,202963,109268],{"id":109268},[10548,202965,109271],{"id":42815},[13,202967,109274,202968,109278],{},[22,202969,109277],{},[13,202971,109281,202972],{},[5012,202973,109284,202974],{},[5012,202975,109287,202976],{},[5012,202977,109290,202978],{},[5012,202979,109293,202980],{},[5012,202981,109296,202982],{},[5012,202983,109299],{},[13,202985,109302],{},[107,202987,109306],{"id":109305},[7759,202989,109310],{"id":109309},[10548,202991,28636],{"id":28635},[78,202993,202995],{"className":202994},[4566],[78,202996,202998,203037],{"className":202997},[4570],[78,202999,203001],{"className":203000},[4574],[4576,203002,203003],{"xmlns":4578,"display":4579},[4581,203004,203005,203035],{},[4584,203006,203007,203009,203011,203013,203015,203017,203019,203021,203027,203029],{},[4596,203008,5074],{},[4591,203010,4594],{"stretchy":4593},[4596,203012,19],{},[4591,203014,4604],{"stretchy":4593},[4591,203016,4609],{},[7077,203018,1861],{},[4591,203020,109342],{},[4614,203022,203023,203025],{},[7077,203024,472],{},[4596,203026,19],{},[4591,203028,7351],{},[4614,203030,203031,203033],{},[4596,203032,19],{},[7077,203034,472],{},[4647,203036,109359],{"encoding":4649},[78,203038,203040,203067,203085,203129],{"className":203039,"ariaHidden":1419},[4654],[78,203041,203043,203046,203049,203052,203055,203058,203061,203064],{"className":203042},[4658],[78,203044],{"className":203045,"style":4663},[4662],[78,203047,5074],{"className":203048,"style":5219},[4667,4678],[78,203050,4594],{"className":203051},[4674],[78,203053,19],{"className":203054},[4667,4678],[78,203056,4604],{"className":203057},[4682],[78,203059],{"className":203060,"style":4740},[4739],[78,203062,4609],{"className":203063},[4744],[78,203065],{"className":203066,"style":4740},[4739],[78,203068,203070,203073,203076,203079,203082],{"className":203069},[4658],[78,203071],{"className":203072,"style":17917},[4662],[78,203074,1861],{"className":203075},[4667],[78,203077],{"className":203078,"style":5143},[4739],[78,203080,109342],{"className":203081},[7450],[78,203083],{"className":203084,"style":5143},[4739],[78,203086,203088,203091,203120,203123,203126],{"className":203087},[4658],[78,203089],{"className":203090,"style":109414},[4662],[78,203092,203094,203097],{"className":203093},[4667],[78,203095,472],{"className":203096},[4667],[78,203098,203100],{"className":203099},[4689],[78,203101,203103],{"className":203102},[4693],[78,203104,203106],{"className":203105},[4698],[78,203107,203109],{"className":203108,"style":53394},[4702],[78,203110,203111,203114],{"style":5209},[78,203112],{"className":203113,"style":4711},[4710],[78,203115,203117],{"className":203116},[4715,4716,4717,4718],[78,203118,19],{"className":203119},[4667,4678,4718],[78,203121],{"className":203122,"style":5143},[4739],[78,203124,7351],{"className":203125},[7450],[78,203127],{"className":203128,"style":5143},[4739],[78,203130,203132,203135],{"className":203131},[4658],[78,203133],{"className":203134,"style":53807},[4662],[78,203136,203138,203141],{"className":203137},[4667],[78,203139,19],{"className":203140},[4667,4678],[78,203142,203144],{"className":203143},[4689],[78,203145,203147],{"className":203146},[4693],[78,203148,203150],{"className":203149},[4698],[78,203151,203153],{"className":203152,"style":53807},[4702],[78,203154,203155,203158],{"style":5209},[78,203156],{"className":203157,"style":4711},[4710],[78,203159,203161],{"className":203160},[4715,4716,4717,4718],[78,203162,472],{"className":203163},[4667,4718],[10548,203165,28654],{"id":28653},[78,203167,203169],{"className":203168},[4566],[78,203170,203172,203245],{"className":203171},[4570],[78,203173,203175],{"className":203174},[4574],[4576,203176,203177],{"xmlns":4578,"display":4579},[4581,203178,203179,203243],{},[4584,203180,203181,203183,203185,203187,203189,203191,203197,203203,203205,203207,203213,203215,203217,203223,203229,203231,203233,203235,203241],{},[4596,203182,5074],{},[4591,203184,4594],{"stretchy":4593},[4596,203186,19],{},[4591,203188,4604],{"stretchy":4593},[4591,203190,4609],{},[4614,203192,203193,203195],{},[7077,203194,472],{},[4596,203196,19],{},[4614,203198,203199,203201],{},[4596,203200,19],{},[7077,203202,1014],{},[4596,203204,7132],{},[4596,203206,5025],{},[4614,203208,203209,203211],{},[4596,203210,43673],{},[7077,203212,1025],{},[4596,203214,19],{},[4591,203216,7351],{},[4614,203218,203219,203221],{},[7077,203220,472],{},[4596,203222,19],{},[4614,203224,203225,203227],{},[4596,203226,19],{},[7077,203228,11047],{},[4596,203230,7102],{"mathvariant":7101},[4596,203232,7132],{},[4596,203234,5025],{},[4614,203236,203237,203239],{},[4596,203238,43673],{},[7077,203240,1025],{},[4596,203242,19],{},[4647,203244,109569],{"encoding":4649},[78,203246,203248,203275,203386],{"className":203247,"ariaHidden":1419},[4654],[78,203249,203251,203254,203257,203260,203263,203266,203269,203272],{"className":203250},[4658],[78,203252],{"className":203253,"style":4663},[4662],[78,203255,5074],{"className":203256,"style":5219},[4667,4678],[78,203258,4594],{"className":203259},[4674],[78,203261,19],{"className":203262},[4667,4678],[78,203264,4604],{"className":203265},[4682],[78,203267],{"className":203268,"style":4740},[4739],[78,203270,4609],{"className":203271},[4744],[78,203273],{"className":203274,"style":4740},[4739],[78,203276,203278,203281,203310,203339,203342,203345,203374,203377,203380,203383],{"className":203277},[4658],[78,203279],{"className":203280,"style":109606},[4662],[78,203282,203284,203287],{"className":203283},[4667],[78,203285,472],{"className":203286},[4667],[78,203288,203290],{"className":203289},[4689],[78,203291,203293],{"className":203292},[4693],[78,203294,203296],{"className":203295},[4698],[78,203297,203299],{"className":203298,"style":53394},[4702],[78,203300,203301,203304],{"style":5209},[78,203302],{"className":203303,"style":4711},[4710],[78,203305,203307],{"className":203306},[4715,4716,4717,4718],[78,203308,19],{"className":203309},[4667,4678,4718],[78,203311,203313,203316],{"className":203312},[4667],[78,203314,19],{"className":203315},[4667,4678],[78,203317,203319],{"className":203318},[4689],[78,203320,203322],{"className":203321},[4693],[78,203323,203325],{"className":203324},[4698],[78,203326,203328],{"className":203327,"style":53807},[4702],[78,203329,203330,203333],{"style":5209},[78,203331],{"className":203332,"style":4711},[4710],[78,203334,203336],{"className":203335},[4715,4716,4717,4718],[78,203337,1014],{"className":203338},[4667,4718],[78,203340,7132],{"className":203341,"style":7300},[4667,4678],[78,203343,5025],{"className":203344},[4667,4678],[78,203346,203348,203351],{"className":203347},[4667],[78,203349,43673],{"className":203350,"style":5187},[4667,4678],[78,203352,203354],{"className":203353},[4689],[78,203355,203357],{"className":203356},[4693],[78,203358,203360],{"className":203359},[4698],[78,203361,203363],{"className":203362,"style":53807},[4702],[78,203364,203365,203368],{"style":5209},[78,203366],{"className":203367,"style":4711},[4710],[78,203369,203371],{"className":203370},[4715,4716,4717,4718],[78,203372,1025],{"className":203373},[4667,4718],[78,203375,19],{"className":203376},[4667,4678],[78,203378],{"className":203379,"style":5143},[4739],[78,203381,7351],{"className":203382},[7450],[78,203384],{"className":203385,"style":5143},[4739],[78,203387,203389,203392,203421,203450,203453,203456,203459,203488],{"className":203388},[4658],[78,203390],{"className":203391,"style":53782},[4662],[78,203393,203395,203398],{"className":203394},[4667],[78,203396,472],{"className":203397},[4667],[78,203399,203401],{"className":203400},[4689],[78,203402,203404],{"className":203403},[4693],[78,203405,203407],{"className":203406},[4698],[78,203408,203410],{"className":203409,"style":53394},[4702],[78,203411,203412,203415],{"style":5209},[78,203413],{"className":203414,"style":4711},[4710],[78,203416,203418],{"className":203417},[4715,4716,4717,4718],[78,203419,19],{"className":203420},[4667,4678,4718],[78,203422,203424,203427],{"className":203423},[4667],[78,203425,19],{"className":203426},[4667,4678],[78,203428,203430],{"className":203429},[4689],[78,203431,203433],{"className":203432},[4693],[78,203434,203436],{"className":203435},[4698],[78,203437,203439],{"className":203438,"style":53807},[4702],[78,203440,203441,203444],{"style":5209},[78,203442],{"className":203443,"style":4711},[4710],[78,203445,203447],{"className":203446},[4715,4716,4717,4718],[78,203448,11047],{"className":203449},[4667,4718],[78,203451,7102],{"className":203452},[4667],[78,203454,7132],{"className":203455,"style":7300},[4667,4678],[78,203457,5025],{"className":203458},[4667,4678],[78,203460,203462,203465],{"className":203461},[4667],[78,203463,43673],{"className":203464,"style":5187},[4667,4678],[78,203466,203468],{"className":203467},[4689],[78,203469,203471],{"className":203470},[4693],[78,203472,203474],{"className":203473},[4698],[78,203475,203477],{"className":203476,"style":53807},[4702],[78,203478,203479,203482],{"style":5209},[78,203480],{"className":203481,"style":4711},[4710],[78,203483,203485],{"className":203484},[4715,4716,4717,4718],[78,203486,1025],{"className":203487},[4667,4718],[78,203489,19],{"className":203490},[4667,4678],[10548,203492,28672],{"id":28671},[78,203494,203496],{"className":203495},[4566],[78,203497,203499,203538],{"className":203498},[4570],[78,203500,203502],{"className":203501},[4574],[4576,203503,203504],{"xmlns":4578,"display":4579},[4581,203505,203506,203536],{},[4584,203507,203508,203510,203512,203514,203516,203518,203520,203522,203524,203526,203528,203530,203532,203534],{},[4596,203509,5074],{},[4591,203511,4594],{"stretchy":4593},[4596,203513,19],{},[4591,203515,4604],{"stretchy":4593},[4591,203517,4609],{},[7077,203519,1017],{},[4596,203521,5074],{},[4591,203523,4594],{"stretchy":4593},[4596,203525,19],{},[4596,203527,7102],{"mathvariant":7101},[7077,203529,1025],{},[4591,203531,4604],{"stretchy":4593},[4591,203533,7351],{},[4596,203535,19],{},[4647,203537,109864],{"encoding":4649},[78,203539,203541,203568,203601],{"className":203540,"ariaHidden":1419},[4654],[78,203542,203544,203547,203550,203553,203556,203559,203562,203565],{"className":203543},[4658],[78,203545],{"className":203546,"style":4663},[4662],[78,203548,5074],{"className":203549,"style":5219},[4667,4678],[78,203551,4594],{"className":203552},[4674],[78,203554,19],{"className":203555},[4667,4678],[78,203557,4604],{"className":203558},[4682],[78,203560],{"className":203561,"style":4740},[4739],[78,203563,4609],{"className":203564},[4744],[78,203566],{"className":203567,"style":4740},[4739],[78,203569,203571,203574,203577,203580,203583,203586,203589,203592,203595,203598],{"className":203570},[4658],[78,203572],{"className":203573,"style":4663},[4662],[78,203575,1017],{"className":203576},[4667],[78,203578,5074],{"className":203579,"style":5219},[4667,4678],[78,203581,4594],{"className":203582},[4674],[78,203584,19],{"className":203585},[4667,4678],[78,203587,109916],{"className":203588},[4667],[78,203590,4604],{"className":203591},[4682],[78,203593],{"className":203594,"style":5143},[4739],[78,203596,7351],{"className":203597},[7450],[78,203599],{"className":203600,"style":5143},[4739],[78,203602,203604,203607],{"className":203603},[4658],[78,203605],{"className":203606,"style":16838},[4662],[78,203608,19],{"className":203609},[4667,4678],[10548,203611,63809],{"id":109940},[78,203613,203615],{"className":203614},[4566],[78,203616,203618,203667],{"className":203617},[4570],[78,203619,203621],{"className":203620},[4574],[4576,203622,203623],{"xmlns":4578,"display":4579},[4581,203624,203625,203665],{},[4584,203626,203627,203629,203631,203633,203635,203637,203639,203641,203643,203645,203647,203649,203651,203653,203655,203657,203663],{},[4596,203628,5074],{},[4591,203630,4594],{"stretchy":4593},[4596,203632,19],{},[4591,203634,4604],{"stretchy":4593},[4591,203636,4609],{},[7077,203638,27433],{},[4596,203640,5074],{},[4591,203642,4594],{"stretchy":4593},[4596,203644,19],{},[4596,203646,7102],{"mathvariant":7101},[7077,203648,472],{},[4591,203650,4604],{"stretchy":4593},[4591,203652,7351],{},[4596,203654,52274],{},[4591,203656,4594],{"stretchy":4593},[4614,203658,203659,203661],{},[4596,203660,19],{},[7077,203662,472],{},[4591,203664,4604],{"stretchy":4593},[4647,203666,109996],{"encoding":4649},[78,203668,203670,203697,203730],{"className":203669,"ariaHidden":1419},[4654],[78,203671,203673,203676,203679,203682,203685,203688,203691,203694],{"className":203672},[4658],[78,203674],{"className":203675,"style":4663},[4662],[78,203677,5074],{"className":203678,"style":5219},[4667,4678],[78,203680,4594],{"className":203681},[4674],[78,203683,19],{"className":203684},[4667,4678],[78,203686,4604],{"className":203687},[4682],[78,203689],{"className":203690,"style":4740},[4739],[78,203692,4609],{"className":203693},[4744],[78,203695],{"className":203696,"style":4740},[4739],[78,203698,203700,203703,203706,203709,203712,203715,203718,203721,203724,203727],{"className":203699},[4658],[78,203701],{"className":203702,"style":4663},[4662],[78,203704,27433],{"className":203705},[4667],[78,203707,5074],{"className":203708,"style":5219},[4667,4678],[78,203710,4594],{"className":203711},[4674],[78,203713,19],{"className":203714},[4667,4678],[78,203716,110048],{"className":203717},[4667],[78,203719,4604],{"className":203720},[4682],[78,203722],{"className":203723,"style":5143},[4739],[78,203725,7351],{"className":203726},[7450],[78,203728],{"className":203729,"style":5143},[4739],[78,203731,203733,203736,203739,203742,203771],{"className":203732},[4658],[78,203734],{"className":203735,"style":53782},[4662],[78,203737,52274],{"className":203738,"style":17251},[4667,4678],[78,203740,4594],{"className":203741},[4674],[78,203743,203745,203748],{"className":203744},[4667],[78,203746,19],{"className":203747},[4667,4678],[78,203749,203751],{"className":203750},[4689],[78,203752,203754],{"className":203753},[4693],[78,203755,203757],{"className":203756},[4698],[78,203758,203760],{"className":203759,"style":53807},[4702],[78,203761,203762,203765],{"style":5209},[78,203763],{"className":203764,"style":4711},[4710],[78,203766,203768],{"className":203767},[4715,4716,4717,4718],[78,203769,472],{"className":203770},[4667,4718],[78,203772,4604],{"className":203773},[4682],[10548,203775,74072],{"id":110107},[78,203777,203779],{"className":203778},[4566],[78,203780,203782,203825],{"className":203781},[4570],[78,203783,203785],{"className":203784},[4574],[4576,203786,203787],{"xmlns":4578,"display":4579},[4581,203788,203789,203823],{},[4584,203790,203791,203793,203795,203797,203799,203801,203803,203805,203807,203809,203811,203813,203815,203817,203819,203821],{},[4596,203792,5074],{},[4591,203794,4594],{"stretchy":4593},[4596,203796,19],{},[4591,203798,4604],{"stretchy":4593},[4591,203800,4609],{},[4596,203802,5074],{},[4591,203804,4594],{"stretchy":4593},[4596,203806,19],{},[4596,203808,7102],{"mathvariant":7101},[7077,203810,472],{},[4591,203812,4604],{"stretchy":4593},[4591,203814,7351],{},[4596,203816,54581],{"mathvariant":7101},[4591,203818,4594],{"stretchy":4593},[7077,203820,469],{},[4591,203822,4604],{"stretchy":4593},[4647,203824,110157],{"encoding":4649},[78,203826,203828,203855,203885],{"className":203827,"ariaHidden":1419},[4654],[78,203829,203831,203834,203837,203840,203843,203846,203849,203852],{"className":203830},[4658],[78,203832],{"className":203833,"style":4663},[4662],[78,203835,5074],{"className":203836,"style":5219},[4667,4678],[78,203838,4594],{"className":203839},[4674],[78,203841,19],{"className":203842},[4667,4678],[78,203844,4604],{"className":203845},[4682],[78,203847],{"className":203848,"style":4740},[4739],[78,203850,4609],{"className":203851},[4744],[78,203853],{"className":203854,"style":4740},[4739],[78,203856,203858,203861,203864,203867,203870,203873,203876,203879,203882],{"className":203857},[4658],[78,203859],{"className":203860,"style":4663},[4662],[78,203862,5074],{"className":203863,"style":5219},[4667,4678],[78,203865,4594],{"className":203866},[4674],[78,203868,19],{"className":203869},[4667,4678],[78,203871,110048],{"className":203872},[4667],[78,203874,4604],{"className":203875},[4682],[78,203877],{"className":203878,"style":5143},[4739],[78,203880,7351],{"className":203881},[7450],[78,203883],{"className":203884,"style":5143},[4739],[78,203886,203888,203891,203894,203897,203900],{"className":203887},[4658],[78,203889],{"className":203890,"style":4663},[4662],[78,203892,54581],{"className":203893},[4667],[78,203895,4594],{"className":203896},[4674],[78,203898,469],{"className":203899},[4667],[78,203901,4604],{"className":203902},[4682],[23289,203904],{},[7759,203906,110241,203907],{"id":110240},[5012,203908,110244],{},[23289,203910],{},[7759,203912,110250],{"id":110249},[23289,203914],{},[7759,203916,110256],{"id":110255},[23289,203918],{},[107,203920,110262],{"id":110261},[7759,203922,110266,203923],{"id":110265},[34478,203924,110269,203925,110272],{"t":119},[78,203926],{},[23289,203928],{},[7759,203930,110278,203931],{"id":110277},[5012,203932,110244],{},[23289,203934],{},[7759,203936,110286,203937],{"id":110285},[110288,203938,110290,203939],{},[51085,203940,110293],{},[23289,203942],{},[7759,203944,110299],{"id":110298},[23289,203946],{},[7759,203948,110305,203949],{"id":110304},[51085,203950,110308,203951],{},[110288,203952,110311],{},[23289,203954],{},[7759,203956,110317,203957],{"id":110316},[51085,203958,110320,203959],{},[110322,203960,110324],{},[23289,203962],{},[13,203964,110329,203965],{},[25921,203966,110332],{},[13,203968,110335],{},{"title":119,"searchDepth":144,"depth":144,"links":203970},[203971,203977],{"id":109305,"depth":132,"text":109306,"children":203972},[203973,203974,203975,203976],{"id":109309,"depth":144,"text":109310},{"id":110240,"depth":144,"text":110342},{"id":110249,"depth":144,"text":110250},{"id":110255,"depth":144,"text":110256},{"id":110261,"depth":132,"text":110262,"children":203978},[203979,203980,203981,203982,203983,203984],{"id":110265,"depth":144,"text":110348},{"id":110277,"depth":144,"text":110350},{"id":110285,"depth":144,"text":110352},{"id":110298,"depth":144,"text":110299},{"id":110304,"depth":144,"text":110355},{"id":110316,"depth":144,"text":110357},{},{"title":109263,"description":119},[246],{"id":110366,"title":110367,"assetBase":239,"author":8,"body":203989,"category":23936,"collection":23324,"date":23325,"description":119,"difficulty":239,"extension":237,"kind":788,"language":239,"leetcode":239,"meta":205300,"navigation":128,"originalPath":112006,"path":112007,"seo":205301,"source":23330,"stem":112009,"tags":205302,"weight":250,"__hash__":112011},{"type":10,"value":203990,"toc":205277},[203991,203995,203997,203999,204001,204003,204007,204009,204011,204013,204021,204037,204039,204041,204047,204049,204051,204057,204059,204061,204063,204065,204067,204081,204083,204171,204185,204187,204211,204213,204215,204217,204219,204221,204223,204239,204241,204421,204423,204425,204437,204439,204471,204475,204477,204479,204481,204483,204487,204489,204491,204499,204501,204511,204535,204559,204561,204563,204567,204571,204589,204603,204605,204609,204749,204751,204753,204893,204895,204897,204901,204903,205155,205157,205229,205233,205235,205237,205239,205241,205243,205245,205247,205249,205253,205255,205257,205259,205261,205265,205267,205269,205271,205275],[72,203992,203993],{},[13,203994,110374],{},[107,203996,110378],{"id":110377},[7759,203998,62379],{"id":30036},[13,204000,110383],{},[7759,204002,110387],{"id":110386},[13,204004,204005],{},[617,204006],{"alt":119,"src":110392},[10548,204008,110396],{"id":110395},[13,204010,110399],{},[10548,204012,110403],{"id":110402},[13,204014,110406,204015,110410,204017,110414,204019,110418],{},[22,204016,110409],{},[22,204018,110413],{},[22,204020,110417],{},[72,204022,204023,204025,204027],{},[13,204024,110423],{},[13,204026,110426],{},[49,204028,204029,204031,204033,204035],{},[52,204030,110431],{},[52,204032,110434],{},[52,204034,110437],{},[52,204036,110440],{},[10548,204038,110444],{"id":110443},[13,204040,110447],{},[13,204042,110450,204043,110454,204045,110458],{},[22,204044,110453],{},[22,204046,110457],{},[10548,204048,110462],{"id":110461},[13,204050,110465],{},[49,204052,204053,204055],{},[52,204054,110470],{},[52,204056,110473],{},[10548,204058,110477],{"id":110476},[13,204060,110480],{},[23289,204062],{},[107,204064,110486],{"id":110485},[7759,204066,110490],{"id":110489},[72,204068,204069,204071,204073],{},[13,204070,110495],{},[13,204072,110498],{},[49,204074,204075,204077,204079],{},[52,204076,110503],{},[52,204078,110506],{},[52,204080,110509],{},[10548,204082,110513],{"id":110512},[114,204084,204085],{"className":33493,"code":110516,"language":33495,"meta":119,"style":119},[17,204086,204087,204091,204095,204099,204103,204107,204111,204115,204119,204123,204127,204131,204135,204139,204143,204147,204151,204155,204159,204163,204167],{"__ignoreMap":119},[78,204088,204089],{"class":124,"line":125},[78,204090,110523],{},[78,204092,204093],{"class":124,"line":132},[78,204094,44357],{},[78,204096,204097],{"class":124,"line":138},[78,204098,110532],{},[78,204100,204101],{"class":124,"line":144},[78,204102,44362],{},[78,204104,204105],{"class":124,"line":150},[78,204106,129],{"emptyLinePlaceholder":128},[78,204108,204109],{"class":124,"line":156},[78,204110,110545],{},[78,204112,204113],{"class":124,"line":162},[78,204114,110550],{},[78,204116,204117],{"class":124,"line":168},[78,204118,110555],{},[78,204120,204121],{"class":124,"line":174},[78,204122,110560],{},[78,204124,204125],{"class":124,"line":180},[78,204126,129],{"emptyLinePlaceholder":128},[78,204128,204129],{"class":124,"line":186},[78,204130,110569],{},[78,204132,204133],{"class":124,"line":192},[78,204134,110574],{},[78,204136,204137],{"class":124,"line":198},[78,204138,129],{"emptyLinePlaceholder":128},[78,204140,204141],{"class":124,"line":204},[78,204142,110583],{},[78,204144,204145],{"class":124,"line":210},[78,204146,110588],{},[78,204148,204149],{"class":124,"line":216},[78,204150,110593],{},[78,204152,204153],{"class":124,"line":222},[78,204154,110598],{},[78,204156,204157],{"class":124,"line":421},[78,204158,129],{"emptyLinePlaceholder":128},[78,204160,204161],{"class":124,"line":427},[78,204162,110607],{},[78,204164,204165],{"class":124,"line":433},[78,204166,44444],{},[78,204168,204169],{"class":124,"line":2443},[78,204170,110616],{},[72,204172,204173,204175,204177,204179,204181,204183],{},[13,204174,110621],{},[13,204176,110624],{},[13,204178,110627],{},[13,204180,110630],{},[13,204182,110633],{},[13,204184,110636],{},[10548,204186,110640],{"id":110639},[114,204188,204189],{"className":33493,"code":110643,"language":33495,"meta":119,"style":119},[17,204190,204191,204195,204199,204203,204207],{"__ignoreMap":119},[78,204192,204193],{"class":124,"line":125},[78,204194,110650],{},[78,204196,204197],{"class":124,"line":132},[78,204198,110655],{},[78,204200,204201],{"class":124,"line":138},[78,204202,110660],{},[78,204204,204205],{"class":124,"line":144},[78,204206,110665],{},[78,204208,204209],{"class":124,"line":150},[78,204210,110670],{},[13,204212,110673],{},[13,204214,110676],{},[13,204216,110679],{},[13,204218,110682],{},[13,204220,110685],{},[7759,204222,110689],{"id":110688},[72,204224,204225,204229,204231],{},[13,204226,204227],{},[22,204228,110696],{},[13,204230,110498],{},[49,204232,204233,204235,204237],{},[52,204234,110703],{},[52,204236,110706],{},[52,204238,110709],{},[10548,204240,110513],{"id":110712},[114,204242,204243],{"className":33493,"code":110715,"language":33495,"meta":119,"style":119},[17,204244,204245,204249,204253,204257,204261,204265,204269,204273,204277,204281,204285,204289,204293,204297,204301,204305,204309,204313,204317,204321,204325,204329,204333,204337,204341,204345,204349,204353,204357,204361,204365,204369,204373,204377,204381,204385,204389,204393,204397,204401,204405,204409,204413,204417],{"__ignoreMap":119},[78,204246,204247],{"class":124,"line":125},[78,204248,110722],{},[78,204250,204251],{"class":124,"line":132},[78,204252,110727],{},[78,204254,204255],{"class":124,"line":138},[78,204256,110732],{},[78,204258,204259],{"class":124,"line":144},[78,204260,129],{"emptyLinePlaceholder":128},[78,204262,204263],{"class":124,"line":150},[78,204264,110545],{},[78,204266,204267],{"class":124,"line":156},[78,204268,110745],{},[78,204270,204271],{"class":124,"line":162},[78,204272,110750],{},[78,204274,204275],{"class":124,"line":168},[78,204276,110755],{},[78,204278,204279],{"class":124,"line":174},[78,204280,110760],{},[78,204282,204283],{"class":124,"line":180},[78,204284,129],{"emptyLinePlaceholder":128},[78,204286,204287],{"class":124,"line":186},[78,204288,110769],{},[78,204290,204291],{"class":124,"line":192},[78,204292,110774],{},[78,204294,204295],{"class":124,"line":198},[78,204296,110569],{},[78,204298,204299],{"class":124,"line":204},[78,204300,110783],{},[78,204302,204303],{"class":124,"line":210},[78,204304,110788],{},[78,204306,204307],{"class":124,"line":216},[78,204308,110793],{},[78,204310,204311],{"class":124,"line":222},[78,204312,110798],{},[78,204314,204315],{"class":124,"line":421},[78,204316,110803],{},[78,204318,204319],{"class":124,"line":427},[78,204320,110808],{},[78,204322,204323],{"class":124,"line":433},[78,204324,110813],{},[78,204326,204327],{"class":124,"line":2443},[78,204328,110818],{},[78,204330,204331],{"class":124,"line":2448},[78,204332,110823],{},[78,204334,204335],{"class":124,"line":2454},[78,204336,110828],{},[78,204338,204339],{"class":124,"line":2460},[78,204340,110833],{},[78,204342,204343],{"class":124,"line":2465},[78,204344,110838],{},[78,204346,204347],{"class":124,"line":2470},[78,204348,110843],{},[78,204350,204351],{"class":124,"line":2903},[78,204352,110848],{},[78,204354,204355],{"class":124,"line":2909},[78,204356,110853],{},[78,204358,204359],{"class":124,"line":11477},[78,204360,110858],{},[78,204362,204363],{"class":124,"line":13374},[78,204364,110863],{},[78,204366,204367],{"class":124,"line":13380},[78,204368,110868],{},[78,204370,204371],{"class":124,"line":13386},[78,204372,110873],{},[78,204374,204375],{"class":124,"line":13722},[78,204376,110878],{},[78,204378,204379],{"class":124,"line":13727},[78,204380,110883],{},[78,204382,204383],{"class":124,"line":13953},[78,204384,110888],{},[78,204386,204387],{"class":124,"line":13958},[78,204388,129],{"emptyLinePlaceholder":128},[78,204390,204391],{"class":124,"line":13964},[78,204392,110583],{},[78,204394,204395],{"class":124,"line":13969},[78,204396,110901],{},[78,204398,204399],{"class":124,"line":24170},[78,204400,110906],{},[78,204402,204403],{"class":124,"line":24175},[78,204404,110911],{},[78,204406,204407],{"class":124,"line":24180},[78,204408,129],{"emptyLinePlaceholder":128},[78,204410,204411],{"class":124,"line":24186},[78,204412,110607],{},[78,204414,204415],{"class":124,"line":24192},[78,204416,110924],{},[78,204418,204419],{"class":124,"line":24198},[78,204420,110929],{},[13,204422,110932],{},[7759,204424,110936],{"id":110935},[72,204426,204427,204429,204431],{},[13,204428,110941],{},[13,204430,110498],{},[49,204432,204433,204435],{},[52,204434,110948],{},[52,204436,110706],{},[13,204438,110953],{},[114,204440,204441],{"className":33493,"code":110956,"language":33495,"meta":119,"style":119},[17,204442,204443,204447,204451,204455,204459,204463,204467],{"__ignoreMap":119},[78,204444,204445],{"class":124,"line":125},[78,204446,110963],{},[78,204448,204449],{"class":124,"line":132},[78,204450,110545],{},[78,204452,204453],{"class":124,"line":138},[78,204454,110972],{},[78,204456,204457],{"class":124,"line":144},[78,204458,110977],{},[78,204460,204461],{"class":124,"line":150},[78,204462,110982],{},[78,204464,204465],{"class":124,"line":156},[78,204466,110987],{},[78,204468,204469],{"class":124,"line":162},[78,204470,110992],{},[13,204472,204473,110997],{},[22,204474,2047],{},[13,204476,111000],{},[23289,204478],{},[107,204480,111006],{"id":111005},[7759,204482,111010],{"id":111009},[13,204484,204485],{},[617,204486],{"alt":119,"src":111015},[13,204488,111018],{},[13,204490,111021],{},[49,204492,204493,204495,204497],{},[52,204494,111026],{},[52,204496,111029],{},[52,204498,111032],{},[13,204500,111035],{},[49,204502,204503,204505,204507,204509],{},[52,204504,111040],{},[52,204506,111043],{},[52,204508,111046],{},[52,204510,111049],{},[72,204512,204513,204517,204519],{},[13,204514,204515,111057],{},[22,204516,111056],{},[13,204518,111060],{},[49,204520,204521,204523],{},[52,204522,111065],{},[52,204524,111068,204525],{},[49,204526,204527,204533],{},[52,204528,111073,204529,204531],{},[2996,204530],{},[22,204532,111078],{},[52,204534,111081],{},[72,204536,204537,204541,204543],{},[13,204538,204539,111089],{},[22,204540,111088],{},[13,204542,111092],{},[49,204544,204545,204547],{},[52,204546,111097],{},[52,204548,111100,204549],{},[49,204550,204551,204555],{},[52,204552,111105,204553,67],{},[22,204554,111108],{},[52,204556,111111,204557],{},[22,204558,111114],{},[13,204560,111117],{},[7759,204562,111121],{"id":111120},[13,204564,204565],{},[617,204566],{"alt":119,"src":111126},[13,204568,204569],{},[22,204570,111131],{},[49,204572,204573,204581],{},[52,204574,111136,204575],{},[49,204576,204577,204579],{},[52,204578,111141],{},[52,204580,111144],{},[52,204582,111147,204583],{},[49,204584,204585,204587],{},[52,204586,111152],{},[52,204588,111155],{},[72,204590,204591,204593],{},[13,204592,111160],{},[49,204594,204595,204597,204599,204601],{},[52,204596,111165],{},[52,204598,111168],{},[52,204600,111171],{},[52,204602,111174],{},[7759,204604,111178],{"id":111177},[13,204606,111181,204607],{},[22,204608,111184],{},[114,204610,204611],{"className":33493,"code":111187,"language":33495,"meta":119,"style":119},[17,204612,204613,204617,204621,204625,204629,204633,204637,204641,204645,204649,204653,204657,204661,204665,204669,204673,204677,204681,204685,204689,204693,204697,204701,204705,204709,204713,204717,204721,204725,204729,204733,204737,204741,204745],{"__ignoreMap":119},[78,204614,204615],{"class":124,"line":125},[78,204616,111194],{},[78,204618,204619],{"class":124,"line":132},[78,204620,110523],{},[78,204622,204623],{"class":124,"line":138},[78,204624,44357],{},[78,204626,204627],{"class":124,"line":144},[78,204628,111207],{},[78,204630,204631],{"class":124,"line":150},[78,204632,111212],{},[78,204634,204635],{"class":124,"line":156},[78,204636,111217],{},[78,204638,204639],{"class":124,"line":162},[78,204640,111222],{},[78,204642,204643],{"class":124,"line":168},[78,204644,129],{"emptyLinePlaceholder":128},[78,204646,204647],{"class":124,"line":174},[78,204648,110545],{},[78,204650,204651],{"class":124,"line":180},[78,204652,111235],{},[78,204654,204655],{"class":124,"line":186},[78,204656,111240],{},[78,204658,204659],{"class":124,"line":192},[78,204660,111245],{},[78,204662,204663],{"class":124,"line":198},[78,204664,129],{"emptyLinePlaceholder":128},[78,204666,204667],{"class":124,"line":204},[78,204668,110569],{},[78,204670,204671],{"class":124,"line":210},[78,204672,111258],{},[78,204674,204675],{"class":124,"line":216},[78,204676,111263],{},[78,204678,204679],{"class":124,"line":222},[78,204680,111268],{},[78,204682,204683],{"class":124,"line":421},[78,204684,111273],{},[78,204686,204687],{"class":124,"line":427},[78,204688,111278],{},[78,204690,204691],{"class":124,"line":433},[78,204692,111283],{},[78,204694,204695],{"class":124,"line":2443},[78,204696,111288],{},[78,204698,204699],{"class":124,"line":2448},[78,204700,129],{"emptyLinePlaceholder":128},[78,204702,204703],{"class":124,"line":2454},[78,204704,111297],{},[78,204706,204707],{"class":124,"line":2460},[78,204708,110588],{},[78,204710,204711],{"class":124,"line":2465},[78,204712,110593],{},[78,204714,204715],{"class":124,"line":2470},[78,204716,110598],{},[78,204718,204719],{"class":124,"line":2903},[78,204720,111314],{},[78,204722,204723],{"class":124,"line":2909},[78,204724,111319],{},[78,204726,204727],{"class":124,"line":11477},[78,204728,111324],{},[78,204730,204731],{"class":124,"line":13374},[78,204732,129],{"emptyLinePlaceholder":128},[78,204734,204735],{"class":124,"line":13380},[78,204736,110607],{},[78,204738,204739],{"class":124,"line":13386},[78,204740,111337],{},[78,204742,204743],{"class":124,"line":13722},[78,204744,110616],{},[78,204746,204747],{"class":124,"line":13727},[78,204748,111346],{},[7759,204750,111350],{"id":111349},[13,204752,111353],{},[114,204754,204755],{"className":33493,"code":111356,"language":33495,"meta":119,"style":119},[17,204756,204757,204761,204765,204769,204773,204777,204781,204785,204789,204793,204797,204801,204805,204809,204813,204817,204821,204825,204829,204833,204837,204841,204845,204849,204853,204857,204861,204865,204869,204873,204877,204881,204885,204889],{"__ignoreMap":119},[78,204758,204759],{"class":124,"line":125},[78,204760,111363],{},[78,204762,204763],{"class":124,"line":132},[78,204764,110523],{},[78,204766,204767],{"class":124,"line":138},[78,204768,44357],{},[78,204770,204771],{"class":124,"line":144},[78,204772,44362],{},[78,204774,204775],{"class":124,"line":150},[78,204776,111380],{},[78,204778,204779],{"class":124,"line":156},[78,204780,111207],{},[78,204782,204783],{"class":124,"line":162},[78,204784,129],{"emptyLinePlaceholder":128},[78,204786,204787],{"class":124,"line":168},[78,204788,110545],{},[78,204790,204791],{"class":124,"line":174},[78,204792,110550],{},[78,204794,204795],{"class":124,"line":180},[78,204796,110555],{},[78,204798,204799],{"class":124,"line":186},[78,204800,110560],{},[78,204802,204803],{"class":124,"line":192},[78,204804,111409],{},[78,204806,204807],{"class":124,"line":198},[78,204808,111414],{},[78,204810,204811],{"class":124,"line":204},[78,204812,111419],{},[78,204814,204815],{"class":124,"line":210},[78,204816,111424],{},[78,204818,204819],{"class":124,"line":216},[78,204820,129],{"emptyLinePlaceholder":128},[78,204822,204823],{"class":124,"line":222},[78,204824,110569],{},[78,204826,204827],{"class":124,"line":421},[78,204828,111263],{},[78,204830,204831],{"class":124,"line":427},[78,204832,111268],{},[78,204834,204835],{"class":124,"line":433},[78,204836,111273],{},[78,204838,204839],{"class":124,"line":2443},[78,204840,111278],{},[78,204842,204843],{"class":124,"line":2448},[78,204844,111283],{},[78,204846,204847],{"class":124,"line":2454},[78,204848,111288],{},[78,204850,204851],{"class":124,"line":2460},[78,204852,129],{"emptyLinePlaceholder":128},[78,204854,204855],{"class":124,"line":2465},[78,204856,111297],{},[78,204858,204859],{"class":124,"line":2470},[78,204860,110588],{},[78,204862,204863],{"class":124,"line":2903},[78,204864,110593],{},[78,204866,204867],{"class":124,"line":2909},[78,204868,110598],{},[78,204870,204871],{"class":124,"line":11477},[78,204872,129],{"emptyLinePlaceholder":128},[78,204874,204875],{"class":124,"line":13374},[78,204876,110607],{},[78,204878,204879],{"class":124,"line":13380},[78,204880,44444],{},[78,204882,204883],{"class":124,"line":13386},[78,204884,111493],{},[78,204886,204887],{"class":124,"line":13722},[78,204888,110616],{},[78,204890,204891],{"class":124,"line":13727},[78,204892,111502],{},[7759,204894,111506],{"id":111505},[13,204896,111509],{},[13,204898,204899],{},[617,204900],{"alt":119,"src":111514},[10548,204902,111518],{"id":111517},[114,204904,204905],{"className":23652,"code":111521,"language":23654,"meta":119,"style":119},[17,204906,204907,204911,204915,204919,204923,204927,204931,204935,204939,204943,204947,204951,204955,204959,204963,204967,204971,204975,204979,204983,204987,204991,204995,204999,205003,205007,205011,205015,205019,205023,205027,205031,205035,205039,205043,205047,205051,205055,205059,205063,205067,205071,205075,205079,205083,205087,205091,205095,205099,205103,205107,205111,205115,205119,205123,205127,205131,205135,205139,205143,205147,205151],{"__ignoreMap":119},[78,204908,204909],{"class":124,"line":125},[78,204910,111528],{},[78,204912,204913],{"class":124,"line":132},[78,204914,111533],{},[78,204916,204917],{"class":124,"line":138},[78,204918,111538],{},[78,204920,204921],{"class":124,"line":144},[78,204922,111543],{},[78,204924,204925],{"class":124,"line":150},[78,204926,111548],{},[78,204928,204929],{"class":124,"line":156},[78,204930,111553],{},[78,204932,204933],{"class":124,"line":162},[78,204934,129],{"emptyLinePlaceholder":128},[78,204936,204937],{"class":124,"line":168},[78,204938,111562],{},[78,204940,204941],{"class":124,"line":174},[78,204942,111567],{},[78,204944,204945],{"class":124,"line":180},[78,204946,111572],{},[78,204948,204949],{"class":124,"line":186},[78,204950,111577],{},[78,204952,204953],{"class":124,"line":192},[78,204954,111582],{},[78,204956,204957],{"class":124,"line":198},[78,204958,111587],{},[78,204960,204961],{"class":124,"line":204},[78,204962,111592],{},[78,204964,204965],{"class":124,"line":210},[78,204966,69967],{},[78,204968,204969],{"class":124,"line":216},[78,204970,6942],{},[78,204972,204973],{"class":124,"line":222},[78,204974,111605],{},[78,204976,204977],{"class":124,"line":421},[78,204978,111577],{},[78,204980,204981],{"class":124,"line":427},[78,204982,111614],{},[78,204984,204985],{"class":124,"line":433},[78,204986,111619],{},[78,204988,204989],{"class":124,"line":2443},[78,204990,111624],{},[78,204992,204993],{"class":124,"line":2448},[78,204994,111629],{},[78,204996,204997],{"class":124,"line":2454},[78,204998,111634],{},[78,205000,205001],{"class":124,"line":2460},[78,205002,111639],{},[78,205004,205005],{"class":124,"line":2465},[78,205006,111644],{},[78,205008,205009],{"class":124,"line":2470},[78,205010,111649],{},[78,205012,205013],{"class":124,"line":2903},[78,205014,111654],{},[78,205016,205017],{"class":124,"line":2909},[78,205018,111659],{},[78,205020,205021],{"class":124,"line":11477},[78,205022,111649],{},[78,205024,205025],{"class":124,"line":13374},[78,205026,111668],{},[78,205028,205029],{"class":124,"line":13380},[78,205030,10054],{},[78,205032,205033],{"class":124,"line":13386},[78,205034,111677],{},[78,205036,205037],{"class":124,"line":13722},[78,205038,69967],{},[78,205040,205041],{"class":124,"line":13727},[78,205042,111686],{},[78,205044,205045],{"class":124,"line":13953},[78,205046,111691],{},[78,205048,205049],{"class":124,"line":13958},[78,205050,111577],{},[78,205052,205053],{"class":124,"line":13964},[78,205054,111700],{},[78,205056,205057],{"class":124,"line":13969},[78,205058,111705],{},[78,205060,205061],{"class":124,"line":24170},[78,205062,111710],{},[78,205064,205065],{"class":124,"line":24175},[78,205066,111715],{},[78,205068,205069],{"class":124,"line":24180},[78,205070,111720],{},[78,205072,205073],{"class":124,"line":24186},[78,205074,111725],{},[78,205076,205077],{"class":124,"line":24192},[78,205078,111730],{},[78,205080,205081],{"class":124,"line":24198},[78,205082,10054],{},[78,205084,205085],{"class":124,"line":24204},[78,205086,111739],{},[78,205088,205089],{"class":124,"line":24210},[78,205090,111744],{},[78,205092,205093],{"class":124,"line":24215},[78,205094,69967],{},[78,205096,205097],{"class":124,"line":24220},[78,205098,6942],{},[78,205100,205101],{"class":124,"line":24226},[78,205102,111577],{},[78,205104,205105],{"class":124,"line":24232},[78,205106,111761],{},[78,205108,205109],{"class":124,"line":24238},[78,205110,6942],{},[78,205112,205113],{"class":124,"line":24244},[78,205114,111770],{},[78,205116,205117],{"class":124,"line":24250},[78,205118,111775],{},[78,205120,205121],{"class":124,"line":24256},[78,205122,111780],{},[78,205124,205125],{"class":124,"line":24262},[78,205126,111785],{},[78,205128,205129],{"class":124,"line":24267},[78,205130,111790],{},[78,205132,205133],{"class":124,"line":24273},[78,205134,10054],{},[78,205136,205137],{"class":124,"line":24279},[78,205138,111799],{},[78,205140,205141],{"class":124,"line":24284},[78,205142,111804],{},[78,205144,205145],{"class":124,"line":24290},[78,205146,10054],{},[78,205148,205149],{"class":124,"line":24296},[78,205150,69967],{},[78,205152,205153],{"class":124,"line":24302},[78,205154,23518],{},[10548,205156,111820],{"id":111819},[114,205158,205159],{"className":33493,"code":111823,"language":33495,"meta":119,"style":119},[17,205160,205161,205165,205169,205173,205177,205181,205185,205189,205193,205197,205201,205205,205209,205213,205217,205221,205225],{"__ignoreMap":119},[78,205162,205163],{"class":124,"line":125},[78,205164,111830],{},[78,205166,205167],{"class":124,"line":132},[78,205168,110545],{},[78,205170,205171],{"class":124,"line":138},[78,205172,110550],{},[78,205174,205175],{"class":124,"line":144},[78,205176,110555],{},[78,205178,205179],{"class":124,"line":150},[78,205180,110560],{},[78,205182,205183],{"class":124,"line":156},[78,205184,111851],{},[78,205186,205187],{"class":124,"line":162},[78,205188,111856],{},[78,205190,205191],{"class":124,"line":168},[78,205192,111861],{},[78,205194,205195],{"class":124,"line":174},[78,205196,111866],{},[78,205198,205199],{"class":124,"line":180},[78,205200,111871],{},[78,205202,205203],{"class":124,"line":186},[78,205204,111876],{},[78,205206,205207],{"class":124,"line":192},[78,205208,111881],{},[78,205210,205211],{"class":124,"line":198},[78,205212,111886],{},[78,205214,205215],{"class":124,"line":204},[78,205216,111891],{},[78,205218,205219],{"class":124,"line":210},[78,205220,111896],{},[78,205222,205223],{"class":124,"line":216},[78,205224,111901],{},[78,205226,205227],{"class":124,"line":222},[78,205228,111906],{},[13,205230,205231],{},[22,205232,111911],{},[23289,205234],{},[107,205236,111917],{"id":111916},[7759,205238,111921],{"id":111920},[10548,205240,111925],{"id":111924},[13,205242,111928],{},[13,205244,111931],{},[10548,205246,111935],{"id":111934},[13,205248,111938],{},[13,205250,111941,205251],{},[22,205252,111944],{},[10548,205254,110444],{"id":111947},[13,205256,111950],{},[13,205258,111953],{},[7759,205260,111957],{"id":111956},[13,205262,111960,205263,111964],{},[22,205264,111963],{},[13,205266,111967],{},[7759,205268,111971],{"id":111970},[13,205270,111974],{},[13,205272,205273],{},[22,205274,111979],{},[226,205276,228],{},{"title":119,"searchDepth":144,"depth":144,"links":205278},[205279,205283,205288,205295],{"id":110377,"depth":132,"text":110378,"children":205280},[205281,205282],{"id":30036,"depth":144,"text":62379},{"id":110386,"depth":144,"text":110387},{"id":110485,"depth":132,"text":110486,"children":205284},[205285,205286,205287],{"id":110489,"depth":144,"text":110490},{"id":110688,"depth":144,"text":110689},{"id":110935,"depth":144,"text":110936},{"id":111005,"depth":132,"text":111006,"children":205289},[205290,205291,205292,205293,205294],{"id":111009,"depth":144,"text":111010},{"id":111120,"depth":144,"text":111121},{"id":111177,"depth":144,"text":111178},{"id":111349,"depth":144,"text":111350},{"id":111505,"depth":144,"text":111506},{"id":111916,"depth":132,"text":111917,"children":205296},[205297,205298,205299],{"id":111920,"depth":144,"text":111921},{"id":111956,"depth":144,"text":111957},{"id":111970,"depth":144,"text":111971},{},{"title":110367,"description":119},[9133,246,23378,10715,6380],1787942776532]