c++
文章平均质量分 85
csdn_aspnet
这个作者很懒,什么都没留下…
展开
-
c++ 插值搜索与二分搜索
如果中间元素等于目标值,则找到目标;插值搜索是一种根据目标值在已知范围内的分布情况,预测目标值应该在的位置,然后进行搜索的算法。插值搜索平均进行 log(log(n)) 次比较(如果元素均匀分布),其中 n 是要搜索的元素数量。当列表中的元素均匀分布时,插值搜索比二分搜索更有效,而当列表中的元素不均匀分布时,二分搜索更有效。插值搜索根据目标元素周围元素的值来估计目标元素的位置,而二分搜索总是从检查列表的中间元素开始。插值搜索可能比二分搜索需要更长的时间来实现,因为它需要使用额外的计算来估计目标元素的位置。原创 2024-04-24 09:15:58 · 697 阅读 · 0 评论 -
c++ 线性搜索与二分搜索
那么搜索目标项目的唯一方法就是从第一个位置开始,并将其与目标进行比较。否则,我们将转移到下一个位置。然而,在二分搜索中,一旦找到排序列表的中间,就将搜索量减少一半。O(1) – 二分查找算法只需要常数空间来存储低、高、中索引,不需要任何额外的数据结构,因此其辅助空间复杂度为 O(1)。O(n),其中 n 是输入数组的大小。最坏的情况是数组中不存在目标元素,并且该函数必须遍历整个数组才能找出该元素。O(log n) – 二分搜索算法在每一步将输入数组分成两半,将搜索空间减少一半,因此具有对数阶的时间复杂度。原创 2024-04-19 09:03:00 · 877 阅读 · 0 评论 -
c++ 无处不在的二分搜索
给定一个由 N 个不同整数组成的数组,找到输入“key”的下限值。以下是可能的极端情况, —> 如果数组中的所有元素都小于 key,则左指针移动到最后一个元素。—> 如果数组中的所有元素都相等且原创 2024-04-15 09:01:45 · 996 阅读 · 0 评论 -
c++ 斐波那契搜索-迭代与递归(Fibonacci Search)
设第(m-2)个斐波那契数为i,我们将arr[i]与x进行比较,如果x相同,则返回i。由于 fibMm2 标记了大约三分之一的数组,并且它标记的索引肯定是有效的,因此我们可以将 fibMm2 添加到 offset 并检查索引 i = min(offset + fibMm2, n) 处的元素。当我们继续寻找目标时,当我们的目标位于数组的较大 (2/3) 部分时,最坏的情况就会发生。斐波那契数被递归地定义为 F(n) = F(n-1) + F(n-2)、F(0) = 0、F(1) = 1。原创 2024-04-10 09:23:07 · 703 阅读 · 0 评论 -
c++ 指数搜索(Exponential Search)
一旦我们找到一个索引 i(在重复将 i 加倍之后),我们就知道该元素必须存在于 i/2 和 i 之间(为什么是 i/2?因为我们在之前的迭代中找不到更大的值)下面给出的是上述步骤的实施。这个想法是从子数组大小 1 开始,将其最后一个元素与 x 进行比较,然后尝试大小 2,然后是 4,依此类推,直到子数组的最后一个元素不大于。上述二分查找的实现是递归的,需要 O(Log n) 空间。2、对于有界数组,以及当要搜索的元素更接近第一个元素时,它比二分搜索效果更好。搜索的元素 x,找到 x 在数组中的位置。原创 2024-04-07 09:21:39 · 828 阅读 · 0 评论 -
c++ 插值搜索-迭代与递归(Interpolation Search)
插值搜索是对实例二分搜索的改进,其中排序数组中的值是均匀分布的。另一方面,插值搜索可以根据正在搜索的键的值去不同的位置。线性插值采用两个数据点,我们假设为 (x1,y1) 和 (x2,y2),公式为:在点 (x,y) 处。我们假设数组的元素是线性分布的,直线的一般方程:y = m*x + c,y 是数组中的值,x 是其索引。给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。在二分查找的情况下,该常数的值为:K=(low+high)/2。原创 2024-04-03 09:03:40 · 1141 阅读 · 0 评论 -
c++ 跳转搜索(Jump Search)
一旦找到区间 (arr[km] < x < arr[(k+1)m]),我们就从索引 km 执行线性搜索操作来查找元素 x。在最坏的情况下,我们必须进行 n/m 次跳转,如果最后检查的值大于要搜索的元素,我们会为线性搜索多执行 m-1 次比较。4、二分查找比跳转查找要好,但是跳转查找的优点是我们只需要回溯一次(二分查找可能需要最多 O(Log n) 次跳转,考虑要查找的元素是最小元素或者更大的元素的情况比最小的)。3、跳转搜索的时间复杂度介于线性搜索 ((O(n)) 和二分搜索 (O(Log n)) 之间。原创 2024-03-27 09:56:38 · 1022 阅读 · 0 评论 -
c++ 三元搜索 - 迭代与递归(Ternary Search)
例如,二分搜索将信息分为两部分,而三元搜索则执行相同的操作,但分为三个相等的部分。在本文中,我们将揭开三元搜索的秘密——它是如何工作的,为什么它在某些情况下更快。如果目标位于mid1和mid2的元素之间,则将左指针更新为mid1 + 1,将右指针更新为mid2 – 1。它的工作原理是将数组分为三部分,并对适当的部分递归地执行搜索操作,直到找到所需的元素。三元搜索的时间复杂度为O(2 * log 3 n),比线性搜索更高效,与二分搜索相当。需要注意的是,要使三元搜索正常工作,要搜索的数组必须进行排序。原创 2024-03-23 11:05:43 · 798 阅读 · 0 评论 -
c++ 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)
如果中间元素大于目标元素,则算法将新区间设置为前一个区间的左半部分,如果中间元素小于目标元素,则将新区间设置为前一个区间的右半部分间隔。元二分搜索相对于二分搜索的优势在于,它在某些情况下可以执行更少的比较,特别是当目标元素接近列表开头时。因此,当列表的排序方式与目标元素的分布一致时,元二分搜索是最有效的。元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。3、如果找到该元素,则返回 pos。原创 2024-03-19 09:10:15 · 1209 阅读 · 0 评论 -
c语言 线性搜索算法
线性搜索被定义为一种顺序搜索算法,从一端开始,遍历列表中的每个元素,直到找到所需的元素,否则搜索将继续,直到数据集的末尾。因此,线性搜索算法将产生一条成功消息,并在找到 key 时返回元素的索引(此处为 2)。在最坏的情况下,键可能出现在最后一个索引处,即与列表中开始搜索的末尾相反的位置。因此,最坏情况的复杂度是 O(N),其中 N 是列表的大小。2、如果找到任何元素等于该键,则搜索成功并返回该元素的索引。从第一个元素(索引0)开始,将key与每个元素(arr[i])进行比较。2、不需要任何额外的内存。原创 2024-03-13 09:44:57 · 952 阅读 · 0 评论 -
c++ 线性搜索算法
线性搜索被定义为一种顺序搜索算法,从一端开始,遍历列表中的每个元素,直到找到所需的元素,否则搜索将继续,直到数据集的末尾。因此,线性搜索算法将产生一条成功消息,并在找到 key 时返回元素的索引(此处为 2)。在最坏的情况下,键可能出现在最后一个索引处,即与列表中开始搜索的末尾相反的位置。因此,最坏情况的复杂度是 O(N),其中 N 是列表的大小。2、如果找到任何元素等于该键,则搜索成功并返回该元素的索引。从第一个元素(索引0)开始,将key与每个元素(arr[i])进行比较。2、不需要任何额外的内存。原创 2024-03-13 09:18:06 · 1022 阅读 · 0 评论 -
c++ 哨兵线性搜索
在这种搜索中,将数组的最后一个元素替换为要搜索的元素,然后对数组进行线性搜索,而不检查当前索引是否在数组的索引范围内,因为要搜索的元素即使它不存在于原始数组中,也肯定会在数组中找到,因为最后一个元素被替换为它。顾名思义,哨兵线性搜索是线性搜索的一种,与传统线性搜索相比,比较次数减少了。在传统的线性搜索中,仅进行N次比较,而在哨兵线性搜索中,哨兵值用于避免任何越界比较,但没有专门针对正在搜索的元素的索引进行额外的比较。在搜索数组中的元素时,哨兵线性搜索是线性搜索算法的变体,它使用哨兵值来优化搜索过程。原创 2024-03-09 09:51:47 · 761 阅读 · 0 评论 -
c++ 二分查找(迭代与递归)
并根据结果返回找到键的索引或调用下一个搜索空间的递归函数。考虑一个数组arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。如果键小于 mid 元素,则向左移动,如果大于 mid 则将搜索空间向右移动。二分搜索可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。3、如果在中间元素没有找到键,则选择哪一半将用作下一个搜索空间。如果key与mid元素的值匹配,则找到该元素并停止搜索。原创 2024-03-06 10:08:51 · 1069 阅读 · 0 评论 -
c++ 广度优先搜索(Breadth-First Search,BFS)
其基本思想是先访问起始顶点,然后逐层遍历其相邻的顶点,直到找到目标顶点或遍历完所有顶点。BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。接下来,我们访问队列前面的元素(即 1)并访问其相邻节点。顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。队列中只剩下 4 个节点,因为 3 的唯一相邻节点(即 0)已经被访问过。原创 2024-02-26 09:39:09 · 1240 阅读 · 0 评论 -
c++ 二叉搜索树 (Binary Search Tree,BST)
节点类用来表示树中的节点,包含节点的值、左子节点指针和右子节点指针。而树类则用来实现树的各种操作,比如插入节点、删除节点和查找节点等。以上只是一个简单的示例,实际上,实现一个完整的二叉搜索树类还需要包括删除节点、中序遍历等更多操作。在编写二叉搜索树时,需要注意平衡性问题,即确保树的高度平衡,以维持二叉搜索树的高效性能。1、二叉搜索树节点类:节点类应包含节点的值、指向左子树的指针、指向右子树的指针。2、二叉搜索树类:二叉搜索树类应该包含插入节点、删除节点、查找节点等操作。原创 2024-02-24 09:30:00 · 769 阅读 · 0 评论 -
c++ 哈希表(Hash Table)
在这个示例中,我们使用 `unordered_map` 类来实现哈希表,`unordered_map` 定义在 `` 头文件中,并提供了丰富的操作来处理键值对的插入、访问、修改和遍历等操作。哈希表(Hash Table),也称为散列表,是一种利用哈希函数来实现键值对映射的数据结构。它通过将键转换为索引,然后将键值对存储在相应索引位置的数组中,以实现快速查找、插入和删除操作的数据结构。// 在哈希表中插入键值对。// 访问哈希表中的值。// 修改哈希表中的值。原创 2024-02-21 10:30:59 · 960 阅读 · 0 评论 -
c++ 线性代数 克·施密特(Gram Schmidt)
克·施密特(Gram-Schmidt)正交化方法是一种将一组线性无关的向量转换为一组正交(垂直)向量的技术。该方法是线性代数中常用的工具,它的核心思想是将一组线性无关的向量集合通过减去它们在前面向量方向上的投影来得到一组正交的向量。通过这种方法,我们可以从一个线性无关的向量集合构造出一组正交的基向量,这在解决许多数学和工程问题时非常有用。Gram-Schmidt方法在解决线性方程组、矩阵分解、特征值问题等方面具有广泛的应用。原创 2024-02-20 10:14:06 · 1120 阅读 · 1 评论 -
c++ 二分查找
如果要搜索的值大于中间元素,则在数组的右半部分继续搜索。通过不断缩小搜索范围,最终可以在O(log n)的时间复杂度内找到目标元素,是一种高效的搜索算法。二分查找通常是用于在有序数组中查找数值类型的数据,而不是用于在字符串数组中查找字符串。但是,如果你需要在有序的字符串数组中查找特定的字符串,你可以自定义比较函数来进行二分查找。这段代码演示了一个简单的二分查找函数,用于在一个有序的字符串数组中查找特定的目标字符串。这段代码演示了一个简单的二分查找函数,用于在一个有序整数数组中查找特定的目标值。原创 2024-02-19 09:57:33 · 447 阅读 · 1 评论 -
c++ 旋描仪或扫描仪
旋转扫描仪(Rotating Scanner),也称为旋转扫描仪或圆形扫描仪,是一种用于获取图像和文档的设备。与传统的平板扫描仪不同,旋转扫描仪通过旋转扫描头或整个装置来进行扫描。在主函数中,我们创建了一个Scanner对象,然后调用其initialize()方法进行初始化,接着调用scan()方法进行文档扫描。实际的实现可能会涉及更多的API调用和图像处理步骤,具体取决于扫描仪供应商和其所使用的API。2、旋转机构:将扫描头安装在一个能够旋转的平台或轴上,使其能够沿着文档或图像的圆周方向进行扫描。原创 2024-02-04 09:57:43 · 916 阅读 · 0 评论 -
C++ 常用排序算法(冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序)
选择排序(Selection Sort):每次从未排序部分选择最小的元素,并将其与未排序部分的首元素交换位置。时间复杂度为O(n^2),但对于小规模的数组或部分有序的数组,具有较好的性能。归并排序(Merge Sort):将数组递归地分成两半,分别进行排序,然后将排序后的子数组进行合并。冒泡排序(Bubble Sort):通过不断交换相邻的元素,将最大的元素逐渐向数组的末尾冒泡。时间复杂度为O(n^2)。这些算法都是常见的排序算法,在实际应用中根据不同的场景和需求选择合适的算法,以达到最佳的排序效果。原创 2024-02-02 09:45:02 · 746 阅读 · 0 评论 -
c++ 汉明距离
该代码通过传入两个字符串 `str1` 和 `str2`,并使用一个循环遍历两个字符串的每个字符进行比较,统计不同字符的个数作为汉明距离。在运行时,会先检查两个字符串的长度是否相等,若不相等会抛出异常。具体计算汉明距离的方法是将两个字符串按位进行比较,统计不同位上字符的个数。汉明距离常常用于错误检测和纠错码等领域,例如比较两个二进制数字的相似度或判定两个字符串之间的编辑距离。这表示字符串 "101101" 和 "100111" 的汉明距离为2。在第2位和第4位字符不同,因此汉明距离为2。原创 2024-01-31 10:03:33 · 852 阅读 · 0 评论 -
c++ XOR 密码
在上面的代码中,`xorEncryptDecrypt`函数接受明文和密钥作为参数,并将其转换为密文或解密为明文。加密和解密使用相同的操作:针对明文和密钥的每个字符,执行异或操作。最后,将结果返回为字符串。XOR密码,也被称为异或密码,是一种简单和常见的加密算法。XOR操作(异或操作)是一种逻辑运算,它比较两个输入并输出一个结果,结果为1的条件是两个输入不相等。XOR密码的原理是将明文与密钥按位进行异或操作,生成加密后的密文。解密时,再将密文与相同的密钥按位进行异或操作,就能还原出原始的明文。原创 2024-01-19 11:06:22 · 792 阅读 · 0 评论 -
c++ Vigenere 密码
运行程序后,将输出加密后的密文和解密后的明文。因此,在真实的应用中,我们通常会使用更强大和更复杂的加密算法,如AES(Advanced Encryption Standard)或RSA(Rivest-Shamir-Adleman)。每个字母都根据关键字中的对应字母来确定一个位移量,然后将明文中的字母加上该位移量,得到密文中的字母。维吉尼亚密码相对于凯撒密码(Caesar cipher)等单字母替代密码来说更加复杂,因为它使用了一个关键字来确定位移量,并且对于相同的明文可以产生不同的密文。原创 2024-01-17 09:29:15 · 1023 阅读 · 0 评论 -
c++ 希尔密码
这个示例使用2x2的矩阵作为密钥,对明文进行加密和解密操作。你可以根据需要修改矩阵的大小和明文的内容来进行扩展和测试。对于更复杂的需求,请根据需要修改实现。希尔密码(Hill Cipher)是一种替代密码方法,它使用矩阵运算来对明文进行加密和解密。// 取模操作,映射到字母表范围内。// 取模操作,映射到字母表范围内。// 使用密钥矩阵进行乘法运算。// 使用逆矩阵进行乘法运算。// 对明文进行分块加密。// 对密文进行分块解密。原创 2024-01-11 10:47:10 · 845 阅读 · 0 评论 -
c++ 凯撒密码
在上述示例代码中,`encryptCaesarCipher`函数实现了凯撒密码的加密过程,`decryptCaesarCipher`函数实现了凯撒密码的解密过程。注意,该凯撒密码实现只对字母字符进行加密和解密,非字母字符将保持原样。解密过程是通过将移位数转换为负数,然后调用加密函数实现的。// 将替代后的字符添加到密文中。// 将移位数转换为负数,以实现向前移动的效果。// 获取字符的ASCII码。// 调用加密函数进行解密。// 加密并输出密文。// 凯撒密码加密函数。// 凯撒密码解密函数。原创 2024-01-10 09:25:29 · 1242 阅读 · 0 评论