这个问题与最近在这里提出的问题有关但又不同。
我刚刚阅读了维基百科伪代码。
algorithm tarjan is
input: graph G = (V, E)
output: set of strongly connected components (sets of vertices)
index := 0
S := empty
for each v in V do
if (v.index is undefined) then
strongconnect(v)
end if
end for
function strongconnect(v)
// Set the depth index for v to the smallest unused index
v.index := index
v.lowlink := index
index := index + 1
S.push(v)
// Consider successors of v
for each (v, …Run Code Online (Sandbox Code Playgroud) 假设我有经纬度坐标的2万余个数据点。所有这些点都落在地图上的定义区域内。我想计算四分之一英里半径内这些点的平均密度。
我在解释它时遇到了麻烦,但是用例是可以输入一些任意坐标,查看该点四分之一英里半径内有多少个点,并确定该点是高于还是低于数据平均值。
我不是在寻找任何特定语言的解决方案,而是在寻找一种通用的(伪代码)解决方案或解决此问题的方法。
我知道一些 C 和一点汇编,想开始学习逆向工程,所以我下载了适用于 Mac 的 Hopper Disassembler 试用版。我创建了一个超级基本的 C 程序:
int main() {
int a = 5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并使用 -g 标志编译它(因为我之前看到过这个并且不确定它是否重要):
gcc -g simple.c
Run Code Online (Sandbox Code Playgroud)
然后我a.out在 Hopper Disassembler 中打开文件并点击伪代码按钮,它给了我:
int _main() {
rax = 0x0;
var_4 = 0x0;
var_8 = 0x5;
rsp = rsp + 0x8;
rbp = stack[2047];
return 0x0;
}
Run Code Online (Sandbox Code Playgroud)
我在这里理解的唯一一行是将变量设置为0x5. rsp = rsp + 0x8;对于这样一个简单的程序,我无法理解所有这些附加行的用途(例如)。有人愿意向我解释这个吗?
此外,如果有人知道逆向工程介绍的良好来源/教程,那也会非常有帮助。谢谢。
全面披露:虽然这不是针对课程的,但它是一个简化的示例,涉及我之前的作业(现已通过)中遇到的问题。
考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取的内容,并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如写入文件)。起初,我尝试了一种简单的同步方法 - 只是锁定对信号量中共享内存的访问 - 但当然,这允许单个写入/读取的多个读取/写入。
我想我已经找到了一种方法来做到这一点,即使用第二个共享内存区域,根据其当前值阻止对读取器或写入器的访问。然后,用伪代码:
before request begins:
initialize shared memory region SHM
initialize synchronization region SHM2 = "0"
initialize sem
consumer:
loop until total bytes read = file length:
while (SHM2 == "0" [lock access to SHM2 while checking]):
wait
read N bytes from SHM
write N bytes to file
sem_wait(sem)
set SHM2 = "0"
sem_post(sem)
producer:
loop until total bytes written = file length:
while (SHM2 == "1" [lock access to SHM2 while checking]): …Run Code Online (Sandbox Code Playgroud) 给出两个数字相等的数字A和B. 通过在每个步骤中增加或减少A中的单个数字,找到将A转换为B的最小步骤数.
例如:如果A = 133且B = 343,则可能的解决方案是133 - > 233 - > 333 - > 343.所需的最小步数为3.
我试过蛮力的方法.这是我的伪代码
while(a!=b)
{
if(a<b)
{
find (b-a)
count number of digits in (b-a) keep it as n
add the power(10,n) to a
moves++;
}
else{
find (a-b)
count number of digits in (a-b) keep it as n
subtract the power(10,n) from a
moves++;
}
}
Run Code Online (Sandbox Code Playgroud)
我无法在所有测试用例中得到正确的答案.请建议一个有效的方法来做到这一点.
我有一些困惑:
for i = 1 to n
Run Code Online (Sandbox Code Playgroud)
这个伪代码的意思是for(i=1; i<n; i++)或for(i=1; i<=n; i++)?
如果其中一个来自其中,那么另一个的伪代码是什么?
在我的书中,Stephen G. Kochan 的《C 语言编程》(第四版)中,我有一个实现埃拉托斯特尼筛法算法的任务,如下所示:
\n显示 1 到 n = 150 之间的所有素数
\n 2 <= i <= n.\nRun Code Online (Sandbox Code Playgroud)\n set <sub>Pixj</sub> to 1.\n Step 6: Add 1 to i and go to step 3.\nRun Code Online (Sandbox Code Playgroud)\n我理解广泛的概念,但很难理解算法中的步骤以及每个步骤的目的。
\n问题:
\n在步骤1中,将所有元素p[i]设置为0的目的是什么?数组元素不需要从 0 到 150 开始吗?
\n在步骤 4 …
我有一个非常简单的问题,我如何在c#代码中转换和使用这个伪代码?
repeat
i=i+1;
until x[i]>=j
Run Code Online (Sandbox Code Playgroud)
我的意思是c#中的代码执行此代码的相同工作?谢谢
rgb范围为0-255(红色,绿色和蓝色)表示应该有256x256x256个可能的rgb颜色值.
如何循环并打印每个值?
我不需要特定的订单但我只想知道如何通过并获取所有值而不跳过任何值.