【算法-位运算】位运算遍历 LogTick 算法

news2025/2/3 15:39:32

文章目录

  • 1. 引入
  • 2. LogTick 优化遍历过程
  • 3. 题目
    • 3.1 LeetCode3097 或值至少为 K 的最短子数组 II
    • 3.2 LeetCode2411 按位或最大的最小子数组长度
    • 3.3 LeetCode3209 子数组按位与值为 K 的数目
    • 3.4 LeetCode3171 找到按位或最接近 K 的子数组
    • 3.5 LeetCode1521 找到最接近目标值的函数值
    • 3.6 LeetCode898 子数组按位或操作

1. 引入

最近刷题做到了位运算的题目,不得不感叹有时候这些题目写法简单是真的简单,但是思路也是真的难想,下面就来看下最新学到的一个算法 LogTick,这个算法是专门用于子数组求 or 或者 and 这些集合交集并集用的。

LogTick 可以用于计算连续子数组的 or 值,比如给定一个数组 [0 … L … R … len - 1],需要求出这个数组中任意一个 [L … R] 这个范围数组的 or 值,如何求呢?

最简单的方法是暴力,直接遍历,下面是遍历的双重 for 循环框架。

for(int i = 0; i < len; i++){
    for(int j = i - 1; j >= 0; j--){
        ...
    }
}

这遍历的逻辑可以用下面例子直观解释:

  • 当 i = 0 的时候,不处理
  • 当 i = 1 的时候,会设置 nums[0] |= nums[1],这样就能求出 [0, 1] 的子数组或
  • 当 i = 2 的时候,从后往前遍历设置 nums[1] |= nums[2]nums[0] |= nums[1],这样就能求出 [1, 2]、[0, 2] 的子数组或
  • 当 i = 3 的时候,从后往前遍历设置 nums[2] |= nums[3], nums[1] |= nums[2]nums[0] |= nums[1],这样就能求出 [2, 3]、[1, 3]、[0, 3] 的子数组或运算

那么完整的写法是:

public int minimumDifference(int[] nums, int k) {
    for(int i = 0; i < nums.length; i++){
        int x = nums[i];
        for(int j = i - 1; j >= 0; j --){
            nums[j] |= x;
        }
    }
}

其实这里代码实现和上面例子解释的实现不太一样,上面例子解释是从后往前一直往前 or,但是给出的实现是只对 x 进行 or,其实是一样的,因为

  • 当 i = 0,不处理
  • 当 i = 1,nums[0] |= nums[1]
  • 当 i = 2,nums[1] |= nums[2]nums[0] |= nums[2] 等同于 nums[0] | nums[1] | nums[2]因为在 i = 1 的时候就已经合并 nums[1] 到 nums[0] 了

2. LogTick 优化遍历过程

上面的例子中时间复杂度是 O(logn),这样一来如果数组长度是 10^5 次方就会超时,有没有什么办法优化时间复杂度呢?
对于二进制来说,a | b 其实就是把 a 和 b 二进制里面的 1 求并集,那么从并集的角度去看上面的流程:

  • 当 i = 0 的时候,不处理
  • 当 i = 1 的时候,会设置 nums[0] |= nums[1],这样 n u m s [ 0 ] ⊇ n u m s [ 1 ] nums[0] \supseteq nums[1] nums[0]nums[1],就是 nums[0] 集合里面包括 nums[1]
  • 当 i = 2 的时候,会设置 nums[1] |= nums[2],nums[0] |= nums[1],这样 n u m s [ 0 ] ⊇ n u m s [ 1 ] , n u m s [ 1 ] ⊇ n u m s [ 2 ] = > n u m s [ 0 ] ⊇ n u m s [ 1 ] ⊇ n u m s [ 2 ] nums[0] \supseteq nums[1], nums[1] \supseteq nums[2] => nums[0] \supseteq nums[1] \supseteq nums[2] nums[0]nums[1],nums[1]nums[2]=>nums[0]nums[1]nums[2]

再把上面的代码贴下来方便观看。

public int minimumDifference(int[] nums, int k) {
    for(int i = 0; i < nums.length; i++){
        int x = nums[i];
        for(int j = i - 1; j >= 0; j --){
            nums[j] |= x;
        }
    }
}

这个代码就是暴力的代码,我们直接看内层循环,注意 nums[j] |= x 这行代码,这行代码的本意是将 x 合并到 nums[j] 中,那么仔细想想,假设第一次遍历的时候(j = i - 1),nums[j] | x = nums[j],这时候还需要 j – 再往前遍历吗?

其实是不需要的,因为 n u m s [ 0 ] ⊇ n u m s [ 1 ] ⊇ n u m s [ 2 ] nums[0] \supseteq nums[1] \supseteq nums[2] nums[0]nums[1]nums[2],我们现在假设 x = nums[3],那么对于 j 从 i - 1 就是 2 开始往前遍历,如果 nums[2] | nums[3] == nums[2],那么说明 nums[3] 就是 nums[2] 的一个子集,这样的话 nums[3] 自然就是 nums[1] 的子集,这种情况下根本没必要继续向前遍历执行 nums[j] |= x,从而我们就能直接跳过 2 次遍历了。

那么上面解释之后我们就能写出最终代码了,也就是 LogTick 的代码:

public int minimumDifference(int[] nums, int k) {
    for(int i = 0; i < nums.length; i++){
        int x = nums[i];
        for(int j = i - 1; j >= 0 && (nums[j] | x) != nums[j]; j --){
            nums[j] |= x;
        }
    }
}

其实相比暴力的解法就是判断条件多了一个 nums[j] | x != nums[j]。


3. 题目

以下题目都来自灵神的题单,分享丨【题单】位运算(基础/性质/拆位/试填/恒等式/思维)


3.1 LeetCode3097 或值至少为 K 的最短子数组 II

3097 或值至少为 K 的最短子数组 II

给你一个 非负 整数数组 nums 和一个整数 k

如果一个数组中所有元素的按位或运算 OR 的值 至少k ,那么我们称这个数组是 特别的 。

请你返回 nums 中最短特别非空子数组的长度,如果特别子数组不存在,那么返回 -1 。

示例 1:

输入: nums = [1,2,3], k = 2
输出: 1
解释: 子数组 [3] 的按位 OR 值为 3 ,所以我们返回 1

示例 2:

输入: nums = [2,1,8], k = 10
输出: 3
解释: 子数组 [2,1,8] 的按位 OR 值为 11,所以我们返回 3

示例 3:

输入: nums = [1,2], k = 0
输出: 1
解释: 子数组 [1] 的按位 OR 值为 1 ,所以我们返回 1

提示:

  • 1 <= nums.length <= 2 ∗ 1 0 5 2 * 10^{5} 2105
  • 0 <= nums[i] <= 1 0 9 10^{9} 109
  • 0 <= k <= 1 0 9 10^{9} 109

思路:

找到最短的子数组,所以没什么好说的,直接用 LogTick 算法找最短子数组即可,为什么可以用 LogTick 呢?因为如果 nums[j] | nums[i] = nums[j],此时 nums[j] >= x,那么对于 j 前面的下标肯定也是 >= x 的,因为 n u m s [ 0 ] ⊇ n u m s [ 1 ] . . . ⊇ n u m s [ j − 1 ] ⊇ n u m s [ j ] nums[0] \supseteq nums[1] ... \supseteq nums[j-1]\supseteq nums[j] nums[0]nums[1]...nums[j1]nums[j]

所以这时候就没必要继续往前遍历了,下面看代码。

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        int res = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            int x = nums[i];
            if (x >= k) {
                return 1;
            }
            // logTick
            for (int j = i - 1; j >= 0 && (nums[j] | x) != nums[j]; j--) {
                nums[j] |= x;
                if(nums[j] >= k){
                    res = Math.min(res, i - j + 1);
                }
            }
        }
        return res == Integer.MAX_VALUE ? -1 : res;
    }
}

在这里插入图片描述


3.2 LeetCode2411 按位或最大的最小子数组长度

按位或最大的最小子数组长度

给你一个长度为 n 下标从 0 开始的数组 nums,数组中所有数字均为非负整数。对于 0n - 1 之间的每一个下标 i,你需要找出 nums 中一个 最小 非空子数组,它的起始位置为 i (包含这个位置),同时有 最大按位或运算值

  • 换言之,令 B i j B_{ij} Bij 表示子数组 nums[i...j] 的按位或运算的结果,你需要找到一个起始位置为 i 的最小子数组,这个子数组的按位或运算的结果等于 m a x ( B i j ) max(B_{ij}) max(Bij) ,其中 i <= k <= n - 1

一个数组的按位或运算值是这个数组里所有数字按位或运算的结果。

请你返回一个大小为 n 的整数数组 answer,其中 answer[i] 是开始位置为 i,按位或运算结果最大,且 最短 子数组的长度。

子数组 是数组里一段连续非空元素组成的序列。

示例 1:

输入: nums = [1,0,2,1,3]
输出: [3,3,2,2,1]
解释: 任何位置开始,最大按位或运算的结果都是 3 。

  • 下标 0 处,能得到结果 3 的最短子数组是 [1,0,2] 。
  • 下标 1 处,能得到结果 3 的最短子数组是 [0,2,1] 。
  • 下标 2 处,能得到结果 3 的最短子数组是 [2,1] 。
  • 下标 3 处,能得到结果 3 的最短子数组是 [1,3] 。
  • 下标 4 处,能得到结果 3 的最短子数组是 [3] 。

所以我们返回 [3,3,2,2,1] 。

示例 2:

输入: nums = [1,2]
输出: [2,1]
解释:

  • 下标 0 处,能得到最大按位或运算值的最短子数组长度为 2 。
  • 下标 1 处,能得到最大按位或运算值的最短子数组长度为 1 。

所以我们返回 [2,1] 。

示例 3:

输入: nums = [1,2], k = 0
输出: 1
解释: 子数组 [1] 的按位 OR 值为 1 ,所以我们返回 1

提示:

  • n == nums.length
  • 1 <= n <= 1 0 5 10^{5} 105
  • 0 <= nums[i] <= 1 0 9 10^{9} 109
class Solution {
     public int[] smallestSubarrays(int[] nums) {
        // 从右向左的 logTick
        int[] res = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            res[i] = 1;
            for (int j = i - 1; j >= 0 && (nums[j] | nums[i]) != nums[j]; j--) {
                nums[j] |= nums[i];
                res[j] = i - j + 1;
            }
        }
        return res;
    }
}

在这里插入图片描述


3.3 LeetCode3209 子数组按位与值为 K 的数目

子数组按位与值为 K 的数目

给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中有多少个
子数组满足:子数组中所有元素按位 AND 的结果为 k

示例 1:

输入: nums = [1,1,1], k = 1
输出: 6
解释: 所有子数组都只含有元素 1 。

示例 2:

输入: nums = [1,1,2], k = 1
输出: 3
解释: 按位 AND 值为 1 的子数组包括:[1], [1], [1,1]

示例 3:

输入: nums = [1,2,3], k = 2
输出: 2
解释: 按位 AND 值为 2 的子数组包括:[2], [2,3]

思路:

其他几道题目都是使用 LogTick 来计算或运算,但是 AND 运算也是一样的,来看下下面的遍历过程:

  1. 当 i = 0 的时候,不处理
  2. 当 i = 1 的时候,nums[0] &= nums[1],这时候 n u m s [ 0 ] ⊆ n u m s [ 1 ] nums[0] \subseteq nums[1] nums[0]nums[1]
  3. 当 i = 2 的时候,nums[1] &= nums[2],nums[0] &= nums[1],这时候 n u m s [ 0 ] ⊆ n u m s [ 1 ] ⊆ n u m s [ 2 ] nums[0] \subseteq nums[1] \subseteq nums[2] nums[0]nums[1]nums[2]

其实就是换个方向而已,从上面的关系可以看到,假设当 i = m 的时候,nums[m - 1] &= nums[i] 之后,nums[m - 1] < k,这时候还需要向前去找等于 k 的值吗?

不需要,因为 & 只会越 AND 越小。 根据这个特性,可以设置一个 left 和 right 指针,都指向 0,每一次遍历使用 left 指向第一个等于 k 的下标,right 指向第一个 > k 的下标,这样一来,right - left 就是等于 k 的数目。

假设当 i = m 的时候,left 指向 i1,right 指向 i2,所以这时候 nums[left] = k,i2 - i1 就是以 i = m 为结尾的子数组个数,而当 i = m + 1 的时候,由于 AND 越 AND 越小的特点,nums[left] & nums[i] 只会更小,left 要想找到等于 k 的下标,只能继续往右遍历,所以这就是 left 和 right 的单调性,依靠这个特点,我们就能写出下面代码。

class Solution {
    public long countSubarrays(int[] nums, int k) {
        long res = 0;
        int left = 0, right = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i - 1; j >= 0 && (nums[i] & nums[j]) != nums[j]; j--) {
                nums[j] &= nums[i];
            }
            while(left <= i && nums[left] < k){
                left++;
            }
            while(right <= i && nums[right] <= k){
                right++;
            }
            // left 指向第一个 k,right 指向第一个 k + 1的值
            res += (right - left);
        }
        return res;
    }
}

上面的代码通过 left 和 right 求出等于 k 的个数,其实如果不用 left 和 right,也可以用二分法,主要就是使用二分法计算出等于 k 的左下标和右下标,但是使用二分就没有用到 left 的单调写法,时间复杂度会去到 O(nlogn),这里二分写法如下:

class Solution {
    public long countSubarrays(int[] nums, int k) {
        long res = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i - 1; j >= 0 && (nums[i] & nums[j]) != nums[j]; j--) {
                nums[j] &= nums[i];
            }
            int left = search(nums, 0, i, k);
            int right = search(nums, 0, i, k + 1);
            // left 指向第一个 k,right 指向第一个 k + 1的值
            res += (right - left);
        }
        return res;
    }

    public int search(int[] nums, int left, int right, int k){
        while(left <= right){
            int mid = left + ((right - left) >> 1);
            if(nums[mid] >= k){
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}

3.4 LeetCode3171 找到按位或最接近 K 的子数组

找到按位或最接近 K 的子数组

给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个 子数组 ,满足子数组中所有元素按位或运算 OR 的值与 k绝对差 尽可能 。换言之,你需要选择一个子数组 nums[l..r] 满足 |k - (nums[l] OR nums[l + 1] ... OR nums[r])| 最小。

请你返回 最小 的绝对差值。

子数组 是数组中连续的 非空 元素序列。

示例 1:

输入: nums = [1,2,4,5], k = 3
输出: 0
解释: 子数组 nums[0..1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 3| = 0

示例 2:

输入: nums = [1,3,1,3], k = 2
输出: 1
解释: 子数组 nums[1..1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 2| = 1

示例 3:

输入: nums = [1], k = 10
输出: 9
解释: 只有一个子数组,按位 OR 运算值为 1 ,得到最小差值 |10 - 1| = 9

提示:

  • 1 <= nums.length <= 1 0 5 10^{5} 105
  • 1 <= nums[i] <= 1 0 9 10^{9} 109
  • 1 <= k <= 1 0 9 10^{9} 109

思路:

LogTick 往前遍历,要求最小,那么如果 nums[j] | nums[i] = nums[j],这时候 nums[j] - k 和 nums[j - 1] - k … nums[0] - k 是一样的,所以就没必要继续往前遍历了。

class Solution {
    // LogTick
    public int minimumDifference(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        for(int i = 0; i < nums.length; i++){
            int x = nums[i];
            ans = Math.min(ans, Math.abs(x - k));
            for(int j = i - 1; j >= 0 && ((nums[j] | x) != nums[j]); j --){
                nums[j] |= x;
                ans = Math.min(ans, Math.abs(nums[j] - k));
            }
        }
        return ans;
    }
}

在这里插入图片描述


3.5 LeetCode1521 找到最接近目标值的函数值

找到最接近目标值的函数值

在这里插入图片描述

Winston 构造了一个如上所示的函数 func。他有一个整数数组 arr 和一个整数 target,他想找到让 |func(arr, l, r) - target| 最小的 lr

请你返回 |func(arr, l, r) - target| 的最小值。

请注意, func 的输入参数 lr 需要满足 0 <= l, r < arr.length

示例 1:

输入: arr = [9,12,3,7,15], target = 5
输出: 2
解释: 所有可能的 [l,r] 数对包括 [[0,0],[1,1],[2,2],[3,3],[4,4],[0,1],[1,2],[2,3],[3,4],[0,2],[1,3],[2,4],[0,3],[1,4],[0,4]], Winston 得到的相应结果为 [9,12,3,7,15,8,0,3,7,0,0,3,0,0,0] 。最接近 5 的值是 7 和 3,所以最小差值为 2 。

示例 2:

输入: arr = [1000000,1000000,1000000], target = 1
输出: 999999
解释: Winston 输入函数的所有可能 [l,r] 数对得到的函数值都为 1000000 ,所以最小差值为 999999。

示例 3:

输入: arr = [1,2,4,8,16], target = 0
输出: 0

提示:

  • 1 <= arr.length <= 1 0 5 10^{5} 105
  • 1 <= arr[i] <= 1 0 6 10^{6} 106
  • 0 <= target <= 1 0 7 10^{7} 107

思路:

通过 LogTick 去遍历子数组的 AND 运算结果,然后计算最小值。

class Solution {
    public int closestToTarget(int[] arr, int target) {
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            min = Math.min(min, Math.abs(arr[i] - target));
            for (int j = i - 1; j >= 0 && (arr[j] & arr[i]) != arr[j]; j--) {
                arr[j] &= arr[i];
                min = Math.min(min, Math.abs(arr[j] - target));
            }
        }
        return min;
    }
}

3.6 LeetCode898 子数组按位或操作

子数组按位或操作

给定一个整数数组 arr,返回所有 arr 的非空子数组的不同按位或的数量。

子数组的按位或是子数组中每个整数的按位或。含有一个整数的子数组的按位或就是该整数。

子数组 是数组内连续的非空元素序列。

示例 1:

输入: arr = [0]
输出: 1
解释: 只有一个可能的结果 0 。

示例 2:

输入: arr = [1,1,2]
输出: 3
解释: 可能的子数组为 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。产生的结果为 1,1,2,1,3,3。有三个唯一值,所以答案是 3 。

示例 3:

输入: arr = [1,2,4]
输出: 6
解释: 可能的结果是 1,2,3,4,6,以及 7。

提示:

  • 1 <= arr.length <= 1 0 5 10^{5} 105
  • 1 <= arr[i] <= 1 0 6 10^{6} 106
  • 0 <= target <= 1 0 7 10^{7} 107

代码:

class Solution {
    public int subarrayBitwiseORs(int[] arr) {
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            int x = arr[i];
            set.add(x);
            for (int j = i - 1; j >= 0 && (arr[j] | x) != arr[j]; j--) {
                arr[j] |= x;
                set.add(arr[j]);
            }
        }
        return set.size();
    }
}





如有错误,欢迎指出!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互

Lab 3: Building Agents with memory 基于latta框架构建MemGpt代理并与之交互理解代理状态,例如作为系统提示符、工具和agent的内存查看和编辑代理存档内存MemGPT 代理是有状态的 agents的设计思路 每个步骤都要定义代理行为 Letta agents persist information over time and…

Python的那些事第九篇:从单继承到多继承的奇妙之旅

Python 继承&#xff1a;从单继承到多继承的奇妙之旅 目录 Python 继承&#xff1a;从单继承到多继承的奇妙之旅 一、引言 二、继承的概念与语法 三、单继承 四、多继承 五、综合代码示例 六、总结 一、引言 在编程的世界里&#xff0c;继承就像是一场神奇的魔法&#…

pandas(三)Series使用

一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、使用Chatbox进行交互5.1 下载Chatbox安装包…

如何用微信小程序写春联

​ 生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production​​ 2、修改 app.json …

2025最新在线模型转换工具onnx转换ncnn,mnn,tengine等

文章目录 引言最新网址地点一、模型转换1. 框架转换全景图2. 安全的模型转换3. 网站全景图 二、转换说明三、模型转换流程图四、感谢 引言 在yolov5&#xff0c;yolov8&#xff0c;yolov11等等模型转换的领域中&#xff0c;时间成本常常是开发者头疼的问题。最近发现一个超棒的…

算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)

在算法竞赛与日常编程中&#xff0c;前缀和是一种极为实用的预处理技巧&#xff0c;能显著提升处理区间和问题的效率。今天&#xff0c;我们就来深入剖析一维前缀和与二维前缀和这两个经典模板。 一、【模板】一维前缀和 题目描述 给定一个长度为 n n n 的整数数组 a a a&…

记8(高级API实现手写数字识别

目录 1、Keras&#xff1a;2、Sequential模型&#xff1a;2.1、建立Sequential模型&#xff1a;modeltf.keras.Sequential()2.2、添加层&#xff1a;model.add(tf.keras.layers.层)2.3、查看摘要&#xff1a;model.summary()2.4、配置训练方法&#xff1a;model.compile(loss,o…

88.[4]攻防世界 web php_rce

之前做过&#xff0c;回顾&#xff08;看了眼之前的wp,跟没做过一样&#xff09; 属于远程命令执行漏洞 在 PHP 里&#xff0c;system()、exec()、shell_exec()、反引号&#xff08;&#xff09;等都可用于执行系统命令。 直接访问index.php没效果 index.php?sindex/think\a…

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…

数据结构 树1

目录 前言 一&#xff0c;树的引论 二&#xff0c;二叉树 三&#xff0c;二叉树的详细理解 四&#xff0c;二叉搜索树 五&#xff0c;二分法与二叉搜索树的效率 六&#xff0c;二叉搜索树的实现 七&#xff0c;查找最大值和最小值 指针传递 vs 传引用 为什么指针按值传递不会修…

玩转ChatGPT:DeepSeek测评(科研思路梳理)

一、写在前面 DeepSeek-R1出圈了&#xff0c;把OpenAI的o3-mini模型都提前逼上线了&#xff08;还免费使用&#xff09;。 都号称擅长深度推理&#xff0c;那么对于科研牛马的帮助有多大呢&#xff1f; 我连夜试一试。 二、科研思路梳理 有时候我们牛马们做了一堆结果以后&…

python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习进程中&#xff0c;已经探索了使用cv.matchTemplate()函数实现最佳图像匹配的技巧&#xff0c;并且成功对两个目标进行了匹配。 相关文章链接为&#xff1a;python学opencv|读取图像&#xff08;五十二&#xff09;使用cv.matchTemplate()函数实现最佳图像…

Linux环境下的Java项目部署技巧:安装 Mysql

查看 myslq 是否安装&#xff1a; rpm -qa|grep mysql 如果已经安装&#xff0c;可执行命令来删除软件包&#xff1a; rpm -e --nodeps 包名 下载 repo 源&#xff1a; http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…

gitea - fatal: Authentication failed

文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…

计算机网络安全与运维的关键 —— 常用端口全解析

目录 前言 常见端口分类及用途 20 端口&#xff08;FTP 数据传输&#xff09; 21 端口&#xff08;FTP 消息控制&#xff09; 22 端口&#xff08;SSH&#xff09; 23 端口&#xff08;Telnet&#xff09; 25 端口&#xff08;SMTP&#xff09; 53 端口&#xff08;DNS&…

笔灵ai写作技术浅析(三):深度学习

笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…

< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)

目标&#xff1a; 使用 日本阿里云的 VPM 传输文件。 暂时方案&#xff1a; 使用 主机JPN 下载 https://huggingface.co/ 上模型从 JPN 放到 度狗上在家里从狗度下载 为了减少编程&#xff0c;尽量使用现在软件 &#xff0c;就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…

【前端学习路线】前端优化 详细知识点学习路径(附学习资源)

&#x1f4da;学习资源&#xff1a; 前端开发&#xff1a;零基础入门到项目实战 >> 前端开发&#xff1a;边学边练 >> 原学习路径下载 >>