我正在嘗試對陣列實作左移/右移。
我能夠使用雙回圈完成此操作。我可以得到一些幫助來提高效率嗎?
這是使用 2 個回圈的 LeftShift/RightShift 的作業代碼。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
struct Array
{
int A[10];
int size;
int length;
};
void Display(struct Array arr)
{
printf("\nElements are : \n");
for(int i = 0;i<arr.length;i )
printf("%d ", arr.A[i]);
}
// Left Shift-------------------------------------------------------------------------------------------------------
void LeftShift1(struct Array *arr, int n) //n is the number of shifts
{
int temp = arr->A[0];
for(int i=0; i<n; i )
{
for(int j=0; j<arr->length-1; j )
{
arr->A[j] = arr->A[j 1];
}
arr->A[arr->length-1] = 0;
}
}
//Right Shift-------------------------------------------------------------------------------------------------------
void RightShift(struct Array *arr, int n) //n is the number of shifts
{
for(int i = 0; i<n; i )
{
for(int j=arr->length-1; j>0; j--)
{
arr->A[j] = arr->A[j-1];
}
arr->A[0] = 0;
}
}
int main()
{
struct Array arr={{1,2,3,4,5},10,5};
LeftShift1(&arr, 2);
//RightShift(&arr, 1);
Display(arr);
return 0;
}
我正在嘗試這樣的事情,它使用 2 個迭代器來解決這個問題!
這也有效!
void LeftShift2(struct Array *arr, int n)
{
for(int k=0; k<n; k )
{
int i,j;
for(i=0, j=0; j<arr->length-1; i , j )
{
arr->A[j] = arr->A[j 1];
}
arr->A[arr->length-1] = 0;
}
}
但這可以在沒有回圈的情況下解決嗎?還是用一個回圈?
這可以提高效率嗎?
uj5u.com熱心網友回復:
一些幫助提高效率?
移位:移位一次。從O(n*length)到O(length)。
輪換:一次轉變為臨時。從O(n*length)到O(length)。
n先晉級。
void LeftShift_alt(struct Array *arr, int n) {
if (n > arr->length) {
n = arr->length;
}
memmove(&arr->A[0], &arr->A[n], (arr->length - n)*sizeof arr->A[0]);
memset(&arr->A[arr->length - n], 0, n * sizeof arr->A[0]);
}
void LeftRotate_alt(struct Array *arr, int n) {
if (arr->length > 0) {
n %= arr->length;
if (n > 0) {
int temp[n];
memcpy(temp, arr->A, sizeof temp);
memmove(arr->A, arr->A n, sizeof arr->A[0] * (arr->length - n));
memcpy(arr->A n, temp, sizeof temp);
}
}
}
mem...()如果需要,替換為指標代碼。
uj5u.com熱心網友回復:
您可以在結構中提供所有常見的訪問運算子(<<、>>、[] 等),而不是實際移動陣列的內容。(假設您正在使用支持此功能的編譯器。否則,您將需要創建 C 風格的這些函式。)如果有人這樣做:
my_array <<= 5;
my_array >>= 2;
...您只需跟蹤陣列已移動了多少。在這種情況下,他們總共向左移動了 3 個位置。當有人索引到陣列中時,您將累積的偏移量添加到他們的索引(以陣列的大小為模)以獲取他們正在尋找的條目的實際位置。這使得移位 O(1) 而不是 O(n)。如果您正在尋找一種有效的解決方案,那么這已經足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/324136.html
