首页
壁纸
留言板
友链
更多
统计归档
Search
1
TensorBoard:训练日志及网络结构可视化工具
12,588 阅读
2
主板开机跳线接线图【F_PANEL接线图】
7,050 阅读
3
Linux使用V2Ray 原生客户端
6,161 阅读
4
移动光猫获取超级密码&开启公网ipv6
4,718 阅读
5
NVIDIA 显卡限制功率
3,134 阅读
好物分享
实用教程
linux使用
wincmd
学习笔记
mysql
java学习
nginx
综合面试题
大数据
网络知识
linux
放码过来
python
javascript
java
opencv
蓝桥杯
leetcode
深度学习
开源模型
相关知识
数据集和工具
模型轻量化
语音识别
计算机视觉
杂七杂八
硬件科普
主机安全
嵌入式设备
其它
bug处理
登录
/
注册
Search
标签搜索
好物分享
学习笔记
linux
MySQL
nvidia
typero
内网穿透
webdav
vps
java
cudann
gcc
cuda
树莓派
CNN
图像去雾
ssh安全
nps
暗通道先验
阿里云
jupiter
累计撰写
354
篇文章
累计收到
71
条评论
首页
栏目
好物分享
实用教程
linux使用
wincmd
学习笔记
mysql
java学习
nginx
综合面试题
大数据
网络知识
linux
放码过来
python
javascript
java
opencv
蓝桥杯
leetcode
深度学习
开源模型
相关知识
数据集和工具
模型轻量化
语音识别
计算机视觉
杂七杂八
硬件科普
主机安全
嵌入式设备
其它
bug处理
页面
壁纸
留言板
友链
统计归档
搜索到
354
篇与
的结果
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日
888 阅读
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日
688 阅读
0 评论
0 点赞
2022-06-15
Prometheus+Grafana:Linux设备群监控系统
1.Prometheus1.1. Prometheus简介Prometheus 是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。Promethus有以下特点:支持多维数据模型:由度量名和键值对组成的时间序列数据内置时间序列数据库TSDB支持PromQL查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义支持HTTP的Pull方式采集时间序列数据支持PushGateway采集瞬时任务的数据支持服务发现和静态配置两种方式发现目标支持接入Grafana1.2. Prometheus架构1.2.1. Prometheus Server主要负责数据采集和存储,提供PromQL查询语言的支持。包含了三个组件:Retrieval: 获取监控数据TSDB: 时间序列数据库(Time Series Database),我们可以简单的理解为一个优化后用来处理时间序列数据的软件,并且数据中的数组是由时间进行索引的。具备以下特点:大部分时间都是顺序写入操作,很少涉及修改数据删除操作都是删除一段时间的数据,而不涉及到删除无规律数据读操作一般都是升序或者降序HTTP Server: 为告警和出图提供查询接口1.2.2. 指标采集Exporters: Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取Pushgateway: 支持临时性Job主动推送指标的中间网关1.2.3. 服务发现Kubernetes_sd: 支持从Kubernetes中自动发现服务和采集信息。而Zabbix监控项原型就不适合Kubernets,因为随着Pod的重启或者升级,Pod的名称是会随机变化的。file_sd: 通过配置文件来实现服务的自动发现1.2.4. 告警管理通过相关的告警配置,对触发阈值的告警通过页面展示、短信和邮件通知的方式告知运维人员。1.2.5. 图形化展示通过PromQL语句查询指标信息,并在页面展示。虽然Prometheus自带UI界面,但是大部分都是使用Grafana出图。另外第三方也可以通过 API 接口来获取监控指标。2.Prometheus简单部署2.1 部署和配置prometheus(在监控中心布置)下载prometheus(网页下载地址:https://prometheus.io/download/)wget https://github.com/prometheus/prometheus/releases/download/v2.36.1/prometheus-2.36.1.linux-amd64.tar.gz tar -xvf prometheus-2.36.1.linux-amd64.tar.gz mv prometheus-2.36.1.linux-amd64 prometheus cd prometheus修改配置文件vim prometheus.yml# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] # node_exporter 监控数据采集 - job_name: 'node' static_configs: - targets: - "3090.inat.top:9100" - "v100.inat.top:9100" - "raspberry.inat.top:9100" - "agx.inat.top:9100" - "nx.inat.top:9100" - "nano.inat.top:9100"检查配置文件./promtool check config prometheus.yml启动测试./prometheus配置开机自启动sudo vim /etc/systemd/system/prometheus.service[Unit] Description=prometheus service After=network.target [Service] ExecStart=/software/prometheus/prometheus --config.file=/software/prometheus/prometheus.yml Restart=always RestartSec=20 TimeoutSec=300 User=root Group=root StandardOutput=journal StandardError=journal WorkingDirectory=/software/prometheus/ [Install] WantedBy=default.targetsudo systemctl daemon-reload sudo systemctl start prometheus.service sudo systemctl enable prometheus.servicesudo systemctl status prometheus.service2.2 部署Node-Exporter(在被监控的机器上布置)下载Node-Exporter(网页下载地址:https://prometheus.io/download/)wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz tar -xvf node_exporter-1.0.1.linux-amd64.tar.gz mv node_exporter-1.0.1.linux-amd64 node_exporter cd node_exporter创建monitor用户和组sudo groupadd -g 9100 monitor sudo useradd -g 9100 -u 9100 -s /sbin/nologin -M monitor修改对应文件夹的权限sudo chown -R monitor.monitor /software/node_exporter启动测试./node_exporter配置开机自启动sudo vim /etc/systemd/system/node_exporter.service[Unit] Description=node-exporter service After=network.target [Service] User=monitor Group=monitor KillMode=control-group Restart=on-failure RestartSec=60 ExecStart=/software/node_exporter/node_exporter [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl start node_exporter.service sudo systemctl enable node_exporter.servicesudo systemctl status node_exporter.service3.部署Grafana(在监控中心部署)下载Grafana(网页下载地址:https://grafana.com/grafana/download)sudo apt-get install -y adduser libfontconfig1 wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.5.5_amd64.deb sudo dpkg -i grafana-enterprise_8.5.5_amd64.deb设置开机自启动 sudo /bin/systemctl daemon-reload sudo /bin/systemctl start grafana-server sudo /bin/systemctl enable grafana-server sudo /bin/systemctl status grafana-server访问测试(默认用户名和密码均为admin)添加数据源添加dashbord查看dashbord参考资料Prometheus看完这些,入门就够了Prometheus 重启失败的教训Prometheus(普罗米修斯)监控Prometheus(普罗米修斯)监控系统(一)https://grafana.com/grafana/downloadhttps://prometheus.io/download/
2022年06月15日
958 阅读
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日
2,295 阅读
0 评论
0 点赞
2022-06-14
Bitwarden:搭建自己的密码管理服务器
0.应用背景各种杂七杂八的APP实在太多了,使用统一密码容易导致密码泄露,使用不同的密码容易记不住,将密码存在第三方也怕会发生数据泄露和服务商倒闭,因此自行考虑搭建密码管理工具1.搭建步骤1.1 安装docker宝塔在软件商店安装Docker管理器即可,其它使用命令行安装sudo apt update sudo apt install docker.io1.2 拉取 vaultwarden/server镜像[备注:老版bitwardenrs/server和手机APP不兼容]docker pull vaultwarden/server1.3 运行容器docker run -d --name vaultwarden -v /vw-data/:/data/ -p 60080:80 vaultwarden/server:latest备注:-v /vw-data/:/data/为必须,否则会出现如下 No persistent volume 报错:/--------------------------------------------------------------------\ | Starting Vaultwarden | | Version 1.30.5 | |--------------------------------------------------------------------| | This is an *unofficial* Bitwarden implementation, DO NOT use the | | official channels to report bugs/features, regardless of client. | | Send usage/configuration questions or feature requests to: | | https://github.com/dani-garcia/vaultwarden/discussions or | | https://vaultwarden.discourse.group/ | | Report suspected bugs/issues in the software itself at: | | https://github.com/dani-garcia/vaultwarden/issues/new | \--------------------------------------------------------------------/ [2024-03-21 13:46:40.290][vaultwarden][ERROR] No persistent volume! ######################################################################################## # It looks like you did not configure a persistent volume! # # This will result in permanent data loss when the container is removed or updated! # # If you really want to use volatile storage set `I_REALLY_WANT_VOLATILE_STORAGE=true` # 1.4 通过nginx创建网站1.5 开启SSL1.6 添加反向代理1.7 访问测试参考资料密码管理 Bitwarden服务端部署文档搭建自己的密码管理服务器 Bitwarden使用云服务器+docker搭建私有密码库Vaultwarden_docker安装vaultwarden-CSDN博客自建Vaultwarden (Bitwarden) 无法登陆问题的解决办法 - FREEZhao
2022年06月14日
719 阅读
0 评论
0 点赞
2022-06-13
ubuntu挂载新硬盘
1.定位新硬盘(base) 3090@3090:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 1.8T 0 disk /data sr0 11:0 1 1024M 0 rom sdc 8:32 0 14.6T 0 disk └─sdc1 8:33 0 14.6T 0 part sda 8:0 0 477G 0 disk ├─sda2 8:2 0 7.6G 0 part [SWAP] ├─sda3 8:3 0 468.4G 0 part / └─sda1 8:1 0 976M 0 part /boot/efi发现待挂载的硬盘为sdc12.硬盘格式化mkfs -t ext4 /dev/sdc1mke2fs 1.42.13 (17-May-2015) /dev/sdc1 contains a xfs file system Proceed anyway? (y,n) y Creating filesystem with 3906469376 4k blocks and 488308736 inodes Filesystem UUID: ed6952c9-b147-4cfb-b68f-d79e4fcecbb5 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 2560000000, 3855122432 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done3.挂载3.1 手动挂载挂载到挂载点/16tsudo mount /dev/sdc1 /16t查看挂载结果(base) 3090@3090:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 63G 0 63G 0% /dev tmpfs 13G 19M 13G 1% /run /dev/sda3 461G 31G 407G 8% / tmpfs 63G 180K 63G 1% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 63G 0 63G 0% /sys/fs/cgroup /dev/sdb 1.8T 9.2G 1.7T 1% /data /dev/sda1 975M 4.3M 970M 1% /boot/efi tmpfs 13G 64K 13G 1% /run/user/1000 tmpfs 13G 0 13G 0% /run/user/1001 /dev/sdc1 15T 9.1M 14T 1% /16t3.2 配置开机自动挂载查看UUID(base) 3090@3090:~$ sudo blkid /dev/sdc1 /dev/sdc1: UUID="ed6952c9-b147-4cfb-b68f-d79e4fcecbb5" TYPE="ext4" PARTLABEL="primary" PARTUUID="bbcf63f5-3927-41e8-abc6-ca9062aec08c"修改/etc/fstabsudo vim /etc/fstab# 在末尾添加如下内容 UUID=ed6952c9-b147-4cfb-b68f-d79e4fcecbb5 /16t auto defaults 0 0 参考资料Ubuntu中查看硬盘分区UUID的方法(所有Linux目录的解释)ubuntu 挂载硬盘指令fstab挂载参数
2022年06月13日
496 阅读
0 评论
0 点赞
2022-06-13
ubunt设置静态IP
1.查看网卡名,确定需要配置的目标网卡ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether d8:9e:f3:35:c3:66 brd ff:ff:ff:ff:ff:ff inet 10.1.9.50/24 brd 10.1.9.255 scope global enp0s25 valid_lft forever preferred_lft forever inet6 2001:da8:a012:2da:f3c5:dc14:1316:2268/64 scope global noprefixroute dynamic valid_lft 2591982sec preferred_lft 604782sec inet6 fe80::e49c:f19c:2e03:e014/64 scope link valid_lft forever preferred_lft forever 3: enp8s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether d8:9e:f3:35:c3:74 brd ff:ff:ff:ff:ff:ff2.对指定网卡enp0s25设置固定IPsudo vim /etc/network/interfaces增加如下内容auto enp0s25 # 设置自动启动enp0s25接口 iface enp0s25 inet static # 配置静态IP address 10.1.9.67 # IP地址 netmask 255.255.255.0 # 子网掩码 gateway 10.1.9.1 # 网关3.重启网络sudo /etc/init.d/networking restart参考资料ubuntu 查看网卡的网关_Ubuntu系统怎么设置静态ip?同样适用于深度系统的教程Ubuntu系统设置静态IP
2022年06月13日
427 阅读
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日
473 阅读
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日
468 阅读
0 评论
0 点赞
2022-06-10
leetcode|中等:剑指 Offer 35. 复杂链表的复制
1.题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]示例 3:输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,null]]示例 4:输入:head = [] 输出:[] 解释:给定的链表为空(空指针),因此返回 null。提示:-10000 <= Node.val <= 10000Node.random 为空(null)或指向链表中的节点。节点数目不超过 1000 。2. 题解2.1 思路分析思路1:哈希表法 利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。2.2 代码实现思路1:哈希表法/* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } */ class Solution { public Node copyRandomList(Node head) { if(head == null) return null; Node cur = head; // 保存头节点,用于遍历链表 Map<Node,Node> map = new HashMap<Node,Node>();//用于保存新旧节点之间的关系 // 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射 while (cur!=null){ map.put(cur,new Node(cur.val)); cur = cur.next; } // 补全next和random的映射关系 cur = head; while (cur!=null){ map.get(cur).next = map.get(cur.next); map.get(cur).random = map.get(cur.random); cur = cur.next; } return map.get(head); } }2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过0 ms41 MBJava2022/06/10 15:18添加备注参考资料https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof
2022年06月10日
658 阅读
0 评论
0 点赞
2022-06-10
leetcode|简单:剑指 Offer 24. 反转链表
1.题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 50002. 题解2.1 思路分析思路1: 本题比较简单直接上代码2.2 代码实现思路1/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) { if(head==null || head.next==null){ return head; } ListNode newHead = head.next; ListNode nextNewHead = newHead.next; head.next = null; while (nextNewHead!=null){ newHead.next = head; head = newHead; newHead = nextNewHead; nextNewHead = nextNewHead.next; } newHead.next = head; return newHead; } }思路1优化/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null,cur=head; while (cur!=null){ ListNode tmp = cur.next; cur.next=pre; pre=cur; cur = tmp; } return pre; } }2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过0 ms41 MBJava2022/06/10 11:15添加备注提交结果执行用时内存消耗语言提交时间备注通过0 ms40.8 MBJava2022/06/10 11:32添加备注参考资料https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof
2022年06月10日
597 阅读
0 评论
0 点赞
2022-06-10
leetcode|简单:剑指 Offer 06. 从尾到头打印链表
1.题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2] 输出:[2,3,1]限制:0 <= 链表长度 <= 100002. 题解2.1 思路分析统计链表长度申请数组并逐一填入链表元素反转数组2.2 代码实现/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { // 1.统计链表长度 int listLen = 0; ListNode tmp = head; while (tmp!=null){ listLen++; tmp = tmp.next; } // 2.申请数组并逐一填入链表元素 int[] res = new int[listLen]; tmp = head; int resIndex=0; while (tmp!=null){ res[resIndex++] = tmp.val; tmp = tmp.next; } // 3.反转数组 for (int i = 0; i < listLen/2; i++) { int tmpItem = res[i]; res[i] = res[listLen-1-i]; res[listLen-1-i] = tmpItem; } return res; } }2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过0 ms42.1 MBJava2022/06/10 10:30添加备注参考资料https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
2022年06月10日
493 阅读
0 评论
0 点赞
2022-06-10
leetcode|简单:剑指 Offer 09. 用两个栈实现队列
1.题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]示例 2:输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]提示:1 <= values <= 10000最多会对 appendTail、deleteHead 进行 10000 次调用2. 题解2.1 思路分析栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。双栈可实现列表倒序: 设有含三个元素的栈 A\=[1,2,3]和空栈 B\=[]。若循环执行 A元素出栈并添加入栈 B ,直到栈 A为空,则 A\=[], B\=[3,2,1],即 栈 B 元素实现栈 A 元素倒序 。利用栈 B 删除队首元素: 倒序后,B 执行出栈则相当于删除了 A 的栈底元素,即对应队首元素。可以设计栈 A 用于加入队尾操作,栈 B 用于将元素倒序,从而实现删除队首元素。加入队尾 appendTail()函数: 将数字 val 加入栈 A 即可。删除队首deleteHead()函数: 有以下三种情况。当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。否则,当 A 为空: 即两个栈都为空,无元素,因此返回 −1。否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。2.2 代码实现思路1:class CQueue { Stack<Integer> A,B; public CQueue() { A = new Stack<Integer>(); B = new Stack<Integer>(); } public void appendTail(int value) { A.push(value); } public int deleteHead() { if(!B.empty()){ return B.pop(); }else if(A.empty()){ return -1; }else { // 把栈B中的元素全部倒序移入栈A while (!A.empty()){ B.push(A.pop()); } return B.pop(); } } } /** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过72 ms47.8 MBJava2022/06/09 10:30添加备注参考资料https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcofhttps://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-2/
2022年06月10日
536 阅读
0 评论
0 点赞
2022-06-09
leetcode|简单:剑指 Offer 30. 包含min函数的栈
1.题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.提示:各函数的调用总次数不超过 20000 次2. 题解2.1 思路分析思路1: 使用辅助栈来维护最小值 只需要对现有的栈功能添加一个用于维护最小值的辅助栈minStack(普通栈) 每次push的时候都往minStack中push当前的最小值(由minStack.peek()和待push元素x得出) 每次pop的时候minStack也执行相应的pop 则每次调用min的时候只需要返回minStack.peek()即可2.2 代码实现思路1:使用辅助栈来维护最小值import java.util.Stack; class MinStack { Stack<Integer> stack; Stack<Integer> minStack; /** initialize your data structure here. */ public MinStack() { stack = new Stack<Integer>(); minStack = new Stack<Integer>(); } public void push(int x) { // push更新min if(minStack.empty()) { minStack.push(x); }else { int min = minStack.peek()<x?minStack.peek():x; minStack.push(min); } stack.push(x); } public void pop() { // pop更新min minStack.pop(); stack.pop(); } public int top() { return stack.peek(); } public int min() { return minStack.peek(); } } /** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.min(); */2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过14 ms43.4 MBJava2022/06/09 10:54添加备注参考资料https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof
2022年06月09日
622 阅读
0 评论
0 点赞
2022-06-08
leetcode|困难:4. 寻找两个正序数组的中位数
1.题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。示例 1:输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5提示:nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000$-10^6$ <= nums1[i], nums2[i] <= $10^6$2. 题解2.1 思路分析思路1: 确定中位数的组成部分midLeft和midRight,总数为奇数的midLeft=midRight 通过利用寻找第k小的数的算法来锁定midLeft和midRight寻找第k小的数算法由于数列是有序的,其实我们完全可以一半儿一半儿的排除。假设我们要找第 k 小数,我们可以每次循环排除掉 k/2 个数。看下边一个例子。假设我们要找第 7 小的数字。我们比较两个数组的第 k/2 个数字,如果 k 是奇数,向下取整。也就是比较第 3 个数字,上边数组中的 4 和下边数组中的 3,如果哪个小,就表明该数组的前 k/2 个数字都不是第 k 小数字,所以可以排除。也就是 1,2,3 这三个数字不可能是第 7 小的数字,我们可以把它排除掉。将 1349和 45678910 两个数组作为新的数组进行比较。更一般的情况 A[1] ,A[2] ,A[3],A[k/2] ... ,B[1],B[2],B[3],B[k/2] ... ,如果 A[k/2]<B[k/2] ,那么A[1],A[2],A[3],A[k/2]都不可能是第 k 小的数字。A 数组中比 A[k/2] 小的数有 k/2-1 个,B 数组中,B[k/2] 比 A[k/2] 小,假设 B[k/2] 前边的数字都比 A[k/2] 小,也只有 k/2-1 个,所以比 A[k/2] 小的数字最多有 k/1-1+k/2-1=k-2个,所以 A[k/2] 最多是第 k-1 小的数。而比 A[k/2] 小的数更不可能是第 k 小的数了,所以可以把它们排除。橙色的部分表示已经去掉的数字。由于我们已经排除掉了 3 个数字,就是这 3 个数字一定在最前边,所以在两个新数组中,我们只需要找第 7 - 3 = 4 小的数字就可以了,也就是 k = 4。此时两个数组,比较第 2 个数字,3 < 5,所以我们可以把小的那个数组中的 1 ,3 排除掉了。我们又排除掉 2 个数字,所以现在找第 4 - 2 = 2 小的数字就可以了。此时比较两个数组中的第 k / 2 = 1 个数,4 == 4,怎么办呢?由于两个数相等,所以我们无论去掉哪个数组中的都行,因为去掉 1 个总会保留 1 个的,所以没有影响。为了统一,我们就假设 4 > 4 吧,所以此时将下边的 4 去掉。由于又去掉 1 个数字,此时我们要找第 1 小的数字,所以只需判断两个数组中第一个数字哪个小就可以了,也就是 4。所以第 7 小的数字是 4。我们每次都是取 k/2 的数进行比较,有时候可能会遇到数组长度小于 k/2的时候。此时 k / 2 等于 3,而上边的数组长度是 2,我们此时将箭头指向它的末尾就可以了。这样的话,由于 2 < 3,所以就会导致上边的数组 1,2 都被排除。造成下边的情况。由于 2 个元素被排除,所以此时 k = 5,又由于上边的数组已经空了,我们只需要返回下边的数组的第 5 个数字就可以了。从上边可以看到,无论是找第奇数个还是第偶数个数字,对我们的算法并没有影响,而且在算法进行中,k 的值都有可能从奇数变为偶数,最终都会变为 1 或者由于一个数组空了,直接返回结果。所以我们采用递归的思路,为了防止数组长度小于 k/2,所以每次比较 min(k/2,len(数组) 对应的数字,把小的那个对应的数组的数字排除,将两个新数组进入递归,并且 k 要减去排除的数字的个数。递归出口就是当 k=1 或者其中一个数字长度是 0 了。2.2 代码实现思路1:利用第k小的数来寻找中位数class Solution { private int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) { int len1 = end1 - start1 + 1; // 计算数组1的剩余部分的长度 int len2 = end2 - start2 + 1; // 计算数组2的剩余部分的长度 // 递归出口 // 让 len1 的长度小于 len2,这样就能保证如果有数组空了,一定是 len1 if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k); // 当其中一个数组都消耗完 if (len1 == 0) return nums2[start2 + k - 1]; // k=1的边界情况 if (k == 1) return Math.min(nums1[start1], nums2[start2]); // 迁移探索k/2 int i = start1 + Math.min(len1, k / 2) - 1; int j = start2 + Math.min(len2, k / 2) - 1; // 缩小探索空间 if (nums1[i] > nums2[j]) { return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1)); } else { return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1)); } } public double findMedianSortedArrays(int[] nums1, int[] nums2) { int nums1Len = nums1.length; int nums2Len = nums2.length; // 计算中位数的位置 int midLeftIndex = (nums1Len + nums2Len -1) / 2; int midRightIndex = (nums1Len + nums2Len) / 2; // 用寻找第k小的数的算法来找到 中位数的midLeft 和 midRight int midLeft = getKth(nums1, 0, nums1Len - 1, nums2, 0, nums2Len - 1, midLeftIndex+1); int midRight = getKth(nums1, 0, nums1Len - 1, nums2, 0, nums2Len - 1, midRightIndex+1); // 计算中位数 double res = (midLeft+midRight) * 0.5; return res; } public static void main(String[] args) { Solution solution = new Solution(); int[] nums1 = {1,2}; int[] nums2 = {4}; Double res =solution.findMedianSortedArrays(nums1,nums2); System.out.println(res); } }2.3 提交结果提交结果执行用时内存消耗语言提交时间备注通过1 ms42.4 MBJava2022/06/08 21:12添加备注参考资料https://leetcode.cn/problems/median-of-two-sorted-arrayshttps://leetcode.cn/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/
2022年06月08日
633 阅读
0 评论
0 点赞
1
...
7
8
9
...
24