diff --git a/src/components/expr2.vue b/src/components/expr2.vue index 878c8db..d175486 100644 --- a/src/components/expr2.vue +++ b/src/components/expr2.vue @@ -15,10 +15,15 @@ provide("disk",new Disk()); - +
+ +
\ No newline at end of file diff --git a/src/components/expr2/DISK.vue b/src/components/expr2/DISK.vue index 6b22cbc..660a897 100644 --- a/src/components/expr2/DISK.vue +++ b/src/components/expr2/DISK.vue @@ -6,7 +6,16 @@ import {storeToRefs} from "pinia"; import useExpr2Store from "@/store/expr2/expr2Store.ts"; //18 <-> -12 const duration = 1, animationCount = 40; -const {currentTrack, trackCount, trackFromIndex, trackToIndex, operations, startTrack,selectTrackFromIndex,selectTrackToIndex} = storeToRefs(useExpr2Store()); +const { + currentTrack, + trackCount, + trackFromIndex, + trackToIndex, + operations, + startTrack, + selectTrackFromIndex, + selectTrackToIndex +} = storeToRefs(useExpr2Store()); const degree = computed(() => 6 - (currentTrack.value / trackCount.value * (30) - 12) ); @@ -17,17 +26,16 @@ const cssVars = computed(() => { }); const trackDelta = computed(() => { let start = trackFromIndex.value === -1 ? startTrack.value : operations.value[trackFromIndex.value].track; - let end = trackToIndex.value === -1 ? startTrack.value : operations.value[trackToIndex.value].track; + let end = trackToIndex.value === -1 ? startTrack.value : (trackToIndex.value >= operations.value.length ? 0 : operations.value[trackToIndex.value].track); return end - start; }); -const selectTrackSum = computed(()=>{ - if(selectTrackFromIndex.value === selectTrackToIndex.value) +const selectTrackSum = computed(() => { + if (selectTrackFromIndex.value === selectTrackToIndex.value) return 0; let t = 0; - let last = selectTrackFromIndex.value === -1? selectTrackToIndex.value: operations.value[selectTrackFromIndex.value].track; - console.log(selectTrackFromIndex.value,selectTrackToIndex.value,t); - for(let i = Math.max(0,selectTrackFromIndex.value);i<=selectTrackToIndex.value;i++) - { + let last = selectTrackFromIndex.value === -1 ? startTrack.value : operations.value[selectTrackFromIndex.value].track; + console.log(selectTrackFromIndex.value, selectTrackToIndex.value, t); + for (let i = Math.max(0, selectTrackFromIndex.value); i <= selectTrackToIndex.value; i++) { console.log(operations.value[i].track); t += Math.abs(operations.value[i].track - last); last = operations.value[i].track; @@ -122,6 +130,7 @@ watch(degree, (newDeg) => { top: 396px; left: 210px; } + #track-sum { z-index: 2; position: absolute; diff --git a/src/components/expr2/OperationTable.vue b/src/components/expr2/OperationTable.vue index 44590db..1fbd0cc 100644 --- a/src/components/expr2/OperationTable.vue +++ b/src/components/expr2/OperationTable.vue @@ -2,7 +2,7 @@ import {storeToRefs} from "pinia"; import {Input} from "tdesign-vue-next"; -import {computed} from "vue"; +import {Ref, ref, watch} from "vue"; import useExpr2Store from "@/store/expr2/expr2Store.ts"; import {Operation} from "@/store/expr2/defaultOperation.ts"; @@ -16,17 +16,32 @@ let { trackFromIndex, trackToIndex, selectTrackFromIndex, - selectTrackToIndex + selectTrackToIndex, + tableUpdate } = storeToRefs(expr2Store); -let data = computed(() => { - console.log(startTrack.value); - return [{track: startTrack.value, id: 0}, ...operations.value].map((operation: Operation, index: number) => { +let data: Ref<{ key: string, id: number, track: number }[]> = ref<{ + key: string, + id: number, + track: number +}[]>([{track: startTrack.value, id: 0}, ...operations.value].map((operation: Operation, index: number) => { + return { + key: String(index + 1), + id: operation.id, + track: operation.track, + } +})); + +watch(tableUpdate, (newVal) => { + if (newVal === false) + return; + data.value = [{track: startTrack.value, id: 0}, ...operations.value].map((operation: Operation, index: number) => { return { key: String(index + 1), id: operation.id, track: operation.track, } }); + tableUpdate.value = false; }); let beforeKey = -1; let beforeFromKey = -1; @@ -158,14 +173,28 @@ function ActiveChange(rows: string[]) { return; selectTrackFromIndex.value = parseInt(rows[0]) - 2; selectTrackToIndex.value = parseInt(rows[rows.length - 1]) - 2; + if (selectTrackToIndex.value === selectTrackFromIndex.value) { + if (selectTrackFromIndex.value >= 0 && selectTrackFromIndex.value < operations.value.length) + beforeKey = operations.value[selectTrackFromIndex.value].track; + else if (selectTrackFromIndex.value === -1) + beforeKey = startTrack.value; + else + beforeKey = currentTrack.value; + } } // row Error function InsertBefore(row: number) { - originOperations.value.splice(row - 1, 0, { - id: 0, - track: -1 - }); + if (row === 1) + originOperations.value.splice(0, 0, { + id: 0, + track: -1 + }); + else + originOperations.value.splice(row - 2, 0, { + id: 0, + track: -1 + }); tableChanged.value = true; } @@ -179,7 +208,9 @@ function InsertEnd() { // row Error function Delete(row: number) { - originOperations.value.splice(row - 1, 1); + let key = data.value[row - 1].key; + let index = FindOriginOperationIndex(key); + originOperations.value.splice(index, 1); tableChanged.value = true; } diff --git a/src/logical/expr2/disk.ts b/src/logical/expr2/disk.ts index 2457708..3f9b8b6 100644 --- a/src/logical/expr2/disk.ts +++ b/src/logical/expr2/disk.ts @@ -20,7 +20,8 @@ export class Disk { trackCount, failInfo, tableChanged, - dataChanged + dataChanged, + tableUpdate } = storeToRefs(useExpr2Store()); watch(tableChanged, (newVal) => { if(newVal === false) @@ -46,6 +47,7 @@ export class Disk { } } dataChanged.value = true; + tableUpdate.value = true; tableChanged.value = false; }); } @@ -77,7 +79,7 @@ export class Disk { let track = FindTrack(); ans.push(operations[track]) set.add(track); - //O(n) + //O(n^2) while (set.size < operations.length) { let candidate: number[] = []; @@ -99,14 +101,16 @@ export class Disk { } } let min = Number.MAX_VALUE; + let targetTrack = 0; for (let t of candidate) { if (Math.abs(operations[t].track - operations[track].track) < min) { min = Math.abs(operations[t].track - operations[track].track); - track = t; + targetTrack = t; } } - ans.push(operations[track]); - set.add(track); + ans.push(operations[targetTrack]); + set.add(targetTrack); + track = targetTrack; } return ans; } diff --git a/src/store/expr1/defaultOperation.ts b/src/store/expr1/defaultOperation.ts index 8c4c509..552c6e2 100644 --- a/src/store/expr1/defaultOperation.ts +++ b/src/store/expr1/defaultOperation.ts @@ -1,14 +1,28 @@ +// const operations: Operation[] = [ +// { id: 1, memorySize: 200, type: 'request' }, +// { id: 2, memorySize: 200, type: 'request' }, +// { id: 3, memorySize: 300, type: 'request' }, +// { id: 4, memorySize: 200, type: 'request' }, +// { id: 5, memorySize: 100, type: 'request' }, +// { id: 1, memorySize: 200, type: 'release' }, +// { id: 3, memorySize: 300, type: 'release' }, +// { id: 5, memorySize: 100, type: 'release' }, +// { id: 6, memorySize: 50, type: 'request' }, +// ]; const operations: Operation[] = [ - { id: 1, memorySize: 200, type: 'request' }, - { id: 2, memorySize: 200, type: 'request' }, - { id: 3, memorySize: 300, type: 'request' }, + { id: 0, memorySize: 40, type: 'request' }, + { id: 1, memorySize: 130, type: 'request' }, + { id: 2, memorySize: 60, type: 'request' }, + { id: 3, memorySize: 100, type: 'request' }, + { id: 2, memorySize: 60, type: 'release' }, { id: 4, memorySize: 200, type: 'request' }, - { id: 5, memorySize: 100, type: 'request' }, - { id: 1, memorySize: 200, type: 'release' }, - { id: 3, memorySize: 300, type: 'release' }, - { id: 5, memorySize: 100, type: 'release' }, - { id: 6, memorySize: 50, type: 'request' }, -]; + { id: 3, memorySize: 100, type: 'release' }, + { id: 1, memorySize: 130, type: 'release' }, + { id: 5, memorySize: 140, type: 'request' }, + { id: 6, memorySize: 60, type: 'request' }, + { id: 7, memorySize: 50, type: 'request' }, + { id: 6, memorySize: 60, type: 'release' }, + ]; export default operations; export interface Operation { id: number; diff --git a/src/store/expr1/expr1Store.ts b/src/store/expr1/expr1Store.ts index 4d71869..94dcaa0 100644 --- a/src/store/expr1/expr1Store.ts +++ b/src/store/expr1/expr1Store.ts @@ -4,7 +4,7 @@ import operations from '@/store/expr1/defaultOperation.ts' const useExpr1Store = defineStore('expr1', { state: () => ({ operations: operations, - memSize: 1000, + memSize: 640, currentState: operations.length, tableChanged: false, failInfo: '' diff --git a/src/store/expr2/defaultOperation.ts b/src/store/expr2/defaultOperation.ts index d6d67d2..1843c82 100644 --- a/src/store/expr2/defaultOperation.ts +++ b/src/store/expr2/defaultOperation.ts @@ -1,13 +1,11 @@ const operations: Operation[] = [ - {id: 1, track: 80}, + {id: 1, track: 90}, {id: 2, track: 60}, - {id: 3, track: 90}, - {id: 4, track: 70}, - {id: 5, track: 10}, - {id: 6, track: 30}, - {id: 7, track: 20}, - {id: 8, track: 99}, - {id: 9, track: 50}, + {id: 3, track: 10}, + {id: 4, track: 30}, + {id: 5, track: 20}, + {id: 6, track: 99}, + {id: 7, track: 50}, ]; export default operations; diff --git a/src/store/expr2/expr2Store.ts b/src/store/expr2/expr2Store.ts index 7587bae..ba7244b 100644 --- a/src/store/expr2/expr2Store.ts +++ b/src/store/expr2/expr2Store.ts @@ -17,7 +17,8 @@ const useExpr2Store = defineStore('expr2', { trackFromIndex: 0, trackToIndex: 0, selectTrackFromIndex: 0, - selectTrackToIndex: 0 + selectTrackToIndex: 0, + tableUpdate: false }), getters: {}, actions: {}