Q:
An array of size N is given. Array is sub divided into sub array of
size K. Find maximum value of each sub array.
It is sliding window. Let array be “1 2 3 4 5 6” and k=2
then Sub arrays {1 2},{2 3},{3 4},{4 5},{5 6}.
then Sub arrays {1 2},{2 3},{3 4},{4 5},{5 6}.
For all these sub arrays, maximum of each needs to found.[Array is unordered.]
struct node{
int data, index;
struct node next;
struct node *prev;
};
struct DQueue{
struct node *front;
struct node *rear;
};
struct DQueue createDQ(){
struct DQueue* newNode=(struct DQueue*)malloc(sizeof(struct DQueue));
newNode->front=newNode->rear=NULL;
}
bool isDQEmpty(struct DQueue* DQ){
return (DQ->front==NULL);
}
struct node* createNode(int data,int index){
struct node* newDQNode=(struct node*)malloc(sizeof(struct node));
newDQNode->data=data;
newDQNode->index=index;
return newDQNode;
}
void pushDQFront(struct DQueue* DQ,int data,int index){
struct node* temp=createNode(data,index);
if(DQ->front==NULL && DQ->rear==NULL){
DQ->front=DQ->rear=temp;
}else{
temp->next=DQ->front;
DQ->front->prev=temp;
DQ->front=temp;
}
}
void pushDQBack(struct DQueue* DQ,int data,int index){
struct node* temp=createNode(data,index);
if(DQ->front==NULL && DQ->rear==NULL){
DQ->front=DQ->rear=temp;
}else{
DQ->rear->next=temp;
temp->prev=DQ->rear;
DQ->rear=temp;
}
}
void popDQFront(struct DQueue* DQ){
if(isDQEmpty(DQ)){
return;
}
struct node* temp=DQ->front;
if(DQ->front==DQ->rear){
DQ->front=DQ->rear=NULL;
}else{
DQ->front->next->prev=NULL;
DQ->front=DQ->front->next;
temp->next=NULL;
}
free(temp);
temp=NULL;
}
void popDQBack(struct DQueue* DQ){
if(isDQEmpty(DQ)){
return;
}
struct node* temp=DQ->rear;
if(DQ->front==DQ->rear){
DQ->front=DQ->rear=NULL;
}else{
DQ->rear->prev->next=NULL;
DQ->rear=DQ->rear->prev;
temp->prev=NULL;
}
free(temp);
temp=NULL;
}
struct node* frontOfDQ(struct DQueue* DQ){
if(isDQEmpty(DQ)){
return NULL;
}
return DQ->front;
}
struct node* rearOfDQ(struct DQueue* DQ){
if(isDQEmpty(DQ)){
return NULL;
}
return DQ->rear;
}
void maxSlidingWindow(int a[],int n,int k){
int i;
struct DQueue* DQ=createDQ();
for(i=0;i<k;i++){
while(!isDQEmpty(DQ) && a[i] >= rearOfDQ(DQ)->data){
popDQBack(DQ);
}
pushDQBack(DQ,a[i],i);
}
printf("%d",frontOfDQ(DQ)->data);
for(;i<n;i++){
while(!isDQEmpty(DQ) && frontOfDQ(DQ)->index <= i-k){
popDQFront(DQ);
}
while(!isDQEmpty(DQ) && a[i] >= rearOfDQ(DQ)->data){
popDQBack(DQ);
}
pushDQBack(DQ,a[i],i);
printf("%d",frontOfDQ(DQ)->data);
}
}
int main(){
int a[]={3,5,2,8,2,3,7,9,2,2,44,66,2,23,4,54,2};
int n=sizeof(a)/sizeof(a[0]);
int k=4;
maxSlidingWindow(a,n,k);
system("PAUSE");
}
No comments:
Post a Comment