Gemini永久会员 go数组中最大异或值

在Go语言中寻找数组中两个元素的最大异或值,同样可以采用暴力解法、位运算+哈希集合或字典树(Trie)的方法。以下是对应的实现:


1. 暴力解法(O(n²))

go 复制代码
package main

import "fmt"

func findMaximumXOR(nums []int) int {
    maxXOR := 0
    n := len(nums)
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            current := nums[i] ^ nums[j]
            if current > maxXOR {
                maxXOR = current
            }
        }
    }
    return maxXOR
}

func main() {
    nums := []int{3, 10, 5, 25, 2, 8}
    fmt.Println("Maximum XOR:", findMaximumXOR(nums)) // 输出28 (5 ^ 25)
}

2. 位运算+哈希集合(O(n))

go 复制代码
package main

import "fmt"

func findMaximumXOR(nums []int) int {
    maxXOR := 0
    mask := 0
    for i := 31; i >= 0; i-- {
        mask |= 1 << uint(i)
        prefixes := make(map[int]bool)
        
        for _, num := range nums {
            prefixes[num & mask] = true
        }
        
        temp := maxXOR | (1 << uint(i))
        for prefix := range prefixes {
            if prefixes[prefix ^ temp] {
                maxXOR = temp
                break
            }
        }
    }
    return maxXOR
}

func main() {
    nums := []int{3, 10, 5, 25, 2, 8}
    fmt.Println("Maximum XOR:", findMaximumXOR(nums)) // 输出28
}

3. 字典树(Trie)实现

go 复制代码
package main

import "fmt"

type TrieNode struct {
    children [2]*TrieNode
}

func findMaximumXOR(nums []int) int {
    root := &TrieNode{}
    maxXOR := 0

    for _, num := range nums {
        node := root
        xorNode := root
        currentXOR := 0

        for i := 31; i >= 0; i-- {
            bit := (num >> uint(i)) & 1
            // 插入到Trie中
            if node.children[bit] == nil {
                node.children[bit] = &TrieNode{}
            }
            node = node.children[bit]

            // 计算当前位的异或
            toggledBit := 1 - bit
            if xorNode != nil {
                if xorNode.children[toggledBit] != nil {
                    currentXOR += 1 << uint(i)
                    xorNode = xorNode.children[toggledBit]
                } else {
                    xorNode = xorNode.children[bit]
                }
            }
        }
        if currentXOR > maxXOR {
            maxXOR = currentXOR
        }
    }
    return maxXOR
}

func main() {
    nums := []int{3, 10, 5, 25, 2, 8}
    fmt.Println("Maximum XOR:", findMaximumXOR(nums)) // 输出28
}

总结

  1. 暴力解法:适合小型数组,代码简单但效率低(O(n²))。
  2. 位运算+哈希集合:中型数组的首选,时间复杂度O(n),利用位掩码逐步构建最大异或值。
  3. 字典树:适合超大型数组,时间复杂度O(n),但实现较复杂,常数因子较大。

根据数组规模和性能需求选择合适的方法。Go的实现与Java/Python逻辑一致,但语法更简洁(如位运算的>> uint(i)避免负数移位问题)。

相关推荐
NAGNIP9 小时前
万字长文!回归模型最全讲解!
算法·面试
知乎的哥廷根数学学派10 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
yangminlei10 小时前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
计算机毕设VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
J_liaty10 小时前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
面汤放盐10 小时前
后端系统设计文档模板
后端
666HZ66611 小时前
数据结构2.0 线性表
c语言·数据结构·算法
2***d88511 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
五阿哥永琪11 小时前
Spring中的定时任务怎么用?
java·后端·spring
追逐时光者11 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 65 期(2026年1.1-1.11)
后端·.net