首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

再谈“炼金术”:可以使用不严谨的方法,但拒绝不严谨的评估方法

不同的创新模型 我们可以将机器学习的知识看成是一张图,在这张图中,各种方法用节点表示,而线条代表着方法间的联系和类比。 创新意味着在这张图上画上新的内容,这里有很多画法—— 1....我们在图中添加了新节点,它可能与图的其余部分连接关系很弱,最初大多数人可能不太清楚你的逻辑和推理。 2....每一种创新模式在构建知识和进步的过程中都至关重要的。...可以使用不严谨的方法 但不能使用不严谨的评估方法 就我而言,我也习惯了使用不严谨的方法,或者理论框架不完善或不存在的方法。但是, 任何人都不应该对那些评价体系不严谨的论文感到满意。...我反对这种说法,如果一个方法可行,但可行的原因是错误的,或者和作者给出的原因不一样,我们就遇到了一个问题。 你可以把“在数据集上做一个深度学习方法”当成统计测试来看,我会认为这种方法的统计功效不足。

50250

Stack Overflow上59万浏览量的提问:为什么会发生ArrayIndexOutOfBoundsException?

因为数组 names 的长度为 4,但下标的起始位置为 0,而不是 1,导致 names[4] 的时候越界了。这个问题的修正方法蛮简单的,就是把 编号的(我不确定有没有从 1 开始的编程语言),这和我们平常生活中从 1 开始编号的习惯不同。...为了摆脱 ArrayIndexOutOfBoundsException 的困扰,除了 i 一种更值得推荐的做法——使用增强的 for 循环,当我们确定不需要使用下标的时候...如果使用的是 JDK8 以上的版本,我们还可以这样遍历数组(不使用下标)。 第一种:使用 List.forEach。...Stream.of(names).forEach(System.out::println); 如果需要对数组执行其他操作,比如说过滤等操作,可以将数组转换为“流”。

63830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JDK1.9-数据结构

    当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。...写程序这件事, 和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能 造车。...就像是一排出 租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。...简单的说,采用该结构的集合,对元素的存取有如下的特点: 多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次 类推,这样多个人就连在一起了。 ?...查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素 增删元素快: 增加元素:只需要修改连接下个元素的地址即可。 ? 删除元素:只需要修改连接下个元素的地址即可。 ?

    38030

    数据结构之并查集

    我们可以使用数组来表示并查集中的数据,数组中存放每个元素所在的集合编号,例如 0 和 1。...而数组的索引则作为每个元素的 id,这样我们在查询的时候,只需要根据数组索引取出相应的两个元素的集合编号,判断是否相等就能得知这两个集合是否存储在同一集合中,也就知道这两个元素是否可以“连接”。...那么根据数组索引找到的元素编号都为 1,此时就可以判断出这两个元素属于同一集合,也就代表这两个元素之间可以“连接”,反之同理。...但这只是一个基础的实现,仍有许多优化空间。本小节就演示一下其中一种优化方法:基于size的优化。...那么有没有办法将一棵树压缩到高度只有 2 呢?如同下图这样: ? 答案是有的,我们可以使用递归的方式,将树的高度压缩为 2 。

    1K20

    数据结构-散列表(上)

    散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 我用一个例子来解释一下。假如我们有 89 名选手参加学校运动会。...这 89 名选手的编号依次是 1 到 89。现在我们希望编程实现这样一个功能,通过编号快速找到对应的选手信息。你会怎么做呢? 我们可以把这 89 名选手的信息放在数组里。...因为参赛编号跟数组下标一一对应,当我们需要查询参赛编号为 x 的选手的时候,我们只需要将下标为 x 的数组元素取出来就可以了,时间复杂度就是 O(1)。这样按照编号查找选手信息,效率是不是很高?...我们把参赛编号转化为数组下标的映射方法就叫作散列函数(或“Hash 函数”“哈希函数”),而散列函数计算得到的值就叫作散列值(或“Hash 值”“哈希值”)。...如果 K 不是很大,可以使用桶排序,时间复杂度 O(N)。如果 K 非常大(比如大于 10 万),就使用快速排序,复杂度 O(NlogN)。

    87720

    一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了

    不过,作为一个有着几十场面试经验的 xxx,我决定假装用最土的方法入手,等面试官问我还有没有其他方法时,我在一步步用更加牛逼的方法。 所以,第一种方法就是数组。...方法是这样的: 用一个数组来存放 1,2,3 … n 这 n 个编号,如图(这里我们假设n = 6, m = 3) 然后不停着遍历数组,对于被选中的编号,我们就做一个标记,例如编号 arr[2]...但是,这种方法也不是一无是处,怎么说也体现了咱们的思维严谨,毕竟临界条件这么多,我都能做对,嘿嘿。 感兴趣的可以动手写一下代码,用这种数组的方式做,千万不要觉得很简单,编码这个过程还是挺考验人的。...当然,上面数组的方法你也可以采用移除的方式,不过数组移除的时间复杂度为 O(n)。...和第一种方便相比,时间复杂度和空间复杂度都差不多,不过采用链表比较不容易出错。 面试官:还有更好的方法吗? 我:卧槽,链表这么好的方法还问我有没有更好的?好家伙,嫌弃代码太长没耐心看?

    38530

    如何设计一个搜索引擎

    指从用户特定的信息需求出发,对特定的信息集合采用一定的方法、技术手段,根据一定的线索与规则从中找出相关信息。...注意:断电并不会影响磁盘表面的磁性材料的极性,因此断电后数据仍然不会消失,但剧烈的碰撞或加热则有可能导致数据丢失。...3.插入慢:无序数组末尾插入快,其余情况需要维护数组地址连续效率都是比较差。 4.查找:支持下标随机查找快,有序数组也可以用诸如二分法加快查找速度。 5.删除慢:和插入类似,除了末尾插入快。...⑤、并发队列 典型应用: ①、线程池 ②、数据库连接池 对于大部分资源有限的场景,当没有空闲资源时,基本上都可以通过“队列”这种数据结构来实现请求排队。...那么有没有一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 树 诞生了。

    2.5K10

    Redis-面试

    原理上,其采用了利用epoll的多路复用特性,因此可以采用单线程处理其网络请求。 Redis数据类型 String:字符串类型,最简单的类型 Hash:类似于Map的一种结构。 List:有序列表。...简述缓存穿透的解决方法 在数据库操作访问前进行校验,对不合法请求直接返回。 对于经常被访问的,并且数据库没有的键,缓存层记录键=null。 简述缓存击穿 缓存击穿指缓存中没有数据,但数据库中有该数据。...但该批数据查询数据量巨大,查询全部走数据库,造成数据库压力过大。 简述缓存雪崩的解决方法 缓存数据设置随机过期时间,防止同一时间大量数据过期。 设置热点数据永远不过期。...可以通过手动命令,也可以设置自动触发。 RDB:将服务器包含的所有数据库数据以二进制文件的形式保存到硬 盘里面。 有两种形式生成RDB文件,一种是SAVE 命令 一种是BGSAVE命令。...其具体过程为: 判断此时有没有子进程用于RDB,有的话直接返回。 redis进行fork子进程过程,此时父进程处于阻塞状态。

    30530

    灵魂拷问:Java 的 substring() 是如何工作的?

    另外,我想要告诉大家的是,研究的过程非常的有趣,就好像在迷宫里探宝一样,起初有些不知所措,但经过一番用心的摸索后,不但会找到宝藏,还会有一种茅塞顿开的感觉,非常棒。...Java 的下标都是从 0 开始编号的(我不确定有没有从 1 开始的编程语言),这和我们平常生活中从 1 开始编号的习惯不同。...调用 substring() 的时候虽然创建了新的字符串,但字符串的值仍然指向的是内存中的同一个数组,如下图所示。 ?...由于这一小段字符串引用了整个很长很长的字符数组,就导致很长很长的这个字符数组无法被回收,内存一直被占用着,就有可能引发内存泄露。 PS:内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存。...04、最后 总结一下,JDK 7 和 JDK 6 的 substring() 方法本身并没有多大的改变,但 String 类的构造函数有了很大的区别,JDK 7 会重新复制一份字符数组,而 JDK 6

    1.2K10

    一种O(n)的排序——计数排序引发的围观风波

    pigpian一脸无奈得走出教室,接着老师问道有没有其他人写出来,慢慢得挪到doudou得旁边。...当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序) 对于额外数组该如何理解呢...但如果每个桶中只有一种元素,那么这个桶就可以不需要使用集合去储存标记,而是用一个数字即可进行标记认为它出现了多少次。 ?...所以这种每个桶只能放一种元素的,我们不需要每个桶再用List集合去装,而用数组的值储存对应编号出现的词数即可,例如上述的a[1]=2表示其中的1号桶出现两次,而a[3]=0表示元素3没有出现过。...然后创建这个区间大小的数组,从min的位置开始计数,这样就可以最大程度的压缩空间,提高空间的使用效率。 ?

    32320

    数据结构与算法系列之散列表(一)(GO)

    ,所以散列表其实就是数组的一种扩展,由数组演化而来。...现在如果要实现通过编号来找到具体的学生 可以把这1000个学生的信息放在数组里。编号为1的学生,放到数组中下标为1的位置;编号为2的学生,放到数组中下标为2的位置。...尽管不能直接把编号作为数组下标,但可以截取编号的后四位作为数组下标,来存取学生信息数据。...当通过编号查询学生信息的时候,用同样的方法,取编号的后四位,作为数组下标,来读取数组中的数据 这就是典型的散列思想。其中,学生的编号叫作键(key)或者关键字。用它来标识一个学生。...如果 K 非常大(比如大于10万),就使用快速排序,复杂度O(NlogN) 由于文章篇幅的原因,代码实现,我放在了github上,需要的可以自取(GO实现) 有两个字符串数组,每个数组大约有10万条字符串

    1.1K20

    4.线性表之数组

    数组几乎都是从 0 开始编号的,有没有想过 「为啥数组从 0 开始编号,而不是从 1 开始呢?」 使用 1 不是更符合人类的思维么?...数组简介 「数组是一种线性表数据结构,用一组连续的内存空间来存储一组具有相同类型的数据。」 里面出现了几个重要关键字,线性表、连续内存空间和相同类型数据,这里解释下每个关键词的含义。...低效的插入和删除 有利有弊,这个限制也导致数组的删除、插入这种操作变得低效,为了保证内存连续性,就需要做数据移动工作。 那有没有什么改进方式呢?...知识拓展&总结 数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n)。...在平时的业务开发中,我们可以直接使用编程语言提供的容器类,但是,如果是特别底层的开发,直接使用数组可能会更合适。

    37640

    全面了解数据库设计中分类算法

    由于在网站建设中我们大量使用数据库,所以我们将从Tree在数据库中的存储谈起。 为简化问题,我们假设每个节点只需要保留Name这一个信息。我们需要为每个节点编号。编号的方法有很多种。...我们下面来介绍一种算法,效率将是上面算法的10倍以上。 分类编码算法 问题就出在前面我们采用了顺序编码,这是一种最简单的编码方法。大家知道,简单并不意味着效率。实际上,编码科学是程序员必修的课程。...下面,我们通过设计一种编码算法,使分类的编号ID中同时包含了其父类的信息。一个五级分类的例子如下: 此例中,用32(4+7+7+7+7)位整数来编码,其中,第一级分类有4位,可以表达16种分类。...程序如下: 连接,已经打开REM OldFather---原来的父类编号REM NewFather---新的父类编号REM N---编码总位数REM Ni--每一级的编码位数数组...当然,有了特征码,我们还可以得到更加有效率的算法。我们知道,虽然我们采用了位编 码,实际上还是一种顺序编码的方法。表现出第I级的分类编码肯定比第I+1级分类的编码要小。

    1K40

    大型电商平台如何抗住亿级流量之布隆过滤器

    预防缓存穿透“神器”:布隆过滤器 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况。其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在。...而这个二进制数组会被存储在 Redis 服务器中,那么这个数组该怎么用呢? 1.若干次 Hash 来确定其位置 刚才我们提到作为当前的商城,假设有 1000 个商品编号,从 1~1000。...当把布隆过滤器初始化以后,我们便可以通过 add 方法,往里边去添加数据。所谓添加数据,就是将数据进行多次 Hash,将对应位从 0 变为 1 的过程。...例如,现在我们把编号 1 增加进去,之后可以通过布隆过滤器的 contains 方法来判断当前这个数据是否存在。 我们输入 1,它输出 true;而输入了不存在的 8888,则输出 false。...这样下一次用户在查询相同编号数据时,就可以直接读取缓存了。 另外一种情况是,如果布隆过滤器判断没有包含编号,则直接返回数据不存在的消息提示,这样便可以在 Redis 层面将请求进行拦截。

    15910

    线性表,双向链表,静态链表,循环链表(约瑟夫环)

    通过观察图 1 中数据的存储状态,我们可以发现,顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。...静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。...使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。...备用链表的作用是回收数组中未使用或之前使用过(目前未使用)的存储空间,留待后期使用。也就是说,静态链表使用数组申请的物理空间中,存有两个链表,一条连接数据,另一条连接数组中未使用的空间。...例如,使用静态链表存储 {1,2,3},假设使用长度为 6 的数组 a,则存储状态可能如图 3 所示: 图 3 备用链表和数据链表 图 3 中,备用链表上连接的依次是 a[0]、a[2] 和 a

    9110

    桶排序(Bucket Sort)的数组实现

    桶排序的数组实现 桶排序Bucket Sort从1956年就开始被使用,该算法的基本思想是由E. J. Issac R. C. Singleton提出来。...桶排序(Bucket Sort)是迄今为止最快的一种排序法,其时间复杂度仅为Ο(n),也就是线性复杂度!不可思议吧?...举个例子: 某一年的全国高考考生人数为500万,数学一科分数使用标准分,最低0,最高150,没有小数,你把这500万元素的数组排个序。...一共有150-0+1=151,那么多种,想想看,有没有什么“投机取巧”的办法?...方法就是创建151个“桶”,从头到尾遍历一次数组,对不同的分数给不同的“桶”加料,比如有个考生考了140分,那么就给140分的那个桶(下标为140-100)加1,完成后遍历一下这个桶数组,按照桶值,填充原数组

    98630

    STM32核心板焊接

    电烙铁的正确使用方法   电烙铁在使用之前先接上电源,数分钟后待烙铁头温度升至焊锡熔点时,蘸上助焊剂(松香),然后用烙铁头刃面接触焊锡丝,使烙铁头上均匀地镀上一层锡(亮亮的薄薄的就可以)。...焊锡   焊接焊锡是在焊接线路中连接电子元器件的重要工业原材料,是一种熔点较低的焊料,主要指用锡基合金做的焊料。根据焊锡中间是否含有松香,将焊锡分为实芯焊锡和松香芯焊锡。...吸锡带   引脚密集的贴片元件在焊接的过程中,很容易造成焊锡过多导致引脚短路的现象,使用吸锡带就可以“吸走”多余的焊锡。   ...吸锡带使用方法很简单:用剪刀剪下一小段吸锡带,用电烙铁加热使其表面蘸些松香,然后用镊子夹住放在焊盘上,再用电烙铁压在吸锡带上,当吸锡带变为银白色时即表明焊锡被“吸走”了。...STM32核心板物料   STM32核心板焊接步骤   焊接第一步   焊接的元件编号:U1   焊接说明:拿到空的STM32核心板后,首先要使用万用表测试5V、3.3V和GND三个网络有没有相互之间短接

    1.1K30

    【Java】21 基于 UDP 的网络编程

    UDP 协议从问世至今已经被使用了很多年,虽然 UDP 协议目前应用不如 TCP 协议广泛,但 UDP 协议依然是一个非常实用和可行的网络传输层协议。...UDP 协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。...至于对方是否可以接收到这些数据内容,UDP 协议无法控制,因此说 UDP 协议是一种不可靠的协议。UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。...) ③ 调用 send() 方法发送(发送集装箱) ④ 释放资源(拆码头) 接收端 ① 创建 DatagramSocket 对象并指定端口号(创建一个码头并编号) ② 创建 DatagramPacket...= null) { socket.close(); } } } } 从上述代码可以看出使用 UDP 协议时,实际上并没有明显的服务端和客户端

    66120

    启蒙篇-立志做PLC圈子里的IT大拿 | 利用VB编写程序读取PLC数据

    当然这个程序可以使用VB、C#、C++等高级语言编写。...其实在工控领域,很多软件支持VBA和VBS脚本,这两种语言都跟VB有很大关系,VB也算是一种上了年纪的编程语言了,微软目前也已经停止了对它的更新,但这不妨碍VB在工程领域内的应用。...跟前面一样,我们依然使用ADODB这种方式在vb内与数据库建立连接,此次我们使用ODBC的替代者和继承者OLEDB来作为统一的数据库连接工具。...在Logix5000里面新建变量数组,创建泵站编号命名的数组,使用DINT数据类型,我们先创建50个元素的数组,每个数组的具体内容定义在在Logix5000的程序内完成,创建数组的目的也是在编程读取的时候方便做循环语句...2)编写子程序,从数据库获取泵站编号及数据起始地址,定义几个全局的数组 3) 编写子程序,利用从数据库读取的数据地址和数据长度,自动从PLC内读取数据 4)主程序调用子函数 5)测试一下,使用msgbox

    1.7K50

    【Java】基础24:数据的存与取

    一、堆栈和队列 其实关于这两种数据结构,用中国的一个成语推陈出新就可以理解,这里面还牵扯到了一个小故事。 《九章算术》中记载:韩信投靠刘邦后,被派去管理杂乱无章的粮仓,但很快韩信就把新谷、陈粮分开。...二、数组 数组是有序的元素序列,它会在内存中开辟一段连续的空间,并在此空间存放元素,数据结构如下图: ①数组中的元素地址是连续的 ②查询快(有索引) 通过索引,可以快速访问指定位置的元素,就像是一排出租屋...,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。...即每个结点不超过2的有序树: 其中查找树又是一种特殊的二叉树,遵循左小右大的原则,这样我们在查找数据时会更加的快: 比如我们要查找数字5,先查到的一个数字是2,这个时候左小右大,我们只需要往右边查就可以了...用现实生活中的例子来理解它们之间的区别: 数组就好比一个理科强的学生:他数学100分,但英语只能考50分。 链表就好比一个文科强的学生:她英语100分,但数学只能考60分。

    43610
    领券