写点什么

AI 数据科学认证 -2021 年的最佳选择 John 易筋 ARTS 打卡 Week 44

用户头像
John(易筋)
关注
发布于: 2021 年 04 月 11 日

1. Algorithm: 每周至少做一个 LeetCode 的算法题

笔者的文章:

算法: 二叉树的最近公共祖先 236. Lowest Common Ancestor of a Binary Tree


236. Lowest Common Ancestor of a Binary Tree

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


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


Example 1:



Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1Output: 3Explanation: The LCA of nodes 5 and 1 is 3.
复制代码


Example 2:



Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4Output: 5Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
复制代码


Example 3:


Input: root = [1,2], p = 1, q = 2Output: 1
复制代码


Constraints:


The number of nodes in the tree is in the range [2, 105].-109 <= Node.val <= 109All Node.val are unique.p != qp and q will exist in the tree.
复制代码

dfs 深度优先解法

解析: 求节点的最近公共祖先。


  1. 用深度优先算法,如果没有找到,那么返回 null。

  2. 两边都找到,那么当前节点就是结果;

  3. 如果 left 子树为空,那么肯定在右子树里面;

  4. 如果 right 子树为空,那么可定在左子树里面。


/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        if (root == null || root == p || root == q) return root;        TreeNode left = lowestCommonAncestor(root.left, p, q);        TreeNode right = lowestCommonAncestor(root.right, p, q);        if (left != null && right != null) return root;        return left == null ? right : left;    }}
复制代码

遍历解法

解析:


  1. 把所有节点跟父节点的关系存储到 parent map 中;

  2. stack 仅仅为为了 bfs 广度优先搜索的必要。

  3. 把 p 自己,p 的所有父节点,祖父节点,一直到 root 都放到 ancestors;

  4. ancestors 如果包含 q,说明同时是 p,q 的公共祖先;否则就找 q 的上一个父节点,依次循环,直到在 ancestors 中找到。


public class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        Map<TreeNode, TreeNode> parent = new HashMap<>();        Deque<TreeNode> stack = new ArrayDeque<>();        parent.put(root, null);        stack.push(root);
while (!parent.containsKey(p) || !parent.containsKey(q)) { TreeNode node = stack.pop(); if (node.left != null) { parent.put(node.left, node); stack.push(node.left); } if (node.right != null) { parent.put(node.right, node); stack.push(node.right); } } Set<TreeNode> ancestors = new HashSet<>(); while (p != null) { ancestors.add(p); p = parent.get(p); } while (!ancestors.contains(q)) q = parent.get(q); return q; }}
复制代码


2. Review: 阅读并点评至少一篇英文技术文章

笔者的文章:

翻译:AI数据科学认证-2021年的最佳选择

到 2020 年,全球需要大量数据科学专业人员吗?估计有 270 万(来源:IBM)!而且,根据美国劳工统计局的数据,到 2026 年将在数据科学领域创造约 1150 万个就业机会。


各个规模和部门的组织都在生产和收集各种类型的指数数据,这将在我们迈向 2021 年的时候进一步推动数据科学行业对服务的需求。这对于促进以数据为依据的决策至关重要为公司制定和制定业务策略。

数据科学家做什么工作?

在腠[R 一硒数据的科学生涯中,数据科学家结合处理工程,数学,统计等各项任务。持久性也很关键,尤其是在数据处理和数据清理阶段。在完成这些初始步骤之后,接下来是寻找适合更好的产品原型或更好地了解产品使用和健康状况的模式和构建模型。


🔗数据科学专业人员的工作在银行,金融,教育和医疗保健等领域得到广泛使用也就不足为奇了。而且,对数据的日益关注导致对诸如人工智能和机器学习之类的相关技能的需求增加。

数据科学专业人员能赚多少薪水?

数据科学行业的薪水令人印象深刻。在美国,数据科学家的基本年薪为 117,345 美元,范围在 86,000-157,000 美元之间(来源:Glassdoor)。以下是按经验水平为数据科学家估算的薪水(来源:ZipRecruiter):


👉入门级:这是指应届毕业生或经验丰富的专业人员从不同领域转换而没有相关工作经验。他们倾向于更多地学习和实践新技能,因此他们从雇主那里接受了适当的培训。年薪估计为 69,000 美元。


👉中级:年薪中位数为 89,000 美元。


👉经验丰富:这些专业人员在数据科学事业中拥有丰富的经验。他们的年薪中位数为 1,28,000 美元。


manager 在经理级别有经验:年薪中位数可能高达 184,000 美元。

就位置而言,以下是估计的年薪:

·印度:708,012 印度卢比(约合 9,507 美元,来源:PayScale)·在美国:96,106 美元(来源:PayScale)

在线课程和认证有多有用?

那些以数据科学职业为目标或已经在该领域工作的人,将很容易获得良好的 数据科学认证。这是无可否认的证明,持有人的技能超越了书本知识的局限性。

以下是获得最佳数据科学认证的优势:

·突出投资组合和简历的其他技能·改善工作前景·访问职业频道,招聘实验室和雇主评论·促进职业道路之间的过渡换句话说,认证可以极大地促进数据科学事业的发展。雇主非常看重认证,这让工作绩效和技能集可以为员工说话。他们还表明,该人愿意付出额外的努力来提高他或她的技能。

有哪些可用的顶级数据科学认证?

以下是 2021 年精选的一些最佳数据科学认证:

1.数据科学专业证书(哈佛大学和 edX)

这是一个在线证书计划,以自定进度的结构涵盖技能培训课程。它涵盖以下技能:·R 编程基础·推论,建模,概率和其他统计概念及其实际应用·使用 dplyr 处理数据,使用 ggplot2 进行数据可视化以及 tidyverse 的其他方面的经验·git 和 GitHub,RStudio,Unix / Linux 以及其他面向数据科学专业人员的基本工具·机器学习算法·实际案例研究,以说明基本的数据科学概念 courses 课程数:9⏲持续时间:17 个月(每周 2-3 个小时)

2.数据科学专业(约翰霍普金斯大学和 Coursera)

该程序是对数据科学的介绍。涵盖的技能包括:·使用 R 清洗,分析和可视化数据·导航数据科学流程-从数据获取到其发布·使用 GitHub 管理数据科学项目·使用回归模型进行干扰,最小二乘和回归分析最终的 Capstone 项目要求参与者通过应用所学技能,根据实际数据构建数据产品。建议初学者具有 Python 经验并熟悉回归,并且完成此灵活课程后,参与者将获得可共享的证书。courses 课程数:10⏲持续时间:11 个月(每周 7 小时)here在这里注册


3.高级大数据分析师(美国数据科学理事会— DASCA)对于寻求加速大数据分析增长的专业人士而言,高级大数据分析师(或称 SBDA™)是世界上最可信的第三方独立于厂商的认证。它是国际上公认和接受的,主要针对大数据或市场研究专业人员。它涵盖以下内容:·数据科学的基础:Python 和 R·数据科学数学:数学和统计学中的重要概念·处理数据:使用 Python 和 R 管理海量数据·进行数据分析:使用 Hadoop 生态系统分析大数据·数据可视化:Tableau 可视化并显示结果·机器学习和 AI 中的大数据:在 ML 和 AI 应用程序中使用 R 和 Python·业务实施:在业务级数据分析中使用 R 和 Python·实施分析:MongoDB,消息传递,企业搜索,云和集群⏲持续时间:6 个月here在这里注册!

4.具有 Python 专业化的应用数据科学(密歇根大学和 Coursera)

该程序通过 Python 向学习者介绍数据科学,为他们提供以下技能:·进行推论统计分析·识别数据可视化是好是坏·通过应用机器学习增强数据分析·分析社交网络连接该程序针对具有 Python 或编程基础知识并希望将 Python 工具包用于进一步操作的人员。courses 课程总数:5⏲持续时间:5 个月(每周 7 小时)here在这里注册!

总之…

这些是 2021 年最佳数据科学认证的前四名,并且是开始或促进数据科学事业的好方法!

参考

https://medium.com/@taylor.mark110/data-science-certifications-the-best-picks-for-2021-1d1023ce8eed


3. Tips: 学习至少一个技术技巧

笔者的文章:

翻译:PropertyWrapper swift 5 aop特性


说明

swift 5 提出 PropertyWrapper,类似于 AOP 拦截器的思想,在属性的更改之前,做个拦截处理,以下为官网资料的翻译

PropertyWrapper

属性包装器在管理属性存储方式的代码与定义属性的代码之间增加了一层隔离。例如,如果您具有提供线程安全检查或将其基础数据存储在数据库中的属性,则必须在每个属性上编写该代码。使用属性包装器时,定义包装器时,只需编写一次管理代码,然后通过将其应用于多个属性来重用该管理代码。


要定义属性包装器,您需要创建定义属性的结构,枚举或类 wrappedValue。在下面的代码中,该 TwelveOrLess 结构确保包装的值始终包含小于或等于 12 的数字。如果您要求存储更大的数字,则改为存储 12。


@propertyWrapperstruct TwelveOrLess {    private var number: Int    init() { self.number = 0 }    var wrappedValue: Int {        get { return number }        set { number = min(newValue, 12) }    }}
复制代码


设置器确保新值小于 12,并且 getter 返回存储的值。


笔记


上例中的声明 number 将变量标记为 private,以确保 number 仅在的实现中使用 TwelveOrLess。在其他地方编写的代码使用的 getter 和 setter 访问值 wrappedValue,并且不能 number 直接使用。有关的信息 private,请参阅访问控制。


通过在属性之前写包装器的名称作为属性,将包装器应用于属性。这是一个存储一个小矩形的结构,它使用由 TwelveOrLess 属性包装器实现的“ small”相同(相当随意)的定义:


struct SmallRectangle {    @TwelveOrLess var height: Int    @TwelveOrLess var width: Int}
var rectangle = SmallRectangle()print(rectangle.height)// Prints "0"
rectangle.height = 10print(rectangle.height)// Prints "10"
rectangle.height = 24print(rectangle.height)// Prints "12"
复制代码


在 height 和 width 来自定义性能得到它们的初始值 TwelveOrLess,它设置 TwelveOrLess.number 为零。rectangle.height 因为数字很小,所以将数字 10 存储到成功。尝试存储 24 实际上存储的是 12 的值,因为对于属性设置程序的规则而言 24 太大了。


将包装器应用于属性时,编译器将合成为包装器提供存储的代码和提供通过包装器访问属性的代码。(属性包装器负责存储包装后的值,因此没有为此合成的代码。)您可以编写使用属性包装器的行为的代码,而无需利用特殊的属性语法。例如,这是 SmallRectangle 先前代码清单的的一个版本,该版本将其属性 TwelveOrLess 显式地包装在结构中,而不是 @TwelveOrLess 作为属性来编写:


struct SmallRectangle {    private var _height = TwelveOrLess()    private var _width = TwelveOrLess()    var height: Int {        get { return _height.wrappedValue }        set { _height.wrappedValue = newValue }    }    var width: Int {        get { return _width.wrappedValue }        set { _width.wrappedValue = newValue }    }}
复制代码


在_height 和_width 属性存储属性包装的一个实例,TwelveOrLess。获取 height 和 width 包装对 wrappedValue 属性的访问权的 setter 和 setter 。


设置包装属性的初始值上面示例中的代码通过 number 在的定义中提供初始值来设置 wrapd 属性的初始值 TwelveOrLess。使用此属性包装器的代码不能为被包装的属性指定其他初始值,TwelveOrLess 例如,SmallRectangle 不能给出 height 或 width 初始值的定义。为了支持设置初始值或其他自定义,属性包装器需要添加一个初始化程序。下面是一个扩大版 TwelveOrLess 叫 SmallNumber 那一套包裹和最大值定义初始化:


@propertyWrapperstruct SmallNumber {    private var maximum: Int    private var number: Int
var wrappedValue: Int { get { return number } set { number = min(newValue, maximum) } }
init() { maximum = 12 number = 0 } init(wrappedValue: Int) { maximum = 12 number = min(wrappedValue, maximum) } init(wrappedValue: Int, maximum: Int) { self.maximum = maximum number = min(wrappedValue, maximum) }}
复制代码


的定义 SmallNumber 包括三个初始化器 init(),init(wrappedValue:)和 init(wrappedValue:maximum:),下面的示例使用这些初始化器来设置包装后的值和最大值。有关初始化和初始化程序语法的信息,请参见 Initialization。


当您将包装器应用于属性并且未指定初始值时,Swift 使用 init()初始化程序来设置包装器。例如:


struct ZeroRectangle {    @SmallNumber var height: Int    @SmallNumber var width: Int}
var zeroRectangle = ZeroRectangle()print(zeroRectangle.height, zeroRectangle.width)// Prints "0 0"
复制代码


的情况下,SmallNumber 该包裹 height 并 width 通过调用创建 SmallNumber()。该初始化中的代码设置初始包裹值和初始最大值,使用的零和 12 的默认值的属性包装仍然提供所有的初始值的,如所使用的前面的例子 TwelveOrLess 在 SmallRectangle。与该示例不同,SmallNumber 它还支持编写那些初始值作为声明属性的一部分。


当您为属性指定初始值时,Swift 使用 init(wrappedValue:)初始化程序来设置包装器。例如:


struct UnitRectangle {    @SmallNumber var height: Int = 1    @SmallNumber var width: Int = 1}
var unitRectangle = UnitRectangle()print(unitRectangle.height, unitRectangle.width)// Prints "1 1"
复制代码


当您使用包装器写属性时,该属性将转换为对初始化器的调用。的情况下,该包裹并通过调用创建。初始化程序使用此处指定的包装值,并且使用默认最大值 12。= 1init(wrappedValue:)SmallNumberheightwidthSmallNumber(wrappedValue: 1)


当您在自定义属性后的括号中写入参数时,Swift 将使用接受这些参数的初始化程序来设置包装器。例如,如果您提供一个初始值和一个最大值,Swift 将使用 init(wrappedValue:maximum:)初始化程序:


struct NarrowRectangle {    @SmallNumber(wrappedValue: 2, maximum: 5) var height: Int    @SmallNumber(wrappedValue: 3, maximum: 4) var width: Int}
var narrowRectangle = NarrowRectangle()print(narrowRectangle.height, narrowRectangle.width)// Prints "2 3"
narrowRectangle.height = 100narrowRectangle.width = 100print(narrowRectangle.height, narrowRectangle.width)// Prints "5 4"
复制代码


的实例 SmallNumber,它包装 height 是通过调用创建,以及包装的实例是通过调用创建。SmallNumber(wrappedValue: 2, maximum: 5)widthSmallNumber(wrappedValue: 3, maximum: 4)


通过包含属性包装器的参数,可以在包装器中设置初始状态,或者在创建包装器时将其他选项传递给包装器。此语法是使用属性包装器的最通用方法。您可以为属性提供所需的任何参数,然后将它们传递给初始化程序。


当包含属性包装器参数时,还可以使用赋值指定初始值。Swift 将分配视为一个 wrappedValue 参数,并使用接受您所包含的参数的初始化程序。例如:


struct MixedRectangle {    @SmallNumber var height: Int = 1    @SmallNumber(maximum: 9) var width: Int = 2}
var mixedRectangle = MixedRectangle()print(mixedRectangle.height)// Prints "1"
mixedRectangle.height = 20print(mixedRectangle.height)// Prints "12"
复制代码


SmallNumber 包装的实例 height 是通过调用来创建的,该实例使用默认的最大值 12。包装的实例是通过调用来创建的。SmallNumber(wrappedValue: 1)widthSmallNumber(wrappedValue: 2, maximum: 9)


从属性包装器投影值除了包装的值之外,属性包装器还可以通过定义投影值来公开其他功能,例如,管理对数据库的访问的属性包装器可以 flushDatabaseConnection()在其投影值上公开方法。预计值的名称与包装值相同,但以美元符号(投影值开头的属性,所以不会干扰您定义的属性。


在 SmallNumber 上面的示例中,如果尝试将属性设置为太大的数字,则属性包装器将在存储数字之前对其进行调整。下面的代码 projectedValue 在 SmallNumber 结构中添加了一个属性,以在存储该新值之前跟踪该属性包装器是否调整了该属性的新值。


@propertyWrapperstruct SmallNumber {    private var number: Int    var projectedValue: Bool    init() {        self.number = 0        self.projectedValue = false    }    var wrappedValue: Int {        get { return number }        set {            if newValue > 12 {                number = 12                projectedValue = true            } else {                number = newValue                projectedValue = false            }        }    }}struct SomeStructure {    @SmallNumber var someNumber: Int}var someStructure = SomeStructure()
someStructure.someNumber = 4print(someStructure.$someNumber)// Prints "false"
someStructure.someNumber = 55print(someStructure.$someNumber)// Prints "true"
复制代码


写入 someStructure.someNumber 是 false。但是,预计值是 true 在尝试存储太大的数字(如 55 )之后得出的。


属性包装器可以返回任何类型的值作为其投影值。在此示例中,属性包装器仅公开一条信息(无论数字是否已调整),因此它公开该布尔值作为其投影值。需要公开更多信息的包装器可以返回其他某种数据类型的实例,也可以返回 self 以公开其包装器的实例作为其投影值。


当您从属于类型一部分的代码中访问投影值时(例如,属性获取器或实例方法),可以 self.像访问其他属性一样在属性名之前省略。在以下示例中的代码是指围绕包装件的投影值 height 与 width 作为width:


enum Size {    case small, large}
struct SizedRectangle { @SmallNumber var height: Int @SmallNumber var width: Int
mutating func resize(to size: Size) -> Bool { switch size { case .small: height = 10 width = 20 case .large: height = 100 width = 100 } return $height || $width }}
复制代码


因为属性包装器语法只是具有 getter 和 setter 的属性的语法糖,所以访问 height 和 width 行为与访问任何其他属性相同。例如,resize(to:)访问中的代码 height 及其 width 使用的属性包装器。如果调用,开关盒将矩形的高度和宽度设置为 100。包装器将防止这些属性的值大于 12,并将其投影值设置为,以记录其调整其值的事实。最后,return 语句检查并确定属性包装器是否已调整或。resize(to: .large).largetrueresize(to:)widthheightwidth

4. Share: 分享一篇有观点和思考的技术文章

笔者的文章:

极客大学产品经理训练营:运营思维 第19课总结

讲师:邱岳

1. 运营是做什么的

  • <font color='red'>运</font>转·经<font color='red'>营</font>. 产品经理经常拆房子、盖新房子。经营是要持续经营一个产品。

  • CEO、COO(Apple 的 Tim Cook 以前就是)、CTO、CFO、CIO......

  • 运营其实是个容量很大的工种

  • 运营不是【打杂的】,但运营的工作中一定包含大量【事务性执行工作】。

  • 如果你决定独立在社区里开个服装店......产品要租个店铺,装修,想着到哪里进货,选品的风格,摆二维码,怎么开门。运营要持续卖货,补货,经常调整一下布置,清仓等。产品生,运营养。运营负责的细水长流。

2. 运营工作的抽象套路

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210407204800332.png#pic_center =500x)


运营需要统筹资源,制定策略,执行,再调优,再优化策略,再执行,逐步达到目标。运营经常用薅羊毛、割韭菜,跟多个资源一起搞活动等。比如电梯广告里面,买奶茶,下面会出现饿了么,或者美团等,就是运营联合搞活动。


产品像做好菜再端出来,运营就行下火锅,制定策略,执行,优化。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210407204338415.png#pic_center =500x)基于目标,协调资源,制定策略,并持续完成执行的工作循环。

3. 几种常听到的运营岗位

  • 用户运营:针对用户拉新、留存,制定策略。

  • 平台运营:针对平台的指标优化,GMV,客单价,一般会做跟用户相关的策略等。很像美联储、央行运用宏观的手段,达成目标。

  • 产品运营:深入地影响产品的特性。

  • 内容运营:买内容,写内容,发内容,传播内容。

  • 社群社区运营:社群社区用户活跃。

  • 新媒体运营:转发抽奖,增加粉丝量,阅读量。

  • 活动运营:抽奖、发优惠券、周年庆等。

  • 运营推广:通过数据手段做推广,比如快手要求运营会 SQL。做自媒体的广告,搜索引擎的广告投放。

  • 渠道运营:管渠道,比如线下推广,电梯广告推广,流媒体平台的推广。

  • 店铺运营:订单管理,发货,上新,活动等。

3.1 用户运营

  • 目标:拉新、促活、留存、传播、收入。

  • 常见的运营手段:☞ 给用户分出不同的类。给用户打标签。☞ 跟用户接触上并有效地传递一些信息给用户☞ 引导用户知道一些事情☞ 或跟用户做一些【交易】,让用户行动☞ 看看效果,调整策略,继续跟用户【沟通】。


用户分布:


  • 知道用户什么习性

  • 能跟用户说上话

  • 说的话用户能听进去

  • 听进去了能行动

  • 以上过程能持续

3.2 社区运营

  • 目标:更多关系、更多内容、更强吸引力。社区跟人数成正比,跟人数的关系的平方成正比。

  • 常见的运营手段(以内容为例)☞ 设置排行榜,奖励发内容的☞ 定点邀请发内容☞ 内容的推荐引导,内容加精华,加分。☞ 建立例行内容机制☞ 自己硬发

4. 产品经理与运营的关系与配合

  • 生孩子 & 养孩子。

  • 紧贴运营,用运营的直觉触感进行产品迭代的尺子。春江水暖鸭先知,产品好与不好,客服和运营知道比较早。客户会投诉,运营比如发优惠券转换很高,那么可以推新用户立减。

  • 将运营规则产品化,而不是只做产品 & 运营工具。

5. 运营工作给产品工作的启发

  • 用运营的思路做产品:比如微信

  • 不断尝试和细微修正迭代的小循环 & 基于整体目标、策略和资源的大循环。

  • 有高视角,也有低视角,仰手接飞猱(nao),俯身散马蹄。

  • 以【活】的目标和姿态去【生】,从动态运转的角度反思静态设计。

  • 设计和开发的不是一个架子(空中楼阁),而是一个能够流动的体系。

  • 细节的雕琢能力、文案能力、极强的执行力。


发布于: 2021 年 04 月 11 日阅读数: 43
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
AI数据科学认证-2021年的最佳选择 John 易筋 ARTS 打卡 Week 44