微石的碎碎念

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 仓库

nowcoder错题查缺补漏

发表于 2018-06-04 | 更新于 2018-07-24 | 评论数:

此博客用来总结牛客网刷题过程中一些错题,特别是一些自己没有搞懂的、模糊的知识点。会尽量按照知识点来分类。

const

NO.1

1
2
3
4
5
6
7
8
9
10
11
12
//以下程序输出是____。
#include <iostream>
using namespace std;
int main(void)
{
const int a = 10;
int * p = (int *)(&a);
*p = 20;
cout<<"a = "<<a<<", *p = "<<*p<<endl;
return 0;
}
//答案:a = 10, *p = 20

在C++中,a作用域下在C++中所有的常量a在预编译阶段就已经做了类似于宏替换的工作,所以输出的是它的常量值,尽管a所对应的内存地址上的值已经发生改变,但还是输出常量值。

机器学习模型之BP神经网络

发表于 2018-05-31 | 更新于 2018-07-21 | 评论数:

训练神经网络的步骤

训练神经网络:

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的$h _ {\theta}(y)$
  3. 编写计算代价函数 $J$ 的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数

简单来说即是:正向传播信号,反向传播误差。通过正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的$h _ {\theta}(y)$。现在,为了计算代价函数的偏导数$\frac{\partial}{\partial\Theta^{(l)} _ {ij}}J\left(\Theta\right)$,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。

阅读全文 »

leetcode之两个排序数组的中位数 Median of Two Sorted Arrays

发表于 2018-05-30 | 更新于 2018-07-19 | 评论数:

感觉这题比较经典,之前自己用4个指针指来指去,把自己都绕晕了,现在发现2个指针就行。找数组中位数,相当于找第k个元素,k=(nums1.size()+nums2.size())/2。

4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5
阅读全文 »

C++模板简介

发表于 2018-05-30 | 更新于 2018-07-19 | 评论数:

本文转载自鸡啄米,有关模板类的更多特性,可参考C++类模板,你看我就够了

代码复用是面向对象设计中的重要的软件开发思想,对于软件开发效率很是关键。怎样做好代码复用呢?越是通用的代码越好复用,将类型作为参数,这种程序设计类型就是参数化程序设计。模板就是C++进行参数化设计的工具。利用模板我们可以使用同一段程序处理不同类型的对象。

什么是类模板呢?类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型。

阅读全文 »

C++纯虚函数

发表于 2018-05-29 | 更新于 2018-07-19 | 评论数:

本文转载自鸡啄米并略有改动。

抽象类

抽象类可以为某个类族提供统一的操作接口。外部可以透明的使用抽象类的统一接口,而不需要知道到底是调用的抽象类的哪个派生类的成员函数。其实这些也可以通过在基类中定义虚函数来实现,但抽象类跟一般类不同的是,它使用纯虚函数,不需要定义纯虚函数的实现,而且抽象类不能实例化,即不能定义抽象类的对象,只能从它继承出非抽象派生类再实例化。

抽象类的定义

抽象类的定义就是,含有纯虚函数的类。纯虚函数跟一般的虚函数有很大不同。我们下面来了解下纯虚函数。

纯虚函数

即使有的虚函数在基类中不需要做任何工作,我们也要写出一个空的函数体,这时这个函数体没有什么意义,重要的是此虚函数的原型声明。C++为我们提供了纯虚函数,让我们在这种情况下不用写函数实现,只给出函数原型作为整个类族的统一接口就可以了,函数的实现可以在派生类中给出。

纯虚函数是在基类中声明的,声明形式为:

virtual 函数类型 函数名(参数表) = 0;

大家可以看到,纯虚函数的声明形式与一般虚函数类似,只是最后加了个“=0”。纯虚函数这样声明以后,在基类中就不再给出它的实现了,各个派生类可以根据自己的功能需要定义其实现。

阅读全文 »

机器学习模型之决策树

发表于 2018-05-29 | 更新于 2018-07-21 | 评论数:

以下博客是我在学习过程中发现的比较好的博客,可以参考:机器学习算法实践-决策树(Decision Tree)、July_sun的博客、HerosOfEarth的博客、天泽28的专栏

decision tree 基本结构

借用西瓜书中西瓜问题的一棵决策树,观察可知,决策树主要由若干节点(包括根节点、叶节点、内部节点等)组成。每个内部节点都表示某个属性,叶子节点表示判别结果。

决策树的构建

节点划分

一棵决策树包含许多节点,可以通过递归方式产生新节点。递归终止条件为:

  1. 当前节点包含样本全部为同一类别,无需划分新节点
  2. 当前属性集为空或所有样本在所有属性上取值相同,无法划分
  3. 当前节点包含样本集为空。
阅读全文 »

机器学习之正则化

发表于 2018-05-29 | 更新于 2018-07-19 | 评论数:

正则化的作用

可参考博客强烈推荐:zouxy09的专栏、阿拉丁吃米粉、迷雾forest

阅读全文 »

C++基类派生类与指针

发表于 2018-05-26 | 更新于 2018-07-19 | 评论数:

类的指针总结

  1. 基类指针可以指向派生类对象,那么经由该指针只能访问基础类定义的函数(静态联翩)
  2. 派生类指针指向基类必须经过强制类型转换

    1
    2
    //eg.
    B *aa=(B*)new A();//(子类指针指向父类对象地址必须强转才行)
  3. 如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。

原理

转载自https://www.cnblogs.com/rednodel/p/4122781.html

简单来说,C++的多态就是靠父类指针指向子类对象+虚函数来实现的。父类指针指向子类对象,可以调用子类从父类继承来的那一部分,但如果父类中声明了virtual,则可以调用子类中的方法,这样就实现了多态。而子类指针指向父类对象,可能会调用到父类中没用的方法,因此这是不对的。
至于两类指针的互换是另一个问题。

阅读全文 »

C++ 重载、重写、隐藏

发表于 2018-05-24 | 更新于 2018-08-15 | 评论数:

本文转载自 http://www.jb51.net/article/63462.htm 、https://blog.csdn.net/ycl295644/article/details/45539193 ,更多资料可参考 https://blog.csdn.net/zx3517288/article/details/48976097

一、重载(overload)

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

  1. 相同的范围(在同一个作用域中) ;
  2. 函数名字相同;
  3. 参数不同;
  4. virtual 关键字可有可无。
  5. 返回值可以不同;

二、重写(也称为覆盖 override)

是指派生类重新定义基类的虚函数,特征是:

  1. 不在同一个作用域(分别位于派生类与基类) ;
  2. 函数名字相同;
  3. 参数相同;
  4. 基类函数必须有 virtual 关键字,不能有 static 。
  5. 返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…
  6. 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
阅读全文 »

C++中static的用法详解

发表于 2018-05-24 | 更新于 2018-08-15 | 评论数:

本文转载自 https://blog.csdn.net/majianfei1023/article/details/45290467

C 语言的 static 关键字有三种(具体来说是两种)用途:

静态局部变量:

用于函数体内部修饰变量,这种变量的生存期长于该函数。

1
2
3
4
5
6
int foo(){
static int i = 1; // note:1
//int i = 1; // note:2
i += 1;
return i;
}

要明白这个用法,我们首先要了解c/c++的内存分布,以及static所在的区间。

对于一个完整的程序,在内存中的分布情况如下图: 
1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。
3.堆区:程序员分配并释放的区域,像malloc(c),new(c++)
3.全局数据区(静态区):全局变量和静态便令的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
4.代码区

阅读全文 »
1…4567
微石

微石

吾本逍遥

65 日志
28 标签
GitHub E-Mail
© 2018 微石
由 Hexo 强力驱动 v3.3.9
|
主题 — NexT.Gemini v6.2.0