小编A. *_*led的帖子

当数组有重复值时,为什么快速排序算法持续时间会增加?

我正在尝试使用 std::chrono 时间计算并使用某个范围 [A, B] 内随机生成的整数数组来测量合并排序和快速排序函数的持续时间,数组的大小从 5000 到 100,000 个整数不等。

我的代码的目标是证明当在快速排序中选择(枢轴)的方法得到改进时,快速排序函数最终比合并排序花费更少的时间来处理数组,我选择枢轴的方式是使用随机索引方法来最小化复杂度为 (n^2) 的概率,但是在我将在下面描述的某些情况下,快速排序最终比合并排序花费更多的时间,我想知道为什么会发生这种情况。

情况1:数组中数字的范围很小,这增加了数组中出现重复数字的可能性。

情况 2:当我使用像 clion 这样的本地 IDE 时,快速排序功能比合并排序花费更多的时间,但是像 IDEONE.com 这样的在线编译器在两种排序算法中给出相似的结果(即使生成的整数的范围是小的)

这是我在上述案例中得到的结果(第一行数字是合并排序结果,第二行是快速排序结果):

1-clion 结果范围很窄(-100、600) clion 结果范围很窄 (-100, 600)

2-clion 结果具有广泛的数字 (INT_MIN, INT_MAX) clion 结果具有广泛的数字(INT_MIN、INT_MAX)

3-IDEONE 结果的数字范围很窄(-100、600) IDEONE 结果的数字范围很窄(-100、600)

4- IDEONE 结果的范围很广(INT_MIN、INT_MAX) IDEONE 结果具有广泛的数字(INT_MIN、INT_MAX)

#include <bits/stdc++.h>
#include <chrono>
#include <random>

using namespace std;

mt19937 gen(chrono::steady_clock::now().time_since_epoch().count());
int* generateArray(int size)
{
    int* arr = new int[size];
    uniform_int_distribution<> distribution(INT_MIN, INT_MAX);
    for (int i=0; i < size; ++i)
    {
        arr[i] = distribution(gen);
    }
    return arr;
}
void merge(int* leftArr, int nL, int* rightArr, int …
Run Code Online (Sandbox Code Playgroud)

c++ performance mergesort quicksort time-complexity

4
推荐指数
1
解决办法
720
查看次数

为什么 glUseProgram 每帧都用 glUniform 调用?

我正在关注 OpenGL v3.3 教程,该教程指导我使用glUniform4f修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL是一个状态机,我们不解除绑定当前shaderProgram被使用,我们宁可修改赋予给该程序的着色器的一个属性,那么为什么我们需要调用glUseProgram每一帧?

我知道对于更高版本的 OpenGL,情况并非如此,但我仍然想了解为什么 v3.3 会出现这种情况

OpenGL程序:

while (!glfwWindowShouldClose(window))
{
    processInput(window);

    glClearColor(0.2f, 1.0f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);


    glUseProgram(shaderProgram); // the function in question

    float redValue = (sin(glfwGetTime()) / 2.0f) + 0.5f;
    int colorUniformLocation = glGetUniformLocation(shaderProgram, "ourColor");
    glUniform4f(colorUniformLocation, redValue, 0.0f, 0.0f, 1.0f);

    std::cout << colorUniformLocation << std::endl;

    glBindVertexArray(VAO[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(VAO[1]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glfwSwapBuffers(window);
    glfwPollEvents();
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;
void main() 
{
 FragColor = ourColor;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了指出 …

c++ opengl fragment-shader

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