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

​实力证明赢起跑线:小学生开发AI识别危险文具应用

而爸爸妈妈时常告诉我,要养成“东西放回原位”的习惯,所以我借助人工智能的知识做了一个物品自动识别并提示把东西放回原位的小提醒器,让我和弟弟都养成好习惯。...然后爸爸的帮助下,通labelImg软件对图片进行标注,以得到满足PaddleX要求的训练标注格式。 ? 然后,启动PaddleX选择目标检测类应用,按照要求导入数据启动训练。...让程序计算机上启动,然后通过远程摄像头进行了实验所需的实时摄像数据采集。程序对识别出来是危险文具标签的物品进行警告处理,然后显示屏幕上。 ?...下面是实验测试的视频,摄像头扫过的地方能把危险的剪刀圈出来并提示警示信息: ? 有了这个人工智能程序,还可以结合提示屏幕或者喇叭,进行声音提示。这个在后续Jetson固件集成再做尝试。...制作“小提醒器”的过程,还学习了如何通过PaddleX可视化客户端进行目标检测的模型训练,包括如何标注实验样本数据。

41730

深入理解HashMap

---- 扩容方案 当HashMap的数据越来越多,那么发生hash冲突的概率也就会越来越高,通过数组扩容可以利用空间换时间,保持查找效率常数时间复杂度。那什么时候进行扩容?...从图中我们可以看到,数组的hash结果,仅仅取决于高一位的数值。如果高一位是0,那么计算结果就是原位置,而如果是1,则加上原数组的长度即可。...HashMap把每个链表拆分成两个链表,对应原位置或原位置+原数组长度,再分别插入到新的数组,保留原来的节点顺序,如下: ? 前面还遗留一个问题:头插法会形成链表环。这个问题在线程安全部分讲解。...,原位置+老数组长度 // 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上 // 不用多次调用put方法...找了需要判断是否更新返回旧value,没找到需要插入新的Node、更新节点数判断是否需要扩容。 查找分为三种情况:数组、链表、红黑树。

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

HashMapJDK1.8的优化

,影响查询效率,比如,把0.75改成1,这个时候数组的长度为16的时候,才会进行扩容。...元素添加的逻辑 获取Node位置后,如果存在不在哈希表,就新增一个Node,添加哈希表,整个流程如下 ?...HashMap扩容 1.7jdk,HashMap整个扩容过程就是分别取出数组元素,一般该元素是最后一个放入链表的元素,然后遍历以该元素为头的链表元素,一次遍历元素的hash值,计算在新数组的下标,...因此证明,扩容之后,元素要么原位置,要么原位置加原位置的长度 ?...可以看到,扩容之后元素的位置是否改变,完全取决于紫色框的运算结果是0还是1,如果是0则新位置和原位置相同,如果是1,新位置=原位置+原数组长度,说明jdk1.8扩容并不用重新计算hash值。

77710

厉害了!把 HashMap 剖析的只剩渣了!

扩容方案 当HashMap的数据越来越多,那么发生hash冲突的概率也就会越来越高,通过数组扩容可以利用空间换时间,保持查找效率常数时间复杂度。那什么时候进行扩容?...img 从图中我们可以看到,数组的hash结果,仅仅取决于高一位的数值。如果高一位是0,那么计算结果就是原位置,而如果是1,则加上原数组的长度即可。...HashMap把每个链表拆分成两个链表,对应原位置或原位置+原数组长度,再分别插入到新的数组,保留原来的节点顺序,如下: ?...,原位置+老数组长度 // 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上 // 不用多次调用put方法...找了需要判断是否更新返回旧value,没找到需要插入新的Node、更新节点数判断是否需要扩容。 查找分为三种情况:数组、链表、红黑树。

42720

厉害了!把 HashMap 剖析的只剩渣了!

扩容方案 当HashMap的数据越来越多,那么发生hash冲突的概率也就会越来越高,通过数组扩容可以利用空间换时间,保持查找效率常数时间复杂度。那什么时候进行扩容?...img 从图中我们可以看到,数组的hash结果,仅仅取决于高一位的数值。如果高一位是0,那么计算结果就是原位置,而如果是1,则加上原数组的长度即可。...HashMap把每个链表拆分成两个链表,对应原位置或原位置+原数组长度,再分别插入到新的数组,保留原来的节点顺序,如下: ?...,原位置+老数组长度 // 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上 // 不用多次调用put方法...找了需要判断是否更新返回旧value,没找到需要插入新的Node、更新节点数判断是否需要扩容。 查找分为三种情况:数组、链表、红黑树。

50130

Go 每日一库之 bytebufferpool

简介 在编程开发,我们经常会需要频繁创建和销毁同类对象的情形。这样的操作很可能会对性能造成影响。这时,常用的优化手段就是使用对象池(object pool)。需要创建对象时,我们先从对象池中查找。...如果有空闲对象,则从池中移除这个对象并将其返回给调用者使用。只有池中无空闲对象时,才会真正创建一个新对象。另一方面,对象使用完之后,我们并不进行销毁。而是将它放回对象池以供后续使用。...,然后调用这个对象的方法写入数据,使用完成之后再调用bytebufferpool.Put()将对象放回对象池中。...优化细节 对象放回池中时,会根据当前切片的容量进行相应的处理。...calls数组记录放回对象容量落在各个区间的次数。

67130

Django搭建博客(九):为博客添加代码高亮显示和 md文档支持

一、用到的模块 Markdown pygments re 安装直接使用 pip 安装最新版本即可 二、支持的 markdown格式 目前只支持 Typora编辑器所支持的 markdown格式。...三、解析思路 先用正则将代码块从文档中提取出来,再用 pygments对代码进行上色,生成 html标签。...四、遇到的问题 1、如何将上色后的代码放回原位 一开始我想直接使用占位符替换原来的代码,然后再根据占位符来将代码插入回原来的位置。...但是仔细看过 re库的使用后,我发现 re.sub() 方法是可以接受一个函数来返回需要替换的字符串。...返回的字符串可以直接插入 html页面(Django记得使用 safe过滤器)。

1.2K30

对线面试官 | 字节跳动一面

大彬:以JDK1.8为例,当往HashMap放入元素时,如果元素个数大于threshold时,会进行扩容,使用2倍容量的数组代替原有数组。...大彬:由于数组的容量是以2的幂次方扩容的,那么一个Entity扩容时,新的位置要么原位置,要么原长度+原位置的位置。...大彬:也就是说,元素拷贝过程不需要重新计算元素在数组的位置,只需要看看原来的hash值新增的那个bit是1还是0,是0的话索引没变,是1的话索引变成“原索引+oldCap”(根据e.hash & (...大彬:进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地指针所指向的节点进行查找。直到查找到叶子节点,然后叶子节点上进行二分查找,找出 key 所对应的数据项。...大彬:因为B树的分支结点存储着数据,我们要找到具体的数据,需要进行一次序遍历按序来扫。而由于B+树的数据都存储叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可。

73510

java-hashMap

Java 中所有的对象都有 Hash 方法,Java的所有对象都继承 Object 类定义的 hashCode() 函数的默认实现。...table存放指向链表的引用,table 它在resize()方法初始化,并不是构造方法里面初始化的" transient int size; "HashMap数组的元素个数...3、将hashMap的临界值修改为扩容后的临界值4、根据扩容后的容量新建数组然后将hashMap的table的引用指向新数组。5、将旧数组的元素复制到table。...该过程, 涉及到几种情况, 需要分开进行处理(只存有一个元素, 一般链表, 红黑树)JDK1.8 HashMap 扩容阶段重新映射元素时不需要像 1.7 版本那样重新去一个个计算元素的 hash 值...具体原因如下:因为我们使用的是 2 次幂的扩展(指长度扩为原来 2 倍),所以,元素的位置要么是原位置,要么是原位置再移动 2 次幂的位置。

8910

Java基础

获取元素 如果没有冲突,即该下标对应的bucket只有一个元素,则直接取该元素 如果产生了冲突,则通过key.equals(k)去查找对应的entry:若为树则在树通过key.equals(k)查找...O(logn); 若为链表则在链表通过key.equals(k)查找O(n) 扩容 当put元素时,如果bucket的元素超过容器容量大小*负载因子就要扩容 创建一个新数组,容量是之前的2倍,然后将之前的元素拷贝到新数组...1.8元素的位置要么是原位置,要么是原位置再移动2次幂的位置 LinkedHashMap HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap元素插入的顺序,也就是无序...属性值为null,则创建一个ThreadLocalMap对象赋值给当前线程的threadLocals属性,然后以ThreadLocal本身为key,将值存到ThreadLocalMap对象 get元素时...,获取当前线程的threadLocals属性值(即ThreadLocalMap对象),然后以ThreadLocal本身为key从ThreadLocalMap对象获取值 HashMap采用拉链法处理哈希冲突

56710

对线面试官 | 字节跳动一面

大彬:以JDK1.8为例,当往HashMap放入元素时,如果元素个数大于threshold时,会进行扩容,使用2倍容量的数组代替原有数组。...大彬:由于数组的容量是以2的幂次方扩容的,那么一个Entity扩容时,新的位置要么原位置,要么原长度+原位置的位置。...大彬:也就是说,元素拷贝过程不需要重新计算元素在数组的位置,只需要看看原来的hash值新增的那个bit是1还是0,是0的话索引没变,是1的话索引变成“原索引+oldCap”(根据e.hash & (...大彬:进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地指针所指向的节点进行查找。直到查找到叶子节点,然后叶子节点上进行二分查找,找出 key 所对应的数据项。...大彬:因为B树的分支结点存储着数据,我们要找到具体的数据,需要进行一次序遍历按序来扫。而由于B+树的数据都存储叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可。

34110

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day12】—— 集合框架2(HashMap)

扩展后Node对象的位置要么原位置,要么移动到原偏移量两倍的位置。...因此逻辑相对简单:准备好新的数组后,map会遍历数组的每个“桶”,然后遍历桶的每个Entity,重新计算其hash值(也有可能不计算),找到新数组的对应位置,以头插法插入新的链表。...元素迁移的过程多线程情境下有可能会触发死循环(无限进行链表反转)。...全部按照原来方法进行计算(即hashCode ->> 扰动函数 ->> (h&length-1)) 按照扩容后的规律计算(即扩容后的位置=原位置 or 原位置 + 旧容量) 数组+链表改成了数组+链表或红黑树...扩容的时候1.7需要对原数组的元素进行重新hash定位在新数组的位置,1.8采用更简单的判断逻辑,位置不变或索引+旧容量大小; 插入时,1.7先判断是否需要扩容,再插入,1.8先进行插入,插入完成再判断是否需要扩容

30910

Swift:map(), flatMap() 和 compactMap() 的区别

在这种情况下,这意味着从数组取出一个数字,将其加倍,然后将其放回新的数组。...) } 因此:map()将从其容器取出一个值,使用您指定的代码对其进行转换,然后将其放回其容器。...这意味着map()方法也存在于可选对象上:从容器取出值(可选),使用我们提供的闭包对其进行转换,然后将其放回容器(另一个可选对象)。...“Unknown user”) 因此,如果name包含字符串,则map()会将解包,将其转换为“ Hi, name包含的字符串”,然后将整个拼接后的字符串放入一个可选对象返回以存储greeting...然后,我们研究了map()可选对象上的工作方式:如果它具有一个值,则可以对其进行解包,转换和重新包装,但是如果它为nil,则保持为nil。

3K20

HashMap源码分析

= null); } } return null; } jdk7的问题 多线程环境下,JDK 7数组+链表的HashMap实现,链表有可能出现成环...,然后查找的时候遍历链表就产生死循环了,因为多线程环境下线程调度不可预知,这种情况很难重现。...1就可以知道它rehash的位置,如果hash的第5位是0,就还在原位置,如果第5位是1,那么就在原位置加2^4的位置上,因此,我们可以将链表以第5位来将链表拆分成两个部分,将第5位是0的链表放在原位置...,如果默认的equals是==作用相同,如果是基本数据类型比较的是值,如果是引用类型比较的对象在内存的地址,hashCode()则是根据内存地址生成的,Object源码注释,有这样的规范 当obj1...hashMap,判断两个对象相不相等先判断两者hashCode值相不相等,如果hashCode不相等就没必要比较了,如果相等调用equals方法判断两者对象是否相等。

26240

八、JDK1.8HashMap扩容机制

四、深入理解Java的HashMap「网易面试快答」文章主要针对面试中常见的面试问题进行简单解答。...五、深入理解JDK1.7HashMap哈希冲突解决方案 和 六、深入理解JDK1.8HashMap哈希冲突解决方案 对HashMap哈希冲突及减少哈希冲突的解决方案做详细的介绍,通过源码加深大家的理解...-1)相 * 与得到 e该存放到新数组的下标 * 然后把e放入对应新数组的下标。...rehash之后,元素的位置要么是原位置,要么是原位置加原数组长度的位置?...总结 jdk1.8计算新位置的时候并没有跟1.7一样重新进行hash运算,而是用了原位置+原数组长度这样一种很巧妙的方式,而这个结果与hash运算得到的结果是一致的,只是会更块。

27120

Java:冒泡排序 | 二分查找

冒泡排序 例子(对数字排序): 假设有这样一组数字:32, 8, 128, 2, 64 现在对其进行冒泡排序(*表示下次比较的开始数字): 32>8?...现在找出剩余数字 8, 32, 2, 64 的最大数: 8>32? false: 保持原位置不动 8, 32*, 2, 64; 32>2 ?...例子(对上述排序好的数字进行查找): 有如下排序好的数字:2, 8, 32, 64, 128 索引值分别为 0, 1, 2, 3, 4 如何查找数字 2 的索引呢?...false,说明数值2的索引索引2的前面; 取索引0和索引2的中间索引值1,索引1处的值为8, 8<2 ? false,说明数值2的索引索引1的前面; ......依次取值比较即可得到数值2的索引为1; 程序实现如下: 参数表示在数组intArr查找值value所在的索引 public static int binarySearch(int value, int

50620

详解HashMap源码解析(下)

是否为红黑树,添加数据到红黑树。 上面都不符合,就是普通链表,遍历链表,如果链表存在相同key就替换,否则在链表最后添加数据。 不存在节点,就创建新的节点赋值。...链表有多个元素,是否为红黑树 是红黑树,红黑树查找 不是红黑树,就遍历普通链表,直到匹配到相同的hash和key值。...流程图: 总结 本文主要讲解了元素的添加、查找、扩容等主要方法,其中添加和查询都需要先获取数组的下标,然后进行对应的操作。 put添加 首次添加数据需要对数组进行扩容。...红黑树,红黑树查找 否则就是普通链表,遍历链表直到匹配到相同的hash和key。 不是,返回null。 是的话,是否是红黑树。 没有值,返回null 有值 *hash和key相等的话,返回节点。...因为数组长度都是2的幂次方,扩容后元素的位置*要么是原位置,要么是原位置再移动2次幂的位置。 hash&与运算原数组长度,等于0,存在原来的位置。 不等于0,就存放下标原来位置+原数组长度位置处。

26610

平面设计师必备的AI快捷键

一、原位粘贴技巧 CTRL+C 复制 CTRL+F 原位贴到前面 CTRL+B 原位贴到后面 二、页面切换技巧 开多个AI文档的情况下。...六、查找/替换字体时查看字体预览的小技巧 当使用AI文件使用字体显示框和可替换字体列表框,使用右键点击字体名称,可出现文件中使用该字体的头几个文字,这样就比较容易查找和确认。...2.把字应用一下图形样式里的默认样式,要记得是图形样式里的第一个样式默认,而不是其它样式。 3.然后把字体里的描边再变成无,在这个基础上就可以应用渐变了,还能编辑字体。...ai cs2,灰度可以直接对灰度图片进行填充专色,前提是图片要转为灰度,ai cs却不能!...】+【C】 将剪贴板的内容粘到当前图形 【Ctrl】+【V】或【F4】 将剪贴板的内容粘到最前面 【Ctrl】+【F】 将剪贴板的内容粘到最后面 【Ctrl】+【B】 删除所选对象 【DEL】 选取全部对象

2.4K20

【HashMap我可以讲半小时】

JDK1.8,对HashMap这二点进行了优化。第一点是经过rehash之后元素的位置,要么是原位置,要么是原位置再移动2次幂的位置。...所以经过rehash之后,元素的位置要么是原位置,要么是原位置加原数组长度的位置。...会有内存占用问题,复制的时候只是复制容器里的引用,只是写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存。...不保证原子性:线程1从主内存拿了一个值为1的数据到自己的工作空间里面进行加1的操作,值变为2,写回主内存,然后还没有来得及通知其他线程,线程1就被线程2抢占了,CPU分配,线程1被挂起,线程2还是拿着原来主内存的数据值为...查找时也是先落桶,然后key[index++]逐个比较key。所以,对比整个数据结构,省的不止是int vs Integer,还有每个Node的内容。

44230
领券