Questions tagged «algorithm»

算法是定义明确的问题解决方案的一系列明确定义的步骤。当您的问题与算法设计有关时,请使用此标签。

7
分区中唯一子字符串的最大数量
我修改了标题,以使其更易于理解。 这是问题的详细版本: 我们有一个字符串s ,想要将其拆分为子字符串。每个子字符串彼此不同。一次切割最多可以拥有的唯一子字符串的数量是多少。换句话说,串联形成form的唯一子字符串的最大数量是多少s。 这里有些例子: Example 1 s = 'aababaa' output = 4 Explain: we can split `s` into aa|b|aba|a or aab|a|b|aa, and 4 is the max number of substrings we can get from one split. Example 2 s = 'aba' output = 2 Explain: a|ba Example 3 s = …

3
对于给定的两个整数A和B,找到一对数字X和Y,使得A = X * Y和B = X x或Y
我正在为一本竞争激烈的编程书中的这个问题而苦苦挣扎,但没有解决方案。对于给定的两个整数A和B(可以适合64位整数类型),其中A是奇数,请找到一对数字X和Y,使得A = X * Y和B = X xorY。我的方法是列出A的所有约数,并尝试过的sqrt(A)下的sqrt(A)与数字配对数字,乘达一 ,看看他们的XOR等于乙。但是我不知道这是否足够有效。什么是解决这个问题的好方法/算法?

3
给定整数N。大于N且仅以0或1为数字的最小整数是什么?
我有一个整数N。我必须找到大于N的最小整数,该整数不包含0或1之外的任何数字。例如:如果N = 12答案为100。我已经用C ++编写了一种蛮力方法。 int main() { long long n; cin >> n; for (long long i = n + 1; ; i++) { long long temp = i; bool ok = true; while (temp != 0) { if ( (temp % 10) != 0 && (temp % 10) != …
15 c++  algorithm 

3
查找包含200000+个元素的2个数组元素的最小乘积的最快方法
我有一个数组a[n]。该号码n由我们输入。我需要找到的最小的产品a[i]和a[j]如果: 1) abs(i - j) > k 2)a[i] * a[j]最小化 这是我的解决方案(非常幼稚): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { for(ll j=0;j<n;j++) { if(i!=j) …

2
约束满足问题缺少一个约束
我是大学的实验室实践导师,根据去年的学生评论,我们希望我和我的老板都能够解决。我的老板选择继续编写C脚本,然后选择python(python-constraint)来尝试解决我们的问题。 资讯资讯 有6节课 有4个角色 有6种做法 有32名学生 每队有4名学生 问题: 在4个不同的阶段的4个练习中,为每个学生分配4个角色。 限制条件: 学生应该做一次角色 学生应在6种中进行4种不同的练习 学生每节只能做一次练习 学生只能见一次同伴 范本: 这是我对学生的感觉模板,每个团队由4个学生组成,职位[0、1、2或3]是分配给他们的角色。每个可用职位的编号从1到128 [# Semester [ # Session [ # Practice/Team 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]], [[25, 26, …

3
如何找到将物品移到堆栈中某个位置的最小移动次数?
给定一组NXP堆栈,其中N为堆栈数,P为堆栈容量,我如何计算从位置A的某个节点移动到任意位置B所需的最小交换数?我正在设计一个游戏,最终目标是对所有堆栈进行排序,以使它们都具有相同的颜色。 # Let "-" represent blank spaces, and assume the stacks are stacks = [ ['R', 'R', 'R', 'R'], ['Y', 'Y', 'Y', 'Y'], ['G', 'G', 'G', 'G'], ['-', '-', '-', 'B'], ['-', 'B', 'B', 'B'] ] 如果我想在插入一个“B” stacks[1][1]这样stacks[1] = ["-", "B", "Y", "Y"]。如何确定所需的最小移动次数? 我一直在研究多种方法,尝试过遗传算法,可以从状态生成所有可能的移动,对它们进行评分,然后继续沿最佳得分路径前进,我还尝试运行Djikstra的算法来对问题进行寻路。看起来很简单,但是我无法找到一种方法来让它在指数时间以外的任何时间运行。我是否缺少适用于此的算法? 编辑 我已经编写了此函数来计算所需的最小移动量:堆栈:表示堆栈中棋子的字符列表,堆栈[0] [0]是堆栈[0]的顶部stack_ind:将要添加到堆栈中的片断的堆栈stacks.exe def calculate_min_moves(stacks, stack_ind, …

7
公平划分列表中的元素
给定玩家的评分列表,我需要将玩家(即评分)尽可能公平地分为两组。目标是最大程度地减少团队的累积评分之间的差异。我如何将玩家分成团队没有任何限制(一个团队可以有2个玩家,而另一个团队可以有10个玩家)。 例如:[5, 6, 2, 10, 2, 3, 4]应返回([6, 5, 3, 2], [10, 4, 2]) 我想知道解决这个问题的算法。请注意,我正在参加在线编程入门课程,因此,简单的算法将不胜感激。 我正在使用以下代码,但是由于某种原因,在线代码检查器说这是不正确的。 def partition(ratings): set1 = [] set2 =[] sum_1 = 0 sum_2 = 0 for n in sorted(ratings, reverse=True): if sum_1 < sum_2: set1.append(n) sum_1 = sum_1 + n else: set2.append(n) sum_2 = sum_2 + …
12 python  algorithm  list 

3
有没有一种有效的方法可以在给定总和或平均值的范围内生成N个随机整数?
的恩惠到期在18小时。这个问题的答案有资格获得+200声望奖励。 Peter O.正在寻找一个规范的答案: 总结:(1)找到比代码中实现的算法更有效的算法,或者(2)陈述有效数量的公式。组合以及如何“取消排序”组合编号。 是否有一种有效的方法来生成N个整数的随机组合,从而使- 每个整数都在区间[ min,max]中, 整数之和为sum, 整数可以按任何顺序出现(例如,随机顺序),并且 从满足其他要求的所有组合中随机选择均匀组合吗? 对于随机组合,是否有一种类似的算法,其中整数必须按其值的排序顺序出现(而不是以任何顺序出现)? (如果是,mean则选择平均值为的适当组合是一个特殊情况sum = N * mean。此问题等效于生成由sumN个部分组成的均匀随机分区,每个部分在[[ ]] 区间中min,max并按其顺序以任何顺序或排序顺序出现值(视情况而定)。) 我知道,对于以随机顺序出现的组合,可以通过以下方式解决此问题(EDIT [Apr. 27]:算法已修改。): 如果N * max < sum或N * min > sum,则没有解决方案。 如果N * max == sum,则只有一个解,其中所有N数字都等于max。如果N * min == sum,则只有一个解,其中所有N数字都等于min。 使用 Smith和Tromble中给出的算法(“从单位单纯形抽样”,2004年),生成N个具有和的随机非负整数sum - N * min。 添加min到这种方式生成每个号码。 如果任何数字大于max,请转到步骤3。 但是,如果该算法max远小于,则该算法速度较慢sum。例如,根据我的测试(使用上述涉及的特殊情况的实现mean),该算法平均会拒绝- 约1.6个样本N = …

3
给定两个序列,找到一个结束点与另一个开始点之间的最大重叠
我需要找到一个有效的(伪)代码来解决以下问题: 鉴于(不一定是不同的)整数两个序列(a[1], a[2], ..., a[n])和(b[1], b[2], ..., b[n]),找到最大d,从而a[n-d+1] == b[1],a[n-d+2] == b[2]......,和a[n] == b[d]。 这不是家庭作业,实际上是在尝试使两个张量沿尽可能多的维度收缩时想到的。我怀疑存在一种有效的算法(也许O(n)?),但是我无法提出不存在的算法O(n^2)。该O(n^2)方法是在明显的循环d,然后在项目内部循环来检查所需要的状态,直到打到最大d。但是我怀疑有比这更好的事情。

1
高效的字符串截断算法,顺序删除相等的前缀和后缀
每次测试的时间限制:5秒 每次测试的内存限制:512 MB 系统会为您提供一串s长度n(n≤5000)的字符串。您可以选择该字符串的任何适当前缀(也就是其后缀),然后删除所选的前缀或相应的后缀。然后,您可以对结果字符串应用类似的操作,依此类推。应用最佳操作顺序后,最终字符串的最小长度是多少? 输入 每个测试的第一行包含一个s由小英文字母组成的字符串。 输出 输出单个整数-最终字符串的最小长度,可以在应用此类操作的最佳顺序后实现。 例子 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc …

1
按键对ImmutableSortedDictionary范围进行枚举
我正在阅读有关C#的内容ImmutableSortedDictionary,System.Collections.Immutable并在考虑如何在程序中应用它。我非常喜欢C ++的lower_bound和upper_bound(请参阅此处),而我更希望看到某种范围查找。但是,文档中似乎缺少类似的方法。我想念什么吗?还是MS真正提供了分类字典,而没有有效访问分类范围?这似乎并不像可以对IEnumerable扩展方法那样对某个键进行某些操作,所以我有点困惑,因为我没有看到集合直接提供的某些功能。

4
在街道数据中查找街区(斜线)(图形)
我正在寻找一种自动在城市中将邻域定义为图形上的多边形的方法。 我对邻居的定义包括两个部分: 街区:在多条街道之间封闭的区域,其中街道(边)和交叉点(节点)的数量最少为3(三角形)。 邻域:对于任何给定的块,所有与该块直接相邻的块以及该块本身。 有关示例,请参见下图: 例如,B4是由7个节点和6个连接它们的边定义的块。如此处大多数示例所示,其他块由4个节点和4个连接它们的边定义。此外,附近的B1包括B2(反之亦然),而B2还包括B3。 我正在使用osmnx从OSM获取街道数据。 使用osmnx和networkx,如何遍历图形以查找定义每个块的节点和边? 对于每个块,我如何找到相邻的块? 我正在朝着一段代码工作,该代码采用一个图形和一对坐标(纬度,经度)作为输入,标识相关的块并返回该块的多边形以及如上定义的邻域。 这是用于制作地图的代码: import osmnx as ox import networkx as nx import matplotlib.pyplot as plt G = ox.graph_from_address('Nørrebrogade 20, Copenhagen Municipality', network_type='all', distance=500) 和我尝试寻找节点和度数不同的派系。 def plot_cliques(graph, number_of_nodes, degree): ug = ox.save_load.get_undirected(graph) cliques = nx.find_cliques(ug) cliques_nodes = [clq for clq in cliques if …

2
Excel / SharedStrings的排序算法
在Excel中,它们将字符串“压缩”为数字映射(尽管我不确定在这种情况下compress这个词是否正确)。这是下面显示的示例: 虽然这有助于减少总体文件大小和内存占用量,但是Excel如何对字符串字段进行排序?是否每个字符串都需要进行查找映射:如果是这样,这不会大大增加/减慢对字符串字段进行排序的成本(如果有1M的值,则不会进行1M的键查找)不重要的)。关于此的两个问题: 是在Excel应用程序本身中使用共享字符串,还是仅在保存数据时使用共享字符串? 那么在现场排序的示例算法是什么?任何语言都可以(C,C#,C ++,Python)。

8
查找人口最多的年份(最有效的解决方案)
给定两个数组;$births包含表明某人出生的出生年份列表,以及$deaths表明某人死亡的死亡年份列表,我们如何找到人口最高的年份? 例如,给定以下数组: $births = [1984, 1981, 1984, 1991, 1996]; $deaths = [1991, 1984]; 人口最高的年份应该是1996,因为3那一年人们还活着,这是所有年份中人口最高的年份。 这是运行的数学公式: | 出生| 死亡 人口| | ------- | ------- | ------------ || | 1981年| | 1 | | 1984年| | 2 | | 1984年| 1984年| 2 | | 1991年| 1991年| 2 | | 1996 | | …

1
如何在C ++ 20中实现shift_right()?
在C ++ 20中,<algorithm>标头获得了两个新算法:shift_left()和shift_right()。他们两个都接受任何LegacyForwardIterator。对于shift_left(),指定了``移动i从​0'' 开始以递增顺序执行; 对于shift_right(),指定为“如果ForwardIt满足LegacyBidirectionalIterator要求,则以i从开始的降序执行移动last - first - n - 1。” 我可以想到一种相当容易实现的方法shift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.