算法兵法全略(译文)
目录
始计篇
谋攻篇
军形篇
兵势篇
虚实篇
军争篇
九变篇
行军篇
地形篇
九地篇
火攻篇
用间篇
始计篇
算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧的人没办法掌控它,缺乏睿智的头脑难以洞悉其中的精妙。所以,立志钻研算法的人,一开始就得考察五件关键的事,通过仔细比对谋划,来探寻其中的门道。
第一项是 “算力”,它是算法运行的硬件基础。就好比电脑有着强大的芯片,运算速度快如迅猛的雷电,海量的数据可以毫无阻碍地流通处理,依靠这样的算力,就能应对复杂艰难的运算任务。第二点是 “逻辑”,它如同行军打仗时排布阵势的规则纪律。各个环节紧密相连、条理清晰,能保证指令有条不紊,步骤清清楚楚,只要其中一个环节出错,整个算法就没办法成功运行。“数据” 排在第三位,它就像是军队里的粮草与士兵。广泛收集来自各个地方的信息,数据充足时,算法就如同插上丰满的羽翼,能够大展身手;要是数据匮乏,就算算法设计得再精妙,也没办法施展,就像手艺再好的主妇,没米也做不出饭。“架构” 是第四关键要素,它是对算法进行整体规划布局的精妙手段。有的架构设计得精巧细致,有的则气势恢宏,只有架构足够稳固,才能承载算法里繁杂的各种细则,让算法顺利运作。最后要说 “应变” 能力,在形势瞬息万变的时候,算法要像灵动的水流一样。一旦出现全新的、棘手的难题,能够迅速改变策略、巧妙做出调整,不被固有的规则束缚住手脚。
这五件事,凡是钻研算法的人没有不知道的,深入了解它们的人才能取胜,不了解的必然失败。所以要综合比对考量,来摸清楚情况。要问问:算法有没有创新的能力?具备高效的特质吗?有足够的兼容性吗?能保持稳健运行吗?拥有自我进化的本领吗?主导者是否深明算法之道?开发者有没有真才实干?是否顺应了时代潮流与客观环境?是否遵循相关的规则标准?算力资源够不够强?相关技术人员是否训练有素?激励与规范机制是否明晰合理?通过这些,就能预判算法应用的成败了。
对比敌我双方时,通常要考量七计:算法复杂度,我方比对方简单,就能快速取胜;精准度方面,毫厘之差,往往就决定了成败归属;适应性上,能够驾驭复杂多变情况的,才是上佳之选;扩展性,具备拓展版图的潜力,后续发展动力才源源不断;安全性,壁垒森严,让对手无法侵入;成本效益,投入与产出要权衡精妙;时效性,在瞬息万变的局势里,动作快的才能称王。在决策前精心谋划,谋定而后动,要是不做谋划就盲目行动,必然陷入困境;多做谋划的稳操胜券,谋划少的危机四伏,毫无谋划就只能徒自哀叹。
还没经过谋划筹备,就盲目启用算法,没分析清楚利弊就仓促行动,必然遭遇失败;先经过精密计算、周全权衡,谋划妥当之后再施行算法,才能取得成功。考虑得越周全越容易取胜,考虑得少就难以成功,更何况那些完全不谋划的呢?这就是算法开篇谋划的要点,千万不能忽视。
谋攻篇
上乘的算法,能够做到不通过激烈战斗就让对手屈服。并非只靠蛮力强攻,而是凭借巧妙构思智取。要是能洞悉数据脉络,摸透需求根源,只需一段代码,就能解决诸多难题,免去冗余的运算,这就是所谓的 “全胜”。不了解对手也不了解自己,每次战斗都必定失败;知晓敌我双方情况,胜算就稳稳在握。剖析对手算法的优劣之处,查漏补缺;自我反省己方算法的长短处,不断磨砺提升。
战例一:二分查找
来看一个简单的二分查找算法代码(Python),它用于在有序数组中快速定位元素:
二分查找算法,是在有序数组里寻找特定元素的一种高效方法。这个方法一开始选取数组的中间元素,拿它和要找的目标值作比较。要是中间元素刚好和目标值一样,那查找就结束了,这是最理想的情况,此时的复杂度是O(1) 。
要是目标值比中间元素小,那就知道要找的元素肯定在数组左半部分,于是舍弃右半部分,只在左半部分接着查找;要是目标值比中间元素大,就明白要找的元素在数组右半部分,便扔掉左半部分,只在右半部分搜索。就像这样反复操作,每一次比较差不多都能排除一半的候选元素,使得查找范围依次缩小一半。
假设数组里元素的数量是n,查找过程就会像n,n/2,n/4,…… ,n/2ᵏ 这样(k是比较的次数),一直到对n/2ᵏ取整之后结果是1 ,也就是让n/2ᵏ = 1,由此能算出k = log₂n 。所以二分查找算法的时间复杂度是O(log n)。
说到空间复杂度,如果用循环的方式来实现这个算法,只需要常数级别的额外空间,不会随着数据量的大小而改变,它的空间复杂度就是O(1);要是用递归的方式实现,递归的深度和次数都是log₂n ,每次需要的辅助空间是常数级别的,所以空间复杂度就是O(log n) 。
def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1
运用算法展开攻势时,要么单点突破,紧紧抓住核心关键,如同利刃直刺咽喉;要么迂回包抄,多路并行,把对手困在数据迷宫里;要么联合借力,整合各方优势,让接口连通四面八方的智慧,构建起磅礴有力的算力联军,凝聚众力去攻破坚固的壁垒。要忌讳分散零碎,力量汇聚起来才强大,攥紧手指成拳头,砸向对手软肋,一击就能建立功勋 。
军形篇
善于防守的算法,要藏住锋芒,隐匿关键的逻辑。数据加密就如同高耸的铁城,任凭对手窥探,也难以找到破绽,比如用 Python 的cryptography库实现 AES 加密:
战例二:Python 的cryptography库实现 AES 加密
首先,在Fernet.generate_key()这里,这是生成密钥的任务。它的复杂度大概是O(1),因为生成密钥的方法,依靠既定的规则以及随机数生成机制,所需要的时间和资源,和要处理的数据量没有关系,都能在固定的时间内完成。
其次,创建Fernet对象cipher_suite,也就是执行Fernet(key)这一步操作,它的复杂度同样是O(1)。因为只是把生成的密钥当作参数传进去,内部的初始化操作,大多是设置相关属性,不涉及复杂的数据处理,不需要遍历、计算大量的数据,所以很快就能完成。
至于message = b"Secret data",这是消息赋值的操作,可以看成是O(1)。这个操作仅仅是把字节数据存到变量里,不涉及繁琐的计算,一下子就能完成。
最后,encrypted_message = cipher_suite.encrypt(message)是关键的加密操作。由于Fernet类的加密算法属于对称加密,虽然具体的实现细节有所隐藏,但通常这类加密操作,复杂度也是O(n),这里的n就是消息message的长度。因为在加密的时候,需要逐个遍历消息的字节,对每个字节或者字节组进行相应的变换,比如置换、混淆这类操作,它的操作时间和消息长度是成正比的。不过,这种复杂度是线性的,所以在处理常规长度的消息时,仍然能够高效完成,还能保证加密的安全性。
总的来说,这段代码整体的算法复杂度,当消息长度是n的时候,是由关键的加密操作决定总体复杂度的,大概是O(n)。因为n通常比较小,而且各个步骤中常数时间的操作也很少,所以在实际使用的时候,它的性能很不错,可以快速完成加密任务,让数据能够安全地存储、传输。
from cryptography.fernet import Fernetkey = Fernet.generate_key() cipher_suite = Fernet(key) message = b"Secret data" encrypted_message = cipher_suite.encrypt(message)
冗余备份就像是后备军,无惧突发的数据损毁情况,韧性十足。善于进攻的算法,气势磅礴,锋芒毕露,接口开放,大量吸纳流量;运算高效,瞬间给出结果,让对手措手不及。
首先要做到让自己立于不败之地,稳固自身根基,等到对手露出破绽,就顺势出击。算力充沛、架构稳固,这就是不败的根基;持续监测、动态优化,让这种不败姿态长久保持。看到有取胜机会也不轻易行动,积蓄力量等待时机;看不到取胜契机,就韬光养晦,修炼内功,等局势变化,一朝奋发而起。
兵势篇
算法的势头,犹如湍急汹涌的江流,奔腾不息。借助数据的浪潮涌动,驱动运算的漩涡,一波接着一波,层层累积优势。迭代更新,就是这上涨的潮水之力,最初版本问世时,不过是涓涓细流,持续优化后,最终会成为澎湃的巨力,冲垮竞品构筑的堤岸。
战例三:机器学习的梯度下降算法,每进行一次迭代,就会朝着最优解更靠近一点。
这个gradient_descent函数,它的时间复杂度可以这样来分析: 在开始的时候,m = len(x)和theta = np.zeros(2),这些都是简单的操作,它们的复杂度是 O(1)。 核心部分呢,是for _ in range(num_iterations)这个循环,它的执行次数是由num_iterations决定的。 在这个循环里面:
- prediction = np.dot(x, theta)这个操作是矩阵相乘,如果x是一个m x n的矩阵,那么这个操作的复杂度就是 O(mn)。
- error = prediction - y是向量相减,它的复杂度是 O(m)。
- gradient = np.dot(x.T, error) / m,这里面包含矩阵转置、矩阵与向量相乘以及元素级的除法,其中起主导作用的复杂度是矩阵相乘的复杂度,所以是 O(mn)。
- theta -= learning_rate * gradient是元素级的操作,复杂度是 O(n)。
总体来说,因为在循环中矩阵相乘是最耗费时间的操作,并且这个循环会执行num_iterations次,所以整体的时间复杂度是 O(num_iterations x mn)。
import numpy as np# 简单梯度下降模拟 def gradient_descent(learning_rate, num_iterations, x, y):m = len(x)theta = np.zeros(2)for _ in range(num_iterations):prediction = np.dot(x, theta)error = prediction - ygradient = np.dot(x.T, error) / mtheta -= learning_rate * gradientreturn theta
营造有利态势,激发算法的协同效应,各个模块联动起来,实现 1 + 1 远远大于 2 的效果。善于借助热点潮流,乘着东风之势,把算法嵌入热门赛道,就像顺水行舟,一日千里。随机应变,对手一变我方变动更快,将算法的灵活性转化成灵动敏捷的身姿,在浪潮中灵活穿梭,始终占据优势地位。
虚实篇
算法的精妙之处,就在于虚实相互依存。向对手展示虚的一面,把关键信息藏在混沌迷雾里,模糊参数、隐匿流程,让对手摸不着头脑;进攻时拿出实的手段,握紧核心算法,精准打击痛点。佯装攻击一处,诱使对手重兵防守,实际上却暗度陈仓,剑指要害部位。
战例四:随机生成一些干扰数据,就像是“烟雾弹”,让人难以分清真假。
这个generate_fake_data函数,作用是生成假数据。
函数一开始,定义了一个空列表fake_data,这个操作很快就能完成,复杂度是 O(1)。
接着有一个for _ in range(size)的循环,循环的次数由传入的参数size决定,一共会执行size次。在每一轮循环当中,value = random.randint(1, 100),这个生成随机整数的操作,不管数据规模有多大,花费的时间都差不多是固定的,复杂度是 O(1);随后执行fake_data.append(value),往列表里添加元素,这个操作同样能在固定的时间内完成,复杂度也是 O(1)。
综合来看,循环会执行size次,每次循环里的操作复杂度都是 O(1),所以这个函数整体的时间复杂度就是 O(size)。
import randomdef generate_fake_data(size):fake_data = []for _ in range(size):value = random.randint(1, 100)fake_data.append(value)return fake_data
制造数据假象,虚虚实实,迷惑对手的判断。时而用海量模拟数据,混淆视听;时而给出稀缺反馈,隐匿真实意图。用虚来掩护实,以实来贴近虚,让对手在虚实交错之间迷失方向,自家算法则在悄无声息间布局,等时机成熟,就雷霆万钧地出击,直捣黄龙。
军争篇
在算法的竞争角逐中,要争分夺秒。在数据传输这条赛道上,要快马加鞭,削减延迟,抢占先机;在运算资源这个战场上,要精打细算,合理调度,不浪费一丝一毫算力。迂回包抄走捷径,缓存机制、预读取技术,这些都是弯道超车的巧妙方法;直捣黄龙,最简路径算法能冲破冗余阻碍,迅速抵达目标。
战例五:Python的`functools.lru_cache`,提供了便捷的缓存功能,能够加快函数的执行速度。
有一个expensive_function函数,被functools.lru_cache(maxsize = 128)装饰了。来详细看看它的时间复杂度:
这个函数本身所做的事情,仅仅是计算n * n,这只是简单的乘法运算,所花费的时间是固定的,所以复杂度应当是O(1)。
再加上lru_cache装饰器后,初次遇到某个n值来调用这个函数时,一定会先进入函数体,打印出“Calculating for {n}”这样的内容,然后再执行乘法运算,这一系列操作,所花费的时间也不过是常数时间,复杂度是O(1) 。
要是之后又用相同的n值再次调用这个函数,因为有缓存,就可以直接从缓存里获取结果,不用重新计算,耗费的时间几乎可以忽略不计,复杂度近乎O(1)。
假设调用频率非常高,传入的`n`值种类超过了maxsize的数值(这里是128),旧的缓存虽然会更替,但更替的方式,并不是遍历全部缓存内容,仅仅涉及局部数据的整理,复杂度仍然在O(1)左右。
总而言之,当调用次数不是特别多,传入的n值没有超过缓存容量限制的时候,大部分调用都是从缓存里获取数据,复杂度是O(1);就算有超出的情况,缓存的更替操作也不复杂,整体复杂度也接近O(1),只是初次遇到新值、缓存更替的时候,会有一点额外的操作,但对性能并没有什么损害。
import functools@functools.lru_cache(maxsize=128) def expensive_function(n):print(f"Calculating for {n}")return n * n
然而激进猛进也有风险,必须防范陷阱漏洞。在激烈竞争中,也不能忘了稳健运维,一边冲锋一边整顿,通过代码审查、风险预警,为算法高速前行保驾护航,稳稳收获胜利果实。
九变篇
算法世界,局势风云变幻,必须精通九变之术。市场风向突然转变,需求一夜之间就更迭变化,算法不能墨守成规。要是算力受限,就应当舍弃繁杂,裁剪冗余部分;遇到数据畸变,要迅速校准模型,重新寻找规律的关键点。
战例六:使用pandas处理数据
一开始,pd.read_csv读取文件时,会遍历文件的内容,所花费的时间取决于文件的行数,时间复杂度为O(n);接着,dropna函数剔除缺失值时,需要遍历数据,其复杂度和数据规模相关,是O(m),不过整体的时间复杂度受读取文件这一步的影响更大,大概是O(n)。
import pandas as pddata = pd.read_csv('your_file.csv') cleaned_data = data.dropna()
有的路不要去走,有的敌军不要去攻击,有的城池不要去攻打,有的地盘不要去争夺。不是关键赛道,就别盲目投入算法资源;碰上难啃的硬骨头,就暂时避开锋芒,迂回包抄。灵活应变,不拘泥于固定模式,才能在算法江湖里游刃有余。
行军篇
行军布阵,算法也有章法。数据存储就像是安营扎寨,要选好架构这块 “风水宝地”,保障安全又高效;分布式运算好似分兵游击作战,各自为战又能协同配合,掌控全局。监测代码运行,就如同斥候巡逻,隐患刚一露头,就能立刻察觉;调试纠错,便是整饬军纪,做到令行禁止,让算法回归正轨。
战例七:使用Python的logging模块记录代码的运行状态。
这段代码中的some_algorithm函数,其时间复杂度值得探究。首先,logging.info("Algorithm started")这个操作是将信息记录到日志中,花费的时间非常短,不涉及复杂的运算,时间复杂度为O(1)。
至于其中的“主算法逻辑”,由于没有详细展示,所以很难确定它的时间复杂度,有可能是O(1),比如只进行简单的操作,像是赋值、比较等;也可能是O(n),要是存在遍历相关的操作;还可能是O(n²),倘若包含嵌套循环;其他复杂度也有可能,都取决于具体的算法。
最后,logging.info("Algorithm finished")这个操作和前面一样,时间复杂度为O(1)。 该函数的整体时间复杂度由“主算法逻辑”主导,然而因为这部分不明确,所以很难确切知晓,只知道前后记录信息的操作都是常数复杂度,如果“主算法逻辑”的复杂度是C,那么这个函数整体的时间复杂度就是O(C),而C会因具体算法而异。
import logginglogging.basicConfig(level = logging.INFO) def some_algorithm():logging.info("Algorithm started")# 主算法逻辑logging.info("Algorithm finished")
依据不同环境调适算法,面对不同硬件平台、使用场景,算法都能精准适配,就像变色龙融入背景一样,无缝对接,稳定又高效运行,这才是行军不败的方法。
地形篇
算法落地实施,必须审视所处地形。商业场景如同山地,高低起伏,竞争激烈的地方就是陡峭高峰,细分赛道则是隐蔽山谷,选准山谷深耕细作,避开高峰的锋芒;科研领域好似旷野,广阔无垠,适合大开脑洞,铺展算法宏伟蓝图,探索未知边界。
战例八:假定要依据不同场景来选择推荐算法:
这个select_recommendation_algorithm函数,把scenario当作参数。进入函数体后,首先进行条件判断。
要是scenario的值是“ecommerce”,就会立刻返回“Collaborative Filtering Algorithm”,这种判断与返回操作瞬间就能完成,时间复杂度是O(1)。
要是scenario的值是“research_paper”,同样会迅速返回“Content-based Recommendation Algorithm”,它的时间复杂度也是O(1)。
要是以上情况都不匹配,就返回“Default Algorithm”,这个操作也能快速完成,复杂度为O(1)。 这个函数仅仅做条件判断,不管输入什么值,耗费的时间都是固定的,所以整个函数的时间复杂度是O(1)。
def select_recommendation_algorithm(scenario):if scenario == "ecommerce":return "Collaborative Filtering Algorithm"elif scenario == "research_paper":return "Content-based Recommendation Algorithm"return "Default Algorithm"
要知晓难易程度,清楚危险与平易之处,复杂的数据结构就是荆棘丛生的沼泽,简易任务则是平坦大道。因地制宜部署算法,在沼泽地里就用轻量敏捷的方法,在大道上就施展磅礴宏伟之术,算法自然能畅行无阻,建立功勋。
九地篇
生地、死地、绝地…… 在算法的征程里,会涉足各类不同 “九地”。刚进入新兴领域,这是生地,要大胆开拓,抢占先机;深陷竞品的围剿,就是进入死地,需背水一战,激发自身潜能;面临技术瓶颈,便处于绝地,要破釜沉舟,创新突围。
战例九:在遇到技术瓶颈的时候,应当尝试引入新的技术框架。下面所讲的,就是一个导入新框架的简单示例。
这段代码的时间复杂度值得探究一番。一开始,在try语句块里的import new_tech_framework,这一导入模块的操作,它所耗费的时间取决于框架的加载方式。要是框架已经妥善安装,并且没有复杂的初始化流程,加载过程近乎瞬间就能完成,时间复杂度为O(1);要是需要大量调配资源、读取多个文件,那复杂度或许会上升,暂时用O(t)来表示,这里的t与框架的复杂程度、体量大小相关。
后续使用新框架的逻辑,由于没有详细说明,假设其复杂度为O(u),这取决于具体的算法。 到了except部分,print语句仅仅输出一条信息,操作很简单,能够在固定时间内完成,时间复杂度是O(1) 。
综合来看,如果导入成功,复杂度主要受新框架使用逻辑的影响,大约是O(u);要是导入失败,那也不过就是执行print语句的O(1)。因为导入是否成功并不明确,不过导入操作通常能快速完成,所以整体复杂度通常接近O(1),只有在导入流程极为繁杂的时候,才依据实际耗费的时间来确定。
try:import new_tech_framework# 使用新框架的代码逻辑 except ImportError:print("Failed to import new framework, fallback plan activated")
算法团队协同配合,攻坚时能齐心协力汇聚一处,分散时又能各自探索。深入用户场景这块 “重地”,珍视用户反馈,依据这些重塑算法灵魂,不管处于何种境地,都能绝地逢生,所向披靡。
火攻篇
火攻,就是借助外力助力算法发起凌厉攻势。舆论热点好似烈火,算法贴合热点进行优化,趁着热度飙升,收获滚滚流量;跨界合作仿若借风,引入外部算法模块、数据资源,燃起创新大火,烧穿行业隔阂,拓展业务版图。
战例十:借助社交媒体的API来抓取热点话题数据,以此辅助算法的优化。
现有一段程序,引入了tweepy库,其目的在于借助社交媒体推特(Twitter)的API,获取热点话题数据,助力算法优化相关事宜。
首先要配置Twitter API,于是设定多个参数:consumer_key、consumer_secret、access_token以及access_token_secret,分别赋予专属的字符值,这些参数是连通推特API的关键密钥。
接着,使用OAuthHandler构建认证对象auth,把consumer_key与consumer_secret传入其中,以此奠定认证的基础;再运用`set_access_token`方法,补充完整权限信息,让认证更加周全。
最后得到API对象api,通过调用api.trends_place(1),向推特API请求热门话题数据。这是因为trends_place函数能够依据传入的地域代码(此处代码为1,通常代表特定的默认地区),抓取该地区当下的热门趋势。获取到的数据,后续可以应用到算法当中,依据数据特性,既能够为训练集补充素材,也能作为策略调整的依据,促使算法贴合舆情热点,达到更优的性能表现。
import tweepy# 配置Twitter API consumer_key = "your_key" consumer_secret = "your_secret" access_token = "your_token" access_token_secret = "your_secret_token"auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth)trends = api.trends_place(1) # 获取热门话题
然而火不能随意放,一旦失控反噬,必然酿成大祸。要把控好伦理边界,不涉及隐私侵权问题;防范数据滥用,避免算法失控。善于用火攻,能为算法霸业添砖加瓦,谨慎用猛火,才能保住算法的良好声誉,长治久安。
用间篇
在算法的江湖里,谍影重重。安插 “数据间谍”,收集竞品情报,窥探对手的更新迭代、参数奥秘;启用 “用户暗探”,深挖需求痛点,为算法优化找准靶点。逆向工程则是巧妙的反间手段,剖析对手代码,学习对方长处,化为己用。
战例十一:模拟一个简单的网页爬虫,用来获取竞品的公开数据。
首先,引入requests与BeautifulSoup库,它们是获取和解析网页数据的重要工具。 其次,将url设定为竞品网页的地址,称作competitor_url。
接着,使用requests.get(url)发起请求,该操作会向设定好的url发送HTTP请求,获取网页的响应。这一操作花费的时间和网页大小有关,如果把网页大小设为n,那么它的复杂度大约是O(n) 。
获取响应之后,提取response.content,这个操作能够在固定时间内完成,复杂度是O(1)。 再用BeautifulSoup(response.content, 'html.parser')创建BeautifulSoup对象soup,并使用html.parser来解析响应内容。这个解析过程,需要遍历网页内容,拆解其结构,它的复杂度与网页大小以及复杂程度相关,假设网页结构复杂度是m,那么这部分的复杂度大约是O(m)。
最后,可以凭借BeautifulSoup对象的各种方法,解析网页并提取关键信息,其复杂度依据所提取信息的多少以及网页结构来定,是O(k),这里的k与所提取信息的数量以及网页结构相关。
总体而言,这段代码的整体复杂度,受网页大小与结构的制约,因为需要发起请求、解析内容以及提取信息,大致是O(n + m + k),不过在实际情况中,网络状况和服务器响应速度也会对其性能产生影响。
import requests from bs4 import BeautifulSoupurl = "competitor_url" response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 解析网页提取关键信息
不过间谍很难用好,稍有不慎,反而会被对手迷惑。要甄别情报真假,不被虚假数据误导;严守己方机密,防范间谍泄密,让自家算法核心坚如磐石,在无声的暗战中胜出,最终成就算法霸业。
(完)
相关文章:
算法兵法全略(译文)
目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…...
NO.17十六届蓝桥杯备战|do-while循环|break和continue语句|三道练习(C++)
do-while循环 do-while语法形式 在循环语句中 do while 语句的使⽤最少,它的语法如下: //形式1 do 语句; while( 表达式 );//形式2 do { 语句1; 语句2; ... } while( 表达式 );while 和 for 这两种循环都是先判断,条件如果…...
【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)
第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点:…...
Spring Cache 详细讲解
Spring Cache 是 Spring 框架提供的缓存抽象层,通过统一的 API 和注解简化缓存操作,支持多种缓存实现(如 Redis、EhCache、Caffeine 等)。其核心目标是减少重复计算,提升系统性能,同时保持代码简洁性。 1. …...
CPT205 计算机图形学 OpenGL 3D实践(CW2)
文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业,这次C…...
Netty的基本架构详解
EventLoopGroup基本认识 我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱: 我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是Multithre…...
2025前端面试题超全面解析(附答案与深度扩展)
文章目录 一、HTML篇(扩展版)1. **HTML5语义化标签的实际应用场景**2. **Web Components实战:如何封装一个自定义按钮组件?**3. **Web Worker的用途与限制** 二、CSS篇(扩展版)1. **CSS盒模型详解ÿ…...
自己搭建可以和deepseek对话的WEB应用
第一步 下载安装anaconda,地址:https://repo.anaconda.com/ 第二步 打开anaconda客户端,打开conda命令行窗口 第三步 创建一个open-webui专属的python专属的虚拟环境,并且指定python具体的版本 conda create --name open…...
Linux系统运行模式和链接
一、系统运行模式 centos6 0 关机模式 1 单用户模式 2 字符模式,无网络连接 3 字符模式 4 预留 5 图形模式 6 重启模式 查看系统当前处于的运行模式 切换为图形模式 init 5 centos7 字符模式 multi-user…...
.NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项
一、执行过程中,要刷新 进度条 的显示,需要 延时、释放,否则进度条不 实时 更新,最后一下到 100% // 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100await Task.D…...
头歌实验--面向对象程序设计
目录 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 第2关:公司支出计算 任务描述 答案代码 第3关:棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 #incl…...
IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up
问题 IoTDB 1.3.2 版本,断电后 IoTDB 的 DataNode 无法启动,日志如下: 2024-12-16 14:45:41,350 [main] ERROR o.a.i.db.service.DataNode:562 - Meet error while starting up. org.apache.iotdb.commons.exception.StartupException: Fo…...
2024华为OD机试真题-最大报酬(C++)-E卷B卷-100分
2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 示例一 解题思路 考点 代码 c++ 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为…...
jenkins war Windows安装
Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…...
HCIA项目实践--RIP相关原理知识面试问题总结回答
9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…...
用大模型学大模型04-模型与网络
目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…...
浏览器扩展实现网址自动替换
作为一个开发爱好者,不能顺畅访问github是很痛苦的,这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况,我此前知道有一个网站kkgithub,基本上把github的静态内容都搬了过来,我们如果需要访问某个githu…...
适配器模式详解(Java)
一、引言 1.1 定义与类型 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为客户期望的另一个接口。这种模式使得原本因为接口不匹配而不能一起工作的类可以一起工作,从而提高了类的复用性。适配器模式分为类适配器和对象适配器两种类型。类适配器使用继承关…...
C语言表驱动法
最近了解到一种C语言的写法,故记录下来,内容来自deepseek。 表驱动法 表驱动法(Table-Driven Approach)是一种编程技术,通过使用表格(数组、结构体数组、哈希表等)来存储数据或逻辑࿰…...
【鸿蒙Next】优秀鸿蒙博客集锦
鸿蒙基础开发:多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客...
Django REST Framework:如何获取序列化后的ID
Django REST Framework:如何获取序列化后的ID 😄 嗨,小伙伴们!今天我们来聊一聊Django REST Framework(简称DRF)中一个非常常见的操作:如何获取序列化后的ID。对于那些刚入门的朋友们ÿ…...
deep seek
1.介绍:DeepSeek是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解并回答问题,还能辅助写代码、整理资料和解决复杂的数学问题。免费开源,媲美ChatGPT 最近最火爆的AI对话程序。 www.deepseek.com…...
前端设计模式介绍及案例(单例模式、代理模式、工厂模式、装饰者模式、观察者模式)
概要 本文主要介绍了前端设计模式的定义、分类以及常用设计模式的具体案例。 前言 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦…...
开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1
文章目录 开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1一、环境要求1.1 操作系统1.1.1 Ubuntu1.1.2 CentOS 1.2 数据库1.2.1 JumpServer 需要使用的数据库1.2.2 创建数据库 SQL 参考1.2.2.1 PostgreSQL1.2.2.2 MySQL…...
电源测试和测量系统的创新遥感方法可以消除哪些潜在问题
传统的遥感方法 远程感测是一种行之有效的方法,通过消除连接电缆中压降的影响来调节负载点的直流功率。这在测试和测量应用中尤其重要,在这些应用中,电源电压在一系列负载条件下的准确性和一致性通常对于获得准确且可重复的测试结果至关重要…...
10、《Thymeleaf模板引擎:动态页面开发全攻略》
Thymeleaf模板引擎:动态页面开发全攻略 一、Thymeleaf核心价值解析 天然HTML亲和力:Thymeleaf允许直接使用.html文件作为模板,支持浏览器直接预览静态原型,同时通过属性标签(如th:text)实现动态渲染&…...
Day1 25/2/14 FRI
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p3&v…...
untiy3D 让角色动起来,角色动画的使用
1.untiy 商店下载动画模型 2.导入项目 模型拖入到场景中 3.创建动画器控制器 4.动画控制器挂载到plarer上 5.把动画idle和pickup拖入到动画器 6.右键动画创建过渡效果(Make Transition) 6.设置参数用条件控制 7.当选中参数时启动过渡 运行效果 119 (二)用脚本控制动画…...
Word 里面嵌入DeepSeek
目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档,按 AltF11,进入VB界面。 2、选中文档,右键->插入->模块。 3、进入模块,粘入…...
深入浅出Java反射:掌握动态编程的艺术
小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…...
exr 格式下 全景图(经纬图、panorama)转 cubemap
先上效果 (X, -X, Y, -Y, Z, -Z) 下载 exr 经纬图 笔者用的这张:https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky 使用 Openexr 的 exrenvmap 工具 下载 我 build 了一份 3.3.2 版本的,免积分下载。 https:/…...
解锁建造者模式:Java 编程中的对象构建秘籍
系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品(Product)2.2.2 建造者(Builder)2.2.3 具体建造者(ConcreteBuilder)2.2.4 指挥者(Director)2.3 工作流程与交互机制三、建造者模式在 Java 中的优势3.1 …...
ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全
ArcGIS Pro对于显示缓存有32GB的限制,所以当缓存设置中,缓存将达到32GB时,会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置,然后单击选项; 2.在选项窗口中&…...
大数据、云计算、人工智能等技术深度融合的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...
C++17 中的 std::reduce:详细教程
文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法,用于对范围内的元素进行归并操作。它…...
Python爬虫实战:获取笔趣阁图书信息,并做数据分析
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备与反爬策略 python import requests from bs4 import BeautifulSoup import pandas as pd import re import time import random from fake_useragent …...
win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法,以及后续使用夜神模拟器,关闭了Hyper-V时&am…...
c# sqlite 批量生成insert语句的函数
函数开始 using System; using System.Collections.Generic; using System.Text;public class SqliteHelper {public static List<string> GenerateInsertStatements(string tableName, List<string> columns, List<List<object>> data){List<stri…...
ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类
使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像,包括创建散点图和直方图,以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 3.1.x)添…...
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
导读:浙江霖梓早期使用 CDH 产品套件搭建了大数据系统,面临业务逻辑冗余、查询效率低下等问题,基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris Paimon 的实…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
2025年金三银四经典自动化测试面试题
概述 觉得自动化测试很难? 是的,它确实不简单。但是学会它,工资高啊! 担心面试的时候被问到自动化测试? 嗯,你担心的没错!确实会被经常问到! 现在应聘软件测试工程师的岗位&…...
遵循规则:利用大语言模型进行视频异常检测的推理
文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly (正常与异常)Abstract and Concrete (抽象与具体)Human and Environment (人类与环境) 3…...
RFM模型-数据清洗
在进行数据清洗时,主要的目标是确保数据质量良好,以便后续的分析和建模工作能够顺利进行。针对你使用粒子群优化算法改进RFM模型来对电商数据进行用户群像划分的实验,数据清洗环节尤其重要,因为不干净的数据会影响模型的精度和效果…...
文件系统惹(细)
目录 块概念 分区 inode ext2文件系统 Boot Sector Super Block GDP(group descriptor table) Block Bitmap(块位图) Inode Bitmap (inode位图) Data Block inode和Datablock映射 目录和文件名 …...
中望CAD c#二次开发 ——VS环境配置
新建类库项目:下一步 下一步 下一步: 或直接: 改为: <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...
Centos7安装Clickhouse单节点部署
部署流程 1、关闭防火墙&沙盒 关闭防火墙并关闭开机自启动 systemctl stop firewalld && systemctl disable firewalld查看selinux状态是否为disabled,否则修改 [rootlocalhost ~]# getenforce Enforcing修改为disabled vim /etc/selinux/config…...
4.SpringSecurity在分布式环境下的使用
参考 来源于黑马程序员: 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证,即我们常说的单点登录,简称SSO,指的是在多应用系统的项目中,用户只需要登录一次,就可以访 问所有互相信任的应…...
使用 Notepad++ 编辑显示 MarkDown
Notepad 是一款免费的开源文本编辑器,专为 Windows 用户设计。它是替代记事本(Notepad)的最佳选择之一,因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式,并可以通过插件扩展其功能。 Notepad 是一款功能…...
Spring 框架数据库操作常见问题深度剖析与解决方案
Spring 框架数据库操作常见问题深度剖析与解决方案 在 Java 开发的广阔天地中,Spring 框架无疑是开发者们的得力助手,尤其在数据库操作方面,它提供了丰富且强大的功能。然而,就像任何技术一样,在实际项目开发过程中&a…...