精华内容
下载资源
问答
  • 唯一需要解释的是下面几行 [javascript] var w = labelText.getWidth()*1.1;  var h = labelText.size*1.5; labelText.width = w; labelText.setWordWrap(true,h);  var w = labelText...
    面唯一需要解释的是下面几行
    

    [javascript] var w = labelText.getWidth()*1.1;  
    1. var h = labelText.size*1.5;  
    2. labelText.width = w;  
    3. labelText.setWordWrap(true,h);  
    var w = labelText.getWidth()*1.1;
    var h = labelText.size*1.5;
    labelText.width = w;
    labelText.setWordWrap(true,h);
    其实只需要用getWidth()和getHeight()就能获取文本的高和宽,但是因为canvas中没有获取文本高度的函数,所以引擎中用了一个不太准确的方式来获取(当然,这一点在引擎下次更新中会得到完美的解决),本次开发,所使用的文本高度和宽度都必须不小于文本的原始大小,所以,我给文本重新设定了一下略大的高度和宽度。
    接下来,我们利用LBitmapData对象的draw函数,把这个文本转换为LBitmapData对象,为什么要转换成LBitmapData对象?请接着往下看,一会儿就知道了。

    [javascript]bitmapData = new LBitmapData("#000000",0,0,LGlobal.width,LGlobal.height,LBitmapData.DATA_CANVAS);  
    1. bitmapData.draw(backLayer);  
    bitmapData = new LBitmapData("#000000",0,0,LGlobal.width,LGlobal.height,LBitmapData.DATA_CANVAS);
    bitmapData.draw(backLayer);
    上面的处理其实都是铺垫,不是用来真正显示的,下面再来创建一个LBitmapData空对象,并通过LBitmap将其绘制到canvas画布上
    展开全文
  • 分库分表与分布式全局唯一ID一、为什么要分库分表?二、垂直拆分2.1 垂直分库2.2 垂直分表三、水平拆分3.1 水平分库3.2 水平分表四、什么是分布式全局唯一性ID?五、分布式ID生成方案5.1 UUID5.2 数据库自增ID5.3 ...

    一、为什么要分库分表?

    如果单表的数据量达到1000w+后,会极大影响 sql 执行的性能,即使添加或优化索引,做很多操作时性能仍下降严重。

    如果单库中存放了很多表,如:会员表、订单表、商品表等,那么这个数据库极大可能由于高并发造成瘫痪,并且数据维护也不方便。

    分库分表前面临的问题 解决办法
    用户请求量太大 分散请求到多个服务器上
    单库太大 切分成更多更小的库
    单表太大,造成CRUD慢 切分成多个数据集更小的表

    在这里插入图片描述
    一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。

    二、垂直拆分

    2.1 垂直分库

    垂直分库指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用
    在这里插入图片描述

    2.2 垂直分表

    垂直分表指将一个表按照字段分成多表,每个表存储其中一部分字段,它带来的提升是:

    • 为了避免IO争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响
    • 充分发挥热门数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累
      在这里插入图片描述

    三、水平拆分

    3.1 水平分库

    水平分库指将一个数据库中的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上,它带来的提升是:

    • 解决了单库大数据,高并发的性能瓶颈
    • 提高了系统的稳定性及可用性
      在这里插入图片描述

    3.2 水平分表

    水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,它带来的提升是:

    • 优化单一表数据量过大而产生的性能问题
    • 提高了系统稳定性和负载能力
      在这里插入图片描述

    四、分库分表后带来的问题

    • 主键 id 唯一性
    • 分布式事务问题:在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难
    • 跨库跨表的 join 问题:在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表

    五、什么是分布式全局唯一性ID?

    随着数据日渐增长,就需要对数据库进行分库分表,但分库分表后需要有一个全局唯一ID来标识一条数据,数据库的自增ID显然不能满足需求。

    有兄弟肯定会问,什么是分布式全局唯一性ID?

    答:肯定会有兄弟想,我即使分库分表后,每条数据拆分到每个表中,由于MySQL数据库主键自增的缘故,它们的ID在各个表是独立的,查询的时候 select * from 表名,也能够查询出来对应的信息,欸,这也不需要唯一性ID啊。但我们换个角度考虑,如:淘宝双十一订单量巨大,订单数据存入数据库,肯定对数据库进行了分库分表,欸,你有没有发现每个人的订单号肯定都是不同的,这就体现了全局唯一性ID。

    六、分布式ID生成方案

    在这里插入图片描述
    这里我们只介绍常用的几种分布式ID生成方案。

    6.1 UUID

    UUID不适用于实际的业务需求,它的缺点:

    • 无序的字符串,不具备趋势自增特性
    • UUID作为主键太长了,占用空间太大
    public static void main(String[] args) { 
           String uuid = UUID.randomUUID().toString().replaceAll("-","");
           System.out.println(uuid);  //如:c2b8c2b9e46c47e3b30dca3b0d447718
     }
    

    6.2 数据库自增ID

    业务应用A和业务应用B在各自的应用代码中执行下列代码,就可以保证拿到 ID 不冲突。

    begin;
    //replace into尝试将数据插入到表中,如果表中已有此行数据,先删除再插入新的数据
    replace into SEQUENCE_ID(stub) values('anyword')  
    select last_insert_id();
    commit;
    

    在这里插入图片描述
    数据库自增ID的缺点:

    • 无法保证高可用,一旦数据库SEQID挂掉,无法生成全局性唯一ID

    如果采用主从模式来解决高可用问题的话,可能由于主从同步的延迟性而导致可能生成的ID冲突,所以不能采用主从模式来解决高可用。

    6.3 数据库多主模式

    多个MySQL实例的自增ID都从1开始,会生成重复的ID怎么办?

    答:为每个数据库设置不同的起始值和自增步长。
    在这里插入图片描述
    数据库多主模式的缺点:

    • 不利于后续扩容,而且实际上单个数据库自身压力还是大,依旧无法满足高并发场景

    增加一台数据库,需要手动修改其它MySQL数据库的起始值和步长,必要时可能还需要停机修改。

    6.4 雪花算法

    雪花算法(snowflake)是twitter开源的分布式ID生成算法,它和上面的三种生成分布式ID机制不太一样,它不依赖数据库。

    由于生成的id中包含有时间戳,所以生成的id按照时间递增;如果部署了多台id生成服务器,由于每台服务器的机器编号不同,所以也不会出现id相同的情况。

    核心思想是:分布式ID固定是一个long型的数字,一个long型占8个字节,也就是64个bit,原始snowflake算法中对于bit的分配如下图:
    在这里插入图片描述

    • 第一个bit位代表符号位,正数是0,负数是1,一般生成的ID为正数,所以固定为0。
    • 时间戳部分占41bit,这个是毫秒级的时间,不建议存当前时间戳
    • 工作机器 id 占10bit
    • 序列号部分占12bit,支持同一毫秒内同一个节点可以生成4096个ID

    根据这个算法的逻辑,只需要将这个算法用Java语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,不需要单独去搭建一个获取分布式ID的应用。

    下面我们来简单探讨一下它的实现方式:

    //now - 生成的时间戳
    //workID - 机器编号id
    //seq - 序列号
    
    now = time();       	   //获取当前毫秒时间戳
    
    if(now == last){  	  //用当前毫秒时间戳和前一个ID生成的时间戳比较,如果相等,说明是同一毫秒内继续生成ID
    	seq++if(seq>4095){  		  //判断同一毫秒内生成的id是否已经达到最大4096,如果超过了就需要等下一毫秒
            now = nexttime(); //简单理解为sleep(1ms)
            seq = 0;
        }    
    }else{	
    	seq = 0;
    }
    last = now;      		  //将最后一次id生成的时间戳更新为生成当前id的时间戳,用于生成后续的唯一id
    
    id = now<<22 | workID << 12 | seq       //拼接成64位的唯一id
    

    在这里插入图片描述
    雪花算法缺点:

    • 严重依赖服务器的时钟,如果服务器的时钟回拨,就会导致生成的 id 重复

    6.5 Redis

    Redis 的所有命令操作都是单线程的,本身提供像 incr 和 increby 这样的自增原子命令,所以能保证生成的 ID 肯定是唯一有序的。设置id时,每次从redis中拿,每次有相关操作时就向Redis服务器发送一个 incr 或 increby 命令,保证 id 唯一。

    • 优点:不依赖于数据库,灵活方便,且性能优于数据库;数字ID天然排序,对分页或者需要排序的结果很有帮助。
    • 缺点:如果系统中没有Redis,还需要引入新的组件,增加系统复杂度;需要编码和配置的工作量比较大。
    展开全文
  • 有这么一个简单但深刻的实验: ...为什么同一副图片,仅仅是上下颠倒一下,我们就对其作出了完全不同的解释呢? 我们知道,视觉图像要到达大脑,首先要在视网膜上成像(视网膜上密密麻麻地排布

    有这么一个简单但深刻的实验:

    有这么一个简单但深刻的实验:



    我们看到这张图片的第一反应是:5个凸的按钮,1个凹的按钮。

    现在仅仅将图片上下颠倒一下:



    在我们眼中立即就变成了:1个凸的按钮,5个凹的按钮。

    为什么同一副图片,仅仅是上下颠倒一下,我们就对其作出了完全不同的解释呢?

    我们知道,视觉图像要到达大脑,首先要在视网膜上成像(视网膜上密密麻麻地排布着感光细胞),刺激感光细胞形成的神经电冲动然后经过一系列复杂的神经通道到达视觉皮层。但后续的繁杂步骤其实都是对视网膜上成的像的处理。这里,对我们的讨论而言视网膜不妨可以看作一张感光胶片,重点在于视网膜上的像完全是一张二维图片。大脑从图像中提取出来的任何信息都以这张二维图片为原始素材。

    那么,究竟大脑是怎么从二维图片中看出(推导出)三维的?

    其中一个重要的工作就是判定深度。前面的两张图片完全是二维图片,在我们的视网膜上也是二维的。然而大脑却能够从中理解出三维出来,大脑能够判断出一个按钮是“凹”的还是“凸”的。这是怎么办到的?

    很简单,假设环境中有光源,并且光源来自上方,那么凸的物体会使其下部出现阴影,凹陷的物体则会在上部出现阴影。于是,图中按钮的下半部出现阴影就意味着按钮是凸的,按钮的上半部出现阴影则代表按钮是凹的。

    然而,别忘了,大脑的这个推理成立必须有一个前提,即光线从上方照下来,如果光线从下方照下来的话,一切就反过来了,凸的物体将会使其上部呈现阴影,凹的物体将会使其下部呈现阴影。因此同样的一副图片如果假设光线从下方照耀的话,原来看成凸的物体就应该看成凹的,原来看成凹的就应该看成凸的。

    那么,回到我们的第一副图片,你能够看着第一副图片并假想光线从下方照下来,进而把原来凸的按钮看成凹的吗?事实证明这很难,但我们可以做一个等价的事情——将图片上下颠倒一下:考虑到我们总是假设光线从上方照耀以及按钮的上下对称性,颠倒原图就相当于对原来的图片而言假设光线从“下方”照上去了。

    我们发现(上文第二张图),一旦颠倒图片之后,果然凹凸就换位了。

    这就是说,同一副图片其实有两种(乃至更多)可能的解释,取决于你的大脑到底假定光照来自下方还是上方。但为什么我们看上面两幅图片却不会出现“二义性”的错觉呢?因为在我们生存的环境中始终就有这么一个巨大的来自上方的光源——太阳,漫长的进化已经在我们的神经回路中刻下了“光源来自上方”这样一个强大的假设,所以虽然第一副图片本该完全有两种解释,我们还是不可避免地只看到其中的一种解释,即假设光线来自上方的解释,即使卯足了劲看也难以将凸的看成凹的,因为难以克服进化印刻在大脑中的“光线来自上方”的假设,因此为了让你看到“当光线来自下方时你会看到什么景象”我不得不将图片颠倒一下,结果你就看到原来凸的变成凹的了。

    因为这个“光线来自上方”的假设是先验的。

    世界在我们眼中其实只是一张二维图片,由于引入了“光照来自上方”这个先验假设,便有了凸凹。否则,文中一开始那张图片中的“按钮”可以是凸的,也可以是凹的,也可以是一张平面的、故意捉弄你的眼睛的画。

    最后,我们再来做一个实验,将原图转动90度:



    是不是发现凸凹感基本消失了?现在图片看上去更像是透过面板上的一些孔洞看背后的一张黑白条纹纸。前面提到,我们的大脑通过阴影来判断凸凹,在对阴影的“含义”进行推断的时候必须假定光照来自上方,而在这张竖着的图中,假设光照来自上方的话,那些阴影是没有意义的,因为不管凸还是凹,都不会形成这样的阴影,因此我们的大脑便无法判断凸凹了。(注:其实只要稍微把头往某个方向转一下就会看到凸凹了,并且,由于90度的偏角远小于上下颠倒,所以可能不少人还是能够在上图中看出凸凹感来的,只要想象光线来自左方或右方即可,比想象光线来自下方容易多了)。

    也许这个实验对你来说过于简单,对于我们大脑中的“光线来自上方”的先验假设你还没有强烈的感觉。下面是一个更强的先验假设——人脸。

    我们的大脑有一个神经网络模块负责识别人脸,这也是一块硬编码的神经网络,也就是说我们天生就对任何(类似)人脸的图像敏感,所以随处都看到人脸,稍微类似人脸的图像就会被优先解释为人脸:



    当这种对人脸的强大先验假设在与“光线来自上方”假设产生冲突的时候,真正诡异的事情就出现了!



    这是卓别林的面具在旋转过程中的四个不同瞬间的截图,左上图是面具正面的正常图像,但右下角是从反面看的情形——这个时侯实际上面具是向内凹陷的面孔,但是我们的大脑欺骗了我们,让我们仍然看到凸的面孔,因为大脑的人脸识别模块对“脸是凸曲面”的先验假设轻易地打败了“光照来自上方”的假设。大脑的逻辑是这样的:如果假设光照来自上方,那么根据阴影来推断这就应该是一张凹陷的脸。但我们又知道所有的脸都是凸的,因此必须推翻光线来自上方的假定才能符合“事实”——当大脑中的两个假设相冲突的时候,更强硬的那个获胜。如果这不是一张人脸面具,我们便可以轻易地意识到是凹陷的了。

    Ames’ Room的构造有点复杂,但Ames’ Window是很好造的。

    在Ames’ Window和Ames’ Room中,由于我们假设屋子的框架和窗户的框架是平行的,从而会将视觉上平行的窗户看作是与我们相对平行放置的,而将视觉上扭曲(一头宽一头窄)的窗户看作是与我们相对垂直放置的(因为其一端离我们远去从而变小)。事实上我们在现实中正是通过物体大小的变化来判断远近的,这也正是透视法能够在平面纸张上创造出三维视觉效果的原理:



    在上文的实验中,我们的大脑由于有“内建”的假设,所以轻而易举地将一些按钮无歧义地解释为凸或者凹(后面我们会看到,虽然先验假设帮助我们消解二义性,但先验知识恰恰也正是偏见的本质来源),我们不免要想:如果缺乏先验知识来消解二义性,会出现什么现象呢?

    要消解二义性其实很简单,引入新的evidence:



    我们的大脑会综合图片中所有的evidence,以及大脑中原本就有的先验假设,给出最可能的解释。但必须注意的是,如果按照统计学派的观点,应该让数据本身说话,不引入先验假设的话,二维图片就是二维图片,每种解释的可能性都是均等的,但如果考虑了先验假设,那么往往只有一种或几种可能性是靠谱的:



    前一阵子互联网上流行的“看你是左脑还是右脑”的“旋转的女人”图片也是绝佳的例子(注:其实这跟左右脑毫无关系):



    有人看到顺时针有人看到逆时针。但更多的人看到的是顺时针,正如Necker Cube中更多的人看到的是一个水平放置的方块一样。一种可能的解释是我们对顺时针旋转更为熟悉(先验假设)。

    但是如果我们给图片加上一些新的evidence,就会发现变化出现了:





    像前面的加上了新的evidence之后的Necker Cube一样,通过对图中旋转的女人的剪影添加轮廓线索,强烈提示了目前这个瞬间到底是正面还是反面。通过这个提示,大脑正确的对二义性进行了消解。

    其实,说到底一张二维图片就是一张二维图片(外界物体反射的光线投射到我们的视网膜上也只是留下二维的剪影),其三维解释有N种(甚至无数种),但为什么绝大多数情况下我们的大脑能够一下就锁定在其中的一种可能性解释上呢?皆因我们的大脑对生成这张图片(特别是图片中的阴影)的环境参数有一些先验的假设(如前面提到的“光照来自上方”、“脸是凸曲面——严格来说,鼻子是凸的”)(注意,这些先验假设并不蕴含在图片中,而是我们在长期生活中无意识统计出来的,或者干脆就是漫长的进化过程筛选出来的有价值的先验假设)

    我们再来回顾一个经典的视觉现象——色彩恒常性(Color Constancy)。我们已经知道,同一个物体,在不同光照条件下我们知觉到它的颜色是基本不变的。一个青苹果在日挂头顶的中午的白炽光线下看上去是青的,在斜阳西下暗红色的光照下是青的,在清晨淡蓝色的雾霭中还是青的。你可能觉得这很正常,青的本来就是青的,有什么好奇怪的。但问题是如果将我们的眼球换成一个光线接收器,从而客观记录下从苹果表面反*河蟹*的光线的RGB值(红、绿、蓝三色的比例),会发现在不同环境光照条件下,实际从苹果表面反*河蟹*的光线差异是很大的;例如环境光只有长波(红色)的话,那么不管苹果表面的反射比如何,反*河蟹*的光也只能是长波,但为什么我们看起来仍还是青色的呢?

    如果我们在一个封闭的箱子中放置一张白纸,让观察者透过暗箱上的一个孔洞来观察这张白纸。那么当我们在箱子内用黄光照的时候,观察者会看到黄纸,用红光照的时候会看到红纸。但如果打开箱子,则不管用什么光照,我们看到的还是白纸。

    为什么会出现这种现象?目前为止已经有了一个理论解释框架:尽管同一物体在不同光照条件下反射的光线差异很大,即视网膜接收到的光线差异很大,但视觉皮层对视网膜接收到的光线又进行了一层处理,这层处理就是从视网膜接收到的光线中“抽取”出物体的“真实颜色”。但我们的神经回路如何计算目前还并不最终明确,但有靠谱的逼近算法(被称为retinex algorithm),其中一个简洁的版本是这样的:假设目标物体周围的邻近环境中存在完全反射光线中的绿光成分的物体、也存在完全反射光线中的红光成分的物体、也存在完全反射光线中的蓝光成分的物体,那么只要将眼睛采集到的环境光线中最强的绿光成分Gmax,最强的红光成分Rmax,最强的蓝光成分 Bmax分别记录下来,然后算一下相应的比例即可。

    这里,再一次,我们的大脑从一个具有多义性的信息源中抽取出了一种最靠谱的解释。从物体表面的光线并不能唯一确定物体的反射比,一个方程无法解出两个未知数(光照、反射比)。但我们的大脑仍然还是聪明地利用了环境中的evidence,靠谱地解决了这个问题。

    然而,接下来的才是我真正想说的,在刚才提到的算法中,一个先验假设是“目标物体周围的邻近环境中存在完全反射光线中的绿光成分的物体…”,问题是如果这个假设不满足呢?戏剧性的错觉就出现了,见下图:



    图中白线所指的两个小方块的颜色一样吗?如果你觉得不一样的话,不妨用软件把这两个色块的像素摘取出来对比一下。

    以上这些错觉与实际生活多少有点脱离,但我打赌以下这个现象每个人都看到过——只要你去过理发店,因为这个错觉也被叫做(理发店门口的)“旋转彩柱错觉”:





    透过条柱看到的黑白条块在往下移动,而透过孔隙看到的黑白条块则往右下方移动。然而,实际上孔隙背后的黑白条纹纸可能正在往下移动,也可能往左移动,实际上其移动的角度有无穷多种可能,为什么我们的大脑只看到了一种可能?

    我们的视觉系统通过大量的先验假设来解释投射到我们视网膜上的二维图像。视觉系统感知到的三维图像只是我们的大脑给我们玩的一个小把戏。

    在一般人看来,视觉错觉只是拿来哄MM开心的小伎俩,是魔术师的小把戏,“不登大雅之堂”,然而在心理学家和认知神经科学家们眼里,视觉错觉是一个迷人的研究领域,是研究人脑如何处理信息的窗口,正如数学家们透过悖论对数学的奥秘一窥端倪,心理学家们也在透过形形色色的错觉现象探索大脑对信息的处理机制。

    以上这些错觉现象实质上揭示了一个深刻的原理,这个原理不仅适用于视觉现象,同样适用于其他心理现象:我们的大脑从外界接受到的信息其实是满含着歧义的,单单从这些信息本身来看,我们应该感到无所适从才是,然而我们的大脑几乎每次都能够从富含歧义的信息中找出最靠谱的解释,作出无比牛B的点估计,这得益于漫长的进化过程,以及我们平常生活中积累的大量先验假设,然而,接下来我们要说到,这些先验假设是双刃剑,其锋刃的另一面就是我们常说的“偏见”。

    《Probability Theory, the Logic of Science》上讲了这么一个故事:

    一个月黑风高的夜晚,你是一位警察,在一条荒无人烟的街上巡逻,忽然听到入室盗窃自动警报,你转头望去,发现街对面的珠宝店的玻璃窗户破了个大洞,一个蒙面的家伙背着一个鼓鼓囊囊的的包正从窗户中爬出来,此时,你一定毫不迟疑地断定这个人就是强盗。你是怎么推断的呢?

    《疯狂的赛车》里,耿浩到庙里取了骨灰,一出门看到几个黑社会老大模样的家伙,以为是殡仪馆的人,而对方却以为耿浩是杀了泰国佬的地头蛇,并把耿浩手里的骨灰盒当成了藏毒品的工具,还一通佩服,结果一桩阴差阳错的生意就做成了。他们又是怎么推断的呢?

    正如以前听过的一句话所说:对于日常生活中的事件,总有一个平凡的解释,和一个疯狂的解释。

    例一中的那个背着包的人可能是珠宝店的老板,从假面舞会回来,身上没带钥匙,当他走过自己的珠宝店的时候,一辆卡车呼啸而过,轧飞的石子把他的珠宝店窗玻璃打碎了,为了保护他自己的珠宝,他只能进去把珠宝收起来带走。

    至于《疯狂的赛车》,另一种解释不用我说了。

    有这么一个故事:

    我有个朋友前些日子刚结完婚,这里有一个故事。他本身并不富裕,因此呢,就跟媳妇商量,咱能不能一切从简,什么三金,(就是金项链、金戒指、金耳环)也就都免了吧,媳妇说这是家里规矩,不能同意,这边老丈人当然就更不同意了,非逼着我这穷哥们买三金,给一万元礼钱。

    最后,没办法,我这朋友东挪西借把东西弄齐了,婚礼上,老丈人也给新郎一个红包,可我这哥们却始终憋着一股气,接过来之后终于没按耐住,爆发了,你猜怎么?他把红包给撕了扔地上,后来大家就劝他别这样,结婚呢,好不容易安抚下来,有人就说,你把彩礼捡起来吧,看看到底给你多少钱,结果他捡起来一看,是一张存折,上面显示有十万元存款。

    原来老丈人并不是想要从男方家捞什么钱,只不过就是认为按照自家风俗这些时必须的,否则女儿嫁的太不风光了。仅此而已。

    故事中的这位朋友又是怎么推断的呢?他所得到的信息仅仅是他的丈人坚持要他给礼钱,他并没有得到关于丈人这么做的意图的信息。丈人的意图只是他自己的推断,他对丈人意图的推断只是一种可能性,并非唯一的可能性。然而他仍然还是不可避免地陷入了对自己推断的过分信任的陷阱,一旦脆弱的自尊被触发,接踵而来的便是一连串情绪化的、自动化的行为(仿佛汽车挂上了自动挡)。

    想一想生活中有多少误解是由于自以为是地对别人的意图的误读而导致的呢?

    我们总是混淆“事实”和“推断”,尤其是当我们对推断的确信度很高的时候,或者某种推断对我们有利的时候,或者当这个推断源于大脑天生的偏见的时候,例如,将关联误当作因果就是我们的认知死穴之一:



    当知识有硬性局限的时候,就算持有Open Mind甚至也是不够的:



    古罗马哲学家Lucretius认为,宇宙是无限的。让我们来看一看他的经典论证。假设宇宙是有限的。我们往宇宙的边界投掷一根标枪。则我们将看到以下两种情况之一:这根标枪穿过边界飞向远方,这说明宇宙并无边界,它是无限的;或者这根标枪一头装上宇宙边界停了下来,这说明边界外“有东西”挡住了标枪,同样说明宇宙是无界的。

    我想说的是,在我们的知识体系里面还不存在“有限无界”这个概念的时候,上面的推理真的很滑稽吗?我们现在的知识体系和古希腊相比固然得到了极大的进步,但是我们真的变得更“聪明”了吗?要知道推理的引擎(演绎和归纳)几十万年来却并没有变化,我们只是站在巨人(数千年知识的积累)的肩膀上,但这个巨人的高度并不属于我们自己,我们有什么理由五十步笑百步呢?

    我们太可能因为受到知识的局限性而对事物的看法产生无法消除的偏见,有时候打破这种偏见的唯一途径就是开阔视野,多积累知识,以及和具有不同知识背景的人讨论,否则就算抱着“我可能是错的”这种信念,你也不知道怎么去证伪自己的一个猜测。

    关于我们大脑中的先验假设能够对我们的日常推理和记忆造成多大的影响,有这样一个经典的实验:

    1981年,两位心理学家Brewer和Treyens作了这么一个实验:

    召集一些人,告知他们将会参加一项学术研究计划,实验者先带领他们来到一间办公室,让他们稍加等候,一段时间之后,叫他们出来,并询问他们记得办公室里面有哪些东西。一些人声称看到了书,然而实际上办公室里面根本没有书。

    这里的原理是显而易见的,我们期望在一个学术机构的办公室里面看到典型的事物——书。当我们的直接记忆并不深刻或者我们当时等候的时候并没有刻意留心屋子内的摆设和物品时,我们会依靠之前生活中积累出来的先验假设进行推理,填充记忆的模糊或空白。关于虚假记忆的研究也表明,我们的记忆并不像电脑的存储设施那样,忠实记录,然后忠实读取,而是在记录和读取的时候都是相当程度上“构建性”的,而构建所用的“素材”则是我们之前在生活中积累出来的经验。这也是为什么同一个故事经不同的人口口相传之后会出现形形色色的版本的原因。

    最后再来一个例子,生动地说明了我们在平常生活中积累的偏见有多深:

    问题:现在有两个孩子,张森和李梅,其中一个孩子有四个卡车玩具,你认为是谁?

    问题:莉莉和丁丁谁将来更可能成为护士?

    尽管我们只拥有他们的名字,名字本身只是任意的汉字,自身并不携带信息(从一个角度来说),但就连三岁的小孩也能对这两个问题给出“靠谱”的答案。

    当然我们也可以说偏见代表着长期积累的生活经验,能够使我们事先就对未知对象的属性进行靠谱的预测,但另一方面,偏见也很可能成为自我时间的预言和自我妨碍的篱笆:女孩和男孩的数学智商真的有显著差异吗?但受文化影响,女孩认为自己更不擅长数学和理科,这个自我信念从两个角度产生作用,第一,它会让女生倾向于投入更少地时间在理科上,从而导致更低的理科成绩,结果进一步强化了她的“我的数学不好”的信念。这几乎是一个死循环。第二,人们为了维护对自我的信念,会拒绝接受与之相反的信息,如果那一次她数学考得不错,她会寻找外部理由,譬如“只是凑巧罢了”,虽然这种把自己看低的心理过程有点不可思议,但这的确是心理学家们实验证实的结果。

    在社会文化方面,人们常用“仁者见仁、智者见智”这个俗语来指代三种现象:

    1) 偏见:不同的人戴着不同的有色眼镜,对同一现象产生不同的理解或解释。是平凡的解释还是阴谋论的解释?存乎一心。

    2) 立场:例如对于“生活的意义”没有统一的标准公理,因此每种生活都是合理的,各人可以持有不同的价值观,优化不同的目标函数。

    3) 选择性关注:对于同一事物,不同的人关注的点不一样,象有四腿,各摸一条。

    与 “仁者见仁、智者见智”这个俗语的褒义色彩相反,这里除了第二点是中性的之外,另外两点都不能算是好事,譬如程序员在做项目的时候经常只选择性地关注“使用的技术是否有意思,是否有挑战性,是否好玩,我能否从中得到乐趣,是否能学到新东西”,而并不是关注最应该关注的“如何以最小成本达成项目成功”。至于第一点——偏见——就不用多说了,前文已经说得够多了。

    偏见在我们解决问题、认识世界的过程中都起到了很大的影响,并且很多时候是不好的影响。因此,让我们经常和具有不同信念和知识背景的人讨论,弥补个人经验知识的局限性导致的偏差,并时常使用以下这句话来提醒自己keep an open mind吧:

    “这只是一种解释(可能),未必是唯一的解释(可能)。(想不出其他解释不代表就不存在其他解释)。

    展开全文
  • hashSet是如何保证元素唯一性的呢? 是通过元素的两个方法,hashCode和equals来完成 如果元素的hashCode值相同,才会判断equals是否为true;如果元素的hashCode值不同,不会调用equals方法。 注意:对于...

    —–Set:元素无序(存入和取出的顺序不一定是一致),元素不可以重复
    —HashSet:底层数据结构是哈希表
    hashSet是如何保证元素唯一性的呢?
    是通过元素的两个方法,hashCode和equals来完成
    如果元素的hashCode值相同,才会判断equals是否为true;如果元素的hashCode值不同,不会调用equals方法。
    注意:对于判断元素是否存在(contains),删除(remove)、添加(add),都要先hashCode,后equals

    Set集合的功能和Collection是一致的。

    package com.HashSet;
    import java.util.*;
    /*
     * 哈希集合,是先看哈希地址,因为是new出来的东西,所以他们的哈希地址均不同
     * 被认为是不同的元素,不符合实际应用
     */
        public class People {
              private String name;
              private   int age;
    
              People(String name,int age){
                  this.name=name;
                  this.age=age;
    
              }
    
            public String getName() {
                return name;
            }
    
            public int getAge() {
                return age;
            }
             public boolean equals(Object obj) //注意这里是复写,所以必须传Object对象
             {
                  if(!(obj instanceof People))//集合中各种类型的元素,若不是人类型,则返回false
                      return false;
    
                  People p=(People)obj;
                  System.out.println(this.name+"---equals--"+p.name);
                  if(this.name==p.name&this.age==p.age)
                      return true;
    
    
                  return false;
    
              }
             public int hashCode() {
                 System.out.println(this.name+"---------hashCode");
                 //return 60;这是word上的讲解return
    
                 //用同一个hashCode使得没存入一个元素,就得判断equals,比较麻烦,所以可以在hashCode这做些判断,
                 //hashCode不相同的就不用再判断equals了,优化代码。
                System.out.println("name.hashCode:"+(name.hashCode()+age)+"---------------------------------");
                 return name.hashCode()+age;
             }
    
    
    }
    
    
    public class HashSetDemo {
    public static void sop(Object obj) {
         System.out.println(obj);
    
    }
    public void WuXu_BuChongFu() {
         HashSet hs=new HashSet();
         hs.add("java01");
         hs.add("java01");  
         hs.add("java03");
         hs.add("java05");
    
         //public boolean add(E e)注意其返回值为布尔类型,在Set中,不允许有重复元素
         //所以存入失败
    
         Iterator it =hs.iterator();
         while(it.hasNext())//set无序,所以打印结果很可能与存入的顺序不同
         {
             System.out.println(it.next());
         }
    }
        public static void main(String[] args) {
        HashSet hs=new HashSet();
        hs.add(new People("a1",11));
        hs.add(new People("a2",12));
        hs.add(new People("a3",13));
        hs.add(new People("a2",12));
        sop("元素存入成功:!!!!!!!!");
        //sop("a1:"+hs.contains(new People("a2",12)));//判断是否包含也是先判断hashCode,若不同,则一定不包含,若相同,则判断equals方法
                                                     //根据equals方法来得出返回值
        sop("移除a3"+hs.remove(new People("a3",13)));//和contains相同判断过程
    
    
        /*Iterator it=hs.iterator();
        while(it.hasNext()) {
            People p=(People)it.next();
            sop(p.getName()+"    "+p.getAge());
        }*/
    }
    }
    

    哈希地址解释:
    这里写图片描述
    总体而言,就是先看哈希码值,再看equals方法
    因为People中对HashCode进行重写,所有对象均是同一个哈希地址。
    (若不重写,就是自动生成哈希值,那么第一步就不相同,不用判断第二步。)
    ①a1正常填入。
    ②a2在填入前,先判断了hashCode,相同,所以用equals方法进行判断,姓名和年龄数值不同,所以存入.
    ③a3在填入前,先判断了hashCode,相同,所以用equals方法进行和已经存入的元素比较,比较的顺序不确定,如图所示,可以先a2再a1.均不同存入。
    ④a2在存入前,先判断了hashCode相同,所以用equals方法进行和已经存入的元素进行判断,比较顺序不确定,如图所示,先a3,再a2,比较到a2时,就判断出有相同的元素了,所以不存入a2,就不用再和a1比较了。
    若在hashCode中输出一句话,就更容易理解了。见下面输出

    a1———hashCode
    a2———hashCode
    a2—equals–a1
    a3———hashCode
    a3—equals–a1
    a3—equals–a2
    a2———hashCode
    a2—equals–a1
    a2—equals–a2

    展开全文
  • 但是AI一直黑箱问题存在,如果AI对过程都不能做到可解释,又怎么能放心让它来诊断病患呢。而关于机器学习可解释问题的书籍少之又少。 最近,一位来自复旦大学的研究生朱明超,将一本少有的书《Interpretable ...
  • Oracle | PL/SQL唯一索引(Unique Constraint)使用方法 1 目标 用演示样例演示怎样创建、删除、禁用和使用唯一性约束。 2 什么是唯一性约束? 唯一性约束指表中一个字段或者多个字段联合起来可以唯一标识一条...
  • 前几天有位朋友在我的文章下留言,想让我讲讲“index+small”提取唯一值数组公式。说实在的,提取唯一值有很多的方法,数组公式不仅长,且计算慢,我并不推荐使用。不过我想借此讲讲怎样看网上别人写的公式。我想...
  • UID-( Unique Identifiers ) 唯一标志值 特点: 1、World-Wide Unique 2、All DICOM object or service must have legal UID 组成说明: 例:Study Instance UID=1.2.840.113820.100.2.1.1.908813488....
  • Oracle数据库中,约束具体包括非空(NOT NULL)约束、唯一键(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束和检查(CHECK)约束五种。 1:主键(PRIMARY KEY)约束 什么是主键?在一张表中,...
  • 前几天有位朋友在我的文章下留言,想让我讲讲“index+small”提取唯一值数组公式。说实在的,提取唯一值有很多的方法,数组公式不仅长,且计算慢,我并不推荐使用。不过我想借此讲讲怎样看网上别人写的公式。我想...
  • 现在要做一个投票系统,每个用户一天只可以投6票,第二天可以继续票,现在就是获取不到能标识客户端唯一且不变的信息,Ip的话,对于局域网的话,一个人投票了,那么局域网内都不可以投票,sessionid虽然是唯一标识,...
  • package LeetCode.OneToFiveHundred; import java.util.HashMap; public class ThreeHundredAndEighthSeven { public int firstUniqChar(String s) { ... } // 如果到了这里就说明没有一个字母是唯一的 return -1; } }
  • 晓查 整理量子位 报道 | 公众号 QbitAI新冠疫情的出现,让许多AI医疗技术浮出水面。但是AI一直黑箱问题存在,如果AI对过程都不能做到可解释,又怎么能放心让它来诊断病患呢。而关...
  • 生产数据库的备份在测试环境上突然出现”违反唯一约束“的问题
  • dual 的解释 : 1. dual 确实是一张表.是一张只有一个字段,一行记录的表. 2.习惯上,我们称之为'伪表'.因为他不存储主题数据. 3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的. 如:select * from ...
  • Apache Cassandra,目前唯一的用于大数据的NoSQL数据库的结构,顺便解释NoSQL和Big data QQ空间新浪微博腾讯微博更多 2013 年 3 月 5 日3310 转我文章需注明出处:www.alexclouds.net 我不是标题党...
  • 接下来,我们来通过一个例子解释一下。 CREATE TABLE z ( a INT , b INT , PRIMARY KEY ( a ) , // a是主键索引 KEY ( b ) // b是普通索引 ) ; INSERT INTO z select 1 , 1 ; /...
  • 谈谈唯一约束和唯一索引

    万次阅读 多人点赞 2018-03-27 21:20:00
    最近在看数据库相关知识,感觉唯一约束和唯一索引好像有点类似,于是研究了一番,于是就有了这篇文章。 概念 开始之前,先解释一下约束和索引。 约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到...
  • 1、请求的唯一性:防止别人重复使用请求参数,即对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。 实现方法:在请求参数中,加入时间戳:timestamp,时间戳作为请求参数之一,也进行加密。  ...
  • 详解「关于本机」中的 19 个名词解释首先我们需要前往「设置」-「通用」-「关于本机」,查看本机详细信息。● 名称:可以任意修改,通常在 Apple ID 绑定设备与蓝牙名称位置处显示(建议不要以真实姓名命名设备)。● ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,165
精华内容 2,466
关键字:

唯一解释