阅读1.3.1.7算术表达式求值感受

本文介绍了一种使用两个栈解决算数字符串求值问题的方法,并分享了从这一过程中获得的数据结构与算法的启示。文章强调了面对复杂问题时,应该从最简单的情况出发考虑解决方案。







用算法来实现算数字符串求值这个问题看似复杂,我刚开始的思路是对每个算数表达式中的子算数表达式统计其左右两端的括号的个数,括号个数越多,则计算优先级越高。但是大师用简单的两个栈就实现了看似复杂的功能。所以给了我我在算法与数据结构方面的启示:

算法与数据结构,本质上是逻辑思维,也就是数学。处理数学问题,用欧拉那句名言,一切从定义触发。遇到复杂问题,先从最简单的角度思考解决问题的方式,如上文的问题。任何问题基本上都是算法与数据结构的推演变换,而数据结构的类型种类也万变不离其中。算法是依托于数据结构的,所以我们遇到问题后,首先从数据结构上思考用何种数据能最合适的解决问题,再配合算法再思考。而不是一上来就将问题复杂化。越是复杂的东西,他们原理和本质越单一,要学会这样思考问题的方式。

system       OID 描述 备注 请求方式 .1.3.6.1.2.1.1.3.0 监控时间 sysUptime GET .1.3.6.1.2.1.1.5.0 获取机器名 SysName GET interface       OID 描述 备注 请求方式 .1.3.6.1.2.1.2.1.0 网络接口的数目 IfNumber GET .1.3.6.1.2.1.2.2.1.1 每个接口对应一个唯一的值 ifIndex WALK .1.3.6.1.2.1.2.2.1.2 网络接口信息描述 IfDescr WALK .1.3.6.1.2.1.2.2.1.3 网络接口类型 IfType WALK .1.3.6.1.2.1.2.2.1.4 接口发送和接收的最大IP数据报[BYTE] IfMTU WALK .1.3.6.1.2.1.2.2.1.5 接口当前带宽[bps] IfSpeed WALK .1.3.6.1.2.1.2.2.1.6 接口的物理地址 IfPhysAddress WALK .1.3.6.1.2.1.2.2.1.7 用于配置接口的状态(可读)up(1),down(2),testing(3) ifAdminStatus WALK .1.3.6.1.2.1.2.2.1.8 提供接口的当前工作状态up(1),down(2),testing(3) ifOperStatus WALK .1.3.6.1.2.1.2.2.1.9 接口转为当前工作状态时的sysUpTime值 ifLastChange WALK .1.3.6.1.2.1.2.2.1.10 在接口上收到的总字节数 ifInOctets WALK .1.3.6.1.2.1.2.2.1.11 发送到高层协议上的unicast (单点发送)包的总数目 ifInUcastPkts WALK .1.3.6.1.2.1.2.2.1.12 发送到高层协议上的广播/ 多点发送包的总数目 ifInNUcastPkts WALK .1.3.6.1.2.1.2.2.1.13 由于资源紧张导致丢弃的包的数目。如果一个接口的包丢弃率较高,则表示该设备存在拥塞问题 ifInDiscards WALK .1.3.6.1.2.1.2.2.1.14 该接口累计接收到的错误包数 ifInErrors WALK .1.3.6.1.2.1.2.2.1.15 接口接收到的,由于上层协议未知或不支持的原因而丢弃的包 ifInUnknownProtos WALK .1.3.6.1.2.1.2.2.1.16 从该接口上发送的字节总数 ifOutOctets WALK .1.3.6.1.2.1.2.2.1.17 请求传输到一个子网单点广播地址包的总数(包括发送的包和丢弃的包) ifOutUcastPkts WALK .1.3.6.1.2.1.2.2.1.18 请求发送的广播/多点发送包的总数(包括发送的包和丢弃的包) ifOutNUcastPkts WALK .1.3.6.1.2.1.2.2.1.19 由于资源局限而导致丢弃的发出包的总数。高丢包率,表示需要为该接口分配更多的缓冲区空间。 ifOutDiscards WALK .1.3.6.1.2.1.2.2.1.20 由于出错而导致丢弃的发出包的总数目。高错误率表示存在硬件问题。 ifOutErrors WALK .1.3.6.1.2.1.2.2.1.21 发送队列长度,单位为包个数 ifOutQLen WALK .1.3.6.1.2.1.2.2.1.22 mib标识符,该mib描述该接口的物理层技术。 ifSpecific WALK Cpu 1.3.6.1.4.1.49659.2.1.1.1.4.1.1 Cpu使用率 cpCpuUsage 1.3.6.1.4.1.49659.2.1.1.1.4.1.2 Cpu上限阀值 cpCpuRisingThreshold 1.3.6.1.4.1.49659.2.1.1.1.4.1.3 Cpu下限阀值 cpCpuFallingThreshold 1.3.6.1.4.1.49659.2.1.1.1.4.1.4 Cpu告警开关 cpCpuTrapEnable Memory 1.3.6.1.4.1.49659.2.1.1.1.4.2.1 内存使用率 cpMemoryUsage 1.3.6.1.4.1.49659.2.1.1.1.4.2.2 内存上限阀值 cpMemoryRisingThreshold 1.3.6.1.4.1.49659.2.1.1.1.4.2.3 内存下限阀值 cpMemoryFallingThreshold 1.3.6.1.4.1.49659.2.1.1.1.4.2.4 内存告警开关 cpMemoryTrapEnable 告警       1.3.6.1.6.3.1.1.5.3 当端口down时,代理发出down告警报文 linkDown \ 1.3.6.1.6.3.1.1.5.4 当端口up时,代理发出up告警报文 linkUp \ 1.3.6.1.6.3.1.1.5.1154 电源1断开 Power1off 1.3.6.1.6.3.1.1.5.1156 电源1连接 Power1on 1.3.6.1.6.3.1.1.5.1155 电源2断开 Power2off 1.3.6.1.6.3.1.1.5.1157 电源2连接 Power2on 1.3.6.1.4.1.49659.2.1.1.2.1.1.1 当cpu使用率大于上限阀值的时候告警 cpnCpuRisingThresholdTrap 1.3.6.1.4.1.49659.2.1.1.2.1.1.2 当cpu的使用率低于下限阀值的时候告警 cpnCpuFallingThresholdTrap 1.3.6.1.4.1.49659.2.1.1.2.1.2.1 当内存使用率大于告警阀值的时候,发出告警 cpnMemoryRisingThresholdTrap 1.3.6.1.4.1.49659.2.1.1.2.1.2.2 当内存的使用率低于阀值的时候发出告警 cpnMemoryFallingThresholdTrap
最新发布
11-06
### 系统相关OID - **.1.3.6.1.2.1.1.1.0(SysDesc)**:用于获取系统的基本信息,如设备的型号、操作系统版本等。使用方法是通过SNMP的GET请求,例如在命令行中使用`snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.1.1.0` ,在Java代码中可以使用SNMP4J库按照类似上一次回答的方式构造PDU并发送请求来获取该OID对应的值[^5]。 - **.1.3.6.1.2.1.1.3.0(sysUptime)**:用于监控系统的运行时间。同样通过SNMP的GET请求获取,在监控系统中可以定期获取该值来了解系统的连续运行时长。 - **.1.3.6.1.2.1.1.4.0(sysContact)**:指向系统的联系人信息,如管理员的联系方式。使用GET请求获取该信息,可用于在系统出现问题时联系相关人员。 - **.1.3.6.1.2.1.1.5.0(SysName)**:用于获取机器名,方便识别设备。通过GET请求获取该OID的值。 - **.1.3.6.1.2.1.1.6.0(SysLocation)**:表示机器所在的位置,通过GET请求获取,有助于在物理层面定位设备。 - **.1.3.6.1.2.1.1.7.0(SysService)**:提供机器所提供的服务信息,使用GET请求查询。 ### 接口相关OID 接口相关的OID通常用于监控网络接口的状态和性能。例如,在MIB-II中,`.1.3.6.1.2.1.2.2` 分支下有许多与接口相关的OID。 - **.1.3.6.1.2.1.2.2.1.8(ifOperStatus)**:用于获取接口的操作状态,值可以表示接口是up(正常工作)还是down(故障)等。使用SNMP的GET或WALK请求,若使用WALK请求可以获取所有接口的状态信息。在命令行中可以使用`snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.2.2.1.8` 。 ### CPU相关OID - 在华三交换机上,可通过特定OID获取CPU利用率。在Linux系统中,如引用中提到可以使用`snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.2021.11.11.0` 来获取空闲的CPU信息。对于监控CPU利用率,通常会定期使用GET请求获取相关OID的值,当CPU利用率超过设定的阈值时触发告警。 ### 内存相关OID - 在Windows操作系统中,未直接提供获取磁盘容量的OID,但可以通过组合多个OID来获取内存相关信息。在Linux系统中也有相应的OID用于获取内存使用情况。例如可以通过特定OID获取内存的空闲大小、已使用大小等信息,使用GET请求定期获取这些值,当内存使用率超过阈值时进行告警。 ### 告警相关OID 在华三交换机上,使用SNMP获取CPU利用率、内存利用率、PING延迟和PING丢包告警信息时,需要通过特定的OID来查询这些指标。当通过SNMP获取到的指标值超过预先设定的阈值时,就会触发告警机制。例如,对于CPU利用率,当获取到的CPU利用率超过设定的80%阈值时,监控系统就会发出告警通知管理员[^2]。 ### 代码示例(使用SNMP4J获取多个OID信息) ```java import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.event.ResponseEvent; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; import java.io.IOException; public class SnmpMultiGetExample { public static void main(String[] args) { String targetAddress = "udp:192.168.1.100/161"; String community = "public"; String[] oids = {".1.3.6.1.2.1.1.1.0", ".1.3.6.1.2.1.1.3.0"}; try { DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping(); Snmp snmp = new Snmp(transport); transport.listen(); Address targetAddr = GenericAddress.parse(targetAddress); CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString(community)); target.setAddress(targetAddr); target.setRetries(2); target.setTimeout(1500); target.setVersion(SnmpConstants.version2c); PDU pdu = new PDU(); for (String oid : oids) { pdu.add(new VariableBinding(new OID(oid))); } pdu.setType(PDU.GET); ResponseEvent event = snmp.send(pdu, target); if (event != null) { PDU response = event.getResponse(); if (response != null) { int errorStatus = response.getErrorStatus(); int errorIndex = response.getErrorIndex(); String errorStatusText = response.getErrorStatusText(); if (errorStatus == PDU.noError) { System.out.println(response.getVariableBindings()); } else { System.out.println("Error: " + errorStatusText + " at index: " + errorIndex); } } else { System.out.println("No response received."); } } else { System.out.println("Request timed out."); } snmp.close(); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值