标签: algorithm

处理一组重写方法取决于它是任意的还是交替的

我有这段代码,我想知道第一个输入和第二个输入的执行时间之间存在差异的原因。我认为它应该花费相同的时间,因为我正在调用相同的方法,但它在两个对象中不执行任何操作。但是 input1 (这是 2 个实例的交替)在我的计算机上花费了 5 秒。input2(这是两个实例之间的任意选择)在我的计算机上花费了 17 秒。

public class Program {


    private static final Runnable FIRST_INSTANCE = () -> {};
    private static final Runnable SECOND_INSTANCE = () -> {};

    private static Runnable[] input1() {
        Runnable[] array = new Runnable[10000];
        for (int i = 0; i < array.length; i++) {
            array[i] = i % 2 == 0 ? FIRST_INSTANCE : SECOND_INSTANCE;
        }
        return array;
    }


    private static Runnable[] input2() {
        Random rnd = new Random(0);
        Runnable[] array = new …
Run Code Online (Sandbox Code Playgroud)

java algorithm lambda overriding time-complexity

6
推荐指数
1
解决办法
160
查看次数

C++“无原始循环”而不损失性能

所以“新(旧)大事”是 C++ 中的“无原始循环”。我正在尝试以这种方式编写代码,但似乎效率很低。是的,有些 STL 算法可以做任何事情,但它们似乎效率不高。

例如,我有一种情况,我想要一个指向节点数组中得分最高的节点的指针。确定该分数是一项代价高昂的浮点运算。所以我实现了STL算法版本并将其与原始循环进行了比较:

#include <cfloat>
#include <iostream>
#include <array>
#include <algorithm>
#include <numeric>

static int counter;

class Node {
public:
    auto Score() const -> double {
        std::cout << "complex calculation\n";
        counter++;
        return 1;
    }
};

int main()
{
    
    std::array<Node, 10> nodes;
    
    counter = 0;
    Node const* nodePtr = std::max_element(std::cbegin(nodes), std::cend(nodes),
        [](Node const& node1, Node const& node2) {
            return node1.Score() < node2.Score();
        });
    std::cout << "algorithm count " << counter << std::endl;
    
    counter = 0;
    double maxScore = …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm loops

6
推荐指数
1
解决办法
2270
查看次数

将嵌套字典中的所有键从camelCase转换为snake_case

我有一本类似这样的字典:

{
     'firstName': 'abc',
     'lastName': 'xyz',
     'favoriteMovies': ['Star Wars', 'The lone ranger'],
     'favoriteCountries': [
          {'country': 'China', 'capitalCity': 'Beiging'},
          {'country': 'India', 'capitalCity': 'New Delhi'}
     ]
}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为snake_case,如下所示

{
    'first_name': 'abc',
    'last_name': 'xyz',
    'favorite_movies': ['Star Wars', 'The lone ranger'],
    'favorite_countries': [
        {'country': 'China', 'capital_city': 'Beiging'},
        {'country': 'India', 'capital_city': 'New Delhi'}
     ]
}  
Run Code Online (Sandbox Code Playgroud)

字典可以是任何长度深度。

我目前的解决方案是

import re

def convert_snake_case_to_camel_case(data):
    required_dict = {}

    for key, value in data.items():
        if type(value) == str:
            new_key = re.sub("([a-z0-9])([A-Z])", r"\1_\2", key).lower()
            required_dict[new_key] = value
        elif type(value) == list …
Run Code Online (Sandbox Code Playgroud)

python algorithm

6
推荐指数
3
解决办法
1万
查看次数

为什么字符串的空间复杂度是 O(n) 而数字是 O(1)?

我对辅助空间复杂性有点迷失。

在我参加的讲座中,讲师指出字符串的空间复杂度为 O(n),因为字符串的长度 (n) 会有所不同。但诸如数字、布尔值、未定义等原语具有恒定的空间复杂度 O(1)。

我很困惑,因为如果字符串的空间长度不同,那么数字也不一样吗?因为它们也会有不同的“长度”?

我确实理解布尔值和未定义的复杂度是 O(1),我的意思是真/假、未定义和 null 是与长度无关的实例。

如果有人能为我澄清这一点,我将不胜感激。

algorithm space-complexity

6
推荐指数
1
解决办法
1469
查看次数

模糊搜索与全文搜索到底有什么不同?

在我的项目中,我被要求在我们正在使用的数据库上实现文本查询服务;PostgreSQL。我使用过 Postgresql 全文搜索功能,它在时间方面工作得相当好。全文搜索的一个问题是,它不具有模糊搜索能力。另一方面,有一个名为pgtrgm的扩展 ,提供用于确定字母数字文本相似度的函数和运算符。还有几个使用 pgtrgm 进行文本搜索的示例,例如:

select actor
    from products
    where actor % 'tomy';
Run Code Online (Sandbox Code Playgroud)

如您所知,postgres FTS 的示例也在这里;

SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery('friend');
Run Code Online (Sandbox Code Playgroud)

那么,主要问题是,这两种搜索策略有什么区别?哪种方式更适合搜索文本?可以将它们混合吗?我还需要说的是,性能也是一个重要的问题。提前致谢!

regex sql database algorithm postgresql

6
推荐指数
1
解决办法
4976
查看次数

如何比较两个列表并找出“添加”“删除”“未更改”部分

我要这个:

def compare_list(old, new):
    new_set = set(new)
    old_set = set(old)
    return new_set - old_set, old_set - new_set, new_set & old_set

old = [1, 2, 3]
new = [5, 4, 2, 3]

added, deleted, unchanged = compare_list(old, new)

print("added: ", added)
print("deleted: ", deleted)
print("unchanged: ", unchanged)
Run Code Online (Sandbox Code Playgroud)
added:  {4, 5}
deleted:  {1}
unchanged:  {2, 3}
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎效率很低。所以我想知道还有什么更有效的解决方案吗?或内置功能?

python algorithm list

6
推荐指数
1
解决办法
1598
查看次数

如何填补元组列表中的空白

我有一个元组列表,如下所示:

[(1, 'Red'), (2, 'Yellow'), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
Run Code Online (Sandbox Code Playgroud)

元组中的数字代表索引。但是,由于我的输入文件中缺少一些索引,因此我需要在列表中插入一些元组,并使列表如下所示:

[(1, 'Red'), (2, 'Yellow'), (3, None), (4, None), (5, None), (6, 'Pink'), (7, 'Blue'), (8, 'Green')]
Run Code Online (Sandbox Code Playgroud)

如果你们中的一些人有任何想法,如果您花时间发表评论,我将非常感激。

python algorithm indexing tuples

6
推荐指数
1
解决办法
780
查看次数

最长正确前缀/后缀算法为什么/如何工作?

LPS(最长正确前缀,也是后缀)算法如下:

public static int[] constructLPSArray(String s) {
        int n = s.length();
        int[] arr = new int[n];
        int j = 0;
        for (int i = 1; i < n; ) {
            if (s.charAt(i) == s.charAt(j)) {
                arr[i] = j + 1;
                i++;
                j++;
            } else {
                if (j != 0) {
                    j = arr[j - 1];
                } else {
                    i++;
                }
            }
        }
        return arr;
    }
Run Code Online (Sandbox Code Playgroud)

部分if (s.charAt(i) == s.charAt(j))看起来很清楚,但else部分却不清楚。我们为什么这样做:

if (j != 0) {
  j = …
Run Code Online (Sandbox Code Playgroud)

arrays algorithm prefix knuth-morris-pratt suffix

6
推荐指数
1
解决办法
2396
查看次数

Codility 钉板

尝试了解 Codility NailingPlanks 的解决方案。

\n\n

问题链接:\n https://app.codility.com/programmers/lessons/14-binary_search_algorithm/nailing_planks/

\n\n
\n

给定两个由 N 个整数组成的非空数组 A 和 B。\n 这些数组代表 N 个木板。更准确地说,A[K] 是第 K\xe2\x88\x92 个木板的起点,\n B[K] 是终点。

\n\n

接下来,给出一个由 M 个整数组成的非空数组 C。该数组代表 M 个钉子。更准确地说,C[I] 是您可以敲入第 I\xe2\x88\x92 个钉子的位置。

\n\n

如果存在钉子 C[I]\n 使得 A[K] \xe2\x89\xa4 C[I] \xe2\x89\ ,我们说木板 (A[K], B[K]) 被钉住xa4 B[K]。

\n\n

目标是找到必须使用的最少钉子数量,直到钉完所有木板。换句话说,您应该找到一个值 J,使得仅使用前 J 个钉子后即可钉好所有木板。更准确地说,对于每个木板 (A[K], B[K]) 使得 0 \xe2\x89\xa4 K\n < N,应该存在一个钉子 C[I] 使得 I < J 且 A[K ] \xe2\x89\xa4 C[I] \xe2\x89\xa4\n B[K]。

\n
\n\n

解决方案链接:\n https://github.com/ZRonchy/Codility/blob/master/Lesson12/NailingPlanks.java

\n\n
import java.util.Arrays;\n\nclass Solution {\n …
Run Code Online (Sandbox Code Playgroud)

java algorithm binary-search

6
推荐指数
1
解决办法
5241
查看次数

给定两个二维点列表,如何为第一个列表中的每个点找到第二个列表中最接近的点?

我有两个随机排序的 2d 点的大型 numpy 数组,假设它们是 A 和 B。我需要做的是找到两个数组之间“匹配”的数量,其中匹配是 A 中的一个点(称之为A')在某个给定半径 R 内,并且 B 中的一个点(称为 B')。这意味着 A 中的每个点都必须与 B 中的 1 个点匹配或没有点匹配。返回两个数组之间匹配的列表索引也很好,但这不是必需的。由于在这个半径R内可以有很多点,所以似乎最好找到B中距离A'最近的点,然后检查它是否在半径R内。这可以简单地用距离公式来测试dx^2 + dy^2。显然,有一个遍历两个数组的强力 O(n^2) 解决方案,但我需要更快的东西,希望 O(n log n) 。

我所看到的是,Voronoi 图可以用于解决这样的问题,但是我不确定这是如何实现的。我不熟悉 Voronoi 图,所以我用 生成它scipy.spatial.Voronoi。是否有使用这些图来解决此问题的快速算法,或者还有其他算法吗?

python algorithm 2d

6
推荐指数
1
解决办法
4633
查看次数