首页
壁纸
留言板
友链
更多
统计归档
Search
1
主板开机跳线接线图【F_PANEL接线图】
18,177 阅读
2
移动光猫获取超级密码&开启公网ipv6
14,620 阅读
3
TensorBoard:训练日志及网络结构可视化工具
13,108 阅读
4
Linux使用V2Ray 原生客户端
9,762 阅读
5
PC电源上供电接口定义
5,697 阅读
好物分享
实用教程
学习笔记
放码过来
深度学习
杂七杂八
bug处理
登录
/
注册
Search
标签搜索
好物分享
学习笔记
linux
MySQL
nvidia
typero
内网穿透
webdav
vps
java
cudann
gcc
cuda
树莓派
CNN
图像去雾
ssh安全
nps
暗通道先验
阿里云
jupiter
累计撰写
372
篇文章
累计收到
188
条评论
首页
栏目
好物分享
实用教程
学习笔记
放码过来
深度学习
杂七杂八
bug处理
页面
壁纸
留言板
友链
统计归档
搜索到
58
篇与
的结果
2022-10-07
机场机坪作业特种车辆介绍
1.“旅客服务”三兄弟客梯车名称:客梯车技能:远机位登机特点:货车头 长扶梯这款旅客登机梯(电动式)是上海东方航空设备制造有限公司最新设计研制的一种新型登机梯。当飞机停靠在没有廊桥的远机位时,就需要用到登机梯。它的车头和普通货车类似,但底盘安装有可“伸缩”的扶梯,通过调整扶梯高度可以适应不同机型,机型越大,坡度越陡。行动不便旅客登机车名称:行动不便旅客登机车技能:运送特殊旅客特征:方形车厢 x型伸展臂车身加装了一个方形的车厢,和云梯一样可上可下,是登机的“无障碍”通道,方便残疾旅客、轮椅旅客及重病担架旅客上下飞机。车内还安置了用于固定残疾人轮椅的设备,防止轮椅侧滑。东航实业自主研发的这款“行动不便旅客登机车”还是国内首台新能源车型,相较内燃发动机而言,更为环保,是升级换代的新款,目前已经投入使用。摆渡车名称:摆渡车技能:远机位运输神器特征:形似大巴 低底盘 无台阶这是旅客最常接触也是最熟悉的大家伙——摆渡车,它是连接候机厅和远机位飞机的唯一通道。图中是东航实业开发的新一代新能源机场摆渡车,别看长得像个压扁的面包块,但却能容纳一百多人,并且还是个隐形的豪车,身价百万哦~2.“行李”三兄弟行李牵引车名称:行李牵引车技能:运送行李至停机位特征:火车头 小个子 多个车厢行李牵引车又叫行李拖车。如果说旅客最先接触到的特种车辆是摆渡车,那行李最先接触到的就是行李牵引车。它就像一个火车头,身后牵引着很多个小“车厢”,车厢里装载着行李、货物、邮件等,并负责将他们运送至停机位。别看它小小萌萌的,力气可一点也不打折,最多可同时牵引10个车厢。挂满车厢能达到25米,承载行李货物可达30吨。行李传送车名称:行李传送车技能:传送行李至货舱特征:长手臂这是上海东方航空设备制造有限公司研制的新型散装货物装载机。散装货物装载机,又叫行李传送车。行李传送车有一个长长的传送带,开关启动后,传送带会慢慢滚动起来,然后像机器人一样“变形”,缓缓上升,把行李一件件送上飞机。货物平台升降车名称:货物平台升降车技能:运送集装箱进货舱特征:扁平身材 大力水手 x型支撑架小件行李能通过传送带进入货舱,那么又大又重的集装箱货物怎么办呢?比如疫情期间的支援物资。这时候就需要“平台升降车”上场。就是上图这个扁扁的家伙,它的车身像一个秤盘,扁平而宽敞,车上有一个x形的支撑架,依靠液压升降设备支撑,可以将巨大的集装箱平稳地“托举”数米高,然后再将集装箱平面旋转送入机舱,名副其实的机场“大力士”3.“飞机保障”三兄弟飞机牵引车名称:飞机牵引车技能:推飞机特征:超低底盘 大轮子这种机坪上的大型“铁憨憨”,就是飞机牵引车。它的特点是有着四个大轮子+超低底盘,高度只有1.5米左右,看上去就像个方方正正的大盒子。牵引车是推着飞机向后行驶的,由于飞机没有“倒挡”,不能自己向后退,为了方便飞机从停机位进出就需要用到飞机牵引车;此外,进出狭窄或封闭空间的活动(诸如进出机库)也需要牵引车的帮助,因此飞机牵引车在机场的使用率很高。也有这种类型的牵引车。飞机除冰车名称:飞机除冰车技能:给“大白”洗热水澡特征:大长臂 方脑袋 行走的花洒飞机洗澡,专业术语叫“除防冰”。图中是东航实业与英国mallaghan工程技术公司的一款合作产品,拥有先进技术和先进模块化设计的“除冰车”。寒冷的冬天,“大白”的表面很容易落雪结冰,为保证航班安全运行,飞机起飞前必须除冰。除冰时,工作人员将加热到指定温度的除冰液和未加热的防冰液以一定的压力喷射到飞机结冰的机翼表面、进气道前缘、升降舵及垂直尾翼上面。飞机加油车名称:飞机加油车(管线式)技能:给飞机加油特征:货车头 车身有大量管线管线式加油车直接与地下的航油供给管路对接,将航油注入飞机油舱,避免了加油车携带大量燃油造成的不安全性,并且减轻车辆重量,提高了车辆运行的效率。4.“云上吃喝”四兄弟食品车名称:食品车技能:吃货的补给站特征:方形车厢 剪刀式升降装置这可能是吃货们最关心的车。航班上的飞机餐和各类物品(毛毯、耳机等)都是通过这类车辆运送上去的。图中的这款食品车也是由上海东方航空设备制造有限公司生产制造的。与残疾人升降车相似,它也有一个巨型车厢,车厢可以平行向上升举,连接飞机舱门,飞机餐就装在一个个手推车里推进机舱。垃圾车名称:垃圾车技能:清理飞机垃圾特征:梯形车斗飞机上用过的纸杯、餐盒、果皮等都去哪了呢?自然是飞机落地时倾倒进“垃圾车”。图中这款就是东东(上海东方航空设备制造有限公司)自主研制的lj-15e航空垃圾接收车。与食品车不同的是,垃圾车的车厢更小,并且向上升举时,不是平行的,而是倾斜的,为了方便工作人员向下倾倒垃圾。清水车名称:清水车技能:提供饮用水特征:扁长水箱 细长管子图中的特种车是东东自主研制的一款清水车,是给飞机提供清洁饮用水的车辆。机身有一个扁平的罐体,这个看似不大的“肚子”里装着大量饮用水,作业时通过一个细长的管子与飞机连接,将饮用水输送至飞机水箱,飞机上泡咖啡的水就是来自这里~污水车名称:污水车技能:清理排泄物特征:扁平水箱 粗长管子和清水车外形相似,但用途不同,污水车是用于吸收机上排泄物的。当飞机结束一段航程,风尘仆仆地落地,地勤工作人员就会驾驶着污水车前来清理飞机排泄物,与清水车的管子不同,污水车有一根又大又粗的真空吸管,将管子与飞机排污口相连,开关打开,排泄物就被吸入污水车里了。排泄物清理干净之后飞机才能进行下一航程。(p.s.图中也是东东自主研发款哦)5.APU-电源车|气源车|空调车飞机电源车、气源车,以及空调车比较容易混淆,它们有挂式的、有车载式的,型号众多,造型各异。但有一点却极其相似,3辆车加起来就是约等于飞机的APU,APU我们了解,在地面上有三个主要作用,给飞机供电、供气,以及依靠高压引气启动发动机。与此对应,3种车可以从外部提供相同的功能,电源车供电,空调车提供舒适的低压空气,气源车则提供启动发动机的高压空气。如何对它们进行区分呢?电源车一般停靠在机头下方,而气源车、空调车常停靠在位于机腹的位置,由于空调车给的是低压空气,所以管子会更加粗壮,从这一点上非常容易辨认。电源车气源车空调车参考资料大型揭秘现场!认识十个算我输!机场里的特种车,你认识多少?《机坪特种车识别指南》
2022年10月07日
1,501 阅读
0 评论
0 点赞
2022-09-14
MySQL高频面试题梳理
0.题目汇总mysql的数据类型有哪些数据库引擎有哪些InnoDB与MyISAM差别MySQL删除数据的方式都有哪些?delete/drop/truncate区别、谁的速度更快以及原因视图的作用是什么?有哪些好处?什么叫内连接、外连接、左连接、右连接?并发事务带来哪些问题?事务隔离级别有哪些?MySQL的默认隔离级别是?创建索引的三种方式以及删除索引mysql的权限表有哪些将一张表的部分数据更新到另一张表,该如何操作呢?说一说你对数据库事务的了解数据库范式数据库关系运算符:选择、投影、连接、除、笛卡尔积数据库语句的执行顺序1.mysql的数据类型有哪些主要包括以下五大类:整数类型BIT、BOOLTINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT浮点数类型FLOAT、DOUBLE、DECIMAL字符串类型CHAR、VARCHARTINY TEXT、TEXT、MEDIUM TEXT、LONGTEXTTINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB日期类型Date、DateTime、TimeStamp、Time、Year其他数据类型BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection2.数据库引擎有哪些InnoDB引擎MySQL 5.5或更高版本的默认存储引擎设计遵循ACID模型,支持事务,支持提交、回滚和紧急恢复功能来保护数据。支持行级锁定,可以提升多用户并发时的读写性能支持自动增长列AUTO_INCREMENT支持外键,保持数据的一致性和完整性拥有自己独立的缓冲池,常用的数据和索引都在缓存中$\color{red}{与传统的ISAM与MyISAM相比,InnoDB的最大特色就是 支持了ACID兼容的事务(Transaction)功能 }$InnoDB 物理文件结构为:.frm 文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等;.ibd 文件或 .ibdata 文件: 这两种文件都是存放 InnoDB 数据的文件,之所以有两种文件形式存放 InnoDB 的数据,是因为 InnoDB 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。独享表空间存储方式使用.ibd文件,并且每个表一个.ibd文件;共享表空间存储方式使用.ibdata文件,所有表共同使用一个.ibdata文件(或多个,可自己配置)。InnoDB存储引擎的优势在于提供了良好的事务管理、崩溃修复能力和并发控制。缺点是其读写效率稍差,占用的数据空间相对比较大。ISAM引擎(Indexed Sequential Access Method,索引顺序存取方法)索引顺序存取方法(ISAM, Indexed Sequential Access Method)最初是IBM公司发展起来的一个文件系统,可以连续地(按照他们进入的顺序)或者任意地(根据索引)记录任何访问。ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。MYISAM引擎MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎(Mysql5.1前)。除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MYISAM物理文件结构:每个MyISAM在磁盘上存储成三个文件,每一个文件的名字均以表的名字开始,扩展名指出文件类型。.frm 文件 存储 表定义;.MYD (MYData)文件 存储 表的数据;.MYI (MYIndex)文件 存储 表的索引。MEMORY存储引擎MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择该存储引擎。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果该数据库需要一个用于查询的临时表,可以选择该存储引擎。HEAP引擎HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。ARCHIVE引擎适合对于不经常访问又删除不了的数据做归档储存,插入效率很高,而且占用空间小,该存储引擎只支持插入和查询操作,不支持删除和修改。3.InnoDB与MyISAM差别对比项MyISAMInnoDB主外键不支持支持事务不支持支持行表锁表锁,即使操作一条纪律也会锁住整个表,不适合高并发操作行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作表空间小大缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响关注点性能事务是否保存表的具体行数是否InnoDB 支持事务,MyISAM 不支持事务。 这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;InnoDB 支持外键,而 MyISAM 不支持。 对一个包含外键的 InnoDB 表转为 MYISAM 会失败;InnoDB 不保存表的具体行数,执行select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。MyISAM一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;InnoDB 是聚簇索引,MyISAM 是非聚簇索引。4.MySQL删除数据的方式都有哪些?delete/drop/truncate区别、谁的速度更快以及原因常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了执行速度drop > truncate >> DELETE区别详解delete1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger;2、在 InnoDB 中,DELETE其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。3、DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;4、delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;5、对于delete from table_name where xxx 带条件的删除, 不管是InnoDB还是MyISAM都不会释放磁盘空间;6、delete操作以后使用optimize table table_name会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。7、delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,生成的大量日志也会占用磁盘空间。truncate1、truncate:属于数据库DDL定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。执行后立即生效,无法找回 执行后立即生效,无法找回 执行后立即生效,无法找回2、truncate table table_name立刻释放磁盘空间 ,不管是 InnoDB和MyISAM。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;3、truncate能够快速清空一个表。并且重置auto_increment的值。小心使用 truncate,尤其没有备份的时候,如果误删除线上的表,记得及时联系中国民航,订票电话:400-806-9553Drop1、drop:属于数据库DDL定义语言,同Truncate;2、drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM;drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。小心使用 drop ,要删表跑路的兄弟,请在订票成功后在执行操作!订票电话:400-806-95535.视图的作用是什么?有哪些好处?视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。作用:①简化了操作,把经常使用的数据定义为视图。我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。②安全性,用户只能查询和修改能看到的数据。因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。③逻辑上的独立性,屏蔽了真实表的结构带来的影响。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。缺点:①性能差数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。②修改限制当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。6.什么叫内连接、外连接、左连接、右连接?7.并发事务带来哪些问题?脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。8.事务隔离级别有哪些?MySQL的默认隔离级别是?read-uncommitted(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。read-committed(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。repeatable-read(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。serializable(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。隔离级别脏读不可重复读幻读幻读READ UNCOMMITTEDYYYREAD COMMITTEDNYYREPEATABLE READNNYSERIALIZABLENNNMySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看。这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 repeatable-read(可重读)事务隔离级别下使用Next-Key Lock算法实现了行锁,并且不允许读取已提交的数据,所以解决了不可重复读的问题。另外,该算法(Next-Key Lock)包含了间隙锁,会锁定一个范围,因此也解决了幻读的问题。所以说InnoDB 存储引擎的默认支持的隔离级别是 repeatable-read(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的 serializable(可串行化) 隔离级别。9.创建索引的三种方式以及删除索引创建索引在执行CREATE TABLE时创建索引使用CREATE TABLE创建表时,除了可以定义列的数据类型外,还可以定义主键约束、外键约束或者唯一性约束,而不论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。-- 创建普通索引 create table book( book_id int, book_name varchar(50), authors varchar(50), info varchar(50), comment varchar(50), year_publication year, index idx_bname(book_name) -- 声明索引,字段为book_name ); -- 创建全文索引,全文索引在MySQL5.5及之前 MyISAM支持,InnoDB不支持 create table book1( book_id int, book_name varchar(50), authors varchar(50), info varchar(50), comment varchar(50), year_publication year, fulltext index fk_idx_cmt(comment(20)) -- 声明索引,字段为comment,长度取20,避免索引长度过长 );使用ALTER TABLE 命令去增加索引-- 创建普通索引 alter table book2 add index idx_cmt(comment); -- 创建唯一索引 alter table book2 add unique uk_idx_bname(book_name); -- 创建联合索引 alter table book2 add index mul_bid_bname_info(book_id,book_name,info);CREATE INDEX 命令创建(只能增加普通索引和UNIQUE索引)create index idx_cmt on book3(comment);-- 创建普通索引 create unique index uk_idx_bname on book3(book_name);-- 创建唯一索引 create index mul_bid_bname_info on book3(book_id,book_name,info);-- 创建联合索引删除索引使用 ALTER TABLE 删除索引--语法格式: ALTER TABLE table_name DROP INDEX index_name; --使用实例: alter table book3 drop index idx_cmt; alter table book3 drop index mul_bid_bname_info; --注意:添加 auto_increment 自增 约束字段的唯一索引不能被删除。使用 DROP INDEX 删除索引--语法格式: DROP INDEX index_name on table_name; --使用实例: drop index idx_cmt on book2; drop index mul_bid_bname_info on book2;10.mysql的权限表有哪些user表,用来记录允许连接到服务器的账号信息,该表里启用的所有权限都是全局级的,适用于所有数据库;db表,存储了用户对某个数据库的操作权限;tables_priv表,用来对单个表进行权限设置;columns_priv表,用来对单个数据列进行权限设置;procs_priv表,用于对存储过程和存储函数进行权限设置。11. 将一张表的部分数据更新到另一张表,该如何操作呢?可以采用关联更新的方式,将一张表的部分数据,更新到另一张表内。参考如下代码:update b set b.col=a.col from a,b where a.id=b.id; update b set b.col=a.col from b inner join a on a.id=b.id; update b set b.col=a.col from b left Join a on b.id = a.id;12.说一说你对数据库事务的了解事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。事务需遵循ACID四个特性:Atomic(原子性):指 整个数据库事务是不可分割的工作单位。只有使数据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。Consistency(一致性):指 数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。Durability(持久性):指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。13.数据库范式1NF每个关系r的属性值为不可分的原子值2NF满足1NF,非主属性完全函数依赖于候选键(左部不可约)3NF满足2NF,消除非主属性对候选键的传递依赖BCNF满足3NF,消除每一属性对候选键的传递依赖14.数据库关系运算符:选择、投影、连接、除、笛卡尔积选择定义:在关系中选择在指定属性上有确定值的关系的子集。表示为:$$ \sigma_F{R} = \{t|t \in R \and F(t)="真"\} $$例:查询信息系(IS系)全体学生$$ σ_{Sdept='IS'}(Student) $$查询年龄小于20岁的学生$$ σ_{Sage<20}(Student) $$投影投影是选取关系中列的子集,投影的结果不是原来的关系,是R中的几列属性。表示为:$$ \pi_{A}(R)=\{t[A]|t \in R\} $$例:查询学生关系Student中都有哪些系,即查询关系Student上所在系属性上的投影$$ π_{Sdept}(Student) $$连接从两个关系的笛卡尔积中选属性间满足一定条件的元组。除设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中例题:已知关系R和S如下,求$R ÷ S$的结果关系RABC258436392136434192关系SBCD364925第一步 :因为R÷S所得到的属性值是包含于R,但是S不包含的属性,R和S共同属性为B和C的组合,所以R÷S得到的属性列有(A),关系S在B、C上的投影为 { (3,6),(9,2)}第二步 :R在A的取值域为{1,2,3,4}第三步 : 求象集1对应的象集为 {(3,6),(9,2)}2对应的象集为 {(5,8)}3对应的象集为 {(9,2)}4对应的象集为 {(3,6),(3,4)}第四步:从第三步中可以发现,只有1 的值对应象集包含关系S的投影集,所以R÷S={1}15.数据库语句的执行顺序1、from2、where3、group by4、having5、select6、order by7、limit参考资料Github上365道Java高频面试复习题,助你拿爆大厂offer数据库引擎有哪些?视图的作用是什么?有哪些好处?(面试题)并发事务带来哪些问题?数据库基础---选择,投影,连接,除法运算
2022年09月14日
450 阅读
0 评论
0 点赞
2022-09-04
JavaSE高频面试题梳理-1.基础部分
0.题目汇总Java语言有哪些特点面向对象和面向过程的区别八种基本数据类型的大小,以及他们的封装类标识符的命名规则instanceof 关键字的作用Java自动装箱与拆箱重载和重写的区别equals与==的区别Hasheode的作用String StringBuffer和StringBuilder 的区别是什么?ArrayList和LinkedList的区别HashMap和HashTable的区别Collection包结构,与Collections的区别Java创建对象有几种方式?深拷贝和浅拷贝的区别是什么?final有哪些用法?static 都有哪些用法?3*0. 1==0. 3返回值是什么a=a+b与a+=b有什么区别吗?try catch finally; try里有return, finally还执行么?Exeption与Error包结构OOM你遇到过哪些情况,SOF你遇到过哪些情况.简述线程、程序、进程的基本概念。以及他们之间关系是什么线程有哪些基本状态?Java序列化中如果有些字段不想进行序列化,怎么办?Java中IO流Java IO与NIO的区别1. Java语言有哪些特点①跨平台/可移植性:编译器会把Java代码编码成(.class)中间代码,然后在Java虚拟机(Java Virtual Machine,JVM)上解释执行,而中间代码与平台无关,Java语言可以很好地跨平台执行,具有很好的可移植性;②面向对象:一切皆对象,然后衍生出面向对象的特点。③支持多线程;2.面向对象和面向过程的区别和优缺点区别面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用;面向对象是将构成问题的事物,分解成若干个对象并抽象出对象的功能,通过多个对象的协作完成复杂的功能。优缺点面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源; 比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展面向对象优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护缺点:性能比面向过程低3.八种基本数据类型的大小,以及他们的封装类数据类型大小/字节封装类byte1Byteshort2Shortint4Integerlong8Longfloat4Floatdouble8Doublechar2Characterboolean1Boolean备注:可以通过包装类.SIZE获取占用的大小4.标识符的命名规则只能由26个字母大小写,数字0-9,_或$组成(不能有空格)不能由数字开头不能使用关键字和保留字,但是能包含关键字和保留字严格区分大小写5.instanceof 关键字的作用判断左边对象是否是右边类的实例。6.Java自动装箱与拆箱自动装箱:可以把一个基本类型的数据直接赋值给对应的包装类型;自动拆箱:可以把一个包装类型的对象直接赋值给对应的基本类型;Java语言是面向对象的语言,其设计理念是“一切皆对象”。但8种基本数据类型却出现了例外,它们不具备对象的特性。正是为了解决这个问题,Java为每个基本数据类型都定义了一个对应的引用类型,这就是包装类。Java之所以提供8种基本数据类型,主要是为了照顾程序员的传统习惯。这8种基本数据类型的确带来了一定的方便性,但在某些时候也会受到一些制约。比如,所有的引用类型的变量都继承于Object类,都可以当做Object类型的变量使用,但基本数据类型却不可以。如果某个方法需要Object类型的参数,但实际传入的值却是数字的话,就需要做特殊的处理了。有了包装类,这种问题就可以得以简化。7.重载和重写的区别重载Overloading发生在本类,指的是多个方法名相同,参数列表不同(参数类型,参数个数甚至是参数顺序),与返回值无关。重写Overriding 发生在父类与子类之间,方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同,访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)。方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。8.equals与==的区别==是java中的一个二元操作符,对于基本类型,==是比较其值是不是相等,对于引用类型,==比较两个对象(地址)是否相同。equals是超类Object中的方法,如果对象不重写equals方法,那么实际该对象的equals和"=="作用是一样的,都是比较的地址值,但是大部分类都会重写父类的equals方法,用来检测两个对象的内容是否相等,例如String就重写了equals方法,用来比较两个字符串内容是否相同。equals()没有==运行速度快。9.Hasheode的作用在散列存储结构(如Hashtable,HashMap)中快速确定对象的存储地址,提高查找的便捷性;在Set结构中初步判断对象是否相等,避免频繁使用效率较低的equals方法,对于hashCode相等的再执行equals方法进行确认。注意:如果对象的equals方法被重写,那么对象的HashCode也尽量重写(因为equals相同=>hashCode必然要相同)10. String、StringBuffer和StringBuilder 的区别String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。StringBuffer和StringBuilder都是可变字符类,任何对它指向的字符串的操作都不会产生新的对象,StringBuilder是线程不安全的,执行速度更快,StringBuilder是线程安全的,执行速度相对更慢。11.ArrayList和LinkedList的区别ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构二者都会造成空间浪费,ArrayList的空间浪费主要体现在List列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据12.HashMap和HashTable的区别HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化初始size为11,扩容:newsize = olesize*2+1HashMap底层数组+链表+红黑树实现,可以存储null键和null值,线程不安全初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂13.Collection包结构,与Collections的区别区别:Collection,是一个集合接口,提供了对集合对象进行基本操作的通用接口方法Collections,是针对集合类的一个工具类,提供了一系列静态方法以实现对各种集合的搜索、排序、线程安全化等操作。Collections类不能实例化,服务于Collection框架。14.Java创建对象有几种方式new创建新对象通过反射机制采用clone机制通过序列化机制15.深拷贝和浅拷贝的区别浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用.深拷贝拷贝多层,每一级别的数据都会拷贝.16.final有哪些用法修饰变量,修饰基本数据类型后不能修改值,修饰引用数据类型后不能修改引用的指向(可以修改引用对象的属性);修饰方法,被 final 修饰的方法不可以被重写;修饰类,被 final 修饰的类不可以被继承;17.static都有哪些用法java中static的用法有:修饰成员变量:将其变为类的成员,从而实现所有对象对于该成员的共享;修饰成员方法:将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;修饰代码块:构造静态代码块一次性地对静态成员变量进行初始化。静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。18.3*0. 1==0. 3返回值是什么返回值是假,因为在计算机中浮点数的表示是误差的。所以一般情况下不进行两个浮点数是否相同的比较。而是比较两个浮点数的差点绝对值,是否小于一个很小的正数。如果条件满足,就认为这两个浮点数是相同的。19.a=a+b与a+=b有什么区别主要差异在于是否能进行数据类型自动转换,+=操作符会进行隐式自动类型转换,此处 a+=b隐式的将加操作的结果类型强制转换为运算结果转换为a的类型,而a=a+b则不会自动进行类型转换。class Solution { public static void main(String[] args) { short a = 10; int b = 20; a+=b; // 隐式类型转换为a的类型 a = a+b; // 编译错误,=两边的类型必须一致 } }20.try catch finally; try里有return, finally还执行么?不管有木有出现异常, finally 块中代码都会执行;当 try 和 catch 中有 return 时, finally 仍然会执行;finally 是在 return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管 finally 中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在 finally 执行前确定的;finally 中最好不要包含 return ,否则程序会提前退出,返回值不是 try 或 catch 中保存的返回值。21.Excption与Error包结构22.OOM(Out Of Memory Error)你遇到过哪些情况,SOF(Stack Ove flow Error)你遇到过哪些情况OOM:Java Heap 溢出(内存泄漏 or 申请过大堆空间)SOF:程序递归太深而发生堆栈溢出时,抛出该错误。23.简述线程、程序、进程的基本概念以及他们之间关系程序:静态的代码。进程: 进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位;线程: 线程是进程的一个执行单元,是任务调度和系统执行的最小单位;24.线程有哪些基本状态25.Java序列化中如果有些字段不想进行序列化,怎么办?对于不想进行序列化的变量,使用 transient 关键字修饰。transient 只能修饰变量,不能修饰类和方法。26.Java中IO流27.Java IO和NIO的区别IONIO面向流面向缓冲阻塞IO非阻塞IO无选择器Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。28.Java程序是如何执行的?先把Java代码编译成字节码,也就是把 .java类型的文件编译成 .class类型的文件.这个过程的大致执行流程: Java源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字节码生成器 ->最终生成字节码,其中任何一个节点执行失败就会造成编译失败;把class文件放置到Java虚拟机,这个虚拟机通常指的是Oracle官方自带的Hotspot JVM;Java虚拟机使用类加载器(Class Loader)装载class文件;类加载完成之后,会进行字节码校验,字节码校验通过JVM解释器会把字节码翻译成机器码交由操作系统执行.但不是所有代码都是解释执行的,JVM对此做了优化, 比如, 以Hotspot虚拟机来说, 它本身提供了JIT (Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译成机器码,这个时候字节码就变成了编译执行.参考资料Github上365道Java高频面试复习题,助你拿爆大厂offer面向对象和面向过程的区别面向对象与面向过程的本质的区别重载与重写的区别try catch finally,try里有return,finally还执行么?Java反射的作用与原理Java程序是如何执行的?
2022年09月04日
395 阅读
0 评论
0 点赞
2022-09-01
排序算法重梳理
0.复杂度和稳定性汇总版本一名词解释:n:数据规模k:"桶"的个数In-place:占用常数内存,不占用额外内存Out-place:占用额外内存稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同版本二 其中:k表示计数排序中最大值和最小值之间的差值;l表示桶排序中桶的个数;d表示基数排序中最大值的位数,r表示是多少进制;希尔排序的时间复杂度很大程度上取决于增量gap sequence的选择,不同的增量会有不同的时间复杂度。文中使用的“gap=length/2”和“gap=gap/2”是一种常用的方式,也被称为希尔增量,但其并不是最优的。其实希尔排序增量的选择与证明一直都是个数学难题,而下图列出的是迄今为止大部分的gap sequence选择的方案:1.逐一代码实现1.1 冒泡排序每次循环都比较前后两个元素的大小,如果前者大于后者,则将两者进行交换。这样做会将每次循环中最大的元素替换到末尾,逐渐形成有序集合。将每次循环中的最大(小)元素逐渐由队首转移到队尾的过程形似“冒泡”过程,故因此得名。一个优化冒泡排序的方法就是 如果在一次循环的过程中没有发生交换,则可以立即退出当前循环,因为此时已经排好序了(也就是时间复杂度最好情况下是$O(n)$的由来)。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static void bubbleSort(int[] array){ for (int i = 0; i < array.length-1; i++) { boolean flag = false;//记录本轮是否发生冒泡 for (int j = 0; j < array.length-1-i; j++) { if(array[j]>array[j+1]){ swap(array,j,j+1); flag = true; } } if (!flag) { //本轮没有发生冒泡则表示数组已经有序,可以直接break break; } } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; bubbleSort(array); System.out.println(Arrays.toString(array)); } }1.2 选择排序每次循环都会找出当前循环中最小(大)的元素,然后和此次循环中的队首元素进行交换。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static void selectSort(int[] array){ for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i+1; j < array.length; j++) { minIndex = array[j]<array[minIndex]?j:minIndex; } swap(array,i,minIndex); } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; selectSort(array); System.out.println(Arrays.toString(array)); } }1.3 快速排序import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } /** * @brief 快速排序-partition * 大体思想:把比pivot小的换到前面 */ public static int partition(int[] array,int left,int right){ // 取最后一个元素作为中心元素 int pivot = array[right]; // 遍历数组中的所有元素,将比中心元素大的放在右边,比中心元素小的放在左边---该步骤有点类似于选择排序 int i = left; for (int j = left; j < right; j++) { if (array[j] <= pivot) { swap(array,i,j);//比pivot小的,全部换到前面去 i++; } } //此时,i指向的元素一定大于等于pivot,把privot换回到中间 swap(array,i,right); return i; } /** * @brief 快速排序-递归划分 */ public static void quickSort(int[] array){ int mid = partition(array,0, array.length-1); quickSort(array,0,mid-1); quickSort(array,mid+1,right); } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; quickSort(array); System.out.println(Arrays.toString(array)); } }1.4 插入排序插入排序的精髓在于每次都会在先前排好序的子集合中插入下一个待排序的元素,每次都会判断待排序元素的上一个元素是否大于待排序元素,如果大于,则将元素右移,然后判断再上一个元素与待排序元素...以此类推。直到小于等于比较元素时就是找到了该元素的插入位置。这里的等于条件放在哪里很重要,因为它是决定插入排序稳定与否的关键。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static void insertSort(int[] array){ for (int i = 1; i < array.length; i++) { int curItem = array[i];//缓存下一个待排序的元素 // 把有序集合中的所有比curItem大的元素都往后移一位 int j = i-1; while (j>=0&&array[j]>curItem){ array[j+1] = array[j--]; } // 把待排序元素插入到有序序列中 array[j+1] = curItem; } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; insertSort(array); System.out.println(Arrays.toString(array)); } }1.5 希尔排序希尔排序可以认为是插入排序的改进版本。首先按照初始增量来将数组分成多个组,每个组内部使用插入排序。然后缩小增量来重新分组,组内再次使用插入排序...重复以上步骤,直到增量变为1的时候,这个时候整个数组就是一个分组,进行最后一次完整的插入排序即可结束。在排序开始时的增量较大,分组也会较多,但是每个分组中的数据较少,所以插入排序会很快。随着每一轮排序的进行,增量和分组数会逐渐变小,每个分组中的数据会逐渐变多。但因为之前已经经过了多轮的分组排序,而此时的数组会趋近于一个有序的状态,所以这个时候的排序也是很快的。而对于数据较多且趋向于无序的数据来说,如果只是使用插入排序的话效率就并不高。所以总体来说,希尔排序的执行效率是要比插入排序高的。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static void shellSort(int[] array){ int gap = array.length >>> 1; // 希尔排序的初始增量 while (gap>0){ for (int i = 0; i < gap; i++) { //对根据增量划分的组执行插入排序 // 一次排序一个增量组--插入排序 for (int j = i+gap; j < array.length; j+=gap) { int curItem = array[j]; // 待排序元素 int k = j - gap; while (k>=i&&array[k]>curItem){ array[k+gap] = array[k]; k-=gap; } array[k+gap] = curItem; } } gap >>>= 1; } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; shellSort(array); System.out.println(Arrays.toString(array)); } }1.6 堆排序堆排序的过程是首先构建一个大(小)顶堆,大顶堆首先是一棵完全二叉树,其次它保证堆中任意节点的值总是不大(小)于其父节点的值。因为大顶堆中的最大元素肯定是根节点,所以每次取出根节点即为当前大顶堆中的最大元素,取出后剩下的节点再重新构建大顶堆,再取出根节点,再重新构建…重复这个过程,直到数据都被取出,最后取出的结果即为排好序的结果。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } /** * 维护堆的性质 * @param array 存储堆的数组 * @param size 堆的大小 * @param i 待维护节点的下标 */ public static void heapify(int[] array,int size,int i ){ int largest = i; int lson = i*2+1; int rson = i*2+2; if(lson<size&&array[lson]>array[largest]) largest = lson; if(rson<size&&array[rson]>array[largest]) largest = rson; if(largest!=i){ swap(array,largest,i); heapify(array,size,largest); } } public static void heapSort(int[] array,int size){ // 建堆 for (int i = size/2-1; i>=0 ; i--) { // 从最后一个元素的父节点开始维护 heapify(array,size,i); } // 排序 for (int i = size-1; i >=0 ; i--) { swap(array,i,0); // 将堆的最后一个元素和堆顶元素进行交换 heapify(array,i,0); // 将堆顶元素移出堆,并维护堆顶元素的性质 } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; heapSort(array, array.length); System.out.println(Arrays.toString(array)); } }1.7 归并排序归并排序使用的是分治的思想,首先将数组不断拆分,直到最后拆分成两个元素的子数组,将这两个元素进行排序合并,再向上递归。不断重复这个拆分和合并的递归过程,最后得到的就是排好序的结果。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } // 合并 public static void merge(int[] array, int left, int mid, int right) { int[] temp = new int[right - left + 1]; // 临时数组 int p1 = left; // 标记左半区第一个未排序的元素 int p2 = mid + 1; // 标记右半区第一个未排序的元素 int k = 0; //临时数组元素的下标 // 合并两个有序数组 while (p1 <= mid && p2 <= right) { if (array[p1] <= array[p2]) { temp[k++] = array[p1++]; } else { temp[k++] = array[p2++]; } } // 把剩余的数组直接放到temp数组中 while (p1 <= mid) { temp[k++] = array[p1++]; } while (p2 <= right) { temp[k++] = array[p2++]; } // 复制回原数组 for (int i = 0; i < temp.length; i++) { array[i + left] = temp[i]; } } public static void mergeSort(int[] array,int left,int right){ //如果只有一个元素,那么就不需要继续划分 //只有一个元素的区域,本生就是有序的,只需要被归并即可 if(left<right){ //找中间点,这里没有选择“(left + right) / 2”的方式,是为了防止数据溢出 int mid = left + ((right - left) >>> 1); // 递归划分左半区 mergeSort(array, left, mid); // 递归划分右半区 mergeSort(array, mid + 1, right); // 对子数组进行合并 merge(array, left, mid, right); } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; mergeSort(array,0, array.length); System.out.println(Arrays.toString(array)); } }1.8 计数排序计数排序会创建一个临时的数组,里面存放每个数出现的次数。比如一个待排序的数组是[2,4,1,2,5,3,4,8,7],那么这个临时数组中记录的数据就是[0,1,2,1,2,1,0,1,1]。那么最后只需要遍历这个临时数组中的计数值就可以了。import java.util.Arrays; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static int[] countingSort(int[] array,int left,int right){ //记录待排序数组中的最大值 int max = array[0]; //记录待排序数组中的最小值 int min = array[0]; for (int item : array) { if (item > max) max = item; if (item < min) min = item; } //记录每个数出现的次数 int[] temp = new int[max - min + 1]; for (int item : array) { temp[item - min]++; } // 将结果复制回原数组 int index = 0; for (int i = 0; i < temp.length; i++) { //当输出一个数之后,当前位置的计数就减一,直到减到0为止 while (temp[i]-- > 0) { array[index++] = i + min; } } return array; } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; countingSort(array,0, array.length); System.out.println(Arrays.toString(array)); } }1.9 桶排序上面的计数排序在数组最大值和最小值之间的差值是多少,就会生成一个多大的临时数组,也就是生成了一个这么多的桶,而每个桶中就只插入一个数据。如果差值比较大的话,会比较浪费空间。那么我能不能在一个桶中插入多个数据呢?当然可以,而这就是桶排序的思路。桶排序类似于哈希表,通过一定的映射规则将数组中的元素映射到不同的桶中,每个桶内进行内部排序,最后将每个桶按顺序输出就行了。桶排序执行的高效与否和是否是稳定的取决于哈希散列的算法以及内部排序的结果。需要注意的是,这个映射算法并不是常规的映射算法,要求是每个桶中的所有数都要比前一个桶中的所有数都要大,这样最后输出的才是一个排好序的结果。比如说第一个桶中存1-30的数字,第二个桶中存31-60的数字,第三个桶中存61-90的数字...以此类推import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static int[] bucketSort(int[] array,int left,int right){ if (array == null || array.length < 2) { return array; } //记录待排序数组中的最大值 int max = array[0]; //记录待排序数组中的最小值 int min = array[0]; for (int i : array) { if (i > max) { max = i; } if (i < min) { min = i; } } //计算桶的数量(可以自定义实现) int bucketNumber = (max - min) / array.length + 1; List<Integer>[] buckets = new ArrayList[bucketNumber]; //计算每个桶存数的范围(可以自定义实现或者不用实现) int bucketRange = (max - min + 1) / bucketNumber; for (int value : array) { //计算应该放到哪个桶中(可以自定义实现) int bucketIndex = (value - min) / (bucketRange + 1); //延迟初始化 if (buckets[bucketIndex] == null) { buckets[bucketIndex] = new ArrayList<>(); } //放入指定的桶 buckets[bucketIndex].add(value); } int index = 0; for (List<Integer> bucket : buckets) { if (bucket == null) { continue; } //对每个桶进行内部排序,我这里使用的是快速排序,也可以使用别的排序算法,当然也可以继续递归去做桶排序 bucket.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; } }); //将不为null的桶中的数据按顺序写回到array数组中 for (Integer integer : bucket) { array[index++] = integer; } } return array; } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; bucketSort(array,0, array.length); System.out.println(Arrays.toString(array)); } }1.10 基数排序基数排序不是根据一个数的整体来进行排序的,而是将数的每一位上的数字进行排序。比如说第一轮排序,我拿到待排序数组中所有数个位上的数字来进行排序;第二轮排序我拿到待排序数组中所有数十位上的数字来进行排序;第三轮排序我拿到待排序数组中所有数百位上的数字来进行排序...以此类推。每一轮的排序都会累加上一轮所有前几位上排序的结果,最终的结果就会是一个有序的数列。基数排序一般是对所有非负整数进行排序的,但是也可以有别的手段来去掉这种限制(比如都加一个固定的数或者都乘一个固定的数,排完序后再恢复等等)。基数排序和桶排序很像,桶排序是按数值的区间进行划分,而基数排序是按数的每一位的值进行划分。同时这两个排序都是需要依靠其他排序算法来实现的(如果不算递归调用桶排序本身的话)。基数排序每一轮的内部排序会使用到计数排序来实现,因为每一位上的数字无非就是0-9,是一个小范围的数,所以使用计数排序很合适。import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; class Solution { // 交换数组元素位置 public static void swap(int[] array,int index1,int index2){ int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } public static void radixSort(int[] array) { //定义一个二维数组,表示10个桶,每个桶就是一个一维数组 int[][] bucket = new int[10][array.length];//很明显,基数排序使用了空间换时间 //为了记录每个桶中实际存放了多少个数据,定义一个一维数组来记录每次放入数据的个数 //比如bucketElementCounts[0]=3,意思是bucket[0]存放了3个数据 int[] bucketElementCounts = new int[10]; int digitOfElement = 0;//每次取出的元素的位数 //找到数组中最大数的位数 int max = 0; for (int i = 0; i < array.length; i++) { if (max < String.valueOf(array[i]).length()) { max = String.valueOf(array[i]).length(); } } int index = 0; for (int i = 0, n = 1; i < max; i++, n *= 10) { //第i+1轮排序(针对每个元素的位进行排序处理) for (int j = 0; j < array.length; j++) { digitOfElement = array[j] / n % 10;//取出每个元素的位 bucket[digitOfElement][bucketElementCounts[digitOfElement]] = array[j];//放入对应的桶 bucketElementCounts[digitOfElement]++; } //按照桶的顺序(一维数组的下标取出数据),放入原来的数组 index = 0; //遍历每一个桶,并将桶中数据放入原数组 for (int k = 0; k < bucketElementCounts.length; k++) { //如果桶中有数据,我们才放到原数组 if (bucketElementCounts[k] != 0) { //循环第k个桶,放入 for (int l = 0; l < bucketElementCounts[k]; l++) { array[index] = bucket[k][l]; index++; } } bucketElementCounts[k] = 0;//置零!!!!! } } } public static void main(String[] args) { int[] array = new int[]{1,9,4,8,2,3,0,7,5,6}; radixSort(array); System.out.println(Arrays.toString(array)); } }参考资料排序算法:快速排序【图解+代码】排序算法:堆排序【图解+代码】排序算法:希尔排序【图解+代码】排序算法:归并排序【图解+代码】十种经典排序算法总结基数排序(Java)
2022年09月01日
924 阅读
0 评论
0 点赞
2022-08-29
航空器的的飞行阶段
一般航空器的的飞行阶段分为五个阶段,分别是:推出滑行、起飞离场、巡航、下降进近、落地和复飞。一、推出滑行 在上客阶段完成,机组做好了所有的航前检查和准备,飞行员就会跟机场塔台申请放行许可(ATC Clearance),同时也会申请推出和开车。管制部门许可机组推出滑行后,机组会沿着塔台指定的滑行路线从机坪滑到跑道入口外等待进一步指令。二、起飞离场机组得到塔台进跑道和起飞的指令后,就以为这架巨大银鹰马上要展翅高飞了,进跑道,对正跑道中心线,推油门,手扶方向舵,加速拉杆,飞行员一系列操作完成后,这架飞机已经离开了地面,正沿着指定的航迹和高度许可爬升高度。跑道上和起飞3分钟,落地8分钟是飞行中最危险的位置和时间,飞机诞生以来,飞行事故大多就发生在这个阶段,历史上死亡人数最多的特内里费空难就发生在跑道上,起飞阶段两架满载旅客的波音747相撞,死亡人数高达500人左右。三、巡航 当飞机的高度上升到了巡航高度,例如一万零一千米,这时,这架飞机进入了巡航阶段,如果没有天气,颠簸,冲突或其他情况,那接下来的很长一段时间飞机几乎就会保持在这个高度附近,一直沿计划航路飞行,直到快到目的地。三万英尺(一万米)左右的巡航高度接近了大气层的对流层顶部分,在这个高度飞行,飞机会相对平稳一些,美丽的空中乘务员们会利用这段时间进行客舱服务。四、下降进近 当航空器距离目的地机场200-300公里时,飞机一般要开始下降了,为保证旅客的舒适性,运输航班的下降率一般为1000-2000英尺/分钟左右,到达真高2000米左右飞机一般会开始最后进近阶段,这个阶段飞机会打开起落架轮仓,放出并锁定起落架,对正跑道,做好落地前的所有检查单和准备工作。 处。五、落地和复飞 在得到塔台的可以落地指令后,飞机继续沿无线电搭建的下滑道平稳进近,边进近边下降高度。如果突然有特殊情况发生,如跑道侵入,风切变等一系列因素导致不能继续进近,飞行员就需要操作飞机推油门拉杆,复飞爬升,重新进近或者去其他机场返航备降。平稳落地后飞机还是会按指定的路线滑回机位。参考资料分享:航空器飞行的几个飞行阶段
2022年08月29日
728 阅读
0 评论
0 点赞
2022-08-26
机架式服务器安装-以HP380为例
0.核心配件1.安装服务器上的导轨1.1 将导轨片安装在服务器两侧2.安装机架上的导轨上机架的导轨上分别标有“REAL+RIGHT”和“REAL+LEFT”,表示示这端安装在机架的后面,而标有“FRONT+RIGHT”和“FRONT+LEFT”的两端则安装在机架的前面:2.1 将标有"REAL RIGHT"的一端扣在机架后面的孔上2.2 将标有"FRONT RIGHT"的一端扣在机架前面的孔上2.3 将左右两侧导轨分别安装的机架上后,如下图所示3.组合固定3.1 将导轨里的小导片抽出3.2 将安装在服务器两侧上的导片分别插入机架的导轨片中3.3 将服务器顺着导轨推入参考资料HPDL380服务器机架安装示意图戴尔机架式服务器1U导轨安装教程戴尔服务器r730怎么安装到机架上机架服务器安装说明
2022年08月26日
871 阅读
0 评论
0 点赞
2022-08-01
航班不同子舱含义
F舱为头等舱公布价,A舱为头等舱免折、常旅客免票;C舱为公务舱公布价,D舱为公务舱免折、常旅客免票;Y舱为普通舱(经济舱)公布价,S舱为联程、缺口程等特殊舱位,B舱为普通舱9折,H舱为普通舱85折,K舱为普通舱80折,L舱为普通舱75折,M舱为普通舱70折,N舱为普通舱65折,Q舱为普通舱60折(含教师、医护人员、县级以上劳模),T舱为普通舱55折,X舱为普通舱50折(含学生、长者),U舱为普通舱45折,E舱为普通舱40折,W舱为普通舱35折,R舱为普通舱30折,O舱为普通舱25折,Z舱为代码共享留座专用舱,V舱为常旅客专用舱,G舱为普通舱免折和常旅客免票。
2022年08月01日
2,464 阅读
0 评论
0 点赞
2022-06-23
海康威视监控摄像头使用指南
1.设备连接12v电源+网线2.通过设备网络搜索软件找到设备IP下载地址https://www.hikvision.com/cn/support/Downloads/Desktop-Application/HikvisionTools/运行界面3.通过网页访问访问地址:http://10.1.9.31/首次使用需要配置用户名和密码登录用户名:admin 密码:!itrb1234.下载客户端访问下载地址https://www.hikvision.com/cn/support/Downloads/Desktop-Application/Client-Application/客户端使用
2022年06月23日
2,502 阅读
2 评论
0 点赞
2022-06-16
NCNN部署yolov5s
1.NCNN编译安装参考:Linux下如何安装ncnn2.模型转换(pt->onnx->ncnn)$\color{red}{此路不通,转出来的param文件中的Reshape的参数是错的}$2.1 pt模型转换onnx# pt-->onnx python export.py --weights yolov5s.pt --img 640 --batch 1#安装onnx-simplifier pip install onnx-simplifier # onnxsim 精简模型 python -m onnxsim yolov5s.onnx yolov5s-sim.onnx Simplifying... Finish! Here is the difference: ┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ ┃ Original Model ┃ Simplified Model ┃ ┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩ │ Add │ 10 │ 10 │ │ Concat │ 17 │ 17 │ │ Constant │ 20 │ 0 │ │ Conv │ 60 │ 60 │ │ MaxPool │ 3 │ 3 │ │ Mul │ 69 │ 69 │ │ Pow │ 3 │ 3 │ │ Reshape │ 6 │ 6 │ │ Resize │ 2 │ 2 │ │ Sigmoid │ 60 │ 60 │ │ Split │ 3 │ 3 │ │ Transpose │ 3 │ 3 │ │ Model Size │ 28.0MiB │ 28.0MiB │ └────────────┴────────────────┴──────────────────┘2.2 使用onnx2ncnn.exe 转换模型把你的ncnn/build/tools/onnx加入到环境变量onnx2ncnn yolov5s-sim.onnx yolov5s_6.0.param yolov5s_6.0.bin2.3 调用测试将yolov5s_6.0.param 、yolov5s_6.0.bin模型copy到ncnn/build/examples/位置,运行下面命令./yolov5 image-path就会出现Segmentation fault (core dumped)的报错3.模型转换(pt->torchscript->ncnn)3.1 pt模型转换torchscript# pt-->torchscript python export.py --weights yolov5s.pt --include torchscript --train3.2 下载编译好的 pnnx 工具包执行转换pnnx下载地址:https://github.com/pnnx/pnnx执行转换,获得 yolov5s.ncnn.param 和 yolov5s.ncnn.bin 模型文件,指定 inputshape 并且额外指定 inputshape2 转换成支持动态 shape 输入的模型 ./pnnx yolov5s.torchscript inputshape=[1,3,640,640] inputshape2=[1,3,320,320]3.3 调用测试直接测试的相关文件下载:yolov5_pnnx.zip将 yolov5s.ncnn.param 和 yolov5s.ncnn.bin 模型copy到ncnn/build/examples/位置,运行下面命令./yolov5_pnnx image-path参考资料yolov5 模型部署NCNN(详细过程)Linux&Jetson Nano下编译安装ncnnYOLOv5转NCNN过程Jetson Nano 移植ncnn详细记录u版YOLOv5目标检测ncnn实现(第二版)
2022年06月16日
1,148 阅读
0 评论
0 点赞
2022-06-16
Jetson nano开启VNC
1.nano设置VNC服务1.执行更新sudo apt-get update2.安装vino服务端这个vino服务端我使用的镜像文件是安装好了的,但是古早版的镜像文件可能没有,所以可以执行下代码看看是否有安装。sudo apt-get install vino3.开启VNC 服务sudo ln -s ../vino-server.service /usr/lib/systemd/user/graphical-session.target.wants4.配置VNC服务gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false5.编辑org.gnome用于恢复丢失的“enabled”参数,用于vnc允许使用RFB 协议进行远程控制输入以下命令进入文件,将下方key内容添加到文件的最后面。保存并退出。sudo vim /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml添加的文件内容如下<key name='enable' type='b'> <summary>Enable remote access to the desktop</summary> <description> If true, allows remote access to the desktop via the RFB protocol. Users on remote machines may then connect to the desktop using a VNC viewer. </description> <default>false</default> </key>6.设置为Gnome编译模式,编译以上的文件sudo glib-compile-schemas /usr/share/glib-2.0/schemas7. 在会话启动时添加程序:Vino-server,使用以下命令行:/usr/lib/vino/vino-server8.连接测试2.设置开机自启动1.允许vino服务gsettings set org.gnome.Vino enabled true2.创建VNC自动启动文件创建文件夹,然后创建一个自动启动文件mkdir -p ~/.config/autostart sudo vim ~/.config/autostart/vino-server.desktop3.添加以下内容到vino-server.desktop文件中[Desktop Entry] Type=Application Name=Vino VNC server Exec=/usr/lib/vino/vino-server NoDisplay=true提示:需要进入界面后才自动启动,建议取消登录密码进入界面。参考资料Jetson nano 通过 vnc 实现远程桌面控制(已在nano实现)
2022年06月16日
872 阅读
0 评论
0 点赞
2022-06-14
解决vscode卡顿问题
最近vscode突然变得异常卡顿,不知道什么原因,编辑个文件都费劲,于是查找了一些资料对配置进行修改,并记录如下1.修复VScode 造成 rg.exe内存占用过大的问题1)在VScode环境下,依次“文件”菜单->“首选项”->“设置”2)在搜索框中输入“Search:Follow Symlinks”搜索,将该项之前的复选框√去掉;如下图所示。2. 修复VScode 造成 git.exe内存占用过大的问题1)在VScode环境下,依次“文件”菜单->“首选项”->“设置”2)在搜索框中输入“Git:Autorefresh”搜索,将该项之前的复选框√去掉;如下图所示。3)在搜索框中输入“Git.Enabled”搜索,将该项之前的复选框√去掉;如下图所示。3.关闭chrome硬件加速打开Chorme浏览器 -> 设置 ->系统 ->将【启用硬件加速模式】取消勾选即可4.重启VScode生效做完以上操作你会惊喜的发现,VSCode恢复到以前的流畅了。参考资料解决VSCode无缘无故卡顿的问题使用VSCode环境进行开发,突然出现卡顿、打字显示缓慢,滚动、选择迟缓、软件崩溃等问题解决 vscode 卡顿,卡死,占用内存大的方案
2022年06月14日
3,269 阅读
0 评论
0 点赞
2022-06-12
Windows硬盘GPT分区与MBR分区转换
0.应用背景在安装win10系统的时候提示硬盘格式不兼容的问题。此外,如今电脑磁盘空间越来越大,每一个分区拥有的储存空间也越来越大,此时如果是大数据处理,原始的MBR磁盘对磁盘分区有空间大小的限制,因此有时我们需要修改磁盘为GPT磁盘。1.转换步骤进入cmd命令行窗口输入diskpart,进入到磁盘管理的命令中输入list disk,调出到电脑磁盘的列表选择需要修改的磁盘,输入select disk=0 ,选择列表中的0号磁盘输入convert gpt(转化GPT),将选中磁盘进行GPT磁盘转换。输入`convert mbr(转化MBR),将选中磁盘进行MBR磁盘转换。硬盘GPT分区与MBR分区转换后需要重启电脑。参考资料硬盘GPT分区与MBR分区怎么转换
2022年06月12日
550 阅读
0 评论
0 点赞
2022-06-12
内存条安装:双通道与单通道
1.原理介绍1.1 内存双通道与内存单通道内存双通道是指使用两条相同品牌相同规格容量内存组建的一种内存方式,通俗的说双通道是指两个内存控制器分别控制两条内存,理论上比单通道的性能要强,因此目前被广泛使用。单通道内存在同一时间只能读,或者只能写,就像停车场的出入口只能通过一辆车,同一时间只能进或者出,车流量少的时候无所谓,但是车多的时候就互相等待。1.2 双通道与单通道之间有什么区别?1、要求不同:内存条单通道指需要一条内存条,双通道需要最少2条内存。2、内存容量不同:都是单条2G的情况下,双通道是2条内存条,单通道是1条内存条。3、读取速度不同:单通道内存在同一时间只能读,或者只能写;双通道是指内存的读、写使用不同的通道,可以同时读和写,内存带宽翻倍。4、处理能力不同:双通道在读写方面比单通道有优势,在日常打开软件或者文档肯定要比单通道要快上一截。比如原来运行某些大型游戏时,由于内存带宽问题有点吃力,双通道带来的性能提升就能明显感觉到。1.3 组建双通道内存需要注意什么?1、必须同代理论上,双通内存没有品牌要求,没有容量对等要求,但必须是同代内存,也就是如果用的是DDR4内存,两条都必须是DDR4,不能DDR3和DDR4混用,否则不兼容。另外,最好是同品牌内存,不同品牌内存也可能出现不兼容。2、双通道内存超频困难由于双通道内存架构原因,其超频比较困难,对于喜欢DIY超频用户,有一定限制。2.组件双通道具体步骤1、如果主板提供了四根内存插槽。我们先来为内存插槽起个编号,距离CPU最近的内存插槽顺序开始编号,分别为1、2、3、4插槽,如下图所示。2、组建双通道内存的方法也十分简单,我们只需要将内存插入编号为“1和3内存插槽”或者是“2和4内存插槽”即可完成组建内存双通道,从优先级建议优先2和4内存插槽,其次1和3内存插槽,其实2和4插槽优先级最大的好处就是躲开塔式CPU散热器。3.双通道有四根内存插槽的主板内存插法3.1 正确内存插法1根内存的情况下,插入在第#2插槽,单通道内存。2根内存的情况下,优先插入在第2和第4插槽,其次1和3插槽,完成组建双通道内存。3根内存的情况下,插入在第2和第4插槽,而第三根任意,建议插入到3插槽,避免塔式CPU散热器挡住,完成组建双通道内存。4根内存的情况下,插满就对了,完成组建双通道内存。3.2 错误内存插法2根内存的情况下,插入1和2插槽或者3和4插槽,为单通道。参考资料演示内存条双通道插法示范什么是内存单/双通道?双通道与单通道有什么区别?
2022年06月12日
1,173 阅读
0 评论
0 点赞
2022-05-18
羽毛球规则
1.发球/击球区域1.1 单打发球和击球区域1.2 双打发球和击球区域2.发球规则2.0 公共部分无论单双打,都需要按照对角线发/接球(具体看后面的图解),发球员和接球员需要在规定区域,发球员发球时两只脚都必须碰地,不可以踩线;发球时,球的位置要求低于发球员的腰部以及手腕,所以,你不能抛球直接“扣杀”;发球员只有一次发球机会,球碰到发球员的球拍或掉在地上即为发球结束(不过平时玩大家对新手都会比较照顾的);在双打中,发球员与接球员的队友所站位置不受限制,你们可以站在同一个侧,也可以左右分开站在两边。2.1 单打当发球方的分数为双数时(含0分),在右半场发球,否则在左半场发球;赢球的一方作为下一回合的发球方。2.2 双打相比单打而言,双打的规则复杂一些,不过也不难,可以用3句话总结:a. 分数为双数时在右半场发球,分数为单数时在左半场发球(跟单打一样);b. 赢球的一方作为下一回合的发球方;c. 发球方得分时两名队员才交换位置,其他情况位置不变。3.计分与换边3.1 计分一般按照按21分制计算,3局2胜定胜负;赢得一球算1分,先得21分一方胜一局;若打到20平,连续得2分一方取胜;最多打至30分,先得30分一方胜;下一局由上一局获胜一方发球开局。3.2 换边第一局比赛结束后,双方换边;若第二局后比分为1:1,双方换边;第三局领先一方达到11分时,双方换边。参考资料羽毛球规则
2022年05月18日
594 阅读
0 评论
0 点赞
2022-05-16
PC电源上供电接口定义
1.24Pin主板电源接头2.ATX 12V 4Pin及ATX 12V/EPS 12V 4+4Pin接头3.6Pin PCIe和6+2Pin PCIe接头PCIE电源接口的定义需要特别注意,其中6Pin接口的第2Pin悬空或者是接有黄色的线缆,第5Pin作为电压监测反馈,当监测到这一针处于接地,来判断接头已经接入。8Pin PCIE接口的情况类似,第4Pin和第6Pin也是作为电压监测,不传输电流。4.Molex四针外围设备(大4Pin)接口四针外围设备接口(Peripheral Power Connectors / Molex Connectors)俗称“大4Pin”或者“D4”(还有很多种叫法),它是电脑中现存的最古老的一种接口,由Molex公司制造和销售,也就被称为Molex接口。其中的接口所用的端子最大能传输13A电流,12V和5V就各可以传输156W和65W功率。但这种情况下会带来很大的压降,按最大安全电流5A来计算,12V和5V分别可以传输60W和25W功率。5.SATA电源接口SATA电源接口共有5组电压,每组电压对应3针,共15针。使用的是Molex 67581-0000端子,每个端子可以传输的电流为1.5A,所以12V、5V和3.3V各可以传输的电流都为4.5A,功率分别为54W、22.5W和14.85W。参考资料电脑、显卡电源6pin、8pin接口定义主板级电源上的几种主要供电接口介绍(24pin、8pin、4pin、SATA供电口等)电脑电源8pin和6+2pin一样吗?电源线那么多,如何区分?
2022年05月16日
5,697 阅读
6 评论
2 点赞
1
2
3
4