LeetCode-二叉树算法总结-层次遍历,路径总和等

				版权声明:本文为博主原创文章,欢迎转载,但请注明出处,谢谢愿意分享知识的你~~					https://blog.csdn.net/qq_32690999/article/details/80484440				</div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div id="content_views" class="markdown_views"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><h1 id="二叉树常考算法整理"><a name="t0"></a>二叉树常考算法整理</h1>

希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路。也欢迎大家来给我的Github的Leetcode算法项目点star呀~~

  • 二叉树常考算法整理
  • 前言
  • 二叉树的类型
  • 算法分类
    • 遍历(Traversal)问题
      • 先序、中序与后序遍历
      • 利用两种遍历结果构造二叉树
    • 递归问题
      • 二叉树最大深度
      • 二叉树最小深度
      • 平衡二叉树判断
      • 相同树
      • 对称树
      • 路径总和
    • 二叉搜索树/排序树问题
      • 验证二叉搜索树
      • 唯一二叉搜索树
      • 最低的二叉树共同祖先

前言

二叉树即子节点数目不超过两个的树,基于这个基本特性,许多算法都围绕这种树本身或其变体而展开。

二叉树的类型

此部分参考一句话弄懂常见二叉树类型

根据树的构成特性,树存在一些比较常见的类型,我们先来分别介绍一下:

  • 满二叉树

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。

1

  • 完全二叉树

一棵二叉树至多只有最下面的一层上的结点的度数(结点拥有的子树数)可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。

1

  • 平衡二叉树

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

1

  • 二叉搜索/查找/排序树

它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树

1

  • 红黑树

属于AVL树(平衡二叉查找树)的一种,对树的高度的要求不如AVL树那么严格(不是严格控制左、右子树高度或节点数之差小于等于1),使得其插入结点的效率相对更高。

1

算法分类

遍历(Traversal)问题

先序、中序与后序遍历

对任一二叉树结点,若以其本身为根结点(Root Node),它的左右子节点(left/right child),那么遍历指的就是以某种固定顺序将整个二叉树的所有结点都过一遍。

按照根节点与子节点先后遍历关系,一共有以下三种常见的遍历顺序:

  • 先序遍历(Preorder)

根结点-左子结点-右子结点

  • 中序遍历(Inorder)

左子结点-根结点-右子结点

  • 后序遍历(Postorder)

左子结点-右子结点-根结点

遍历,根据实现思路,可以分为递归(Recursive)和非递归两种方式。递归相对来说更为直观易理解,但是由于递归需要不断地多重地进行函数自身调用,会需要消耗更多的栈空间。而非递归方式就是用一般的循环(Iteration)来进行。(而其实由于二叉树的结构特性,许多相关的题目的解题思路都会存在递归和非递归两种方式,只要多做几道,就会自然体味到其中的规律。)

先给出递归实现的三种遍历:

        /** 递归的主要思想就是:*   由于是重复调用自身,故根据遍历顺序调整根节点与左右子节点的处理语句之间的相对顺序即可。*///递归先序遍历public static void recurivePreorder(TreeNode root){if(root==null)return;System.out.println(root.val);if(root.left!=null)recurivePreorder(root.left);if(root.right!=null)recurivePreorder(root.right);}//递归中序遍历public static void recursiveInorder(TreeNode root){if(root==null)return;if(root.left!=null)recursiveInorder(root.left);System.out.println(root.val);if(root.right!=null)recursiveInorder(root.right);}//递归后序遍历public static void recursivePostorder(TreeNode root){if(root==null)return;if(root.left!=null)recursivePostorder(root.left);if(root.right!=null)recursivePostorder(root.right);System.out.println(root.val);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

非递归实现三种遍历:

        /** 非递归的主要思想是:*   利用栈stack存下路过的结点,依照遍历顺序打印结点,利用stack回溯。*///非递归先序遍历public static void nonRecurPreorder(TreeNode root){ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();while(root!=null || stack.size()!=0){if (root != null) {  System.out.println(root.val); //访问结点并入栈  stack.push(root);                root = root.left;         //访问左子树  } else {  root = stack.pop();            //回溯至父亲结点  root = root.right;        //访问右子树  }  }}//非递归中序遍历public static void nonRecurInorder(TreeNode root){ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();while(root!=null || stack.size()!=0){if(root!=null){stack.push(root);root=root.left;  //访问左子树}else{root=stack.pop();               //回溯至父亲结点System.out.println(root.val);  //输出父亲结点root=root.right;  //访问右子树}}}//非递归后序遍历(相对来说,是二叉树遍历中最为复杂的一种)// 思路:如果当前结点没有左右子树,或者左右子树均已被访问过,那么就直接访问它;否则,将其右孩子和左孩子依次入栈。注释:peek()函数返回栈顶的元素,但不弹出该栈顶元素public static void nonRecurPostorder(TreeNode root){ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();TreeNode pre=null;TreeNode cur=null;stack.push(root);while(stack.size()!=0){cur=stack.peek();if((cur.left==null && cur.right==null) || (pre!=null && (pre==cur.left || pre==cur.right))){System.out.println(cur.val);  //输出父亲结点pre=cur;stack.pop();}else{if(cur.right!=null)stack.push(cur.right);if(cur.left!=null)stack.push(cur.left);}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

利用两种遍历结果构造二叉树

上面讲到,二叉树的遍历方式一般分为先序、中序和后序三种,其中先序和中序,或者中序和后续的遍历的结果就可以确定第三种的遍历结果,也即确定了一棵具体的二叉树。(此处默认二叉树无值相同的两个结点)

  • 利用先序与中序构造二叉树

(此处,我们仅对这道题进行细致分析,另两道题目是一模一样的思路。)

先序代表了父亲-左孩子-右孩子的顺序,中序代表了左孩子-父亲-右孩子的顺序,因此,从遍历序列的整体来看,先序序列的第一个结点代表的就是整棵树的根结点,而我们在中序序列中定位到这个结点后,中序序列这个结点以左的结点就是根结点左子树上的所有结点,这个结点以右的结点就是根结点右子树上的所有结点。然后我们将先序序列按照由中序序列那里得知的划分,找到左右子树的划分边界。以此类推,我们就可以通过不断地交替从两个序列中获得构造二叉树所需要的所有信息。

原题:LC105 Construct Binary Tree from Preorder and Inorder Traversal

public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0)return null;TreeNode root=new TreeNode(preorder[0]);if(preorder.length==1)return root;int leftSubTreeNodeNums=-1;for(int i=0;i<inorder.length;i++)if(inorder[i]==root.val) {leftSubTreeNodeNums=i;break;}root.left=buildTree(Arrays.copyOfRange(preorder, 1, leftSubTreeNodeNums+1), Arrays.copyOfRange(inorder,0,leftSubTreeNodeNums));root.right=buildTree(Arrays.copyOfRange(preorder, leftSubTreeNodeNums+1, preorder.length), Arrays.copyOfRange(inorder,leftSubTreeNodeNums+1,inorder.length));return root;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 利用中序与后序构造二叉树
public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length==0)return null;if(inorder.length==1)return new TreeNode(inorder[0]);TreeNode root=new TreeNode(postorder[postorder.length-1]);int leftTreeNodeSum=0;for(int i=0;i<inorder.length;i++)if(inorder[i]==root.val){leftTreeNodeSum=i;break;}root.left=buildTree(Arrays.copyOfRange(inorder, 0, leftTreeNodeSum), Arrays.copyOfRange(postorder, 0, leftTreeNodeSum));root.right=buildTree(Arrays.copyOfRange(inorder, leftTreeNodeSum+1, inorder.length), Arrays.copyOfRange(postorder, leftTreeNodeSum, postorder.length-1));return root;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

递归问题

递归解二叉树问题时,一般以一棵三结点或更多结点的小树作为思考解法的参照物,然后考虑一下递归的返回情况(一般是碰到空结点的时候)如何处理。

二叉树最大深度

原题:LC104 Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth.

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

Note: A leaf is a node with no children.

Example:

Given binary tree [3,9,20,null,null,15,7],

    3/ \
  9  20/  \
   15   7
  • 1
  • 2
  • 3
  • 4
  • 5

return its depth = 3.

  • My Answer
// 思路:典型的递归思路,整颗树的最大深度等于左右子树的最大深度+1。
public int maxDepth(TreeNode root) {if(root==null)return 0;elsereturn 1+Math.max(maxDepth(root.left),maxDepth(root.right));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

二叉树最小深度

原题:LC111 Minimum Depth of Binary Tree

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

Note: A leaf is a node with no children.

Example:

Given binary tree [3,9,20,null,null,15,7],

    3/ \
  9  20/  \
   15   7
  • 1
  • 2
  • 3
  • 4
  • 5

return its minimum depth = 2.

  • My Answer
// 思路:根据左右孩子的不同情况分别返回不同的相应深度,在左右孩子均存在时,返回深度较小的那一边,以获得最小深度。
public int minDepth(TreeNode root) {if(root==null)return 0;else if(root.left==null && root.right==null)return 1;else if(root.left!=null && root.right!=null)return 1+Math.min(minDepth(root.left), minDepth(root.right));elseif(root.left!=null)return 1+minDepth(root.left);elsereturn 1+minDepth(root.right);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

平衡二叉树判断

原题:LC110 Balanced Binary Tree

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as:

a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example 1:

Given the following tree [3,9,20,null,null,15,7]:

    3/ \
  9  20/  \
   15   7
  • 1
  • 2
  • 3
  • 4
  • 5

Return true.

Example 2:

Given the following tree [1,2,2,3,3,null,null,4,4]:

       1/ \
     2   2/ \
   3   3/ \
 4   4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Return false.

  • My Answer
//思路:判断整棵树是否为平衡二叉树,等价于判断根节点的左右子树的高度差是否小于等于1,且左右子树是否也都为平衡二叉树。
// 而判断高度差的方法可以利用前面求二叉树最大深度的方法,去分别算出左右子树的高度作差。public static boolean isBalanced(TreeNode root) {if(root==null)return true;else {if(Math.abs(getMaxTreeDepth(root.left)-getMaxTreeDepth(root.right))<=1){return isBalanced(root.left) && isBalanced(root.right);}else {return false;}}}public static int getMaxTreeDepth(TreeNode root) {if(root==null)return 0;elsereturn 1+Math.max(getMaxTreeDepth(root.left),getMaxTreeDepth(root.right));}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

相同树

原题:LC100 Same Tree

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1/ \       / \
         2   3     2   3[1,2,3],   [1,2,3]Output: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Example 2:

Input:     1         1/           \2             2[1,2],     [1,null,2]Output: false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Example 3:

Input:     1         1/ \       / \
         2   1     1   2[1,2,1],   [1,1,2]Output: false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • My Answer
// 思路:逐结点判断,若每个结点都相同,那么整棵树就相同。
public boolean isSameTree(TreeNode p, TreeNode q) {if(p==null && q==null) {return true;}else if(p!=null && q!=null){if(p.val==q.val)return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);elsereturn false;}elsereturn false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

对称树

原题:LC101 Symmetric Tree

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1/ \
  2   2/ \ / \
3  4 4  3
  • 1
  • 2
  • 3
  • 4
  • 5

But the following [1,2,2,null,3,null,3] is not:

    1/ \
  2   2\   \
   3    3
  • 1
  • 2
  • 3
  • 4
  • 5

Note:

Bonus points if you could solve it both recursively and iteratively.

  • My Answer
// 思路:判断对称树即判断左右子树镜面对称位置的结点是否均存在,且值相同。
public boolean isSymmetric(TreeNode root) {return isMirror(root,root);
}public boolean isMirror(TreeNode t1, TreeNode t2) {if (t1 == null && t2 == null) return true;if (t1 == null || t2 == null) return false;return (t1.val == t2.val)&& isMirror(t1.right, t2.left)&& isMirror(t1.left, t2.right);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

路径总和

原题:LC112 Path Sum

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

Note: A leaf is a node with no children.

Example:

Given the below binary tree and sum = 22,

      5/ \
    4   8/   / \
  11  13  4/  \      \
7    2      1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

  • My Answer
// 思路:注意题意是找一条“从根节点到叶子结点”的路径和,所以到每一个结点判断是否值对的同时,还要判断是否没有孩子结点,如果有,还需要继续往下找。
public boolean hasPathSum(TreeNode root, int sum) {if(root==null)return false;if(root.val==sum && root.left==null && root.right==null)return true;int goal=sum-root.val;return hasPathSum(root.left, goal) || hasPathSum(root.right, goal);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二叉搜索树/排序树问题

二叉排序树的特点前面提到过,即对于任一树中结点,其左子树的结点的值均小于它,而右子树的结点的值均大于它。根据这个特性,也存在一系列相关的算法题。

而由于依然是二叉树,故也常见用递归思路解决搜索树相关的题目。

验证二叉搜索树

LC98 Validate Binary Search Tree

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node’s key.
  • The right subtree of a node contains only nodes with keys greater than the node’s key.
  • Both the left and right subtrees must also be binary search trees.

Example 1:

Input:

    2/ \1   3
Output: true
  • 1
  • 2
  • 3
  • 4

Example 2:

    5/ \
  1   4/ \
    3   6
Output: false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Explanation: The input is: [5,1,4,null,null,3,6]. The root node’s value
is 5 but its right child’s value is 4.

  • My Answer
// 思路:要保证左子树的结点值均小于父结点值,右子树的结点值均大于父结点值,可以分别在左右子树中搜索最大最小值的结点,如果它们的值已经符合和父结点的大小关系,那么就只需再继续判断左右子树是否也都是二叉搜索树即可。public boolean isValidBST(TreeNode root) {if(root==null)return true;if(root.left==null && root.right==null)return true;int leftMax=findMaxValInBST(root.left, Integer.MIN_VALUE),rightMin=findMinValInBST(root.right, Integer.MAX_VALUE);if(root.val!=Integer.MIN_VALUE) {if(leftMax>=root.val)return false;}if(root.val!=Integer.MAX_VALUE) {if(rightMin<=root.val)return false;}if(root.left!=null && root.right==null)return root.left.val<root.val && isValidBST(root.left);if(root.left==null && root.right!=null)return root.right.val>root.val && isValidBST(root.right);return root.left.val<root.val && root.right.val>root.val && isValidBST(root.left)  && isValidBST(root.right);}public int findMaxValInBST(TreeNode root,int maxVal) {if(root==null)return maxVal;if(root.val>maxVal)maxVal=root.val;int leftMax=findMaxValInBST(root.left, maxVal),rightMax=findMaxValInBST(root.right, maxVal);return leftMax>rightMax?leftMax:rightMax;}public int findMinValInBST(TreeNode root,int minVal) {if(root==null)return minVal;if(root.val<minVal)minVal=root.val;int leftMin=findMinValInBST(root.left, minVal),rightMin=findMinValInBST(root.right, minVal);return leftMin<rightMin?leftMin:rightMin;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

唯一二叉搜索树

LC96 Unique Binary Search Trees

Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?

Example:

Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST's:1         3     3      2      1\       /     /      / \      \
     3     2     1      1   3      2/     /       \                 \
   2     1         2                 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • My Answer
// 思路:动态规划
// f(n)=sum(f(n-i)*f(i-1)) i=1,2,3...,n
// 对于从1到n的n个结点,构成二叉搜索树的所有情况可以以左右子树上结点的数目来进行划分。
// 例如左边0个结点+右边n-1个结点,左边1个结点+右边n-2个结点......,左边n-1个结点,右边0个结点。
// 一种情况的左右子树的构成情况相乘,不同情况的结果加总即得到最后的解。public int numTrees(int n) {int numTrees[]=new int[n+1];numTrees[0]=1;numTrees[1]=1;for(int i=2;i<=n;i++) {for(int j=1;j<=i;j++) {numTrees[i]+=numTrees[j-1]*numTrees[i-j];}}return numTrees[n];}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

最低的二叉树共同祖先

LC235 Lowest Common Ancestor of a Binary Search Tree

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5]

        _______6______/              \
    ___2__          ___8__/      \        /      \
   0      _4       7       9/  \
         3   5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Example 1:

Input: root, p = 2, q = 8
Output: 6 
Explanation: The LCA of nodes 2 and 8 is 6.
  • 1
  • 2
  • 3

Example 2:

Input: root, p = 2, q = 4
Output: 2
Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.
  • 1
  • 2
  • 3
  • My Answer
// 思路:根据结点p和q的值与父亲结点值的大小关系判断p与q是否位于同一子树下,如果是,那么递归调用方法,如果不是,那么当前父亲结点就是两者的最低共同祖先。public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(p==q || p.right==q || p.left==q)return p;else if(q.left==p || q.right==p)return q;// if two nodes p and q are in same sub tree, then we need to go into lower layer recursively. if(root.val>p.val && root.val>q.val) {return lowestCommonAncestor(root.left, p, q);}else if (root.val<p.val && root.val<q.val) {return lowestCommonAncestor(root.right, p, q);// if p and q not in same sub tree, then root is the lowest common ancestor.}else {return root;}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet"></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次闲鱼维权事件

-----2017.11.16 最后一次更新----- 小夕也真的没有想到&#xff0c;在万般绝望之时竟然得到了这么多人的帮助。在本文发出后&#xff0c;多位阿里人员积极联系我了解了情况&#xff0c;很感激一位阿里的专家帮我将此事递交给相关部门&#xff0c;让专业的客服直接受理和重审此…

百度作业帮-产品分析

一、商业模式分析 1.1、问答时期&#xff08;2014年2月-2015年1月&#xff09; 商业模式之作业帮V1.0.png两点值得注意&#xff1a; 作业帮的出现有明显的历史原因&#xff0c;即由百度知道团队出品&#xff0c;因此切入K12教育初期&#xff0c;采取的是之前的问答模式&#xf…

【Python自然语言处理】中文分词技术——统计分词

中文分词方法 本文参考自书籍《Python自然语言处理实战&#xff1a;核心技术与算法》 用做个人的学习笔记和分享 1. 规则分词 规则分词的详细笔记 2. 统计分词 2.1 一般步骤 建立统计语言模型。句子划分为单词&#xff0c;对划分结果进行概率分析&#xff0c;获得概率最大的…

你的模型真的陷入局部最优点了吗?

小夕曾经收到过一个提问&#xff1a;“小夕&#xff0c;我的模型总是在前几次迭代后很快收敛了&#xff0c;陷入到了一个局部最优点&#xff0c;怎么也跳不出来&#xff0c;怎么办&#xff1f;”本文不是单纯对这个问题的回答&#xff0c;不是罗列工程tricks&#xff0c;而是希…

如何与深度学习服务器优雅的交互?(长期更新)

0. 故事序言 如果有人问小夕&#xff1a;"小夕&#xff0c;要是人工智能的就业岗位一夜之间消失了&#xff0c;你会去转行做什么呢&#xff1f;" 答曰&#xff1a;"当然是去做Linux运维啊23333" 小夕有一台自己负责的GPU服务器&#xff0c;她可让小夕操碎了…

风控模型师面试准备--技术篇(逻辑回归、决策树、集成学习)

原文地址&#xff1a;https://zhuanlan.zhihu.com/p/56175215 编辑于2019-02-12&#xff0c;持续更新中&#xff0c;有风控建模工作经验的&#xff0c;或者想转行风控建模的小伙伴可以互相交流下... 一.算法 逻辑回归决策树集成学习&#xff08;随机森林&#xff0c;Adaboost&…

step-by-step: 夕小瑶版神经网络调参指南(上)

距离上一篇文章已经过去好久好久好久啦。闭关几个月后&#xff0c;其实早有继续码文章的打算&#xff0c;先后写了一下核函数与神经网络的一些思考、文本预处理tricks、不均衡文本分类问题、多标签分类问题、tensorflow常用tricks、噪声对比估算与负采样等文章&#xff0c;结果…

谷歌发布端到端AI平台,还有用于视频和表格的AutoML、文档理解API等多款工具

谷歌又有了大动作。在大洋彼岸的谷歌Cloud Next conference大会上&#xff0c;谷歌一口气发布了多款AI新品和工具&#xff0c;主要包括&#xff1a; 端到端的AI平台 用于处理视频和表格数据的AutoML Tables和AutoML Video 文档理解API 联络中心AI 视觉产品搜索 对于开发者…

跨性别,你所不知道的事

今晚原计划在订阅号里推送南溪妹子前几天录制的跨性别科普视频&#xff0c;没想到今天收到南溪的私信&#xff0c;说不做科普了&#xff0c;还是算了吧。急忙去了解了一下原因 (http://www.zhihu.com/pin/963101597957644288) &#xff0c;才知道南溪因这段视频所遭受的无故攻击…

文本分类问题不需要ResNet?小夕解析DPCNN设计原理(上)

历史回顾回顾一下图像和文本的发展史&#xff0c;似乎这就是一场你追我赶的游戏。在上一阶段的斗争中&#xff0c;朴素贝叶斯、最大熵、条件随机场这些理论完备的统计机器学习模型使得文本分类、中文分词、NER等诸多自然语言处理问题取得了差强人意&#xff08;释义&#xff1a…

【Tensorflow】TensorFlow的嵌入layer和多层layer

计算图中的操作 # python 3.6 import tensorflow as tf import numpy as npsess tf.Session()# 将张量和占位符对象组成一个计算图&#xff0c;创建一个简单的分类器# 一、计算图中的操作 # 1. 声明张量和占位符&#xff0c;创建numpy数组&#xff0c;传入计算图操作 x_vals …

文本分类问题不需要ResNet?小夕解析DPCNN设计原理(下)

哎呀呀&#xff0c;说好的不拖稿的又拖了两天T_T&#xff0c;小夕过一阵子分享给你们这两天的开心事哦。后台催稿调参系列的小伙伴们不要急&#xff0c;下一篇就是第二篇调参文啦。好啦&#xff0c;接着上一篇文章&#xff0c;直接搬来DPCNN、ShallowCNN、ResNet的对比图。从图…

注意力机制-深度学习中的注意力机制+注意力机制在自然语言处理中的应用

1 深度学习中的注意力机制 https://mp.weixin.qq.com/s?__bizMzA4Mzc0NjkwNA&mid2650783542&idx1&sn3846652d54d48e315e31b59507e34e9e&chksm87fad601b08d5f17f41b27bb21829ed2c2e511cf2049ba6f5c7244c6e4e1bd7144715faa8f67&mpshare1&scene1&src…

【TensorFlow】常用的损失函数及其TensorFlow实现

1 损失函数 定义&#xff1a;将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。 应用&#xff1a;作为学习准则与优化问题相联系&#xff0c;即通过最小化损失函数求解和评估模型。 分类&#xff1a;回归问题、分类问题 2 回归问…

从经典文本分类模型TextCNN到深度模型DPCNN

如今深度学习已经成为NLP领域的标配技术&#xff0c;在图像中大为成功的卷积神经网络&#xff08;CNN&#xff09;也开始广泛渗透到文本分类、机器翻译、机器阅读等NLP任务中。但是&#xff0c;在ACL2017以前&#xff0c;word-level的文本分类模型&#xff08;以单词为语义单位…

从特征分解到协方差矩阵:详细剖析和实现PCA算法

从特征分解到协方差矩阵&#xff1a;详细剖析和实现PCA算法本文先简要明了地介绍了特征向量和其与矩阵的关系&#xff0c;然后再以其为基础解释协方差矩阵和主成分分析法的基本概念&#xff0c;最后我们结合协方差矩阵和主成分分析法实现数据降维。本文不仅仅是从理论上阐述各种…

NLP中常用文本分类模型汇总

如今深度学习已经成为NLP领域的标配技术&#xff0c;在图像中大为成功的卷积神经网络&#xff08;CNN&#xff09;也开始广泛渗透到文本分类、机器翻译、机器阅读等NLP任务中。但是&#xff0c;在ACL2017以前&#xff0c;word-level的文本分类模型&#xff08;以单词为语义单位…

【TensorFlow】随机训练和批训练的比较与实现

一、随机训练和批训练 随机训练&#xff1a;一次随机抽样训练数据和目标数据对完成训练。批训练&#xff1a;一次大批量训练取平均损失来进行梯度计算&#xff0c;批量训练大小可以一次上扩到整个数据集。批训练和随机训练的差异&#xff1a;优化器方法和收敛的不同批训练的难…

「小公式」平均数与级数

喵喵喵&#xff0c;小夕最近准备复习一下数学和基础算法&#xff0c;所以可能会推送或者附带推送点数学和基础算法的小文章。说不定哪天就用&#xff08;考&#xff09;到了呢(&#xffe3;∇&#xffe3;)注意哦&#xff0c;与头条位的文章推送不同&#xff0c;「小公式」和「…