Python快速异或超范围算法

2024-01-04

有一个编程挑战,需要生成一个XOR基于序列起始号和间隔长度的校验和。

它要求您根据间隔长度迭代序列,并在每次迭代时不断减少为校验和计算选取的元素数量。

Example:


如果起始编号是0间隔长度为3,该过程将如下所示:

0 1 2/

3 4 / 5

6 / 7 8

其中 XOR (^) 校验和是0^1^2^3^4^6 == 2

同样,如果开始是17和间隔长度4,该过程将如下所示:

17 18 19 20 /

21 22 23 / 24

25 26 / 27 28

29/ 30 31 32

产生校验和17^18^19^20^21^22^23^25^26^29 == 14

我的解决方法


使用递归

import operator
import sys

sys.setrecursionlimit(20000)

def answer(start, length):
    lst = [range(start+length*n, start+length*n+length) for n in xrange(length)]
    return my_reduce(lst, length)

def my_reduce(lst, length):
    if not lst: return 0
    l = lst.pop(0)
    return reduce(operator.xor, l[:length], 0) ^ my_reduce(lst, length-1)

使用生成器的迭代方法

def answer(start, length):
    return reduce(operator.xor, gen_nums(start, length))


def gen_nums(start, length):
    l = length
    while l > 0:
        for x in xrange(start, start+l):
            yield x
        start = start + length
        l = l - 1

Problem


我的两种方法运行得不够快。

它们对于琐碎的计算(例如示例中的计算)做得很好,但当间隔长度很大时,它们会花费更多的时间,例如1000

问题

  • 这项挑战正在测试哪些计算机科学概念?
  • 什么是正确的算法方法?
  • 正确使用的数据结构是什么?

我需要了解为什么我的解决方案表现不佳以及哪些算法和数据结构适合这一挑战。


我建议对您的解决方案进行简单的优化。

使用此方法获取范围 [a,b] 的异或

def f(a):
     res = [a, 1, a+1, 0]
     return res[a%4]

def getXor(a, b):
     return f(b) ^ f(a-1)

现在,对于给定的时间间隔,您可以计算 XOR 校验和O(n)代替O(n^2).

def gen_nums(start, length):
    l = length
    ans = 0
    while l > 0:
        ans^= getXor(start,start+l-1)
        start = start + length
        l = l - 1
    return ans

解释

让我们表示f(n)=1⊕2⊕3⊕⋯⊕n, where 表示异或运算。之间所有数字的异或A and B可以表示为f(B)⊕f(A−1), 因为x⊕x=0

现在我们不难发现,

时间复杂度 - O(1)

参考 https://stackoverflow.com/questions/10670379/find-xor-of-all-numbers-in-a-given-range

参考二 https://discuss.codechef.com/questions/84803/how-to-find-xor-of-all-the-elements-in-given-range

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python快速异或超范围算法 的相关文章

  • 如何删除Python字符串的最后一个utf8字符

    我有一个包含 utf 8 编码文本的字符串 我需要删除最后一个 utf 8 字符 到目前为止我做到了 msg msg 1 但这只会删除最后一个字节 只要最后一个字符是 ASCII 代码 它就可以工作 当最后一个字符是多字节字符时 它不再起作
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 如何限制 sympy FiniteSet 包含符号

    我对 sympy 还很陌生 我尝试使用 linsolve 求解线性方程组 这产生了一个可以用以下两行重现的解决方案 d symbols d solution sets FiniteSet d 1 d 4 d 5 d 我的解决方案遵循限制 即
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • 无法将图形另存为 .eps [gswin32c 无法识别]

    我使用Pylab 64位 的Enth tough冠层 在我的报告中 我需要使用乳胶 Xelatex 并使用matplotlib完成图 为了获得第一个想法 我刚刚复制了第二个示例http matplotlib org users usetex
  • 在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN),有些来源引用 O(h)?

    在研究遍历二叉搜索树的任何算法的复杂性时 我看到两种不同的方式来表达同一件事 版本 1 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O h 版本 2 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O logN
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Pandas Dataframe 在由索引分隔的部分中进行插值

    我的示例代码如下 import pandas as pd dictx col1 1 nan nan nan 5 nan 7 nan 9 nan nan nan 13 col2 20 nan nan nan 22 nan 25 nan 30
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 我如何开始玩五子棋?

    我读到Gomoku http en wikipedia org wiki Gomoku它可以使用 Minimax 和 Alpha Beta 剪枝算法来实现 所以 我阅读了这些算法 现在了解了游戏将如何解决 但是当我坐下来编写代码时 我面临着
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • pyplot 中的等宽绘图大小,同时保持纵横比相等

    我想让两个图具有相同的宽度 但是生成的代码缩小了 imshow 图 xx np linspace 0 0 255 5 512 yy np linspace 0 0 255 5 512 Func np random rand len xx l
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc

随机推荐

  • 如何在 Alamofire 中使用 PUT 请求

    我是 swift 的新手 我也尝试使用 Alamofire 从 API 调用数据 我对如何使用它感到很困惑放置请求更新数据 我已经在这里阅读了一些解决方案 但我不知道如何在我的应用程序上应用 我正在创建一个事件应用程序 场景应该是 当参与者
  • 模块“AppModule”导入了意外值“MyCustomModule”

    我正在尝试将我的 angular2 自定义库之一迁移到 RC 6 Webpack 我的目录结构是 src source TS files lib transpiled JS files definition files dev develo
  • 使用 gcc 使用 gets 函数编译我的程序[重复]

    这个问题在这里已经有答案了 每当我尝试这样做时 我都会得到 警告 gets 函数很危险 不应使用 现在 我知道为什么这个功能很糟糕了 但是为了编译我已经编写的程序 我必须使用这个函数 我应该怎么做才能不出现此警告 或具有完全相同属性的函数
  • 以编程方式查找应用程序的 URL

    我需要从我自己的应用程序中启动另一个应用程序 但我没有它的 URL 所以我的问题是 有没有办法根据另一个应用程序的包标识符或 trackid 以编程方式查找其 url 如果你只想启动其他应用程序 你可以使用ios私有api interfac
  • ORA-02303: 无法删除或替换具有类型或表相关项的类型

    我是甲骨文新手 我尝试改变varchar 50 to 250 CREATE OR REPLACE TYPE CEQ OWNER TYPE REC PARAE2 AS OBJECT BONETAT DESC VARCHAR2 250 我收到
  • Android recyclerview v.23.2.0 和设计库 v.23.2.0 已损坏

    更新到 v23 2 0 后 recyclerview 项目有奇怪的行为 非常大 但空间空白 更新到设计库 23 2 0 后 菜单溢出图标变成黑色 应用程序有黑色操作栏 UPDATE在我的 Nexus 5 上 溢出图标和回收器视图行已修复 但
  • 在 jinja for 循环中调用 JavaScript 函数[重复]

    这个问题在这里已经有答案了 我有一个 HTML 页面 在变量中schedule具有以秒为单位的连续十进制数 我的目的是创建一个函数 使用 JavaScript jQuery 及时转换所有这些数字 但我无法理解 如何调用我的函数来转换所有项目
  • WPF 中的命令链接

    有人可以告诉我如何在 WPF 窗口中添加 CommandLink 控件吗 这就是我所说的 CommandLink 的意思 http msdn microsoft com en us library aa511455 aspx http ms
  • CouchDB 组级别和键范围

    谁能向我解释为什么以下不起作用 假设以下文档结构 id 520fb089a6cb538b1843cdf3cca39a15 rev 2 f96c27d19bf6cb10268d6d1c34799931 type nosql location
  • 为什么 Meltdown 和 Spectre 错误这么长时间都没有被发现?

    为什么 Meltdown 和 Spectre 错误这么长时间都没有被发现 近 20 年来 这些错误一直存在于 CPU 中 考虑到对所有使用这些处理器的计算机的严重影响 为什么不尽早发现呢 答案非常简单 现代 CPU 拥有数十亿个晶体管 例如
  • 如何在android中使用rawQuery()

    我有一个这样的sql查询 String loadFav SELECT id title name favorite FROM table1 where favorite 1 UNION ALL SELECT id title name fa
  • 如何在AWS SES html模板中添加添加if条件?

    要求是根据从 api 接收到的正文数据发送模板邮件 BodyData 可能不包含某些标签 请参阅下面的示例模板部分 p sender has invited you to join team teamName p 因此正文数据可能不包含团队
  • 在持续时间参数(# 行、秒、#Tweets 等)后停止 Tweepy 流

    我正在使用 Tweepy 捕获基于主题标签 WorldCup 的流式推文 如下面的代码所示 它按预期工作 class StdOutListener StreamListener Handles data received from the
  • 使用 boost.python 时 C++ 流有什么问题?

    更新 2 我不知道为什么这个仍然被投票 2014 年 3 月 自从我多年前问过这个问题以来 这个问题似乎已经解决了 确保您使用的是最新版本的 boost 更新 也许 C 流需要初始化才能格式化数字 而在 Python 中加载共享库时初始化没
  • 索引/匹配 - 如果第一个值为空,则查找第二个值

    我希望在用 Excel 编写公式时得到一些帮助 我有一个表 其中包含员工列表及其手机号码 但是 该表的结构方式存在许多空白行和重复行 本质上 我希望通过对相应的手机号码执行查找来创建一个没有任何重复项和空白的新表 问题是 当我执行标准索引
  • 如何在 Kubernetes Python 客户端中指定 ca_bundle

    我正在尝试使用Kubernetes Python 客户端 https github com kubernetes client python连接到我的 Kubernetes 集群 该 API 位于我的 CA 签署的 SSL 证书后面 如果我
  • 使用 jwt 和许多角色进行基于角色的访问

    我有一个带有许多控制器的 Web api 通过这些控制器 我定义了很多角色并装饰了控制器 功能 为了访问 api 我使用 jwt 我尝试将我的角色写入 jwt 之类的键值中 这工作正常 但如果我在 jwt 中设置许多角色 令牌就会变得非常大
  • Bootstrap 3.1.0:附加太长

    我在用引导程序3 1 0 当 附加 对于视口来说太长时 它会被切断 永远不会显示底部项目 是否有可能让 Bootstrap 的词缀以用户仍然可以从上到下滚动完整词缀的方式运行 有问题的例子 div class container div c
  • Python 中列的绝对值

    如何将 计数 列的值转换为绝对值 我的数据框的摘要如下 datetime count 0 2011 01 20 00 00 00 14 565996 1 2011 01 20 01 00 00 10 204177 2 2011 01 20
  • Python快速异或超范围算法

    有一个编程挑战 需要生成一个XOR基于序列起始号和间隔长度的校验和 它要求您根据间隔长度迭代序列 并在每次迭代时不断减少为校验和计算选取的元素数量 Example 如果起始编号是0间隔长度为3 该过程将如下所示 0 1 2 3 4 5 6