本系列是《玩转机器学习教程》一个整理的视频笔记。 这个例子告诉我们两件事情: dJ_dubug这种求梯度的方法是可以的,最终能够得到正确的结果; 当我们使用dJ_dubug的时候最终训练的速度会慢很多; 所以如果机器学习算法涉及到梯度的求法的时候,我们完全可以通过这种调试梯度的方式来验证我们推导梯度计算的数学解是否正确 : 先使用dJ_dubug这个函数作为梯度的求法,通过这个方式先得到机器学习算法正确的结果; 然后推导公式求出来这个梯度计算相应的数学解; 之后将我们实现的数学解代入机器学习算法中,可以通过最终得到的结果和使用 dJ_dubug,不像dJ_math只适用于当前任务中对应的损失函数J,这是因为dJ_math是基于当前的损失函数J进行推导才可以得到的,正因为如此这个dJ_dubug方式来求梯度的方法完全可以加入自己的机器学习工具箱中供以后自己调试梯度的时候使用
本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 要求函数返回给定二叉树BT的高度值。 裁判测试程序样例: #include <stdio.h> #inclu
从git检出源码后,源码目录结构: ● broker: broker 模块(broke 启动进程) ● client :消息客户端,包含消息生产者、消息消费者相关类 ● common :公共包 ● dev Netty ● srcutil:服务工具类 ● store:消息存储实现相关类 ● style:checkstyle相关实现 ● test:测试相关类 ● tools:工具类,监控命令相关实现类 将源码导入到 idea后,执行下面命令: clean install -Dmaven.test.skip =true 源码调试: 需求:我们基于源码来实现一个消息发送和消息消费。 在进行源码调试之前,先在源码工程创建conf配置文件夹,配置信息从distribution拷贝brokrer.conf和logback_broker.xml及logback_namesrv.xml这三个文件到 启动nameServer源码: 启动broker 消息消费
采用线程池和阻塞队列实现生产/消费者模型。其中LinkedBlockingQueue是阻塞队列,同时线程安全,其特点:
或者它是怎么做的,我们看看源码的根本想法就是获得一点感悟,这些感悟不仅仅对工作有好处,往远的说还或许影响我们看待事物的角度,久而久之会形成我们的价值观。 ? 从源码中我们看到pagehelper主要有几个包和一些类组成,按照分门别类的思想,那么每个包都对应一个相同的点,而最底下的类应该就是一些功能聚合类。
ArrayList是一种以数组实现的列表,而数组的优势在于有角标,因此查询的速度较快,是一种可以动态扩容的数组。我们着重了解添加、获取、替换、删除操作。
经过前两次的HashMap和HashTable的学习,我们准备将HashSet也进行学习一下,本着之间差异不是特别大的前提。但是实际上是这样吗? 带着这样的疑问我们学习一下HashSet的源码吧。 ? 从源码的结构来看,HashSet真的没有多少代码。但是我们发现其中有一个Map,莫非HashSet是从Map演变而来?
之前我们通过Thread和ThreadPoolExecutor的学习知道实现runnable接口测试任务的核心。而ThreadPoolExecutor则是线程的执行容器,用来管理线程的。 那么我们就详细学习一下ExecutorCompletionService类的实现机理吧! ? 我们看到ExecutorCompletionService代码量不多,其中的submit肯定是提交任务的。 我们还是按照类的初始化和基本调用方法的步骤来学习其实现过程吧。 //这里的参数是Executor,也就是线程池,因为此类是一个调度器。 好了源码就分析到这里。
removeNode(hash(key),key,null,false, get操作 return (e = getNode(hash(key), key)) 从里面可以收获到的一些结论: HashMap的源码较多 给定初始化容量时,给定元素个数/加载因子为最佳初始化容量,可以在源码找到这个代码。
而我们之前学习延迟队列的时候我们就知道延迟队列是通过实现Delayed接口生成时间戳,然后延迟队列获取消息的时候总是获取的到期时间的消息。 而这里使用的延迟队列也不是我们之前学习的DelayQueue,而是自定义的延迟队列。而其中的内部类也正是延迟队列的定义。 我们还是来看看源码吧. public RunnableScheduledFuture<? 通过源码我们发现有很多方法也是直接用用的父类。 在submit方法里 public Future<?
在学习并发线程池的时候,我们基本都已经学习了一下常见的线程。但是我们发现Executors这样一个类的存在。那么这个类是干什么的? 那么我们来学习一个Executors究竟是何方圣神吧。 ? 从结构图上看出这个类有一些内部类,显然内部类都是定制的。除此之外此类提供了一些创建线程池的工具类。所以看的出来这块的功能还是类似工具类。
在阅读源码的时候发现了一个类StringJoiner,因为之前也没用过。感觉应该是字符串拼接的工具类。 ? 看到其中有几个变量。主要是前后缀和空字符串等。
HashMap源码学习 关系图 属性 //默认初始容量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //最大容量 static
LinkedList源码学习 被transient修饰的first和last如何序列化呢 LinkedList中重写列writeObject方法,ObjectOutputStream中将调用ObjectStreamClass x = next; } first = last = null; size = 0; modCount++; } 全部源码
Michigan大学的一位老师Paul N. Edwards写了一篇学术文章《How to Read a Book》,当前已经更新到v5.0版本,个人感觉好过另外一本非常著名的、厚厚的同名书《如何阅读一本书》,英文版原文并不难,链接地址(微信中不让加链接,点击无效,自行下载阅读): http://pne.people.si.umich.edu/PDF/howtoread.pdf 该书的重要观点: 小说需要按顺序读,但对于非虚构类的书不需要从头到尾按顺序去阅读,而是要跳读、略读、标记,对重点的地方还要仔细地
昨天听完同学来我们团队做的分享之后,自己又去看了一遍源码,结合自己之前项目的一些理解,写一篇博客,这里是原文链接. 在看源码前,结合之前的自己的项目实践,有以下几个问题: 1.在mutation以外比如vue组件中修改数据,会报错,是怎么做到的 2.我们在一个组件中拿数据的时候要从mapGetters里面映射过来,为什么要存在这个 接下来针对上面的问题,结合源码做一下解答: 我们在一个项目中引入vuex是下面的这样一个注入: Vue.use(Vuex) export default new Vuex.Store({ modules 但其实看完源码后发现这层getters是必不可少的,为什么呢? vuex的源码非常简洁,里面并没有做和vue同样的事情,其实他正是通过了getter方法,与vue的watch相挂钩,才实现了vuex的双向绑定,来看源码中的如下代码 watch (getter,
在之前学习HashMap的时候,我们知道在JDK8中HashMap是采用Node数组+链表+红黑树的方式实现的。那么HashTable又是怎样的? 字面上看应该还是利用的Hash表来处理的。 那么我们基于这样一点知识来学习一下HashTable的设计和实现过程。 ? 从结构上看,HashTable的结构也没有HashMap那么复杂。所以实现起来应该还是比较简单吧。
首先回答一个问题?线程的三大特性?什么时候我们需要锁?java中已经提供了synchronized,为什么还要使用ReentrantLock?AQS原理。 线程的三大特性:原子性、可见性、
HashSet源码学习 UML图(没实现SortedSet,无序的) 属性 static final long serialVersionUID = -5024744406713321676L; /*
ConcurrentHashMap源码学习 首先思考一下: 既然有了HashMap为什么还会出现ConcurrentHashMap?同时ConcurrentHashMap具有什么优势? key.equals(ek)))) return e.val; } } return null; } ConcurrentHashMap的源码写得是非常好的 ,里面有很多东西值得学习!